[
  {
    "path": ".babelrc",
    "content": "{\n  \"presets\": [\"@babel/env\"]\n}\n"
  },
  {
    "path": ".github/workflows/continuous-integration.yml",
    "content": "# Based on https://github.com/actions/starter-workflows/blob/master/ci/node.js.yml\n\nname: Build and Test\n\non: [push, pull_request]\n\njobs:\n  ci:\n    runs-on: ${{ matrix.operating-system }}\n\n    strategy:\n      matrix:\n        operating-system: [ubuntu-latest, macos-latest, windows-latest]\n        node-version: [12.x, 14.x, 16.x, 18.x, 20.x]\n\n    steps:\n    - uses: actions/checkout@v3\n    - name: Use Node.js ${{ matrix.node-version }}\n      uses: actions/setup-node@v3\n      with:\n        node-version: ${{ matrix.node-version }}\n        cache: 'npm'\n\n    - run: npm ci\n\n    # Ensure that we can still build in the current version of Node\n    - run: node ./bin/cake build:except-parser\n    - run: node ./bin/cake build:parser\n    # Build twice to ensure that the latest build of the compiler can still build itself\n    - run: node ./bin/cake build:except-parser\n    - run: node ./bin/cake build:parser\n    # Build the browser compiler for the headless browser test\n    - run: node ./bin/cake build:browser\n    # Build test.html, so that test:browser uses the latest tests\n    - run: node ./bin/cake doc:test\n\n    # Check that the git diff is clean, to ensure that the updated build output was committed\n    - run: git diff --exit-code\n\n    # Test\n    - run: node ./bin/cake test\n    - run: node ./bin/cake test:browser || node ./bin/cake test:browser || node ./bin/cake test:browser\n    - run: node ./bin/cake test:browser:node\n    - run: node ./bin/cake test:integrations\n"
  },
  {
    "path": ".gitignore",
    "content": "raw\npresentation\ntest.coffee\ntest*.coffee\ntest.litcoffee\ntest*.litcoffee\ntest/*.js\nparser.output\n/node_modules\nnpm-debug.log*\nyarn.lock\n.DS_Store\n"
  },
  {
    "path": ".nojekyll",
    "content": ""
  },
  {
    "path": "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 contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment include:\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 advances\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 address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at maintainers@coffeescript.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "## How to contribute to CoffeeScript\n\n* Before you open a ticket or send a pull request, [search](https://github.com/jashkenas/coffeescript/issues) for previous discussions about the same feature or issue. Add to the earlier ticket if you find one.\n\n* Before sending a pull request for a feature, be sure to have [tests](https://github.com/jashkenas/coffeescript/tree/master/test).\n\n* Use the same coding style as the rest of the [codebase](https://github.com/jashkenas/coffeescript/tree/master/src). If you’re just getting started with CoffeeScript, there’s a nice [style guide](https://github.com/polarmobile/coffeescript-style-guide).\n\n* In your pull request, do not add documentation to `index.html` or re-build the minified `coffeescript.js` file. We’ll do those things before cutting a new release. You _should,_ however, commit the updated compiled JavaScript files in `lib`.\n\n* To get started, read the guides in the wiki:\n\t* [Hacking on the CoffeeScript Compiler](https://github.com/jashkenas/coffeescript/wiki/%5BHowTo%5D-Hacking-on-the-CoffeeScript-Compiler)\n\t* [How parsing works](https://github.com/jashkenas/coffeescript/wiki/%5BHowTo%5D-How-parsing-works)\n\t* [Update the docs](https://github.com/jashkenas/coffeescript/wiki/%5BHowTo%5D-Update-the-docs)\n"
  },
  {
    "path": "Cakefile",
    "content": "fs                        = require 'fs'\nos                        = require 'os'\npath                      = require 'path'\n_                         = require 'underscore'\n{ spawn, exec, execSync } = require 'child_process'\nCoffeeScript              = require './lib/coffeescript'\nhelpers                   = require './lib/coffeescript/helpers'\n\n# ANSI Terminal Colors.\nbold = red = green = yellow = reset = ''\nunless process.env.NODE_DISABLE_COLORS\n  bold   = '\\x1B[0;1m'\n  red    = '\\x1B[0;31m'\n  green  = '\\x1B[0;32m'\n  yellow = '\\x1B[0;33m'\n  reset  = '\\x1B[0m'\n\n# Built file header.\nheader = \"\"\"\n  /**\n   * CoffeeScript Compiler v#{CoffeeScript.VERSION}\n   * https://coffeescript.org\n   *\n   * Copyright 2011-#{new Date().getFullYear()}, Jeremy Ashkenas\n   * Released under the MIT License\n   */\n\"\"\"\n\n# Used in folder names like `docs/v1`.\nmajorVersion = parseInt CoffeeScript.VERSION.split('.')[0], 10\n\n\n# Log a message with a color.\nlog = (message, color, explanation) ->\n  console.log color + message + reset + ' ' + (explanation or '')\n\n\nspawnNodeProcess = (args, output = 'stderr', callback) ->\n  relayOutput = (buffer) -> console.log buffer.toString()\n  proc =         spawn 'node', args\n  proc.stdout.on 'data', relayOutput if output is 'both' or output is 'stdout'\n  proc.stderr.on 'data', relayOutput if output is 'both' or output is 'stderr'\n  proc.on        'exit', (status) -> callback(status) if typeof callback is 'function'\n\n# Run a CoffeeScript through our node/coffee interpreter.\nrun = (args, callback) ->\n  spawnNodeProcess ['bin/coffee'].concat(args), 'stderr', (status) ->\n    process.exit(1) if status isnt 0\n    callback() if typeof callback is 'function'\n\n\n# Build the CoffeeScript language from source.\nbuildParser = ->\n  helpers.extend global, require 'util'\n  require 'jison'\n  # We don't need `moduleMain`, since the parser is unlikely to be run standalone.\n  parser = require('./lib/coffeescript/grammar').parser.generate(moduleMain: ->)\n  fs.writeFileSync 'lib/coffeescript/parser.js', parser\n\nbuildExceptParser = (callback) ->\n  files = fs.readdirSync 'src'\n  files = ('src/' + file for file in files when file.match(/\\.(lit)?coffee$/))\n  run ['-c', '-o', 'lib/coffeescript'].concat(files), callback\n\nbuild = (callback) ->\n  buildParser()\n  buildExceptParser callback\n\ntranspile = (code, options = {}) ->\n  options.minify =      process.env.MINIFY    isnt 'false'\n  options.transform =   process.env.TRANSFORM isnt 'false'\n  options.sourceType ?= 'script'\n  babel = require '@babel/core'\n  presets = []\n  # Exclude the `modules` plugin in order to not break the `}(this));`\n  # at the end of the `build:browser` code block.\n  presets.push ['@babel/env', {modules: no}] if options.transform\n  presets.push ['minify', {mangle: no, evaluate: no, removeUndefined: no}] if options.minify\n  babelOptions =\n    presets: presets\n    compact: options.minify\n    minified: options.minify\n    comments: not options.minify\n    sourceType: options.sourceType\n  { code } = babel.transformSync code, babelOptions unless presets.length is 0\n  code\n\ntestBuiltCode = (watch = no) ->\n  csPath = './lib/coffeescript'\n  csDir  = path.dirname require.resolve csPath\n\n  for mod of require.cache when csDir is mod[0 ... csDir.length]\n    delete require.cache[mod]\n\n  testResults = runTests require csPath\n  unless watch\n    process.exit 1 unless testResults\n\nbuildAndTest = (includingParser = yes, harmony = no) ->\n  process.stdout.write '\\x1Bc' # Clear terminal screen.\n  execSync 'git checkout lib/*', stdio: 'inherit' # Reset the generated compiler.\n\n  buildArgs = ['bin/cake']\n  buildArgs.push if includingParser then 'build' else 'build:except-parser'\n  log \"building#{if includingParser then ', including parser' else ''}...\", green\n  spawnNodeProcess buildArgs, 'both', ->\n    log 'testing...', green\n    testArgs = if harmony then ['--harmony'] else []\n    testArgs = testArgs.concat ['bin/cake', 'test']\n    spawnNodeProcess testArgs, 'both'\n\nwatchAndBuildAndTest = (harmony = no) ->\n  buildAndTest yes, harmony\n  fs.watch 'src/', interval: 200, (eventType, filename) ->\n    if eventType is 'change'\n      log \"src/#{filename} changed, rebuilding...\"\n      buildAndTest (filename is 'grammar.coffee'), harmony\n  fs.watch 'test/', {interval: 200, recursive: yes}, (eventType, filename) ->\n    if eventType is 'change'\n      log \"test/#{filename} changed, rebuilding...\"\n      buildAndTest no, harmony\n\n\ntask 'build', 'build the CoffeeScript compiler from source', build\n\ntask 'build:parser', 'build the Jison parser only', buildParser\n\ntask 'build:except-parser', 'build the CoffeeScript compiler, except for the Jison parser', buildExceptParser\n\ntask 'build:full', 'build the CoffeeScript compiler from source twice, and run the tests', ->\n  build ->\n    build testBuiltCode\n\ntask 'build:browser', 'merge the built scripts into a single file for use in a browser', ->\n  code = \"\"\"\n  require['../../package.json'] = (function() {\n    return #{fs.readFileSync \"./package.json\"};\n  })();\n  \"\"\"\n  for name in ['helpers', 'rewriter', 'lexer', 'parser', 'scope', 'nodes', 'sourcemap', 'coffeescript', 'browser']\n    code += \"\"\"\n      require['./#{name}'] = (function() {\n        var exports = {}, module = {exports: exports};\n        #{fs.readFileSync \"lib/coffeescript/#{name}.js\"}\n        return module.exports;\n      })();\n    \"\"\"\n  # From here, we generate two outputs: a legacy script output for all browsers\n  # and a module output for browsers that support `<script type=\"module\">`.\n  code = \"\"\"\n    var CoffeeScript = function() {\n      function require(path){ return require[path]; }\n      #{code}\n      return require['./browser'];\n    }();\n  \"\"\"\n  scriptCode = transpile \"\"\"\n    (function(root) {\n      #{code}\n\n      if (typeof define === 'function' && define.amd) {\n        define(function() { return CoffeeScript; });\n      } else {\n        root.CoffeeScript = CoffeeScript;\n      }\n    }(this));\n  \"\"\"\n  moduleCode = transpile \"\"\"\n    #{code}\n\n    export default CoffeeScript;\n    const { VERSION, compile, eval: evaluate, load, run, runScripts } = CoffeeScript;\n    export { VERSION, compile, evaluate as eval, load, run, runScripts };\n  \"\"\", {sourceType: 'module'}\n  outputFolders = [\n    \"docs/v#{majorVersion}/browser-compiler-legacy\"\n    \"docs/v#{majorVersion}/browser-compiler-modern\"\n    \"lib/coffeescript-browser-compiler-legacy\"\n    \"lib/coffeescript-browser-compiler-modern\"\n  ]\n  for outputFolder in outputFolders\n    fs.mkdirSync outputFolder unless fs.existsSync outputFolder\n    fs.writeFileSync \"#{outputFolder}/coffeescript.js\", \"\"\"\n      #{header}\n      #{if outputFolder.includes('legacy') then scriptCode else moduleCode}\n    \"\"\"\n\ntask 'build:browser:full', 'merge the built scripts into a single file for use in a browser, and test it', ->\n  invoke 'build:browser'\n  console.log \"built ... running browser tests:\"\n  invoke 'test:browser'\n\ntask 'build:watch', 'watch and continually rebuild the CoffeeScript compiler, running tests on each build', ->\n  watchAndBuildAndTest()\n\ntask 'build:watch:harmony', 'watch and continually rebuild the CoffeeScript compiler, running harmony tests on each build', ->\n  watchAndBuildAndTest yes\n\n\nbuildDocs = (watch = no) ->\n  # Constants\n  indexFile             = 'documentation/site/index.html'\n  siteSourceFolder      = \"documentation/site\"\n  sectionsSourceFolder  = 'documentation/sections'\n  changelogSourceFolder = 'documentation/sections/changelog'\n  examplesSourceFolder  = 'documentation/examples'\n  outputFolder          = \"docs/v#{majorVersion}\"\n\n  # Helpers\n  releaseHeader = (date, version, prevVersion) ->\n    \"\"\"\n      <h3>#{prevVersion and \"<a href=\\\"https://github.com/jashkenas/coffeescript/compare/#{prevVersion}...#{version}\\\">#{version}</a>\" or version}\n        <span class=\"timestamp\"> &mdash; <time datetime=\"#{date}\">#{date}</time></span>\n      </h3>\n    \"\"\"\n\n  codeFor = require \"./documentation/site/code.coffee\"\n\n  htmlFor = ->\n    hljs = require 'highlight.js'\n    hljs.configure classPrefix: ''\n    markdownRenderer = require('markdown-it')\n      html: yes\n      typographer: yes\n      highlight: (str, language) ->\n        # From https://github.com/markdown-it/markdown-it#syntax-highlighting\n        if language and hljs.getLanguage(language)\n          try\n            return hljs.highlight(str, { language }).value\n          catch ex\n        return '' # No syntax highlighting\n\n\n    # Add some custom overrides to Markdown-It’s rendering, per\n    # https://github.com/markdown-it/markdown-it/blob/master/docs/architecture.md#renderer\n    defaultFence = markdownRenderer.renderer.rules.fence\n    markdownRenderer.renderer.rules.fence = (tokens, idx, options, env, slf) ->\n      code = tokens[idx].content\n      if code.indexOf('codeFor(') is 0 or code.indexOf('releaseHeader(') is 0\n        \"<%= #{code} %>\"\n      else\n        \"<blockquote class=\\\"uneditable-code-block\\\">#{defaultFence.apply @, arguments}</blockquote>\"\n\n    (file, bookmark) ->\n      md = fs.readFileSync \"#{sectionsSourceFolder}/#{file.replace /\\//g, path.sep}.md\", 'utf-8'\n      md = md.replace /<%= releaseHeader %>/g, releaseHeader\n      md = md.replace /<%= majorVersion %>/g, majorVersion\n      md = md.replace /<%= fullVersion %>/g, CoffeeScript.VERSION\n      html = markdownRenderer.render md\n      html = _.template(html)\n        codeFor: codeFor()\n        releaseHeader: releaseHeader\n\n  includeScript = ->\n    (file) ->\n      file = \"#{siteSourceFolder}/#{file}\" unless '/' in file\n      code = fs.readFileSync file, 'utf-8'\n      code = CoffeeScript.compile code\n      code = transpile code\n      code\n\n  include = ->\n    (file) ->\n      file = \"#{siteSourceFolder}/#{file}\" unless '/' in file\n      output = fs.readFileSync file, 'utf-8'\n      if /\\.html$/.test(file)\n        render = _.template output\n        output = render\n          releaseHeader: releaseHeader\n          majorVersion: majorVersion\n          fullVersion: CoffeeScript.VERSION\n          htmlFor: htmlFor()\n          codeFor: codeFor()\n          include: include()\n          includeScript: includeScript()\n      output\n\n  # Task\n  do renderIndex = ->\n    render = _.template fs.readFileSync(indexFile, 'utf-8')\n    output = render\n      include: include()\n    fs.writeFileSync \"#{outputFolder}/index.html\", output\n    log 'compiled', green, \"#{indexFile} → #{outputFolder}/index.html\"\n  try\n    fs.symlinkSync \"v#{majorVersion}/index.html\", 'docs/index.html'\n  catch exception\n\n  if watch\n    for target in [indexFile, siteSourceFolder, examplesSourceFolder, sectionsSourceFolder, changelogSourceFolder]\n      fs.watch target, interval: 200, renderIndex\n    log 'watching...', green\n\ntask 'doc:site', 'build the documentation for the website', ->\n  buildDocs()\n\ntask 'doc:site:watch', 'watch and continually rebuild the documentation for the website', ->\n  buildDocs yes\n\n\nbuildDocTests = (watch = no) ->\n  # Constants\n  testFile          = 'documentation/site/test.html'\n  testsSourceFolder = 'test'\n  outputFolder      = \"docs/v#{majorVersion}\"\n\n  # Included in test.html\n  testHelpers = fs.readFileSync('test/support/helpers.coffee', 'utf-8').replace /exports\\./g, '@'\n\n  # Helpers\n  testsInScriptBlocks = ->\n    output = ''\n    for filename in fs.readdirSync(testsSourceFolder).sort()\n      if filename.indexOf('.coffee') isnt -1\n        type = 'coffeescript'\n      else if filename.indexOf('.litcoffee') isnt -1\n        type = 'literate-coffeescript'\n      else\n        continue\n\n      # Set the type to text/x-coffeescript or text/x-literate-coffeescript\n      # to prevent the browser compiler from automatically running the script\n      output += \"\"\"\n        <script type=\"text/x-#{type}\" class=\"test\" id=\"#{filename.split('.')[0]}\">\n        #{fs.readFileSync \"test/#{filename}\", 'utf-8'}\n        </script>\\n\n      \"\"\"\n    output\n\n  # Task\n  do renderTest = ->\n    render = _.template fs.readFileSync(testFile, 'utf-8')\n    output = render\n      testHelpers: testHelpers\n      tests: testsInScriptBlocks()\n    fs.writeFileSync \"#{outputFolder}/test.html\", output\n    log 'compiled', green, \"#{testFile} → #{outputFolder}/test.html\"\n\n  if watch\n    for target in [testFile, testsSourceFolder]\n      fs.watch target, interval: 200, renderTest\n    log 'watching...', green\n\ntask 'doc:test', 'build the browser-based tests', ->\n  buildDocTests()\n\ntask 'doc:test:watch', 'watch and continually rebuild the browser-based tests', ->\n  buildDocTests yes\n\n\nbuildAnnotatedSource = (watch = no) ->\n  do generateAnnotatedSource = ->\n    exec \"cd src && ../node_modules/docco/bin/docco *.*coffee --output ../docs/v#{majorVersion}/annotated-source\", (err) -> throw err if err\n    log 'generated', green, \"annotated source in docs/v#{majorVersion}/annotated-source/\"\n\n  if watch\n    fs.watch 'src/', interval: 200, generateAnnotatedSource\n    log 'watching...', green\n\ntask 'doc:source', 'build the annotated source documentation', ->\n  buildAnnotatedSource()\n\ntask 'doc:source:watch', 'watch and continually rebuild the annotated source documentation', ->\n  buildAnnotatedSource yes\n\n\ntask 'release', 'update dependencies, build and test the CoffeeScript source, and build the documentation', ->\n  execSync '''\n    npm install --silent\n    cake build:full\n    cake build:browser\n    cake doc:test\n    cake test:browser:node\n    cake test:browser\n    cake test:integrations\n    cake doc:site\n    cake doc:source\n  ''', stdio: 'inherit'\n\n\ntask 'bench', 'quick benchmark of compilation time', ->\n  {Rewriter} = require './lib/coffeescript/rewriter'\n  sources = ['coffeescript', 'grammar', 'helpers', 'lexer', 'nodes', 'rewriter']\n  coffee  = sources.map((name) -> fs.readFileSync \"src/#{name}.coffee\").join '\\n'\n  litcoffee = fs.readFileSync(\"src/scope.litcoffee\").toString()\n  fmt    = (ms) -> \" #{bold}#{ \"   #{ms}\".slice -4 }#{reset} ms\"\n  total  = 0\n  now    = Date.now()\n  time   = -> total += ms = -(now - now = Date.now()); fmt ms\n  tokens = CoffeeScript.tokens coffee, rewrite: no\n  littokens = CoffeeScript.tokens litcoffee, rewrite: no, literate: yes\n  tokens = tokens.concat(littokens)\n  console.log \"Lex    #{time()} (#{tokens.length} tokens)\"\n  tokens = new Rewriter().rewrite tokens\n  console.log \"Rewrite#{time()} (#{tokens.length} tokens)\"\n  nodes  = CoffeeScript.nodes tokens\n  console.log \"Parse  #{time()}\"\n  js     = nodes.compile bare: yes\n  console.log \"Compile#{time()} (#{js.length} chars)\"\n  console.log \"total  #{ fmt total }\"\n\n\n# Run the CoffeeScript test suite.\nrunTests = (CoffeeScript) ->\n  CoffeeScript.register() unless global.testingBrowser\n\n  # These are attached to `global` so that they’re accessible from within\n  # `test/async.coffee`, which has an async-capable version of\n  # `global.test`.\n  global.currentFile = null\n  global.passedTests = 0\n  global.failures    = []\n\n  global[name] = func for name, func of require 'assert'\n\n  # Convenience aliases.\n  global.CoffeeScript = CoffeeScript\n  global.Repl   = require './lib/coffeescript/repl'\n  global.bold   = bold\n  global.red    = red\n  global.green  = green\n  global.yellow = yellow\n  global.reset  = reset\n\n  asyncTests = []\n  onFail = (description, fn, err) ->\n    failures.push\n      filename: global.currentFile\n      error: err\n      description: description\n      source: fn.toString() if fn.toString?\n\n  # Our test helper function for delimiting different test cases.\n  global.test = (description, fn) ->\n    try\n      fn.test = {description, currentFile}\n      result = fn.call(fn)\n      if result instanceof Promise # An async test.\n        asyncTests.push result\n        result.then ->\n          passedTests++\n        .catch (err) ->\n          onFail description, fn, err\n      else\n        passedTests++\n    catch err\n      onFail description, fn, err\n\n  helpers.extend global, require './test/support/helpers'\n\n  # When all the tests have run, collect and print errors.\n  # If a stacktrace is available, output the compiled function source.\n  process.on 'exit', ->\n    time = ((Date.now() - startTime) / 1000).toFixed(2)\n    message = \"passed #{passedTests} tests in #{time} seconds#{reset}\"\n    return log(message, green) unless failures.length\n    log \"failed #{failures.length} and #{message}\", red\n    for fail in failures\n      {error, filename, description, source}  = fail\n      console.log ''\n      log \"  #{description}\", red if description\n      log \"  #{error.stack}\", red\n      console.log \"  #{source}\" if source\n    return\n\n  # Run every test in the `test` folder, recording failures, except for files\n  # we’re skipping because the features to be tested are unsupported in the\n  # current Node runtime.\n  testFilesToSkip = []\n  skipUnless = (featureDetect, filenames) ->\n    unless (try new Function featureDetect)\n      testFilesToSkip = testFilesToSkip.concat filenames\n  skipUnless 'async () => {}', ['async.coffee', 'async_iterators.coffee']\n  skipUnless 'async function* generator() { yield 42; }', ['async_iterators.coffee']\n  skipUnless 'var a = 2 ** 2; a **= 3', ['exponentiation.coffee']\n  skipUnless 'var {...a} = {}', ['object_rest_spread.coffee']\n  skipUnless '/foo.bar/s.test(\"foo\\tbar\")', ['regex_dotall.coffee']\n  skipUnless '1_2_3', ['numeric_literal_separators.coffee']\n  skipUnless '1n', ['numbers_bigint.coffee']\n  skipUnless 'async () => { await import(\\'data:application/json,{\"foo\":\"bar\"}\\', { assert: { type: \"json\" } }) }', ['import_assertions.coffee']\n  files = fs.readdirSync('test').filter (filename) ->\n    filename not in testFilesToSkip\n\n  startTime = Date.now()\n  for file in files when helpers.isCoffee file\n    literate = helpers.isLiterate file\n    currentFile = filename = path.join 'test', file\n    code = fs.readFileSync filename\n    try\n      CoffeeScript.run code.toString(), {filename, literate}\n    catch error\n      failures.push {filename, error}\n\n  Promise.all(asyncTests).then ->\n    Promise.reject() if failures.length isnt 0\n\n\ntask 'test', 'run the CoffeeScript language test suite', ->\n  runTests(CoffeeScript).catch -> process.exit 1\n\n\ntask 'test:browser', 'run the test suite against the modern browser compiler in a headless browser', ->\n  # Create very simple web server to serve the two files we need.\n  http = require 'http'\n  serveFile = (res, fileToServe, mimeType) ->\n    res.statusCode = 200\n    res.setHeader 'Content-Type', mimeType\n    fs.createReadStream(fileToServe).pipe res\n  server = http.createServer (req, res) ->\n    if req.url is '/'\n      serveFile res, path.join(__dirname, 'docs', \"v#{majorVersion}\", 'test.html'), 'text/html'\n    else if req.url is '/browser-compiler-modern/coffeescript.js'\n      # The `text/javascript` MIME type is required for an ES module file to be\n      # loaded in a browser.\n      serveFile res, path.join(__dirname, 'docs', \"v#{majorVersion}\", 'browser-compiler-modern', 'coffeescript.js'), 'text/javascript'\n    else\n      res.statusCode = 404\n      res.end()\n\n  server.listen 8080, ->\n    puppeteer = require 'puppeteer'\n    browser   = await puppeteer.launch()\n    page      = await browser.newPage()\n    result    = \"\"\n\n    try\n      await page.goto 'http://localhost:8080/'\n\n      element = await page.waitForSelector '#result',\n        visible: yes\n        polling: 'mutation'\n        timeout: 60000\n\n      result = await page.evaluate ((el) => el.textContent), element\n    catch e\n      log e, red\n    finally\n      try browser.close()\n      server.close()\n\n    if result and not result.includes('failed')\n      log result, green\n    else\n      log result, red\n      process.exit 1\n\n\ntask 'test:browser:node', 'run the test suite against the legacy browser compiler in Node', ->\n  source = fs.readFileSync \"lib/coffeescript-browser-compiler-legacy/coffeescript.js\", 'utf-8'\n  result = {}\n  global.testingBrowser = yes\n  (-> eval source).call result\n  runTests(CoffeeScript).catch -> process.exit 1\n\n\ntask 'test:integrations', 'test the module integrated with other libraries and environments', ->\n  # Tools like Webpack and Browserify generate builds intended for a browser\n  # environment where Node modules are not available. We want to ensure that\n  # the CoffeeScript module as presented by the `browser` key in `package.json`\n  # can be built by such tools; if such a build succeeds, it verifies that no\n  # Node modules are required as part of the compiler (as opposed to the tests)\n  # and that therefore the compiler will run in a browser environment.\n  # Webpack 5 requires Node >= 10.13.0.\n  [major, minor] = process.versions.node.split('.').map (n) -> parseInt(n, 10)\n  return if major < 10 or (major is 10 and minor < 13)\n  tmpdir = os.tmpdir()\n  webpack = require 'webpack'\n  webpack {\n    entry: './'\n    optimization:\n      # Webpack’s minification causes the CoffeeScript module to fail some tests.\n      minimize: off\n    output:\n      path: tmpdir\n      filename: 'coffeescript.js'\n      library: 'CoffeeScript'\n      libraryTarget: 'commonjs2'\n  }, (err, stats) ->\n    if err or stats.hasErrors()\n      if err\n        console.error err.stack or err\n        console.error err.details if err.details\n      if stats.hasErrors()\n        console.error error for error in stats.compilation.errors\n      if stats.hasWarnings()\n        console.warn warning for warning in stats.compilation.warnings\n      process.exit 1\n\n    builtCompiler = path.join tmpdir, 'coffeescript.js'\n    { CoffeeScript } = require builtCompiler\n    global.testingBrowser = yes\n    testResults = runTests CoffeeScript\n    fs.unlinkSync builtCompiler\n    process.exit 1 unless testResults\n"
  },
  {
    "path": "ISSUE_TEMPLATE.md",
    "content": "<!---\nThanks for filing an issue 😄! Before you submit, please read the following:\n\nSearch open/closed issues before submitting since someone might have asked the same thing before!\nOur issues history stretches back to 2009, so the odds are good that your topic has come up.\n\nIf you have a support request or question please use Stack Overflow:\nhttps://stackoverflow.com/questions/tagged/coffeescript\n\nIssues on GitHub are only related to problems of the CoffeeScript compiler itself and we cannot answer\nsupport questions here.\n-->\n\nChoose one: is this a bug report or feature request?\n\n<!---\nProvide a general summary of the issue in the title above.\n\nFor bugs, please also preface your title with “Bug:”. For feature requests, please preface your title\nwith “Proposal:”. Once your issue is reviewed, a maintainer will edit the title to refer to the part\nof the codebase most relevant to the issue (if applicable).\n\nIf your request is that CoffeeScript support a new feature recently arrived to JavaScript, please note\nthat we generally only add features that have reached Stage 4 in the specification (in other words,\nthe syntax is finalized and the feature is approved to be part of the next ES release). You can still\nopen an issue, but it will likely be tagged with “[Awaiting Stage 4]” until the relevant ES feature is\napproved for release. See https://coffeescript.org/#contributing\n\nThere are also a handful of JavaScript features that CoffeeScript intentionally does not support.\nPlease do not open issues regarding these. They’re listed in https://coffeescript.org/#unsupported\n-->\n\n### Input Code\n<!--- If you're describing a bug, please let us know which sample code reproduces your problem. -->\n<!--- If you have link from https://coffeescript.org/#try or a standalone repo please include that! -->\n\n```coffee\nyour (code) => here\n```\n\n### Expected Behavior\n<!--- If you’re describing a bug, tell us what should happen. -->\n<!--- If you’re suggesting a change/improvement, tell us how it should work. -->\n\n### Current Behavior\n<!--- If describing a bug, tell us what happens instead of the expected behavior. -->\n<!--- If suggesting a change/improvement, explain the difference from current behavior. -->\n\n### Possible Solution\n<!--- Not obligatory, but suggest a fix/reason for the bug, -->\n<!--- or ideas how to implement the addition or change. -->\n\n### Context\n<!--- How has this issue affected you? What are you trying to accomplish? -->\n<!--- Providing context helps us come up with a solution that is most useful in the real world. -->\n\n### Environment\n<!--- For bugs, please let us know what version of CoffeeScript you’re running: `coffee -v`. -->\n<!--- If you think it might be relevant, please also let us know your version of Node. -->\n\n* CoffeeScript version:\n* Node.js version:\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2009-2018 Jeremy Ashkenas\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "PULL_REQUEST_TEMPLATE.md",
    "content": "<!--\nBefore making a PR please make sure to read our contributing guidelines:\nhttps://coffeescript.org/#contributing\n\nFor issue references: Add a comma-separated list of a\n[closing word](https://help.github.com/articles/closing-issues-via-commit-messages/) followed by\nthe ticket number fixed by the PR. It should be underlined in the preview if done correctly.\n\nAll new features require tests. All but the most trivial bug fixes should also have new or updated tests.\n\nEnsure that all new code you add to the compiler can be run in the minimum version of Node listed in\n`package.json`. New tests can require newer Node runtimes, but you may need to ensure that such tests\nonly run in supported runtimes; see `Cakefile` for examples of how to filter out certain tests in\nruntimes that don’t support them.\n\nPlease follow the code style of the rest of the CoffeeScript codebase. Write comments in complete\nsentences using Markdown, as the comments become the [annotated source](https://coffeescript.org/#annotated-source).\nFor tests proving a bug is fixed, please mention the issue number in the test description (see examples\nin the codebase).\n\nDescribe your changes below in as much detail as possible.\n-->\n"
  },
  {
    "path": "README.md",
    "content": "```\n      @@@@@@@                @@@@  @@@@@\n     @@@@@@@@@@              @@@   @@@                                           {\n    @@@@     @@              @@@   @@@                                        }   }   {\n   @@@@          @@@@@@@    @@@   @@@     @@@@@@    @@@@@@                   {   {  }  }\n  @@@@          @@@   @@  @@@@@  @@@@@@  @@@   @@  @@@@  @@                   }   }{  {\n  @@@@         @@@@   @@   @@@    @@@   @@@   @@@ @@@   @@@                  {  }{  }  }\n  @@@@        @@@@    @@   @@@    @@@   @@@@@@@@  @@@@@@@@                  { }{ }{  { }\n  @@@@@       @@@@   @@    @@@    @@@   @@@       @@@                     {  { } { } { }  }\n   @@@@@@@@@@ @@@@@@@@    @@@    @@@    @@@@@@@@  @@@@@@@@                 { }   { }   { }\n      @@@@@               @@@    @@@      @@@@@     @@@@@           @@@@@@   { }   { }    @@@@@@@\n                         @@@    @@@                                 @@@@@@@@@@@@@@@@@@@@@@@@@@@@\n      @@@@@@            @@@    @@@                                @@ @@@@@@@@@@@@@@@@@@@@@@@@@@\n   @@@@    @@          @@@   @@@@                                @@   @@@@@@@@@@@@@@@@@@@@@@@@\n   @@@@   @@@                       @@                  @@@@     @@@   @@@@@@@@@@@@@@@@@@@@@\n   @@@@@          @@@@@   @@  @@   @@@     @@@@@@@     @@@@@      @@@    @@@@@@@@@@@@@@@@@@\n     @@@@@      @@@  @@@ @@@@@@@@         @@@@  @@@@  @@@@@@@       @@@   @@@@@@@@@@@@@@@@\n       @@@@@   @@@       @@@@     @@@@    @@@    @@@   @@@                 @@@@@@@@@@@@@@\n @@@@@  @@@@  @@@@      @@@@      @@@@   @@@@   @@@@  @@@@\n@@@     @@@@  @@@       @@@@     @@@@    @@@    @@@@  @@@@\n@@@     @@@@  @@@@     @@@@      @@@@   @@@@   @@@@  @@@@\n @@@@@@@@@     @@@@@@  @@@@       @@@@  @@@@@@@@@    @@@@\n                                       @@@          @@@@\n                                      @@@\n                                      @@@\n```\n\nCoffeeScript is a little language that compiles into JavaScript.\n\n## Installation\n\nOnce you have Node.js installed:\n\n```shell\n# Install locally for a project:\nnpm install --save-dev coffeescript\n\n# Install globally to execute .coffee files anywhere:\nnpm install --global coffeescript\n```\n\n## Getting Started\n\nExecute a script:\n\n```shell\ncoffee /path/to/script.coffee\n```\n\nCompile a script:\n\n```shell\ncoffee -c /path/to/script.coffee\n```\n\nFor documentation, usage, and examples, see: https://coffeescript.org/\n\nTo suggest a feature or report a bug: https://github.com/jashkenas/coffeescript/issues\n\nIf you’d like to chat, drop by #coffeescript on Freenode IRC.\n\nThe source repository: https://github.com/jashkenas/coffeescript.git\n\nChangelog: https://coffeescript.org/#changelog\n\nOur lovely and talented contributors are listed here: https://github.com/jashkenas/coffeescript/contributors\n"
  },
  {
    "path": "bin/cake",
    "content": "#!/usr/bin/env node\n\ntry {\n  new Function('var {a} = {a: 1}')();\n} catch (error) {\n  console.error('Your JavaScript runtime does not support some features used by the cake command. Please use Node 6 or later.');\n  process.exit(1);\n}\n\nvar path = require('path');\nvar fs   = require('fs');\n\nvar potentialPaths = [\n  path.join(process.cwd(), 'node_modules/coffeescript/lib/coffeescript'),\n  path.join(process.cwd(), 'node_modules/coffeescript/lib/coffee-script'),\n  path.join(process.cwd(), 'node_modules/coffee-script/lib/coffee-script'),\n  path.join(__dirname, '../lib/coffeescript')\n];\n\nfor (var i = 0, len = potentialPaths.length; i < len; i++) {\n  if (fs.existsSync(potentialPaths[i])) {\n    require(potentialPaths[i] + '/cake').run();\n    break;\n  }\n}\n"
  },
  {
    "path": "bin/coffee",
    "content": "#!/usr/bin/env node\n\ntry {\n  new Function('var {a} = {a: 1}')();\n} catch (error) {\n  console.error('Your JavaScript runtime does not support some features used by the coffee command. Please use Node 6 or later.');\n  process.exit(1);\n}\n\nvar path = require('path');\nvar fs   = require('fs');\n\nvar potentialPaths = [\n  path.join(process.cwd(), 'node_modules/coffeescript/lib/coffeescript'),\n  path.join(process.cwd(), 'node_modules/coffeescript/lib/coffee-script'),\n  path.join(process.cwd(), 'node_modules/coffee-script/lib/coffee-script'),\n  path.join(__dirname, '../lib/coffeescript')\n];\n\nfor (var i = 0, len = potentialPaths.length; i < len; i++) {\n  if (fs.existsSync(potentialPaths[i])) {\n    require(potentialPaths[i] + '/command').run();\n    break;\n  }\n}\n"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"coffeescript\",\n  \"main\": [\n    \"lib/coffeescript/browser.js\"\n  ],\n  \"description\": \"Unfancy JavaScript\",\n  \"keywords\": [\n    \"javascript\",\n    \"language\",\n    \"coffeescript\",\n    \"compiler\"\n  ],\n  \"author\": {\n    \"name\": \"Jeremy Ashkenas\"\n  },\n  \"ignore\": [\n    \"test\"\n  ]\n}\n"
  },
  {
    "path": "docs/CNAME",
    "content": "coffeescript.org"
  },
  {
    "path": "docs/browserconfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<browserconfig>\r\n  <msapplication>\r\n    <tile>\r\n      <square150x150logo src=\"/mstile-150x150.png\"/>\r\n      <TileColor>#da532c</TileColor>\r\n    </tile>\r\n  </msapplication>\r\n</browserconfig>\r\n"
  },
  {
    "path": "docs/manifest.json",
    "content": "{\n\t\"name\": \"CoffeeScript\",\n\t\"description\": \"Unfancy JavaScript\",\n\t\"icons\": [\n\t\t{\n\t\t\t\"src\": \"\\/android-chrome-192x192.png\",\n\t\t\t\"sizes\": \"192x192\",\n\t\t\t\"type\": \"image\\/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"\\/android-chrome-512x512.png\",\n\t\t\t\"sizes\": \"512x512\",\n\t\t\t\"type\": \"image\\/png\"\n\t\t}\n\t],\n\t\"theme_color\": \"#ffffff\",\n\t\"display\": \"standalone\"\n}\n"
  },
  {
    "path": "docs/v1/annotated-source/browser.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>browser.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>browser.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              <p>This <strong>Browser</strong> compatibility layer extends core CoffeeScript functions\nto make things work smoothly when compiling code directly in the browser.\nWe add support for loading remote Coffee scripts via <strong>XHR</strong>, and\n<code>text/coffeescript</code> script tags, source maps via data-URLs, and so on.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\nCoffeeScript = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./coffee-script'</span>\nCoffeeScript.<span class=\"hljs-built_in\">require</span> = <span class=\"hljs-built_in\">require</span>\ncompile = CoffeeScript.compile</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Use standard JavaScript <code>eval</code> to eval code.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript.eval = <span class=\"hljs-function\"><span class=\"hljs-params\">(code, options = {})</span> -&gt;</span>\n  options.bare ?= <span class=\"hljs-literal\">on</span>\n  eval compile code, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Running code does not provide access to this scope.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript.run = <span class=\"hljs-function\"><span class=\"hljs-params\">(code, options = {})</span> -&gt;</span>\n  options.bare      = <span class=\"hljs-literal\">on</span>\n  options.shiftLine = <span class=\"hljs-literal\">on</span>\n  Function(compile code, options)()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>If we’re not in a browser environment, we’re finished with the public API.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> <span class=\"hljs-built_in\">window</span>?</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Include source maps where possible. If we’ve got a base64 encoder, a\nJSON serializer, and tools for escaping unicode characters, we’re good to go.\nPorted from <a href=\"https://developer.mozilla.org/en-US/docs/DOM/window.btoa\">https://developer.mozilla.org/en-US/docs/DOM/window.btoa</a></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">if</span> btoa? <span class=\"hljs-keyword\">and</span> JSON?\n<span class=\"hljs-function\">  <span class=\"hljs-title\">compile</span> = <span class=\"hljs-params\">(code, options = {})</span> -&gt;</span>\n    options.inlineMap = <span class=\"hljs-literal\">true</span>\n    CoffeeScript.compile code, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Load a remote script from the current domain via XHR.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript.load = <span class=\"hljs-function\"><span class=\"hljs-params\">(url, callback, options = {}, hold = <span class=\"hljs-literal\">false</span>)</span> -&gt;</span>\n  options.sourceFiles = [url]\n  xhr = <span class=\"hljs-keyword\">if</span> <span class=\"hljs-built_in\">window</span>.ActiveXObject\n    <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">window</span>.ActiveXObject(<span class=\"hljs-string\">'Microsoft.XMLHTTP'</span>)\n  <span class=\"hljs-keyword\">else</span>\n    <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">window</span>.XMLHttpRequest()\n  xhr.open <span class=\"hljs-string\">'GET'</span>, url, <span class=\"hljs-literal\">true</span>\n  xhr.overrideMimeType <span class=\"hljs-string\">'text/plain'</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">'overrideMimeType'</span> <span class=\"hljs-keyword\">of</span> xhr\n  xhr.onreadystatechange = <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> xhr.readyState <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">4</span>\n      <span class=\"hljs-keyword\">if</span> xhr.status <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">200</span>]\n        param = [xhr.responseText, options]\n        CoffeeScript.run param... <span class=\"hljs-keyword\">unless</span> hold\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> Error <span class=\"hljs-string\">\"Could not load <span class=\"hljs-subst\">#{url}</span>\"</span>\n      callback param <span class=\"hljs-keyword\">if</span> callback\n  xhr.send <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Activate CoffeeScript in the browser by having it compile and evaluate\nall script tags with a content-type of <code>text/coffeescript</code>.\nThis happens on page load.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">runScripts</span> = -&gt;</span>\n  scripts = <span class=\"hljs-built_in\">window</span>.<span class=\"hljs-built_in\">document</span>.getElementsByTagName <span class=\"hljs-string\">'script'</span>\n  coffeetypes = [<span class=\"hljs-string\">'text/coffeescript'</span>, <span class=\"hljs-string\">'text/literate-coffeescript'</span>]\n  coffees = (s <span class=\"hljs-keyword\">for</span> s <span class=\"hljs-keyword\">in</span> scripts <span class=\"hljs-keyword\">when</span> s.type <span class=\"hljs-keyword\">in</span> coffeetypes)\n  index = <span class=\"hljs-number\">0</span>\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">execute</span> = -&gt;</span>\n    param = coffees[index]\n    <span class=\"hljs-keyword\">if</span> param <span class=\"hljs-keyword\">instanceof</span> Array\n      CoffeeScript.run param...\n      index++\n      execute()\n\n  <span class=\"hljs-keyword\">for</span> script, i <span class=\"hljs-keyword\">in</span> coffees\n    <span class=\"hljs-keyword\">do</span> (script, i) -&gt;\n      options = literate: script.type <span class=\"hljs-keyword\">is</span> coffeetypes[<span class=\"hljs-number\">1</span>]\n      source = script.src <span class=\"hljs-keyword\">or</span> script.getAttribute(<span class=\"hljs-string\">'data-src'</span>)\n      <span class=\"hljs-keyword\">if</span> source\n        CoffeeScript.load source,\n          <span class=\"hljs-function\"><span class=\"hljs-params\">(param)</span> -&gt;</span>\n            coffees[i] = param\n            execute()\n          options\n          <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-keyword\">else</span>\n        options.sourceFiles = [<span class=\"hljs-string\">'embedded'</span>]\n        coffees[i] = [script.innerHTML, options]\n\n  execute()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Listen for window load, both in decent browsers and in IE.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">if</span> <span class=\"hljs-built_in\">window</span>.addEventListener\n  <span class=\"hljs-built_in\">window</span>.addEventListener <span class=\"hljs-string\">'DOMContentLoaded'</span>, runScripts, <span class=\"hljs-literal\">no</span>\n<span class=\"hljs-keyword\">else</span>\n  <span class=\"hljs-built_in\">window</span>.attachEvent <span class=\"hljs-string\">'onload'</span>, runScripts</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/cake.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>cake.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>cake.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              <p><code>cake</code> is a simplified version of <a href=\"http://www.gnu.org/software/make/\">Make</a>\n(<a href=\"http://rake.rubyforge.org/\">Rake</a>, <a href=\"https://github.com/280north/jake\">Jake</a>)\nfor CoffeeScript. You define tasks with names and descriptions in a Cakefile,\nand can call them from the command line, or invoke them from other tasks.</p>\n<p>Running <code>cake</code> with no arguments will print out a list of all the tasks in the\ncurrent directory’s Cakefile.</p>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>External dependencies.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>fs           = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'fs'</span>\npath         = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'path'</span>\nhelpers      = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./helpers'</span>\noptparse     = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./optparse'</span>\nCoffeeScript = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./coffee-script'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Register .coffee extension</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript.register()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Keep track of the list of defined tasks, the accepted options, and so on.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>tasks     = {}\noptions   = {}\nswitches  = []\noparse    = <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Mixin the top-level Cake functions for Cakefiles to use directly.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>helpers.extend <span class=\"hljs-built_in\">global</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Define a Cake task with a short name, an optional sentence description,\nand the function to run as the action itself.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  task: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, description, action)</span> -&gt;</span>\n    [action, description] = [description, action] <span class=\"hljs-keyword\">unless</span> action\n    tasks[name] = {name, description, action}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Define an option that the Cakefile accepts. The parsed options hash,\ncontaining all of the command-line options passed, will be made available\nas the first argument to the action.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  option: <span class=\"hljs-function\"><span class=\"hljs-params\">(letter, flag, description)</span> -&gt;</span>\n    switches.push [letter, flag, description]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Invoke another task in the current Cakefile.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  invoke: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    missingTask name <span class=\"hljs-keyword\">unless</span> tasks[name]\n    tasks[name].action options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Run <code>cake</code>. Executes all of the tasks you pass, in order. Note that Node’s\nasynchrony may cause tasks to execute in a different order than you’d expect.\nIf no tasks are passed, print the help screen. Keep a reference to the\noriginal directory name, when running Cake tasks from subdirectories.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.run = <span class=\"hljs-function\">-&gt;</span>\n  <span class=\"hljs-built_in\">global</span>.__originalDirname = fs.realpathSync <span class=\"hljs-string\">'.'</span>\n  process.chdir cakefileDirectory __originalDirname\n  args = process.argv[<span class=\"hljs-number\">2.</span>.]\n  CoffeeScript.run fs.readFileSync(<span class=\"hljs-string\">'Cakefile'</span>).toString(), filename: <span class=\"hljs-string\">'Cakefile'</span>\n  oparse = <span class=\"hljs-keyword\">new</span> optparse.OptionParser switches\n  <span class=\"hljs-keyword\">return</span> printTasks() <span class=\"hljs-keyword\">unless</span> args.length\n  <span class=\"hljs-keyword\">try</span>\n    options = oparse.parse(args)\n  <span class=\"hljs-keyword\">catch</span> e\n    <span class=\"hljs-keyword\">return</span> fatalError <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{e}</span>\"</span>\n  invoke arg <span class=\"hljs-keyword\">for</span> arg <span class=\"hljs-keyword\">in</span> options.arguments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>Display the list of Cake tasks in a format similar to <code>rake -T</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">printTasks</span> = -&gt;</span>\n  relative = path.relative <span class=\"hljs-keyword\">or</span> path.resolve\n  cakefilePath = path.join relative(__originalDirname, process.cwd()), <span class=\"hljs-string\">'Cakefile'</span>\n  <span class=\"hljs-built_in\">console</span>.log <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{cakefilePath}</span> defines the following tasks:\\n\"</span>\n  <span class=\"hljs-keyword\">for</span> name, task <span class=\"hljs-keyword\">of</span> tasks\n    spaces = <span class=\"hljs-number\">20</span> - name.length\n    spaces = <span class=\"hljs-keyword\">if</span> spaces &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> Array(spaces + <span class=\"hljs-number\">1</span>).join(<span class=\"hljs-string\">' '</span>) <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">''</span>\n    desc   = <span class=\"hljs-keyword\">if</span> task.description <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\"# <span class=\"hljs-subst\">#{task.description}</span>\"</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">''</span>\n    <span class=\"hljs-built_in\">console</span>.log <span class=\"hljs-string\">\"cake <span class=\"hljs-subst\">#{name}</span><span class=\"hljs-subst\">#{spaces}</span> <span class=\"hljs-subst\">#{desc}</span>\"</span>\n  <span class=\"hljs-built_in\">console</span>.log oparse.help() <span class=\"hljs-keyword\">if</span> switches.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Print an error and exit when attempting to use an invalid task/option.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">fatalError</span> = <span class=\"hljs-params\">(message)</span> -&gt;</span>\n  <span class=\"hljs-built_in\">console</span>.error message + <span class=\"hljs-string\">'\\n'</span>\n  <span class=\"hljs-built_in\">console</span>.log <span class=\"hljs-string\">'To see a list of all tasks/options, run \"cake\"'</span>\n  process.exit <span class=\"hljs-number\">1</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">missingTask</span> = <span class=\"hljs-params\">(task)</span> -&gt;</span> fatalError <span class=\"hljs-string\">\"No such task: <span class=\"hljs-subst\">#{task}</span>\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>When <code>cake</code> is invoked, search in the current and all parent directories\nto find the relevant Cakefile.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">cakefileDirectory</span> = <span class=\"hljs-params\">(dir)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> dir <span class=\"hljs-keyword\">if</span> fs.existsSync path.join dir, <span class=\"hljs-string\">'Cakefile'</span>\n  parent = path.normalize path.join dir, <span class=\"hljs-string\">'..'</span>\n  <span class=\"hljs-keyword\">return</span> cakefileDirectory parent <span class=\"hljs-keyword\">unless</span> parent <span class=\"hljs-keyword\">is</span> dir\n  <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> Error <span class=\"hljs-string\">\"Cakefile not found in <span class=\"hljs-subst\">#{process.cwd()}</span>\"</span></pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/coffee-script.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>coffee-script.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>coffee-script.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              <p>CoffeeScript can be used both on the server, as a command-line compiler based\non Node.js/V8, or to run CoffeeScript directly in the browser. This module\ncontains the main entry functions for tokenizing, parsing, and compiling\nsource CoffeeScript into JavaScript.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\nfs            = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'fs'</span>\nvm            = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'vm'</span>\npath          = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'path'</span>\n{Lexer}       = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./lexer'</span>\n{parser}      = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./parser'</span>\nhelpers       = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./helpers'</span>\nSourceMap     = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./sourcemap'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Require <code>package.json</code>, which is two levels above this file, as this file is\nevaluated from <code>lib/coffee-script</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>packageJson   = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'../../package.json'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>The current CoffeeScript version number.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.VERSION = packageJson.version\n\nexports.FILE_EXTENSIONS = [<span class=\"hljs-string\">'.coffee'</span>, <span class=\"hljs-string\">'.litcoffee'</span>, <span class=\"hljs-string\">'.coffee.md'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Expose helpers for testing.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.helpers = helpers</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Function that allows for btoa in both nodejs and the browser.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">base64encode</span> = <span class=\"hljs-params\">(src)</span> -&gt;</span> <span class=\"hljs-keyword\">switch</span>\n  <span class=\"hljs-keyword\">when</span> <span class=\"hljs-keyword\">typeof</span> Buffer <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'function'</span>\n    <span class=\"hljs-keyword\">new</span> Buffer(src).toString(<span class=\"hljs-string\">'base64'</span>)\n  <span class=\"hljs-keyword\">when</span> <span class=\"hljs-keyword\">typeof</span> btoa <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'function'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>The contents of a <code>&lt;script&gt;</code> block are encoded via UTF-16, so if any extended\ncharacters are used in the block, btoa will fail as it maxes out at UTF-8.\nSee <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem\">https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem</a>\nfor the gory details, and for the solution implemented here.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    btoa encodeURIComponent(src).replace <span class=\"hljs-regexp\">/%([0-9A-F]{2})/g</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(match, p1)</span> -&gt;</span>\n      String.fromCharCode <span class=\"hljs-string\">'0x'</span> + p1\n  <span class=\"hljs-keyword\">else</span>\n    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> Error(<span class=\"hljs-string\">'Unable to base64 encode inline sourcemap.'</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Function wrapper to add source file information to SyntaxErrors thrown by the\nlexer/parser/compiler.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">withPrettyErrors</span> = <span class=\"hljs-params\">(fn)</span> -&gt;</span>\n  (code, options = {}) -&gt;\n    <span class=\"hljs-keyword\">try</span>\n      fn.call @, code, options\n    <span class=\"hljs-keyword\">catch</span> err\n      <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">typeof</span> code <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'string'</span> <span class=\"hljs-comment\"># Support `CoffeeScript.nodes(tokens)`.</span>\n      <span class=\"hljs-keyword\">throw</span> helpers.updateSyntaxError err, code, options.filename</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>For each compiled file, save its source in memory in case we need to\nrecompile it later. We might need to recompile if the first compilation\ndidn’t create a source map (faster) but something went wrong and we need\na stack trace. Assuming that most of the time, code isn’t throwing\nexceptions, it’s probably more efficient to compile twice only when we\nneed a stack trace, rather than always generating a source map even when\nit’s not likely to be used. Save in form of <code>filename</code>: <code>(source)</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>sources = {}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Also save source maps if generated, in form of <code>filename</code>: <code>(source map)</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>sourceMaps = {}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>Compile CoffeeScript code to JavaScript, using the Coffee/Jison compiler.</p>\n<p>If <code>options.sourceMap</code> is specified, then <code>options.filename</code> must also be\nspecified. All options that can be passed to <code>SourceMap#generate</code> may also\nbe passed here.</p>\n<p>This returns a javascript string, unless <code>options.sourceMap</code> is passed,\nin which case this returns a <code>{js, v3SourceMap, sourceMap}</code>\nobject, where sourceMap is a sourcemap.coffee#SourceMap object, handy for\ndoing programmatic lookups.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.compile = compile = withPrettyErrors (code, options) -&gt;\n  {merge, extend} = helpers\n  options = extend {}, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Always generate a source map if no filename is passed in, since without a\na filename we have no way to retrieve this source later in the event that\nwe need to recompile it to get a source map for <code>prepareStackTrace</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  generateSourceMap = options.sourceMap <span class=\"hljs-keyword\">or</span> options.inlineMap <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> options.filename?\n  filename = options.filename <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">'&lt;anonymous&gt;'</span>\n\n  sources[filename] = code\n  map = <span class=\"hljs-keyword\">new</span> SourceMap <span class=\"hljs-keyword\">if</span> generateSourceMap\n\n  tokens = lexer.tokenize code, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>Pass a list of referenced variables, so that generated variables won’t get\nthe same name.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  options.referencedVars = (\n    token[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">for</span> token <span class=\"hljs-keyword\">in</span> tokens <span class=\"hljs-keyword\">when</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'IDENTIFIER'</span>\n  )</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Check for import or export; if found, force bare mode.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">unless</span> options.bare? <span class=\"hljs-keyword\">and</span> options.bare <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-keyword\">for</span> token <span class=\"hljs-keyword\">in</span> tokens\n      <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'IMPORT'</span>, <span class=\"hljs-string\">'EXPORT'</span>]\n        options.bare = <span class=\"hljs-literal\">yes</span>\n        <span class=\"hljs-keyword\">break</span>\n\n  fragments = parser.parse(tokens).compileToFragments options\n\n  currentLine = <span class=\"hljs-number\">0</span>\n  currentLine += <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> options.header\n  currentLine += <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> options.shiftLine\n  currentColumn = <span class=\"hljs-number\">0</span>\n  js = <span class=\"hljs-string\">\"\"</span>\n  <span class=\"hljs-keyword\">for</span> fragment <span class=\"hljs-keyword\">in</span> fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>Update the sourcemap with data from each fragment.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> generateSourceMap</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>Do not include empty, whitespace, or semicolon-only fragments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> fragment.locationData <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> <span class=\"hljs-regexp\">/^[;\\s]*$/</span>.test fragment.code\n        map.add(\n          [fragment.locationData.first_line, fragment.locationData.first_column]\n          [currentLine, currentColumn]\n          {noReplace: <span class=\"hljs-literal\">true</span>})\n      newLines = helpers.count fragment.code, <span class=\"hljs-string\">\"\\n\"</span>\n      currentLine += newLines\n      <span class=\"hljs-keyword\">if</span> newLines\n        currentColumn = fragment.code.length - (fragment.code.lastIndexOf(<span class=\"hljs-string\">\"\\n\"</span>) + <span class=\"hljs-number\">1</span>)\n      <span class=\"hljs-keyword\">else</span>\n        currentColumn += fragment.code.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>Copy the code from each fragment into the final JavaScript.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    js += fragment.code\n\n  <span class=\"hljs-keyword\">if</span> options.header\n    header = <span class=\"hljs-string\">\"Generated by CoffeeScript <span class=\"hljs-subst\">#{@VERSION}</span>\"</span>\n    js = <span class=\"hljs-string\">\"// <span class=\"hljs-subst\">#{header}</span>\\n<span class=\"hljs-subst\">#{js}</span>\"</span>\n\n  <span class=\"hljs-keyword\">if</span> generateSourceMap\n    v3SourceMap = map.generate(options, code)\n    sourceMaps[filename] = map\n\n  <span class=\"hljs-keyword\">if</span> options.inlineMap\n    encoded = base64encode JSON.stringify v3SourceMap\n    sourceMapDataURI = <span class=\"hljs-string\">\"//# sourceMappingURL=data:application/json;base64,<span class=\"hljs-subst\">#{encoded}</span>\"</span>\n    sourceURL = <span class=\"hljs-string\">\"//# sourceURL=<span class=\"hljs-subst\">#{options.filename ? <span class=\"hljs-string\">'coffeescript'</span>}</span>\"</span>\n    js = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{js}</span>\\n<span class=\"hljs-subst\">#{sourceMapDataURI}</span>\\n<span class=\"hljs-subst\">#{sourceURL}</span>\"</span>\n\n  <span class=\"hljs-keyword\">if</span> options.sourceMap\n    {\n      js\n      sourceMap: map\n      v3SourceMap: JSON.stringify v3SourceMap, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-number\">2</span>\n    }\n  <span class=\"hljs-keyword\">else</span>\n    js</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>Tokenize a string of CoffeeScript code, and return the array of tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.tokens = withPrettyErrors (code, options) -&gt;\n  lexer.tokenize code, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>Parse a string of CoffeeScript code or an array of lexed tokens, and\nreturn the AST. You can then compile it by calling <code>.compile()</code> on the root,\nor traverse it by using <code>.traverseChildren()</code> with a callback.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.nodes = withPrettyErrors (source, options) -&gt;\n  <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">typeof</span> source <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'string'</span>\n    parser.parse lexer.tokenize source, options\n  <span class=\"hljs-keyword\">else</span>\n    parser.parse source</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>Compile and execute a string of CoffeeScript (on the server), correctly\nsetting <code>__filename</code>, <code>__dirname</code>, and relative <code>require()</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.run = <span class=\"hljs-function\"><span class=\"hljs-params\">(code, options = {})</span> -&gt;</span>\n  mainModule = <span class=\"hljs-built_in\">require</span>.main</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <p>Set the filename.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  mainModule.filename = process.argv[<span class=\"hljs-number\">1</span>] =\n    <span class=\"hljs-keyword\">if</span> options.filename <span class=\"hljs-keyword\">then</span> fs.realpathSync(options.filename) <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">'&lt;anonymous&gt;'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>\n              </div>\n              <p>Clear the module cache.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  mainModule.moduleCache <span class=\"hljs-keyword\">and</span>= {}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>\n              </div>\n              <p>Assign paths for node_modules loading</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  dir = <span class=\"hljs-keyword\">if</span> options.filename?\n    path.dirname fs.realpathSync options.filename\n  <span class=\"hljs-keyword\">else</span>\n    fs.realpathSync <span class=\"hljs-string\">'.'</span>\n  mainModule.paths = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">'module'</span>)._nodeModulePaths dir</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-23\">&#182;</a>\n              </div>\n              <p>Compile.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> helpers.isCoffee(mainModule.filename) <span class=\"hljs-keyword\">or</span> <span class=\"hljs-built_in\">require</span>.extensions\n    answer = compile code, options\n    code = answer.js ? answer\n\n  mainModule._compile code, mainModule.filename</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-24\">&#182;</a>\n              </div>\n              <p>Compile and evaluate a string of CoffeeScript (in a Node.js-like environment).\nThe CoffeeScript REPL uses this to run the input.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.eval = <span class=\"hljs-function\"><span class=\"hljs-params\">(code, options = {})</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> code = code.trim()\n  createContext = vm.Script.createContext ? vm.createContext\n\n  isContext = vm.isContext ? (ctx) -&gt;\n    options.sandbox <span class=\"hljs-keyword\">instanceof</span> createContext().constructor\n\n  <span class=\"hljs-keyword\">if</span> createContext\n    <span class=\"hljs-keyword\">if</span> options.sandbox?\n      <span class=\"hljs-keyword\">if</span> isContext options.sandbox\n        sandbox = options.sandbox\n      <span class=\"hljs-keyword\">else</span>\n        sandbox = createContext()\n        sandbox[k] = v <span class=\"hljs-keyword\">for</span> own k, v <span class=\"hljs-keyword\">of</span> options.sandbox\n      sandbox.<span class=\"hljs-built_in\">global</span> = sandbox.root = sandbox.GLOBAL = sandbox\n    <span class=\"hljs-keyword\">else</span>\n      sandbox = <span class=\"hljs-built_in\">global</span>\n    sandbox.__filename = options.filename || <span class=\"hljs-string\">'eval'</span>\n    sandbox.__dirname  = path.dirname sandbox.__filename</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-25\">&#182;</a>\n              </div>\n              <p>define module/require only if they chose not to specify their own</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">unless</span> sandbox <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-built_in\">global</span> <span class=\"hljs-keyword\">or</span> sandbox.<span class=\"hljs-built_in\">module</span> <span class=\"hljs-keyword\">or</span> sandbox.<span class=\"hljs-built_in\">require</span>\n      Module = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'module'</span>\n      sandbox.<span class=\"hljs-built_in\">module</span>  = _module  = <span class=\"hljs-keyword\">new</span> Module(options.modulename || <span class=\"hljs-string\">'eval'</span>)\n      sandbox.<span class=\"hljs-built_in\">require</span> = _require = <span class=\"hljs-function\"><span class=\"hljs-params\">(path)</span> -&gt;</span>  Module._load path, _module, <span class=\"hljs-literal\">true</span>\n      _module.filename = sandbox.__filename\n      <span class=\"hljs-keyword\">for</span> r <span class=\"hljs-keyword\">in</span> Object.getOwnPropertyNames <span class=\"hljs-built_in\">require</span> <span class=\"hljs-keyword\">when</span> r <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'paths'</span>, <span class=\"hljs-string\">'arguments'</span>, <span class=\"hljs-string\">'caller'</span>]\n        _require[r] = <span class=\"hljs-built_in\">require</span>[r]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-26\">&#182;</a>\n              </div>\n              <p>use the same hack node currently uses for their own REPL</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      _require.paths = _module.paths = Module._nodeModulePaths process.cwd()\n      _require.resolve = <span class=\"hljs-function\"><span class=\"hljs-params\">(request)</span> -&gt;</span> Module._resolveFilename request, _module\n  o = {}\n  o[k] = v <span class=\"hljs-keyword\">for</span> own k, v <span class=\"hljs-keyword\">of</span> options\n  o.bare = <span class=\"hljs-literal\">on</span> <span class=\"hljs-comment\"># ensure return value</span>\n  js = compile code, o\n  <span class=\"hljs-keyword\">if</span> sandbox <span class=\"hljs-keyword\">is</span> <span class=\"hljs-built_in\">global</span>\n    vm.runInThisContext js\n  <span class=\"hljs-keyword\">else</span>\n    vm.runInContext js, sandbox\n\nexports.register = <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./register'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-27\">&#182;</a>\n              </div>\n              <p>Throw error with deprecation warning when depending upon implicit <code>require.extensions</code> registration</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">if</span> <span class=\"hljs-built_in\">require</span>.extensions\n  <span class=\"hljs-keyword\">for</span> ext <span class=\"hljs-keyword\">in</span> @FILE_EXTENSIONS <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">do</span> (ext) -&gt;\n    <span class=\"hljs-built_in\">require</span>.extensions[ext] ?= <span class=\"hljs-function\">-&gt;</span>\n      <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> Error <span class=\"hljs-string\">\"\"\"\n      Use CoffeeScript.register() or require the coffee-script/register module to require <span class=\"hljs-subst\">#{ext}</span> files.\n      \"\"\"</span>\n\nexports._compileFile = <span class=\"hljs-function\"><span class=\"hljs-params\">(filename, sourceMap = <span class=\"hljs-literal\">no</span>, inlineMap = <span class=\"hljs-literal\">no</span>)</span> -&gt;</span>\n  raw = fs.readFileSync filename, <span class=\"hljs-string\">'utf8'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-28\">&#182;</a>\n              </div>\n              <p>Strip the Unicode byte order mark, if this file begins with one.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  stripped = <span class=\"hljs-keyword\">if</span> raw.charCodeAt(<span class=\"hljs-number\">0</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0xFEFF</span> <span class=\"hljs-keyword\">then</span> raw.substring <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> raw\n\n  <span class=\"hljs-keyword\">try</span>\n    answer = compile stripped, {\n      filename, sourceMap, inlineMap\n      sourceFiles: [filename]\n      literate: helpers.isLiterate filename\n    }\n  <span class=\"hljs-keyword\">catch</span> err</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-29\">&#182;</a>\n              </div>\n              <p>As the filename and code of a dynamically loaded file will be different\nfrom the original file compiled with CoffeeScript.run, add that\ninformation to error so it can be pretty-printed later.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">throw</span> helpers.updateSyntaxError err, stripped, filename\n\n  answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-30\">&#182;</a>\n              </div>\n              <p>Instantiate a Lexer for our use here.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>lexer = <span class=\"hljs-keyword\">new</span> Lexer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-31\">&#182;</a>\n              </div>\n              <p>The real Lexer produces a generic stream of tokens. This object provides a\nthin wrapper around it, compatible with the Jison API. We can then pass it\ndirectly as a “Jison lexer”.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>parser.lexer =\n  lex: <span class=\"hljs-function\">-&gt;</span>\n    token = parser.tokens[@pos++]\n    <span class=\"hljs-keyword\">if</span> token\n      [tag, @yytext, @yylloc] = token\n      parser.errorToken = token.origin <span class=\"hljs-keyword\">or</span> token\n      @yylineno = @yylloc.first_line\n    <span class=\"hljs-keyword\">else</span>\n      tag = <span class=\"hljs-string\">''</span>\n\n    tag\n  setInput: <span class=\"hljs-function\"><span class=\"hljs-params\">(tokens)</span> -&gt;</span>\n    parser.tokens = tokens\n    @pos = <span class=\"hljs-number\">0</span>\n  upcomingInput: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-string\">\"\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-32\">&#182;</a>\n              </div>\n              <p>Make all the AST nodes visible to the parser.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>parser.yy = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./nodes'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-33\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-33\">&#182;</a>\n              </div>\n              <p>Override Jison’s default error handling function.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>parser.yy.parseError = <span class=\"hljs-function\"><span class=\"hljs-params\">(message, {token})</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-34\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-34\">&#182;</a>\n              </div>\n              <p>Disregard Jison’s message, it contains redundant line number information.\nDisregard the token, we take its value directly from the lexer in case\nthe error is caused by a generated token which might refer to its origin.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  {errorToken, tokens} = parser\n  [errorTag, errorText, errorLoc] = errorToken\n\n  errorText = <span class=\"hljs-keyword\">switch</span>\n    <span class=\"hljs-keyword\">when</span> errorToken <span class=\"hljs-keyword\">is</span> tokens[tokens.length - <span class=\"hljs-number\">1</span>]\n      <span class=\"hljs-string\">'end of input'</span>\n    <span class=\"hljs-keyword\">when</span> errorTag <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'INDENT'</span>, <span class=\"hljs-string\">'OUTDENT'</span>]\n      <span class=\"hljs-string\">'indentation'</span>\n    <span class=\"hljs-keyword\">when</span> errorTag <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'IDENTIFIER'</span>, <span class=\"hljs-string\">'NUMBER'</span>, <span class=\"hljs-string\">'INFINITY'</span>, <span class=\"hljs-string\">'STRING'</span>, <span class=\"hljs-string\">'STRING_START'</span>, <span class=\"hljs-string\">'REGEX'</span>, <span class=\"hljs-string\">'REGEX_START'</span>]\n      errorTag.replace(<span class=\"hljs-regexp\">/_START$/</span>, <span class=\"hljs-string\">''</span>).toLowerCase()\n    <span class=\"hljs-keyword\">else</span>\n      helpers.nameWhitespaceCharacter errorText</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-35\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-35\">&#182;</a>\n              </div>\n              <p>The second argument has a <code>loc</code> property, which should have the location\ndata for this token. Unfortunately, Jison seems to send an outdated <code>loc</code>\n(from the previous token), so we take the location information directly\nfrom the lexer.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  helpers.throwSyntaxError <span class=\"hljs-string\">\"unexpected <span class=\"hljs-subst\">#{errorText}</span>\"</span>, errorLoc</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-36\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-36\">&#182;</a>\n              </div>\n              <p>Based on <a href=\"http://v8.googlecode.com/svn/branches/bleeding_edge/src/messages.js\">http://v8.googlecode.com/svn/branches/bleeding_edge/src/messages.js</a>\nModified to handle sourceMap</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">formatSourcePosition</span> = <span class=\"hljs-params\">(frame, getSourceMapping)</span> -&gt;</span>\n  filename = <span class=\"hljs-literal\">undefined</span>\n  fileLocation = <span class=\"hljs-string\">''</span>\n\n  <span class=\"hljs-keyword\">if</span> frame.isNative()\n    fileLocation = <span class=\"hljs-string\">\"native\"</span>\n  <span class=\"hljs-keyword\">else</span>\n    <span class=\"hljs-keyword\">if</span> frame.isEval()\n      filename = frame.getScriptNameOrSourceURL()\n      fileLocation = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{frame.getEvalOrigin()}</span>, \"</span> <span class=\"hljs-keyword\">unless</span> filename\n    <span class=\"hljs-keyword\">else</span>\n      filename = frame.getFileName()\n\n    filename <span class=\"hljs-keyword\">or</span>= <span class=\"hljs-string\">\"&lt;anonymous&gt;\"</span>\n\n    line = frame.getLineNumber()\n    column = frame.getColumnNumber()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-37\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-37\">&#182;</a>\n              </div>\n              <p>Check for a sourceMap position</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    source = getSourceMapping filename, line, column\n    fileLocation =\n      <span class=\"hljs-keyword\">if</span> source\n        <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{filename}</span>:<span class=\"hljs-subst\">#{source[<span class=\"hljs-number\">0</span>]}</span>:<span class=\"hljs-subst\">#{source[<span class=\"hljs-number\">1</span>]}</span>\"</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{filename}</span>:<span class=\"hljs-subst\">#{line}</span>:<span class=\"hljs-subst\">#{column}</span>\"</span>\n\n  functionName = frame.getFunctionName()\n  isConstructor = frame.isConstructor()\n  isMethodCall = <span class=\"hljs-keyword\">not</span> (frame.isToplevel() <span class=\"hljs-keyword\">or</span> isConstructor)\n\n  <span class=\"hljs-keyword\">if</span> isMethodCall\n    methodName = frame.getMethodName()\n    typeName = frame.getTypeName()\n\n    <span class=\"hljs-keyword\">if</span> functionName\n      tp = <span class=\"hljs-keyword\">as</span> = <span class=\"hljs-string\">''</span>\n      <span class=\"hljs-keyword\">if</span> typeName <span class=\"hljs-keyword\">and</span> functionName.indexOf typeName\n        tp = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{typeName}</span>.\"</span>\n      <span class=\"hljs-keyword\">if</span> methodName <span class=\"hljs-keyword\">and</span> functionName.indexOf(<span class=\"hljs-string\">\".<span class=\"hljs-subst\">#{methodName}</span>\"</span>) <span class=\"hljs-keyword\">isnt</span> functionName.length - methodName.length - <span class=\"hljs-number\">1</span>\n        <span class=\"hljs-keyword\">as</span> = <span class=\"hljs-string\">\" [as <span class=\"hljs-subst\">#{methodName}</span>]\"</span>\n\n      <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{tp}</span><span class=\"hljs-subst\">#{functionName}</span><span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">as</span>}</span> (<span class=\"hljs-subst\">#{fileLocation}</span>)\"</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{typeName}</span>.<span class=\"hljs-subst\">#{methodName <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">'&lt;anonymous&gt;'</span>}</span> (<span class=\"hljs-subst\">#{fileLocation}</span>)\"</span>\n  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> isConstructor\n    <span class=\"hljs-string\">\"new <span class=\"hljs-subst\">#{functionName <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">'&lt;anonymous&gt;'</span>}</span> (<span class=\"hljs-subst\">#{fileLocation}</span>)\"</span>\n  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> functionName\n    <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{functionName}</span> (<span class=\"hljs-subst\">#{fileLocation}</span>)\"</span>\n  <span class=\"hljs-keyword\">else</span>\n    fileLocation\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">getSourceMap</span> = <span class=\"hljs-params\">(filename)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">if</span> sourceMaps[filename]?\n    sourceMaps[filename]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-38\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-38\">&#182;</a>\n              </div>\n              <p>CoffeeScript compiled in a browser may get compiled with <code>options.filename</code>\nof <code>&lt;anonymous&gt;</code>, but the browser may request the stack trace with the\nfilename of the script file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> sourceMaps[<span class=\"hljs-string\">'&lt;anonymous&gt;'</span>]?\n    sourceMaps[<span class=\"hljs-string\">'&lt;anonymous&gt;'</span>]\n  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> sources[filename]?\n    answer = compile sources[filename],\n      filename: filename\n      sourceMap: <span class=\"hljs-literal\">yes</span>\n      literate: helpers.isLiterate filename\n    answer.sourceMap\n  <span class=\"hljs-keyword\">else</span>\n    <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-39\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-39\">&#182;</a>\n              </div>\n              <p>Based on <a href=\"http://goo.gl/ZTx1p\">michaelficarra/CoffeeScriptRedux</a>\nNodeJS / V8 have no support for transforming positions in stack traces using\nsourceMap, so we must monkey-patch Error to display CoffeeScript source\npositions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>Error.prepareStackTrace = <span class=\"hljs-function\"><span class=\"hljs-params\">(err, stack)</span> -&gt;</span>\n<span class=\"hljs-function\">  <span class=\"hljs-title\">getSourceMapping</span> = <span class=\"hljs-params\">(filename, line, column)</span> -&gt;</span>\n    sourceMap = getSourceMap filename\n    answer = sourceMap.sourceLocation [line - <span class=\"hljs-number\">1</span>, column - <span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">if</span> sourceMap?\n    <span class=\"hljs-keyword\">if</span> answer? <span class=\"hljs-keyword\">then</span> [answer[<span class=\"hljs-number\">0</span>] + <span class=\"hljs-number\">1</span>, answer[<span class=\"hljs-number\">1</span>] + <span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">else</span> <span class=\"hljs-literal\">null</span>\n\n  frames = <span class=\"hljs-keyword\">for</span> frame <span class=\"hljs-keyword\">in</span> stack\n    <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">if</span> frame.getFunction() <span class=\"hljs-keyword\">is</span> exports.run\n    <span class=\"hljs-string\">\"    at <span class=\"hljs-subst\">#{formatSourcePosition frame, getSourceMapping}</span>\"</span>\n\n  <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{err.toString()}</span>\\n<span class=\"hljs-subst\">#{frames.join <span class=\"hljs-string\">'\\n'</span>}</span>\\n\"</span></pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/command.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>command.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>command.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              <p>The <code>coffee</code> utility. Handles command-line compilation of CoffeeScript\ninto various forms: saved into <code>.js</code> files or printed to stdout\nor recompiled every time the source is saved,\nprinted as a token stream or as the syntax tree, or launch an\ninteractive REPL.</p>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>External dependencies.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>fs             = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'fs'</span>\npath           = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'path'</span>\nhelpers        = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./helpers'</span>\noptparse       = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./optparse'</span>\nCoffeeScript   = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./coffee-script'</span>\n{spawn, exec}  = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'child_process'</span>\n{EventEmitter} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'events'</span>\n\nuseWinPathSep  = path.sep <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'\\\\'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Allow CoffeeScript to emit Node.js events.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>helpers.extend CoffeeScript, <span class=\"hljs-keyword\">new</span> EventEmitter\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">printLine</span> = <span class=\"hljs-params\">(line)</span> -&gt;</span> process.stdout.write line + <span class=\"hljs-string\">'\\n'</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">printWarn</span> = <span class=\"hljs-params\">(line)</span> -&gt;</span> process.stderr.write line + <span class=\"hljs-string\">'\\n'</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">hidden</span> = <span class=\"hljs-params\">(file)</span> -&gt;</span> <span class=\"hljs-regexp\">/^\\.|~$/</span>.test file</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>The help banner that is printed in conjunction with <code>-h</code>/<code>--help</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>BANNER = <span class=\"hljs-string\">'''\n  Usage: coffee [options] path/to/script.coffee -- [args]\n\n  If called without options, `coffee` will run your script.\n'''</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>The list of all the valid option flags that <code>coffee</code> knows how to handle.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>SWITCHES = [\n  [<span class=\"hljs-string\">'-b'</span>, <span class=\"hljs-string\">'--bare'</span>,            <span class=\"hljs-string\">'compile without a top-level function wrapper'</span>]\n  [<span class=\"hljs-string\">'-c'</span>, <span class=\"hljs-string\">'--compile'</span>,         <span class=\"hljs-string\">'compile to JavaScript and save as .js files'</span>]\n  [<span class=\"hljs-string\">'-e'</span>, <span class=\"hljs-string\">'--eval'</span>,            <span class=\"hljs-string\">'pass a string from the command line as input'</span>]\n  [<span class=\"hljs-string\">'-h'</span>, <span class=\"hljs-string\">'--help'</span>,            <span class=\"hljs-string\">'display this help message'</span>]\n  [<span class=\"hljs-string\">'-i'</span>, <span class=\"hljs-string\">'--interactive'</span>,     <span class=\"hljs-string\">'run an interactive CoffeeScript REPL'</span>]\n  [<span class=\"hljs-string\">'-j'</span>, <span class=\"hljs-string\">'--join [FILE]'</span>,     <span class=\"hljs-string\">'concatenate the source CoffeeScript before compiling'</span>]\n  [<span class=\"hljs-string\">'-m'</span>, <span class=\"hljs-string\">'--map'</span>,             <span class=\"hljs-string\">'generate source map and save as .js.map files'</span>]\n  [<span class=\"hljs-string\">'-M'</span>, <span class=\"hljs-string\">'--inline-map'</span>,      <span class=\"hljs-string\">'generate source map and include it directly in output'</span>]\n  [<span class=\"hljs-string\">'-n'</span>, <span class=\"hljs-string\">'--nodes'</span>,           <span class=\"hljs-string\">'print out the parse tree that the parser produces'</span>]\n  [      <span class=\"hljs-string\">'--nodejs [ARGS]'</span>,   <span class=\"hljs-string\">'pass options directly to the \"node\" binary'</span>]\n  [      <span class=\"hljs-string\">'--no-header'</span>,       <span class=\"hljs-string\">'suppress the \"Generated by\" header'</span>]\n  [<span class=\"hljs-string\">'-o'</span>, <span class=\"hljs-string\">'--output [DIR]'</span>,    <span class=\"hljs-string\">'set the output directory for compiled JavaScript'</span>]\n  [<span class=\"hljs-string\">'-p'</span>, <span class=\"hljs-string\">'--print'</span>,           <span class=\"hljs-string\">'print out the compiled JavaScript'</span>]\n  [<span class=\"hljs-string\">'-r'</span>, <span class=\"hljs-string\">'--require [MODULE*]'</span>, <span class=\"hljs-string\">'require the given module before eval or REPL'</span>]\n  [<span class=\"hljs-string\">'-s'</span>, <span class=\"hljs-string\">'--stdio'</span>,           <span class=\"hljs-string\">'listen for and compile scripts over stdio'</span>]\n  [<span class=\"hljs-string\">'-l'</span>, <span class=\"hljs-string\">'--literate'</span>,        <span class=\"hljs-string\">'treat stdio as literate style coffee-script'</span>]\n  [<span class=\"hljs-string\">'-t'</span>, <span class=\"hljs-string\">'--tokens'</span>,          <span class=\"hljs-string\">'print out the tokens that the lexer/rewriter produce'</span>]\n  [<span class=\"hljs-string\">'-v'</span>, <span class=\"hljs-string\">'--version'</span>,         <span class=\"hljs-string\">'display the version number'</span>]\n  [<span class=\"hljs-string\">'-w'</span>, <span class=\"hljs-string\">'--watch'</span>,           <span class=\"hljs-string\">'watch scripts for changes and rerun commands'</span>]\n]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Top-level objects shared by all the functions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>opts         = {}\nsources      = []\nsourceCode   = []\nnotSources   = {}\nwatchedDirs  = {}\noptionParser = <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Run <code>coffee</code> by parsing passed options and determining what action to take.\nMany flags cause us to divert before compiling anything. Flags passed after\n<code>--</code> will be passed verbatim to your script as arguments in <code>process.argv</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.run = <span class=\"hljs-function\">-&gt;</span>\n  parseOptions()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Make the REPL <em>CLI</em> use the global context so as to (a) be consistent with the\n<code>node</code> REPL CLI and, therefore, (b) make packages that modify native prototypes\n(such as ‘colors’ and ‘sugar’) work as expected.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  replCliOpts = useGlobal: <span class=\"hljs-literal\">yes</span>\n  opts.prelude = makePrelude opts.<span class=\"hljs-built_in\">require</span>       <span class=\"hljs-keyword\">if</span> opts.<span class=\"hljs-built_in\">require</span>\n  replCliOpts.prelude = opts.prelude\n  <span class=\"hljs-keyword\">return</span> forkNode()                             <span class=\"hljs-keyword\">if</span> opts.nodejs\n  <span class=\"hljs-keyword\">return</span> usage()                                <span class=\"hljs-keyword\">if</span> opts.help\n  <span class=\"hljs-keyword\">return</span> version()                              <span class=\"hljs-keyword\">if</span> opts.version\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">'./repl'</span>).start(replCliOpts)   <span class=\"hljs-keyword\">if</span> opts.interactive\n  <span class=\"hljs-keyword\">return</span> compileStdio()                         <span class=\"hljs-keyword\">if</span> opts.stdio\n  <span class=\"hljs-keyword\">return</span> compileScript <span class=\"hljs-literal\">null</span>, opts.arguments[<span class=\"hljs-number\">0</span>]  <span class=\"hljs-keyword\">if</span> opts.eval\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">'./repl'</span>).start(replCliOpts)   <span class=\"hljs-keyword\">unless</span> opts.arguments.length\n  literals = <span class=\"hljs-keyword\">if</span> opts.run <span class=\"hljs-keyword\">then</span> opts.arguments.splice <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> []\n  process.argv = process.argv[<span class=\"hljs-number\">0.</span><span class=\"hljs-number\">.1</span>].concat literals\n  process.argv[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'coffee'</span>\n\n  opts.output = path.resolve opts.output  <span class=\"hljs-keyword\">if</span> opts.output\n  <span class=\"hljs-keyword\">if</span> opts.join\n    opts.join = path.resolve opts.join\n    <span class=\"hljs-built_in\">console</span>.error <span class=\"hljs-string\">'''\n\n    The --join option is deprecated and will be removed in a future version.\n\n    If for some reason it's necessary to share local variables between files,\n    replace...\n\n        $ coffee --compile --join bundle.js -- a.coffee b.coffee c.coffee\n\n    with...\n\n        $ cat a.coffee b.coffee c.coffee | coffee --compile --stdio &gt; bundle.js\n\n    '''</span>\n  <span class=\"hljs-keyword\">for</span> source <span class=\"hljs-keyword\">in</span> opts.arguments\n    source = path.resolve source\n    compilePath source, <span class=\"hljs-literal\">yes</span>, source\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">makePrelude</span> = <span class=\"hljs-params\">(requires)</span> -&gt;</span>\n  requires.map (<span class=\"hljs-built_in\">module</span>) -&gt;\n    [_, name, <span class=\"hljs-built_in\">module</span>] = match <span class=\"hljs-keyword\">if</span> match = <span class=\"hljs-built_in\">module</span>.match(<span class=\"hljs-regexp\">/^(.*)=(.*)$/</span>)\n    name ||= helpers.baseFileName <span class=\"hljs-built_in\">module</span>, <span class=\"hljs-literal\">yes</span>, useWinPathSep\n    <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{name}</span> = require('<span class=\"hljs-subst\">#{<span class=\"hljs-built_in\">module</span>}</span>')\"</span>\n  .join <span class=\"hljs-string\">';'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Compile a path, which could be a script or a directory. If a directory\nis passed, recursively compile all ‘.coffee’, ‘.litcoffee’, and ‘.coffee.md’\nextension source files in it and all subdirectories.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">compilePath</span> = <span class=\"hljs-params\">(source, topLevel, base)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> source <span class=\"hljs-keyword\">in</span> sources   <span class=\"hljs-keyword\">or</span>\n            watchedDirs[source] <span class=\"hljs-keyword\">or</span>\n            <span class=\"hljs-keyword\">not</span> topLevel <span class=\"hljs-keyword\">and</span> (notSources[source] <span class=\"hljs-keyword\">or</span> hidden source)\n  <span class=\"hljs-keyword\">try</span>\n    stats = fs.statSync source\n  <span class=\"hljs-keyword\">catch</span> err\n    <span class=\"hljs-keyword\">if</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'ENOENT'</span>\n      <span class=\"hljs-built_in\">console</span>.error <span class=\"hljs-string\">\"File not found: <span class=\"hljs-subst\">#{source}</span>\"</span>\n      process.exit <span class=\"hljs-number\">1</span>\n    <span class=\"hljs-keyword\">throw</span> err\n  <span class=\"hljs-keyword\">if</span> stats.isDirectory()\n    <span class=\"hljs-keyword\">if</span> path.basename(source) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'node_modules'</span>\n      notSources[source] = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">return</span>\n    <span class=\"hljs-keyword\">if</span> opts.run\n      compilePath findDirectoryIndex(source), topLevel, base\n      <span class=\"hljs-keyword\">return</span>\n    watchDir source, base <span class=\"hljs-keyword\">if</span> opts.watch\n    <span class=\"hljs-keyword\">try</span>\n      files = fs.readdirSync source\n    <span class=\"hljs-keyword\">catch</span> err\n      <span class=\"hljs-keyword\">if</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'ENOENT'</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">throw</span> err\n    <span class=\"hljs-keyword\">for</span> file <span class=\"hljs-keyword\">in</span> files\n      compilePath (path.join source, file), <span class=\"hljs-literal\">no</span>, base\n  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> topLevel <span class=\"hljs-keyword\">or</span> helpers.isCoffee source\n    sources.push source\n    sourceCode.push <span class=\"hljs-literal\">null</span>\n    <span class=\"hljs-keyword\">delete</span> notSources[source]\n    watch source, base <span class=\"hljs-keyword\">if</span> opts.watch\n    <span class=\"hljs-keyword\">try</span>\n      code = fs.readFileSync source\n    <span class=\"hljs-keyword\">catch</span> err\n      <span class=\"hljs-keyword\">if</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'ENOENT'</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">throw</span> err\n    compileScript(source, code.toString(), base)\n  <span class=\"hljs-keyword\">else</span>\n    notSources[source] = <span class=\"hljs-literal\">yes</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">findDirectoryIndex</span> = <span class=\"hljs-params\">(source)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">for</span> ext <span class=\"hljs-keyword\">in</span> CoffeeScript.FILE_EXTENSIONS\n    index = path.join source, <span class=\"hljs-string\">\"index<span class=\"hljs-subst\">#{ext}</span>\"</span>\n    <span class=\"hljs-keyword\">try</span>\n      <span class=\"hljs-keyword\">return</span> index <span class=\"hljs-keyword\">if</span> (fs.statSync index).isFile()\n    <span class=\"hljs-keyword\">catch</span> err\n      <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'ENOENT'</span>\n  <span class=\"hljs-built_in\">console</span>.error <span class=\"hljs-string\">\"Missing index.coffee or index.litcoffee in <span class=\"hljs-subst\">#{source}</span>\"</span>\n  process.exit <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>Compile a single source script, containing the given code, according to the\nrequested options. If evaluating the script directly sets <code>__filename</code>,\n<code>__dirname</code> and <code>module.filename</code> to be correct relative to the script’s path.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">compileScript</span> = <span class=\"hljs-params\">(file, input, base = <span class=\"hljs-literal\">null</span>)</span> -&gt;</span>\n  o = opts\n  options = compileOptions file, base\n  <span class=\"hljs-keyword\">try</span>\n    t = task = {file, input, options}\n    CoffeeScript.emit <span class=\"hljs-string\">'compile'</span>, task\n    <span class=\"hljs-keyword\">if</span> o.tokens\n      printTokens CoffeeScript.tokens t.input, t.options\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> o.nodes\n      printLine CoffeeScript.nodes(t.input, t.options).toString().trim()\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> o.run\n      CoffeeScript.register()\n      CoffeeScript.eval opts.prelude, t.options <span class=\"hljs-keyword\">if</span> opts.prelude\n      CoffeeScript.run t.input, t.options\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> o.join <span class=\"hljs-keyword\">and</span> t.file <span class=\"hljs-keyword\">isnt</span> o.join\n      t.input = helpers.invertLiterate t.input <span class=\"hljs-keyword\">if</span> helpers.isLiterate file\n      sourceCode[sources.indexOf(t.file)] = t.input\n      compileJoin()\n    <span class=\"hljs-keyword\">else</span>\n      compiled = CoffeeScript.compile t.input, t.options\n      t.output = compiled\n      <span class=\"hljs-keyword\">if</span> o.map\n        t.output = compiled.js\n        t.sourceMap = compiled.v3SourceMap\n\n      CoffeeScript.emit <span class=\"hljs-string\">'success'</span>, task\n      <span class=\"hljs-keyword\">if</span> o.<span class=\"hljs-built_in\">print</span>\n        printLine t.output.trim()\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> o.compile <span class=\"hljs-keyword\">or</span> o.map\n        writeJs base, t.file, t.output, options.jsPath, t.sourceMap\n  <span class=\"hljs-keyword\">catch</span> err\n    CoffeeScript.emit <span class=\"hljs-string\">'failure'</span>, err, task\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> CoffeeScript.listeners(<span class=\"hljs-string\">'failure'</span>).length\n    message = err?.stack <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{err}</span>\"</span>\n    <span class=\"hljs-keyword\">if</span> o.watch\n      printLine message + <span class=\"hljs-string\">'\\x07'</span>\n    <span class=\"hljs-keyword\">else</span>\n      printWarn message\n      process.exit <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Attach the appropriate listeners to compile scripts incoming over <strong>stdin</strong>,\nand write them back to <strong>stdout</strong>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">compileStdio</span> = -&gt;</span>\n  buffers = []\n  stdin = process.openStdin()\n  stdin.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">'data'</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(buffer)</span> -&gt;</span>\n    buffers.push buffer <span class=\"hljs-keyword\">if</span> buffer\n  stdin.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">'end'</span>, <span class=\"hljs-function\">-&gt;</span>\n    compileScript <span class=\"hljs-literal\">null</span>, Buffer.concat(buffers).toString()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>If all of the source files are done being read, concatenate and compile\nthem together.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>joinTimeout = <span class=\"hljs-literal\">null</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">compileJoin</span> = -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> opts.join\n  <span class=\"hljs-keyword\">unless</span> sourceCode.some(<span class=\"hljs-function\"><span class=\"hljs-params\">(code)</span> -&gt;</span> code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">null</span>)\n    clearTimeout joinTimeout\n    joinTimeout = wait <span class=\"hljs-number\">100</span>, <span class=\"hljs-function\">-&gt;</span>\n      compileScript opts.join, sourceCode.join(<span class=\"hljs-string\">'\\n'</span>), opts.join</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Watch a source CoffeeScript file using <code>fs.watch</code>, recompiling it every\ntime the file is updated. May be used in combination with other options,\nsuch as <code>--print</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">watch</span> = <span class=\"hljs-params\">(source, base)</span> -&gt;</span>\n  watcher        = <span class=\"hljs-literal\">null</span>\n  prevStats      = <span class=\"hljs-literal\">null</span>\n  compileTimeout = <span class=\"hljs-literal\">null</span>\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">watchErr</span> = <span class=\"hljs-params\">(err)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'ENOENT'</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> source <span class=\"hljs-keyword\">in</span> sources\n    <span class=\"hljs-keyword\">try</span>\n      rewatch()\n      compile()\n    <span class=\"hljs-keyword\">catch</span>\n      removeSource source, base\n      compileJoin()\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">compile</span> = -&gt;</span>\n    clearTimeout compileTimeout\n    compileTimeout = wait <span class=\"hljs-number\">25</span>, <span class=\"hljs-function\">-&gt;</span>\n      fs.stat source, <span class=\"hljs-function\"><span class=\"hljs-params\">(err, stats)</span> -&gt;</span>\n        <span class=\"hljs-keyword\">return</span> watchErr err <span class=\"hljs-keyword\">if</span> err\n        <span class=\"hljs-keyword\">return</span> rewatch() <span class=\"hljs-keyword\">if</span> prevStats <span class=\"hljs-keyword\">and</span>\n                            stats.size <span class=\"hljs-keyword\">is</span> prevStats.size <span class=\"hljs-keyword\">and</span>\n                            stats.mtime.getTime() <span class=\"hljs-keyword\">is</span> prevStats.mtime.getTime()\n        prevStats = stats\n        fs.readFile source, <span class=\"hljs-function\"><span class=\"hljs-params\">(err, code)</span> -&gt;</span>\n          <span class=\"hljs-keyword\">return</span> watchErr err <span class=\"hljs-keyword\">if</span> err\n          compileScript(source, code.toString(), base)\n          rewatch()\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">startWatcher</span> = -&gt;</span>\n    watcher = fs.watch source\n    .<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">'change'</span>, compile\n    .<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">'error'</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(err)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'EPERM'</span>\n      removeSource source, base\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">rewatch</span> = -&gt;</span>\n    watcher?.close()\n    startWatcher()\n\n  <span class=\"hljs-keyword\">try</span>\n    startWatcher()\n  <span class=\"hljs-keyword\">catch</span> err\n    watchErr err</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>Watch a directory of files for new additions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">watchDir</span> = <span class=\"hljs-params\">(source, base)</span> -&gt;</span>\n  watcher        = <span class=\"hljs-literal\">null</span>\n  readdirTimeout = <span class=\"hljs-literal\">null</span>\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">startWatcher</span> = -&gt;</span>\n    watcher = fs.watch source\n    .<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">'error'</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(err)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'EPERM'</span>\n      stopWatcher()\n    .<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">'change'</span>, <span class=\"hljs-function\">-&gt;</span>\n      clearTimeout readdirTimeout\n      readdirTimeout = wait <span class=\"hljs-number\">25</span>, <span class=\"hljs-function\">-&gt;</span>\n        <span class=\"hljs-keyword\">try</span>\n          files = fs.readdirSync source\n        <span class=\"hljs-keyword\">catch</span> err\n          <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'ENOENT'</span>\n          <span class=\"hljs-keyword\">return</span> stopWatcher()\n        <span class=\"hljs-keyword\">for</span> file <span class=\"hljs-keyword\">in</span> files\n          compilePath (path.join source, file), <span class=\"hljs-literal\">no</span>, base\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">stopWatcher</span> = -&gt;</span>\n    watcher.close()\n    removeSourceDir source, base\n\n  watchedDirs[source] = <span class=\"hljs-literal\">yes</span>\n  <span class=\"hljs-keyword\">try</span>\n    startWatcher()\n  <span class=\"hljs-keyword\">catch</span> err\n    <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'ENOENT'</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">removeSourceDir</span> = <span class=\"hljs-params\">(source, base)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">delete</span> watchedDirs[source]\n  sourcesChanged = <span class=\"hljs-literal\">no</span>\n  <span class=\"hljs-keyword\">for</span> file <span class=\"hljs-keyword\">in</span> sources <span class=\"hljs-keyword\">when</span> source <span class=\"hljs-keyword\">is</span> path.dirname file\n    removeSource file, base\n    sourcesChanged = <span class=\"hljs-literal\">yes</span>\n  compileJoin() <span class=\"hljs-keyword\">if</span> sourcesChanged</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>Remove a file from our source list, and source code cache. Optionally remove\nthe compiled JS version as well.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">removeSource</span> = <span class=\"hljs-params\">(source, base)</span> -&gt;</span>\n  index = sources.indexOf source\n  sources.splice index, <span class=\"hljs-number\">1</span>\n  sourceCode.splice index, <span class=\"hljs-number\">1</span>\n  <span class=\"hljs-keyword\">unless</span> opts.join\n    silentUnlink outputPath source, base\n    silentUnlink outputPath source, base, <span class=\"hljs-string\">'.js.map'</span>\n    timeLog <span class=\"hljs-string\">\"removed <span class=\"hljs-subst\">#{source}</span>\"</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">silentUnlink</span> = <span class=\"hljs-params\">(path)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">try</span>\n    fs.unlinkSync path\n  <span class=\"hljs-keyword\">catch</span> err\n    <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'ENOENT'</span>, <span class=\"hljs-string\">'EPERM'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>Get the corresponding output JavaScript path for a source file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">outputPath</span> = <span class=\"hljs-params\">(source, base, extension=<span class=\"hljs-string\">\".js\"</span>)</span> -&gt;</span>\n  basename  = helpers.baseFileName source, <span class=\"hljs-literal\">yes</span>, useWinPathSep\n  srcDir    = path.dirname source\n  <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> opts.output\n    dir = srcDir\n  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> source <span class=\"hljs-keyword\">is</span> base\n    dir = opts.output\n  <span class=\"hljs-keyword\">else</span>\n    dir = path.join opts.output, path.relative base, srcDir\n  path.join dir, basename + extension</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>Recursively mkdir, like <code>mkdir -p</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">mkdirp</span> = <span class=\"hljs-params\">(dir, fn)</span> -&gt;</span>\n  mode = <span class=\"hljs-number\">0</span>o777 &amp; ~process.umask()\n\n  <span class=\"hljs-keyword\">do</span> mkdirs = <span class=\"hljs-function\"><span class=\"hljs-params\">(p = dir, fn)</span> -&gt;</span>\n    fs.exists p, <span class=\"hljs-function\"><span class=\"hljs-params\">(exists)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">if</span> exists\n        fn()\n      <span class=\"hljs-keyword\">else</span>\n        mkdirs path.dirname(p), <span class=\"hljs-function\">-&gt;</span>\n          fs.mkdir p, mode, <span class=\"hljs-function\"><span class=\"hljs-params\">(err)</span> -&gt;</span>\n            <span class=\"hljs-keyword\">return</span> fn err <span class=\"hljs-keyword\">if</span> err\n            fn()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>Write out a JavaScript source file with the compiled code. By default, files\nare written out in <code>cwd</code> as <code>.js</code> files with the same name, but the output\ndirectory can be customized with <code>--output</code>.</p>\n<p>If <code>generatedSourceMap</code> is provided, this will write a <code>.js.map</code> file into the\nsame directory as the <code>.js</code> file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">writeJs</span> = <span class=\"hljs-params\">(base, sourcePath, js, jsPath, generatedSourceMap = <span class=\"hljs-literal\">null</span>)</span> -&gt;</span>\n  sourceMapPath = outputPath sourcePath, base, <span class=\"hljs-string\">\".js.map\"</span>\n  jsDir  = path.dirname jsPath\n<span class=\"hljs-function\">  <span class=\"hljs-title\">compile</span> = -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> opts.compile\n      js = <span class=\"hljs-string\">' '</span> <span class=\"hljs-keyword\">if</span> js.length &lt;= <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">if</span> generatedSourceMap <span class=\"hljs-keyword\">then</span> js = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{js}</span>\\n//# sourceMappingURL=<span class=\"hljs-subst\">#{helpers.baseFileName sourceMapPath, <span class=\"hljs-literal\">no</span>, useWinPathSep}</span>\\n\"</span>\n      fs.writeFile jsPath, js, <span class=\"hljs-function\"><span class=\"hljs-params\">(err)</span> -&gt;</span>\n        <span class=\"hljs-keyword\">if</span> err\n          printLine err.message\n          process.exit <span class=\"hljs-number\">1</span>\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> opts.compile <span class=\"hljs-keyword\">and</span> opts.watch\n          timeLog <span class=\"hljs-string\">\"compiled <span class=\"hljs-subst\">#{sourcePath}</span>\"</span>\n    <span class=\"hljs-keyword\">if</span> generatedSourceMap\n      fs.writeFile sourceMapPath, generatedSourceMap, <span class=\"hljs-function\"><span class=\"hljs-params\">(err)</span> -&gt;</span>\n        <span class=\"hljs-keyword\">if</span> err\n          printLine <span class=\"hljs-string\">\"Could not write source map: <span class=\"hljs-subst\">#{err.message}</span>\"</span>\n          process.exit <span class=\"hljs-number\">1</span>\n  fs.exists jsDir, <span class=\"hljs-function\"><span class=\"hljs-params\">(itExists)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> itExists <span class=\"hljs-keyword\">then</span> compile() <span class=\"hljs-keyword\">else</span> mkdirp jsDir, compile</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>Convenience for cleaner setTimeouts.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">wait</span> = <span class=\"hljs-params\">(milliseconds, func)</span> -&gt;</span> setTimeout func, milliseconds</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <p>When watching scripts, it’s useful to log changes with the timestamp.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">timeLog</span> = <span class=\"hljs-params\">(message)</span> -&gt;</span>\n  <span class=\"hljs-built_in\">console</span>.log <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{(<span class=\"hljs-keyword\">new</span> Date).toLocaleTimeString()}</span> - <span class=\"hljs-subst\">#{message}</span>\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>\n              </div>\n              <p>Pretty-print a stream of tokens, sans location data.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">printTokens</span> = <span class=\"hljs-params\">(tokens)</span> -&gt;</span>\n  strings = <span class=\"hljs-keyword\">for</span> token <span class=\"hljs-keyword\">in</span> tokens\n    tag = token[<span class=\"hljs-number\">0</span>]\n    value = token[<span class=\"hljs-number\">1</span>].toString().replace(<span class=\"hljs-regexp\">/\\n/</span>, <span class=\"hljs-string\">'\\\\n'</span>)\n    <span class=\"hljs-string\">\"[<span class=\"hljs-subst\">#{tag}</span> <span class=\"hljs-subst\">#{value}</span>]\"</span>\n  printLine strings.join(<span class=\"hljs-string\">' '</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>\n              </div>\n              <p>Use the <a href=\"optparse.html\">OptionParser module</a> to extract all options from\n<code>process.argv</code> that are specified in <code>SWITCHES</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">parseOptions</span> = -&gt;</span>\n  optionParser  = <span class=\"hljs-keyword\">new</span> optparse.OptionParser SWITCHES, BANNER\n  o = opts      = optionParser.parse process.argv[<span class=\"hljs-number\">2.</span>.]\n  o.compile     <span class=\"hljs-keyword\">or</span>=  !!o.output\n  o.run         = <span class=\"hljs-keyword\">not</span> (o.compile <span class=\"hljs-keyword\">or</span> o.<span class=\"hljs-built_in\">print</span> <span class=\"hljs-keyword\">or</span> o.map)\n  o.<span class=\"hljs-built_in\">print</span>       = !!  (o.<span class=\"hljs-built_in\">print</span> <span class=\"hljs-keyword\">or</span> (o.eval <span class=\"hljs-keyword\">or</span> o.stdio <span class=\"hljs-keyword\">and</span> o.compile))</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-23\">&#182;</a>\n              </div>\n              <p>The compile-time options to pass to the CoffeeScript compiler.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">compileOptions</span> = <span class=\"hljs-params\">(filename, base)</span> -&gt;</span>\n  answer = {\n    filename\n    literate: opts.literate <span class=\"hljs-keyword\">or</span> helpers.isLiterate(filename)\n    bare: opts.bare\n    header: opts.compile <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> opts[<span class=\"hljs-string\">'no-header'</span>]\n    sourceMap: opts.map\n    inlineMap: opts[<span class=\"hljs-string\">'inline-map'</span>]\n  }\n  <span class=\"hljs-keyword\">if</span> filename\n    <span class=\"hljs-keyword\">if</span> base\n      cwd = process.cwd()\n      jsPath = outputPath filename, base\n      jsDir = path.dirname jsPath\n      answer = helpers.merge answer, {\n        jsPath\n        sourceRoot: path.relative jsDir, cwd\n        sourceFiles: [path.relative cwd, filename]\n        generatedFile: helpers.baseFileName(jsPath, <span class=\"hljs-literal\">no</span>, useWinPathSep)\n      }\n    <span class=\"hljs-keyword\">else</span>\n      answer = helpers.merge answer,\n        sourceRoot: <span class=\"hljs-string\">\"\"</span>\n        sourceFiles: [helpers.baseFileName filename, <span class=\"hljs-literal\">no</span>, useWinPathSep]\n        generatedFile: helpers.baseFileName(filename, <span class=\"hljs-literal\">yes</span>, useWinPathSep) + <span class=\"hljs-string\">\".js\"</span>\n  answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-24\">&#182;</a>\n              </div>\n              <p>Start up a new Node.js instance with the arguments in <code>--nodejs</code> passed to\nthe <code>node</code> binary, preserving the other options.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">forkNode</span> = -&gt;</span>\n  nodeArgs = opts.nodejs.split <span class=\"hljs-regexp\">/\\s+/</span>\n  args     = process.argv[<span class=\"hljs-number\">1.</span>.]\n  args.splice args.indexOf(<span class=\"hljs-string\">'--nodejs'</span>), <span class=\"hljs-number\">2</span>\n  p = spawn process.execPath, nodeArgs.concat(args),\n    cwd:        process.cwd()\n    env:        process.env\n    stdio:      [<span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>]\n  p.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">'exit'</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(code)</span> -&gt;</span> process.exit code</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-25\">&#182;</a>\n              </div>\n              <p>Print the <code>--help</code> usage message and exit. Deprecated switches are not\nshown.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">usage</span> = -&gt;</span>\n  printLine (<span class=\"hljs-keyword\">new</span> optparse.OptionParser SWITCHES, BANNER).help()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-26\">&#182;</a>\n              </div>\n              <p>Print the <code>--version</code> message and exit.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">version</span> = -&gt;</span>\n  printLine <span class=\"hljs-string\">\"CoffeeScript version <span class=\"hljs-subst\">#{CoffeeScript.VERSION}</span>\"</span></pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/docco.css",
    "content": "/*--------------------- Typography ----------------------------*/\n\n@font-face {\n    font-family: 'aller-light';\n    src: url('public/fonts/aller-light.eot');\n    src: url('public/fonts/aller-light.eot?#iefix') format('embedded-opentype'),\n         url('public/fonts/aller-light.woff') format('woff'),\n         url('public/fonts/aller-light.ttf') format('truetype');\n    font-weight: normal;\n    font-style: normal;\n}\n\n@font-face {\n    font-family: 'aller-bold';\n    src: url('public/fonts/aller-bold.eot');\n    src: url('public/fonts/aller-bold.eot?#iefix') format('embedded-opentype'),\n         url('public/fonts/aller-bold.woff') format('woff'),\n         url('public/fonts/aller-bold.ttf') format('truetype');\n    font-weight: normal;\n    font-style: normal;\n}\n\n@font-face {\n    font-family: 'roboto-black';\n    src: url('public/fonts/roboto-black.eot');\n    src: url('public/fonts/roboto-black.eot?#iefix') format('embedded-opentype'),\n         url('public/fonts/roboto-black.woff') format('woff'),\n         url('public/fonts/roboto-black.ttf') format('truetype');\n    font-weight: normal;\n    font-style: normal;\n}\n\n/*--------------------- Layout ----------------------------*/\nhtml { height: 100%; }\nbody {\n  font-family: \"aller-light\";\n  font-size: 14px;\n  line-height: 18px;\n  color: #30404f;\n  margin: 0; padding: 0;\n  height:100%;\n}\n#container { min-height: 100%; }\n\na {\n  color: #000;\n}\n\nb, strong {\n  font-weight: normal;\n  font-family: \"aller-bold\";\n}\n\np {\n  margin: 15px 0 0px;\n}\n  .annotation ul, .annotation ol {\n    margin: 25px 0;\n  }\n    .annotation ul li, .annotation ol li {\n      font-size: 14px;\n      line-height: 18px;\n      margin: 10px 0;\n    }\n\nh1, h2, h3, h4, h5, h6 {\n  color: #112233;\n  line-height: 1em;\n  font-weight: normal;\n  font-family: \"roboto-black\";\n  text-transform: uppercase;\n  margin: 30px 0 15px 0;\n}\n\nh1 {\n  margin-top: 40px;\n}\nh2 {\n  font-size: 1.26em;\n}\n\nhr {\n  border: 0;\n  background: 1px #ddd;\n  height: 1px;\n  margin: 20px 0;\n}\n\npre, tt, code {\n  font-size: 12px; line-height: 16px;\n  font-family: Menlo, Monaco, Consolas, \"Lucida Console\", monospace;\n  margin: 0; padding: 0;\n}\n  .annotation pre {\n    display: block;\n    margin: 0;\n    padding: 7px 10px;\n    background: #fcfcfc;\n    -moz-box-shadow:    inset 0 0 10px rgba(0,0,0,0.1);\n    -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.1);\n    box-shadow:         inset 0 0 10px rgba(0,0,0,0.1);\n    overflow-x: auto;\n  }\n    .annotation pre code {\n      border: 0;\n      padding: 0;\n      background: transparent;\n    }\n\n\nblockquote {\n  border-left: 5px solid #ccc;\n  margin: 0;\n  padding: 1px 0 1px 1em;\n}\n  .sections blockquote p {\n    font-family: Menlo, Consolas, Monaco, monospace;\n    font-size: 12px; line-height: 16px;\n    color: #999;\n    margin: 10px 0 0;\n    white-space: pre-wrap;\n  }\n\nul.sections {\n  list-style: none;\n  padding:0 0 5px 0;;\n  margin:0;\n}\n\n/*\n  Force border-box so that % widths fit the parent\n  container without overlap because of margin/padding.\n\n  More Info : http://www.quirksmode.org/css/box.html\n*/\nul.sections > li > div {\n  -moz-box-sizing: border-box;    /* firefox */\n  -ms-box-sizing: border-box;     /* ie */\n  -webkit-box-sizing: border-box; /* webkit */\n  -khtml-box-sizing: border-box;  /* konqueror */\n  box-sizing: border-box;         /* css3 */\n}\n\n\n/*---------------------- Jump Page -----------------------------*/\n#jump_to, #jump_page {\n  margin: 0;\n  background: white;\n  -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;\n  -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;\n  font: 16px Arial;\n  cursor: pointer;\n  text-align: right;\n  list-style: none;\n}\n\n#jump_to a {\n  text-decoration: none;\n}\n\n#jump_to a.large {\n  display: none;\n}\n#jump_to a.small {\n  font-size: 22px;\n  font-weight: bold;\n  color: #676767;\n}\n\n#jump_to, #jump_wrapper {\n  position: fixed;\n  right: 0; top: 0;\n  padding: 10px 15px;\n  margin:0;\n}\n\n#jump_wrapper {\n  display: none;\n  padding:0;\n}\n\n#jump_to:hover #jump_wrapper {\n  display: block;\n}\n\n#jump_page_wrapper{\n  position: fixed;\n  right: 0;\n  top: 0;\n  bottom: 0;\n}\n\n#jump_page {\n  padding: 5px 0 3px;\n  margin: 0 0 25px 25px;\n  max-height: 100%;\n  overflow: auto;\n}\n\n#jump_page .source {\n  display: block;\n  padding: 15px;\n  text-decoration: none;\n  border-top: 1px solid #eee;\n}\n\n#jump_page .source:hover {\n  background: #f5f5ff;\n}\n\n#jump_page .source:first-child {\n}\n\n/*---------------------- Low resolutions (> 320px) ---------------------*/\n@media only screen and (min-width: 320px) {\n  .pilwrap { display: none; }\n\n  ul.sections > li > div {\n    display: block;\n    padding:5px 10px 0 10px;\n  }\n\n  ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol {\n    padding-left: 30px;\n  }\n\n  ul.sections > li > div.content {\n    overflow-x:auto;\n    -webkit-box-shadow: inset 0 0 5px #e5e5ee;\n    box-shadow: inset 0 0 5px #e5e5ee;\n    border: 1px solid #dedede;\n    margin:5px 10px 5px 10px;\n    padding-bottom: 5px;\n  }\n\n  ul.sections > li > div.annotation pre {\n    margin: 7px 0 7px;\n    padding-left: 15px;\n  }\n\n  ul.sections > li > div.annotation p tt, .annotation code {\n    background: #f8f8ff;\n    border: 1px solid #dedede;\n    font-size: 12px;\n    padding: 0 0.2em;\n  }\n}\n\n/*----------------------  (> 481px) ---------------------*/\n@media only screen and (min-width: 481px) {\n  #container {\n    position: relative;\n  }\n  body {\n    background-color: #F5F5FF;\n    font-size: 15px;\n    line-height: 21px;\n  }\n  pre, tt, code {\n    line-height: 18px;\n  }\n  p, ul, ol {\n    margin: 0 0 15px;\n  }\n\n\n  #jump_to {\n    padding: 5px 10px;\n  }\n  #jump_wrapper {\n    padding: 0;\n  }\n  #jump_to, #jump_page {\n    font: 10px Arial;\n    text-transform: uppercase;\n  }\n  #jump_page .source {\n    padding: 5px 10px;\n  }\n  #jump_to a.large {\n    display: inline-block;\n  }\n  #jump_to a.small {\n    display: none;\n  }\n\n\n\n  #background {\n    position: absolute;\n    top: 0; bottom: 0;\n    width: 350px;\n    background: #fff;\n    border-right: 1px solid #e5e5ee;\n    z-index: -1;\n  }\n\n  ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol {\n    padding-left: 40px;\n  }\n\n  ul.sections > li {\n    white-space: nowrap;\n  }\n\n  ul.sections > li > div {\n    display: inline-block;\n  }\n\n  ul.sections > li > div.annotation {\n    max-width: 350px;\n    min-width: 350px;\n    min-height: 5px;\n    padding: 13px;\n    overflow-x: hidden;\n    white-space: normal;\n    vertical-align: top;\n    text-align: left;\n  }\n  ul.sections > li > div.annotation pre {\n    margin: 15px 0 15px;\n    padding-left: 15px;\n  }\n\n  ul.sections > li > div.content {\n    padding: 13px;\n    vertical-align: top;\n    border: none;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n\n  .pilwrap {\n    position: relative;\n    display: inline;\n  }\n\n  .pilcrow {\n    font: 12px Arial;\n    text-decoration: none;\n    color: #454545;\n    position: absolute;\n    top: 3px; left: -20px;\n    padding: 1px 2px;\n    opacity: 0;\n    -webkit-transition: opacity 0.2s linear;\n  }\n    .for-h1 .pilcrow {\n      top: 47px;\n    }\n    .for-h2 .pilcrow, .for-h3 .pilcrow, .for-h4 .pilcrow {\n      top: 35px;\n    }\n\n  ul.sections > li > div.annotation:hover .pilcrow {\n    opacity: 1;\n  }\n}\n\n/*---------------------- (> 1025px) ---------------------*/\n@media only screen and (min-width: 1025px) {\n\n  body {\n    font-size: 16px;\n    line-height: 24px;\n  }\n\n  #background {\n    width: 525px;\n  }\n  ul.sections > li > div.annotation {\n    max-width: 525px;\n    min-width: 525px;\n    padding: 10px 25px 1px 50px;\n  }\n  ul.sections > li > div.content {\n    padding: 9px 15px 16px 25px;\n  }\n}\n\n/*---------------------- Syntax Highlighting -----------------------------*/\n\ntd.linenos { background-color: #f0f0f0; padding-right: 10px; }\nspan.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\n/*\n\ngithub.com style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\npre code {\n  display: block; padding: 0.5em;\n  color: #000;\n  background: #f8f8ff\n}\n\npre .hljs-comment,\npre .hljs-template_comment,\npre .hljs-diff .hljs-header,\npre .hljs-javadoc {\n  color: #408080;\n  font-style: italic\n}\n\npre .hljs-keyword,\npre .hljs-assignment,\npre .hljs-literal,\npre .hljs-css .hljs-rule .hljs-keyword,\npre .hljs-winutils,\npre .hljs-javascript .hljs-title,\npre .hljs-lisp .hljs-title,\npre .hljs-subst {\n  color: #954121;\n  /*font-weight: bold*/\n}\n\npre .hljs-number,\npre .hljs-hexcolor {\n  color: #40a070\n}\n\npre .hljs-string,\npre .hljs-tag .hljs-value,\npre .hljs-phpdoc,\npre .hljs-tex .hljs-formula {\n  color: #219161;\n}\n\npre .hljs-title,\npre .hljs-id {\n  color: #19469D;\n}\npre .hljs-params {\n  color: #00F;\n}\n\npre .hljs-javascript .hljs-title,\npre .hljs-lisp .hljs-title,\npre .hljs-subst {\n  font-weight: normal\n}\n\npre .hljs-class .hljs-title,\npre .hljs-haskell .hljs-label,\npre .hljs-tex .hljs-command {\n  color: #458;\n  font-weight: bold\n}\n\npre .hljs-tag,\npre .hljs-tag .hljs-title,\npre .hljs-rules .hljs-property,\npre .hljs-django .hljs-tag .hljs-keyword {\n  color: #000080;\n  font-weight: normal\n}\n\npre .hljs-attribute,\npre .hljs-variable,\npre .hljs-instancevar,\npre .hljs-lisp .hljs-body {\n  color: #008080\n}\n\npre .hljs-regexp {\n  color: #B68\n}\n\npre .hljs-class {\n  color: #458;\n  font-weight: bold\n}\n\npre .hljs-symbol,\npre .hljs-ruby .hljs-symbol .hljs-string,\npre .hljs-ruby .hljs-symbol .hljs-keyword,\npre .hljs-ruby .hljs-symbol .hljs-keymethods,\npre .hljs-lisp .hljs-keyword,\npre .hljs-tex .hljs-special,\npre .hljs-input_number {\n  color: #990073\n}\n\npre .hljs-builtin,\npre .hljs-constructor,\npre .hljs-built_in,\npre .hljs-lisp .hljs-title {\n  color: #0086b3\n}\n\npre .hljs-preprocessor,\npre .hljs-pi,\npre .hljs-doctype,\npre .hljs-shebang,\npre .hljs-cdata {\n  color: #999;\n  font-weight: bold\n}\n\npre .hljs-deletion {\n  background: #fdd\n}\n\npre .hljs-addition {\n  background: #dfd\n}\n\npre .hljs-diff .hljs-change {\n  background: #0086b3\n}\n\npre .hljs-chunk {\n  color: #aaa\n}\n\npre .hljs-tex .hljs-formula {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "docs/v1/annotated-source/grammar.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>grammar.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>grammar.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              <p>The CoffeeScript parser is generated by <a href=\"https://github.com/zaach/jison\">Jison</a>\nfrom this grammar file. Jison is a bottom-up parser generator, similar in\nstyle to <a href=\"http://www.gnu.org/software/bison\">Bison</a>, implemented in JavaScript.\nIt can recognize <a href=\"https://en.wikipedia.org/wiki/LR_grammar\">LALR(1), LR(0), SLR(1), and LR(1)</a>\ntype grammars. To create the Jison parser, we list the pattern to match\non the left-hand side, and the action to take (usually the creation of syntax\ntree nodes) on the right. As the parser runs, it\nshifts tokens from our token stream, from left to right, and\n<a href=\"https://en.wikipedia.org/wiki/Bottom-up_parsing\">attempts to match</a>\nthe token sequence against the rules below. When a match can be made, it\nreduces into the <a href=\"https://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols\">nonterminal</a>\n(the enclosing name at the top), and we proceed from there.</p>\n<p>If you run the <code>cake build:parser</code> command, Jison constructs a parse table\nfrom our rules and saves it into <code>lib/parser.js</code>.</p>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>The only dependency is on the <strong>Jison.Parser</strong>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>{Parser} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'jison'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <h2 id=\"jison-dsl\">Jison DSL</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Since we’re going to be wrapped in a function by Jison in any case, if our\naction immediately returns a value, we can optimize by removing the function\nwrapper and just returning the value directly.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>unwrap = <span class=\"hljs-regexp\">/^function\\s*\\(\\)\\s*\\{\\s*return\\s*([\\s\\S]*);\\s*\\}/</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Our handy DSL for Jison grammar generation, thanks to\n<a href=\"https://github.com/creationix\">Tim Caswell</a>. For every rule in the grammar,\nwe pass the pattern-defining string, the action to run, and extra options,\noptionally. If no action is specified, we simply pass the value of the\nprevious nonterminal.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">o</span> = <span class=\"hljs-params\">(patternString, action, options)</span> -&gt;</span>\n  patternString = patternString.replace <span class=\"hljs-regexp\">/\\s{2,}/g</span>, <span class=\"hljs-string\">' '</span>\n  patternCount = patternString.split(<span class=\"hljs-string\">' '</span>).length\n  <span class=\"hljs-keyword\">return</span> [patternString, <span class=\"hljs-string\">'$$ = $1;'</span>, options] <span class=\"hljs-keyword\">unless</span> action\n  action = <span class=\"hljs-keyword\">if</span> match = unwrap.exec action <span class=\"hljs-keyword\">then</span> match[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">\"(<span class=\"hljs-subst\">#{action}</span>())\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>All runtime functions we need are defined on “yy”</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  action = action.replace <span class=\"hljs-regexp\">/\\bnew /g</span>, <span class=\"hljs-string\">'$&amp;yy.'</span>\n  action = action.replace <span class=\"hljs-regexp\">/\\b(?:Block\\.wrap|extend)\\b/g</span>, <span class=\"hljs-string\">'yy.$&amp;'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Returns a function which adds location data to the first parameter passed\nin, and returns the parameter.  If the parameter is not a node, it will\njust be passed through unaffected.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">  <span class=\"hljs-title\">addLocationDataFn</span> = <span class=\"hljs-params\">(first, last)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> last\n      <span class=\"hljs-string\">\"yy.addLocationDataFn(@<span class=\"hljs-subst\">#{first}</span>)\"</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">\"yy.addLocationDataFn(@<span class=\"hljs-subst\">#{first}</span>, @<span class=\"hljs-subst\">#{last}</span>)\"</span>\n\n  action = action.replace <span class=\"hljs-regexp\">/LOC\\(([0-9]*)\\)/g</span>, addLocationDataFn(<span class=\"hljs-string\">'$1'</span>)\n  action = action.replace <span class=\"hljs-regexp\">/LOC\\(([0-9]*),\\s*([0-9]*)\\)/g</span>, addLocationDataFn(<span class=\"hljs-string\">'$1'</span>, <span class=\"hljs-string\">'$2'</span>)\n\n  [patternString, <span class=\"hljs-string\">\"$$ = <span class=\"hljs-subst\">#{addLocationDataFn(<span class=\"hljs-number\">1</span>, patternCount)}</span>(<span class=\"hljs-subst\">#{action}</span>);\"</span>, options]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <h2 id=\"grammatical-rules\">Grammatical Rules</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>In all of the rules that follow, you’ll see the name of the nonterminal as\nthe key to a list of alternative matches. With each match’s action, the\ndollar-sign variables are provided by Jison as references to the value of\ntheir numeric position, so in this rule:</p>\n<pre><code><span class=\"hljs-string\">\"Expression UNLESS Expression\"</span>\n</code></pre><p><code>$1</code> would be the value of the first <code>Expression</code>, <code>$2</code> would be the token\nfor the <code>UNLESS</code> terminal, and <code>$3</code> would be the value of the second\n<code>Expression</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>grammar =</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>The <strong>Root</strong> is the top-level node in the syntax tree. Since we parse bottom-up,\nall parsing must end here.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Root: [\n    o <span class=\"hljs-string\">''</span>,                                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Block\n    o <span class=\"hljs-string\">'Body'</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Any list of statements and expressions, separated by line breaks or semicolons.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Body: [\n    o <span class=\"hljs-string\">'Line'</span>,                                   <span class=\"hljs-function\">-&gt;</span> Block.wrap [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">'Body TERMINATOR Line'</span>,                   <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>push $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Body TERMINATOR'</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>Block and statements, which make up a line in a body. YieldReturn is a\nstatement, but not included in Statement because that results in an ambiguous\ngrammar.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Line: [\n    o <span class=\"hljs-string\">'Expression'</span>\n    o <span class=\"hljs-string\">'Statement'</span>\n    o <span class=\"hljs-string\">'YieldReturn'</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>Pure statements which cannot be expressions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Statement: [\n    o <span class=\"hljs-string\">'Return'</span>\n    o <span class=\"hljs-string\">'Comment'</span>\n    o <span class=\"hljs-string\">'STATEMENT'</span>,                              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> StatementLiteral $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'Import'</span>\n    o <span class=\"hljs-string\">'Export'</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>All the different types of expressions in our language. The basic unit of\nCoffeeScript is the <strong>Expression</strong> – everything that can be an expression\nis one. Blocks serve as the building blocks of many other rules, making\nthem somewhat circular.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Expression: [\n    o <span class=\"hljs-string\">'Value'</span>\n    o <span class=\"hljs-string\">'Invocation'</span>\n    o <span class=\"hljs-string\">'Code'</span>\n    o <span class=\"hljs-string\">'Operation'</span>\n    o <span class=\"hljs-string\">'Assign'</span>\n    o <span class=\"hljs-string\">'If'</span>\n    o <span class=\"hljs-string\">'Try'</span>\n    o <span class=\"hljs-string\">'While'</span>\n    o <span class=\"hljs-string\">'For'</span>\n    o <span class=\"hljs-string\">'Switch'</span>\n    o <span class=\"hljs-string\">'Class'</span>\n    o <span class=\"hljs-string\">'Throw'</span>\n    o <span class=\"hljs-string\">'Yield'</span>\n  ]\n\n  Yield: [\n    o <span class=\"hljs-string\">'YIELD'</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span>, <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">''</span>\n    o <span class=\"hljs-string\">'YIELD Expression'</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'YIELD FROM Expression'</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1.</span>concat($<span class=\"hljs-number\">2</span>), $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>An indented block of expressions. Note that the <a href=\"rewriter.html\">Rewriter</a>\nwill convert some postfix forms into blocks for us, by adjusting the\ntoken stream.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Block: [\n    o <span class=\"hljs-string\">'INDENT OUTDENT'</span>,                         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Block\n    o <span class=\"hljs-string\">'INDENT Body OUTDENT'</span>,                    <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2</span>\n  ]\n\n  Identifier: [\n    o <span class=\"hljs-string\">'IDENTIFIER'</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> IdentifierLiteral $<span class=\"hljs-number\">1</span>\n  ]\n\n  Property: [\n    o <span class=\"hljs-string\">'PROPERTY'</span>,                               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> PropertyName $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>Alphanumerics are separated from the other <strong>Literal</strong> matchers because\nthey can also serve as keys in object literals.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  AlphaNumeric: [\n    o <span class=\"hljs-string\">'NUMBER'</span>,                                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> NumberLiteral $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'String'</span>\n  ]\n\n  String: [\n    o <span class=\"hljs-string\">'STRING'</span>,                                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> StringLiteral $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'STRING_START Body STRING_END'</span>,           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> StringWithInterpolations $<span class=\"hljs-number\">2</span>\n  ]\n\n  Regex: [\n    o <span class=\"hljs-string\">'REGEX'</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> RegexLiteral $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'REGEX_START Invocation REGEX_END'</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> RegexWithInterpolations $<span class=\"hljs-number\">2.</span>args\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>All of our immediate values. Generally these can be passed straight\nthrough and printed to JavaScript.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Literal: [\n    o <span class=\"hljs-string\">'AlphaNumeric'</span>\n    o <span class=\"hljs-string\">'JS'</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> PassthroughLiteral $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'Regex'</span>\n    o <span class=\"hljs-string\">'UNDEFINED'</span>,                              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> UndefinedLiteral\n    o <span class=\"hljs-string\">'NULL'</span>,                                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> NullLiteral\n    o <span class=\"hljs-string\">'BOOL'</span>,                                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> BooleanLiteral $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'INFINITY'</span>,                               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> InfinityLiteral $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'NAN'</span>,                                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> NaNLiteral\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <p>Assignment of a variable, property, or index to a value.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Assign: [\n    o <span class=\"hljs-string\">'Assignable = Expression'</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Assignable = TERMINATOR Expression'</span>,     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'Assignable = INDENT Expression OUTDENT'</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">4</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>\n              </div>\n              <p>Assignment when it happens within an object literal. The difference from\nthe ordinary <strong>Assign</strong> is that these allow numbers and strings as keys.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  AssignObj: [\n    o <span class=\"hljs-string\">'ObjAssignable'</span>,                          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'ObjAssignable : Expression'</span>,             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>), $<span class=\"hljs-number\">3</span>, <span class=\"hljs-string\">'object'</span>,\n                                                              operatorToken: LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">2</span>)\n    o <span class=\"hljs-string\">'ObjAssignable :\n       INDENT Expression OUTDENT'</span>,              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>), $<span class=\"hljs-number\">4</span>, <span class=\"hljs-string\">'object'</span>,\n                                                              operatorToken: LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">2</span>)\n    o <span class=\"hljs-string\">'SimpleObjAssignable = Expression'</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>), $<span class=\"hljs-number\">3</span>, <span class=\"hljs-literal\">null</span>,\n                                                              operatorToken: LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">2</span>)\n    o <span class=\"hljs-string\">'SimpleObjAssignable =\n       INDENT Expression OUTDENT'</span>,              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>), $<span class=\"hljs-number\">4</span>, <span class=\"hljs-literal\">null</span>,\n                                                              operatorToken: LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">2</span>)\n    o <span class=\"hljs-string\">'Comment'</span>\n  ]\n\n  SimpleObjAssignable: [\n    o <span class=\"hljs-string\">'Identifier'</span>\n    o <span class=\"hljs-string\">'Property'</span>\n    o <span class=\"hljs-string\">'ThisProperty'</span>\n  ]\n\n  ObjAssignable: [\n    o <span class=\"hljs-string\">'SimpleObjAssignable'</span>\n    o <span class=\"hljs-string\">'AlphaNumeric'</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>\n              </div>\n              <p>A return statement from a function body.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Return: [\n    o <span class=\"hljs-string\">'RETURN Expression'</span>,                      <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Return $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'RETURN INDENT Object OUTDENT'</span>,           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Return <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'RETURN'</span>,                                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Return\n  ]\n\n  YieldReturn: [\n    o <span class=\"hljs-string\">'YIELD RETURN Expression'</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> YieldReturn $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'YIELD RETURN'</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> YieldReturn\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-23\">&#182;</a>\n              </div>\n              <p>A block comment.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Comment: [\n    o <span class=\"hljs-string\">'HERECOMMENT'</span>,                            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Comment $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-24\">&#182;</a>\n              </div>\n              <p>The <strong>Code</strong> node is the function literal. It’s defined by an indented block\nof <strong>Block</strong> preceded by a function arrow, with an optional parameter\nlist.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Code: [\n    o <span class=\"hljs-string\">'PARAM_START ParamList PARAM_END FuncGlyph Block'</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Code $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">5</span>, $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'FuncGlyph Block'</span>,                        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Code [], $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-25\">&#182;</a>\n              </div>\n              <p>CoffeeScript has two different symbols for functions. <code>-&gt;</code> is for ordinary\nfunctions, and <code>=&gt;</code> is for functions bound to the current value of <em>this</em>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  FuncGlyph: [\n    o <span class=\"hljs-string\">'-&gt;'</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">'func'</span>\n    o <span class=\"hljs-string\">'=&gt;'</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">'boundfunc'</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-26\">&#182;</a>\n              </div>\n              <p>An optional, trailing comma.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  OptComma: [\n    o <span class=\"hljs-string\">''</span>\n    o <span class=\"hljs-string\">','</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-27\">&#182;</a>\n              </div>\n              <p>The list of parameters that a function accepts can be of any length.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ParamList: [\n    o <span class=\"hljs-string\">''</span>,                                       <span class=\"hljs-function\">-&gt;</span> []\n    o <span class=\"hljs-string\">'Param'</span>,                                  <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">'ParamList , Param'</span>,                      <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'ParamList OptComma TERMINATOR Param'</span>,    <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'ParamList OptComma INDENT ParamList OptComma OUTDENT'</span>, <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-28\">&#182;</a>\n              </div>\n              <p>A single parameter in a function definition can be ordinary, or a splat\nthat hoovers up the remaining arguments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Param: [\n    o <span class=\"hljs-string\">'ParamVar'</span>,                               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Param $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'ParamVar ...'</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Param $<span class=\"hljs-number\">1</span>, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">on</span>\n    o <span class=\"hljs-string\">'ParamVar = Expression'</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Param $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'...'</span>,                                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Expansion\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-29\">&#182;</a>\n              </div>\n              <p>Function Parameters</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ParamVar: [\n    o <span class=\"hljs-string\">'Identifier'</span>\n    o <span class=\"hljs-string\">'ThisProperty'</span>\n    o <span class=\"hljs-string\">'Array'</span>\n    o <span class=\"hljs-string\">'Object'</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-30\">&#182;</a>\n              </div>\n              <p>A splat that occurs outside of a parameter list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Splat: [\n    o <span class=\"hljs-string\">'Expression ...'</span>,                         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Splat $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-31\">&#182;</a>\n              </div>\n              <p>Variables and properties that can be assigned to.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  SimpleAssignable: [\n    o <span class=\"hljs-string\">'Identifier'</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'Value Accessor'</span>,                         <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>add $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'Invocation Accessor'</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>, [].concat $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'ThisProperty'</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-32\">&#182;</a>\n              </div>\n              <p>Everything that can be assigned to.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Assignable: [\n    o <span class=\"hljs-string\">'SimpleAssignable'</span>\n    o <span class=\"hljs-string\">'Array'</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'Object'</span>,                                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-33\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-33\">&#182;</a>\n              </div>\n              <p>The types of things that can be treated as values – assigned to, invoked\nas functions, indexed into, named as a class, etc.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Value: [\n    o <span class=\"hljs-string\">'Assignable'</span>\n    o <span class=\"hljs-string\">'Literal'</span>,                                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'Parenthetical'</span>,                          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'Range'</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'This'</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-34\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-34\">&#182;</a>\n              </div>\n              <p>The general group of accessors into an object, by property, by prototype\nor by array index or slice.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Accessor: [\n    o <span class=\"hljs-string\">'.  Property'</span>,                            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Access $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'?. Property'</span>,                            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Access $<span class=\"hljs-number\">2</span>, <span class=\"hljs-string\">'soak'</span>\n    o <span class=\"hljs-string\">':: Property'</span>,                            <span class=\"hljs-function\">-&gt;</span> [LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName(<span class=\"hljs-string\">'prototype'</span>)), LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Access $<span class=\"hljs-number\">2</span>)]\n    o <span class=\"hljs-string\">'?:: Property'</span>,                           <span class=\"hljs-function\">-&gt;</span> [LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName(<span class=\"hljs-string\">'prototype'</span>), <span class=\"hljs-string\">'soak'</span>), LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Access $<span class=\"hljs-number\">2</span>)]\n    o <span class=\"hljs-string\">'::'</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName <span class=\"hljs-string\">'prototype'</span>\n    o <span class=\"hljs-string\">'Index'</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-35\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-35\">&#182;</a>\n              </div>\n              <p>Indexing into an object or array using bracket notation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Index: [\n    o <span class=\"hljs-string\">'INDEX_START IndexValue INDEX_END'</span>,       <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'INDEX_SOAK  Index'</span>,                      <span class=\"hljs-function\">-&gt;</span> extend $<span class=\"hljs-number\">2</span>, soak : <span class=\"hljs-literal\">yes</span>\n  ]\n\n  IndexValue: [\n    o <span class=\"hljs-string\">'Expression'</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Index $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'Slice'</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Slice $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-36\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-36\">&#182;</a>\n              </div>\n              <p>In CoffeeScript, an object literal is simply a list of assignments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Object: [\n    o <span class=\"hljs-string\">'{ AssignList OptComma }'</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Obj $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1.</span>generated\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-37\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-37\">&#182;</a>\n              </div>\n              <p>Assignment of properties within an object literal can be separated by\ncomma, as in JavaScript, or simply by newline.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  AssignList: [\n    o <span class=\"hljs-string\">''</span>,                                                       <span class=\"hljs-function\">-&gt;</span> []\n    o <span class=\"hljs-string\">'AssignObj'</span>,                                              <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">'AssignList , AssignObj'</span>,                                 <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'AssignList OptComma TERMINATOR AssignObj'</span>,               <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'AssignList OptComma INDENT AssignList OptComma OUTDENT'</span>, <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-38\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-38\">&#182;</a>\n              </div>\n              <p>Class definitions have optional bodies of prototype property assignments,\nand optional references to the superclass.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Class: [\n    o <span class=\"hljs-string\">'CLASS'</span>,                                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class\n    o <span class=\"hljs-string\">'CLASS Block'</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'CLASS EXTENDS Expression'</span>,                        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'CLASS EXTENDS Expression Block'</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'CLASS SimpleAssignable'</span>,                          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'CLASS SimpleAssignable Block'</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class $<span class=\"hljs-number\">2</span>, <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'CLASS SimpleAssignable EXTENDS Expression'</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'CLASS SimpleAssignable EXTENDS Expression Block'</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">5</span>\n  ]\n\n  Import: [\n    o <span class=\"hljs-string\">'IMPORT String'</span>,                                                                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'IMPORT ImportDefaultSpecifier FROM String'</span>,                                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause($<span class=\"hljs-number\">2</span>, <span class=\"hljs-literal\">null</span>), $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'IMPORT ImportNamespaceSpecifier FROM String'</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause(<span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">2</span>), $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'IMPORT { } FROM String'</span>,                                                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause(<span class=\"hljs-literal\">null</span>, <span class=\"hljs-keyword\">new</span> ImportSpecifierList []), $<span class=\"hljs-number\">5</span>\n    o <span class=\"hljs-string\">'IMPORT { ImportSpecifierList OptComma } FROM String'</span>,                          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause(<span class=\"hljs-literal\">null</span>, <span class=\"hljs-keyword\">new</span> ImportSpecifierList $<span class=\"hljs-number\">3</span>), $<span class=\"hljs-number\">7</span>\n    o <span class=\"hljs-string\">'IMPORT ImportDefaultSpecifier , ImportNamespaceSpecifier FROM String'</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause($<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>), $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">'IMPORT ImportDefaultSpecifier , { ImportSpecifierList OptComma } FROM String'</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause($<span class=\"hljs-number\">2</span>, <span class=\"hljs-keyword\">new</span> ImportSpecifierList $<span class=\"hljs-number\">5</span>), $<span class=\"hljs-number\">9</span>\n  ]\n\n  ImportSpecifierList: [\n    o <span class=\"hljs-string\">'ImportSpecifier'</span>,                                                          <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">'ImportSpecifierList , ImportSpecifier'</span>,                                    <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'ImportSpecifierList OptComma TERMINATOR ImportSpecifier'</span>,                  <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'INDENT ImportSpecifierList OptComma OUTDENT'</span>,                              <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'ImportSpecifierList OptComma INDENT ImportSpecifierList OptComma OUTDENT'</span>, <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n  ]\n\n  ImportSpecifier: [\n    o <span class=\"hljs-string\">'Identifier'</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportSpecifier $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'Identifier AS Identifier'</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportSpecifier $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'DEFAULT'</span>,                                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportSpecifier <span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'DEFAULT AS Identifier'</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportSpecifier <span class=\"hljs-keyword\">new</span> Literal($<span class=\"hljs-number\">1</span>), $<span class=\"hljs-number\">3</span>\n  ]\n\n  ImportDefaultSpecifier: [\n    o <span class=\"hljs-string\">'Identifier'</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDefaultSpecifier $<span class=\"hljs-number\">1</span>\n  ]\n\n  ImportNamespaceSpecifier: [\n    o <span class=\"hljs-string\">'IMPORT_ALL AS Identifier'</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportNamespaceSpecifier <span class=\"hljs-keyword\">new</span> Literal($<span class=\"hljs-number\">1</span>), $<span class=\"hljs-number\">3</span>\n  ]\n\n  Export: [\n    o <span class=\"hljs-string\">'EXPORT { }'</span>,                                          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration <span class=\"hljs-keyword\">new</span> ExportSpecifierList []\n    o <span class=\"hljs-string\">'EXPORT { ExportSpecifierList OptComma }'</span>,             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration <span class=\"hljs-keyword\">new</span> ExportSpecifierList $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'EXPORT Class'</span>,                                        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'EXPORT Identifier = Expression'</span>,                      <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>, <span class=\"hljs-literal\">null</span>,\n                                                                                                      moduleDeclaration: <span class=\"hljs-string\">'export'</span>\n    o <span class=\"hljs-string\">'EXPORT Identifier = TERMINATOR Expression'</span>,           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">5</span>, <span class=\"hljs-literal\">null</span>,\n                                                                                                      moduleDeclaration: <span class=\"hljs-string\">'export'</span>\n    o <span class=\"hljs-string\">'EXPORT Identifier = INDENT Expression OUTDENT'</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">5</span>, <span class=\"hljs-literal\">null</span>,\n                                                                                                      moduleDeclaration: <span class=\"hljs-string\">'export'</span>\n    o <span class=\"hljs-string\">'EXPORT DEFAULT Expression'</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportDefaultDeclaration $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'EXPORT EXPORT_ALL FROM String'</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportAllDeclaration <span class=\"hljs-keyword\">new</span> Literal($<span class=\"hljs-number\">2</span>), $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'EXPORT { ExportSpecifierList OptComma } FROM String'</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration <span class=\"hljs-keyword\">new</span> ExportSpecifierList($<span class=\"hljs-number\">3</span>), $<span class=\"hljs-number\">7</span>\n  ]\n\n  ExportSpecifierList: [\n    o <span class=\"hljs-string\">'ExportSpecifier'</span>,                                                          <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">'ExportSpecifierList , ExportSpecifier'</span>,                                    <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'ExportSpecifierList OptComma TERMINATOR ExportSpecifier'</span>,                  <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'INDENT ExportSpecifierList OptComma OUTDENT'</span>,                              <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'ExportSpecifierList OptComma INDENT ExportSpecifierList OptComma OUTDENT'</span>, <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n  ]\n\n  ExportSpecifier: [\n    o <span class=\"hljs-string\">'Identifier'</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportSpecifier $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'Identifier AS Identifier'</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportSpecifier $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Identifier AS DEFAULT'</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportSpecifier $<span class=\"hljs-number\">1</span>, <span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'DEFAULT'</span>,                                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportSpecifier <span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'DEFAULT AS Identifier'</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportSpecifier <span class=\"hljs-keyword\">new</span> Literal($<span class=\"hljs-number\">1</span>), $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-39\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-39\">&#182;</a>\n              </div>\n              <p>Ordinary function invocation, or a chained series of calls.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Invocation: [\n    o <span class=\"hljs-string\">'Value OptFuncExist String'</span>,              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> TaggedTemplateCall $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'Value OptFuncExist Arguments'</span>,           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Call $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'Invocation OptFuncExist Arguments'</span>,      <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Call $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'Super'</span>\n  ]\n\n  Super: [\n    o <span class=\"hljs-string\">'SUPER'</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> SuperCall\n    o <span class=\"hljs-string\">'SUPER Arguments'</span>,                        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> SuperCall $<span class=\"hljs-number\">2</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-40\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-40\">&#182;</a>\n              </div>\n              <p>An optional existence check on a function.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  OptFuncExist: [\n    o <span class=\"hljs-string\">''</span>,                                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-literal\">no</span>\n    o <span class=\"hljs-string\">'FUNC_EXIST'</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-literal\">yes</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-41\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-41\">&#182;</a>\n              </div>\n              <p>The list of arguments to a function call.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Arguments: [\n    o <span class=\"hljs-string\">'CALL_START CALL_END'</span>,                    <span class=\"hljs-function\">-&gt;</span> []\n    o <span class=\"hljs-string\">'CALL_START ArgList OptComma CALL_END'</span>,   <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-42\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-42\">&#182;</a>\n              </div>\n              <p>A reference to the <em>this</em> current object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  This: [\n    o <span class=\"hljs-string\">'THIS'</span>,                                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> ThisLiteral\n    o <span class=\"hljs-string\">'@'</span>,                                      <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> ThisLiteral\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-43\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-43\">&#182;</a>\n              </div>\n              <p>A reference to a property on <em>this</em>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ThisProperty: [\n    o <span class=\"hljs-string\">'@ Property'</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> ThisLiteral), [LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Access($<span class=\"hljs-number\">2</span>))], <span class=\"hljs-string\">'this'</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-44\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-44\">&#182;</a>\n              </div>\n              <p>The array literal.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Array: [\n    o <span class=\"hljs-string\">'[ ]'</span>,                                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Arr []\n    o <span class=\"hljs-string\">'[ ArgList OptComma ]'</span>,                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Arr $<span class=\"hljs-number\">2</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-45\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-45\">&#182;</a>\n              </div>\n              <p>Inclusive and exclusive range dots.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  RangeDots: [\n    o <span class=\"hljs-string\">'..'</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">'inclusive'</span>\n    o <span class=\"hljs-string\">'...'</span>,                                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">'exclusive'</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-46\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-46\">&#182;</a>\n              </div>\n              <p>The CoffeeScript range literal.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Range: [\n    o <span class=\"hljs-string\">'[ Expression RangeDots Expression ]'</span>,    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Range $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-47\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-47\">&#182;</a>\n              </div>\n              <p>Array slice literals.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Slice: [\n    o <span class=\"hljs-string\">'Expression RangeDots Expression'</span>,        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Range $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'Expression RangeDots'</span>,                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Range $<span class=\"hljs-number\">1</span>, <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'RangeDots Expression'</span>,                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Range <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'RangeDots'</span>,                              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Range <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-48\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-48\">&#182;</a>\n              </div>\n              <p>The <strong>ArgList</strong> is both the list of objects passed into a function call,\nas well as the contents of an array literal\n(i.e. comma-separated expressions). Newlines work as well.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ArgList: [\n    o <span class=\"hljs-string\">'Arg'</span>,                                              <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">'ArgList , Arg'</span>,                                    <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'ArgList OptComma TERMINATOR Arg'</span>,                  <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'INDENT ArgList OptComma OUTDENT'</span>,                  <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'ArgList OptComma INDENT ArgList OptComma OUTDENT'</span>, <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-49\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-49\">&#182;</a>\n              </div>\n              <p>Valid arguments are Blocks or Splats.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Arg: [\n    o <span class=\"hljs-string\">'Expression'</span>\n    o <span class=\"hljs-string\">'Splat'</span>\n    o <span class=\"hljs-string\">'...'</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Expansion\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-50\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-50\">&#182;</a>\n              </div>\n              <p>Just simple, comma-separated, required arguments (no fancy syntax). We need\nthis to be separate from the <strong>ArgList</strong> for use in <strong>Switch</strong> blocks, where\nhaving the newlines wouldn’t make sense.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  SimpleArgs: [\n    o <span class=\"hljs-string\">'Expression'</span>\n    o <span class=\"hljs-string\">'SimpleArgs , Expression'</span>,                <span class=\"hljs-function\">-&gt;</span> [].concat $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-51\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-51\">&#182;</a>\n              </div>\n              <p>The variants of <em>try/catch/finally</em> exception handling blocks.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Try: [\n    o <span class=\"hljs-string\">'TRY Block'</span>,                              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Try $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'TRY Block Catch'</span>,                        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Try $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">3</span>[<span class=\"hljs-number\">0</span>], $<span class=\"hljs-number\">3</span>[<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">'TRY Block FINALLY Block'</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Try $<span class=\"hljs-number\">2</span>, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'TRY Block Catch FINALLY Block'</span>,          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Try $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">3</span>[<span class=\"hljs-number\">0</span>], $<span class=\"hljs-number\">3</span>[<span class=\"hljs-number\">1</span>], $<span class=\"hljs-number\">5</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-52\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-52\">&#182;</a>\n              </div>\n              <p>A catch clause names its error and runs a block of code.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Catch: [\n    o <span class=\"hljs-string\">'CATCH Identifier Block'</span>,                 <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">3</span>]\n    o <span class=\"hljs-string\">'CATCH Object Block'</span>,                     <span class=\"hljs-function\">-&gt;</span> [LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Value($<span class=\"hljs-number\">2</span>)), $<span class=\"hljs-number\">3</span>]\n    o <span class=\"hljs-string\">'CATCH Block'</span>,                            <span class=\"hljs-function\">-&gt;</span> [<span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">2</span>]\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-53\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-53\">&#182;</a>\n              </div>\n              <p>Throw an exception object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Throw: [\n    o <span class=\"hljs-string\">'THROW Expression'</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Throw $<span class=\"hljs-number\">2</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-54\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-54\">&#182;</a>\n              </div>\n              <p>Parenthetical expressions. Note that the <strong>Parenthetical</strong> is a <strong>Value</strong>,\nnot an <strong>Expression</strong>, so if you need to use an expression in a place\nwhere only values are accepted, wrapping it in parentheses will always do\nthe trick.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Parenthetical: [\n    o <span class=\"hljs-string\">'( Body )'</span>,                               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Parens $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'( INDENT Body OUTDENT )'</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Parens $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-55\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-55\">&#182;</a>\n              </div>\n              <p>The condition portion of a while loop.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  WhileSource: [\n    o <span class=\"hljs-string\">'WHILE Expression'</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'WHILE Expression WHEN Expression'</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'UNTIL Expression'</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>, invert: <span class=\"hljs-literal\">true</span>\n    o <span class=\"hljs-string\">'UNTIL Expression WHEN Expression'</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>, invert: <span class=\"hljs-literal\">true</span>, guard: $<span class=\"hljs-number\">4</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-56\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-56\">&#182;</a>\n              </div>\n              <p>The while loop can either be normal, with a block of expressions to execute,\nor postfix, with a single expression. There is no do..while.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  While: [\n    o <span class=\"hljs-string\">'WhileSource Block'</span>,                      <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>addBody $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'Statement  WhileSource'</span>,                 <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2.</span>addBody LOC(<span class=\"hljs-number\">1</span>) Block.wrap([$<span class=\"hljs-number\">1</span>])\n    o <span class=\"hljs-string\">'Expression WhileSource'</span>,                 <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2.</span>addBody LOC(<span class=\"hljs-number\">1</span>) Block.wrap([$<span class=\"hljs-number\">1</span>])\n    o <span class=\"hljs-string\">'Loop'</span>,                                   <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1</span>\n  ]\n\n  Loop: [\n    o <span class=\"hljs-string\">'LOOP Block'</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While(LOC(<span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">new</span> BooleanLiteral <span class=\"hljs-string\">'true'</span>).addBody $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'LOOP Expression'</span>,                        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While(LOC(<span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">new</span> BooleanLiteral <span class=\"hljs-string\">'true'</span>).addBody LOC(<span class=\"hljs-number\">2</span>) Block.wrap [$<span class=\"hljs-number\">2</span>]\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-57\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-57\">&#182;</a>\n              </div>\n              <p>Array, object, and range comprehensions, at the most generic level.\nComprehensions can either be normal, with a block of expressions to execute,\nor postfix, with a single expression.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  For: [\n    o <span class=\"hljs-string\">'Statement  ForBody'</span>,                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> For $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'Expression ForBody'</span>,                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> For $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'ForBody    Block'</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> For $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>\n  ]\n\n  ForBody: [\n    o <span class=\"hljs-string\">'FOR Range'</span>,                              <span class=\"hljs-function\">-&gt;</span> source: (LOC(<span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">new</span> Value($<span class=\"hljs-number\">2</span>))\n    o <span class=\"hljs-string\">'FOR Range BY Expression'</span>,                <span class=\"hljs-function\">-&gt;</span> source: (LOC(<span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">new</span> Value($<span class=\"hljs-number\">2</span>)), step: $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'ForStart ForSource'</span>,                     <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2.</span>own = $<span class=\"hljs-number\">1.</span>own; $<span class=\"hljs-number\">2.</span>ownTag = $<span class=\"hljs-number\">1.</span>ownTag; $<span class=\"hljs-number\">2.</span>name = $<span class=\"hljs-number\">1</span>[<span class=\"hljs-number\">0</span>]; $<span class=\"hljs-number\">2.</span>index = $<span class=\"hljs-number\">1</span>[<span class=\"hljs-number\">1</span>]; $<span class=\"hljs-number\">2</span>\n  ]\n\n  ForStart: [\n    o <span class=\"hljs-string\">'FOR ForVariables'</span>,                       <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'FOR OWN ForVariables'</span>,                   <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">3.</span>own = <span class=\"hljs-literal\">yes</span>; $<span class=\"hljs-number\">3.</span>ownTag = (LOC(<span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">new</span> Literal($<span class=\"hljs-number\">2</span>)); $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-58\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-58\">&#182;</a>\n              </div>\n              <p>An array of all accepted values for a variable inside the loop.\nThis enables support for pattern matching.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ForValue: [\n    o <span class=\"hljs-string\">'Identifier'</span>\n    o <span class=\"hljs-string\">'ThisProperty'</span>\n    o <span class=\"hljs-string\">'Array'</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'Object'</span>,                                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-59\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-59\">&#182;</a>\n              </div>\n              <p>An array or range comprehension has variables for the current element\nand (optional) reference to the current index. Or, <em>key, value</em>, in the case\nof object comprehensions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ForVariables: [\n    o <span class=\"hljs-string\">'ForValue'</span>,                               <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">'ForValue , ForValue'</span>,                    <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>]\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-60\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-60\">&#182;</a>\n              </div>\n              <p>The source of a comprehension is an array or object with an optional guard\nclause. If it’s an array comprehension, you can also choose to step through\nin fixed-size increments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ForSource: [\n    o <span class=\"hljs-string\">'FORIN Expression'</span>,                               <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'FOROF Expression'</span>,                               <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, object: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">'FORIN Expression WHEN Expression'</span>,               <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'FOROF Expression WHEN Expression'</span>,               <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, object: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">'FORIN Expression BY Expression'</span>,                 <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'FORIN Expression WHEN Expression BY Expression'</span>, <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, step: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">'FORIN Expression BY Expression WHEN Expression'</span>, <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>, guard: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">'FORFROM Expression'</span>,                             <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, from: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">'FORFROM Expression WHEN Expression'</span>,             <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, from: <span class=\"hljs-literal\">yes</span>\n  ]\n\n  Switch: [\n    o <span class=\"hljs-string\">'SWITCH Expression INDENT Whens OUTDENT'</span>,            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Switch $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">'SWITCH Expression INDENT Whens ELSE Block OUTDENT'</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Switch $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">'SWITCH INDENT Whens OUTDENT'</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Switch <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'SWITCH INDENT Whens ELSE Block OUTDENT'</span>,            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Switch <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">5</span>\n  ]\n\n  Whens: [\n    o <span class=\"hljs-string\">'When'</span>\n    o <span class=\"hljs-string\">'Whens When'</span>,                             <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">2</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-61\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-61\">&#182;</a>\n              </div>\n              <p>An individual <strong>When</strong> clause, with action.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  When: [\n    o <span class=\"hljs-string\">'LEADING_WHEN SimpleArgs Block'</span>,            <span class=\"hljs-function\">-&gt;</span> [[$<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">3</span>]]\n    o <span class=\"hljs-string\">'LEADING_WHEN SimpleArgs Block TERMINATOR'</span>, <span class=\"hljs-function\">-&gt;</span> [[$<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">3</span>]]\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-62\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-62\">&#182;</a>\n              </div>\n              <p>The most basic form of <em>if</em> is a condition and an action. The following\nif-related rules are broken up along these lines in order to avoid\nambiguity.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  IfBlock: [\n    o <span class=\"hljs-string\">'IF Expression Block'</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> If $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">3</span>, type: $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">'IfBlock ELSE IF Expression Block'</span>,       <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>addElse LOC(<span class=\"hljs-number\">3</span>,<span class=\"hljs-number\">5</span>) <span class=\"hljs-keyword\">new</span> If $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">5</span>, type: $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-63\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-63\">&#182;</a>\n              </div>\n              <p>The full complement of <em>if</em> expressions, including postfix one-liner\n<em>if</em> and <em>unless</em>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  If: [\n    o <span class=\"hljs-string\">'IfBlock'</span>\n    o <span class=\"hljs-string\">'IfBlock ELSE Block'</span>,                     <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>addElse $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Statement  POST_IF Expression'</span>,          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> If $<span class=\"hljs-number\">3</span>, LOC(<span class=\"hljs-number\">1</span>)(Block.wrap [$<span class=\"hljs-number\">1</span>]), type: $<span class=\"hljs-number\">2</span>, statement: <span class=\"hljs-literal\">true</span>\n    o <span class=\"hljs-string\">'Expression POST_IF Expression'</span>,          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> If $<span class=\"hljs-number\">3</span>, LOC(<span class=\"hljs-number\">1</span>)(Block.wrap [$<span class=\"hljs-number\">1</span>]), type: $<span class=\"hljs-number\">2</span>, statement: <span class=\"hljs-literal\">true</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-64\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-64\">&#182;</a>\n              </div>\n              <p>Arithmetic and logical operators, working on one or more operands.\nHere they are grouped by order of precedence. The actual precedence rules\nare defined at the bottom of the page. It would be shorter if we could\ncombine most of these rules into a single generic <em>Operand OpSymbol Operand</em>\n-type rule, but in order to make the precedence binding possible, separate\nrules are necessary.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Operation: [\n    o <span class=\"hljs-string\">'UNARY Expression'</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span> , $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'UNARY_MATH Expression'</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span> , $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'-     Expression'</span>,                      (<span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'-'</span>, $<span class=\"hljs-number\">2</span>), prec: <span class=\"hljs-string\">'UNARY_MATH'</span>\n    o <span class=\"hljs-string\">'+     Expression'</span>,                      (<span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'+'</span>, $<span class=\"hljs-number\">2</span>), prec: <span class=\"hljs-string\">'UNARY_MATH'</span>\n\n    o <span class=\"hljs-string\">'-- SimpleAssignable'</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'--'</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'++ SimpleAssignable'</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'++'</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'SimpleAssignable --'</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'--'</span>, $<span class=\"hljs-number\">1</span>, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">true</span>\n    o <span class=\"hljs-string\">'SimpleAssignable ++'</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'++'</span>, $<span class=\"hljs-number\">1</span>, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">true</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-65\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-65\">&#182;</a>\n              </div>\n              <p><a href=\"http://coffeescript.org/#existential-operator\">The existential operator</a>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    o <span class=\"hljs-string\">'Expression ?'</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Existence $<span class=\"hljs-number\">1</span>\n\n    o <span class=\"hljs-string\">'Expression +  Expression'</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'+'</span> , $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Expression -  Expression'</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'-'</span> , $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n\n    o <span class=\"hljs-string\">'Expression MATH     Expression'</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Expression **       Expression'</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Expression SHIFT    Expression'</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Expression COMPARE  Expression'</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Expression &amp;        Expression'</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Expression ^        Expression'</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Expression |        Expression'</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Expression &amp;&amp;       Expression'</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Expression ||       Expression'</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Expression BIN?     Expression'</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">'Expression RELATION Expression'</span>,         <span class=\"hljs-function\">-&gt;</span>\n      <span class=\"hljs-keyword\">if</span> $<span class=\"hljs-number\">2.</span>charAt(<span class=\"hljs-number\">0</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'!'</span>\n        <span class=\"hljs-keyword\">new</span> Op($<span class=\"hljs-number\">2</span>[<span class=\"hljs-number\">1.</span>.], $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>).invert()\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n\n    o <span class=\"hljs-string\">'SimpleAssignable COMPOUND_ASSIGN\n       Expression'</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'SimpleAssignable COMPOUND_ASSIGN\n       INDENT Expression OUTDENT'</span>,              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'SimpleAssignable COMPOUND_ASSIGN TERMINATOR\n       Expression'</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">'SimpleAssignable EXTENDS Expression'</span>,    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Extends $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-66\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-66\">&#182;</a>\n              </div>\n              <h2 id=\"precedence\">Precedence</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-67\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-67\">&#182;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-68\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-68\">&#182;</a>\n              </div>\n              <p>Operators at the top of this list have higher precedence than the ones lower\ndown. Following these rules is what makes <code>2 + 3 * 4</code> parse as:</p>\n<pre><code><span class=\"hljs-number\">2</span> + (<span class=\"hljs-number\">3</span> * <span class=\"hljs-number\">4</span>)\n</code></pre><p>And not:</p>\n<pre><code>(<span class=\"hljs-number\">2</span> + <span class=\"hljs-number\">3</span>) * <span class=\"hljs-number\">4</span>\n</code></pre>\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>operators = [\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'.'</span>, <span class=\"hljs-string\">'?.'</span>, <span class=\"hljs-string\">'::'</span>, <span class=\"hljs-string\">'?::'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'CALL_START'</span>, <span class=\"hljs-string\">'CALL_END'</span>]\n  [<span class=\"hljs-string\">'nonassoc'</span>,  <span class=\"hljs-string\">'++'</span>, <span class=\"hljs-string\">'--'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'?'</span>]\n  [<span class=\"hljs-string\">'right'</span>,     <span class=\"hljs-string\">'UNARY'</span>]\n  [<span class=\"hljs-string\">'right'</span>,     <span class=\"hljs-string\">'**'</span>]\n  [<span class=\"hljs-string\">'right'</span>,     <span class=\"hljs-string\">'UNARY_MATH'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'MATH'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'+'</span>, <span class=\"hljs-string\">'-'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'SHIFT'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'RELATION'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'COMPARE'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'&amp;'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'^'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'|'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'&amp;&amp;'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'||'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'BIN?'</span>]\n  [<span class=\"hljs-string\">'nonassoc'</span>,  <span class=\"hljs-string\">'INDENT'</span>, <span class=\"hljs-string\">'OUTDENT'</span>]\n  [<span class=\"hljs-string\">'right'</span>,     <span class=\"hljs-string\">'YIELD'</span>]\n  [<span class=\"hljs-string\">'right'</span>,     <span class=\"hljs-string\">'='</span>, <span class=\"hljs-string\">':'</span>, <span class=\"hljs-string\">'COMPOUND_ASSIGN'</span>, <span class=\"hljs-string\">'RETURN'</span>, <span class=\"hljs-string\">'THROW'</span>, <span class=\"hljs-string\">'EXTENDS'</span>]\n  [<span class=\"hljs-string\">'right'</span>,     <span class=\"hljs-string\">'FORIN'</span>, <span class=\"hljs-string\">'FOROF'</span>, <span class=\"hljs-string\">'FORFROM'</span>, <span class=\"hljs-string\">'BY'</span>, <span class=\"hljs-string\">'WHEN'</span>]\n  [<span class=\"hljs-string\">'right'</span>,     <span class=\"hljs-string\">'IF'</span>, <span class=\"hljs-string\">'ELSE'</span>, <span class=\"hljs-string\">'FOR'</span>, <span class=\"hljs-string\">'WHILE'</span>, <span class=\"hljs-string\">'UNTIL'</span>, <span class=\"hljs-string\">'LOOP'</span>, <span class=\"hljs-string\">'SUPER'</span>, <span class=\"hljs-string\">'CLASS'</span>, <span class=\"hljs-string\">'IMPORT'</span>, <span class=\"hljs-string\">'EXPORT'</span>]\n  [<span class=\"hljs-string\">'left'</span>,      <span class=\"hljs-string\">'POST_IF'</span>]\n]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-69\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-69\">&#182;</a>\n              </div>\n              <h2 id=\"wrapping-up\">Wrapping Up</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-70\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-70\">&#182;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-71\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-71\">&#182;</a>\n              </div>\n              <p>Finally, now that we have our <strong>grammar</strong> and our <strong>operators</strong>, we can create\nour <strong>Jison.Parser</strong>. We do this by processing all of our rules, recording all\nterminals (every symbol which does not appear as the name of a rule above)\nas “tokens”.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>tokens = []\n<span class=\"hljs-keyword\">for</span> name, alternatives <span class=\"hljs-keyword\">of</span> grammar\n  grammar[name] = <span class=\"hljs-keyword\">for</span> alt <span class=\"hljs-keyword\">in</span> alternatives\n    <span class=\"hljs-keyword\">for</span> token <span class=\"hljs-keyword\">in</span> alt[<span class=\"hljs-number\">0</span>].split <span class=\"hljs-string\">' '</span>\n      tokens.push token <span class=\"hljs-keyword\">unless</span> grammar[token]\n    alt[<span class=\"hljs-number\">1</span>] = <span class=\"hljs-string\">\"return <span class=\"hljs-subst\">#{alt[<span class=\"hljs-number\">1</span>]}</span>\"</span> <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'Root'</span>\n    alt</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-72\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-72\">&#182;</a>\n              </div>\n              <p>Initialize the <strong>Parser</strong> with our list of terminal <strong>tokens</strong>, our <strong>grammar</strong>\nrules, and the name of the root. Reverse the operators because Jison orders\nprecedence from low to high, and we have it high to low\n(as in <a href=\"http://dinosaur.compilertools.net/yacc/index.html\">Yacc</a>).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.parser = <span class=\"hljs-keyword\">new</span> Parser\n  tokens      : tokens.join <span class=\"hljs-string\">' '</span>\n  bnf         : grammar\n  operators   : operators.reverse()\n  startSymbol : <span class=\"hljs-string\">'Root'</span></pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/helpers.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>helpers.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>helpers.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              <p>This file contains the common helper functions that we’d like to share among\nthe <strong>Lexer</strong>, <strong>Rewriter</strong>, and the <strong>Nodes</strong>. Merge objects, flatten\narrays, count characters, that sort of thing.</p>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Peek at the beginning of a given string to see if it matches a sequence.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.starts = <span class=\"hljs-function\"><span class=\"hljs-params\">(string, literal, start)</span> -&gt;</span>\n  literal <span class=\"hljs-keyword\">is</span> string.substr start, literal.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Peek at the end of a given string to see if it matches a sequence.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.ends = <span class=\"hljs-function\"><span class=\"hljs-params\">(string, literal, back)</span> -&gt;</span>\n  len = literal.length\n  literal <span class=\"hljs-keyword\">is</span> string.substr string.length - len - (back <span class=\"hljs-keyword\">or</span> <span class=\"hljs-number\">0</span>), len</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Repeat a string <code>n</code> times.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.repeat = repeat = <span class=\"hljs-function\"><span class=\"hljs-params\">(str, n)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Use clever algorithm to have O(log(n)) string concatenation operations.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  res = <span class=\"hljs-string\">''</span>\n  <span class=\"hljs-keyword\">while</span> n &gt; <span class=\"hljs-number\">0</span>\n    res += str <span class=\"hljs-keyword\">if</span> n &amp; <span class=\"hljs-number\">1</span>\n    n &gt;&gt;&gt;= <span class=\"hljs-number\">1</span>\n    str += str\n  res</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Trim out all falsy values from an array.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.compact = <span class=\"hljs-function\"><span class=\"hljs-params\">(array)</span> -&gt;</span>\n  item <span class=\"hljs-keyword\">for</span> item <span class=\"hljs-keyword\">in</span> array <span class=\"hljs-keyword\">when</span> item</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Count the number of occurrences of a string in a string.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.count = <span class=\"hljs-function\"><span class=\"hljs-params\">(string, substr)</span> -&gt;</span>\n  num = pos = <span class=\"hljs-number\">0</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span>/<span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> substr.length\n  num++ <span class=\"hljs-keyword\">while</span> pos = <span class=\"hljs-number\">1</span> + string.indexOf substr, pos\n  num</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Merge objects, returning a fresh copy with attributes from both sides.\nUsed every time <code>Base#compile</code> is called, to allow properties in the\noptions hash to propagate down the tree without polluting other branches.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.merge = <span class=\"hljs-function\"><span class=\"hljs-params\">(options, overrides)</span> -&gt;</span>\n  extend (extend {}, options), overrides</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Extend a source object with the properties of another object (shallow copy).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>extend = exports.extend = <span class=\"hljs-function\"><span class=\"hljs-params\">(object, properties)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">for</span> key, val <span class=\"hljs-keyword\">of</span> properties\n    object[key] = val\n  object</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>Return a flattened version of an array.\nHandy for getting a list of <code>children</code> from the nodes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.flatten = flatten = <span class=\"hljs-function\"><span class=\"hljs-params\">(array)</span> -&gt;</span>\n  flattened = []\n  <span class=\"hljs-keyword\">for</span> element <span class=\"hljs-keyword\">in</span> array\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">'[object Array]'</span> <span class=\"hljs-keyword\">is</span> Object::toString.call element\n      flattened = flattened.concat flatten element\n    <span class=\"hljs-keyword\">else</span>\n      flattened.push element\n  flattened</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Delete a key from an object, returning the value. Useful when a node is\nlooking for a particular method in an options hash.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.del = <span class=\"hljs-function\"><span class=\"hljs-params\">(obj, key)</span> -&gt;</span>\n  val =  obj[key]\n  <span class=\"hljs-keyword\">delete</span> obj[key]\n  val</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>Typical Array::some</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.some = Array::some ? (fn) -&gt;\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">for</span> e <span class=\"hljs-keyword\">in</span> <span class=\"hljs-keyword\">this</span> <span class=\"hljs-keyword\">when</span> fn e\n  <span class=\"hljs-literal\">false</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Simple function for inverting Literate CoffeeScript code by putting the\ndocumentation in comments, producing a string of CoffeeScript code that\ncan be compiled “normally”.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.invertLiterate = <span class=\"hljs-function\"><span class=\"hljs-params\">(code)</span> -&gt;</span>\n  maybe_code = <span class=\"hljs-literal\">true</span>\n  lines = <span class=\"hljs-keyword\">for</span> line <span class=\"hljs-keyword\">in</span> code.split(<span class=\"hljs-string\">'\\n'</span>)\n    <span class=\"hljs-keyword\">if</span> maybe_code <span class=\"hljs-keyword\">and</span> <span class=\"hljs-regexp\">/^([ ]{4}|[ ]{0,3}\\t)/</span>.test line\n      line\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> maybe_code = <span class=\"hljs-regexp\">/^\\s*$/</span>.test line\n      line\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">'# '</span> + line\n  lines.join <span class=\"hljs-string\">'\\n'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>Merge two jison-style location data objects together.\nIf <code>last</code> is not provided, this will simply return <code>first</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">buildLocationData</span> = <span class=\"hljs-params\">(first, last)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> last\n    first\n  <span class=\"hljs-keyword\">else</span>\n    first_line: first.first_line\n    first_column: first.first_column\n    last_line: last.last_line\n    last_column: last.last_column</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>This returns a function which takes an object as a parameter, and if that\nobject is an AST node, updates that object’s locationData.\nThe object is returned either way.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.addLocationDataFn = <span class=\"hljs-function\"><span class=\"hljs-params\">(first, last)</span> -&gt;</span>\n  (obj) -&gt;\n    <span class=\"hljs-keyword\">if</span> ((<span class=\"hljs-keyword\">typeof</span> obj) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'object'</span>) <span class=\"hljs-keyword\">and</span> (!!obj[<span class=\"hljs-string\">'updateLocationDataIfMissing'</span>])\n      obj.updateLocationDataIfMissing buildLocationData(first, last)\n\n    <span class=\"hljs-keyword\">return</span> obj</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>Convert jison location data to a string.\n<code>obj</code> can be a token, or a locationData.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.locationDataToString = <span class=\"hljs-function\"><span class=\"hljs-params\">(obj)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">\"2\"</span> <span class=\"hljs-keyword\">of</span> obj) <span class=\"hljs-keyword\">and</span> (<span class=\"hljs-string\">\"first_line\"</span> <span class=\"hljs-keyword\">of</span> obj[<span class=\"hljs-number\">2</span>]) <span class=\"hljs-keyword\">then</span> locationData = obj[<span class=\"hljs-number\">2</span>]\n  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">\"first_line\"</span> <span class=\"hljs-keyword\">of</span> obj <span class=\"hljs-keyword\">then</span> locationData = obj\n\n  <span class=\"hljs-keyword\">if</span> locationData\n    <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{locationData.first_line + <span class=\"hljs-number\">1</span>}</span>:<span class=\"hljs-subst\">#{locationData.first_column + <span class=\"hljs-number\">1</span>}</span>-\"</span> +\n    <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{locationData.last_line + <span class=\"hljs-number\">1</span>}</span>:<span class=\"hljs-subst\">#{locationData.last_column + <span class=\"hljs-number\">1</span>}</span>\"</span>\n  <span class=\"hljs-keyword\">else</span>\n    <span class=\"hljs-string\">\"No location data\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>A <code>.coffee.md</code> compatible version of <code>basename</code>, that returns the file sans-extension.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.baseFileName = <span class=\"hljs-function\"><span class=\"hljs-params\">(file, stripExt = <span class=\"hljs-literal\">no</span>, useWinPathSep = <span class=\"hljs-literal\">no</span>)</span> -&gt;</span>\n  pathSep = <span class=\"hljs-keyword\">if</span> useWinPathSep <span class=\"hljs-keyword\">then</span> <span class=\"hljs-regexp\">/\\\\|\\//</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-regexp\">/\\//</span>\n  parts = file.split(pathSep)\n  file = parts[parts.length - <span class=\"hljs-number\">1</span>]\n  <span class=\"hljs-keyword\">return</span> file <span class=\"hljs-keyword\">unless</span> stripExt <span class=\"hljs-keyword\">and</span> file.indexOf(<span class=\"hljs-string\">'.'</span>) &gt;= <span class=\"hljs-number\">0</span>\n  parts = file.split(<span class=\"hljs-string\">'.'</span>)\n  parts.pop()\n  parts.pop() <span class=\"hljs-keyword\">if</span> parts[parts.length - <span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'coffee'</span> <span class=\"hljs-keyword\">and</span> parts.length &gt; <span class=\"hljs-number\">1</span>\n  parts.join(<span class=\"hljs-string\">'.'</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>Determine if a filename represents a CoffeeScript file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.isCoffee = <span class=\"hljs-function\"><span class=\"hljs-params\">(file)</span> -&gt;</span> <span class=\"hljs-regexp\">/\\.((lit)?coffee|coffee\\.md)$/</span>.test file</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>Determine if a filename represents a Literate CoffeeScript file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.isLiterate = <span class=\"hljs-function\"><span class=\"hljs-params\">(file)</span> -&gt;</span> <span class=\"hljs-regexp\">/\\.(litcoffee|coffee\\.md)$/</span>.test file</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <p>Throws a SyntaxError from a given location.\nThe error’s <code>toString</code> will return an error message following the “standard”\nformat <code>&lt;filename&gt;:&lt;line&gt;:&lt;col&gt;: &lt;message&gt;</code> plus the line with the error and a\nmarker showing where the error is.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.throwSyntaxError = <span class=\"hljs-function\"><span class=\"hljs-params\">(message, location)</span> -&gt;</span>\n  error = <span class=\"hljs-keyword\">new</span> SyntaxError message\n  error.location = location\n  error.toString = syntaxErrorToString</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>\n              </div>\n              <p>Instead of showing the compiler’s stacktrace, show our custom error message\n(this is useful when the error bubbles up in Node.js applications that\ncompile CoffeeScript for example).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  error.stack = error.toString()\n\n  <span class=\"hljs-keyword\">throw</span> error</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>\n              </div>\n              <p>Update a compiler SyntaxError with source code information if it didn’t have\nit already.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.updateSyntaxError = <span class=\"hljs-function\"><span class=\"hljs-params\">(error, code, filename)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-23\">&#182;</a>\n              </div>\n              <p>Avoid screwing up the <code>stack</code> property of other errors (i.e. possible bugs).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">if</span> error.toString <span class=\"hljs-keyword\">is</span> syntaxErrorToString\n    error.code <span class=\"hljs-keyword\">or</span>= code\n    error.filename <span class=\"hljs-keyword\">or</span>= filename\n    error.stack = error.toString()\n  error\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">syntaxErrorToString</span> = -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> Error::toString.call @ <span class=\"hljs-keyword\">unless</span> @code <span class=\"hljs-keyword\">and</span> @location\n\n  {first_line, first_column, last_line, last_column} = @location\n  last_line ?= first_line\n  last_column ?= first_column\n\n  filename = @filename <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">'[stdin]'</span>\n  codeLine = @code.split(<span class=\"hljs-string\">'\\n'</span>)[first_line]\n  start    = first_column</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-24\">&#182;</a>\n              </div>\n              <p>Show only the first line on multi-line errors.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  end      = <span class=\"hljs-keyword\">if</span> first_line <span class=\"hljs-keyword\">is</span> last_line <span class=\"hljs-keyword\">then</span> last_column + <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> codeLine.length\n  marker   = codeLine[...start].replace(<span class=\"hljs-regexp\">/[^\\s]/g</span>, <span class=\"hljs-string\">' '</span>) + repeat(<span class=\"hljs-string\">'^'</span>, end - start)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-25\">&#182;</a>\n              </div>\n              <p>Check to see if we’re running on a color-enabled TTY.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">if</span> process?\n    colorsEnabled = process.stdout?.isTTY <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> process.env?.NODE_DISABLE_COLORS\n\n  <span class=\"hljs-keyword\">if</span> @colorful ? colorsEnabled\n<span class=\"hljs-function\">    <span class=\"hljs-title\">colorize</span> = <span class=\"hljs-params\">(str)</span> -&gt;</span> <span class=\"hljs-string\">\"\\x1B[1;31m<span class=\"hljs-subst\">#{str}</span>\\x1B[0m\"</span>\n    codeLine = codeLine[...start] + colorize(codeLine[start...end]) + codeLine[end..]\n    marker   = colorize marker\n\n  <span class=\"hljs-string\">\"\"\"\n    <span class=\"hljs-subst\">#{filename}</span>:<span class=\"hljs-subst\">#{first_line + <span class=\"hljs-number\">1</span>}</span>:<span class=\"hljs-subst\">#{first_column + <span class=\"hljs-number\">1</span>}</span>: error: <span class=\"hljs-subst\">#{@message}</span>\n    <span class=\"hljs-subst\">#{codeLine}</span>\n    <span class=\"hljs-subst\">#{marker}</span>\n  \"\"\"</span>\n\nexports.nameWhitespaceCharacter = <span class=\"hljs-function\"><span class=\"hljs-params\">(string)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">switch</span> string\n    <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">' '</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'space'</span>\n    <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'\\n'</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'newline'</span>\n    <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'\\r'</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'carriage return'</span>\n    <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'\\t'</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'tab'</span>\n    <span class=\"hljs-keyword\">else</span> string</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/index.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>index.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>index.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              <p>Loader for CoffeeScript as a Node.js library.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports[key] = val <span class=\"hljs-keyword\">for</span> key, val <span class=\"hljs-keyword\">of</span> <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./coffee-script'</span></pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/lexer.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>lexer.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>lexer.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              <p>The CoffeeScript Lexer. Uses a series of token-matching regexes to attempt\nmatches against the beginning of the source code. When a match is found,\na token is produced, we consume the match, and start again. Tokens are in the\nform:</p>\n<pre><code>[tag, value, locationData]\n</code></pre><p>where locationData is {first_line, first_column, last_line, last_column}, which is a\nformat that can be fed directly into <a href=\"https://github.com/zaach/jison\">Jison</a>.  These\nare read by jison in the <code>parser.lexer</code> function defined in coffee-script.coffee.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n{Rewriter, INVERSES} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./rewriter'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Import the helpers we need.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>{count, starts, compact, repeat, invertLiterate,\nlocationDataToString,  throwSyntaxError} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./helpers'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <h2 id=\"the-lexer-class\">The Lexer Class</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>The Lexer class reads a stream of CoffeeScript and divvies it up into tagged\ntokens. Some potential ambiguity in the grammar has been avoided by\npushing some extra smarts into the Lexer.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Lexer = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Lexer</span></span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p><strong>tokenize</strong> is the Lexer’s main method. Scan by attempting to match tokens\none at a time, using a regular expression anchored at the start of the\nremaining code, or a custom recursive token-matching method\n(for interpolations). When the next token has been recorded, we move forward\nwithin the code past the token, and begin again.</p>\n<p>Each tokenizing method is responsible for returning the number of characters\nit has consumed.</p>\n<p>Before returning the token stream, run it through the <a href=\"rewriter.html\">Rewriter</a>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  tokenize: <span class=\"hljs-function\"><span class=\"hljs-params\">(code, opts = {})</span> -&gt;</span>\n    @literate   = opts.literate  <span class=\"hljs-comment\"># Are we lexing literate CoffeeScript?</span>\n    @indent     = <span class=\"hljs-number\">0</span>              <span class=\"hljs-comment\"># The current indentation level.</span>\n    @baseIndent = <span class=\"hljs-number\">0</span>              <span class=\"hljs-comment\"># The overall minimum indentation level</span>\n    @indebt     = <span class=\"hljs-number\">0</span>              <span class=\"hljs-comment\"># The over-indentation at the current level.</span>\n    @outdebt    = <span class=\"hljs-number\">0</span>              <span class=\"hljs-comment\"># The under-outdentation at the current level.</span>\n    @indents    = []             <span class=\"hljs-comment\"># The stack of all current indentation levels.</span>\n    @ends       = []             <span class=\"hljs-comment\"># The stack for pairing up tokens.</span>\n    @tokens     = []             <span class=\"hljs-comment\"># Stream of parsed tokens in the form `['TYPE', value, location data]`.</span>\n    @seenFor    = <span class=\"hljs-literal\">no</span>             <span class=\"hljs-comment\"># Used to recognize FORIN, FOROF and FORFROM tokens.</span>\n    @seenImport = <span class=\"hljs-literal\">no</span>             <span class=\"hljs-comment\"># Used to recognize IMPORT FROM? AS? tokens.</span>\n    @seenExport = <span class=\"hljs-literal\">no</span>             <span class=\"hljs-comment\"># Used to recognize EXPORT FROM? AS? tokens.</span>\n    @importSpecifierList = <span class=\"hljs-literal\">no</span>    <span class=\"hljs-comment\"># Used to identify when in an IMPORT {...} FROM? ...</span>\n    @exportSpecifierList = <span class=\"hljs-literal\">no</span>    <span class=\"hljs-comment\"># Used to identify when in an EXPORT {...} FROM? ...</span>\n\n    @chunkLine =\n      opts.line <span class=\"hljs-keyword\">or</span> <span class=\"hljs-number\">0</span>             <span class=\"hljs-comment\"># The start line for the current @chunk.</span>\n    @chunkColumn =\n      opts.column <span class=\"hljs-keyword\">or</span> <span class=\"hljs-number\">0</span>           <span class=\"hljs-comment\"># The start column of the current @chunk.</span>\n    code = @clean code           <span class=\"hljs-comment\"># The stripped, cleaned original source code.</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>At every position, run through this list of attempted matches,\nshort-circuiting if any of them succeed. Their order determines precedence:\n<code>@literalToken</code> is the fallback catch-all.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    i = <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">while</span> @chunk = code[i..]\n      consumed = \\\n           @identifierToken() <span class=\"hljs-keyword\">or</span>\n           @commentToken()    <span class=\"hljs-keyword\">or</span>\n           @whitespaceToken() <span class=\"hljs-keyword\">or</span>\n           @lineToken()       <span class=\"hljs-keyword\">or</span>\n           @stringToken()     <span class=\"hljs-keyword\">or</span>\n           @numberToken()     <span class=\"hljs-keyword\">or</span>\n           @regexToken()      <span class=\"hljs-keyword\">or</span>\n           @jsToken()         <span class=\"hljs-keyword\">or</span>\n           @literalToken()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Update position</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      [@chunkLine, @chunkColumn] = @getLineAndColumnFromChunk consumed\n\n      i += consumed\n\n      <span class=\"hljs-keyword\">return</span> {@tokens, index: i} <span class=\"hljs-keyword\">if</span> opts.untilBalanced <span class=\"hljs-keyword\">and</span> @ends.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n\n    @closeIndentation()\n    @error <span class=\"hljs-string\">\"missing <span class=\"hljs-subst\">#{end.tag}</span>\"</span>, end.origin[<span class=\"hljs-number\">2</span>] <span class=\"hljs-keyword\">if</span> end = @ends.pop()\n    <span class=\"hljs-keyword\">return</span> @tokens <span class=\"hljs-keyword\">if</span> opts.rewrite <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">off</span>\n    (<span class=\"hljs-keyword\">new</span> Rewriter).rewrite @tokens</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Preprocess the code to remove leading and trailing whitespace, carriage\nreturns, etc. If we’re lexing literate CoffeeScript, strip external Markdown\nby removing all lines that aren’t indented by at least four spaces or a tab.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  clean: <span class=\"hljs-function\"><span class=\"hljs-params\">(code)</span> -&gt;</span>\n    code = code.slice(<span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">if</span> code.charCodeAt(<span class=\"hljs-number\">0</span>) <span class=\"hljs-keyword\">is</span> BOM\n    code = code.replace(<span class=\"hljs-regexp\">/\\r/g</span>, <span class=\"hljs-string\">''</span>).replace TRAILING_SPACES, <span class=\"hljs-string\">''</span>\n    <span class=\"hljs-keyword\">if</span> WHITESPACE.test code\n      code = <span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{code}</span>\"</span>\n      @chunkLine--\n    code = invertLiterate code <span class=\"hljs-keyword\">if</span> @literate\n    code</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <h2 id=\"tokenizers\">Tokenizers</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>Matches identifying literals: variables, keywords, method names, etc.\nCheck to ensure that JavaScript reserved words aren’t being used as\nidentifiers. Because CoffeeScript reserves a handful of keywords that are\nallowed in JavaScript, we’re careful not to tag them as keywords when\nreferenced as property names here, so you can still do <code>jQuery.is()</code> even\nthough <code>is</code> means <code>===</code> otherwise.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  identifierToken: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> match = IDENTIFIER.exec @chunk\n    [input, id, colon] = match</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Preserve length of id for location data</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    idLength = id.length\n    poppedToken = <span class=\"hljs-literal\">undefined</span>\n\n    <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'own'</span> <span class=\"hljs-keyword\">and</span> @tag() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'FOR'</span>\n      @token <span class=\"hljs-string\">'OWN'</span>, id\n      <span class=\"hljs-keyword\">return</span> id.length\n    <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'from'</span> <span class=\"hljs-keyword\">and</span> @tag() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'YIELD'</span>\n      @token <span class=\"hljs-string\">'FROM'</span>, id\n      <span class=\"hljs-keyword\">return</span> id.length\n    <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'as'</span> <span class=\"hljs-keyword\">and</span> @seenImport\n      <span class=\"hljs-keyword\">if</span> @value() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'*'</span>\n        @tokens[@tokens.length - <span class=\"hljs-number\">1</span>][<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'IMPORT_ALL'</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @value() <span class=\"hljs-keyword\">in</span> COFFEE_KEYWORDS\n        @tokens[@tokens.length - <span class=\"hljs-number\">1</span>][<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'IDENTIFIER'</span>\n      <span class=\"hljs-keyword\">if</span> @tag() <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'DEFAULT'</span>, <span class=\"hljs-string\">'IMPORT_ALL'</span>, <span class=\"hljs-string\">'IDENTIFIER'</span>]\n        @token <span class=\"hljs-string\">'AS'</span>, id\n        <span class=\"hljs-keyword\">return</span> id.length\n    <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'as'</span> <span class=\"hljs-keyword\">and</span> @seenExport <span class=\"hljs-keyword\">and</span> @tag() <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'IDENTIFIER'</span>, <span class=\"hljs-string\">'DEFAULT'</span>]\n      @token <span class=\"hljs-string\">'AS'</span>, id\n      <span class=\"hljs-keyword\">return</span> id.length\n    <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'default'</span> <span class=\"hljs-keyword\">and</span> @seenExport <span class=\"hljs-keyword\">and</span> @tag() <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'EXPORT'</span>, <span class=\"hljs-string\">'AS'</span>]\n      @token <span class=\"hljs-string\">'DEFAULT'</span>, id\n      <span class=\"hljs-keyword\">return</span> id.length\n\n    [..., prev] = @tokens\n\n    tag =\n      <span class=\"hljs-keyword\">if</span> colon <span class=\"hljs-keyword\">or</span> prev? <span class=\"hljs-keyword\">and</span>\n         (prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'.'</span>, <span class=\"hljs-string\">'?.'</span>, <span class=\"hljs-string\">'::'</span>, <span class=\"hljs-string\">'?::'</span>] <span class=\"hljs-keyword\">or</span>\n         <span class=\"hljs-keyword\">not</span> prev.spaced <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'@'</span>)\n        <span class=\"hljs-string\">'PROPERTY'</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">'IDENTIFIER'</span>\n\n    <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'IDENTIFIER'</span> <span class=\"hljs-keyword\">and</span> (id <span class=\"hljs-keyword\">in</span> JS_KEYWORDS <span class=\"hljs-keyword\">or</span> id <span class=\"hljs-keyword\">in</span> COFFEE_KEYWORDS) <span class=\"hljs-keyword\">and</span>\n       <span class=\"hljs-keyword\">not</span> (@exportSpecifierList <span class=\"hljs-keyword\">and</span> id <span class=\"hljs-keyword\">in</span> COFFEE_KEYWORDS)\n      tag = id.toUpperCase()\n      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'WHEN'</span> <span class=\"hljs-keyword\">and</span> @tag() <span class=\"hljs-keyword\">in</span> LINE_BREAK\n        tag = <span class=\"hljs-string\">'LEADING_WHEN'</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'FOR'</span>\n        @seenFor = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'UNLESS'</span>\n        tag = <span class=\"hljs-string\">'IF'</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'IMPORT'</span>\n        @seenImport = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'EXPORT'</span>\n        @seenExport = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> UNARY\n        tag = <span class=\"hljs-string\">'UNARY'</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> RELATION\n        <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'INSTANCEOF'</span> <span class=\"hljs-keyword\">and</span> @seenFor\n          tag = <span class=\"hljs-string\">'FOR'</span> + tag\n          @seenFor = <span class=\"hljs-literal\">no</span>\n        <span class=\"hljs-keyword\">else</span>\n          tag = <span class=\"hljs-string\">'RELATION'</span>\n          <span class=\"hljs-keyword\">if</span> @value() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'!'</span>\n            poppedToken = @tokens.pop()\n            id = <span class=\"hljs-string\">'!'</span> + id\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'IDENTIFIER'</span> <span class=\"hljs-keyword\">and</span> @seenFor <span class=\"hljs-keyword\">and</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'from'</span> <span class=\"hljs-keyword\">and</span>\n       isForFrom(prev)\n      tag = <span class=\"hljs-string\">'FORFROM'</span>\n      @seenFor = <span class=\"hljs-literal\">no</span>\n\n    <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'IDENTIFIER'</span> <span class=\"hljs-keyword\">and</span> id <span class=\"hljs-keyword\">in</span> RESERVED\n      @error <span class=\"hljs-string\">\"reserved word '<span class=\"hljs-subst\">#{id}</span>'\"</span>, length: id.length\n\n    <span class=\"hljs-keyword\">unless</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'PROPERTY'</span>\n      <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">in</span> COFFEE_ALIASES\n        alias = id\n        id = COFFEE_ALIAS_MAP[id]\n      tag = <span class=\"hljs-keyword\">switch</span> id\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'!'</span>                 <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'UNARY'</span>\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'=='</span>, <span class=\"hljs-string\">'!='</span>          <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'COMPARE'</span>\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'true'</span>, <span class=\"hljs-string\">'false'</span>     <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'BOOL'</span>\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'break'</span>, <span class=\"hljs-string\">'continue'</span>, \\\n             <span class=\"hljs-string\">'debugger'</span>          <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'STATEMENT'</span>\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'&amp;&amp;'</span>, <span class=\"hljs-string\">'||'</span>          <span class=\"hljs-keyword\">then</span> id\n        <span class=\"hljs-keyword\">else</span>  tag\n\n    tagToken = @token tag, id, <span class=\"hljs-number\">0</span>, idLength\n    tagToken.origin = [tag, alias, tagToken[<span class=\"hljs-number\">2</span>]] <span class=\"hljs-keyword\">if</span> alias\n    <span class=\"hljs-keyword\">if</span> poppedToken\n      [tagToken[<span class=\"hljs-number\">2</span>].first_line, tagToken[<span class=\"hljs-number\">2</span>].first_column] =\n        [poppedToken[<span class=\"hljs-number\">2</span>].first_line, poppedToken[<span class=\"hljs-number\">2</span>].first_column]\n    <span class=\"hljs-keyword\">if</span> colon\n      colonOffset = input.lastIndexOf <span class=\"hljs-string\">':'</span>\n      @token <span class=\"hljs-string\">':'</span>, <span class=\"hljs-string\">':'</span>, colonOffset, colon.length\n\n    input.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>Matches numbers, including decimals, hex, and exponential notation.\nBe careful not to interfere with ranges-in-progress.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  numberToken: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> match = NUMBER.exec @chunk\n\n    number = match[<span class=\"hljs-number\">0</span>]\n    lexedLength = number.length\n\n    <span class=\"hljs-keyword\">switch</span>\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-regexp\">/^0[BOX]/</span>.test number\n        @error <span class=\"hljs-string\">\"radix prefix in '<span class=\"hljs-subst\">#{number}</span>' must be lowercase\"</span>, offset: <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-regexp\">/^(?!0x).*E/</span>.test number\n        @error <span class=\"hljs-string\">\"exponential notation in '<span class=\"hljs-subst\">#{number}</span>' must be indicated with a lowercase 'e'\"</span>,\n          offset: number.indexOf(<span class=\"hljs-string\">'E'</span>)\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-regexp\">/^0\\d*[89]/</span>.test number\n        @error <span class=\"hljs-string\">\"decimal literal '<span class=\"hljs-subst\">#{number}</span>' must not be prefixed with '0'\"</span>, length: lexedLength\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-regexp\">/^0\\d+/</span>.test number\n        @error <span class=\"hljs-string\">\"octal literal '<span class=\"hljs-subst\">#{number}</span>' must be prefixed with '0o'\"</span>, length: lexedLength\n\n    base = <span class=\"hljs-keyword\">switch</span> number.charAt <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'b'</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-number\">2</span>\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'o'</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-number\">8</span>\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'x'</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-number\">16</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-literal\">null</span>\n    numberValue = <span class=\"hljs-keyword\">if</span> base? <span class=\"hljs-keyword\">then</span> parseInt(number[<span class=\"hljs-number\">2.</span>.], base) <span class=\"hljs-keyword\">else</span> parseFloat(number)\n    <span class=\"hljs-keyword\">if</span> number.charAt(<span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'b'</span>, <span class=\"hljs-string\">'o'</span>]\n      number = <span class=\"hljs-string\">\"0x<span class=\"hljs-subst\">#{numberValue.toString <span class=\"hljs-number\">16</span>}</span>\"</span>\n\n    tag = <span class=\"hljs-keyword\">if</span> numberValue <span class=\"hljs-keyword\">is</span> Infinity <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'INFINITY'</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">'NUMBER'</span>\n    @token tag, number, <span class=\"hljs-number\">0</span>, lexedLength\n    lexedLength</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>Matches strings, including multi-line strings, as well as heredocs, with or without\ninterpolation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  stringToken: <span class=\"hljs-function\">-&gt;</span>\n    [quote] = STRING_START.exec(@chunk) || []\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> quote</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>If the preceding token is <code>from</code> and this is an import or export statement,\nproperly tag the <code>from</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> @tokens.length <span class=\"hljs-keyword\">and</span> @value() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'from'</span> <span class=\"hljs-keyword\">and</span> (@seenImport <span class=\"hljs-keyword\">or</span> @seenExport)\n      @tokens[@tokens.length - <span class=\"hljs-number\">1</span>][<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'FROM'</span>\n\n    regex = <span class=\"hljs-keyword\">switch</span> quote\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">\"'\"</span>   <span class=\"hljs-keyword\">then</span> STRING_SINGLE\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'\"'</span>   <span class=\"hljs-keyword\">then</span> STRING_DOUBLE\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">\"'''\"</span> <span class=\"hljs-keyword\">then</span> HEREDOC_SINGLE\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'\"\"\"'</span> <span class=\"hljs-keyword\">then</span> HEREDOC_DOUBLE\n    heredoc = quote.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">3</span>\n\n    {tokens, index: end} = @matchWithInterpolations regex, quote\n    $ = tokens.length - <span class=\"hljs-number\">1</span>\n\n    delimiter = quote.charAt(<span class=\"hljs-number\">0</span>)\n    <span class=\"hljs-keyword\">if</span> heredoc</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>Find the smallest indentation. It will be removed from all lines later.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      indent = <span class=\"hljs-literal\">null</span>\n      doc = (token[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">for</span> token, i <span class=\"hljs-keyword\">in</span> tokens <span class=\"hljs-keyword\">when</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'NEOSTRING'</span>).join <span class=\"hljs-string\">'#{}'</span>\n      <span class=\"hljs-keyword\">while</span> match = HEREDOC_INDENT.exec doc\n        attempt = match[<span class=\"hljs-number\">1</span>]\n        indent = attempt <span class=\"hljs-keyword\">if</span> indent <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">null</span> <span class=\"hljs-keyword\">or</span> <span class=\"hljs-number\">0</span> &lt; attempt.length &lt; indent.length\n      indentRegex = <span class=\"hljs-regexp\">/// \\n<span class=\"hljs-subst\">#{indent}</span> ///</span>g <span class=\"hljs-keyword\">if</span> indent\n      @mergeInterpolationTokens tokens, {delimiter}, <span class=\"hljs-function\"><span class=\"hljs-params\">(value, i)</span> =&gt;</span>\n        value = @formatString value, delimiter: quote\n        value = value.replace indentRegex, <span class=\"hljs-string\">'\\n'</span> <span class=\"hljs-keyword\">if</span> indentRegex\n        value = value.replace LEADING_BLANK_LINE,  <span class=\"hljs-string\">''</span> <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n        value = value.replace TRAILING_BLANK_LINE, <span class=\"hljs-string\">''</span> <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">is</span> $\n        value\n    <span class=\"hljs-keyword\">else</span>\n      @mergeInterpolationTokens tokens, {delimiter}, <span class=\"hljs-function\"><span class=\"hljs-params\">(value, i)</span> =&gt;</span>\n        value = @formatString value, delimiter: quote\n        value = value.replace SIMPLE_STRING_OMIT, <span class=\"hljs-function\"><span class=\"hljs-params\">(match, offset)</span> -&gt;</span>\n          <span class=\"hljs-keyword\">if</span> (i <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> offset <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>) <span class=\"hljs-keyword\">or</span>\n             (i <span class=\"hljs-keyword\">is</span> $ <span class=\"hljs-keyword\">and</span> offset + match.length <span class=\"hljs-keyword\">is</span> value.length)\n            <span class=\"hljs-string\">''</span>\n          <span class=\"hljs-keyword\">else</span>\n            <span class=\"hljs-string\">' '</span>\n        value\n\n    end</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>Matches and consumes comments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  commentToken: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> match = @chunk.match COMMENT\n    [comment, here] = match\n    <span class=\"hljs-keyword\">if</span> here\n      <span class=\"hljs-keyword\">if</span> match = HERECOMMENT_ILLEGAL.exec comment\n        @error <span class=\"hljs-string\">\"block comments cannot contain <span class=\"hljs-subst\">#{match[<span class=\"hljs-number\">0</span>]}</span>\"</span>,\n          offset: match.index, length: match[<span class=\"hljs-number\">0</span>].length\n      <span class=\"hljs-keyword\">if</span> here.indexOf(<span class=\"hljs-string\">'\\n'</span>) &gt;= <span class=\"hljs-number\">0</span>\n        here = here.replace <span class=\"hljs-regexp\">/// \\n <span class=\"hljs-subst\">#{repeat <span class=\"hljs-string\">' '</span>, @indent}</span> ///</span>g, <span class=\"hljs-string\">'\\n'</span>\n      @token <span class=\"hljs-string\">'HERECOMMENT'</span>, here, <span class=\"hljs-number\">0</span>, comment.length\n    comment.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>Matches JavaScript interpolated directly into the source via backticks.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  jsToken: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> @chunk.charAt(<span class=\"hljs-number\">0</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'`'</span> <span class=\"hljs-keyword\">and</span>\n      (match = HERE_JSTOKEN.exec(@chunk) <span class=\"hljs-keyword\">or</span> JSTOKEN.exec(@chunk))</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <p>Convert escaped backticks to backticks, and escaped backslashes\njust before escaped backticks to backslashes</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    script = match[<span class=\"hljs-number\">1</span>].replace <span class=\"hljs-regexp\">/\\\\+(`|$)/g</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(string)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>\n              </div>\n              <p><code>string</code> is always a value like ‘`‘, ‘\\`‘, ‘\\\\`‘, etc.\nBy reducing it to its latter half, we turn ‘`‘ to ‘<code>&#39;, &#39;\\\\\\</code>‘ to ‘`‘, etc.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      string[-Math.ceil(string.length / <span class=\"hljs-number\">2</span>)..]\n    @token <span class=\"hljs-string\">'JS'</span>, script, <span class=\"hljs-number\">0</span>, match[<span class=\"hljs-number\">0</span>].length\n    match[<span class=\"hljs-number\">0</span>].length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>\n              </div>\n              <p>Matches regular expression literals, as well as multiline extended ones.\nLexing regular expressions is difficult to distinguish from division, so we\nborrow some basic heuristics from JavaScript and Ruby.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  regexToken: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">switch</span>\n      <span class=\"hljs-keyword\">when</span> match = REGEX_ILLEGAL.exec @chunk\n        @error <span class=\"hljs-string\">\"regular expressions cannot begin with <span class=\"hljs-subst\">#{match[<span class=\"hljs-number\">2</span>]}</span>\"</span>,\n          offset: match.index + match[<span class=\"hljs-number\">1</span>].length\n      <span class=\"hljs-keyword\">when</span> match = @matchWithInterpolations HEREGEX, <span class=\"hljs-string\">'///'</span>\n        {tokens, index} = match\n      <span class=\"hljs-keyword\">when</span> match = REGEX.exec @chunk\n        [regex, body, closed] = match\n        @validateEscapes body, isRegex: <span class=\"hljs-literal\">yes</span>, offsetInChunk: <span class=\"hljs-number\">1</span>\n        body = @formatRegex body, delimiter: <span class=\"hljs-string\">'/'</span>\n        index = regex.length\n        [..., prev] = @tokens\n        <span class=\"hljs-keyword\">if</span> prev\n          <span class=\"hljs-keyword\">if</span> prev.spaced <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> CALLABLE\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> closed <span class=\"hljs-keyword\">or</span> POSSIBLY_DIVISION.test regex\n          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> NOT_REGEX\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>\n        @error <span class=\"hljs-string\">'missing / (unclosed regex)'</span> <span class=\"hljs-keyword\">unless</span> closed\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>\n\n    [flags] = REGEX_FLAGS.exec @chunk[index..]\n    end = index + flags.length\n    origin = @makeToken <span class=\"hljs-string\">'REGEX'</span>, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-number\">0</span>, end\n    <span class=\"hljs-keyword\">switch</span>\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-keyword\">not</span> VALID_FLAGS.test flags\n        @error <span class=\"hljs-string\">\"invalid regular expression flags <span class=\"hljs-subst\">#{flags}</span>\"</span>, offset: index, length: flags.length\n      <span class=\"hljs-keyword\">when</span> regex <span class=\"hljs-keyword\">or</span> tokens.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span>\n        body ?= @formatHeregex tokens[<span class=\"hljs-number\">0</span>][<span class=\"hljs-number\">1</span>]\n        @token <span class=\"hljs-string\">'REGEX'</span>, <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@makeDelimitedLiteral body, delimiter: <span class=\"hljs-string\">'/'</span>}</span><span class=\"hljs-subst\">#{flags}</span>\"</span>, <span class=\"hljs-number\">0</span>, end, origin\n      <span class=\"hljs-keyword\">else</span>\n        @token <span class=\"hljs-string\">'REGEX_START'</span>, <span class=\"hljs-string\">'('</span>, <span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">0</span>, origin\n        @token <span class=\"hljs-string\">'IDENTIFIER'</span>, <span class=\"hljs-string\">'RegExp'</span>, <span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">0</span>\n        @token <span class=\"hljs-string\">'CALL_START'</span>, <span class=\"hljs-string\">'('</span>, <span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">0</span>\n        @mergeInterpolationTokens tokens, {delimiter: <span class=\"hljs-string\">'\"'</span>, double: <span class=\"hljs-literal\">yes</span>}, @formatHeregex\n        <span class=\"hljs-keyword\">if</span> flags\n          @token <span class=\"hljs-string\">','</span>, <span class=\"hljs-string\">','</span>, index - <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">0</span>\n          @token <span class=\"hljs-string\">'STRING'</span>, <span class=\"hljs-string\">'\"'</span> + flags + <span class=\"hljs-string\">'\"'</span>, index - <span class=\"hljs-number\">1</span>, flags.length\n        @token <span class=\"hljs-string\">')'</span>, <span class=\"hljs-string\">')'</span>, end - <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">0</span>\n        @token <span class=\"hljs-string\">'REGEX_END'</span>, <span class=\"hljs-string\">')'</span>, end - <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">0</span>\n\n    end</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-23\">&#182;</a>\n              </div>\n              <p>Matches newlines, indents, and outdents, and determines which is which.\nIf we can detect that the current line is continued onto the next line,\nthen the newline is suppressed:</p>\n<pre><code>elements\n  .each( ... )\n  .map( ... )\n</code></pre><p>Keeps track of the level of indentation, because a single outdent token\ncan close multiple indents, so we need to know how far in we happen to be.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  lineToken: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> match = MULTI_DENT.exec @chunk\n    indent = match[<span class=\"hljs-number\">0</span>]\n\n    @seenFor = <span class=\"hljs-literal\">no</span>\n    @seenImport = <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> @importSpecifierList\n    @seenExport = <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> @exportSpecifierList\n\n    size = indent.length - <span class=\"hljs-number\">1</span> - indent.lastIndexOf <span class=\"hljs-string\">'\\n'</span>\n    noNewlines = @unfinished()\n\n    <span class=\"hljs-keyword\">if</span> size - @indebt <span class=\"hljs-keyword\">is</span> @indent\n      <span class=\"hljs-keyword\">if</span> noNewlines <span class=\"hljs-keyword\">then</span> @suppressNewlines() <span class=\"hljs-keyword\">else</span> @newlineToken <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">return</span> indent.length\n\n    <span class=\"hljs-keyword\">if</span> size &gt; @indent\n      <span class=\"hljs-keyword\">if</span> noNewlines\n        @indebt = size - @indent\n        @suppressNewlines()\n        <span class=\"hljs-keyword\">return</span> indent.length\n      <span class=\"hljs-keyword\">unless</span> @tokens.length\n        @baseIndent = @indent = size\n        <span class=\"hljs-keyword\">return</span> indent.length\n      diff = size - @indent + @outdebt\n      @token <span class=\"hljs-string\">'INDENT'</span>, diff, indent.length - size, size\n      @indents.push diff\n      @ends.push {tag: <span class=\"hljs-string\">'OUTDENT'</span>}\n      @outdebt = @indebt = <span class=\"hljs-number\">0</span>\n      @indent = size\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> size &lt; @baseIndent\n      @error <span class=\"hljs-string\">'missing indentation'</span>, offset: indent.length\n    <span class=\"hljs-keyword\">else</span>\n      @indebt = <span class=\"hljs-number\">0</span>\n      @outdentToken @indent - size, noNewlines, indent.length\n    indent.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-24\">&#182;</a>\n              </div>\n              <p>Record an outdent token or multiple tokens, if we happen to be moving back\ninwards past several recorded indents. Sets new @indent value.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  outdentToken: <span class=\"hljs-function\"><span class=\"hljs-params\">(moveOut, noNewlines, outdentLength)</span> -&gt;</span>\n    decreasedIndent = @indent - moveOut\n    <span class=\"hljs-keyword\">while</span> moveOut &gt; <span class=\"hljs-number\">0</span>\n      lastIndent = @indents[@indents.length - <span class=\"hljs-number\">1</span>]\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> lastIndent\n        moveOut = <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> lastIndent <span class=\"hljs-keyword\">is</span> @outdebt\n        moveOut -= @outdebt\n        @outdebt = <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> lastIndent &lt; @outdebt\n        @outdebt -= lastIndent\n        moveOut  -= lastIndent\n      <span class=\"hljs-keyword\">else</span>\n        dent = @indents.pop() + @outdebt\n        <span class=\"hljs-keyword\">if</span> outdentLength <span class=\"hljs-keyword\">and</span> @chunk[outdentLength] <span class=\"hljs-keyword\">in</span> INDENTABLE_CLOSERS\n          decreasedIndent -= dent - moveOut\n          moveOut = dent\n        @outdebt = <span class=\"hljs-number\">0</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-25\">&#182;</a>\n              </div>\n              <p>pair might call outdentToken, so preserve decreasedIndent</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        @pair <span class=\"hljs-string\">'OUTDENT'</span>\n        @token <span class=\"hljs-string\">'OUTDENT'</span>, moveOut, <span class=\"hljs-number\">0</span>, outdentLength\n        moveOut -= dent\n    @outdebt -= moveOut <span class=\"hljs-keyword\">if</span> dent\n    @tokens.pop() <span class=\"hljs-keyword\">while</span> @value() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">';'</span>\n\n    @token <span class=\"hljs-string\">'TERMINATOR'</span>, <span class=\"hljs-string\">'\\n'</span>, outdentLength, <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> @tag() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'TERMINATOR'</span> <span class=\"hljs-keyword\">or</span> noNewlines\n    @indent = decreasedIndent\n    <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-26\">&#182;</a>\n              </div>\n              <p>Matches and consumes non-meaningful whitespace. Tag the previous token\nas being “spaced”, because there are some cases where it makes a difference.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  whitespaceToken: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> (match = WHITESPACE.exec @chunk) <span class=\"hljs-keyword\">or</span>\n                    (nline = @chunk.charAt(<span class=\"hljs-number\">0</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'\\n'</span>)\n    [..., prev] = @tokens\n    prev[<span class=\"hljs-keyword\">if</span> match <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'spaced'</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">'newLine'</span>] = <span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> prev\n    <span class=\"hljs-keyword\">if</span> match <span class=\"hljs-keyword\">then</span> match[<span class=\"hljs-number\">0</span>].length <span class=\"hljs-keyword\">else</span> <span class=\"hljs-number\">0</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-27\">&#182;</a>\n              </div>\n              <p>Generate a newline token. Consecutive newlines get merged together.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  newlineToken: <span class=\"hljs-function\"><span class=\"hljs-params\">(offset)</span> -&gt;</span>\n    @tokens.pop() <span class=\"hljs-keyword\">while</span> @value() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">';'</span>\n    @token <span class=\"hljs-string\">'TERMINATOR'</span>, <span class=\"hljs-string\">'\\n'</span>, offset, <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> @tag() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'TERMINATOR'</span>\n    <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-28\">&#182;</a>\n              </div>\n              <p>Use a <code>\\</code> at a line-ending to suppress the newline.\nThe slash is removed here once its job is done.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  suppressNewlines: <span class=\"hljs-function\">-&gt;</span>\n    @tokens.pop() <span class=\"hljs-keyword\">if</span> @value() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'\\\\'</span>\n    <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-29\">&#182;</a>\n              </div>\n              <p>We treat all other single characters as a token. E.g.: <code>( ) , . !</code>\nMulti-character operators are also literal tokens, so that Jison can assign\nthe proper order of operations. There are some symbols that we tag specially\nhere. <code>;</code> and newlines are both treated as a <code>TERMINATOR</code>, we distinguish\nparentheses that indicate a method call from regular parentheses, and so on.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  literalToken: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> match = OPERATOR.exec @chunk\n      [value] = match\n      @tagParameters() <span class=\"hljs-keyword\">if</span> CODE.test value\n    <span class=\"hljs-keyword\">else</span>\n      value = @chunk.charAt <span class=\"hljs-number\">0</span>\n    tag  = value\n    [..., prev] = @tokens\n\n    <span class=\"hljs-keyword\">if</span> prev <span class=\"hljs-keyword\">and</span> value <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'='</span>, COMPOUND_ASSIGN...]\n      skipToken = <span class=\"hljs-literal\">false</span>\n      <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'='</span> <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'||'</span>, <span class=\"hljs-string\">'&amp;&amp;'</span>] <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> prev.spaced\n        prev[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'COMPOUND_ASSIGN'</span>\n        prev[<span class=\"hljs-number\">1</span>] += <span class=\"hljs-string\">'='</span>\n        prev = @tokens[@tokens.length - <span class=\"hljs-number\">2</span>]\n        skipToken = <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-keyword\">if</span> prev <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'PROPERTY'</span>\n        origin = prev.origin ? prev\n        message = isUnassignable prev[<span class=\"hljs-number\">1</span>], origin[<span class=\"hljs-number\">1</span>]\n        @error message, origin[<span class=\"hljs-number\">2</span>] <span class=\"hljs-keyword\">if</span> message\n      <span class=\"hljs-keyword\">return</span> value.length <span class=\"hljs-keyword\">if</span> skipToken\n\n    <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'{'</span> <span class=\"hljs-keyword\">and</span> @seenImport\n      @importSpecifierList = <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @importSpecifierList <span class=\"hljs-keyword\">and</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'}'</span>\n      @importSpecifierList = <span class=\"hljs-literal\">no</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'{'</span> <span class=\"hljs-keyword\">and</span> prev?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'EXPORT'</span>\n      @exportSpecifierList = <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @exportSpecifierList <span class=\"hljs-keyword\">and</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'}'</span>\n      @exportSpecifierList = <span class=\"hljs-literal\">no</span>\n\n    <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">';'</span>\n      @seenFor = @seenImport = @seenExport = <span class=\"hljs-literal\">no</span>\n      tag = <span class=\"hljs-string\">'TERMINATOR'</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'*'</span> <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'EXPORT'</span>\n      tag = <span class=\"hljs-string\">'EXPORT_ALL'</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">in</span> MATH            <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">'MATH'</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">in</span> COMPARE         <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">'COMPARE'</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">in</span> COMPOUND_ASSIGN <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">'COMPOUND_ASSIGN'</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">in</span> UNARY           <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">'UNARY'</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">in</span> UNARY_MATH      <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">'UNARY_MATH'</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">in</span> SHIFT           <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">'SHIFT'</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'?'</span> <span class=\"hljs-keyword\">and</span> prev?.spaced <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">'BIN?'</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prev <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> prev.spaced\n      <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'('</span> <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> CALLABLE\n        prev[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'FUNC_EXIST'</span> <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'?'</span>\n        tag = <span class=\"hljs-string\">'CALL_START'</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'['</span> <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> INDEXABLE\n        tag = <span class=\"hljs-string\">'INDEX_START'</span>\n        <span class=\"hljs-keyword\">switch</span> prev[<span class=\"hljs-number\">0</span>]\n          <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'?'</span>  <span class=\"hljs-keyword\">then</span> prev[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'INDEX_SOAK'</span>\n    token = @makeToken tag, value\n    <span class=\"hljs-keyword\">switch</span> value\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'('</span>, <span class=\"hljs-string\">'{'</span>, <span class=\"hljs-string\">'['</span> <span class=\"hljs-keyword\">then</span> @ends.push {tag: INVERSES[value], origin: token}\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">')'</span>, <span class=\"hljs-string\">'}'</span>, <span class=\"hljs-string\">']'</span> <span class=\"hljs-keyword\">then</span> @pair value\n    @tokens.push token\n    value.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-30\">&#182;</a>\n              </div>\n              <h2 id=\"token-manipulators\">Token Manipulators</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-31\">&#182;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-32\">&#182;</a>\n              </div>\n              <p>A source of ambiguity in our grammar used to be parameter lists in function\ndefinitions versus argument lists in function calls. Walk backwards, tagging\nparameters specially in order to make things easier for the parser.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  tagParameters: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span> <span class=\"hljs-keyword\">if</span> @tag() <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">')'</span>\n    stack = []\n    {tokens} = <span class=\"hljs-keyword\">this</span>\n    i = tokens.length\n    tokens[--i][<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'PARAM_END'</span>\n    <span class=\"hljs-keyword\">while</span> tok = tokens[--i]\n      <span class=\"hljs-keyword\">switch</span> tok[<span class=\"hljs-number\">0</span>]\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">')'</span>\n          stack.push tok\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'('</span>, <span class=\"hljs-string\">'CALL_START'</span>\n          <span class=\"hljs-keyword\">if</span> stack.length <span class=\"hljs-keyword\">then</span> stack.pop()\n          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tok[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'('</span>\n            tok[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'PARAM_START'</span>\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>\n          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>\n    <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-33\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-33\">&#182;</a>\n              </div>\n              <p>Close up all remaining open blocks at the end of the file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  closeIndentation: <span class=\"hljs-function\">-&gt;</span>\n    @outdentToken @indent</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-34\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-34\">&#182;</a>\n              </div>\n              <p>Match the contents of a delimited token and expand variables and expressions\ninside it using Ruby-like notation for substitution of arbitrary\nexpressions.</p>\n<pre><code><span class=\"hljs-string\">\"Hello <span class=\"hljs-subst\">#{name.capitalize()}</span>.\"</span>\n</code></pre><p>If it encounters an interpolation, this method will recursively create a new\nLexer and tokenize until the <code>{</code> of <code>#{</code> is balanced with a <code>}</code>.</p>\n<ul>\n<li><code>regex</code> matches the contents of a token (but not <code>delimiter</code>, and not\n<code>#{</code> if interpolations are desired).</li>\n<li><code>delimiter</code> is the delimiter of the token. Examples are <code>&#39;</code>, <code>&quot;</code>, <code>&#39;&#39;&#39;</code>,\n<code>&quot;&quot;&quot;</code> and <code>///</code>.</li>\n</ul>\n<p>This method allows us to have strings within interpolations within strings,\nad infinitum.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  matchWithInterpolations: <span class=\"hljs-function\"><span class=\"hljs-params\">(regex, delimiter)</span> -&gt;</span>\n    tokens = []\n    offsetInChunk = delimiter.length\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">null</span> <span class=\"hljs-keyword\">unless</span> @chunk[...offsetInChunk] <span class=\"hljs-keyword\">is</span> delimiter\n    str = @chunk[offsetInChunk..]\n    <span class=\"hljs-keyword\">loop</span>\n      [strPart] = regex.exec str\n\n      @validateEscapes strPart, {isRegex: delimiter.charAt(<span class=\"hljs-number\">0</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'/'</span>, offsetInChunk}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-35\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-35\">&#182;</a>\n              </div>\n              <p>Push a fake ‘NEOSTRING’ token, which will get turned into a real string later.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      tokens.push @makeToken <span class=\"hljs-string\">'NEOSTRING'</span>, strPart, offsetInChunk\n\n      str = str[strPart.length..]\n      offsetInChunk += strPart.length\n\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> str[..<span class=\"hljs-number\">.2</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'#{'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-36\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-36\">&#182;</a>\n              </div>\n              <p>The <code>1</code>s are to remove the <code>#</code> in <code>#{</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      [line, column] = @getLineAndColumnFromChunk offsetInChunk + <span class=\"hljs-number\">1</span>\n      {tokens: nested, index} =\n        <span class=\"hljs-keyword\">new</span> Lexer().tokenize str[<span class=\"hljs-number\">1.</span>.], line: line, column: column, untilBalanced: <span class=\"hljs-literal\">on</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-37\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-37\">&#182;</a>\n              </div>\n              <p>Skip the trailing <code>}</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      index += <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-38\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-38\">&#182;</a>\n              </div>\n              <p>Turn the leading and trailing <code>{</code> and <code>}</code> into parentheses. Unnecessary\nparentheses will be removed later.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      [open, ..., close] = nested\n      open[<span class=\"hljs-number\">0</span>]  = open[<span class=\"hljs-number\">1</span>]  = <span class=\"hljs-string\">'('</span>\n      close[<span class=\"hljs-number\">0</span>] = close[<span class=\"hljs-number\">1</span>] = <span class=\"hljs-string\">')'</span>\n      close.origin = [<span class=\"hljs-string\">''</span>, <span class=\"hljs-string\">'end of interpolation'</span>, close[<span class=\"hljs-number\">2</span>]]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-39\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-39\">&#182;</a>\n              </div>\n              <p>Remove leading ‘TERMINATOR’ (if any).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      nested.splice <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> nested[<span class=\"hljs-number\">1</span>]?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'TERMINATOR'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-40\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-40\">&#182;</a>\n              </div>\n              <p>Push a fake ‘TOKENS’ token, which will get turned into real tokens later.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      tokens.push [<span class=\"hljs-string\">'TOKENS'</span>, nested]\n\n      str = str[index..]\n      offsetInChunk += index\n\n    <span class=\"hljs-keyword\">unless</span> str[...delimiter.length] <span class=\"hljs-keyword\">is</span> delimiter\n      @error <span class=\"hljs-string\">\"missing <span class=\"hljs-subst\">#{delimiter}</span>\"</span>, length: delimiter.length\n\n    [firstToken, ..., lastToken] = tokens\n    firstToken[<span class=\"hljs-number\">2</span>].first_column -= delimiter.length\n    <span class=\"hljs-keyword\">if</span> lastToken[<span class=\"hljs-number\">1</span>].substr(<span class=\"hljs-number\">-1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'\\n'</span>\n      lastToken[<span class=\"hljs-number\">2</span>].last_line += <span class=\"hljs-number\">1</span>\n      lastToken[<span class=\"hljs-number\">2</span>].last_column = delimiter.length - <span class=\"hljs-number\">1</span>\n    <span class=\"hljs-keyword\">else</span>\n      lastToken[<span class=\"hljs-number\">2</span>].last_column += delimiter.length\n    lastToken[<span class=\"hljs-number\">2</span>].last_column -= <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> lastToken[<span class=\"hljs-number\">1</span>].length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n\n    {tokens, index: offsetInChunk + delimiter.length}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-41\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-41\">&#182;</a>\n              </div>\n              <p>Merge the array <code>tokens</code> of the fake token types ‘TOKENS’ and ‘NEOSTRING’\n(as returned by <code>matchWithInterpolations</code>) into the token stream. The value\nof ‘NEOSTRING’s are converted using <code>fn</code> and turned into strings using\n<code>options</code> first.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  mergeInterpolationTokens: <span class=\"hljs-function\"><span class=\"hljs-params\">(tokens, options, fn)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> tokens.length &gt; <span class=\"hljs-number\">1</span>\n      lparen = @token <span class=\"hljs-string\">'STRING_START'</span>, <span class=\"hljs-string\">'('</span>, <span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">0</span>\n\n    firstIndex = @tokens.length\n    <span class=\"hljs-keyword\">for</span> token, i <span class=\"hljs-keyword\">in</span> tokens\n      [tag, value] = token\n      <span class=\"hljs-keyword\">switch</span> tag\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'TOKENS'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-42\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-42\">&#182;</a>\n              </div>\n              <p>Optimize out empty interpolations (an empty pair of parentheses).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">continue</span> <span class=\"hljs-keyword\">if</span> value.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">2</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-43\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-43\">&#182;</a>\n              </div>\n              <p>Push all the tokens in the fake ‘TOKENS’ token. These already have\nsane location data.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          locationToken = value[<span class=\"hljs-number\">0</span>]\n          tokensToPush = value\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'NEOSTRING'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-44\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-44\">&#182;</a>\n              </div>\n              <p>Convert ‘NEOSTRING’ into ‘STRING’.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          converted = fn.call <span class=\"hljs-keyword\">this</span>, token[<span class=\"hljs-number\">1</span>], i</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-45\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-45\">&#182;</a>\n              </div>\n              <p>Optimize out empty strings. We ensure that the tokens stream always\nstarts with a string token, though, to make sure that the result\nreally is a string.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">if</span> converted.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n            <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n              firstEmptyStringIndex = @tokens.length\n            <span class=\"hljs-keyword\">else</span>\n              <span class=\"hljs-keyword\">continue</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-46\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-46\">&#182;</a>\n              </div>\n              <p>However, there is one case where we can optimize away a starting\nempty string.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">2</span> <span class=\"hljs-keyword\">and</span> firstEmptyStringIndex?\n            @tokens.splice firstEmptyStringIndex, <span class=\"hljs-number\">2</span> <span class=\"hljs-comment\"># Remove empty string and the plus.</span>\n          token[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'STRING'</span>\n          token[<span class=\"hljs-number\">1</span>] = @makeDelimitedLiteral converted, options\n          locationToken = token\n          tokensToPush = [token]\n      <span class=\"hljs-keyword\">if</span> @tokens.length &gt; firstIndex</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-47\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-47\">&#182;</a>\n              </div>\n              <p>Create a 0-length “+” token.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        plusToken = @token <span class=\"hljs-string\">'+'</span>, <span class=\"hljs-string\">'+'</span>\n        plusToken[<span class=\"hljs-number\">2</span>] =\n          first_line:   locationToken[<span class=\"hljs-number\">2</span>].first_line\n          first_column: locationToken[<span class=\"hljs-number\">2</span>].first_column\n          last_line:    locationToken[<span class=\"hljs-number\">2</span>].first_line\n          last_column:  locationToken[<span class=\"hljs-number\">2</span>].first_column\n      @tokens.push tokensToPush...\n\n    <span class=\"hljs-keyword\">if</span> lparen\n      [..., lastToken] = tokens\n      lparen.origin = [<span class=\"hljs-string\">'STRING'</span>, <span class=\"hljs-literal\">null</span>,\n        first_line:   lparen[<span class=\"hljs-number\">2</span>].first_line\n        first_column: lparen[<span class=\"hljs-number\">2</span>].first_column\n        last_line:    lastToken[<span class=\"hljs-number\">2</span>].last_line\n        last_column:  lastToken[<span class=\"hljs-number\">2</span>].last_column\n      ]\n      rparen = @token <span class=\"hljs-string\">'STRING_END'</span>, <span class=\"hljs-string\">')'</span>\n      rparen[<span class=\"hljs-number\">2</span>] =\n        first_line:   lastToken[<span class=\"hljs-number\">2</span>].last_line\n        first_column: lastToken[<span class=\"hljs-number\">2</span>].last_column\n        last_line:    lastToken[<span class=\"hljs-number\">2</span>].last_line\n        last_column:  lastToken[<span class=\"hljs-number\">2</span>].last_column</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-48\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-48\">&#182;</a>\n              </div>\n              <p>Pairs up a closing token, ensuring that all listed pairs of tokens are\ncorrectly balanced throughout the course of the token stream.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  pair: <span class=\"hljs-function\"><span class=\"hljs-params\">(tag)</span> -&gt;</span>\n    [..., prev] = @ends\n    <span class=\"hljs-keyword\">unless</span> tag <span class=\"hljs-keyword\">is</span> wanted = prev?.tag\n      @error <span class=\"hljs-string\">\"unmatched <span class=\"hljs-subst\">#{tag}</span>\"</span> <span class=\"hljs-keyword\">unless</span> <span class=\"hljs-string\">'OUTDENT'</span> <span class=\"hljs-keyword\">is</span> wanted</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-49\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-49\">&#182;</a>\n              </div>\n              <p>Auto-close INDENT to support syntax like this:</p>\n<pre><code>el.click(<span class=\"hljs-function\"><span class=\"hljs-params\">(event)</span> -&gt;</span>\n  el.hide())\n</code></pre>\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      [..., lastIndent] = @indents\n      @outdentToken lastIndent, <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-keyword\">return</span> @pair tag\n    @ends.pop()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-50\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-50\">&#182;</a>\n              </div>\n              <h2 id=\"helpers\">Helpers</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-51\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-51\">&#182;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-52\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-52\">&#182;</a>\n              </div>\n              <p>Returns the line and column number from an offset into the current chunk.</p>\n<p><code>offset</code> is a number of characters into @chunk.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  getLineAndColumnFromChunk: <span class=\"hljs-function\"><span class=\"hljs-params\">(offset)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> offset <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">return</span> [@chunkLine, @chunkColumn]\n\n    <span class=\"hljs-keyword\">if</span> offset &gt;= @chunk.length\n      string = @chunk\n    <span class=\"hljs-keyword\">else</span>\n      string = @chunk[..offset<span class=\"hljs-number\">-1</span>]\n\n    lineCount = count string, <span class=\"hljs-string\">'\\n'</span>\n\n    column = @chunkColumn\n    <span class=\"hljs-keyword\">if</span> lineCount &gt; <span class=\"hljs-number\">0</span>\n      [..., lastLine] = string.split <span class=\"hljs-string\">'\\n'</span>\n      column = lastLine.length\n    <span class=\"hljs-keyword\">else</span>\n      column += string.length\n\n    [@chunkLine + lineCount, column]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-53\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-53\">&#182;</a>\n              </div>\n              <p>Same as “token”, exception this just returns the token without adding it\nto the results.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  makeToken: <span class=\"hljs-function\"><span class=\"hljs-params\">(tag, value, offsetInChunk = <span class=\"hljs-number\">0</span>, length = value.length)</span> -&gt;</span>\n    locationData = {}\n    [locationData.first_line, locationData.first_column] =\n      @getLineAndColumnFromChunk offsetInChunk</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-54\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-54\">&#182;</a>\n              </div>\n              <p>Use length - 1 for the final offset - we’re supplying the last_line and the last_column,\nso if last_column == first_column, then we’re looking at a character of length 1.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    lastCharacter = <span class=\"hljs-keyword\">if</span> length &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> (length - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">else</span> <span class=\"hljs-number\">0</span>\n    [locationData.last_line, locationData.last_column] =\n      @getLineAndColumnFromChunk offsetInChunk + lastCharacter\n\n    token = [tag, value, locationData]\n\n    token</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-55\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-55\">&#182;</a>\n              </div>\n              <p>Add a token to the results.\n<code>offset</code> is the offset into the current @chunk where the token starts.\n<code>length</code> is the length of the token in the @chunk, after the offset.  If\nnot specified, the length of <code>value</code> will be used.</p>\n<p>Returns the new token.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  token: <span class=\"hljs-function\"><span class=\"hljs-params\">(tag, value, offsetInChunk, length, origin)</span> -&gt;</span>\n    token = @makeToken tag, value, offsetInChunk, length\n    token.origin = origin <span class=\"hljs-keyword\">if</span> origin\n    @tokens.push token\n    token</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-56\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-56\">&#182;</a>\n              </div>\n              <p>Peek at the last tag in the token stream.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  tag: <span class=\"hljs-function\">-&gt;</span>\n    [..., token] = @tokens\n    token?[<span class=\"hljs-number\">0</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-57\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-57\">&#182;</a>\n              </div>\n              <p>Peek at the last value in the token stream.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  value: <span class=\"hljs-function\">-&gt;</span>\n    [..., token] = @tokens\n    token?[<span class=\"hljs-number\">1</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-58\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-58\">&#182;</a>\n              </div>\n              <p>Are we in the midst of an unfinished expression?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unfinished: <span class=\"hljs-function\">-&gt;</span>\n    LINE_CONTINUER.test(@chunk) <span class=\"hljs-keyword\">or</span>\n    @tag() <span class=\"hljs-keyword\">in</span> UNFINISHED\n\n  formatString: <span class=\"hljs-function\"><span class=\"hljs-params\">(str, options)</span> -&gt;</span>\n    @replaceUnicodeCodePointEscapes str.replace(STRING_OMIT, <span class=\"hljs-string\">'$1'</span>), options\n\n  formatHeregex: <span class=\"hljs-function\"><span class=\"hljs-params\">(str)</span> -&gt;</span>\n    @formatRegex str.replace(HEREGEX_OMIT, <span class=\"hljs-string\">'$1$2'</span>), delimiter: <span class=\"hljs-string\">'///'</span>\n\n  formatRegex: <span class=\"hljs-function\"><span class=\"hljs-params\">(str, options)</span> -&gt;</span>\n    @replaceUnicodeCodePointEscapes str, options\n\n  unicodeCodePointToUnicodeEscapes: <span class=\"hljs-function\"><span class=\"hljs-params\">(codePoint)</span> -&gt;</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">toUnicodeEscape</span> = <span class=\"hljs-params\">(val)</span> -&gt;</span>\n      str = val.toString <span class=\"hljs-number\">16</span>\n      <span class=\"hljs-string\">\"\\\\u<span class=\"hljs-subst\">#{repeat <span class=\"hljs-string\">'0'</span>, <span class=\"hljs-number\">4</span> - str.length}</span><span class=\"hljs-subst\">#{str}</span>\"</span>\n    <span class=\"hljs-keyword\">return</span> toUnicodeEscape(codePoint) <span class=\"hljs-keyword\">if</span> codePoint &lt; <span class=\"hljs-number\">0x10000</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-59\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-59\">&#182;</a>\n              </div>\n              <p>surrogate pair</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    high = Math.floor((codePoint - <span class=\"hljs-number\">0x10000</span>) / <span class=\"hljs-number\">0x400</span>) + <span class=\"hljs-number\">0xD800</span>\n    low = (codePoint - <span class=\"hljs-number\">0x10000</span>) % <span class=\"hljs-number\">0x400</span> + <span class=\"hljs-number\">0xDC00</span>\n    <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{toUnicodeEscape(high)}</span><span class=\"hljs-subst\">#{toUnicodeEscape(low)}</span>\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-60\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-60\">&#182;</a>\n              </div>\n              <p>Replace \\u{…} with \\uxxxx[\\uxxxx] in strings and regexes</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  replaceUnicodeCodePointEscapes: <span class=\"hljs-function\"><span class=\"hljs-params\">(str, options)</span> -&gt;</span>\n    str.replace UNICODE_CODE_POINT_ESCAPE, <span class=\"hljs-function\"><span class=\"hljs-params\">(match, escapedBackslash, codePointHex, offset)</span> =&gt;</span>\n      <span class=\"hljs-keyword\">return</span> escapedBackslash <span class=\"hljs-keyword\">if</span> escapedBackslash\n\n      codePointDecimal = parseInt codePointHex, <span class=\"hljs-number\">16</span>\n      <span class=\"hljs-keyword\">if</span> codePointDecimal &gt; <span class=\"hljs-number\">0x10ffff</span>\n        @error <span class=\"hljs-string\">\"unicode code point escapes greater than \\\\u{10ffff} are not allowed\"</span>,\n          offset: offset + options.delimiter.length\n          length: codePointHex.length + <span class=\"hljs-number\">4</span>\n\n      @unicodeCodePointToUnicodeEscapes codePointDecimal</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-61\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-61\">&#182;</a>\n              </div>\n              <p>Validates escapes in strings and regexes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  validateEscapes: <span class=\"hljs-function\"><span class=\"hljs-params\">(str, options = {})</span> -&gt;</span>\n    invalidEscapeRegex =\n      <span class=\"hljs-keyword\">if</span> options.isRegex\n        REGEX_INVALID_ESCAPE\n      <span class=\"hljs-keyword\">else</span>\n        STRING_INVALID_ESCAPE\n    match = invalidEscapeRegex.exec str\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> match\n    [[], before, octal, hex, unicodeCodePoint, unicode] = match\n    message =\n      <span class=\"hljs-keyword\">if</span> octal\n        <span class=\"hljs-string\">\"octal escape sequences are not allowed\"</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">\"invalid escape sequence\"</span>\n    invalidEscape = <span class=\"hljs-string\">\"\\\\<span class=\"hljs-subst\">#{octal <span class=\"hljs-keyword\">or</span> hex <span class=\"hljs-keyword\">or</span> unicodeCodePoint <span class=\"hljs-keyword\">or</span> unicode}</span>\"</span>\n    @error <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{message}</span> <span class=\"hljs-subst\">#{invalidEscape}</span>\"</span>,\n      offset: (options.offsetInChunk ? <span class=\"hljs-number\">0</span>) + match.index + before.length\n      length: invalidEscape.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-62\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-62\">&#182;</a>\n              </div>\n              <p>Constructs a string or regex by escaping certain characters.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  makeDelimitedLiteral: <span class=\"hljs-function\"><span class=\"hljs-params\">(body, options = {})</span> -&gt;</span>\n    body = <span class=\"hljs-string\">'(?:)'</span> <span class=\"hljs-keyword\">if</span> body <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">''</span> <span class=\"hljs-keyword\">and</span> options.delimiter <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'/'</span>\n    regex = <span class=\"hljs-regexp\">///\n        (\\\\\\\\)                               <span class=\"hljs-comment\"># escaped backslash</span>\n      | (\\\\0(?=[1-7]))                       <span class=\"hljs-comment\"># nul character mistaken as octal escape</span>\n      | \\\\?(<span class=\"hljs-subst\">#{options.delimiter}</span>)            <span class=\"hljs-comment\"># (possibly escaped) delimiter</span>\n      | \\\\?(?: (\\n)|(\\r)|(\\u2028)|(\\u2029) ) <span class=\"hljs-comment\"># (possibly escaped) newlines</span>\n      | (\\\\.)                                <span class=\"hljs-comment\"># other escapes</span>\n    ///</span>g\n    body = body.replace regex, <span class=\"hljs-function\"><span class=\"hljs-params\">(match, backslash, nul, delimiter, lf, cr, ls, ps, other)</span> -&gt;</span> <span class=\"hljs-keyword\">switch</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-63\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-63\">&#182;</a>\n              </div>\n              <p>Ignore escaped backslashes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">when</span> backslash <span class=\"hljs-keyword\">then</span> (<span class=\"hljs-keyword\">if</span> options.double <span class=\"hljs-keyword\">then</span> backslash + backslash <span class=\"hljs-keyword\">else</span> backslash)\n      <span class=\"hljs-keyword\">when</span> nul       <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'\\\\x00'</span>\n      <span class=\"hljs-keyword\">when</span> delimiter <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\"\\\\<span class=\"hljs-subst\">#{delimiter}</span>\"</span>\n      <span class=\"hljs-keyword\">when</span> lf        <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'\\\\n'</span>\n      <span class=\"hljs-keyword\">when</span> cr        <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'\\\\r'</span>\n      <span class=\"hljs-keyword\">when</span> ls        <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'\\\\u2028'</span>\n      <span class=\"hljs-keyword\">when</span> ps        <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'\\\\u2029'</span>\n      <span class=\"hljs-keyword\">when</span> other     <span class=\"hljs-keyword\">then</span> (<span class=\"hljs-keyword\">if</span> options.double <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\"\\\\<span class=\"hljs-subst\">#{other}</span>\"</span> <span class=\"hljs-keyword\">else</span> other)\n    <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{options.delimiter}</span><span class=\"hljs-subst\">#{body}</span><span class=\"hljs-subst\">#{options.delimiter}</span>\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-64\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-64\">&#182;</a>\n              </div>\n              <p>Throws an error at either a given offset from the current chunk or at the\nlocation of a token (<code>token[2]</code>).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  error: <span class=\"hljs-function\"><span class=\"hljs-params\">(message, options = {})</span> -&gt;</span>\n    location =\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">'first_line'</span> <span class=\"hljs-keyword\">of</span> options\n        options\n      <span class=\"hljs-keyword\">else</span>\n        [first_line, first_column] = @getLineAndColumnFromChunk options.offset ? <span class=\"hljs-number\">0</span>\n        {first_line, first_column, last_column: first_column + (options.length ? <span class=\"hljs-number\">1</span>) - <span class=\"hljs-number\">1</span>}\n    throwSyntaxError message, location</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-65\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-65\">&#182;</a>\n              </div>\n              <h2 id=\"helper-functions\">Helper functions</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-66\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-66\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">\n<span class=\"hljs-title\">isUnassignable</span> = <span class=\"hljs-params\">(name, displayName = name)</span> -&gt;</span> <span class=\"hljs-keyword\">switch</span>\n  <span class=\"hljs-keyword\">when</span> name <span class=\"hljs-keyword\">in</span> [JS_KEYWORDS..., COFFEE_KEYWORDS...]\n    <span class=\"hljs-string\">\"keyword '<span class=\"hljs-subst\">#{displayName}</span>' can't be assigned\"</span>\n  <span class=\"hljs-keyword\">when</span> name <span class=\"hljs-keyword\">in</span> STRICT_PROSCRIBED\n    <span class=\"hljs-string\">\"'<span class=\"hljs-subst\">#{displayName}</span>' can't be assigned\"</span>\n  <span class=\"hljs-keyword\">when</span> name <span class=\"hljs-keyword\">in</span> RESERVED\n    <span class=\"hljs-string\">\"reserved word '<span class=\"hljs-subst\">#{displayName}</span>' can't be assigned\"</span>\n  <span class=\"hljs-keyword\">else</span>\n    <span class=\"hljs-literal\">false</span>\n\nexports.isUnassignable = isUnassignable</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-67\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-67\">&#182;</a>\n              </div>\n              <p><code>from</code> isn’t a CoffeeScript keyword, but it behaves like one in <code>import</code> and\n<code>export</code> statements (handled above) and in the declaration line of a <code>for</code>\nloop. Try to detect when <code>from</code> is a variable identifier and when it is this\n“sometimes” keyword.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">isForFrom</span> = <span class=\"hljs-params\">(prev)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'IDENTIFIER'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-68\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-68\">&#182;</a>\n              </div>\n              <p><code>for i from from</code>, <code>for from from iterable</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'from'</span>\n      prev[<span class=\"hljs-number\">1</span>][<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'IDENTIFIER'</span>\n      <span class=\"hljs-literal\">yes</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-69\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-69\">&#182;</a>\n              </div>\n              <p><code>for i from iterable</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-literal\">yes</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-70\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-70\">&#182;</a>\n              </div>\n              <p><code>for from…</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'FOR'</span>\n    <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-71\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-71\">&#182;</a>\n              </div>\n              <p><code>for {from}…</code>, <code>for [from]…</code>, <code>for {a, from}…</code>, <code>for {a: from}…</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'{'</span>, <span class=\"hljs-string\">'['</span>, <span class=\"hljs-string\">','</span>, <span class=\"hljs-string\">':'</span>]\n    <span class=\"hljs-literal\">no</span>\n  <span class=\"hljs-keyword\">else</span>\n    <span class=\"hljs-literal\">yes</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-72\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-72\">&#182;</a>\n              </div>\n              <h2 id=\"constants\">Constants</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-73\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-73\">&#182;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-74\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-74\">&#182;</a>\n              </div>\n              <p>Keywords that CoffeeScript shares in common with JavaScript.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>JS_KEYWORDS = [\n  <span class=\"hljs-string\">'true'</span>, <span class=\"hljs-string\">'false'</span>, <span class=\"hljs-string\">'null'</span>, <span class=\"hljs-string\">'this'</span>\n  <span class=\"hljs-string\">'new'</span>, <span class=\"hljs-string\">'delete'</span>, <span class=\"hljs-string\">'typeof'</span>, <span class=\"hljs-string\">'in'</span>, <span class=\"hljs-string\">'instanceof'</span>\n  <span class=\"hljs-string\">'return'</span>, <span class=\"hljs-string\">'throw'</span>, <span class=\"hljs-string\">'break'</span>, <span class=\"hljs-string\">'continue'</span>, <span class=\"hljs-string\">'debugger'</span>, <span class=\"hljs-string\">'yield'</span>\n  <span class=\"hljs-string\">'if'</span>, <span class=\"hljs-string\">'else'</span>, <span class=\"hljs-string\">'switch'</span>, <span class=\"hljs-string\">'for'</span>, <span class=\"hljs-string\">'while'</span>, <span class=\"hljs-string\">'do'</span>, <span class=\"hljs-string\">'try'</span>, <span class=\"hljs-string\">'catch'</span>, <span class=\"hljs-string\">'finally'</span>\n  <span class=\"hljs-string\">'class'</span>, <span class=\"hljs-string\">'extends'</span>, <span class=\"hljs-string\">'super'</span>\n  <span class=\"hljs-string\">'import'</span>, <span class=\"hljs-string\">'export'</span>, <span class=\"hljs-string\">'default'</span>\n]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-75\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-75\">&#182;</a>\n              </div>\n              <p>CoffeeScript-only keywords.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>COFFEE_KEYWORDS = [\n  <span class=\"hljs-string\">'undefined'</span>, <span class=\"hljs-string\">'Infinity'</span>, <span class=\"hljs-string\">'NaN'</span>\n  <span class=\"hljs-string\">'then'</span>, <span class=\"hljs-string\">'unless'</span>, <span class=\"hljs-string\">'until'</span>, <span class=\"hljs-string\">'loop'</span>, <span class=\"hljs-string\">'of'</span>, <span class=\"hljs-string\">'by'</span>, <span class=\"hljs-string\">'when'</span>\n]\n\nCOFFEE_ALIAS_MAP =\n  <span class=\"hljs-keyword\">and</span>  : <span class=\"hljs-string\">'&amp;&amp;'</span>\n  <span class=\"hljs-keyword\">or</span>   : <span class=\"hljs-string\">'||'</span>\n  <span class=\"hljs-keyword\">is</span>   : <span class=\"hljs-string\">'=='</span>\n  <span class=\"hljs-keyword\">isnt</span> : <span class=\"hljs-string\">'!='</span>\n  <span class=\"hljs-keyword\">not</span>  : <span class=\"hljs-string\">'!'</span>\n  <span class=\"hljs-literal\">yes</span>  : <span class=\"hljs-string\">'true'</span>\n  <span class=\"hljs-literal\">no</span>   : <span class=\"hljs-string\">'false'</span>\n  <span class=\"hljs-literal\">on</span>   : <span class=\"hljs-string\">'true'</span>\n  <span class=\"hljs-literal\">off</span>  : <span class=\"hljs-string\">'false'</span>\n\nCOFFEE_ALIASES  = (key <span class=\"hljs-keyword\">for</span> key <span class=\"hljs-keyword\">of</span> COFFEE_ALIAS_MAP)\nCOFFEE_KEYWORDS = COFFEE_KEYWORDS.concat COFFEE_ALIASES</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-76\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-76\">&#182;</a>\n              </div>\n              <p>The list of keywords that are reserved by JavaScript, but not used, or are\nused by CoffeeScript internally. We throw an error when these are encountered,\nto avoid having a JavaScript error at runtime.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>RESERVED = [\n  <span class=\"hljs-string\">'case'</span>, <span class=\"hljs-string\">'function'</span>, <span class=\"hljs-string\">'var'</span>, <span class=\"hljs-string\">'void'</span>, <span class=\"hljs-string\">'with'</span>, <span class=\"hljs-string\">'const'</span>, <span class=\"hljs-string\">'let'</span>, <span class=\"hljs-string\">'enum'</span>\n  <span class=\"hljs-string\">'native'</span>, <span class=\"hljs-string\">'implements'</span>, <span class=\"hljs-string\">'interface'</span>, <span class=\"hljs-string\">'package'</span>, <span class=\"hljs-string\">'private'</span>\n  <span class=\"hljs-string\">'protected'</span>, <span class=\"hljs-string\">'public'</span>, <span class=\"hljs-string\">'static'</span>\n]\n\nSTRICT_PROSCRIBED = [<span class=\"hljs-string\">'arguments'</span>, <span class=\"hljs-string\">'eval'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-77\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-77\">&#182;</a>\n              </div>\n              <p>The superset of both JavaScript keywords and reserved words, none of which may\nbe used as identifiers or properties.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-78\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-78\">&#182;</a>\n              </div>\n              <p>The character code of the nasty Microsoft madness otherwise known as the BOM.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>BOM = <span class=\"hljs-number\">65279</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-79\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-79\">&#182;</a>\n              </div>\n              <p>Token matching regexes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>IDENTIFIER = <span class=\"hljs-regexp\">/// ^\n  (?!\\d)\n  ( (?: (?!\\s)[$\\w\\x7f-\\uffff] )+ )\n  ( [^\\n\\S]* : (?!:) )?  <span class=\"hljs-comment\"># Is this a property name?</span>\n///</span>\n\nNUMBER     = <span class=\"hljs-regexp\">///\n  ^ 0b[01]+    |              <span class=\"hljs-comment\"># binary</span>\n  ^ 0o[0-7]+   |              <span class=\"hljs-comment\"># octal</span>\n  ^ 0x[\\da-f]+ |              <span class=\"hljs-comment\"># hex</span>\n  ^ \\d*\\.?\\d+ (?:e[+-]?\\d+)?  <span class=\"hljs-comment\"># decimal</span>\n///</span>i\n\nOPERATOR   = <span class=\"hljs-regexp\">/// ^ (\n  ?: [-=]&gt;             <span class=\"hljs-comment\"># function</span>\n   | [-+*/%&lt;&gt;&amp;|^!?=]=  <span class=\"hljs-comment\"># compound assign / compare</span>\n   | &gt;&gt;&gt;=?             <span class=\"hljs-comment\"># zero-fill right shift</span>\n   | ([-+:])\\1         <span class=\"hljs-comment\"># doubles</span>\n   | ([&amp;|&lt;&gt;*/%])\\2=?   <span class=\"hljs-comment\"># logic / shift / power / floor division / modulo</span>\n   | \\?(\\.|::)         <span class=\"hljs-comment\"># soak access</span>\n   | \\.{2,3}           <span class=\"hljs-comment\"># range or splat</span>\n) ///</span>\n\nWHITESPACE = <span class=\"hljs-regexp\">/^[^\\n\\S]+/</span>\n\nCOMMENT    = <span class=\"hljs-regexp\">/^###([^#][\\s\\S]*?)(?:###[^\\n\\S]*|###$)|^(?:\\s*#(?!##[^#]).*)+/</span>\n\nCODE       = <span class=\"hljs-regexp\">/^[-=]&gt;/</span>\n\nMULTI_DENT = <span class=\"hljs-regexp\">/^(?:\\n[^\\n\\S]*)+/</span>\n\nJSTOKEN      = <span class=\"hljs-regexp\">///^ `(?!``) ((?: [^`\\\\] | \\\\[\\s\\S]           )*) `   ///</span>\nHERE_JSTOKEN = <span class=\"hljs-regexp\">///^ ```     ((?: [^`\\\\] | \\\\[\\s\\S] | `(?!``) )*) ``` ///</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-80\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-80\">&#182;</a>\n              </div>\n              <p>String-matching-regexes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>STRING_START   = <span class=\"hljs-regexp\">/^(?:'''|\"\"\"|'|\")/</span>\n\nSTRING_SINGLE  = <span class=\"hljs-regexp\">/// ^(?: [^\\\\']  | \\\\[\\s\\S]                      )* ///</span>\nSTRING_DOUBLE  = <span class=\"hljs-regexp\">/// ^(?: [^\\\\\"<span class=\"hljs-comment\">#] | \\\\[\\s\\S] |           \\#(?!\\{) )* ///</span>\nHEREDOC_SINGLE = ///</span> ^(?: [^\\\\<span class=\"hljs-string\">']  | \\\\[\\s\\S] | '</span>(?!<span class=\"hljs-string\">''</span>)            )* <span class=\"hljs-regexp\">///\nHEREDOC_DOUBLE = ///</span> ^(?: [^\\\\<span class=\"hljs-string\">\"#] | \\\\[\\s\\S] | \"</span>(?!<span class=\"hljs-string\">\"\"</span>) | \\<span class=\"hljs-comment\">#(?!\\{) )* ///</span>\n\nSTRING_OMIT    = <span class=\"hljs-regexp\">///\n    ((?:\\\\\\\\)+)      <span class=\"hljs-comment\"># consume (and preserve) an even number of backslashes</span>\n  | \\\\[^\\S\\n]*\\n\\s*  <span class=\"hljs-comment\"># remove escaped newlines</span>\n///</span>g\nSIMPLE_STRING_OMIT = <span class=\"hljs-regexp\">/\\s*\\n\\s*/g</span>\nHEREDOC_INDENT     = <span class=\"hljs-regexp\">/\\n+([^\\n\\S]*)(?=\\S)/g</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-81\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-81\">&#182;</a>\n              </div>\n              <p>Regex-matching-regexes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>REGEX = <span class=\"hljs-regexp\">/// ^\n  / (?!/) ((\n  ?: [^ [ / \\n \\\\ ]  <span class=\"hljs-comment\"># every other thing</span>\n   | \\\\[^\\n]         <span class=\"hljs-comment\"># anything but newlines escaped</span>\n   | \\[              <span class=\"hljs-comment\"># character class</span>\n       (?: \\\\[^\\n] | [^ \\] \\n \\\\ ] )*\n     \\]\n  )*) (/)?\n///</span>\n\nREGEX_FLAGS  = <span class=\"hljs-regexp\">/^\\w*/</span>\nVALID_FLAGS  = <span class=\"hljs-regexp\">/^(?!.*(.).*\\1)[imguy]*$/</span>\n\nHEREGEX      = <span class=\"hljs-regexp\">/// ^(?: [^\\\\/<span class=\"hljs-comment\">#] | \\\\[\\s\\S] | /(?!//) | \\#(?!\\{) )* ///</span>\n\nHEREGEX_OMIT = ///</span>\n    ((?:\\\\\\\\)+)     <span class=\"hljs-comment\"># consume (and preserve) an even number of backslashes</span>\n  | \\\\(\\s)          <span class=\"hljs-comment\"># preserve escaped whitespace</span>\n  | \\s+(?:<span class=\"hljs-comment\">#.*)?     # remove whitespace and comments</span>\n<span class=\"hljs-regexp\">///g\n\nREGEX_ILLEGAL = ///</span> ^ ( / | <span class=\"hljs-regexp\">/{3}\\s*) (\\*) /</span><span class=\"hljs-regexp\">//</span>\n\nPOSSIBLY_DIVISION   = <span class=\"hljs-regexp\">/// ^ /=?\\s ///</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-82\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-82\">&#182;</a>\n              </div>\n              <p>Other regexes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>HERECOMMENT_ILLEGAL = <span class=\"hljs-regexp\">/\\*\\//</span>\n\nLINE_CONTINUER      = <span class=\"hljs-regexp\">/// ^ \\s* (?: , | \\??\\.(?![.\\d]) | :: ) ///</span>\n\nSTRING_INVALID_ESCAPE = <span class=\"hljs-regexp\">///\n  ( (?:^|[^\\\\]) (?:\\\\\\\\)* )        <span class=\"hljs-comment\"># make sure the escape isn’t escaped</span>\n  \\\\ (\n     ?: (0[0-7]|[1-7])             <span class=\"hljs-comment\"># octal escape</span>\n      | (x(?![\\da-fA-F]{2}).{0,2}) <span class=\"hljs-comment\"># hex escape</span>\n      | (u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?) <span class=\"hljs-comment\"># unicode code point escape</span>\n      | (u(?!\\{|[\\da-fA-F]{4}).{0,4}) <span class=\"hljs-comment\"># unicode escape</span>\n  )\n///</span>\nREGEX_INVALID_ESCAPE = <span class=\"hljs-regexp\">///\n  ( (?:^|[^\\\\]) (?:\\\\\\\\)* )        <span class=\"hljs-comment\"># make sure the escape isn’t escaped</span>\n  \\\\ (\n     ?: (0[0-7])                   <span class=\"hljs-comment\"># octal escape</span>\n      | (x(?![\\da-fA-F]{2}).{0,2}) <span class=\"hljs-comment\"># hex escape</span>\n      | (u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?) <span class=\"hljs-comment\"># unicode code point escape</span>\n      | (u(?!\\{|[\\da-fA-F]{4}).{0,4}) <span class=\"hljs-comment\"># unicode escape</span>\n  )\n///</span>\n\nUNICODE_CODE_POINT_ESCAPE = <span class=\"hljs-regexp\">///\n  ( \\\\\\\\ )        <span class=\"hljs-comment\"># make sure the escape isn’t escaped</span>\n  |\n  \\\\u\\{ ( [\\da-fA-F]+ ) \\}\n///</span>g\n\nLEADING_BLANK_LINE  = <span class=\"hljs-regexp\">/^[^\\n\\S]*\\n/</span>\nTRAILING_BLANK_LINE = <span class=\"hljs-regexp\">/\\n[^\\n\\S]*$/</span>\n\nTRAILING_SPACES     = <span class=\"hljs-regexp\">/\\s+$/</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-83\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-83\">&#182;</a>\n              </div>\n              <p>Compound assignment tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>COMPOUND_ASSIGN = [\n  <span class=\"hljs-string\">'-='</span>, <span class=\"hljs-string\">'+='</span>, <span class=\"hljs-string\">'/='</span>, <span class=\"hljs-string\">'*='</span>, <span class=\"hljs-string\">'%='</span>, <span class=\"hljs-string\">'||='</span>, <span class=\"hljs-string\">'&amp;&amp;='</span>, <span class=\"hljs-string\">'?='</span>, <span class=\"hljs-string\">'&lt;&lt;='</span>, <span class=\"hljs-string\">'&gt;&gt;='</span>, <span class=\"hljs-string\">'&gt;&gt;&gt;='</span>\n  <span class=\"hljs-string\">'&amp;='</span>, <span class=\"hljs-string\">'^='</span>, <span class=\"hljs-string\">'|='</span>, <span class=\"hljs-string\">'**='</span>, <span class=\"hljs-string\">'//='</span>, <span class=\"hljs-string\">'%%='</span>\n]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-84\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-84\">&#182;</a>\n              </div>\n              <p>Unary tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>UNARY = [<span class=\"hljs-string\">'NEW'</span>, <span class=\"hljs-string\">'TYPEOF'</span>, <span class=\"hljs-string\">'DELETE'</span>, <span class=\"hljs-string\">'DO'</span>]\n\nUNARY_MATH = [<span class=\"hljs-string\">'!'</span>, <span class=\"hljs-string\">'~'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-85\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-85\">&#182;</a>\n              </div>\n              <p>Bit-shifting tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>SHIFT = [<span class=\"hljs-string\">'&lt;&lt;'</span>, <span class=\"hljs-string\">'&gt;&gt;'</span>, <span class=\"hljs-string\">'&gt;&gt;&gt;'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-86\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-86\">&#182;</a>\n              </div>\n              <p>Comparison tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>COMPARE = [<span class=\"hljs-string\">'=='</span>, <span class=\"hljs-string\">'!='</span>, <span class=\"hljs-string\">'&lt;'</span>, <span class=\"hljs-string\">'&gt;'</span>, <span class=\"hljs-string\">'&lt;='</span>, <span class=\"hljs-string\">'&gt;='</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-87\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-87\">&#182;</a>\n              </div>\n              <p>Mathematical tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>MATH = [<span class=\"hljs-string\">'*'</span>, <span class=\"hljs-string\">'/'</span>, <span class=\"hljs-string\">'%'</span>, <span class=\"hljs-string\">'//'</span>, <span class=\"hljs-string\">'%%'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-88\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-88\">&#182;</a>\n              </div>\n              <p>Relational tokens that are negatable with <code>not</code> prefix.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>RELATION = [<span class=\"hljs-string\">'IN'</span>, <span class=\"hljs-string\">'OF'</span>, <span class=\"hljs-string\">'INSTANCEOF'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-89\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-89\">&#182;</a>\n              </div>\n              <p>Boolean tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>BOOL = [<span class=\"hljs-string\">'TRUE'</span>, <span class=\"hljs-string\">'FALSE'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-90\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-90\">&#182;</a>\n              </div>\n              <p>Tokens which could legitimately be invoked or indexed. An opening\nparentheses or bracket following these tokens will be recorded as the start\nof a function invocation or indexing operation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CALLABLE  = [<span class=\"hljs-string\">'IDENTIFIER'</span>, <span class=\"hljs-string\">'PROPERTY'</span>, <span class=\"hljs-string\">')'</span>, <span class=\"hljs-string\">']'</span>, <span class=\"hljs-string\">'?'</span>, <span class=\"hljs-string\">'@'</span>, <span class=\"hljs-string\">'THIS'</span>, <span class=\"hljs-string\">'SUPER'</span>]\nINDEXABLE = CALLABLE.concat [\n  <span class=\"hljs-string\">'NUMBER'</span>, <span class=\"hljs-string\">'INFINITY'</span>, <span class=\"hljs-string\">'NAN'</span>, <span class=\"hljs-string\">'STRING'</span>, <span class=\"hljs-string\">'STRING_END'</span>, <span class=\"hljs-string\">'REGEX'</span>, <span class=\"hljs-string\">'REGEX_END'</span>\n  <span class=\"hljs-string\">'BOOL'</span>, <span class=\"hljs-string\">'NULL'</span>, <span class=\"hljs-string\">'UNDEFINED'</span>, <span class=\"hljs-string\">'}'</span>, <span class=\"hljs-string\">'::'</span>\n]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-91\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-91\">&#182;</a>\n              </div>\n              <p>Tokens which a regular expression will never immediately follow (except spaced\nCALLABLEs in some cases), but which a division operator can.</p>\n<p>See: <a href=\"http://www-archive.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions\">http://www-archive.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions</a></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>NOT_REGEX = INDEXABLE.concat [<span class=\"hljs-string\">'++'</span>, <span class=\"hljs-string\">'--'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-92\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-92\">&#182;</a>\n              </div>\n              <p>Tokens that, when immediately preceding a <code>WHEN</code>, indicate that the <code>WHEN</code>\noccurs at the start of a line. We disambiguate these from trailing whens to\navoid an ambiguity in the grammar.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>LINE_BREAK = [<span class=\"hljs-string\">'INDENT'</span>, <span class=\"hljs-string\">'OUTDENT'</span>, <span class=\"hljs-string\">'TERMINATOR'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-93\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-93\">&#182;</a>\n              </div>\n              <p>Additional indent in front of these is ignored.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>INDENTABLE_CLOSERS = [<span class=\"hljs-string\">')'</span>, <span class=\"hljs-string\">'}'</span>, <span class=\"hljs-string\">']'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-94\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-94\">&#182;</a>\n              </div>\n              <p>Tokens that, when appearing at the end of a line, suppress a following TERMINATOR/INDENT token</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>UNFINISHED = [<span class=\"hljs-string\">'\\\\'</span>, <span class=\"hljs-string\">'.'</span>, <span class=\"hljs-string\">'?.'</span>, <span class=\"hljs-string\">'?::'</span>, <span class=\"hljs-string\">'UNARY'</span>, <span class=\"hljs-string\">'MATH'</span>, <span class=\"hljs-string\">'UNARY_MATH'</span>, <span class=\"hljs-string\">'+'</span>, <span class=\"hljs-string\">'-'</span>,\n           <span class=\"hljs-string\">'**'</span>, <span class=\"hljs-string\">'SHIFT'</span>, <span class=\"hljs-string\">'RELATION'</span>, <span class=\"hljs-string\">'COMPARE'</span>, <span class=\"hljs-string\">'&amp;'</span>, <span class=\"hljs-string\">'^'</span>, <span class=\"hljs-string\">'|'</span>, <span class=\"hljs-string\">'&amp;&amp;'</span>, <span class=\"hljs-string\">'||'</span>,\n           <span class=\"hljs-string\">'BIN?'</span>, <span class=\"hljs-string\">'THROW'</span>, <span class=\"hljs-string\">'EXTENDS'</span>, <span class=\"hljs-string\">'DEFAULT'</span>]</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/nodes.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>nodes.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>nodes.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              <p><code>nodes.coffee</code> contains all of the node classes for the syntax tree. Most\nnodes are created as the result of actions in the <a href=\"grammar.html\">grammar</a>,\nbut some are created by other nodes as a method of code generation. To convert\nthe syntax tree into a string of JavaScript code, call <code>compile()</code> on the root.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\nError.stackTraceLimit = Infinity\n\n{Scope} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./scope'</span>\n{isUnassignable, JS_FORBIDDEN} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./lexer'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Import the helpers we plan to use.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>{compact, flatten, extend, merge, del, starts, ends, some,\naddLocationDataFn, locationDataToString, throwSyntaxError} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./helpers'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Functions required by parser</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.extend = extend\nexports.addLocationDataFn = addLocationDataFn</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Constant functions for nodes that don’t need customization.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">YES</span>     = -&gt;</span> <span class=\"hljs-literal\">yes</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">NO</span>      = -&gt;</span> <span class=\"hljs-literal\">no</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">THIS</span>    = -&gt;</span> <span class=\"hljs-keyword\">this</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">NEGATE</span>  = -&gt;</span> @negated = <span class=\"hljs-keyword\">not</span> @negated; <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <h3 id=\"codefragment\">CodeFragment</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>The various nodes defined below all compile to a collection of <strong>CodeFragment</strong> objects.\nA CodeFragments is a block of generated code, and the location in the source file where the code\ncame from. CodeFragments can be assembled together into working code just by catting together\nall the CodeFragments’ <code>code</code> snippets, in order.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.CodeFragment = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">CodeFragment</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(parent, code)</span> -&gt;</span>\n    @code = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{code}</span>\"</span>\n    @locationData = parent?.locationData\n    @type = parent?.constructor?.name <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">'unknown'</span>\n\n  toString:   <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@code}</span><span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @locationData <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\": \"</span> + locationDataToString(@locationData) <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">''</span>}</span>\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Convert an array of CodeFragments into a string.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">fragmentsToText</span> = <span class=\"hljs-params\">(fragments)</span> -&gt;</span>\n  (fragment.code <span class=\"hljs-keyword\">for</span> fragment <span class=\"hljs-keyword\">in</span> fragments).join(<span class=\"hljs-string\">''</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <h3 id=\"base\">Base</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>The <strong>Base</strong> is the abstract base class for all nodes in the syntax tree.\nEach subclass implements the <code>compileNode</code> method, which performs the\ncode generation for that node. To compile a node to JavaScript,\ncall <code>compile</code> on it, which wraps <code>compileNode</code> in some generic extra smarts,\nto know when the generated code needs to be wrapped up in a closure.\nAn options hash is passed and cloned throughout, containing information about\nthe environment from higher in the tree (such as if a returned value is\nbeing requested by the surrounding function), information about the current\nscope, and indentation level.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Base = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Base</span></span>\n\n  compile: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, lvl)</span> -&gt;</span>\n    fragmentsToText @compileToFragments o, lvl</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>Common logic for determining whether to wrap this node in a closure before\ncompiling it, or to compile directly. We need to wrap if this node is a\n<em>statement</em>, and it’s not a <em>pureStatement</em>, and we’re not at\nthe top level of a block (which would be unnecessary), and we haven’t\nalready been asked to return the result (because statements know how to\nreturn results).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, lvl)</span> -&gt;</span>\n    o        = extend {}, o\n    o.level  = lvl <span class=\"hljs-keyword\">if</span> lvl\n    node     = @unfoldSoak(o) <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">this</span>\n    node.tab = o.indent\n    <span class=\"hljs-keyword\">if</span> o.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> node.isStatement(o)\n      node.compileNode o\n    <span class=\"hljs-keyword\">else</span>\n      node.compileClosure o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Statements converted into expressions via closure-wrapping share a scope\nobject with their parent closure, to preserve the expected lexical scope.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileClosure: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> jumpNode = @jumps()\n      jumpNode.error <span class=\"hljs-string\">'cannot use a pure statement in an expression'</span>\n    o.sharedScope = <span class=\"hljs-literal\">yes</span>\n    func = <span class=\"hljs-keyword\">new</span> Code [], Block.wrap [<span class=\"hljs-keyword\">this</span>]\n    args = []\n    <span class=\"hljs-keyword\">if</span> (argumentsNode = @contains isLiteralArguments) <span class=\"hljs-keyword\">or</span> @contains isLiteralThis\n      args = [<span class=\"hljs-keyword\">new</span> ThisLiteral]\n      <span class=\"hljs-keyword\">if</span> argumentsNode\n        meth = <span class=\"hljs-string\">'apply'</span>\n        args.push <span class=\"hljs-keyword\">new</span> IdentifierLiteral <span class=\"hljs-string\">'arguments'</span>\n      <span class=\"hljs-keyword\">else</span>\n        meth = <span class=\"hljs-string\">'call'</span>\n      func = <span class=\"hljs-keyword\">new</span> Value func, [<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName meth]\n    parts = (<span class=\"hljs-keyword\">new</span> Call func, args).compileNode o\n    <span class=\"hljs-keyword\">if</span> func.isGenerator <span class=\"hljs-keyword\">or</span> func.base?.isGenerator\n      parts.unshift @makeCode <span class=\"hljs-string\">\"(yield* \"</span>\n      parts.push    @makeCode <span class=\"hljs-string\">\")\"</span>\n    parts</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>If the code generation wishes to use the result of a complex expression\nin multiple places, ensure that the expression is only ever evaluated once,\nby assigning it to a temporary variable. Pass a level to precompile.</p>\n<p>If <code>level</code> is passed, then returns <code>[val, ref]</code>, where <code>val</code> is the compiled value, and <code>ref</code>\nis the compiled reference. If <code>level</code> is not passed, this returns <code>[val, ref]</code> where\nthe two values are raw nodes which have not been compiled.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  cache: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, level, isComplex)</span> -&gt;</span>\n    complex = <span class=\"hljs-keyword\">if</span> isComplex? <span class=\"hljs-keyword\">then</span> isComplex <span class=\"hljs-keyword\">this</span> <span class=\"hljs-keyword\">else</span> @isComplex()\n    <span class=\"hljs-keyword\">if</span> complex\n      ref = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">'ref'</span>\n      sub = <span class=\"hljs-keyword\">new</span> Assign ref, <span class=\"hljs-keyword\">this</span>\n      <span class=\"hljs-keyword\">if</span> level <span class=\"hljs-keyword\">then</span> [sub.compileToFragments(o, level), [@makeCode(ref.value)]] <span class=\"hljs-keyword\">else</span> [sub, ref]\n    <span class=\"hljs-keyword\">else</span>\n      ref = <span class=\"hljs-keyword\">if</span> level <span class=\"hljs-keyword\">then</span> @compileToFragments o, level <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">this</span>\n      [ref, ref]\n\n  cacheToCodeFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(cacheValues)</span> -&gt;</span>\n    [fragmentsToText(cacheValues[<span class=\"hljs-number\">0</span>]), fragmentsToText(cacheValues[<span class=\"hljs-number\">1</span>])]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Construct a node that returns the current node’s result.\nNote that this is overridden for smarter behavior for\nmany statement nodes (e.g. If, For)…</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  makeReturn: <span class=\"hljs-function\"><span class=\"hljs-params\">(res)</span> -&gt;</span>\n    me = @unwrapAll()\n    <span class=\"hljs-keyword\">if</span> res\n      <span class=\"hljs-keyword\">new</span> Call <span class=\"hljs-keyword\">new</span> Literal(<span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{res}</span>.push\"</span>), [me]\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">new</span> Return me</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>Does this node, or any of its children, contain a node of a certain kind?\nRecursively traverses down the <em>children</em> nodes and returns the first one\nthat verifies <code>pred</code>. Otherwise return undefined. <code>contains</code> does not cross\nscope boundaries.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  contains: <span class=\"hljs-function\"><span class=\"hljs-params\">(pred)</span> -&gt;</span>\n    node = <span class=\"hljs-literal\">undefined</span>\n    @traverseChildren <span class=\"hljs-literal\">no</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(n)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">if</span> pred n\n        node = n\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span>\n    node</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>Pull out the last non-comment node of a node list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  lastNonComment: <span class=\"hljs-function\"><span class=\"hljs-params\">(list)</span> -&gt;</span>\n    i = list.length\n    <span class=\"hljs-keyword\">return</span> list[i] <span class=\"hljs-keyword\">while</span> i-- <span class=\"hljs-keyword\">when</span> list[i] <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Comment\n    <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p><code>toString</code> representation of the node, for inspecting the parse tree.\nThis is what <code>coffee --nodes</code> prints out.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  toString: <span class=\"hljs-function\"><span class=\"hljs-params\">(idt = <span class=\"hljs-string\">''</span>, name = @constructor.name)</span> -&gt;</span>\n    tree = <span class=\"hljs-string\">'\\n'</span> + idt + name\n    tree += <span class=\"hljs-string\">'?'</span> <span class=\"hljs-keyword\">if</span> @soak\n    @eachChild (node) -&gt; tree += node.toString idt + TAB\n    tree</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>Passes each child to a function, breaking when the function returns <code>false</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  eachChild: <span class=\"hljs-function\"><span class=\"hljs-params\">(func)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span> <span class=\"hljs-keyword\">unless</span> @children\n    <span class=\"hljs-keyword\">for</span> attr <span class=\"hljs-keyword\">in</span> @children <span class=\"hljs-keyword\">when</span> @[attr]\n      <span class=\"hljs-keyword\">for</span> child <span class=\"hljs-keyword\">in</span> flatten [@[attr]]\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span> <span class=\"hljs-keyword\">if</span> func(child) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">false</span>\n    <span class=\"hljs-keyword\">this</span>\n\n  traverseChildren: <span class=\"hljs-function\"><span class=\"hljs-params\">(crossScope, func)</span> -&gt;</span>\n    @eachChild (child) -&gt;\n      recur = func(child)\n      child.traverseChildren(crossScope, func) <span class=\"hljs-keyword\">unless</span> recur <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">no</span>\n\n  invert: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'!'</span>, <span class=\"hljs-keyword\">this</span>\n\n  unwrapAll: <span class=\"hljs-function\">-&gt;</span>\n    node = <span class=\"hljs-keyword\">this</span>\n    <span class=\"hljs-keyword\">continue</span> <span class=\"hljs-keyword\">until</span> node <span class=\"hljs-keyword\">is</span> node = node.unwrap()\n    node</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>Default implementations of the common node properties and methods. Nodes\nwill override these with custom logic, if needed.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  children: []\n\n  isStatement     : NO\n  jumps           : NO\n  isComplex       : YES\n  isChainable     : NO\n  isAssignable    : NO\n  isNumber        : NO\n\n  unwrap     : THIS\n  unfoldSoak : NO</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>Is this node used to assign a certain variable?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  assigns: NO</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <p>For this node and all descendents, set the location data to <code>locationData</code>\nif the location data is not already set.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  updateLocationDataIfMissing: <span class=\"hljs-function\"><span class=\"hljs-params\">(locationData)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span> <span class=\"hljs-keyword\">if</span> @locationData\n    @locationData = locationData\n\n    @eachChild (child) -&gt;\n      child.updateLocationDataIfMissing locationData</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>\n              </div>\n              <p>Throw a SyntaxError associated with this node’s location.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  error: <span class=\"hljs-function\"><span class=\"hljs-params\">(message)</span> -&gt;</span>\n    throwSyntaxError message, @locationData\n\n  makeCode: <span class=\"hljs-function\"><span class=\"hljs-params\">(code)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">new</span> CodeFragment <span class=\"hljs-keyword\">this</span>, code\n\n  wrapInBraces: <span class=\"hljs-function\"><span class=\"hljs-params\">(fragments)</span> -&gt;</span>\n    [].concat @makeCode(<span class=\"hljs-string\">'('</span>), fragments, @makeCode(<span class=\"hljs-string\">')'</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>\n              </div>\n              <p><code>fragmentsList</code> is an array of arrays of fragments. Each array in fragmentsList will be\nconcatonated together, with <code>joinStr</code> added in between each, to produce a final flat array\nof fragments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  joinFragmentArrays: <span class=\"hljs-function\"><span class=\"hljs-params\">(fragmentsList, joinStr)</span> -&gt;</span>\n    answer = []\n    <span class=\"hljs-keyword\">for</span> fragments,i <span class=\"hljs-keyword\">in</span> fragmentsList\n      <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">then</span> answer.push @makeCode joinStr\n      answer = answer.concat fragments\n    answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-23\">&#182;</a>\n              </div>\n              <h3 id=\"block\">Block</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-24\">&#182;</a>\n              </div>\n              <p>The block is the list of expressions that forms the body of an\nindented block of code – the implementation of a function, a clause in an\n<code>if</code>, <code>switch</code>, or <code>try</code>, and so on…</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Block = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Block</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(nodes)</span> -&gt;</span>\n    @expressions = compact flatten nodes <span class=\"hljs-keyword\">or</span> []\n\n  children: [<span class=\"hljs-string\">'expressions'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-25\">&#182;</a>\n              </div>\n              <p>Tack an expression on to the end of this expression list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  push: <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> -&gt;</span>\n    @expressions.push node\n    <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-26\">&#182;</a>\n              </div>\n              <p>Remove and return the last expression of this expression list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  pop: <span class=\"hljs-function\">-&gt;</span>\n    @expressions.pop()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-27\">&#182;</a>\n              </div>\n              <p>Add an expression at the beginning of this expression list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unshift: <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> -&gt;</span>\n    @expressions.unshift node\n    <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-28\">&#182;</a>\n              </div>\n              <p>If this Block consists of just a single node, unwrap it by pulling\nit back out.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unwrap: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @expressions.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">then</span> @expressions[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-29\">&#182;</a>\n              </div>\n              <p>Is this an empty block of code?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  isEmpty: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">not</span> @expressions.length\n\n  isStatement: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> exp <span class=\"hljs-keyword\">in</span> @expressions <span class=\"hljs-keyword\">when</span> exp.isStatement o\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-literal\">no</span>\n\n  jumps: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> exp <span class=\"hljs-keyword\">in</span> @expressions\n      <span class=\"hljs-keyword\">return</span> jumpNode <span class=\"hljs-keyword\">if</span> jumpNode = exp.jumps o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-30\">&#182;</a>\n              </div>\n              <p>A Block node does not return its entire body, rather it\nensures that the final expression is returned.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  makeReturn: <span class=\"hljs-function\"><span class=\"hljs-params\">(res)</span> -&gt;</span>\n    len = @expressions.length\n    <span class=\"hljs-keyword\">while</span> len--\n      expr = @expressions[len]\n      <span class=\"hljs-keyword\">if</span> expr <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Comment\n        @expressions[len] = expr.makeReturn res\n        @expressions.splice(len, <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">if</span> expr <span class=\"hljs-keyword\">instanceof</span> Return <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> expr.expression\n        <span class=\"hljs-keyword\">break</span>\n    <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-31\">&#182;</a>\n              </div>\n              <p>A <strong>Block</strong> is the only node that can serve as the root.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o = {}, level)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> o.scope <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">super</span> o, level <span class=\"hljs-keyword\">else</span> @compileRoot o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-32\">&#182;</a>\n              </div>\n              <p>Compile all expressions within the <strong>Block</strong> body. If we need to\nreturn the result, and it’s an expression, simply return it. If it’s a\nstatement, ask the statement to do so.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @tab  = o.indent\n    top   = o.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP\n    compiledNodes = []\n\n    <span class=\"hljs-keyword\">for</span> node, index <span class=\"hljs-keyword\">in</span> @expressions\n\n      node = node.unwrapAll()\n      node = (node.unfoldSoak(o) <span class=\"hljs-keyword\">or</span> node)\n      <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> Block</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-33\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-33\">&#182;</a>\n              </div>\n              <p>This is a nested block. We don’t do anything special here like enclose\nit in a new scope; we just compile the statements in this block along with\nour own</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        compiledNodes.push node.compileNode o\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> top\n        node.front = <span class=\"hljs-literal\">true</span>\n        fragments = node.compileToFragments o\n        <span class=\"hljs-keyword\">unless</span> node.isStatement o\n          fragments.unshift @makeCode <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@tab}</span>\"</span>\n          fragments.push @makeCode <span class=\"hljs-string\">\";\"</span>\n        compiledNodes.push fragments\n      <span class=\"hljs-keyword\">else</span>\n        compiledNodes.push node.compileToFragments o, LEVEL_LIST\n    <span class=\"hljs-keyword\">if</span> top\n      <span class=\"hljs-keyword\">if</span> @spaced\n        <span class=\"hljs-keyword\">return</span> [].concat @joinFragmentArrays(compiledNodes, <span class=\"hljs-string\">'\\n\\n'</span>), @makeCode(<span class=\"hljs-string\">\"\\n\"</span>)\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">return</span> @joinFragmentArrays(compiledNodes, <span class=\"hljs-string\">'\\n'</span>)\n    <span class=\"hljs-keyword\">if</span> compiledNodes.length\n      answer = @joinFragmentArrays(compiledNodes, <span class=\"hljs-string\">', '</span>)\n    <span class=\"hljs-keyword\">else</span>\n      answer = [@makeCode <span class=\"hljs-string\">\"void 0\"</span>]\n    <span class=\"hljs-keyword\">if</span> compiledNodes.length &gt; <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> o.level &gt;= LEVEL_LIST <span class=\"hljs-keyword\">then</span> @wrapInBraces answer <span class=\"hljs-keyword\">else</span> answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-34\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-34\">&#182;</a>\n              </div>\n              <p>If we happen to be the top-level <strong>Block</strong>, wrap everything in\na safety closure, unless requested not to.\nIt would be better not to generate them in the first place, but for now,\nclean up obvious double-parentheses.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileRoot: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o.indent  = <span class=\"hljs-keyword\">if</span> o.bare <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">''</span> <span class=\"hljs-keyword\">else</span> TAB\n    o.level   = LEVEL_TOP\n    @spaced   = <span class=\"hljs-literal\">yes</span>\n    o.scope   = <span class=\"hljs-keyword\">new</span> Scope <span class=\"hljs-literal\">null</span>, <span class=\"hljs-keyword\">this</span>, <span class=\"hljs-literal\">null</span>, o.referencedVars ? []</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-35\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-35\">&#182;</a>\n              </div>\n              <p>Mark given local variables in the root scope as parameters so they don’t\nend up being declared on this block.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    o.scope.parameter name <span class=\"hljs-keyword\">for</span> name <span class=\"hljs-keyword\">in</span> o.locals <span class=\"hljs-keyword\">or</span> []\n    prelude   = []\n    <span class=\"hljs-keyword\">unless</span> o.bare\n      preludeExps = <span class=\"hljs-keyword\">for</span> exp, i <span class=\"hljs-keyword\">in</span> @expressions\n        <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> exp.unwrap() <span class=\"hljs-keyword\">instanceof</span> Comment\n        exp\n      rest = @expressions[preludeExps.length...]\n      @expressions = preludeExps\n      <span class=\"hljs-keyword\">if</span> preludeExps.length\n        prelude = @compileNode merge(o, indent: <span class=\"hljs-string\">''</span>)\n        prelude.push @makeCode <span class=\"hljs-string\">\"\\n\"</span>\n      @expressions = rest\n    fragments = @compileWithDeclarations o\n    <span class=\"hljs-keyword\">return</span> fragments <span class=\"hljs-keyword\">if</span> o.bare\n    [].concat prelude, @makeCode(<span class=\"hljs-string\">\"(function() {\\n\"</span>), fragments, @makeCode(<span class=\"hljs-string\">\"\\n}).call(this);\\n\"</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-36\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-36\">&#182;</a>\n              </div>\n              <p>Compile the expressions body for the contents of a function, with\ndeclarations of all inner variables pushed up to the top.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileWithDeclarations: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    fragments = []\n    post = []\n    <span class=\"hljs-keyword\">for</span> exp, i <span class=\"hljs-keyword\">in</span> @expressions\n      exp = exp.unwrap()\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> exp <span class=\"hljs-keyword\">instanceof</span> Comment <span class=\"hljs-keyword\">or</span> exp <span class=\"hljs-keyword\">instanceof</span> Literal\n    o = merge(o, level: LEVEL_TOP)\n    <span class=\"hljs-keyword\">if</span> i\n      rest = @expressions.splice i, <span class=\"hljs-number\">9e9</span>\n      [spaced,    @spaced] = [@spaced, <span class=\"hljs-literal\">no</span>]\n      [fragments, @spaced] = [@compileNode(o), spaced]\n      @expressions = rest\n    post = @compileNode o\n    {scope} = o\n    <span class=\"hljs-keyword\">if</span> scope.expressions <span class=\"hljs-keyword\">is</span> <span class=\"hljs-keyword\">this</span>\n      declars = o.scope.hasDeclarations()\n      assigns = scope.hasAssignments\n      <span class=\"hljs-keyword\">if</span> declars <span class=\"hljs-keyword\">or</span> assigns\n        fragments.push @makeCode <span class=\"hljs-string\">'\\n'</span> <span class=\"hljs-keyword\">if</span> i\n        fragments.push @makeCode <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@tab}</span>var \"</span>\n        <span class=\"hljs-keyword\">if</span> declars\n          fragments.push @makeCode scope.declaredVariables().join(<span class=\"hljs-string\">', '</span>)\n        <span class=\"hljs-keyword\">if</span> assigns\n          fragments.push @makeCode <span class=\"hljs-string\">\",\\n<span class=\"hljs-subst\">#{@tab + TAB}</span>\"</span> <span class=\"hljs-keyword\">if</span> declars\n          fragments.push @makeCode scope.assignedVariables().join(<span class=\"hljs-string\">\",\\n<span class=\"hljs-subst\">#{@tab + TAB}</span>\"</span>)\n        fragments.push @makeCode <span class=\"hljs-string\">\";\\n<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @spaced <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'\\n'</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">''</span>}</span>\"</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> fragments.length <span class=\"hljs-keyword\">and</span> post.length\n        fragments.push @makeCode <span class=\"hljs-string\">\"\\n\"</span>\n    fragments.concat post</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-37\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-37\">&#182;</a>\n              </div>\n              <p>Wrap up the given nodes as a <strong>Block</strong>, unless it already happens\nto be one.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  @wrap: <span class=\"hljs-function\"><span class=\"hljs-params\">(nodes)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> nodes[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">if</span> nodes.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> nodes[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">instanceof</span> Block\n    <span class=\"hljs-keyword\">new</span> Block nodes</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-38\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-38\">&#182;</a>\n              </div>\n              <h3 id=\"literal\">Literal</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-39\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-39\">&#182;</a>\n              </div>\n              <p><code>Literal</code> is a base class for static values that can be passed through\ndirectly into JavaScript without translation, such as: strings, numbers,\n<code>true</code>, <code>false</code>, <code>null</code>…</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Literal = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Literal</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@value)</span> -&gt;</span>\n\n  isComplex: NO\n\n  assigns: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    name <span class=\"hljs-keyword\">is</span> @value\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [@makeCode @value]\n\n  toString: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-string\">\" <span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @isStatement() <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">super</span> <span class=\"hljs-keyword\">else</span> @constructor.name}</span>: <span class=\"hljs-subst\">#{@value}</span>\"</span>\n\nexports.NumberLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NumberLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n\nexports.InfinityLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">InfinityLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">NumberLiteral</span></span>\n  compileNode: <span class=\"hljs-function\">-&gt;</span>\n    [@makeCode <span class=\"hljs-string\">'2e308'</span>]\n\nexports.NaNLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NaNLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">NumberLiteral</span></span>\n  constructor: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">super</span> <span class=\"hljs-string\">'NaN'</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    code = [@makeCode <span class=\"hljs-string\">'0/0'</span>]\n    <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_OP <span class=\"hljs-keyword\">then</span> @wrapInBraces code <span class=\"hljs-keyword\">else</span> code\n\nexports.StringLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">StringLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n\nexports.RegexLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RegexLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n\nexports.PassthroughLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">PassthroughLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n\nexports.IdentifierLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">IdentifierLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  isAssignable: YES\n\nexports.PropertyName = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">PropertyName</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  isAssignable: YES\n\nexports.StatementLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">StatementLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  isStatement: YES\n\n  makeReturn: THIS\n\n  jumps: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span> <span class=\"hljs-keyword\">if</span> @value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'break'</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> (o?.<span class=\"hljs-keyword\">loop</span> <span class=\"hljs-keyword\">or</span> o?.block)\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span> <span class=\"hljs-keyword\">if</span> @value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'continue'</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> o?.<span class=\"hljs-keyword\">loop</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [@makeCode <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@tab}</span><span class=\"hljs-subst\">#{@value}</span>;\"</span>]\n\nexports.ThisLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ThisLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  constructor: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">super</span> <span class=\"hljs-string\">'this'</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    code = <span class=\"hljs-keyword\">if</span> o.scope.method?.bound <span class=\"hljs-keyword\">then</span> o.scope.method.context <span class=\"hljs-keyword\">else</span> @value\n    [@makeCode code]\n\nexports.UndefinedLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">UndefinedLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  constructor: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">super</span> <span class=\"hljs-string\">'undefined'</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [@makeCode <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_ACCESS <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'(void 0)'</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">'void 0'</span>]\n\nexports.NullLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NullLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  constructor: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">super</span> <span class=\"hljs-string\">'null'</span>\n\nexports.BooleanLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">BooleanLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-40\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-40\">&#182;</a>\n              </div>\n              <h3 id=\"return\">Return</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-41\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-41\">&#182;</a>\n              </div>\n              <p>A <code>return</code> is a <em>pureStatement</em> – wrapping it in a closure wouldn’t\nmake sense.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Return = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Return</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@expression)</span> -&gt;</span>\n\n  children: [<span class=\"hljs-string\">'expression'</span>]\n\n  isStatement:     YES\n  makeReturn:      THIS\n  jumps:           THIS\n\n  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, level)</span> -&gt;</span>\n    expr = @expression?.makeReturn()\n    <span class=\"hljs-keyword\">if</span> expr <span class=\"hljs-keyword\">and</span> expr <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Return <span class=\"hljs-keyword\">then</span> expr.compileToFragments o, level <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">super</span> o, level\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    answer = []</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-42\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-42\">&#182;</a>\n              </div>\n              <p>TODO: If we call expression.compile() here twice, we’ll sometimes get back different results!</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    answer.push @makeCode @tab + <span class=\"hljs-string\">\"return<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @expression <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\" \"</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">\"\"</span>}</span>\"</span>\n    <span class=\"hljs-keyword\">if</span> @expression\n      answer = answer.concat @expression.compileToFragments o, LEVEL_PAREN\n    answer.push @makeCode <span class=\"hljs-string\">\";\"</span>\n    <span class=\"hljs-keyword\">return</span> answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-43\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-43\">&#182;</a>\n              </div>\n              <p><code>yield return</code> works exactly like <code>return</code>, except that it turns the function\ninto a generator.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.YieldReturn = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">YieldReturn</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Return</span></span>\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">unless</span> o.scope.parent?\n      @error <span class=\"hljs-string\">'yield can only occur inside functions'</span>\n    <span class=\"hljs-keyword\">super</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-44\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-44\">&#182;</a>\n              </div>\n              <h3 id=\"value\">Value</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-45\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-45\">&#182;</a>\n              </div>\n              <p>A value, variable or literal or parenthesized, indexed or dotted into,\nor vanilla.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Value = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Value</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(base, props, tag)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> base <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> props <span class=\"hljs-keyword\">and</span> base <span class=\"hljs-keyword\">instanceof</span> Value\n    @base       = base\n    @properties = props <span class=\"hljs-keyword\">or</span> []\n    @[tag]      = <span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> tag\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>\n\n  children: [<span class=\"hljs-string\">'base'</span>, <span class=\"hljs-string\">'properties'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-46\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-46\">&#182;</a>\n              </div>\n              <p>Add a property (or <em>properties</em> ) <code>Access</code> to the list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  add: <span class=\"hljs-function\"><span class=\"hljs-params\">(props)</span> -&gt;</span>\n    @properties = @properties.concat props\n    <span class=\"hljs-keyword\">this</span>\n\n  hasProperties: <span class=\"hljs-function\">-&gt;</span>\n    !!@properties.length\n\n  bareLiteral: <span class=\"hljs-function\"><span class=\"hljs-params\">(type)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">not</span> @properties.length <span class=\"hljs-keyword\">and</span> @base <span class=\"hljs-keyword\">instanceof</span> type</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-47\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-47\">&#182;</a>\n              </div>\n              <p>Some boolean checks for the benefit of other nodes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  isArray        : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(Arr)\n  isRange        : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(Range)\n  isComplex      : <span class=\"hljs-function\">-&gt;</span> @hasProperties() <span class=\"hljs-keyword\">or</span> @base.isComplex()\n  isAssignable   : <span class=\"hljs-function\">-&gt;</span> @hasProperties() <span class=\"hljs-keyword\">or</span> @base.isAssignable()\n  isNumber       : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(NumberLiteral)\n  isString       : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(StringLiteral)\n  isRegex        : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(RegexLiteral)\n  isUndefined    : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(UndefinedLiteral)\n  isNull         : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(NullLiteral)\n  isBoolean      : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(BooleanLiteral)\n  isAtomic       : <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">for</span> node <span class=\"hljs-keyword\">in</span> @properties.concat @base\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">if</span> node.soak <span class=\"hljs-keyword\">or</span> node <span class=\"hljs-keyword\">instanceof</span> Call\n    <span class=\"hljs-literal\">yes</span>\n\n  isNotCallable  : <span class=\"hljs-function\">-&gt;</span> @isNumber() <span class=\"hljs-keyword\">or</span> @isString() <span class=\"hljs-keyword\">or</span> @isRegex() <span class=\"hljs-keyword\">or</span>\n                      @isArray() <span class=\"hljs-keyword\">or</span> @isRange() <span class=\"hljs-keyword\">or</span> @isSplice() <span class=\"hljs-keyword\">or</span> @isObject() <span class=\"hljs-keyword\">or</span>\n                      @isUndefined() <span class=\"hljs-keyword\">or</span> @isNull() <span class=\"hljs-keyword\">or</span> @isBoolean()\n\n  isStatement : <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span>    -&gt;</span> <span class=\"hljs-keyword\">not</span> @properties.length <span class=\"hljs-keyword\">and</span> @base.isStatement o\n  assigns     : <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span> <span class=\"hljs-keyword\">not</span> @properties.length <span class=\"hljs-keyword\">and</span> @base.assigns name\n  jumps       : <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span>    -&gt;</span> <span class=\"hljs-keyword\">not</span> @properties.length <span class=\"hljs-keyword\">and</span> @base.jumps o\n\n  isObject: <span class=\"hljs-function\"><span class=\"hljs-params\">(onlyGenerated)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">if</span> @properties.length\n    (@base <span class=\"hljs-keyword\">instanceof</span> Obj) <span class=\"hljs-keyword\">and</span> (<span class=\"hljs-keyword\">not</span> onlyGenerated <span class=\"hljs-keyword\">or</span> @base.generated)\n\n  isSplice: <span class=\"hljs-function\">-&gt;</span>\n    [..., lastProp] = @properties\n    lastProp <span class=\"hljs-keyword\">instanceof</span> Slice\n\n  looksStatic: <span class=\"hljs-function\"><span class=\"hljs-params\">(className)</span> -&gt;</span>\n    @base.value <span class=\"hljs-keyword\">is</span> className <span class=\"hljs-keyword\">and</span> @properties.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span>\n      @properties[<span class=\"hljs-number\">0</span>].name?.value <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'prototype'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-48\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-48\">&#182;</a>\n              </div>\n              <p>The value can be unwrapped as its inner node, if there are no attached\nproperties.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unwrap: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @properties.length <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">this</span> <span class=\"hljs-keyword\">else</span> @base</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-49\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-49\">&#182;</a>\n              </div>\n              <p>A reference has base part (<code>this</code> value) and name part.\nWe cache them separately for compiling complex expressions.\n<code>a()[b()] ?= c</code> -&gt; <code>(_base = a())[_name = b()] ? _base[_name] = c</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  cacheReference: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [..., name] = @properties\n    <span class=\"hljs-keyword\">if</span> @properties.length &lt; <span class=\"hljs-number\">2</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @base.isComplex() <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> name?.isComplex()\n      <span class=\"hljs-keyword\">return</span> [<span class=\"hljs-keyword\">this</span>, <span class=\"hljs-keyword\">this</span>]  <span class=\"hljs-comment\"># `a` `a.b`</span>\n    base = <span class=\"hljs-keyword\">new</span> Value @base, @properties[...<span class=\"hljs-number\">-1</span>]\n    <span class=\"hljs-keyword\">if</span> base.isComplex()  <span class=\"hljs-comment\"># `a().b`</span>\n      bref = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">'base'</span>\n      base = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Parens <span class=\"hljs-keyword\">new</span> Assign bref, base\n    <span class=\"hljs-keyword\">return</span> [base, bref] <span class=\"hljs-keyword\">unless</span> name  <span class=\"hljs-comment\"># `a()`</span>\n    <span class=\"hljs-keyword\">if</span> name.isComplex()  <span class=\"hljs-comment\"># `a[b()]`</span>\n      nref = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">'name'</span>\n      name = <span class=\"hljs-keyword\">new</span> Index <span class=\"hljs-keyword\">new</span> Assign nref, name.index\n      nref = <span class=\"hljs-keyword\">new</span> Index nref\n    [base.add(name), <span class=\"hljs-keyword\">new</span> Value(bref <span class=\"hljs-keyword\">or</span> base.base, [nref <span class=\"hljs-keyword\">or</span> name])]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-50\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-50\">&#182;</a>\n              </div>\n              <p>We compile a value to JavaScript by compiling and joining each property.\nThings get much more interesting if the chain of properties has <em>soak</em>\noperators <code>?.</code> interspersed. Then we have to take care not to accidentally\nevaluate anything twice when building the soak chain.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @base.front = @front\n    props = @properties\n    fragments = @base.compileToFragments o, (<span class=\"hljs-keyword\">if</span> props.length <span class=\"hljs-keyword\">then</span> LEVEL_ACCESS <span class=\"hljs-keyword\">else</span> <span class=\"hljs-literal\">null</span>)\n    <span class=\"hljs-keyword\">if</span> props.length <span class=\"hljs-keyword\">and</span> SIMPLENUM.test fragmentsToText fragments\n      fragments.push @makeCode <span class=\"hljs-string\">'.'</span>\n    <span class=\"hljs-keyword\">for</span> prop <span class=\"hljs-keyword\">in</span> props\n      fragments.push (prop.compileToFragments o)...\n    fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-51\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-51\">&#182;</a>\n              </div>\n              <p>Unfold a soak into an <code>If</code>: <code>a?.b</code> -&gt; <code>a.b if a?</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unfoldSoak: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @unfoldedSoak ?= <span class=\"hljs-keyword\">do</span> =&gt;\n      <span class=\"hljs-keyword\">if</span> ifn = @base.unfoldSoak o\n        ifn.body.properties.push @properties...\n        <span class=\"hljs-keyword\">return</span> ifn\n      <span class=\"hljs-keyword\">for</span> prop, i <span class=\"hljs-keyword\">in</span> @properties <span class=\"hljs-keyword\">when</span> prop.soak\n        prop.soak = <span class=\"hljs-literal\">off</span>\n        fst = <span class=\"hljs-keyword\">new</span> Value @base, @properties[...i]\n        snd = <span class=\"hljs-keyword\">new</span> Value @base, @properties[i..]\n        <span class=\"hljs-keyword\">if</span> fst.isComplex()\n          ref = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">'ref'</span>\n          fst = <span class=\"hljs-keyword\">new</span> Parens <span class=\"hljs-keyword\">new</span> Assign ref, fst\n          snd.base = ref\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> If <span class=\"hljs-keyword\">new</span> Existence(fst), snd, soak: <span class=\"hljs-literal\">on</span>\n      <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-52\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-52\">&#182;</a>\n              </div>\n              <h3 id=\"comment\">Comment</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-53\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-53\">&#182;</a>\n              </div>\n              <p>CoffeeScript passes through block comments as JavaScript block comments\nat the same position.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Comment = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Comment</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@comment)</span> -&gt;</span>\n\n  isStatement:     YES\n  makeReturn:      THIS\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, level)</span> -&gt;</span>\n    comment = @comment.replace <span class=\"hljs-regexp\">/^(\\s*)#(?=\\s)/gm</span>, <span class=\"hljs-string\">\"$1 *\"</span>\n    code = <span class=\"hljs-string\">\"/*<span class=\"hljs-subst\">#{multident comment, @tab}</span><span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">'\\n'</span> <span class=\"hljs-keyword\">in</span> comment <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{@tab}</span>\"</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">''</span>}</span> */\"</span>\n    code = o.indent + code <span class=\"hljs-keyword\">if</span> (level <span class=\"hljs-keyword\">or</span> o.level) <span class=\"hljs-keyword\">is</span> LEVEL_TOP\n    [@makeCode(<span class=\"hljs-string\">\"\\n\"</span>), @makeCode(code)]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-54\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-54\">&#182;</a>\n              </div>\n              <h3 id=\"call\">Call</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-55\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-55\">&#182;</a>\n              </div>\n              <p>Node for a function invocation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Call = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Call</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@variable, @args = [], @soak)</span> -&gt;</span>\n    @isNew    = <span class=\"hljs-literal\">false</span>\n    <span class=\"hljs-keyword\">if</span> @variable <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> @variable.isNotCallable()\n      @variable.error <span class=\"hljs-string\">\"literal is not a function\"</span>\n\n  children: [<span class=\"hljs-string\">'variable'</span>, <span class=\"hljs-string\">'args'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-56\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-56\">&#182;</a>\n              </div>\n              <p>When setting the location, we sometimes need to update the start location to\naccount for a newly-discovered <code>new</code> operator to the left of us. This\nexpands the range on the left, but not the right.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  updateLocationDataIfMissing: <span class=\"hljs-function\"><span class=\"hljs-params\">(locationData)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @locationData <span class=\"hljs-keyword\">and</span> @needsUpdatedStartLocation\n      @locationData.first_line = locationData.first_line\n      @locationData.first_column = locationData.first_column\n      base = @variable?.base <span class=\"hljs-keyword\">or</span> @variable\n      <span class=\"hljs-keyword\">if</span> base.needsUpdatedStartLocation\n        @variable.locationData.first_line = locationData.first_line\n        @variable.locationData.first_column = locationData.first_column\n        base.updateLocationDataIfMissing locationData\n      <span class=\"hljs-keyword\">delete</span> @needsUpdatedStartLocation\n    <span class=\"hljs-keyword\">super</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-57\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-57\">&#182;</a>\n              </div>\n              <p>Tag this invocation as creating a new instance.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  newInstance: <span class=\"hljs-function\">-&gt;</span>\n    base = @variable?.base <span class=\"hljs-keyword\">or</span> @variable\n    <span class=\"hljs-keyword\">if</span> base <span class=\"hljs-keyword\">instanceof</span> Call <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> base.isNew\n      base.newInstance()\n    <span class=\"hljs-keyword\">else</span>\n      @isNew = <span class=\"hljs-literal\">true</span>\n    @needsUpdatedStartLocation = <span class=\"hljs-literal\">true</span>\n    <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-58\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-58\">&#182;</a>\n              </div>\n              <p>Soaked chained invocations unfold into if/else ternary structures.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unfoldSoak: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @soak\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">this</span> <span class=\"hljs-keyword\">instanceof</span> SuperCall\n        left = <span class=\"hljs-keyword\">new</span> Literal @superReference o\n        rite = <span class=\"hljs-keyword\">new</span> Value left\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">return</span> ifn <span class=\"hljs-keyword\">if</span> ifn = unfoldSoak o, <span class=\"hljs-keyword\">this</span>, <span class=\"hljs-string\">'variable'</span>\n        [left, rite] = <span class=\"hljs-keyword\">new</span> Value(@variable).cacheReference o\n      rite = <span class=\"hljs-keyword\">new</span> Call rite, @args\n      rite.isNew = @isNew\n      left = <span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">\"typeof <span class=\"hljs-subst\">#{ left.compile o }</span> === \\\"function\\\"\"</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> If left, <span class=\"hljs-keyword\">new</span> Value(rite), soak: <span class=\"hljs-literal\">yes</span>\n    call = <span class=\"hljs-keyword\">this</span>\n    list = []\n    <span class=\"hljs-keyword\">loop</span>\n      <span class=\"hljs-keyword\">if</span> call.variable <span class=\"hljs-keyword\">instanceof</span> Call\n        list.push call\n        call = call.variable\n        <span class=\"hljs-keyword\">continue</span>\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> call.variable <span class=\"hljs-keyword\">instanceof</span> Value\n      list.push call\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> (call = call.variable.base) <span class=\"hljs-keyword\">instanceof</span> Call\n    <span class=\"hljs-keyword\">for</span> call <span class=\"hljs-keyword\">in</span> list.reverse()\n      <span class=\"hljs-keyword\">if</span> ifn\n        <span class=\"hljs-keyword\">if</span> call.variable <span class=\"hljs-keyword\">instanceof</span> Call\n          call.variable = ifn\n        <span class=\"hljs-keyword\">else</span>\n          call.variable.base = ifn\n      ifn = unfoldSoak o, call, <span class=\"hljs-string\">'variable'</span>\n    ifn</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-59\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-59\">&#182;</a>\n              </div>\n              <p>Compile a vanilla function call.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @variable?.front = @front\n    compiledArray = Splat.compileSplattedArray o, @args, <span class=\"hljs-literal\">true</span>\n    <span class=\"hljs-keyword\">if</span> compiledArray.length\n      <span class=\"hljs-keyword\">return</span> @compileSplat o, compiledArray\n    compiledArgs = []\n    <span class=\"hljs-keyword\">for</span> arg, argIndex <span class=\"hljs-keyword\">in</span> @args\n      <span class=\"hljs-keyword\">if</span> argIndex <span class=\"hljs-keyword\">then</span> compiledArgs.push @makeCode <span class=\"hljs-string\">\", \"</span>\n      compiledArgs.push (arg.compileToFragments o, LEVEL_LIST)...\n\n    fragments = []\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">this</span> <span class=\"hljs-keyword\">instanceof</span> SuperCall\n      preface = @superReference(o) + <span class=\"hljs-string\">\".call(<span class=\"hljs-subst\">#{@superThis(o)}</span>\"</span>\n      <span class=\"hljs-keyword\">if</span> compiledArgs.length <span class=\"hljs-keyword\">then</span> preface += <span class=\"hljs-string\">\", \"</span>\n      fragments.push @makeCode preface\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">if</span> @isNew <span class=\"hljs-keyword\">then</span> fragments.push @makeCode <span class=\"hljs-string\">'new '</span>\n      fragments.push @variable.compileToFragments(o, LEVEL_ACCESS)...\n      fragments.push @makeCode <span class=\"hljs-string\">\"(\"</span>\n    fragments.push compiledArgs...\n    fragments.push @makeCode <span class=\"hljs-string\">\")\"</span>\n    fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-60\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-60\">&#182;</a>\n              </div>\n              <p>If you call a function with a splat, it’s converted into a JavaScript\n<code>.apply()</code> call to allow an array of arguments to be passed.\nIf it’s a constructor, then things get real tricky. We have to inject an\ninner constructor in order to be able to pass the varargs.</p>\n<p>splatArgs is an array of CodeFragments to put into the ‘apply’.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileSplat: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, splatArgs)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">this</span> <span class=\"hljs-keyword\">instanceof</span> SuperCall\n      <span class=\"hljs-keyword\">return</span> [].concat @makeCode(<span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{ @superReference o }</span>.apply(<span class=\"hljs-subst\">#{@superThis(o)}</span>, \"</span>),\n        splatArgs, @makeCode(<span class=\"hljs-string\">\")\"</span>)\n\n    <span class=\"hljs-keyword\">if</span> @isNew\n      idt = @tab + TAB\n      <span class=\"hljs-keyword\">return</span> [].concat @makeCode(<span class=\"hljs-string\">\"\"\"\n        (function(func, args, ctor) {\n        <span class=\"hljs-subst\">#{idt}</span>ctor.prototype = func.prototype;\n        <span class=\"hljs-subst\">#{idt}</span>var child = new ctor, result = func.apply(child, args);\n        <span class=\"hljs-subst\">#{idt}</span>return Object(result) === result ? result : child;\n        <span class=\"hljs-subst\">#{@tab}</span>})(\"\"\"</span>),\n        (@variable.compileToFragments o, LEVEL_LIST),\n        @makeCode(<span class=\"hljs-string\">\", \"</span>), splatArgs, @makeCode(<span class=\"hljs-string\">\", function(){})\"</span>)\n\n    answer = []\n    base = <span class=\"hljs-keyword\">new</span> Value @variable\n    <span class=\"hljs-keyword\">if</span> (name = base.properties.pop()) <span class=\"hljs-keyword\">and</span> base.isComplex()\n      ref = o.scope.freeVariable <span class=\"hljs-string\">'ref'</span>\n      answer = answer.concat @makeCode(<span class=\"hljs-string\">\"(<span class=\"hljs-subst\">#{ref}</span> = \"</span>),\n        (base.compileToFragments o, LEVEL_LIST),\n        @makeCode(<span class=\"hljs-string\">\")\"</span>),\n        name.compileToFragments(o)\n    <span class=\"hljs-keyword\">else</span>\n      fun = base.compileToFragments o, LEVEL_ACCESS\n      fun = @wrapInBraces fun <span class=\"hljs-keyword\">if</span> SIMPLENUM.test fragmentsToText fun\n      <span class=\"hljs-keyword\">if</span> name\n        ref = fragmentsToText fun\n        fun.push (name.compileToFragments o)...\n      <span class=\"hljs-keyword\">else</span>\n        ref = <span class=\"hljs-string\">'null'</span>\n      answer = answer.concat fun\n    answer = answer.concat @makeCode(<span class=\"hljs-string\">\".apply(<span class=\"hljs-subst\">#{ref}</span>, \"</span>), splatArgs, @makeCode(<span class=\"hljs-string\">\")\"</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-61\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-61\">&#182;</a>\n              </div>\n              <h3 id=\"super\">Super</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-62\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-62\">&#182;</a>\n              </div>\n              <p>Takes care of converting <code>super()</code> calls into calls against the prototype’s\nfunction of the same name.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.SuperCall = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">SuperCall</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Call</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(args)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">super</span> <span class=\"hljs-literal\">null</span>, args ? [<span class=\"hljs-keyword\">new</span> Splat <span class=\"hljs-keyword\">new</span> IdentifierLiteral <span class=\"hljs-string\">'arguments'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-63\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-63\">&#182;</a>\n              </div>\n              <p>Allow to recognize a bare <code>super</code> call without parentheses and arguments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @isBare = args?</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-64\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-64\">&#182;</a>\n              </div>\n              <p>Grab the reference to the superclass’s implementation of the current\nmethod.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  superReference: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    method = o.scope.namedMethod()\n    <span class=\"hljs-keyword\">if</span> method?.klass\n      {klass, name, variable} = method\n      <span class=\"hljs-keyword\">if</span> klass.isComplex()\n        bref = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.parent.freeVariable <span class=\"hljs-string\">'base'</span>\n        base = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Parens <span class=\"hljs-keyword\">new</span> Assign bref, klass\n        variable.base = base\n        variable.properties.splice <span class=\"hljs-number\">0</span>, klass.properties.length\n      <span class=\"hljs-keyword\">if</span> name.isComplex() <span class=\"hljs-keyword\">or</span> (name <span class=\"hljs-keyword\">instanceof</span> Index <span class=\"hljs-keyword\">and</span> name.index.isAssignable())\n        nref = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.parent.freeVariable <span class=\"hljs-string\">'name'</span>\n        name = <span class=\"hljs-keyword\">new</span> Index <span class=\"hljs-keyword\">new</span> Assign nref, name.index\n        variable.properties.pop()\n        variable.properties.push name\n      accesses = [<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName <span class=\"hljs-string\">'__super__'</span>]\n      accesses.push <span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName <span class=\"hljs-string\">'constructor'</span> <span class=\"hljs-keyword\">if</span> method.static\n      accesses.push <span class=\"hljs-keyword\">if</span> nref? <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">new</span> Index nref <span class=\"hljs-keyword\">else</span> name\n      (<span class=\"hljs-keyword\">new</span> Value bref ? klass, accesses).compile o\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> method?.ctor\n      <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{method.name}</span>.__super__.constructor\"</span>\n    <span class=\"hljs-keyword\">else</span>\n      @error <span class=\"hljs-string\">'cannot call super outside of an instance method.'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-65\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-65\">&#182;</a>\n              </div>\n              <p>The appropriate <code>this</code> value for a <code>super</code> call.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  superThis : <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    method = o.scope.method\n    (method <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> method.klass <span class=\"hljs-keyword\">and</span> method.context) <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">\"this\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-66\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-66\">&#182;</a>\n              </div>\n              <h3 id=\"regexwithinterpolations\">RegexWithInterpolations</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-67\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-67\">&#182;</a>\n              </div>\n              <p>Regexes with interpolations are in fact just a variation of a <code>Call</code> (a\n<code>RegExp()</code> call to be precise) with a <code>StringWithInterpolations</code> inside.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.RegexWithInterpolations = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RegexWithInterpolations</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Call</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(args = [])</span> -&gt;</span>\n    <span class=\"hljs-keyword\">super</span> (<span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> IdentifierLiteral <span class=\"hljs-string\">'RegExp'</span>), args, <span class=\"hljs-literal\">false</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-68\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-68\">&#182;</a>\n              </div>\n              <h3 id=\"taggedtemplatecall\">TaggedTemplateCall</h3>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\nexports.TaggedTemplateCall = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">TaggedTemplateCall</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Call</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(variable, arg, soak)</span> -&gt;</span>\n    arg = <span class=\"hljs-keyword\">new</span> StringWithInterpolations Block.wrap([ <span class=\"hljs-keyword\">new</span> Value arg ]) <span class=\"hljs-keyword\">if</span> arg <span class=\"hljs-keyword\">instanceof</span> StringLiteral\n    <span class=\"hljs-keyword\">super</span> variable, [ arg ], soak\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-69\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-69\">&#182;</a>\n              </div>\n              <p>Tell <code>StringWithInterpolations</code> whether to compile as ES2015 or not; will be removed in CoffeeScript 2.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    o.inTaggedTemplateCall = <span class=\"hljs-literal\">yes</span>\n    @variable.compileToFragments(o, LEVEL_ACCESS).concat @args[<span class=\"hljs-number\">0</span>].compileToFragments(o, LEVEL_LIST)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-70\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-70\">&#182;</a>\n              </div>\n              <h3 id=\"extends\">Extends</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-71\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-71\">&#182;</a>\n              </div>\n              <p>Node to extend an object’s prototype with an ancestor object.\nAfter <code>goog.inherits</code> from the\n<a href=\"https://github.com/google/closure-library/blob/master/closure/goog/base.js\">Closure Library</a>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Extends = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Extends</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@child, @parent)</span> -&gt;</span>\n\n  children: [<span class=\"hljs-string\">'child'</span>, <span class=\"hljs-string\">'parent'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-72\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-72\">&#182;</a>\n              </div>\n              <p>Hooks one constructor into another’s prototype chain.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">new</span> Call(<span class=\"hljs-keyword\">new</span> Value(<span class=\"hljs-keyword\">new</span> Literal utility <span class=\"hljs-string\">'extend'</span>, o), [@child, @parent]).compileToFragments o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-73\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-73\">&#182;</a>\n              </div>\n              <h3 id=\"access\">Access</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-74\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-74\">&#182;</a>\n              </div>\n              <p>A <code>.</code> access into a property of a value, or the <code>::</code> shorthand for\nan access into the object’s prototype.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Access = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Access</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@name, tag)</span> -&gt;</span>\n    @soak  = tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'soak'</span>\n\n  children: [<span class=\"hljs-string\">'name'</span>]\n\n  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    name = @name.compileToFragments o\n    node = @name.unwrap()\n    <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> PropertyName\n      <span class=\"hljs-keyword\">if</span> node.value <span class=\"hljs-keyword\">in</span> JS_FORBIDDEN\n        [@makeCode(<span class=\"hljs-string\">'[\"'</span>), name..., @makeCode(<span class=\"hljs-string\">'\"]'</span>)]\n      <span class=\"hljs-keyword\">else</span>\n        [@makeCode(<span class=\"hljs-string\">'.'</span>), name...]\n    <span class=\"hljs-keyword\">else</span>\n      [@makeCode(<span class=\"hljs-string\">'['</span>), name..., @makeCode(<span class=\"hljs-string\">']'</span>)]\n\n  isComplex: NO</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-75\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-75\">&#182;</a>\n              </div>\n              <h3 id=\"index\">Index</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-76\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-76\">&#182;</a>\n              </div>\n              <p>A <code>[ ... ]</code> indexed access into an array or object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Index = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Index</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@index)</span> -&gt;</span>\n\n  children: [<span class=\"hljs-string\">'index'</span>]\n\n  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [].concat @makeCode(<span class=\"hljs-string\">\"[\"</span>), @index.compileToFragments(o, LEVEL_PAREN), @makeCode(<span class=\"hljs-string\">\"]\"</span>)\n\n  isComplex: <span class=\"hljs-function\">-&gt;</span>\n    @index.isComplex()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-77\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-77\">&#182;</a>\n              </div>\n              <h3 id=\"range\">Range</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-78\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-78\">&#182;</a>\n              </div>\n              <p>A range literal. Ranges can be used to extract portions (slices) of arrays,\nto specify a range for comprehensions, or as a value, to be expanded into the\ncorresponding array of integers at runtime.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Range = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Range</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n\n  children: [<span class=\"hljs-string\">'from'</span>, <span class=\"hljs-string\">'to'</span>]\n\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@from, @to, tag)</span> -&gt;</span>\n    @exclusive = tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'exclusive'</span>\n    @equals = <span class=\"hljs-keyword\">if</span> @exclusive <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">''</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">'='</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-79\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-79\">&#182;</a>\n              </div>\n              <p>Compiles the range’s source variables – where it starts and where it ends.\nBut only if they need to be cached to avoid double evaluation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileVariables: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o = merge o, top: <span class=\"hljs-literal\">true</span>\n    isComplex = del o, <span class=\"hljs-string\">'isComplex'</span>\n    [@fromC, @fromVar]  =  @cacheToCodeFragments @from.cache o, LEVEL_LIST, isComplex\n    [@toC, @toVar]      =  @cacheToCodeFragments @to.cache o, LEVEL_LIST, isComplex\n    [@step, @stepVar]   =  @cacheToCodeFragments step.cache o, LEVEL_LIST, isComplex <span class=\"hljs-keyword\">if</span> step = del o, <span class=\"hljs-string\">'step'</span>\n    @fromNum = <span class=\"hljs-keyword\">if</span> @from.isNumber() <span class=\"hljs-keyword\">then</span> Number @fromVar <span class=\"hljs-keyword\">else</span> <span class=\"hljs-literal\">null</span>\n    @toNum   = <span class=\"hljs-keyword\">if</span> @to.isNumber()   <span class=\"hljs-keyword\">then</span> Number @toVar   <span class=\"hljs-keyword\">else</span> <span class=\"hljs-literal\">null</span>\n    @stepNum = <span class=\"hljs-keyword\">if</span> step?.isNumber() <span class=\"hljs-keyword\">then</span> Number @stepVar <span class=\"hljs-keyword\">else</span> <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-80\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-80\">&#182;</a>\n              </div>\n              <p>When compiled normally, the range returns the contents of the <em>for loop</em>\nneeded to iterate over the values in the range. Used by comprehensions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @compileVariables o <span class=\"hljs-keyword\">unless</span> @fromVar\n    <span class=\"hljs-keyword\">return</span> @compileArray(o) <span class=\"hljs-keyword\">unless</span> o.index</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-81\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-81\">&#182;</a>\n              </div>\n              <p>Set up endpoints.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    known    = @fromNum? <span class=\"hljs-keyword\">and</span> @toNum?\n    idx      = del o, <span class=\"hljs-string\">'index'</span>\n    idxName  = del o, <span class=\"hljs-string\">'name'</span>\n    namedIndex = idxName <span class=\"hljs-keyword\">and</span> idxName <span class=\"hljs-keyword\">isnt</span> idx\n    varPart  = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{idx}</span> = <span class=\"hljs-subst\">#{@fromC}</span>\"</span>\n    varPart += <span class=\"hljs-string\">\", <span class=\"hljs-subst\">#{@toC}</span>\"</span> <span class=\"hljs-keyword\">if</span> @toC <span class=\"hljs-keyword\">isnt</span> @toVar\n    varPart += <span class=\"hljs-string\">\", <span class=\"hljs-subst\">#{@step}</span>\"</span> <span class=\"hljs-keyword\">if</span> @step <span class=\"hljs-keyword\">isnt</span> @stepVar\n    [lt, gt] = [<span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{idx}</span> &lt;<span class=\"hljs-subst\">#{@equals}</span>\"</span>, <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{idx}</span> &gt;<span class=\"hljs-subst\">#{@equals}</span>\"</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-82\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-82\">&#182;</a>\n              </div>\n              <p>Generate the condition.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    condPart = <span class=\"hljs-keyword\">if</span> @stepNum?\n      <span class=\"hljs-keyword\">if</span> @stepNum &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{lt}</span> <span class=\"hljs-subst\">#{@toVar}</span>\"</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{gt}</span> <span class=\"hljs-subst\">#{@toVar}</span>\"</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> known\n      [<span class=\"hljs-keyword\">from</span>, to] = [@fromNum, @toNum]\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">from</span> &lt;= to <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{lt}</span> <span class=\"hljs-subst\">#{to}</span>\"</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{gt}</span> <span class=\"hljs-subst\">#{to}</span>\"</span>\n    <span class=\"hljs-keyword\">else</span>\n      cond = <span class=\"hljs-keyword\">if</span> @stepVar <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@stepVar}</span> &gt; 0\"</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@fromVar}</span> &lt;= <span class=\"hljs-subst\">#{@toVar}</span>\"</span>\n      <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{cond}</span> ? <span class=\"hljs-subst\">#{lt}</span> <span class=\"hljs-subst\">#{@toVar}</span> : <span class=\"hljs-subst\">#{gt}</span> <span class=\"hljs-subst\">#{@toVar}</span>\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-83\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-83\">&#182;</a>\n              </div>\n              <p>Generate the step.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    stepPart = <span class=\"hljs-keyword\">if</span> @stepVar\n      <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{idx}</span> += <span class=\"hljs-subst\">#{@stepVar}</span>\"</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> known\n      <span class=\"hljs-keyword\">if</span> namedIndex\n        <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">from</span> &lt;= to <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\"++<span class=\"hljs-subst\">#{idx}</span>\"</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">\"--<span class=\"hljs-subst\">#{idx}</span>\"</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">from</span> &lt;= to <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{idx}</span>++\"</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{idx}</span>--\"</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">if</span> namedIndex\n        <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{cond}</span> ? ++<span class=\"hljs-subst\">#{idx}</span> : --<span class=\"hljs-subst\">#{idx}</span>\"</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{cond}</span> ? <span class=\"hljs-subst\">#{idx}</span>++ : <span class=\"hljs-subst\">#{idx}</span>--\"</span>\n\n    varPart  = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{idxName}</span> = <span class=\"hljs-subst\">#{varPart}</span>\"</span> <span class=\"hljs-keyword\">if</span> namedIndex\n    stepPart = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{idxName}</span> = <span class=\"hljs-subst\">#{stepPart}</span>\"</span> <span class=\"hljs-keyword\">if</span> namedIndex</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-84\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-84\">&#182;</a>\n              </div>\n              <p>The final loop body.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    [@makeCode <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{varPart}</span>; <span class=\"hljs-subst\">#{condPart}</span>; <span class=\"hljs-subst\">#{stepPart}</span>\"</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-85\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-85\">&#182;</a>\n              </div>\n              <p>When used as a value, expand the range into the equivalent array.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileArray: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    known = @fromNum? <span class=\"hljs-keyword\">and</span> @toNum?\n    <span class=\"hljs-keyword\">if</span> known <span class=\"hljs-keyword\">and</span> Math.abs(@fromNum - @toNum) &lt;= <span class=\"hljs-number\">20</span>\n      range = [@fromNum..@toNum]\n      range.pop() <span class=\"hljs-keyword\">if</span> @exclusive\n      <span class=\"hljs-keyword\">return</span> [@makeCode <span class=\"hljs-string\">\"[<span class=\"hljs-subst\">#{ range.join(<span class=\"hljs-string\">', '</span>) }</span>]\"</span>]\n    idt    = @tab + TAB\n    i      = o.scope.freeVariable <span class=\"hljs-string\">'i'</span>, single: <span class=\"hljs-literal\">true</span>\n    result = o.scope.freeVariable <span class=\"hljs-string\">'results'</span>\n    pre    = <span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{idt}</span><span class=\"hljs-subst\">#{result}</span> = [];\"</span>\n    <span class=\"hljs-keyword\">if</span> known\n      o.index = i\n      body    = fragmentsToText @compileNode o\n    <span class=\"hljs-keyword\">else</span>\n      vars    = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{i}</span> = <span class=\"hljs-subst\">#{@fromC}</span>\"</span> + <span class=\"hljs-keyword\">if</span> @toC <span class=\"hljs-keyword\">isnt</span> @toVar <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\", <span class=\"hljs-subst\">#{@toC}</span>\"</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">''</span>\n      cond    = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@fromVar}</span> &lt;= <span class=\"hljs-subst\">#{@toVar}</span>\"</span>\n      body    = <span class=\"hljs-string\">\"var <span class=\"hljs-subst\">#{vars}</span>; <span class=\"hljs-subst\">#{cond}</span> ? <span class=\"hljs-subst\">#{i}</span> &lt;<span class=\"hljs-subst\">#{@equals}</span> <span class=\"hljs-subst\">#{@toVar}</span> : <span class=\"hljs-subst\">#{i}</span> &gt;<span class=\"hljs-subst\">#{@equals}</span> <span class=\"hljs-subst\">#{@toVar}</span>; <span class=\"hljs-subst\">#{cond}</span> ? <span class=\"hljs-subst\">#{i}</span>++ : <span class=\"hljs-subst\">#{i}</span>--\"</span>\n    post   = <span class=\"hljs-string\">\"{ <span class=\"hljs-subst\">#{result}</span>.push(<span class=\"hljs-subst\">#{i}</span>); }\\n<span class=\"hljs-subst\">#{idt}</span>return <span class=\"hljs-subst\">#{result}</span>;\\n<span class=\"hljs-subst\">#{o.indent}</span>\"</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">hasArgs</span> = <span class=\"hljs-params\">(node)</span> -&gt;</span> node?.contains isLiteralArguments\n    args   = <span class=\"hljs-string\">', arguments'</span> <span class=\"hljs-keyword\">if</span> hasArgs(@from) <span class=\"hljs-keyword\">or</span> hasArgs(@to)\n    [@makeCode <span class=\"hljs-string\">\"(function() {<span class=\"hljs-subst\">#{pre}</span>\\n<span class=\"hljs-subst\">#{idt}</span>for (<span class=\"hljs-subst\">#{body}</span>)<span class=\"hljs-subst\">#{post}</span>}).apply(this<span class=\"hljs-subst\">#{args ? <span class=\"hljs-string\">''</span>}</span>)\"</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-86\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-86\">&#182;</a>\n              </div>\n              <h3 id=\"slice\">Slice</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-87\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-87\">&#182;</a>\n              </div>\n              <p>An array slice literal. Unlike JavaScript’s <code>Array#slice</code>, the second parameter\nspecifies the index of the end of the slice, just as the first parameter\nis the index of the beginning.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Slice = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Slice</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n\n  children: [<span class=\"hljs-string\">'range'</span>]\n\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@range)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">super</span>()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-88\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-88\">&#182;</a>\n              </div>\n              <p>We have to be careful when trying to slice through the end of the array,\n<code>9e9</code> is used because not all implementations respect <code>undefined</code> or <code>1/0</code>.\n<code>9e9</code> should be safe because <code>9e9</code> &gt; <code>2**32</code>, the max array length.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    {to, <span class=\"hljs-keyword\">from</span>} = @range\n    fromCompiled = <span class=\"hljs-keyword\">from</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">from</span>.compileToFragments(o, LEVEL_PAREN) <span class=\"hljs-keyword\">or</span> [@makeCode <span class=\"hljs-string\">'0'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-89\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-89\">&#182;</a>\n              </div>\n              <p>TODO: jwalton - move this into the ‘if’?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> to\n      compiled     = to.compileToFragments o, LEVEL_PAREN\n      compiledText = fragmentsToText compiled\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> (<span class=\"hljs-keyword\">not</span> @range.exclusive <span class=\"hljs-keyword\">and</span> +compiledText <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">-1</span>)\n        toStr = <span class=\"hljs-string\">', '</span> + <span class=\"hljs-keyword\">if</span> @range.exclusive\n          compiledText\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> to.isNumber()\n          <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{+compiledText + <span class=\"hljs-number\">1</span>}</span>\"</span>\n        <span class=\"hljs-keyword\">else</span>\n          compiled = to.compileToFragments o, LEVEL_ACCESS\n          <span class=\"hljs-string\">\"+<span class=\"hljs-subst\">#{fragmentsToText compiled}</span> + 1 || 9e9\"</span>\n    [@makeCode <span class=\"hljs-string\">\".slice(<span class=\"hljs-subst\">#{ fragmentsToText fromCompiled }</span><span class=\"hljs-subst\">#{ toStr <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">''</span> }</span>)\"</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-90\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-90\">&#182;</a>\n              </div>\n              <h3 id=\"obj\">Obj</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-91\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-91\">&#182;</a>\n              </div>\n              <p>An object literal, nothing fancy.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Obj = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Obj</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(props, @generated = <span class=\"hljs-literal\">false</span>)</span> -&gt;</span>\n    @objects = @properties = props <span class=\"hljs-keyword\">or</span> []\n\n  children: [<span class=\"hljs-string\">'properties'</span>]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    props = @properties\n    <span class=\"hljs-keyword\">if</span> @generated\n      <span class=\"hljs-keyword\">for</span> node <span class=\"hljs-keyword\">in</span> props <span class=\"hljs-keyword\">when</span> node <span class=\"hljs-keyword\">instanceof</span> Value\n        node.error <span class=\"hljs-string\">'cannot have an implicit value in an implicit object'</span>\n    <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">for</span> prop, dynamicIndex <span class=\"hljs-keyword\">in</span> props <span class=\"hljs-keyword\">when</span> (prop.variable <span class=\"hljs-keyword\">or</span> prop).base <span class=\"hljs-keyword\">instanceof</span> Parens\n    hasDynamic  = dynamicIndex &lt; props.length\n    idt         = o.indent += TAB\n    lastNoncom  = @lastNonComment @properties\n    answer = []\n    <span class=\"hljs-keyword\">if</span> hasDynamic\n      oref = o.scope.freeVariable <span class=\"hljs-string\">'obj'</span>\n      answer.push @makeCode <span class=\"hljs-string\">\"(\\n<span class=\"hljs-subst\">#{idt}</span><span class=\"hljs-subst\">#{oref}</span> = \"</span>\n    answer.push @makeCode <span class=\"hljs-string\">\"{<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> props.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">or</span> dynamicIndex <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'}'</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">'\\n'</span>}</span>\"</span>\n    <span class=\"hljs-keyword\">for</span> prop, i <span class=\"hljs-keyword\">in</span> props\n      <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">is</span> dynamicIndex\n        answer.push @makeCode <span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{idt}</span>}\"</span> <span class=\"hljs-keyword\">unless</span> i <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n        answer.push @makeCode <span class=\"hljs-string\">',\\n'</span>\n      join = <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">is</span> props.length - <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">or</span> i <span class=\"hljs-keyword\">is</span> dynamicIndex - <span class=\"hljs-number\">1</span>\n        <span class=\"hljs-string\">''</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prop <span class=\"hljs-keyword\">is</span> lastNoncom <span class=\"hljs-keyword\">or</span> prop <span class=\"hljs-keyword\">instanceof</span> Comment\n        <span class=\"hljs-string\">'\\n'</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">',\\n'</span>\n      indent = <span class=\"hljs-keyword\">if</span> prop <span class=\"hljs-keyword\">instanceof</span> Comment <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">''</span> <span class=\"hljs-keyword\">else</span> idt\n      indent += TAB <span class=\"hljs-keyword\">if</span> hasDynamic <span class=\"hljs-keyword\">and</span> i &lt; dynamicIndex\n      <span class=\"hljs-keyword\">if</span> prop <span class=\"hljs-keyword\">instanceof</span> Assign\n        <span class=\"hljs-keyword\">if</span> prop.context <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'object'</span>\n          prop.operatorToken.error <span class=\"hljs-string\">\"unexpected <span class=\"hljs-subst\">#{prop.operatorToken.value}</span>\"</span>\n        <span class=\"hljs-keyword\">if</span> prop.variable <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> prop.variable.hasProperties()\n          prop.variable.error <span class=\"hljs-string\">'invalid object key'</span>\n      <span class=\"hljs-keyword\">if</span> prop <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> prop.<span class=\"hljs-keyword\">this</span>\n        prop = <span class=\"hljs-keyword\">new</span> Assign prop.properties[<span class=\"hljs-number\">0</span>].name, prop, <span class=\"hljs-string\">'object'</span>\n      <span class=\"hljs-keyword\">if</span> prop <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Comment\n        <span class=\"hljs-keyword\">if</span> i &lt; dynamicIndex\n          <span class=\"hljs-keyword\">if</span> prop <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Assign\n            prop = <span class=\"hljs-keyword\">new</span> Assign prop, prop, <span class=\"hljs-string\">'object'</span>\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-keyword\">if</span> prop <span class=\"hljs-keyword\">instanceof</span> Assign\n            key = prop.variable\n            value = prop.value\n          <span class=\"hljs-keyword\">else</span>\n            [key, value] = prop.base.cache o\n            key = <span class=\"hljs-keyword\">new</span> PropertyName key.value <span class=\"hljs-keyword\">if</span> key <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral\n          prop = <span class=\"hljs-keyword\">new</span> Assign (<span class=\"hljs-keyword\">new</span> Value (<span class=\"hljs-keyword\">new</span> IdentifierLiteral oref), [<span class=\"hljs-keyword\">new</span> Access key]), value\n      <span class=\"hljs-keyword\">if</span> indent <span class=\"hljs-keyword\">then</span> answer.push @makeCode indent\n      answer.push prop.compileToFragments(o, LEVEL_TOP)...\n      <span class=\"hljs-keyword\">if</span> join <span class=\"hljs-keyword\">then</span> answer.push @makeCode join\n    <span class=\"hljs-keyword\">if</span> hasDynamic\n      answer.push @makeCode <span class=\"hljs-string\">\",\\n<span class=\"hljs-subst\">#{idt}</span><span class=\"hljs-subst\">#{oref}</span>\\n<span class=\"hljs-subst\">#{@tab}</span>)\"</span>\n    <span class=\"hljs-keyword\">else</span>\n      answer.push @makeCode <span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{@tab}</span>}\"</span> <span class=\"hljs-keyword\">unless</span> props.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">if</span> @front <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> hasDynamic <span class=\"hljs-keyword\">then</span> @wrapInBraces answer <span class=\"hljs-keyword\">else</span> answer\n\n  assigns: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> prop <span class=\"hljs-keyword\">in</span> @properties <span class=\"hljs-keyword\">when</span> prop.assigns name <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-92\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-92\">&#182;</a>\n              </div>\n              <h3 id=\"arr\">Arr</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-93\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-93\">&#182;</a>\n              </div>\n              <p>An array literal.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Arr = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Arr</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(objs)</span> -&gt;</span>\n    @objects = objs <span class=\"hljs-keyword\">or</span> []\n\n  children: [<span class=\"hljs-string\">'objects'</span>]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> [@makeCode <span class=\"hljs-string\">'[]'</span>] <span class=\"hljs-keyword\">unless</span> @objects.length\n    o.indent += TAB\n    answer = Splat.compileSplattedArray o, @objects\n    <span class=\"hljs-keyword\">return</span> answer <span class=\"hljs-keyword\">if</span> answer.length\n\n    answer = []\n    compiledObjs = (obj.compileToFragments o, LEVEL_LIST <span class=\"hljs-keyword\">for</span> obj <span class=\"hljs-keyword\">in</span> @objects)\n    <span class=\"hljs-keyword\">for</span> fragments, index <span class=\"hljs-keyword\">in</span> compiledObjs\n      <span class=\"hljs-keyword\">if</span> index\n        answer.push @makeCode <span class=\"hljs-string\">\", \"</span>\n      answer.push fragments...\n    <span class=\"hljs-keyword\">if</span> fragmentsToText(answer).indexOf(<span class=\"hljs-string\">'\\n'</span>) &gt;= <span class=\"hljs-number\">0</span>\n      answer.unshift @makeCode <span class=\"hljs-string\">\"[\\n<span class=\"hljs-subst\">#{o.indent}</span>\"</span>\n      answer.push @makeCode <span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{@tab}</span>]\"</span>\n    <span class=\"hljs-keyword\">else</span>\n      answer.unshift @makeCode <span class=\"hljs-string\">\"[\"</span>\n      answer.push @makeCode <span class=\"hljs-string\">\"]\"</span>\n    answer\n\n  assigns: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> obj <span class=\"hljs-keyword\">in</span> @objects <span class=\"hljs-keyword\">when</span> obj.assigns name <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-94\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-94\">&#182;</a>\n              </div>\n              <h3 id=\"class\">Class</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-95\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-95\">&#182;</a>\n              </div>\n              <p>The CoffeeScript class definition.\nInitialize a <strong>Class</strong> with its name, an optional superclass, and a\nlist of prototype property assignments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Class = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Class</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@variable, @parent, @body = <span class=\"hljs-keyword\">new</span> Block)</span> -&gt;</span>\n    @boundFuncs = []\n    @body.classBody = <span class=\"hljs-literal\">yes</span>\n\n  children: [<span class=\"hljs-string\">'variable'</span>, <span class=\"hljs-string\">'parent'</span>, <span class=\"hljs-string\">'body'</span>]\n\n  defaultClassVariableName: <span class=\"hljs-string\">'_Class'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-96\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-96\">&#182;</a>\n              </div>\n              <p>Figure out the appropriate name for the constructor function of this class.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  determineName: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> @defaultClassVariableName <span class=\"hljs-keyword\">unless</span> @variable\n    [..., tail] = @variable.properties\n    node = <span class=\"hljs-keyword\">if</span> tail\n      tail <span class=\"hljs-keyword\">instanceof</span> Access <span class=\"hljs-keyword\">and</span> tail.name\n    <span class=\"hljs-keyword\">else</span>\n      @variable.base\n    <span class=\"hljs-keyword\">unless</span> node <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral <span class=\"hljs-keyword\">or</span> node <span class=\"hljs-keyword\">instanceof</span> PropertyName\n      <span class=\"hljs-keyword\">return</span> @defaultClassVariableName\n    name = node.value\n    <span class=\"hljs-keyword\">unless</span> tail\n      message = isUnassignable name\n      @variable.error message <span class=\"hljs-keyword\">if</span> message\n    <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">in</span> JS_FORBIDDEN <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\"_<span class=\"hljs-subst\">#{name}</span>\"</span> <span class=\"hljs-keyword\">else</span> name</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-97\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-97\">&#182;</a>\n              </div>\n              <p>For all <code>this</code>-references and bound functions in the class definition,\n<code>this</code> is the Class being constructed.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  setContext: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    @body.traverseChildren <span class=\"hljs-literal\">false</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span> <span class=\"hljs-keyword\">if</span> node.classBody\n      <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> ThisLiteral\n        node.value    = name\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> Code\n        node.context  = name <span class=\"hljs-keyword\">if</span> node.bound</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-98\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-98\">&#182;</a>\n              </div>\n              <p>Ensure that all functions bound to the instance are proxied in the\nconstructor.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addBoundFunctions: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> bvar <span class=\"hljs-keyword\">in</span> @boundFuncs\n      lhs = (<span class=\"hljs-keyword\">new</span> Value (<span class=\"hljs-keyword\">new</span> ThisLiteral), [<span class=\"hljs-keyword\">new</span> Access bvar]).compile o\n      @ctor.body.unshift <span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{lhs}</span> = <span class=\"hljs-subst\">#{utility <span class=\"hljs-string\">'bind'</span>, o}</span>(<span class=\"hljs-subst\">#{lhs}</span>, this)\"</span>\n    <span class=\"hljs-keyword\">return</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-99\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-99\">&#182;</a>\n              </div>\n              <p>Merge the properties from a top-level object as prototypal properties\non the class.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(node, name, o)</span> -&gt;</span>\n    props = node.base.properties[..]\n    exprs = <span class=\"hljs-keyword\">while</span> assign = props.shift()\n      <span class=\"hljs-keyword\">if</span> assign <span class=\"hljs-keyword\">instanceof</span> Assign\n        base = assign.variable.base\n        <span class=\"hljs-keyword\">delete</span> assign.context\n        func = assign.value\n        <span class=\"hljs-keyword\">if</span> base.value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'constructor'</span>\n          <span class=\"hljs-keyword\">if</span> @ctor\n            assign.error <span class=\"hljs-string\">'cannot define more than one constructor in a class'</span>\n          <span class=\"hljs-keyword\">if</span> func.bound\n            assign.error <span class=\"hljs-string\">'cannot define a constructor as a bound function'</span>\n          <span class=\"hljs-keyword\">if</span> func <span class=\"hljs-keyword\">instanceof</span> Code\n            assign = @ctor = func\n          <span class=\"hljs-keyword\">else</span>\n            @externalCtor = o.classScope.freeVariable <span class=\"hljs-string\">'ctor'</span>\n            assign = <span class=\"hljs-keyword\">new</span> Assign <span class=\"hljs-keyword\">new</span> IdentifierLiteral(@externalCtor), func\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-keyword\">if</span> assign.variable.<span class=\"hljs-keyword\">this</span>\n            func.static = <span class=\"hljs-literal\">yes</span>\n          <span class=\"hljs-keyword\">else</span>\n            acc = <span class=\"hljs-keyword\">if</span> base.isComplex() <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">new</span> Index base <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">new</span> Access base\n            assign.variable = <span class=\"hljs-keyword\">new</span> Value(<span class=\"hljs-keyword\">new</span> IdentifierLiteral(name), [(<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName <span class=\"hljs-string\">'prototype'</span>), acc])\n            <span class=\"hljs-keyword\">if</span> func <span class=\"hljs-keyword\">instanceof</span> Code <span class=\"hljs-keyword\">and</span> func.bound\n              @boundFuncs.push base\n              func.bound = <span class=\"hljs-literal\">no</span>\n      assign\n    compact exprs</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-100\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-100\">&#182;</a>\n              </div>\n              <p>Walk the body of the class, looking for prototype properties to be converted\nand tagging static assignments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  walkBody: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, o)</span> -&gt;</span>\n    @traverseChildren <span class=\"hljs-literal\">false</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(child)</span> =&gt;</span>\n      cont = <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span> <span class=\"hljs-keyword\">if</span> child <span class=\"hljs-keyword\">instanceof</span> Class\n      <span class=\"hljs-keyword\">if</span> child <span class=\"hljs-keyword\">instanceof</span> Block\n        <span class=\"hljs-keyword\">for</span> node, i <span class=\"hljs-keyword\">in</span> exps = child.expressions\n          <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> node.variable.looksStatic name\n            node.value.static = <span class=\"hljs-literal\">yes</span>\n          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> node.isObject(<span class=\"hljs-literal\">true</span>)\n            cont = <span class=\"hljs-literal\">false</span>\n            exps[i] = @addProperties node, name, o\n        child.expressions = exps = flatten exps\n      cont <span class=\"hljs-keyword\">and</span> child <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Class</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-101\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-101\">&#182;</a>\n              </div>\n              <p><code>use strict</code> (and other directives) must be the first expression statement(s)\nof a function body. This method ensures the prologue is correctly positioned\nabove the <code>constructor</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  hoistDirectivePrologue: <span class=\"hljs-function\">-&gt;</span>\n    index = <span class=\"hljs-number\">0</span>\n    {expressions} = @body\n    ++index <span class=\"hljs-keyword\">while</span> (node = expressions[index]) <span class=\"hljs-keyword\">and</span> node <span class=\"hljs-keyword\">instanceof</span> Comment <span class=\"hljs-keyword\">or</span>\n      node <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> node.isString()\n    @directives = expressions.splice <span class=\"hljs-number\">0</span>, index</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-102\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-102\">&#182;</a>\n              </div>\n              <p>Make sure that a constructor is defined for the class, and properly\nconfigured.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ensureConstructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> @ctor\n      @ctor = <span class=\"hljs-keyword\">new</span> Code\n      <span class=\"hljs-keyword\">if</span> @externalCtor\n        @ctor.body.push <span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@externalCtor}</span>.apply(this, arguments)\"</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @parent\n        @ctor.body.push <span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{name}</span>.__super__.constructor.apply(this, arguments)\"</span>\n      @ctor.body.makeReturn()\n      @body.expressions.unshift @ctor\n    @ctor.ctor = @ctor.name = name\n    @ctor.klass = <span class=\"hljs-literal\">null</span>\n    @ctor.noReturn = <span class=\"hljs-literal\">yes</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-103\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-103\">&#182;</a>\n              </div>\n              <p>Instead of generating the JavaScript string directly, we build up the\nequivalent syntax tree and compile that, in pieces. You can see the\nconstructor, property assignments, and inheritance getting built out below.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> jumpNode = @body.jumps()\n      jumpNode.error <span class=\"hljs-string\">'Class bodies cannot contain pure statements'</span>\n    <span class=\"hljs-keyword\">if</span> argumentsNode = @body.contains isLiteralArguments\n      argumentsNode.error <span class=\"hljs-string\">\"Class bodies shouldn't reference arguments\"</span>\n\n    name  = @determineName()\n    lname = <span class=\"hljs-keyword\">new</span> IdentifierLiteral name\n    func  = <span class=\"hljs-keyword\">new</span> Code [], Block.wrap [@body]\n    args  = []\n    o.classScope = func.makeScope o.scope\n\n    @hoistDirectivePrologue()\n    @setContext name\n    @walkBody name, o\n    @ensureConstructor name\n    @addBoundFunctions o\n    @body.spaced = <span class=\"hljs-literal\">yes</span>\n    @body.expressions.push lname\n\n    <span class=\"hljs-keyword\">if</span> @parent\n      superClass = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.classScope.freeVariable <span class=\"hljs-string\">'superClass'</span>, reserve: <span class=\"hljs-literal\">no</span>\n      @body.expressions.unshift <span class=\"hljs-keyword\">new</span> Extends lname, superClass\n      func.params.push <span class=\"hljs-keyword\">new</span> Param superClass\n      args.push @parent\n\n    @body.expressions.unshift @directives...\n\n    klass = <span class=\"hljs-keyword\">new</span> Parens <span class=\"hljs-keyword\">new</span> Call func, args\n    klass = <span class=\"hljs-keyword\">new</span> Assign @variable, klass, <span class=\"hljs-literal\">null</span>, { @moduleDeclaration } <span class=\"hljs-keyword\">if</span> @variable\n    klass.compileToFragments o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-104\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-104\">&#182;</a>\n              </div>\n              <h3 id=\"import-and-export\">Import and Export</h3>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\nexports.ModuleDeclaration = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ModuleDeclaration</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@clause, @source)</span> -&gt;</span>\n    @checkSource()\n\n  children: [<span class=\"hljs-string\">'clause'</span>, <span class=\"hljs-string\">'source'</span>]\n\n  isStatement: YES\n  jumps:       THIS\n  makeReturn:  THIS\n\n  checkSource: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @source? <span class=\"hljs-keyword\">and</span> @source <span class=\"hljs-keyword\">instanceof</span> StringWithInterpolations\n      @source.error <span class=\"hljs-string\">'the name of the module to be imported from must be an uninterpolated string'</span>\n\n  checkScope: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, moduleDeclarationType)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> o.indent.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n      @error <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{moduleDeclarationType}</span> statements must be at top-level scope\"</span>\n\nexports.ImportDeclaration = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ImportDeclaration</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ModuleDeclaration</span></span>\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkScope o, <span class=\"hljs-string\">'import'</span>\n    o.importedSymbols = []\n\n    code = []\n    code.push @makeCode <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@tab}</span>import \"</span>\n    code.push @clause.compileNode(o)... <span class=\"hljs-keyword\">if</span> @clause?\n\n    <span class=\"hljs-keyword\">if</span> @source?.value?\n      code.push @makeCode <span class=\"hljs-string\">' from '</span> <span class=\"hljs-keyword\">unless</span> @clause <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">null</span>\n      code.push @makeCode @source.value\n\n    code.push @makeCode <span class=\"hljs-string\">';'</span>\n    code\n\nexports.ImportClause = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ImportClause</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@defaultBinding, @namedImports)</span> -&gt;</span>\n\n  children: [<span class=\"hljs-string\">'defaultBinding'</span>, <span class=\"hljs-string\">'namedImports'</span>]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    code = []\n\n    <span class=\"hljs-keyword\">if</span> @defaultBinding?\n      code.push @defaultBinding.compileNode(o)...\n      code.push @makeCode <span class=\"hljs-string\">', '</span> <span class=\"hljs-keyword\">if</span> @namedImports?\n\n    <span class=\"hljs-keyword\">if</span> @namedImports?\n      code.push @namedImports.compileNode(o)...\n\n    code\n\nexports.ExportDeclaration = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExportDeclaration</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ModuleDeclaration</span></span>\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkScope o, <span class=\"hljs-string\">'export'</span>\n\n    code = []\n    code.push @makeCode <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@tab}</span>export \"</span>\n    code.push @makeCode <span class=\"hljs-string\">'default '</span> <span class=\"hljs-keyword\">if</span> @ <span class=\"hljs-keyword\">instanceof</span> ExportDefaultDeclaration\n\n    <span class=\"hljs-keyword\">if</span> @ <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> ExportDefaultDeclaration <span class=\"hljs-keyword\">and</span>\n       (@clause <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">or</span> @clause <span class=\"hljs-keyword\">instanceof</span> Class)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-105\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-105\">&#182;</a>\n              </div>\n              <p>Prevent exporting an anonymous class; all exported members must be named</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> @clause <span class=\"hljs-keyword\">instanceof</span> Class <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @clause.variable\n        @clause.error <span class=\"hljs-string\">'anonymous classes cannot be exported'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-106\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-106\">&#182;</a>\n              </div>\n              <p>When the ES2015 <code>class</code> keyword is supported, don’t add a <code>var</code> here</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      code.push @makeCode <span class=\"hljs-string\">'var '</span>\n      @clause.moduleDeclaration = <span class=\"hljs-string\">'export'</span>\n\n    <span class=\"hljs-keyword\">if</span> @clause.body? <span class=\"hljs-keyword\">and</span> @clause.body <span class=\"hljs-keyword\">instanceof</span> Block\n      code = code.concat @clause.compileToFragments o, LEVEL_TOP\n    <span class=\"hljs-keyword\">else</span>\n      code = code.concat @clause.compileNode o\n\n    code.push @makeCode <span class=\"hljs-string\">\" from <span class=\"hljs-subst\">#{@source.value}</span>\"</span> <span class=\"hljs-keyword\">if</span> @source?.value?\n    code.push @makeCode <span class=\"hljs-string\">';'</span>\n    code\n\nexports.ExportNamedDeclaration = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExportNamedDeclaration</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ExportDeclaration</span></span>\n\nexports.ExportDefaultDeclaration = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExportDefaultDeclaration</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ExportDeclaration</span></span>\n\nexports.ExportAllDeclaration = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExportAllDeclaration</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ExportDeclaration</span></span>\n\nexports.ModuleSpecifierList = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ModuleSpecifierList</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@specifiers)</span> -&gt;</span>\n\n  children: [<span class=\"hljs-string\">'specifiers'</span>]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    code = []\n    o.indent += TAB\n    compiledList = (specifier.compileToFragments o, LEVEL_LIST <span class=\"hljs-keyword\">for</span> specifier <span class=\"hljs-keyword\">in</span> @specifiers)\n\n    <span class=\"hljs-keyword\">if</span> @specifiers.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n      code.push @makeCode <span class=\"hljs-string\">\"{\\n<span class=\"hljs-subst\">#{o.indent}</span>\"</span>\n      <span class=\"hljs-keyword\">for</span> fragments, index <span class=\"hljs-keyword\">in</span> compiledList\n        code.push @makeCode(<span class=\"hljs-string\">\",\\n<span class=\"hljs-subst\">#{o.indent}</span>\"</span>) <span class=\"hljs-keyword\">if</span> index\n        code.push fragments...\n      code.push @makeCode <span class=\"hljs-string\">\"\\n}\"</span>\n    <span class=\"hljs-keyword\">else</span>\n      code.push @makeCode <span class=\"hljs-string\">'{}'</span>\n    code\n\nexports.ImportSpecifierList = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ImportSpecifierList</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ModuleSpecifierList</span></span>\n\nexports.ExportSpecifierList = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExportSpecifierList</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ModuleSpecifierList</span></span>\n\nexports.ModuleSpecifier = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ModuleSpecifier</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@original, @alias, @moduleDeclarationType)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-107\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-107\">&#182;</a>\n              </div>\n              <p>The name of the variable entering the local scope</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @identifier = <span class=\"hljs-keyword\">if</span> @alias? <span class=\"hljs-keyword\">then</span> @alias.value <span class=\"hljs-keyword\">else</span> @original.value\n\n  children: [<span class=\"hljs-string\">'original'</span>, <span class=\"hljs-string\">'alias'</span>]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o.scope.find @identifier, @moduleDeclarationType\n    code = []\n    code.push @makeCode @original.value\n    code.push @makeCode <span class=\"hljs-string\">\" as <span class=\"hljs-subst\">#{@alias.value}</span>\"</span> <span class=\"hljs-keyword\">if</span> @alias?\n    code\n\nexports.ImportSpecifier = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ImportSpecifier</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ModuleSpecifier</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(imported, local)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">super</span> imported, local, <span class=\"hljs-string\">'import'</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-108\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-108\">&#182;</a>\n              </div>\n              <p>Per the spec, symbols can’t be imported multiple times\n(e.g. <code>import { foo, foo } from &#39;lib&#39;</code> is invalid)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> @identifier <span class=\"hljs-keyword\">in</span> o.importedSymbols <span class=\"hljs-keyword\">or</span> o.scope.check(@identifier)\n      @error <span class=\"hljs-string\">\"'<span class=\"hljs-subst\">#{@identifier}</span>' has already been declared\"</span>\n    <span class=\"hljs-keyword\">else</span>\n      o.importedSymbols.push @identifier\n    <span class=\"hljs-keyword\">super</span> o\n\nexports.ImportDefaultSpecifier = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ImportDefaultSpecifier</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ImportSpecifier</span></span>\n\nexports.ImportNamespaceSpecifier = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ImportNamespaceSpecifier</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ImportSpecifier</span></span>\n\nexports.ExportSpecifier = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExportSpecifier</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ModuleSpecifier</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(local, exported)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">super</span> local, exported, <span class=\"hljs-string\">'export'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-109\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-109\">&#182;</a>\n              </div>\n              <h3 id=\"assign\">Assign</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-110\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-110\">&#182;</a>\n              </div>\n              <p>The <strong>Assign</strong> is used to assign a local variable to value, or to set the\nproperty of an object – including within object literals.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Assign = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Assign</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@variable, @value, @context, options = {})</span> -&gt;</span>\n    {@param, @subpattern, @operatorToken, @moduleDeclaration} = options\n\n  children: [<span class=\"hljs-string\">'variable'</span>, <span class=\"hljs-string\">'value'</span>]\n\n  isStatement: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o?.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP <span class=\"hljs-keyword\">and</span> @context? <span class=\"hljs-keyword\">and</span> (@moduleDeclaration <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">\"?\"</span> <span class=\"hljs-keyword\">in</span> @context)\n\n  checkAssignability: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, varBase)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> Object::hasOwnProperty.call(o.scope.positions, varBase.value) <span class=\"hljs-keyword\">and</span>\n       o.scope.variables[o.scope.positions[varBase.value]].type <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'import'</span>\n      varBase.error <span class=\"hljs-string\">\"'<span class=\"hljs-subst\">#{varBase.value}</span>' is read-only\"</span>\n\n  assigns: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    @[<span class=\"hljs-keyword\">if</span> @context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'object'</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'value'</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">'variable'</span>].assigns name\n\n  unfoldSoak: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    unfoldSoak o, <span class=\"hljs-keyword\">this</span>, <span class=\"hljs-string\">'variable'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-111\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-111\">&#182;</a>\n              </div>\n              <p>Compile an assignment, delegating to <code>compilePatternMatch</code> or\n<code>compileSplice</code> if appropriate. Keep track of the name of the base object\nwe’ve been assigned to, for correct internal references. If the variable\nhas not been seen yet within the current scope, declare it.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> isValue = @variable <span class=\"hljs-keyword\">instanceof</span> Value\n      <span class=\"hljs-keyword\">return</span> @compilePatternMatch o <span class=\"hljs-keyword\">if</span> @variable.isArray() <span class=\"hljs-keyword\">or</span> @variable.isObject()\n      <span class=\"hljs-keyword\">return</span> @compileSplice       o <span class=\"hljs-keyword\">if</span> @variable.isSplice()\n      <span class=\"hljs-keyword\">return</span> @compileConditional  o <span class=\"hljs-keyword\">if</span> @context <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'||='</span>, <span class=\"hljs-string\">'&amp;&amp;='</span>, <span class=\"hljs-string\">'?='</span>]\n      <span class=\"hljs-keyword\">return</span> @compileSpecialMath  o <span class=\"hljs-keyword\">if</span> @context <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'**='</span>, <span class=\"hljs-string\">'//='</span>, <span class=\"hljs-string\">'%%='</span>]\n    <span class=\"hljs-keyword\">if</span> @value <span class=\"hljs-keyword\">instanceof</span> Code\n      <span class=\"hljs-keyword\">if</span> @value.static\n        @value.klass = @variable.base\n        @value.name  = @variable.properties[<span class=\"hljs-number\">0</span>]\n        @value.variable = @variable\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @variable.properties?.length &gt;= <span class=\"hljs-number\">2</span>\n        [properties..., prototype, name] = @variable.properties\n        <span class=\"hljs-keyword\">if</span> prototype.name?.value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'prototype'</span>\n          @value.klass = <span class=\"hljs-keyword\">new</span> Value @variable.base, properties\n          @value.name  = name\n          @value.variable = @variable\n    <span class=\"hljs-keyword\">unless</span> @context\n      varBase = @variable.unwrapAll()\n      <span class=\"hljs-keyword\">unless</span> varBase.isAssignable()\n        @variable.error <span class=\"hljs-string\">\"'<span class=\"hljs-subst\">#{@variable.compile o}</span>' can't be assigned\"</span>\n      <span class=\"hljs-keyword\">unless</span> varBase.hasProperties?()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-112\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-112\">&#182;</a>\n              </div>\n              <p><code>moduleDeclaration</code> can be <code>&#39;import&#39;</code> or <code>&#39;export&#39;</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> @moduleDeclaration\n          @checkAssignability o, varBase\n          o.scope.add varBase.value, @moduleDeclaration\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @param\n          o.scope.add varBase.value, <span class=\"hljs-string\">'var'</span>\n        <span class=\"hljs-keyword\">else</span>\n          @checkAssignability o, varBase\n          o.scope.find varBase.value\n\n    val = @value.compileToFragments o, LEVEL_LIST\n    @variable.front = <span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> isValue <span class=\"hljs-keyword\">and</span> @variable.base <span class=\"hljs-keyword\">instanceof</span> Obj\n    compiledName = @variable.compileToFragments o, LEVEL_LIST\n\n    <span class=\"hljs-keyword\">if</span> @context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'object'</span>\n      <span class=\"hljs-keyword\">if</span> fragmentsToText(compiledName) <span class=\"hljs-keyword\">in</span> JS_FORBIDDEN\n        compiledName.unshift @makeCode <span class=\"hljs-string\">'\"'</span>\n        compiledName.push @makeCode <span class=\"hljs-string\">'\"'</span>\n      <span class=\"hljs-keyword\">return</span> compiledName.concat @makeCode(<span class=\"hljs-string\">\": \"</span>), val\n\n    answer = compiledName.concat @makeCode(<span class=\"hljs-string\">\" <span class=\"hljs-subst\">#{ @context <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">'='</span> }</span> \"</span>), val\n    <span class=\"hljs-keyword\">if</span> o.level &lt;= LEVEL_LIST <span class=\"hljs-keyword\">then</span> answer <span class=\"hljs-keyword\">else</span> @wrapInBraces answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-113\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-113\">&#182;</a>\n              </div>\n              <p>Brief implementation of recursive pattern matching, when assigning array or\nobject literals to a value. Peeks at their properties to assign inner names.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compilePatternMatch: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    top       = o.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP\n    {value}   = <span class=\"hljs-keyword\">this</span>\n    {objects} = @variable.base\n    <span class=\"hljs-keyword\">unless</span> olen = objects.length\n      code = value.compileToFragments o\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_OP <span class=\"hljs-keyword\">then</span> @wrapInBraces code <span class=\"hljs-keyword\">else</span> code\n    [obj] = objects\n    <span class=\"hljs-keyword\">if</span> olen <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> obj <span class=\"hljs-keyword\">instanceof</span> Expansion\n      obj.error <span class=\"hljs-string\">'Destructuring assignment has no target'</span>\n    isObject = @variable.isObject()\n    <span class=\"hljs-keyword\">if</span> top <span class=\"hljs-keyword\">and</span> olen <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> obj <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Splat</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-114\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-114\">&#182;</a>\n              </div>\n              <p>Pick the property straight off the value when there’s just one to pick\n(no need to cache the value into a variable).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      defaultValue = <span class=\"hljs-literal\">null</span>\n      <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> obj.context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'object'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-115\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-115\">&#182;</a>\n              </div>\n              <p>A regular object pattern-match.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        {variable: {base: idx}, value: obj} = obj\n        <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Assign\n          defaultValue = obj.value\n          obj = obj.variable\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Assign\n          defaultValue = obj.value\n          obj = obj.variable\n        idx = <span class=\"hljs-keyword\">if</span> isObject</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-116\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-116\">&#182;</a>\n              </div>\n              <p>A shorthand <code>{a, b, @c} = val</code> pattern-match.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">if</span> obj.<span class=\"hljs-keyword\">this</span>\n            obj.properties[<span class=\"hljs-number\">0</span>].name\n          <span class=\"hljs-keyword\">else</span>\n            <span class=\"hljs-keyword\">new</span> PropertyName obj.unwrap().value\n        <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-117\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-117\">&#182;</a>\n              </div>\n              <p>A regular array pattern-match.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">new</span> NumberLiteral <span class=\"hljs-number\">0</span>\n      acc   = idx.unwrap() <span class=\"hljs-keyword\">instanceof</span> PropertyName\n      value = <span class=\"hljs-keyword\">new</span> Value value\n      value.properties.push <span class=\"hljs-keyword\">new</span> (<span class=\"hljs-keyword\">if</span> acc <span class=\"hljs-keyword\">then</span> Access <span class=\"hljs-keyword\">else</span> Index) idx\n      message = isUnassignable obj.unwrap().value\n      obj.error message <span class=\"hljs-keyword\">if</span> message\n      value = <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'?'</span>, value, defaultValue <span class=\"hljs-keyword\">if</span> defaultValue\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> Assign(obj, value, <span class=\"hljs-literal\">null</span>, param: @param).compileToFragments o, LEVEL_TOP\n    vvar     = value.compileToFragments o, LEVEL_LIST\n    vvarText = fragmentsToText vvar\n    assigns  = []\n    expandedIdx = <span class=\"hljs-literal\">false</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-118\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-118\">&#182;</a>\n              </div>\n              <p>Make vvar into a simple variable if it isn’t already.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> value.unwrap() <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral <span class=\"hljs-keyword\">or</span> @variable.assigns(vvarText)\n      assigns.push [@makeCode(<span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{ ref = o.scope.freeVariable <span class=\"hljs-string\">'ref'</span> }</span> = \"</span>), vvar...]\n      vvar = [@makeCode ref]\n      vvarText = ref\n    <span class=\"hljs-keyword\">for</span> obj, i <span class=\"hljs-keyword\">in</span> objects\n      idx = i\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> expandedIdx <span class=\"hljs-keyword\">and</span> obj <span class=\"hljs-keyword\">instanceof</span> Splat\n        name = obj.name.unwrap().value\n        obj = obj.unwrap()\n        val = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{olen}</span> &lt;= <span class=\"hljs-subst\">#{vvarText}</span>.length ? <span class=\"hljs-subst\">#{ utility <span class=\"hljs-string\">'slice'</span>, o }</span>.call(<span class=\"hljs-subst\">#{vvarText}</span>, <span class=\"hljs-subst\">#{i}</span>\"</span>\n        <span class=\"hljs-keyword\">if</span> rest = olen - i - <span class=\"hljs-number\">1</span>\n          ivar = o.scope.freeVariable <span class=\"hljs-string\">'i'</span>, single: <span class=\"hljs-literal\">true</span>\n          val += <span class=\"hljs-string\">\", <span class=\"hljs-subst\">#{ivar}</span> = <span class=\"hljs-subst\">#{vvarText}</span>.length - <span class=\"hljs-subst\">#{rest}</span>) : (<span class=\"hljs-subst\">#{ivar}</span> = <span class=\"hljs-subst\">#{i}</span>, [])\"</span>\n        <span class=\"hljs-keyword\">else</span>\n          val += <span class=\"hljs-string\">\") : []\"</span>\n        val   = <span class=\"hljs-keyword\">new</span> Literal val\n        expandedIdx = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{ivar}</span>++\"</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> expandedIdx <span class=\"hljs-keyword\">and</span> obj <span class=\"hljs-keyword\">instanceof</span> Expansion\n        <span class=\"hljs-keyword\">if</span> rest = olen - i - <span class=\"hljs-number\">1</span>\n          <span class=\"hljs-keyword\">if</span> rest <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span>\n            expandedIdx = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{vvarText}</span>.length - 1\"</span>\n          <span class=\"hljs-keyword\">else</span>\n            ivar = o.scope.freeVariable <span class=\"hljs-string\">'i'</span>, single: <span class=\"hljs-literal\">true</span>\n            val = <span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{ivar}</span> = <span class=\"hljs-subst\">#{vvarText}</span>.length - <span class=\"hljs-subst\">#{rest}</span>\"</span>\n            expandedIdx = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{ivar}</span>++\"</span>\n            assigns.push val.compileToFragments o, LEVEL_LIST\n        <span class=\"hljs-keyword\">continue</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Splat <span class=\"hljs-keyword\">or</span> obj <span class=\"hljs-keyword\">instanceof</span> Expansion\n          obj.error <span class=\"hljs-string\">\"multiple splats/expansions are disallowed in an assignment\"</span>\n        defaultValue = <span class=\"hljs-literal\">null</span>\n        <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> obj.context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'object'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-119\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-119\">&#182;</a>\n              </div>\n              <p>A regular object pattern-match.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          {variable: {base: idx}, value: obj} = obj\n          <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Assign\n            defaultValue = obj.value\n            obj = obj.variable\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Assign\n            defaultValue = obj.value\n            obj = obj.variable\n          idx = <span class=\"hljs-keyword\">if</span> isObject</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-120\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-120\">&#182;</a>\n              </div>\n              <p>A shorthand <code>{a, b, @c} = val</code> pattern-match.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>            <span class=\"hljs-keyword\">if</span> obj.<span class=\"hljs-keyword\">this</span>\n              obj.properties[<span class=\"hljs-number\">0</span>].name\n            <span class=\"hljs-keyword\">else</span>\n              <span class=\"hljs-keyword\">new</span> PropertyName obj.unwrap().value\n          <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-121\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-121\">&#182;</a>\n              </div>\n              <p>A regular array pattern-match.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>            <span class=\"hljs-keyword\">new</span> Literal expandedIdx <span class=\"hljs-keyword\">or</span> idx\n        name = obj.unwrap().value\n        acc = idx.unwrap() <span class=\"hljs-keyword\">instanceof</span> PropertyName\n        val = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Literal(vvarText), [<span class=\"hljs-keyword\">new</span> (<span class=\"hljs-keyword\">if</span> acc <span class=\"hljs-keyword\">then</span> Access <span class=\"hljs-keyword\">else</span> Index) idx]\n        val = <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'?'</span>, val, defaultValue <span class=\"hljs-keyword\">if</span> defaultValue\n      <span class=\"hljs-keyword\">if</span> name?\n        message = isUnassignable name\n        obj.error message <span class=\"hljs-keyword\">if</span> message\n      assigns.push <span class=\"hljs-keyword\">new</span> Assign(obj, val, <span class=\"hljs-literal\">null</span>, param: @param, subpattern: <span class=\"hljs-literal\">yes</span>).compileToFragments o, LEVEL_LIST\n    assigns.push vvar <span class=\"hljs-keyword\">unless</span> top <span class=\"hljs-keyword\">or</span> @subpattern\n    fragments = @joinFragmentArrays assigns, <span class=\"hljs-string\">', '</span>\n    <span class=\"hljs-keyword\">if</span> o.level &lt; LEVEL_LIST <span class=\"hljs-keyword\">then</span> fragments <span class=\"hljs-keyword\">else</span> @wrapInBraces fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-122\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-122\">&#182;</a>\n              </div>\n              <p>When compiling a conditional assignment, take care to ensure that the\noperands are only evaluated once, even though we have to reference them\nmore than once.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileConditional: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [left, right] = @variable.cacheReference o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-123\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-123\">&#182;</a>\n              </div>\n              <p>Disallow conditional assignment of undefined variables.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> left.properties.length <span class=\"hljs-keyword\">and</span> left.base <span class=\"hljs-keyword\">instanceof</span> Literal <span class=\"hljs-keyword\">and</span>\n           left.base <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> ThisLiteral <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> o.scope.check left.base.value\n      @variable.error <span class=\"hljs-string\">\"the variable \\\"<span class=\"hljs-subst\">#{left.base.value}</span>\\\" can't be assigned with <span class=\"hljs-subst\">#{@context}</span> because it has not been declared before\"</span>\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">\"?\"</span> <span class=\"hljs-keyword\">in</span> @context\n      o.isExistentialEquals = <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-keyword\">new</span> If(<span class=\"hljs-keyword\">new</span> Existence(left), right, type: <span class=\"hljs-string\">'if'</span>).addElse(<span class=\"hljs-keyword\">new</span> Assign(right, @value, <span class=\"hljs-string\">'='</span>)).compileToFragments o\n    <span class=\"hljs-keyword\">else</span>\n      fragments = <span class=\"hljs-keyword\">new</span> Op(@context[...<span class=\"hljs-number\">-1</span>], left, <span class=\"hljs-keyword\">new</span> Assign(right, @value, <span class=\"hljs-string\">'='</span>)).compileToFragments o\n      <span class=\"hljs-keyword\">if</span> o.level &lt;= LEVEL_LIST <span class=\"hljs-keyword\">then</span> fragments <span class=\"hljs-keyword\">else</span> @wrapInBraces fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-124\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-124\">&#182;</a>\n              </div>\n              <p>Convert special math assignment operators like <code>a **= b</code> to the equivalent\nextended form <code>a = a ** b</code> and then compiles that.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileSpecialMath: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [left, right] = @variable.cacheReference o\n    <span class=\"hljs-keyword\">new</span> Assign(left, <span class=\"hljs-keyword\">new</span> Op(@context[...<span class=\"hljs-number\">-1</span>], right, @value)).compileToFragments o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-125\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-125\">&#182;</a>\n              </div>\n              <p>Compile the assignment from an array splice literal, using JavaScript’s\n<code>Array#splice</code> method.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileSplice: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    {range: {<span class=\"hljs-keyword\">from</span>, to, exclusive}} = @variable.properties.pop()\n    name = @variable.compile o\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">from</span>\n      [fromDecl, fromRef] = @cacheToCodeFragments <span class=\"hljs-keyword\">from</span>.cache o, LEVEL_OP\n    <span class=\"hljs-keyword\">else</span>\n      fromDecl = fromRef = <span class=\"hljs-string\">'0'</span>\n    <span class=\"hljs-keyword\">if</span> to\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">from</span>?.isNumber() <span class=\"hljs-keyword\">and</span> to.isNumber()\n        to = to.compile(o) - fromRef\n        to += <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">unless</span> exclusive\n      <span class=\"hljs-keyword\">else</span>\n        to = to.compile(o, LEVEL_ACCESS) + <span class=\"hljs-string\">' - '</span> + fromRef\n        to += <span class=\"hljs-string\">' + 1'</span> <span class=\"hljs-keyword\">unless</span> exclusive\n    <span class=\"hljs-keyword\">else</span>\n      to = <span class=\"hljs-string\">\"9e9\"</span>\n    [valDef, valRef] = @value.cache o, LEVEL_LIST\n    answer = [].concat @makeCode(<span class=\"hljs-string\">\"[].splice.apply(<span class=\"hljs-subst\">#{name}</span>, [<span class=\"hljs-subst\">#{fromDecl}</span>, <span class=\"hljs-subst\">#{to}</span>].concat(\"</span>), valDef, @makeCode(<span class=\"hljs-string\">\")), \"</span>), valRef\n    <span class=\"hljs-keyword\">if</span> o.level &gt; LEVEL_TOP <span class=\"hljs-keyword\">then</span> @wrapInBraces answer <span class=\"hljs-keyword\">else</span> answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-126\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-126\">&#182;</a>\n              </div>\n              <h3 id=\"code\">Code</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-127\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-127\">&#182;</a>\n              </div>\n              <p>A function definition. This is the only node that creates a new Scope.\nWhen for the purposes of walking the contents of a function body, the Code\nhas no <em>children</em> – they’re within the inner scope.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Code = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Code</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(params, body, tag)</span> -&gt;</span>\n    @params      = params <span class=\"hljs-keyword\">or</span> []\n    @body        = body <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">new</span> Block\n    @bound       = tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'boundfunc'</span>\n    @isGenerator = !!@body.contains (node) -&gt;\n      (node <span class=\"hljs-keyword\">instanceof</span> Op <span class=\"hljs-keyword\">and</span> node.isYield()) <span class=\"hljs-keyword\">or</span> node <span class=\"hljs-keyword\">instanceof</span> YieldReturn\n\n  children: [<span class=\"hljs-string\">'params'</span>, <span class=\"hljs-string\">'body'</span>]\n\n  isStatement: <span class=\"hljs-function\">-&gt;</span> !!@ctor\n\n  jumps: NO\n\n  makeScope: <span class=\"hljs-function\"><span class=\"hljs-params\">(parentScope)</span> -&gt;</span> <span class=\"hljs-keyword\">new</span> Scope parentScope, @body, <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-128\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-128\">&#182;</a>\n              </div>\n              <p>Compilation creates a new scope unless explicitly asked to share with the\nouter scope. Handles splat parameters in the parameter list by peeking at\nthe JavaScript <code>arguments</code> object. If the function is bound with the <code>=&gt;</code>\narrow, generates a wrapper that saves the current value of <code>this</code> through\na closure.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n\n    <span class=\"hljs-keyword\">if</span> @bound <span class=\"hljs-keyword\">and</span> o.scope.method?.bound\n      @context = o.scope.method.context</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-129\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-129\">&#182;</a>\n              </div>\n              <p>Handle bound functions early.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> @bound <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @context\n      @context = <span class=\"hljs-string\">'_this'</span>\n      wrapper = <span class=\"hljs-keyword\">new</span> Code [<span class=\"hljs-keyword\">new</span> Param <span class=\"hljs-keyword\">new</span> IdentifierLiteral @context], <span class=\"hljs-keyword\">new</span> Block [<span class=\"hljs-keyword\">this</span>]\n      boundfunc = <span class=\"hljs-keyword\">new</span> Call(wrapper, [<span class=\"hljs-keyword\">new</span> ThisLiteral])\n      boundfunc.updateLocationDataIfMissing @locationData\n      <span class=\"hljs-keyword\">return</span> boundfunc.compileNode(o)\n\n    o.scope         = del(o, <span class=\"hljs-string\">'classScope'</span>) <span class=\"hljs-keyword\">or</span> @makeScope o.scope\n    o.scope.shared  = del(o, <span class=\"hljs-string\">'sharedScope'</span>)\n    o.indent        += TAB\n    <span class=\"hljs-keyword\">delete</span> o.bare\n    <span class=\"hljs-keyword\">delete</span> o.isExistentialEquals\n    params = []\n    exprs  = []\n    <span class=\"hljs-keyword\">for</span> param <span class=\"hljs-keyword\">in</span> @params <span class=\"hljs-keyword\">when</span> param <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Expansion\n      o.scope.parameter param.asReference o\n    <span class=\"hljs-keyword\">for</span> param <span class=\"hljs-keyword\">in</span> @params <span class=\"hljs-keyword\">when</span> param.splat <span class=\"hljs-keyword\">or</span> param <span class=\"hljs-keyword\">instanceof</span> Expansion\n      <span class=\"hljs-keyword\">for</span> p <span class=\"hljs-keyword\">in</span> @params <span class=\"hljs-keyword\">when</span> p <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Expansion <span class=\"hljs-keyword\">and</span> p.name.value\n        o.scope.add p.name.value, <span class=\"hljs-string\">'var'</span>, <span class=\"hljs-literal\">yes</span>\n      splats = <span class=\"hljs-keyword\">new</span> Assign <span class=\"hljs-keyword\">new</span> Value(<span class=\"hljs-keyword\">new</span> Arr(p.asReference o <span class=\"hljs-keyword\">for</span> p <span class=\"hljs-keyword\">in</span> @params)),\n                          <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> IdentifierLiteral <span class=\"hljs-string\">'arguments'</span>\n      <span class=\"hljs-keyword\">break</span>\n    <span class=\"hljs-keyword\">for</span> param <span class=\"hljs-keyword\">in</span> @params\n      <span class=\"hljs-keyword\">if</span> param.isComplex()\n        val = ref = param.asReference o\n        val = <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'?'</span>, ref, param.value <span class=\"hljs-keyword\">if</span> param.value\n        exprs.push <span class=\"hljs-keyword\">new</span> Assign <span class=\"hljs-keyword\">new</span> Value(param.name), val, <span class=\"hljs-string\">'='</span>, param: <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">else</span>\n        ref = param\n        <span class=\"hljs-keyword\">if</span> param.value\n          lit = <span class=\"hljs-keyword\">new</span> Literal ref.name.value + <span class=\"hljs-string\">' == null'</span>\n          val = <span class=\"hljs-keyword\">new</span> Assign <span class=\"hljs-keyword\">new</span> Value(param.name), param.value, <span class=\"hljs-string\">'='</span>\n          exprs.push <span class=\"hljs-keyword\">new</span> If lit, val\n      params.push ref <span class=\"hljs-keyword\">unless</span> splats\n    wasEmpty = @body.isEmpty()\n    exprs.unshift splats <span class=\"hljs-keyword\">if</span> splats\n    @body.expressions.unshift exprs... <span class=\"hljs-keyword\">if</span> exprs.length\n    <span class=\"hljs-keyword\">for</span> p, i <span class=\"hljs-keyword\">in</span> params\n      params[i] = p.compileToFragments o\n      o.scope.parameter fragmentsToText params[i]\n    uniqs = []\n    @eachParamName (name, node) -&gt;\n      node.error <span class=\"hljs-string\">\"multiple parameters named <span class=\"hljs-subst\">#{name}</span>\"</span> <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">in</span> uniqs\n      uniqs.push name\n    @body.makeReturn() <span class=\"hljs-keyword\">unless</span> wasEmpty <span class=\"hljs-keyword\">or</span> @noReturn\n    code = <span class=\"hljs-string\">'function'</span>\n    code += <span class=\"hljs-string\">'*'</span> <span class=\"hljs-keyword\">if</span> @isGenerator\n    code += <span class=\"hljs-string\">' '</span> + @name <span class=\"hljs-keyword\">if</span> @ctor\n    code += <span class=\"hljs-string\">'('</span>\n    answer = [@makeCode(code)]\n    <span class=\"hljs-keyword\">for</span> p, i <span class=\"hljs-keyword\">in</span> params\n      <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">then</span> answer.push @makeCode <span class=\"hljs-string\">\", \"</span>\n      answer.push p...\n    answer.push @makeCode <span class=\"hljs-string\">') {'</span>\n    answer = answer.concat(@makeCode(<span class=\"hljs-string\">\"\\n\"</span>), @body.compileWithDeclarations(o), @makeCode(<span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{@tab}</span>\"</span>)) <span class=\"hljs-keyword\">unless</span> @body.isEmpty()\n    answer.push @makeCode <span class=\"hljs-string\">'}'</span>\n\n    <span class=\"hljs-keyword\">return</span> [@makeCode(@tab), answer...] <span class=\"hljs-keyword\">if</span> @ctor\n    <span class=\"hljs-keyword\">if</span> @front <span class=\"hljs-keyword\">or</span> (o.level &gt;= LEVEL_ACCESS) <span class=\"hljs-keyword\">then</span> @wrapInBraces answer <span class=\"hljs-keyword\">else</span> answer\n\n  eachParamName: <span class=\"hljs-function\"><span class=\"hljs-params\">(iterator)</span> -&gt;</span>\n    param.eachName iterator <span class=\"hljs-keyword\">for</span> param <span class=\"hljs-keyword\">in</span> @params</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-130\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-130\">&#182;</a>\n              </div>\n              <p>Short-circuit <code>traverseChildren</code> method to prevent it from crossing scope boundaries\nunless <code>crossScope</code> is <code>true</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  traverseChildren: <span class=\"hljs-function\"><span class=\"hljs-params\">(crossScope, func)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">super</span>(crossScope, func) <span class=\"hljs-keyword\">if</span> crossScope</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-131\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-131\">&#182;</a>\n              </div>\n              <h3 id=\"param\">Param</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-132\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-132\">&#182;</a>\n              </div>\n              <p>A parameter in a function definition. Beyond a typical JavaScript parameter,\nthese parameters can also attach themselves to the context of the function,\nas well as be a splat, gathering up a group of parameters into an array.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Param = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Param</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@name, @value, @splat)</span> -&gt;</span>\n    message = isUnassignable @name.unwrapAll().value\n    @name.error message <span class=\"hljs-keyword\">if</span> message\n    <span class=\"hljs-keyword\">if</span> @name <span class=\"hljs-keyword\">instanceof</span> Obj <span class=\"hljs-keyword\">and</span> @name.generated\n      token = @name.objects[<span class=\"hljs-number\">0</span>].operatorToken\n      token.error <span class=\"hljs-string\">\"unexpected <span class=\"hljs-subst\">#{token.value}</span>\"</span>\n\n  children: [<span class=\"hljs-string\">'name'</span>, <span class=\"hljs-string\">'value'</span>]\n\n  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @name.compileToFragments o, LEVEL_LIST\n\n  asReference: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> @reference <span class=\"hljs-keyword\">if</span> @reference\n    node = @name\n    <span class=\"hljs-keyword\">if</span> node.<span class=\"hljs-keyword\">this</span>\n      name = node.properties[<span class=\"hljs-number\">0</span>].name.value\n      name = <span class=\"hljs-string\">\"_<span class=\"hljs-subst\">#{name}</span>\"</span> <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">in</span> JS_FORBIDDEN\n      node = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable name\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> node.isComplex()\n      node = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">'arg'</span>\n    node = <span class=\"hljs-keyword\">new</span> Value node\n    node = <span class=\"hljs-keyword\">new</span> Splat node <span class=\"hljs-keyword\">if</span> @splat\n    node.updateLocationDataIfMissing @locationData\n    @reference = node\n\n  isComplex: <span class=\"hljs-function\">-&gt;</span>\n    @name.isComplex()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-133\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-133\">&#182;</a>\n              </div>\n              <p>Iterates the name or names of a <code>Param</code>.\nIn a sense, a destructured parameter represents multiple JS parameters. This\nmethod allows to iterate them all.\nThe <code>iterator</code> function will be called as <code>iterator(name, node)</code> where\n<code>name</code> is the name of the parameter and <code>node</code> is the AST node corresponding\nto that name.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  eachName: <span class=\"hljs-function\"><span class=\"hljs-params\">(iterator, name = @name)</span>-&gt;</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">atParam</span> = <span class=\"hljs-params\">(obj)</span> -&gt;</span> iterator <span class=\"hljs-string\">\"@<span class=\"hljs-subst\">#{obj.properties[<span class=\"hljs-number\">0</span>].name.value}</span>\"</span>, obj</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-134\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-134\">&#182;</a>\n              </div>\n              <ul>\n<li>simple literals <code>foo</code></li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">return</span> iterator name.value, name <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">instanceof</span> Literal</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-135\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-135\">&#182;</a>\n              </div>\n              <ul>\n<li>at-params <code>@foo</code></li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">return</span> atParam name <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">instanceof</span> Value\n    <span class=\"hljs-keyword\">for</span> obj <span class=\"hljs-keyword\">in</span> name.objects ? []</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-136\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-136\">&#182;</a>\n              </div>\n              <ul>\n<li>destructured parameter with default value</li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> obj.context?\n        obj = obj.variable</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-137\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-137\">&#182;</a>\n              </div>\n              <ul>\n<li>assignments within destructured parameters <code>{foo:bar}</code></li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Assign</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-138\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-138\">&#182;</a>\n              </div>\n              <p>… possibly with a default value</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> obj.value <span class=\"hljs-keyword\">instanceof</span> Assign\n          obj = obj.value\n        @eachName iterator, obj.value.unwrap()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-139\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-139\">&#182;</a>\n              </div>\n              <ul>\n<li>splats within destructured parameters <code>[xs...]</code></li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Splat\n        node = obj.name.unwrap()\n        iterator node.value, node\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Value</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-140\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-140\">&#182;</a>\n              </div>\n              <ul>\n<li>destructured parameters within destructured parameters <code>[{a}]</code></li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> obj.isArray() <span class=\"hljs-keyword\">or</span> obj.isObject()\n          @eachName iterator, obj.base</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-141\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-141\">&#182;</a>\n              </div>\n              <ul>\n<li>at-params within destructured parameters <code>{@foo}</code></li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> obj.<span class=\"hljs-keyword\">this</span>\n          atParam obj</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-142\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-142\">&#182;</a>\n              </div>\n              <ul>\n<li>simple destructured parameters {foo}</li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">else</span> iterator obj.base.value, obj.base\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Expansion\n        obj.error <span class=\"hljs-string\">\"illegal parameter <span class=\"hljs-subst\">#{obj.compile()}</span>\"</span>\n    <span class=\"hljs-keyword\">return</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-143\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-143\">&#182;</a>\n              </div>\n              <h3 id=\"splat\">Splat</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-144\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-144\">&#182;</a>\n              </div>\n              <p>A splat, either as a parameter to a function, an argument to a call,\nor as part of a destructuring assignment.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Splat = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Splat</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n\n  children: [<span class=\"hljs-string\">'name'</span>]\n\n  isAssignable: YES\n\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    @name = <span class=\"hljs-keyword\">if</span> name.compile <span class=\"hljs-keyword\">then</span> name <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">new</span> Literal name\n\n  assigns: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    @name.assigns name\n\n  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @name.compileToFragments o\n\n  unwrap: <span class=\"hljs-function\">-&gt;</span> @name</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-145\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-145\">&#182;</a>\n              </div>\n              <p>Utility function that converts an arbitrary number of elements, mixed with\nsplats, to a proper array.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  @compileSplattedArray: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, list, apply)</span> -&gt;</span>\n    index = <span class=\"hljs-number\">-1</span>\n    <span class=\"hljs-keyword\">continue</span> <span class=\"hljs-keyword\">while</span> (node = list[++index]) <span class=\"hljs-keyword\">and</span> node <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Splat\n    <span class=\"hljs-keyword\">return</span> [] <span class=\"hljs-keyword\">if</span> index &gt;= list.length\n    <span class=\"hljs-keyword\">if</span> list.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span>\n      node = list[<span class=\"hljs-number\">0</span>]\n      fragments = node.compileToFragments o, LEVEL_LIST\n      <span class=\"hljs-keyword\">return</span> fragments <span class=\"hljs-keyword\">if</span> apply\n      <span class=\"hljs-keyword\">return</span> [].concat node.makeCode(<span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{ utility <span class=\"hljs-string\">'slice'</span>, o }</span>.call(\"</span>), fragments, node.makeCode(<span class=\"hljs-string\">\")\"</span>)\n    args = list[index..]\n    <span class=\"hljs-keyword\">for</span> node, i <span class=\"hljs-keyword\">in</span> args\n      compiledNode = node.compileToFragments o, LEVEL_LIST\n      args[i] = <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> Splat\n      <span class=\"hljs-keyword\">then</span> [].concat node.makeCode(<span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{ utility <span class=\"hljs-string\">'slice'</span>, o }</span>.call(\"</span>), compiledNode, node.makeCode(<span class=\"hljs-string\">\")\"</span>)\n      <span class=\"hljs-keyword\">else</span> [].concat node.makeCode(<span class=\"hljs-string\">\"[\"</span>), compiledNode, node.makeCode(<span class=\"hljs-string\">\"]\"</span>)\n    <span class=\"hljs-keyword\">if</span> index <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n      node = list[<span class=\"hljs-number\">0</span>]\n      concatPart = (node.joinFragmentArrays args[<span class=\"hljs-number\">1.</span>.], <span class=\"hljs-string\">', '</span>)\n      <span class=\"hljs-keyword\">return</span> args[<span class=\"hljs-number\">0</span>].concat node.makeCode(<span class=\"hljs-string\">\".concat(\"</span>), concatPart, node.makeCode(<span class=\"hljs-string\">\")\"</span>)\n    base = (node.compileToFragments o, LEVEL_LIST <span class=\"hljs-keyword\">for</span> node <span class=\"hljs-keyword\">in</span> list[...index])\n    base = list[<span class=\"hljs-number\">0</span>].joinFragmentArrays base, <span class=\"hljs-string\">', '</span>\n    concatPart = list[index].joinFragmentArrays args, <span class=\"hljs-string\">', '</span>\n    [..., last] = list\n    [].concat list[<span class=\"hljs-number\">0</span>].makeCode(<span class=\"hljs-string\">\"[\"</span>), base, list[index].makeCode(<span class=\"hljs-string\">\"].concat(\"</span>), concatPart, last.makeCode(<span class=\"hljs-string\">\")\"</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-146\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-146\">&#182;</a>\n              </div>\n              <h3 id=\"expansion\">Expansion</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-147\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-147\">&#182;</a>\n              </div>\n              <p>Used to skip values inside an array destructuring (pattern matching) or\nparameter list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Expansion = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Expansion</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n\n  isComplex: NO\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @error <span class=\"hljs-string\">'Expansion must be used inside a destructuring assignment or parameter list'</span>\n\n  asReference: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">this</span>\n\n  eachName: <span class=\"hljs-function\"><span class=\"hljs-params\">(iterator)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-148\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-148\">&#182;</a>\n              </div>\n              <h3 id=\"while\">While</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-149\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-149\">&#182;</a>\n              </div>\n              <p>A while loop, the only sort of low-level loop exposed by CoffeeScript. From\nit, all other loops can be manufactured. Useful in cases where you need more\nflexibility or more speed than a comprehension can provide.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.While = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">While</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(condition, options)</span> -&gt;</span>\n    @condition = <span class=\"hljs-keyword\">if</span> options?.invert <span class=\"hljs-keyword\">then</span> condition.invert() <span class=\"hljs-keyword\">else</span> condition\n    @guard     = options?.guard\n\n  children: [<span class=\"hljs-string\">'condition'</span>, <span class=\"hljs-string\">'guard'</span>, <span class=\"hljs-string\">'body'</span>]\n\n  isStatement: YES\n\n  makeReturn: <span class=\"hljs-function\"><span class=\"hljs-params\">(res)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> res\n      <span class=\"hljs-keyword\">super</span>\n    <span class=\"hljs-keyword\">else</span>\n      @returns = <span class=\"hljs-keyword\">not</span> @jumps loop: <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">this</span>\n\n  addBody: <span class=\"hljs-function\"><span class=\"hljs-params\">(@body)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">this</span>\n\n  jumps: <span class=\"hljs-function\">-&gt;</span>\n    {expressions} = @body\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> expressions.length\n    <span class=\"hljs-keyword\">for</span> node <span class=\"hljs-keyword\">in</span> expressions\n      <span class=\"hljs-keyword\">return</span> jumpNode <span class=\"hljs-keyword\">if</span> jumpNode = node.jumps loop: <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-150\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-150\">&#182;</a>\n              </div>\n              <p>The main difference from a JavaScript <em>while</em> is that the CoffeeScript\n<em>while</em> can be used as a part of a larger expression – while loops may\nreturn an array containing the computed result of each iteration.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o.indent += TAB\n    set      = <span class=\"hljs-string\">''</span>\n    {body}   = <span class=\"hljs-keyword\">this</span>\n    <span class=\"hljs-keyword\">if</span> body.isEmpty()\n      body = @makeCode <span class=\"hljs-string\">''</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">if</span> @returns\n        body.makeReturn rvar = o.scope.freeVariable <span class=\"hljs-string\">'results'</span>\n        set  = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@tab}</span><span class=\"hljs-subst\">#{rvar}</span> = [];\\n\"</span>\n      <span class=\"hljs-keyword\">if</span> @guard\n        <span class=\"hljs-keyword\">if</span> body.expressions.length &gt; <span class=\"hljs-number\">1</span>\n          body.expressions.unshift <span class=\"hljs-keyword\">new</span> If (<span class=\"hljs-keyword\">new</span> Parens @guard).invert(), <span class=\"hljs-keyword\">new</span> StatementLiteral <span class=\"hljs-string\">\"continue\"</span>\n        <span class=\"hljs-keyword\">else</span>\n          body = Block.wrap [<span class=\"hljs-keyword\">new</span> If @guard, body] <span class=\"hljs-keyword\">if</span> @guard\n      body = [].concat @makeCode(<span class=\"hljs-string\">\"\\n\"</span>), (body.compileToFragments o, LEVEL_TOP), @makeCode(<span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{@tab}</span>\"</span>)\n    answer = [].concat @makeCode(set + @tab + <span class=\"hljs-string\">\"while (\"</span>), @condition.compileToFragments(o, LEVEL_PAREN),\n      @makeCode(<span class=\"hljs-string\">\") {\"</span>), body, @makeCode(<span class=\"hljs-string\">\"}\"</span>)\n    <span class=\"hljs-keyword\">if</span> @returns\n      answer.push @makeCode <span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{@tab}</span>return <span class=\"hljs-subst\">#{rvar}</span>;\"</span>\n    answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-151\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-151\">&#182;</a>\n              </div>\n              <h3 id=\"op\">Op</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-152\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-152\">&#182;</a>\n              </div>\n              <p>Simple Arithmetic and logical operations. Performs some conversion from\nCoffeeScript operations into their JavaScript equivalents.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Op = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Op</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(op, first, second, flip )</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> In first, second <span class=\"hljs-keyword\">if</span> op <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'in'</span>\n    <span class=\"hljs-keyword\">if</span> op <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'do'</span>\n      <span class=\"hljs-keyword\">return</span> @generateDo first\n    <span class=\"hljs-keyword\">if</span> op <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'new'</span>\n      <span class=\"hljs-keyword\">return</span> first.newInstance() <span class=\"hljs-keyword\">if</span> first <span class=\"hljs-keyword\">instanceof</span> Call <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> first.<span class=\"hljs-keyword\">do</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> first.isNew\n      first = <span class=\"hljs-keyword\">new</span> Parens first   <span class=\"hljs-keyword\">if</span> first <span class=\"hljs-keyword\">instanceof</span> Code <span class=\"hljs-keyword\">and</span> first.bound <span class=\"hljs-keyword\">or</span> first.<span class=\"hljs-keyword\">do</span>\n    @operator = CONVERSIONS[op] <span class=\"hljs-keyword\">or</span> op\n    @first    = first\n    @second   = second\n    @flip     = !!flip\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-153\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-153\">&#182;</a>\n              </div>\n              <p>The map of conversions from CoffeeScript to JavaScript symbols.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  CONVERSIONS =\n    <span class=\"hljs-string\">'=='</span>:        <span class=\"hljs-string\">'==='</span>\n    <span class=\"hljs-string\">'!='</span>:        <span class=\"hljs-string\">'!=='</span>\n    <span class=\"hljs-string\">'of'</span>:        <span class=\"hljs-string\">'in'</span>\n    <span class=\"hljs-string\">'yieldfrom'</span>: <span class=\"hljs-string\">'yield*'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-154\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-154\">&#182;</a>\n              </div>\n              <p>The map of invertible operators.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  INVERSIONS =\n    <span class=\"hljs-string\">'!=='</span>: <span class=\"hljs-string\">'==='</span>\n    <span class=\"hljs-string\">'==='</span>: <span class=\"hljs-string\">'!=='</span>\n\n  children: [<span class=\"hljs-string\">'first'</span>, <span class=\"hljs-string\">'second'</span>]\n\n  isNumber: <span class=\"hljs-function\">-&gt;</span>\n    @isUnary() <span class=\"hljs-keyword\">and</span> @operator <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'+'</span>, <span class=\"hljs-string\">'-'</span>] <span class=\"hljs-keyword\">and</span>\n      @first <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> @first.isNumber()\n\n  isYield: <span class=\"hljs-function\">-&gt;</span>\n    @operator <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'yield'</span>, <span class=\"hljs-string\">'yield*'</span>]\n\n  isUnary: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">not</span> @second\n\n  isComplex: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">not</span> @isNumber()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-155\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-155\">&#182;</a>\n              </div>\n              <p>Am I capable of\n<a href=\"https://docs.python.org/3/reference/expressions.html#not-in\">Python-style comparison chaining</a>?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  isChainable: <span class=\"hljs-function\">-&gt;</span>\n    @operator <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'&lt;'</span>, <span class=\"hljs-string\">'&gt;'</span>, <span class=\"hljs-string\">'&gt;='</span>, <span class=\"hljs-string\">'&lt;='</span>, <span class=\"hljs-string\">'==='</span>, <span class=\"hljs-string\">'!=='</span>]\n\n  invert: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isChainable() <span class=\"hljs-keyword\">and</span> @first.isChainable()\n      allInvertable = <span class=\"hljs-literal\">yes</span>\n      curr = <span class=\"hljs-keyword\">this</span>\n      <span class=\"hljs-keyword\">while</span> curr <span class=\"hljs-keyword\">and</span> curr.operator\n        allInvertable <span class=\"hljs-keyword\">and</span>= (curr.operator <span class=\"hljs-keyword\">of</span> INVERSIONS)\n        curr = curr.first\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> Parens(<span class=\"hljs-keyword\">this</span>).invert() <span class=\"hljs-keyword\">unless</span> allInvertable\n      curr = <span class=\"hljs-keyword\">this</span>\n      <span class=\"hljs-keyword\">while</span> curr <span class=\"hljs-keyword\">and</span> curr.operator\n        curr.invert = !curr.invert\n        curr.operator = INVERSIONS[curr.operator]\n        curr = curr.first\n      <span class=\"hljs-keyword\">this</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> op = INVERSIONS[@operator]\n      @operator = op\n      <span class=\"hljs-keyword\">if</span> @first.unwrap() <span class=\"hljs-keyword\">instanceof</span> Op\n        @first.invert()\n      <span class=\"hljs-keyword\">this</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @second\n      <span class=\"hljs-keyword\">new</span> Parens(<span class=\"hljs-keyword\">this</span>).invert()\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @operator <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'!'</span> <span class=\"hljs-keyword\">and</span> (fst = @first.unwrap()) <span class=\"hljs-keyword\">instanceof</span> Op <span class=\"hljs-keyword\">and</span>\n                                  fst.operator <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'!'</span>, <span class=\"hljs-string\">'in'</span>, <span class=\"hljs-string\">'instanceof'</span>]\n      fst\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'!'</span>, <span class=\"hljs-keyword\">this</span>\n\n  unfoldSoak: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @operator <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'++'</span>, <span class=\"hljs-string\">'--'</span>, <span class=\"hljs-string\">'delete'</span>] <span class=\"hljs-keyword\">and</span> unfoldSoak o, <span class=\"hljs-keyword\">this</span>, <span class=\"hljs-string\">'first'</span>\n\n  generateDo: <span class=\"hljs-function\"><span class=\"hljs-params\">(exp)</span> -&gt;</span>\n    passedParams = []\n    func = <span class=\"hljs-keyword\">if</span> exp <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> (ref = exp.value.unwrap()) <span class=\"hljs-keyword\">instanceof</span> Code\n      ref\n    <span class=\"hljs-keyword\">else</span>\n      exp\n    <span class=\"hljs-keyword\">for</span> param <span class=\"hljs-keyword\">in</span> func.params <span class=\"hljs-keyword\">or</span> []\n      <span class=\"hljs-keyword\">if</span> param.value\n        passedParams.push param.value\n        <span class=\"hljs-keyword\">delete</span> param.value\n      <span class=\"hljs-keyword\">else</span>\n        passedParams.push param\n    call = <span class=\"hljs-keyword\">new</span> Call exp, passedParams\n    call.<span class=\"hljs-keyword\">do</span> = <span class=\"hljs-literal\">yes</span>\n    call\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    isChain = @isChainable() <span class=\"hljs-keyword\">and</span> @first.isChainable()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-156\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-156\">&#182;</a>\n              </div>\n              <p>In chains, there’s no need to wrap bare obj literals in parens,\nas the chained expression is wrapped.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @first.front = @front <span class=\"hljs-keyword\">unless</span> isChain\n    <span class=\"hljs-keyword\">if</span> @operator <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'delete'</span> <span class=\"hljs-keyword\">and</span> o.scope.check(@first.unwrapAll().value)\n      @error <span class=\"hljs-string\">'delete operand may not be argument or var'</span>\n    <span class=\"hljs-keyword\">if</span> @operator <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'--'</span>, <span class=\"hljs-string\">'++'</span>]\n      message = isUnassignable @first.unwrapAll().value\n      @first.error message <span class=\"hljs-keyword\">if</span> message\n    <span class=\"hljs-keyword\">return</span> @compileYield     o <span class=\"hljs-keyword\">if</span> @isYield()\n    <span class=\"hljs-keyword\">return</span> @compileUnary     o <span class=\"hljs-keyword\">if</span> @isUnary()\n    <span class=\"hljs-keyword\">return</span> @compileChain     o <span class=\"hljs-keyword\">if</span> isChain\n    <span class=\"hljs-keyword\">switch</span> @operator\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'?'</span>  <span class=\"hljs-keyword\">then</span> @compileExistence o\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'**'</span> <span class=\"hljs-keyword\">then</span> @compilePower o\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'//'</span> <span class=\"hljs-keyword\">then</span> @compileFloorDivision o\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">'%%'</span> <span class=\"hljs-keyword\">then</span> @compileModulo o\n      <span class=\"hljs-keyword\">else</span>\n        lhs = @first.compileToFragments o, LEVEL_OP\n        rhs = @second.compileToFragments o, LEVEL_OP\n        answer = [].concat lhs, @makeCode(<span class=\"hljs-string\">\" <span class=\"hljs-subst\">#{@operator}</span> \"</span>), rhs\n        <span class=\"hljs-keyword\">if</span> o.level &lt;= LEVEL_OP <span class=\"hljs-keyword\">then</span> answer <span class=\"hljs-keyword\">else</span> @wrapInBraces answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-157\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-157\">&#182;</a>\n              </div>\n              <p>Mimic Python’s chained comparisons when multiple comparison operators are\nused sequentially. For example:</p>\n<pre><code>bin/coffee -e <span class=\"hljs-string\">'console.log 50 &lt; 65 &gt; 10'</span>\n<span class=\"hljs-literal\">true</span>\n</code></pre>\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileChain: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [@first.second, shared] = @first.second.cache o\n    fst = @first.compileToFragments o, LEVEL_OP\n    fragments = fst.concat @makeCode(<span class=\"hljs-string\">\" <span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @invert <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'&amp;&amp;'</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">'||'</span>}</span> \"</span>),\n      (shared.compileToFragments o), @makeCode(<span class=\"hljs-string\">\" <span class=\"hljs-subst\">#{@operator}</span> \"</span>), (@second.compileToFragments o, LEVEL_OP)\n    @wrapInBraces fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-158\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-158\">&#182;</a>\n              </div>\n              <p>Keep reference to the left expression, unless this an existential assignment</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileExistence: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @first.isComplex()\n      ref = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">'ref'</span>\n      fst = <span class=\"hljs-keyword\">new</span> Parens <span class=\"hljs-keyword\">new</span> Assign ref, @first\n    <span class=\"hljs-keyword\">else</span>\n      fst = @first\n      ref = fst\n    <span class=\"hljs-keyword\">new</span> If(<span class=\"hljs-keyword\">new</span> Existence(fst), ref, type: <span class=\"hljs-string\">'if'</span>).addElse(@second).compileToFragments o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-159\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-159\">&#182;</a>\n              </div>\n              <p>Compile a unary <strong>Op</strong>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileUnary: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    parts = []\n    op = @operator\n    parts.push [@makeCode op]\n    <span class=\"hljs-keyword\">if</span> op <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'!'</span> <span class=\"hljs-keyword\">and</span> @first <span class=\"hljs-keyword\">instanceof</span> Existence\n      @first.negated = <span class=\"hljs-keyword\">not</span> @first.negated\n      <span class=\"hljs-keyword\">return</span> @first.compileToFragments o\n    <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_ACCESS\n      <span class=\"hljs-keyword\">return</span> (<span class=\"hljs-keyword\">new</span> Parens <span class=\"hljs-keyword\">this</span>).compileToFragments o\n    plusMinus = op <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'+'</span>, <span class=\"hljs-string\">'-'</span>]\n    parts.push [@makeCode(<span class=\"hljs-string\">' '</span>)] <span class=\"hljs-keyword\">if</span> op <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'new'</span>, <span class=\"hljs-string\">'typeof'</span>, <span class=\"hljs-string\">'delete'</span>] <span class=\"hljs-keyword\">or</span>\n                      plusMinus <span class=\"hljs-keyword\">and</span> @first <span class=\"hljs-keyword\">instanceof</span> Op <span class=\"hljs-keyword\">and</span> @first.operator <span class=\"hljs-keyword\">is</span> op\n    <span class=\"hljs-keyword\">if</span> (plusMinus <span class=\"hljs-keyword\">and</span> @first <span class=\"hljs-keyword\">instanceof</span> Op) <span class=\"hljs-keyword\">or</span> (op <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'new'</span> <span class=\"hljs-keyword\">and</span> @first.isStatement o)\n      @first = <span class=\"hljs-keyword\">new</span> Parens @first\n    parts.push @first.compileToFragments o, LEVEL_OP\n    parts.reverse() <span class=\"hljs-keyword\">if</span> @flip\n    @joinFragmentArrays parts, <span class=\"hljs-string\">''</span>\n\n  compileYield: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    parts = []\n    op = @operator\n    <span class=\"hljs-keyword\">unless</span> o.scope.parent?\n      @error <span class=\"hljs-string\">'yield can only occur inside functions'</span>\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">'expression'</span> <span class=\"hljs-keyword\">in</span> Object.keys(@first) <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> (@first <span class=\"hljs-keyword\">instanceof</span> Throw)\n      parts.push @first.expression.compileToFragments o, LEVEL_OP <span class=\"hljs-keyword\">if</span> @first.expression?\n    <span class=\"hljs-keyword\">else</span>\n      parts.push [@makeCode <span class=\"hljs-string\">\"(\"</span>] <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_PAREN\n      parts.push [@makeCode op]\n      parts.push [@makeCode <span class=\"hljs-string\">\" \"</span>] <span class=\"hljs-keyword\">if</span> @first.base?.value <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">''</span>\n      parts.push @first.compileToFragments o, LEVEL_OP\n      parts.push [@makeCode <span class=\"hljs-string\">\")\"</span>] <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_PAREN\n    @joinFragmentArrays parts, <span class=\"hljs-string\">''</span>\n\n  compilePower: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-160\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-160\">&#182;</a>\n              </div>\n              <p>Make a Math.pow call</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    pow = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> IdentifierLiteral(<span class=\"hljs-string\">'Math'</span>), [<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName <span class=\"hljs-string\">'pow'</span>]\n    <span class=\"hljs-keyword\">new</span> Call(pow, [@first, @second]).compileToFragments o\n\n  compileFloorDivision: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    floor = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> IdentifierLiteral(<span class=\"hljs-string\">'Math'</span>), [<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName <span class=\"hljs-string\">'floor'</span>]\n    second = <span class=\"hljs-keyword\">if</span> @second.isComplex() <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">new</span> Parens @second <span class=\"hljs-keyword\">else</span> @second\n    div = <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">'/'</span>, @first, second\n    <span class=\"hljs-keyword\">new</span> Call(floor, [div]).compileToFragments o\n\n  compileModulo: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    mod = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Literal utility <span class=\"hljs-string\">'modulo'</span>, o\n    <span class=\"hljs-keyword\">new</span> Call(mod, [@first, @second]).compileToFragments o\n\n  toString: <span class=\"hljs-function\"><span class=\"hljs-params\">(idt)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">super</span> idt, @constructor.name + <span class=\"hljs-string\">' '</span> + @operator</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-161\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-161\">&#182;</a>\n              </div>\n              <h3 id=\"in\">In</h3>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.In = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">In</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@object, @array)</span> -&gt;</span>\n\n  children: [<span class=\"hljs-string\">'object'</span>, <span class=\"hljs-string\">'array'</span>]\n\n  invert: NEGATE\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @array <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> @array.isArray() <span class=\"hljs-keyword\">and</span> @array.base.objects.length\n      <span class=\"hljs-keyword\">for</span> obj <span class=\"hljs-keyword\">in</span> @array.base.objects <span class=\"hljs-keyword\">when</span> obj <span class=\"hljs-keyword\">instanceof</span> Splat\n        hasSplat = <span class=\"hljs-literal\">yes</span>\n        <span class=\"hljs-keyword\">break</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-162\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-162\">&#182;</a>\n              </div>\n              <p><code>compileOrTest</code> only if we have an array literal with no splats</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">return</span> @compileOrTest o <span class=\"hljs-keyword\">unless</span> hasSplat\n    @compileLoopTest o\n\n  compileOrTest: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [sub, ref] = @object.cache o, LEVEL_OP\n    [cmp, cnj] = <span class=\"hljs-keyword\">if</span> @negated <span class=\"hljs-keyword\">then</span> [<span class=\"hljs-string\">' !== '</span>, <span class=\"hljs-string\">' &amp;&amp; '</span>] <span class=\"hljs-keyword\">else</span> [<span class=\"hljs-string\">' === '</span>, <span class=\"hljs-string\">' || '</span>]\n    tests = []\n    <span class=\"hljs-keyword\">for</span> item, i <span class=\"hljs-keyword\">in</span> @array.base.objects\n      <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">then</span> tests.push @makeCode cnj\n      tests = tests.concat (<span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">then</span> ref <span class=\"hljs-keyword\">else</span> sub), @makeCode(cmp), item.compileToFragments(o, LEVEL_ACCESS)\n    <span class=\"hljs-keyword\">if</span> o.level &lt; LEVEL_OP <span class=\"hljs-keyword\">then</span> tests <span class=\"hljs-keyword\">else</span> @wrapInBraces tests\n\n  compileLoopTest: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [sub, ref] = @object.cache o, LEVEL_LIST\n    fragments = [].concat @makeCode(utility(<span class=\"hljs-string\">'indexOf'</span>, o) + <span class=\"hljs-string\">\".call(\"</span>), @array.compileToFragments(o, LEVEL_LIST),\n      @makeCode(<span class=\"hljs-string\">\", \"</span>), ref, @makeCode(<span class=\"hljs-string\">\") \"</span> + <span class=\"hljs-keyword\">if</span> @negated <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'&lt; 0'</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">'&gt;= 0'</span>)\n    <span class=\"hljs-keyword\">return</span> fragments <span class=\"hljs-keyword\">if</span> fragmentsToText(sub) <span class=\"hljs-keyword\">is</span> fragmentsToText(ref)\n    fragments = sub.concat @makeCode(<span class=\"hljs-string\">', '</span>), fragments\n    <span class=\"hljs-keyword\">if</span> o.level &lt; LEVEL_LIST <span class=\"hljs-keyword\">then</span> fragments <span class=\"hljs-keyword\">else</span> @wrapInBraces fragments\n\n  toString: <span class=\"hljs-function\"><span class=\"hljs-params\">(idt)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">super</span> idt, @constructor.name + <span class=\"hljs-keyword\">if</span> @negated <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'!'</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">''</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-163\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-163\">&#182;</a>\n              </div>\n              <h3 id=\"try\">Try</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-164\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-164\">&#182;</a>\n              </div>\n              <p>A classic <em>try/catch/finally</em> block.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Try = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Try</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@attempt, @errorVariable, @recovery, @ensure)</span> -&gt;</span>\n\n  children: [<span class=\"hljs-string\">'attempt'</span>, <span class=\"hljs-string\">'recovery'</span>, <span class=\"hljs-string\">'ensure'</span>]\n\n  isStatement: YES\n\n  jumps: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span> @attempt.jumps(o) <span class=\"hljs-keyword\">or</span> @recovery?.jumps(o)\n\n  makeReturn: <span class=\"hljs-function\"><span class=\"hljs-params\">(res)</span> -&gt;</span>\n    @attempt  = @attempt .makeReturn res <span class=\"hljs-keyword\">if</span> @attempt\n    @recovery = @recovery.makeReturn res <span class=\"hljs-keyword\">if</span> @recovery\n    <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-165\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-165\">&#182;</a>\n              </div>\n              <p>Compilation is more or less as you would expect – the <em>finally</em> clause\nis optional, the <em>catch</em> is not.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o.indent  += TAB\n    tryPart   = @attempt.compileToFragments o, LEVEL_TOP\n\n    catchPart = <span class=\"hljs-keyword\">if</span> @recovery\n      generatedErrorVariableName = o.scope.freeVariable <span class=\"hljs-string\">'error'</span>, reserve: <span class=\"hljs-literal\">no</span>\n      placeholder = <span class=\"hljs-keyword\">new</span> IdentifierLiteral generatedErrorVariableName\n      <span class=\"hljs-keyword\">if</span> @errorVariable\n        message = isUnassignable @errorVariable.unwrapAll().value\n        @errorVariable.error message <span class=\"hljs-keyword\">if</span> message\n        @recovery.unshift <span class=\"hljs-keyword\">new</span> Assign @errorVariable, placeholder\n      [].concat @makeCode(<span class=\"hljs-string\">\" catch (\"</span>), placeholder.compileToFragments(o), @makeCode(<span class=\"hljs-string\">\") {\\n\"</span>),\n        @recovery.compileToFragments(o, LEVEL_TOP), @makeCode(<span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{@tab}</span>}\"</span>)\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">unless</span> @ensure <span class=\"hljs-keyword\">or</span> @recovery\n      generatedErrorVariableName = o.scope.freeVariable <span class=\"hljs-string\">'error'</span>, reserve: <span class=\"hljs-literal\">no</span>\n      [@makeCode(<span class=\"hljs-string\">\" catch (<span class=\"hljs-subst\">#{generatedErrorVariableName}</span>) {}\"</span>)]\n    <span class=\"hljs-keyword\">else</span>\n      []\n\n    ensurePart = <span class=\"hljs-keyword\">if</span> @ensure <span class=\"hljs-keyword\">then</span> ([].concat @makeCode(<span class=\"hljs-string\">\" finally {\\n\"</span>), @ensure.compileToFragments(o, LEVEL_TOP),\n      @makeCode(<span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{@tab}</span>}\"</span>)) <span class=\"hljs-keyword\">else</span> []\n\n    [].concat @makeCode(<span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@tab}</span>try {\\n\"</span>),\n      tryPart,\n      @makeCode(<span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{@tab}</span>}\"</span>), catchPart, ensurePart</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-166\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-166\">&#182;</a>\n              </div>\n              <h3 id=\"throw\">Throw</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-167\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-167\">&#182;</a>\n              </div>\n              <p>Simple node to throw an exception.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Throw = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Throw</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@expression)</span> -&gt;</span>\n\n  children: [<span class=\"hljs-string\">'expression'</span>]\n\n  isStatement: YES\n  jumps:       NO</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-168\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-168\">&#182;</a>\n              </div>\n              <p>A <strong>Throw</strong> is already a return, of sorts…</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  makeReturn: THIS\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [].concat @makeCode(@tab + <span class=\"hljs-string\">\"throw \"</span>), @expression.compileToFragments(o), @makeCode(<span class=\"hljs-string\">\";\"</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-169\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-169\">&#182;</a>\n              </div>\n              <h3 id=\"existence\">Existence</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-170\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-170\">&#182;</a>\n              </div>\n              <p>Checks a variable for existence – not <em>null</em> and not <em>undefined</em>. This is\nsimilar to <code>.nil?</code> in Ruby, and avoids having to consult a JavaScript truth\ntable.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Existence = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Existence</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@expression)</span> -&gt;</span>\n\n  children: [<span class=\"hljs-string\">'expression'</span>]\n\n  invert: NEGATE\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @expression.front = @front\n    code = @expression.compile o, LEVEL_OP\n    <span class=\"hljs-keyword\">if</span> @expression.unwrap() <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> o.scope.check code\n      [cmp, cnj] = <span class=\"hljs-keyword\">if</span> @negated <span class=\"hljs-keyword\">then</span> [<span class=\"hljs-string\">'==='</span>, <span class=\"hljs-string\">'||'</span>] <span class=\"hljs-keyword\">else</span> [<span class=\"hljs-string\">'!=='</span>, <span class=\"hljs-string\">'&amp;&amp;'</span>]\n      code = <span class=\"hljs-string\">\"typeof <span class=\"hljs-subst\">#{code}</span> <span class=\"hljs-subst\">#{cmp}</span> \\\"undefined\\\" <span class=\"hljs-subst\">#{cnj}</span> <span class=\"hljs-subst\">#{code}</span> <span class=\"hljs-subst\">#{cmp}</span> null\"</span>\n    <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-171\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-171\">&#182;</a>\n              </div>\n              <p>do not use strict equality here; it will break existing code</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      code = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{code}</span> <span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @negated <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'=='</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">'!='</span>}</span> null\"</span>\n    [@makeCode(<span class=\"hljs-keyword\">if</span> o.level &lt;= LEVEL_COND <span class=\"hljs-keyword\">then</span> code <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">\"(<span class=\"hljs-subst\">#{code}</span>)\"</span>)]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-172\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-172\">&#182;</a>\n              </div>\n              <h3 id=\"parens\">Parens</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-173\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-173\">&#182;</a>\n              </div>\n              <p>An extra set of parentheses, specified explicitly in the source. At one time\nwe tried to clean up the results by detecting and removing redundant\nparentheses, but no longer – you can put in as many as you please.</p>\n<p>Parentheses are a good way to force any statement to become an expression.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Parens = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Parens</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@body)</span> -&gt;</span>\n\n  children: [<span class=\"hljs-string\">'body'</span>]\n\n  unwrap    : <span class=\"hljs-function\">-&gt;</span> @body\n  isComplex : <span class=\"hljs-function\">-&gt;</span> @body.isComplex()\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    expr = @body.unwrap()\n    <span class=\"hljs-keyword\">if</span> expr <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> expr.isAtomic()\n      expr.front = @front\n      <span class=\"hljs-keyword\">return</span> expr.compileToFragments o\n    fragments = expr.compileToFragments o, LEVEL_PAREN\n    bare = o.level &lt; LEVEL_OP <span class=\"hljs-keyword\">and</span> (expr <span class=\"hljs-keyword\">instanceof</span> Op <span class=\"hljs-keyword\">or</span> expr <span class=\"hljs-keyword\">instanceof</span> Call <span class=\"hljs-keyword\">or</span>\n      (expr <span class=\"hljs-keyword\">instanceof</span> For <span class=\"hljs-keyword\">and</span> expr.returns)) <span class=\"hljs-keyword\">and</span> (o.level &lt; LEVEL_COND <span class=\"hljs-keyword\">or</span>\n        fragments.length &lt;= <span class=\"hljs-number\">3</span>)\n    <span class=\"hljs-keyword\">if</span> bare <span class=\"hljs-keyword\">then</span> fragments <span class=\"hljs-keyword\">else</span> @wrapInBraces fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-174\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-174\">&#182;</a>\n              </div>\n              <h3 id=\"stringwithinterpolations\">StringWithInterpolations</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-175\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-175\">&#182;</a>\n              </div>\n              <p>Strings with interpolations are in fact just a variation of <code>Parens</code> with\nstring concatenation inside.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\nexports.StringWithInterpolations = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">StringWithInterpolations</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Parens</span></span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-176\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-176\">&#182;</a>\n              </div>\n              <p>Uncomment the following line in CoffeeScript 2, to allow all interpolated\nstrings to be output using the ES2015 syntax:\nunwrap: -&gt; this</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-177\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-177\">&#182;</a>\n              </div>\n              <p>This method produces an interpolated string using the new ES2015 syntax,\nwhich is opt-in by using tagged template literals. If this\nStringWithInterpolations isn’t inside a tagged template literal,\nfall back to the CoffeeScript 1.x output.\n(Remove this check in CoffeeScript 2.)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">unless</span> o.inTaggedTemplateCall\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">super</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-178\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-178\">&#182;</a>\n              </div>\n              <p>Assumption: expr is Value&gt;StringLiteral or Op</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    expr = @body.unwrap()\n\n    elements = []\n    expr.traverseChildren <span class=\"hljs-literal\">no</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> StringLiteral\n        elements.push node\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> Parens\n        elements.push node\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span>\n\n    fragments = []\n    fragments.push @makeCode <span class=\"hljs-string\">'`'</span>\n    <span class=\"hljs-keyword\">for</span> element <span class=\"hljs-keyword\">in</span> elements\n      <span class=\"hljs-keyword\">if</span> element <span class=\"hljs-keyword\">instanceof</span> StringLiteral\n        value = element.value[<span class=\"hljs-number\">1.</span>..<span class=\"hljs-number\">-1</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-179\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-179\">&#182;</a>\n              </div>\n              <p>Backticks and <code>${</code> inside template literals must be escaped.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        value = value.replace <span class=\"hljs-regexp\">/(\\\\*)(`|\\$\\{)/g</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(match, backslashes, toBeEscaped)</span> -&gt;</span>\n          <span class=\"hljs-keyword\">if</span> backslashes.length % <span class=\"hljs-number\">2</span> <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n            <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{backslashes}</span>\\\\<span class=\"hljs-subst\">#{toBeEscaped}</span>\"</span>\n          <span class=\"hljs-keyword\">else</span>\n            match\n        fragments.push @makeCode value\n      <span class=\"hljs-keyword\">else</span>\n        fragments.push @makeCode <span class=\"hljs-string\">'${'</span>\n        fragments.push element.compileToFragments(o, LEVEL_PAREN)...\n        fragments.push @makeCode <span class=\"hljs-string\">'}'</span>\n    fragments.push @makeCode <span class=\"hljs-string\">'`'</span>\n\n    fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-180\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-180\">&#182;</a>\n              </div>\n              <h3 id=\"for\">For</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-181\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-181\">&#182;</a>\n              </div>\n              <p>CoffeeScript’s replacement for the <em>for</em> loop is our array and object\ncomprehensions, that compile into <em>for</em> loops here. They also act as an\nexpression, able to return the result of each filtered iteration.</p>\n<p>Unlike Python array comprehensions, they can be multi-line, and you can pass\nthe current index of the loop as a second parameter. Unlike Ruby blocks,\nyou can map and filter in a single pass.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.For = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">For</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">While</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(body, source)</span> -&gt;</span>\n    {@source, @guard, @step, @name, @index} = source\n    @body    = Block.wrap [body]\n    @own     = !!source.own\n    @object  = !!source.object\n    @from    = !!source.<span class=\"hljs-keyword\">from</span>\n    @index.error <span class=\"hljs-string\">'cannot use index with for-from'</span> <span class=\"hljs-keyword\">if</span> @from <span class=\"hljs-keyword\">and</span> @index\n    source.ownTag.error <span class=\"hljs-string\">\"cannot use own with for-<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @from <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">'from'</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">'in'</span>}</span>\"</span> <span class=\"hljs-keyword\">if</span> @own <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @object\n    [@name, @index] = [@index, @name] <span class=\"hljs-keyword\">if</span> @object\n    @index.error <span class=\"hljs-string\">'index cannot be a pattern matching expression'</span> <span class=\"hljs-keyword\">if</span> @index <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @index.isAssignable()\n    @range   = @source <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> @source.base <span class=\"hljs-keyword\">instanceof</span> Range <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @source.properties.length <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @from\n    @pattern = @name <span class=\"hljs-keyword\">instanceof</span> Value\n    @index.error <span class=\"hljs-string\">'indexes do not apply to range loops'</span> <span class=\"hljs-keyword\">if</span> @range <span class=\"hljs-keyword\">and</span> @index\n    @name.error <span class=\"hljs-string\">'cannot pattern match over range loops'</span> <span class=\"hljs-keyword\">if</span> @range <span class=\"hljs-keyword\">and</span> @pattern\n    @returns = <span class=\"hljs-literal\">false</span>\n\n  children: [<span class=\"hljs-string\">'body'</span>, <span class=\"hljs-string\">'source'</span>, <span class=\"hljs-string\">'guard'</span>, <span class=\"hljs-string\">'step'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-182\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-182\">&#182;</a>\n              </div>\n              <p>Welcome to the hairiest method in all of CoffeeScript. Handles the inner\nloop, filtering, stepping, and result saving for array, object, and range\ncomprehensions. Some of the generated code can be shared in common, and\nsome cannot.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    body        = Block.wrap [@body]\n    [..., last] = body.expressions\n    @returns    = <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">if</span> last?.jumps() <span class=\"hljs-keyword\">instanceof</span> Return\n    source      = <span class=\"hljs-keyword\">if</span> @range <span class=\"hljs-keyword\">then</span> @source.base <span class=\"hljs-keyword\">else</span> @source\n    scope       = o.scope\n    name        = @name  <span class=\"hljs-keyword\">and</span> (@name.compile o, LEVEL_LIST) <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> @pattern\n    index       = @index <span class=\"hljs-keyword\">and</span> (@index.compile o, LEVEL_LIST)\n    scope.find(name)  <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @pattern\n    scope.find(index) <span class=\"hljs-keyword\">if</span> index <span class=\"hljs-keyword\">and</span> @index <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Value\n    rvar        = scope.freeVariable <span class=\"hljs-string\">'results'</span> <span class=\"hljs-keyword\">if</span> @returns\n    <span class=\"hljs-keyword\">if</span> @from\n      ivar = scope.freeVariable <span class=\"hljs-string\">'x'</span>, single: <span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> @pattern\n    <span class=\"hljs-keyword\">else</span>\n      ivar = (@object <span class=\"hljs-keyword\">and</span> index) <span class=\"hljs-keyword\">or</span> scope.freeVariable <span class=\"hljs-string\">'i'</span>, single: <span class=\"hljs-literal\">true</span>\n    kvar        = ((@range <span class=\"hljs-keyword\">or</span> @from) <span class=\"hljs-keyword\">and</span> name) <span class=\"hljs-keyword\">or</span> index <span class=\"hljs-keyword\">or</span> ivar\n    kvarAssign  = <span class=\"hljs-keyword\">if</span> kvar <span class=\"hljs-keyword\">isnt</span> ivar <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{kvar}</span> = \"</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">\"\"</span>\n    <span class=\"hljs-keyword\">if</span> @step <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @range\n      [step, stepVar] = @cacheToCodeFragments @step.cache o, LEVEL_LIST, isComplexOrAssignable\n      stepNum   = Number stepVar <span class=\"hljs-keyword\">if</span> @step.isNumber()\n    name        = ivar <span class=\"hljs-keyword\">if</span> @pattern\n    varPart     = <span class=\"hljs-string\">''</span>\n    guardPart   = <span class=\"hljs-string\">''</span>\n    defPart     = <span class=\"hljs-string\">''</span>\n    idt1        = @tab + TAB\n    <span class=\"hljs-keyword\">if</span> @range\n      forPartFragments = source.compileToFragments merge o,\n        {index: ivar, name, @step, isComplex: isComplexOrAssignable}\n    <span class=\"hljs-keyword\">else</span>\n      svar    = @source.compile o, LEVEL_LIST\n      <span class=\"hljs-keyword\">if</span> (name <span class=\"hljs-keyword\">or</span> @own) <span class=\"hljs-keyword\">and</span> @source.unwrap() <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral\n        defPart    += <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@tab}</span><span class=\"hljs-subst\">#{ref = scope.freeVariable <span class=\"hljs-string\">'ref'</span>}</span> = <span class=\"hljs-subst\">#{svar}</span>;\\n\"</span>\n        svar       = ref\n      <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @pattern <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @from\n        namePart   = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{name}</span> = <span class=\"hljs-subst\">#{svar}</span>[<span class=\"hljs-subst\">#{kvar}</span>]\"</span>\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> @object <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @from\n        defPart += <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@tab}</span><span class=\"hljs-subst\">#{step}</span>;\\n\"</span> <span class=\"hljs-keyword\">if</span> step <span class=\"hljs-keyword\">isnt</span> stepVar\n        down = stepNum &lt; <span class=\"hljs-number\">0</span>\n        lvar = scope.freeVariable <span class=\"hljs-string\">'len'</span> <span class=\"hljs-keyword\">unless</span> @step <span class=\"hljs-keyword\">and</span> stepNum? <span class=\"hljs-keyword\">and</span> down\n        declare = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{kvarAssign}</span><span class=\"hljs-subst\">#{ivar}</span> = 0, <span class=\"hljs-subst\">#{lvar}</span> = <span class=\"hljs-subst\">#{svar}</span>.length\"</span>\n        declareDown = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{kvarAssign}</span><span class=\"hljs-subst\">#{ivar}</span> = <span class=\"hljs-subst\">#{svar}</span>.length - 1\"</span>\n        compare = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{ivar}</span> &lt; <span class=\"hljs-subst\">#{lvar}</span>\"</span>\n        compareDown = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{ivar}</span> &gt;= 0\"</span>\n        <span class=\"hljs-keyword\">if</span> @step\n          <span class=\"hljs-keyword\">if</span> stepNum?\n            <span class=\"hljs-keyword\">if</span> down\n              compare = compareDown\n              declare = declareDown\n          <span class=\"hljs-keyword\">else</span>\n            compare = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{stepVar}</span> &gt; 0 ? <span class=\"hljs-subst\">#{compare}</span> : <span class=\"hljs-subst\">#{compareDown}</span>\"</span>\n            declare = <span class=\"hljs-string\">\"(<span class=\"hljs-subst\">#{stepVar}</span> &gt; 0 ? (<span class=\"hljs-subst\">#{declare}</span>) : <span class=\"hljs-subst\">#{declareDown}</span>)\"</span>\n          increment = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{ivar}</span> += <span class=\"hljs-subst\">#{stepVar}</span>\"</span>\n        <span class=\"hljs-keyword\">else</span>\n          increment = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> kvar <span class=\"hljs-keyword\">isnt</span> ivar <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\"++<span class=\"hljs-subst\">#{ivar}</span>\"</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{ivar}</span>++\"</span>}</span>\"</span>\n        forPartFragments = [@makeCode(<span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{declare}</span>; <span class=\"hljs-subst\">#{compare}</span>; <span class=\"hljs-subst\">#{kvarAssign}</span><span class=\"hljs-subst\">#{increment}</span>\"</span>)]\n    <span class=\"hljs-keyword\">if</span> @returns\n      resultPart   = <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@tab}</span><span class=\"hljs-subst\">#{rvar}</span> = [];\\n\"</span>\n      returnResult = <span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{@tab}</span>return <span class=\"hljs-subst\">#{rvar}</span>;\"</span>\n      body.makeReturn rvar\n    <span class=\"hljs-keyword\">if</span> @guard\n      <span class=\"hljs-keyword\">if</span> body.expressions.length &gt; <span class=\"hljs-number\">1</span>\n        body.expressions.unshift <span class=\"hljs-keyword\">new</span> If (<span class=\"hljs-keyword\">new</span> Parens @guard).invert(), <span class=\"hljs-keyword\">new</span> StatementLiteral <span class=\"hljs-string\">\"continue\"</span>\n      <span class=\"hljs-keyword\">else</span>\n        body = Block.wrap [<span class=\"hljs-keyword\">new</span> If @guard, body] <span class=\"hljs-keyword\">if</span> @guard\n    <span class=\"hljs-keyword\">if</span> @pattern\n      body.expressions.unshift <span class=\"hljs-keyword\">new</span> Assign @name, <span class=\"hljs-keyword\">if</span> @from <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">new</span> IdentifierLiteral kvar <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{svar}</span>[<span class=\"hljs-subst\">#{kvar}</span>]\"</span>\n    defPartFragments = [].concat @makeCode(defPart), @pluckDirectCall(o, body)\n    varPart = <span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{idt1}</span><span class=\"hljs-subst\">#{namePart}</span>;\"</span> <span class=\"hljs-keyword\">if</span> namePart\n    <span class=\"hljs-keyword\">if</span> @object\n      forPartFragments = [@makeCode(<span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{kvar}</span> in <span class=\"hljs-subst\">#{svar}</span>\"</span>)]\n      guardPart = <span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{idt1}</span>if (!<span class=\"hljs-subst\">#{utility <span class=\"hljs-string\">'hasProp'</span>, o}</span>.call(<span class=\"hljs-subst\">#{svar}</span>, <span class=\"hljs-subst\">#{kvar}</span>)) continue;\"</span> <span class=\"hljs-keyword\">if</span> @own\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @from\n      forPartFragments = [@makeCode(<span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{kvar}</span> of <span class=\"hljs-subst\">#{svar}</span>\"</span>)]\n    bodyFragments = body.compileToFragments merge(o, indent: idt1), LEVEL_TOP\n    <span class=\"hljs-keyword\">if</span> bodyFragments <span class=\"hljs-keyword\">and</span> bodyFragments.length &gt; <span class=\"hljs-number\">0</span>\n      bodyFragments = [].concat @makeCode(<span class=\"hljs-string\">\"\\n\"</span>), bodyFragments, @makeCode(<span class=\"hljs-string\">\"\\n\"</span>)\n    [].concat defPartFragments, @makeCode(<span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{resultPart <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">''</span>}</span><span class=\"hljs-subst\">#{@tab}</span>for (\"</span>),\n      forPartFragments, @makeCode(<span class=\"hljs-string\">\") {<span class=\"hljs-subst\">#{guardPart}</span><span class=\"hljs-subst\">#{varPart}</span>\"</span>), bodyFragments,\n      @makeCode(<span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@tab}</span>}<span class=\"hljs-subst\">#{returnResult <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">''</span>}</span>\"</span>)\n\n  pluckDirectCall: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, body)</span> -&gt;</span>\n    defs = []\n    <span class=\"hljs-keyword\">for</span> expr, idx <span class=\"hljs-keyword\">in</span> body.expressions\n      expr = expr.unwrapAll()\n      <span class=\"hljs-keyword\">continue</span> <span class=\"hljs-keyword\">unless</span> expr <span class=\"hljs-keyword\">instanceof</span> Call\n      val = expr.variable?.unwrapAll()\n      <span class=\"hljs-keyword\">continue</span> <span class=\"hljs-keyword\">unless</span> (val <span class=\"hljs-keyword\">instanceof</span> Code) <span class=\"hljs-keyword\">or</span>\n                      (val <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span>\n                      val.base?.unwrapAll() <span class=\"hljs-keyword\">instanceof</span> Code <span class=\"hljs-keyword\">and</span>\n                      val.properties.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span>\n                      val.properties[<span class=\"hljs-number\">0</span>].name?.value <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'call'</span>, <span class=\"hljs-string\">'apply'</span>])\n      fn    = val.base?.unwrapAll() <span class=\"hljs-keyword\">or</span> val\n      ref   = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">'fn'</span>\n      base  = <span class=\"hljs-keyword\">new</span> Value ref\n      <span class=\"hljs-keyword\">if</span> val.base\n        [val.base, base] = [base, val]\n      body.expressions[idx] = <span class=\"hljs-keyword\">new</span> Call base, expr.args\n      defs = defs.concat @makeCode(@tab), (<span class=\"hljs-keyword\">new</span> Assign(ref, fn).compileToFragments(o, LEVEL_TOP)), @makeCode(<span class=\"hljs-string\">';\\n'</span>)\n    defs</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-183\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-183\">&#182;</a>\n              </div>\n              <h3 id=\"switch\">Switch</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-184\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-184\">&#182;</a>\n              </div>\n              <p>A JavaScript <em>switch</em> statement. Converts into a returnable expression on-demand.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Switch = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Switch</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@subject, @cases, @otherwise)</span> -&gt;</span>\n\n  children: [<span class=\"hljs-string\">'subject'</span>, <span class=\"hljs-string\">'cases'</span>, <span class=\"hljs-string\">'otherwise'</span>]\n\n  isStatement: YES\n\n  jumps: <span class=\"hljs-function\"><span class=\"hljs-params\">(o = {block: <span class=\"hljs-literal\">yes</span>})</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> [conds, block] <span class=\"hljs-keyword\">in</span> @cases\n      <span class=\"hljs-keyword\">return</span> jumpNode <span class=\"hljs-keyword\">if</span> jumpNode = block.jumps o\n    @otherwise?.jumps o\n\n  makeReturn: <span class=\"hljs-function\"><span class=\"hljs-params\">(res)</span> -&gt;</span>\n    pair[<span class=\"hljs-number\">1</span>].makeReturn res <span class=\"hljs-keyword\">for</span> pair <span class=\"hljs-keyword\">in</span> @cases\n    @otherwise <span class=\"hljs-keyword\">or</span>= <span class=\"hljs-keyword\">new</span> Block [<span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">'void 0'</span>] <span class=\"hljs-keyword\">if</span> res\n    @otherwise?.makeReturn res\n    <span class=\"hljs-keyword\">this</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    idt1 = o.indent + TAB\n    idt2 = o.indent = idt1 + TAB\n    fragments = [].concat @makeCode(@tab + <span class=\"hljs-string\">\"switch (\"</span>),\n      (<span class=\"hljs-keyword\">if</span> @subject <span class=\"hljs-keyword\">then</span> @subject.compileToFragments(o, LEVEL_PAREN) <span class=\"hljs-keyword\">else</span> @makeCode <span class=\"hljs-string\">\"false\"</span>),\n      @makeCode(<span class=\"hljs-string\">\") {\\n\"</span>)\n    <span class=\"hljs-keyword\">for</span> [conditions, block], i <span class=\"hljs-keyword\">in</span> @cases\n      <span class=\"hljs-keyword\">for</span> cond <span class=\"hljs-keyword\">in</span> flatten [conditions]\n        cond  = cond.invert() <span class=\"hljs-keyword\">unless</span> @subject\n        fragments = fragments.concat @makeCode(idt1 + <span class=\"hljs-string\">\"case \"</span>), cond.compileToFragments(o, LEVEL_PAREN), @makeCode(<span class=\"hljs-string\">\":\\n\"</span>)\n      fragments = fragments.concat body, @makeCode(<span class=\"hljs-string\">'\\n'</span>) <span class=\"hljs-keyword\">if</span> (body = block.compileToFragments o, LEVEL_TOP).length &gt; <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">is</span> @cases.length - <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @otherwise\n      expr = @lastNonComment block.expressions\n      <span class=\"hljs-keyword\">continue</span> <span class=\"hljs-keyword\">if</span> expr <span class=\"hljs-keyword\">instanceof</span> Return <span class=\"hljs-keyword\">or</span> (expr <span class=\"hljs-keyword\">instanceof</span> Literal <span class=\"hljs-keyword\">and</span> expr.jumps() <span class=\"hljs-keyword\">and</span> expr.value <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'debugger'</span>)\n      fragments.push cond.makeCode(idt2 + <span class=\"hljs-string\">'break;\\n'</span>)\n    <span class=\"hljs-keyword\">if</span> @otherwise <span class=\"hljs-keyword\">and</span> @otherwise.expressions.length\n      fragments.push @makeCode(idt1 + <span class=\"hljs-string\">\"default:\\n\"</span>), (@otherwise.compileToFragments o, LEVEL_TOP)..., @makeCode(<span class=\"hljs-string\">\"\\n\"</span>)\n    fragments.push @makeCode @tab + <span class=\"hljs-string\">'}'</span>\n    fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-185\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-185\">&#182;</a>\n              </div>\n              <h3 id=\"if\">If</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-186\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-186\">&#182;</a>\n              </div>\n              <p><em>If/else</em> statements. Acts as an expression by pushing down requested returns\nto the last line of each clause.</p>\n<p>Single-expression <strong>Ifs</strong> are compiled into conditional operators if possible,\nbecause ternaries are already proper expressions, and don’t need conversion.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.If = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">If</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(condition, @body, options = {})</span> -&gt;</span>\n    @condition = <span class=\"hljs-keyword\">if</span> options.type <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'unless'</span> <span class=\"hljs-keyword\">then</span> condition.invert() <span class=\"hljs-keyword\">else</span> condition\n    @elseBody  = <span class=\"hljs-literal\">null</span>\n    @isChain   = <span class=\"hljs-literal\">false</span>\n    {@soak}    = options\n\n  children: [<span class=\"hljs-string\">'condition'</span>, <span class=\"hljs-string\">'body'</span>, <span class=\"hljs-string\">'elseBody'</span>]\n\n  bodyNode:     <span class=\"hljs-function\">-&gt;</span> @body?.unwrap()\n  elseBodyNode: <span class=\"hljs-function\">-&gt;</span> @elseBody?.unwrap()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-187\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-187\">&#182;</a>\n              </div>\n              <p>Rewrite a chain of <strong>Ifs</strong> to add a default case as the final <em>else</em>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addElse: <span class=\"hljs-function\"><span class=\"hljs-params\">(elseBody)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isChain\n      @elseBodyNode().addElse elseBody\n    <span class=\"hljs-keyword\">else</span>\n      @isChain  = elseBody <span class=\"hljs-keyword\">instanceof</span> If\n      @elseBody = @ensureBlock elseBody\n      @elseBody.updateLocationDataIfMissing elseBody.locationData\n    <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-188\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-188\">&#182;</a>\n              </div>\n              <p>The <strong>If</strong> only compiles into a statement if either of its bodies needs\nto be a statement. Otherwise a conditional operator is safe.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  isStatement: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o?.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP <span class=\"hljs-keyword\">or</span>\n      @bodyNode().isStatement(o) <span class=\"hljs-keyword\">or</span> @elseBodyNode()?.isStatement(o)\n\n  jumps: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span> @body.jumps(o) <span class=\"hljs-keyword\">or</span> @elseBody?.jumps(o)\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isStatement o <span class=\"hljs-keyword\">then</span> @compileStatement o <span class=\"hljs-keyword\">else</span> @compileExpression o\n\n  makeReturn: <span class=\"hljs-function\"><span class=\"hljs-params\">(res)</span> -&gt;</span>\n    @elseBody  <span class=\"hljs-keyword\">or</span>= <span class=\"hljs-keyword\">new</span> Block [<span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">'void 0'</span>] <span class=\"hljs-keyword\">if</span> res\n    @body     <span class=\"hljs-keyword\">and</span>= <span class=\"hljs-keyword\">new</span> Block [@body.makeReturn res]\n    @elseBody <span class=\"hljs-keyword\">and</span>= <span class=\"hljs-keyword\">new</span> Block [@elseBody.makeReturn res]\n    <span class=\"hljs-keyword\">this</span>\n\n  ensureBlock: <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> Block <span class=\"hljs-keyword\">then</span> node <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">new</span> Block [node]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-189\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-189\">&#182;</a>\n              </div>\n              <p>Compile the <code>If</code> as a regular <em>if-else</em> statement. Flattened chains\nforce inner <em>else</em> bodies into statement form.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileStatement: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    child    = del o, <span class=\"hljs-string\">'chainChild'</span>\n    exeq     = del o, <span class=\"hljs-string\">'isExistentialEquals'</span>\n\n    <span class=\"hljs-keyword\">if</span> exeq\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> If(@condition.invert(), @elseBodyNode(), type: <span class=\"hljs-string\">'if'</span>).compileToFragments o\n\n    indent   = o.indent + TAB\n    cond     = @condition.compileToFragments o, LEVEL_PAREN\n    body     = @ensureBlock(@body).compileToFragments merge o, {indent}\n    ifPart   = [].concat @makeCode(<span class=\"hljs-string\">\"if (\"</span>), cond, @makeCode(<span class=\"hljs-string\">\") {\\n\"</span>), body, @makeCode(<span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{@tab}</span>}\"</span>)\n    ifPart.unshift @makeCode @tab <span class=\"hljs-keyword\">unless</span> child\n    <span class=\"hljs-keyword\">return</span> ifPart <span class=\"hljs-keyword\">unless</span> @elseBody\n    answer = ifPart.concat @makeCode(<span class=\"hljs-string\">' else '</span>)\n    <span class=\"hljs-keyword\">if</span> @isChain\n      o.chainChild = <span class=\"hljs-literal\">yes</span>\n      answer = answer.concat @elseBody.unwrap().compileToFragments o, LEVEL_TOP\n    <span class=\"hljs-keyword\">else</span>\n      answer = answer.concat @makeCode(<span class=\"hljs-string\">\"{\\n\"</span>), @elseBody.compileToFragments(merge(o, {indent}), LEVEL_TOP), @makeCode(<span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{@tab}</span>}\"</span>)\n    answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-190\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-190\">&#182;</a>\n              </div>\n              <p>Compile the <code>If</code> as a conditional operator.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileExpression: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    cond = @condition.compileToFragments o, LEVEL_COND\n    body = @bodyNode().compileToFragments o, LEVEL_LIST\n    alt  = <span class=\"hljs-keyword\">if</span> @elseBodyNode() <span class=\"hljs-keyword\">then</span> @elseBodyNode().compileToFragments(o, LEVEL_LIST) <span class=\"hljs-keyword\">else</span> [@makeCode(<span class=\"hljs-string\">'void 0'</span>)]\n    fragments = cond.concat @makeCode(<span class=\"hljs-string\">\" ? \"</span>), body, @makeCode(<span class=\"hljs-string\">\" : \"</span>), alt\n    <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_COND <span class=\"hljs-keyword\">then</span> @wrapInBraces fragments <span class=\"hljs-keyword\">else</span> fragments\n\n  unfoldSoak: <span class=\"hljs-function\">-&gt;</span>\n    @soak <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-191\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-191\">&#182;</a>\n              </div>\n              <h2 id=\"constants\">Constants</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-192\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-192\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\nUTILITIES =</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-193\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-193\">&#182;</a>\n              </div>\n              <p>Correctly set up a prototype chain for inheritance, including a reference\nto the superclass for <code>super()</code> calls, and copies of any static properties.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  extend: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span> <span class=\"hljs-string\">\"\n    function(child, parent) {\n      for (var key in parent) {\n        if (<span class=\"hljs-subst\">#{utility <span class=\"hljs-string\">'hasProp'</span>, o}</span>.call(parent, key)) child[key] = parent[key];\n      }\n      function ctor() {\n        this.constructor = child;\n      }\n      ctor.prototype = parent.prototype;\n      child.prototype = new ctor();\n      child.__super__ = parent.prototype;\n      return child;\n    }\n  \"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-194\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-194\">&#182;</a>\n              </div>\n              <p>Create a function bound to the current value of “this”.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  bind: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">'\n    function(fn, me){\n      return function(){\n        return fn.apply(me, arguments);\n      };\n    }\n  '</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-195\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-195\">&#182;</a>\n              </div>\n              <p>Discover if an item is in an array.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  indexOf: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">\"\n    [].indexOf || function(item) {\n      for (var i = 0, l = this.length; i &lt; l; i++) {\n        if (i in this &amp;&amp; this[i] === item) return i;\n      }\n      return -1;\n    }\n  \"</span>\n\n  modulo: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">\"\"\"\n    function(a, b) { return (+a % (b = +b) + b) % b; }\n  \"\"\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-196\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-196\">&#182;</a>\n              </div>\n              <p>Shortcuts to speed up the lookup time for native functions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  hasProp: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">'{}.hasOwnProperty'</span>\n  slice  : <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">'[].slice'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-197\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-197\">&#182;</a>\n              </div>\n              <p>Levels indicate a node’s position in the AST. Useful for knowing if\nparens are necessary or superfluous.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>LEVEL_TOP    = <span class=\"hljs-number\">1</span>  <span class=\"hljs-comment\"># ...;</span>\nLEVEL_PAREN  = <span class=\"hljs-number\">2</span>  <span class=\"hljs-comment\"># (...)</span>\nLEVEL_LIST   = <span class=\"hljs-number\">3</span>  <span class=\"hljs-comment\"># [...]</span>\nLEVEL_COND   = <span class=\"hljs-number\">4</span>  <span class=\"hljs-comment\"># ... ? x : y</span>\nLEVEL_OP     = <span class=\"hljs-number\">5</span>  <span class=\"hljs-comment\"># !...</span>\nLEVEL_ACCESS = <span class=\"hljs-number\">6</span>  <span class=\"hljs-comment\"># ...[0]</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-198\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-198\">&#182;</a>\n              </div>\n              <p>Tabs are two spaces for pretty printing.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>TAB = <span class=\"hljs-string\">'  '</span>\n\nSIMPLENUM = <span class=\"hljs-regexp\">/^[+-]?\\d+$/</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-199\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-199\">&#182;</a>\n              </div>\n              <h2 id=\"helper-functions\">Helper Functions</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-200\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-200\">&#182;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-201\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-201\">&#182;</a>\n              </div>\n              <p>Helper for ensuring that utility functions are assigned at the top level.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">utility</span> = <span class=\"hljs-params\">(name, o)</span> -&gt;</span>\n  {root} = o.scope\n  <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">of</span> root.utilities\n    root.utilities[name]\n  <span class=\"hljs-keyword\">else</span>\n    ref = root.freeVariable name\n    root.assign ref, UTILITIES[name] o\n    root.utilities[name] = ref\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">multident</span> = <span class=\"hljs-params\">(code, tab)</span> -&gt;</span>\n  code = code.replace <span class=\"hljs-regexp\">/\\n/g</span>, <span class=\"hljs-string\">'$&amp;'</span> + tab\n  code.replace <span class=\"hljs-regexp\">/\\s+$/</span>, <span class=\"hljs-string\">''</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">isLiteralArguments</span> = <span class=\"hljs-params\">(node)</span> -&gt;</span>\n  node <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral <span class=\"hljs-keyword\">and</span> node.value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'arguments'</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">isLiteralThis</span> = <span class=\"hljs-params\">(node)</span> -&gt;</span>\n  node <span class=\"hljs-keyword\">instanceof</span> ThisLiteral <span class=\"hljs-keyword\">or</span>\n    (node <span class=\"hljs-keyword\">instanceof</span> Code <span class=\"hljs-keyword\">and</span> node.bound) <span class=\"hljs-keyword\">or</span>\n    node <span class=\"hljs-keyword\">instanceof</span> SuperCall\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">isComplexOrAssignable</span> = <span class=\"hljs-params\">(node)</span> -&gt;</span> node.isComplex() <span class=\"hljs-keyword\">or</span> node.isAssignable?()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-202\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-202\">&#182;</a>\n              </div>\n              <p>Unfold a node’s child if soak, then tuck the node under created <code>If</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">unfoldSoak</span> = <span class=\"hljs-params\">(o, parent, name)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> ifn = parent[name].unfoldSoak o\n  parent[name] = ifn.body\n  ifn.body = <span class=\"hljs-keyword\">new</span> Value parent\n  ifn</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/optparse.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>optparse.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>optparse.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>{repeat} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./helpers'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>A simple <strong>OptionParser</strong> class to parse option flags from the command-line.\nUse it like so:</p>\n<pre><code>parser  = <span class=\"hljs-keyword\">new</span> OptionParser switches, helpBanner\noptions = parser.parse process.argv\n</code></pre><p>The first non-option is considered to be the start of the file (and file\noption) list, and all subsequent arguments are left unparsed.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.OptionParser = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">OptionParser</span></span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Initialize with a list of valid options, in the form:</p>\n<pre><code>[short-flag, long-flag, description]\n</code></pre><p>Along with an optional banner for the usage help.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(rules, @banner)</span> -&gt;</span>\n    @rules = buildRules rules</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Parse the list of arguments, populating an <code>options</code> object with all of the\nspecified options, and return it. Options after the first non-option\nargument are treated as arguments. <code>options.arguments</code> will be an array\ncontaining the remaining arguments. This is a simpler API than many option\nparsers that allow you to attach callback actions for every flag. Instead,\nyou’re responsible for interpreting the options object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  parse: <span class=\"hljs-function\"><span class=\"hljs-params\">(args)</span> -&gt;</span>\n    options = arguments: []\n    skippingArgument = <span class=\"hljs-literal\">no</span>\n    originalArgs = args\n    args = normalizeArguments args\n    <span class=\"hljs-keyword\">for</span> arg, i <span class=\"hljs-keyword\">in</span> args\n      <span class=\"hljs-keyword\">if</span> skippingArgument\n        skippingArgument = <span class=\"hljs-literal\">no</span>\n        <span class=\"hljs-keyword\">continue</span>\n      <span class=\"hljs-keyword\">if</span> arg <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'--'</span>\n        pos = originalArgs.indexOf <span class=\"hljs-string\">'--'</span>\n        options.arguments = options.arguments.concat originalArgs[(pos + <span class=\"hljs-number\">1</span>)..]\n        <span class=\"hljs-keyword\">break</span>\n      isOption = !!(arg.match(LONG_FLAG) <span class=\"hljs-keyword\">or</span> arg.match(SHORT_FLAG))</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>the CS option parser is a little odd; options after the first\nnon-option argument are treated as non-option arguments themselves</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      seenNonOptionArg = options.arguments.length &gt; <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">unless</span> seenNonOptionArg\n        matchedRule = <span class=\"hljs-literal\">no</span>\n        <span class=\"hljs-keyword\">for</span> rule <span class=\"hljs-keyword\">in</span> @rules\n          <span class=\"hljs-keyword\">if</span> rule.shortFlag <span class=\"hljs-keyword\">is</span> arg <span class=\"hljs-keyword\">or</span> rule.longFlag <span class=\"hljs-keyword\">is</span> arg\n            value = <span class=\"hljs-literal\">true</span>\n            <span class=\"hljs-keyword\">if</span> rule.hasArgument\n              skippingArgument = <span class=\"hljs-literal\">yes</span>\n              value = args[i + <span class=\"hljs-number\">1</span>]\n            options[rule.name] = <span class=\"hljs-keyword\">if</span> rule.isList <span class=\"hljs-keyword\">then</span> (options[rule.name] <span class=\"hljs-keyword\">or</span> []).concat value <span class=\"hljs-keyword\">else</span> value\n            matchedRule = <span class=\"hljs-literal\">yes</span>\n            <span class=\"hljs-keyword\">break</span>\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> Error <span class=\"hljs-string\">\"unrecognized option: <span class=\"hljs-subst\">#{arg}</span>\"</span> <span class=\"hljs-keyword\">if</span> isOption <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> matchedRule\n      <span class=\"hljs-keyword\">if</span> seenNonOptionArg <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> isOption\n        options.arguments.push arg\n    options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Return the help text for this <strong>OptionParser</strong>, listing and describing all\nof the valid options, for <code>--help</code> and such.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  help: <span class=\"hljs-function\">-&gt;</span>\n    lines = []\n    lines.unshift <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{@banner}</span>\\n\"</span> <span class=\"hljs-keyword\">if</span> @banner\n    <span class=\"hljs-keyword\">for</span> rule <span class=\"hljs-keyword\">in</span> @rules\n      spaces  = <span class=\"hljs-number\">15</span> - rule.longFlag.length\n      spaces  = <span class=\"hljs-keyword\">if</span> spaces &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> repeat <span class=\"hljs-string\">' '</span>, spaces <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">''</span>\n      letPart = <span class=\"hljs-keyword\">if</span> rule.shortFlag <span class=\"hljs-keyword\">then</span> rule.shortFlag + <span class=\"hljs-string\">', '</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">'    '</span>\n      lines.push <span class=\"hljs-string\">'  '</span> + letPart + rule.longFlag + spaces + rule.description\n    <span class=\"hljs-string\">\"\\n<span class=\"hljs-subst\">#{ lines.join(<span class=\"hljs-string\">'\\n'</span>) }</span>\\n\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <h2 id=\"helpers\">Helpers</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Regex matchers for option flags.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>LONG_FLAG  = <span class=\"hljs-regexp\">/^(--\\w[\\w\\-]*)/</span>\nSHORT_FLAG = <span class=\"hljs-regexp\">/^(-\\w)$/</span>\nMULTI_FLAG = <span class=\"hljs-regexp\">/^-(\\w{2,})/</span>\nOPTIONAL   = <span class=\"hljs-regexp\">/\\[(\\w+(\\*?))\\]/</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>Build and return the list of option rules. If the optional <em>short-flag</em> is\nunspecified, leave it out by padding with <code>null</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">buildRules</span> = <span class=\"hljs-params\">(rules)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">for</span> tuple <span class=\"hljs-keyword\">in</span> rules\n    tuple.unshift <span class=\"hljs-literal\">null</span> <span class=\"hljs-keyword\">if</span> tuple.length &lt; <span class=\"hljs-number\">3</span>\n    buildRule tuple...</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Build a rule from a <code>-o</code> short flag, a <code>--output [DIR]</code> long flag, and the\ndescription of what the option does.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">buildRule</span> = <span class=\"hljs-params\">(shortFlag, longFlag, description, options = {})</span> -&gt;</span>\n  match     = longFlag.match(OPTIONAL)\n  longFlag  = longFlag.match(LONG_FLAG)[<span class=\"hljs-number\">1</span>]\n  {\n    name:         longFlag.substr <span class=\"hljs-number\">2</span>\n    shortFlag:    shortFlag\n    longFlag:     longFlag\n    description:  description\n    hasArgument:  !!(match <span class=\"hljs-keyword\">and</span> match[<span class=\"hljs-number\">1</span>])\n    isList:       !!(match <span class=\"hljs-keyword\">and</span> match[<span class=\"hljs-number\">2</span>])\n  }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>Normalize arguments by expanding merged flags into multiple flags. This allows\nyou to have <code>-wl</code> be the same as <code>--watch --lint</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">normalizeArguments</span> = <span class=\"hljs-params\">(args)</span> -&gt;</span>\n  args = args[..]\n  result = []\n  <span class=\"hljs-keyword\">for</span> arg <span class=\"hljs-keyword\">in</span> args\n    <span class=\"hljs-keyword\">if</span> match = arg.match MULTI_FLAG\n      result.push <span class=\"hljs-string\">'-'</span> + l <span class=\"hljs-keyword\">for</span> l <span class=\"hljs-keyword\">in</span> match[<span class=\"hljs-number\">1</span>].split <span class=\"hljs-string\">''</span>\n    <span class=\"hljs-keyword\">else</span>\n      result.push arg\n  result</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/public/stylesheets/normalize.css",
    "content": "/*! normalize.css v2.0.1 | MIT License | git.io/normalize */\n\n/* ==========================================================================\n   HTML5 display definitions\n   ========================================================================== */\n\n/*\n * Corrects `block` display not defined in IE 8/9.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection,\nsummary {\n    display: block;\n}\n\n/*\n * Corrects `inline-block` display not defined in IE 8/9.\n */\n\naudio,\ncanvas,\nvideo {\n    display: inline-block;\n}\n\n/*\n * Prevents modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n    display: none;\n    height: 0;\n}\n\n/*\n * Addresses styling for `hidden` attribute not present in IE 8/9.\n */\n\n[hidden] {\n    display: none;\n}\n\n/* ==========================================================================\n   Base\n   ========================================================================== */\n\n/*\n * 1. Sets default font family to sans-serif.\n * 2. Prevents iOS text size adjust after orientation change, without disabling\n *    user zoom.\n */\n\nhtml {\n    font-family: sans-serif; /* 1 */\n    -webkit-text-size-adjust: 100%; /* 2 */\n    -ms-text-size-adjust: 100%; /* 2 */\n}\n\n/*\n * Removes default margin.\n */\n\nbody {\n    margin: 0;\n}\n\n/* ==========================================================================\n   Links\n   ========================================================================== */\n\n/*\n * Addresses `outline` inconsistency between Chrome and other browsers.\n */\n\na:focus {\n    outline: thin dotted;\n}\n\n/*\n * Improves readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n    outline: 0;\n}\n\n/* ==========================================================================\n   Typography\n   ========================================================================== */\n\n/*\n * Addresses `h1` font sizes within `section` and `article` in Firefox 4+,\n * Safari 5, and Chrome.\n */\n\nh1 {\n    font-size: 2em;\n}\n\n/*\n * Addresses styling not present in IE 8/9, Safari 5, and Chrome.\n */\n\nabbr[title] {\n    border-bottom: 1px dotted;\n}\n\n/*\n * Addresses style set to `bolder` in Firefox 4+, Safari 5, and Chrome.\n */\n\nb,\nstrong {\n    font-weight: bold;\n}\n\n/*\n * Addresses styling not present in Safari 5 and Chrome.\n */\n\ndfn {\n    font-style: italic;\n}\n\n/*\n * Addresses styling not present in IE 8/9.\n */\n\nmark {\n    background: #ff0;\n    color: #000;\n}\n\n\n/*\n * Corrects font family set oddly in Safari 5 and Chrome.\n */\n\ncode,\nkbd,\npre,\nsamp {\n    font-family: monospace, serif;\n    font-size: 1em;\n}\n\n/*\n * Improves readability of pre-formatted text in all browsers.\n */\n\npre {\n    white-space: pre;\n    white-space: pre-wrap;\n    word-wrap: break-word;\n}\n\n/*\n * Sets consistent quote types.\n */\n\nq {\n    quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\n/*\n * Addresses inconsistent and variable font size in all browsers.\n */\n\nsmall {\n    font-size: 80%;\n}\n\n/*\n * Prevents `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n    font-size: 75%;\n    line-height: 0;\n    position: relative;\n    vertical-align: baseline;\n}\n\nsup {\n    top: -0.5em;\n}\n\nsub {\n    bottom: -0.25em;\n}\n\n/* ==========================================================================\n   Embedded content\n   ========================================================================== */\n\n/*\n * Removes border when inside `a` element in IE 8/9.\n */\n\nimg {\n    border: 0;\n}\n\n/*\n * Corrects overflow displayed oddly in IE 9.\n */\n\nsvg:not(:root) {\n    overflow: hidden;\n}\n\n/* ==========================================================================\n   Figures\n   ========================================================================== */\n\n/*\n * Addresses margin not present in IE 8/9 and Safari 5.\n */\n\nfigure {\n    margin: 0;\n}\n\n/* ==========================================================================\n   Forms\n   ========================================================================== */\n\n/*\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n    border: 1px solid #c0c0c0;\n    margin: 0 2px;\n    padding: 0.35em 0.625em 0.75em;\n}\n\n/*\n * 1. Corrects color not being inherited in IE 8/9.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n    border: 0; /* 1 */\n    padding: 0; /* 2 */\n}\n\n/*\n * 1. Corrects font family not being inherited in all browsers.\n * 2. Corrects font size not being inherited in all browsers.\n * 3. Addresses margins set differently in Firefox 4+, Safari 5, and Chrome\n */\n\nbutton,\ninput,\nselect,\ntextarea {\n    font-family: inherit; /* 1 */\n    font-size: 100%; /* 2 */\n    margin: 0; /* 3 */\n}\n\n/*\n * Addresses Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\nbutton,\ninput {\n    line-height: normal;\n}\n\n/*\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n *    and `video` controls.\n * 2. Corrects inability to style clickable `input` types in iOS.\n * 3. Improves usability and consistency of cursor style between image-type\n *    `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n    -webkit-appearance: button; /* 2 */\n    cursor: pointer; /* 3 */\n}\n\n/*\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\ninput[disabled] {\n    cursor: default;\n}\n\n/*\n * 1. Addresses box sizing set to `content-box` in IE 8/9.\n * 2. Removes excess padding in IE 8/9.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n    box-sizing: border-box; /* 1 */\n    padding: 0; /* 2 */\n}\n\n/*\n * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome.\n * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome\n *    (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n    -webkit-appearance: textfield; /* 1 */\n    -moz-box-sizing: content-box;\n    -webkit-box-sizing: content-box; /* 2 */\n    box-sizing: content-box;\n}\n\n/*\n * Removes inner padding and search cancel button in Safari 5 and Chrome\n * on OS X.\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n    -webkit-appearance: none;\n}\n\n/*\n * Removes inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n    border: 0;\n    padding: 0;\n}\n\n/*\n * 1. Removes default vertical scrollbar in IE 8/9.\n * 2. Improves readability and alignment in all browsers.\n */\n\ntextarea {\n    overflow: auto; /* 1 */\n    vertical-align: top; /* 2 */\n}\n\n/* ==========================================================================\n   Tables\n   ========================================================================== */\n\n/*\n * Remove most spacing between table cells.\n */\n\ntable {\n    border-collapse: collapse;\n    border-spacing: 0;\n}"
  },
  {
    "path": "docs/v1/annotated-source/register.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>register.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>register.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript  = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./coffee-script'</span>\nchild_process = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'child_process'</span>\nhelpers       = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./helpers'</span>\npath          = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'path'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Load and run a CoffeeScript file for Node, stripping any <code>BOM</code>s.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">loadFile</span> = <span class=\"hljs-params\">(<span class=\"hljs-built_in\">module</span>, filename)</span> -&gt;</span>\n  answer = CoffeeScript._compileFile filename, <span class=\"hljs-literal\">no</span>, <span class=\"hljs-literal\">yes</span>\n  <span class=\"hljs-built_in\">module</span>._compile answer, filename</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>If the installed version of Node supports <code>require.extensions</code>, register\nCoffeeScript as an extension.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">if</span> <span class=\"hljs-built_in\">require</span>.extensions\n  <span class=\"hljs-keyword\">for</span> ext <span class=\"hljs-keyword\">in</span> CoffeeScript.FILE_EXTENSIONS\n    <span class=\"hljs-built_in\">require</span>.extensions[ext] = loadFile</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Patch Node’s module loader to be able to handle multi-dot extensions.\nThis is a horrible thing that should not be required.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Module = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'module'</span>\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">findExtension</span> = <span class=\"hljs-params\">(filename)</span> -&gt;</span>\n    extensions = path.basename(filename).split <span class=\"hljs-string\">'.'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Remove the initial dot from dotfiles.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    extensions.shift() <span class=\"hljs-keyword\">if</span> extensions[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">''</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Start with the longest possible extension and work our way shortwards.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">while</span> extensions.shift()\n      curExtension = <span class=\"hljs-string\">'.'</span> + extensions.join <span class=\"hljs-string\">'.'</span>\n      <span class=\"hljs-keyword\">return</span> curExtension <span class=\"hljs-keyword\">if</span> Module._extensions[curExtension]\n    <span class=\"hljs-string\">'.js'</span>\n\n  Module::load = <span class=\"hljs-function\"><span class=\"hljs-params\">(filename)</span> -&gt;</span>\n    @filename = filename\n    @paths = Module._nodeModulePaths path.dirname filename\n    extension = findExtension filename\n    Module._extensions[extension](<span class=\"hljs-keyword\">this</span>, filename)\n    @loaded = <span class=\"hljs-literal\">true</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>If we’re on Node, patch <code>child_process.fork</code> so that Coffee scripts are able\nto fork both CoffeeScript files, and JavaScript files, directly.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">if</span> child_process\n  {fork} = child_process\n  binary = <span class=\"hljs-built_in\">require</span>.resolve <span class=\"hljs-string\">'../../bin/coffee'</span>\n  child_process.fork = <span class=\"hljs-function\"><span class=\"hljs-params\">(path, args, options)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> helpers.isCoffee path\n      <span class=\"hljs-keyword\">unless</span> Array.isArray args\n        options = args <span class=\"hljs-keyword\">or</span> {}\n        args = []\n      args = [path].concat args\n      path = binary\n    fork path, args, options</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/repl.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>repl.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>repl.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>fs = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'fs'</span>\npath = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'path'</span>\nvm = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'vm'</span>\nnodeREPL = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'repl'</span>\nCoffeeScript = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./coffee-script'</span>\n{merge, updateSyntaxError} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./helpers'</span>\n\nreplDefaults =\n  prompt: <span class=\"hljs-string\">'coffee&gt; '</span>,\n  historyFile: path.join process.env.HOME, <span class=\"hljs-string\">'.coffee_history'</span> <span class=\"hljs-keyword\">if</span> process.env.HOME\n  historyMaxInputSize: <span class=\"hljs-number\">10240</span>\n  eval: <span class=\"hljs-function\"><span class=\"hljs-params\">(input, context, filename, cb)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>XXX: multiline hack.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    input = input.replace <span class=\"hljs-regexp\">/\\uFF00/g</span>, <span class=\"hljs-string\">'\\n'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Node’s REPL sends the input ending with a newline and then wrapped in\nparens. Unwrap all that.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    input = input.replace <span class=\"hljs-regexp\">/^\\(([\\s\\S]*)\\n\\)$/m</span>, <span class=\"hljs-string\">'$1'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Node’s REPL v6.9.1+ sends the input wrapped in a try/catch statement.\nUnwrap that too.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    input = input.replace <span class=\"hljs-regexp\">/^\\s*try\\s*{([\\s\\S]*)}\\s*catch.*$/m</span>, <span class=\"hljs-string\">'$1'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Require AST nodes to do some AST manipulation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    {Block, Assign, Value, Literal} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">'./nodes'</span>\n\n    <span class=\"hljs-keyword\">try</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Tokenize the clean input.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      tokens = CoffeeScript.tokens input</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Collect referenced variable names just like in <code>CoffeeScript.compile</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      referencedVars = (\n        token[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">for</span> token <span class=\"hljs-keyword\">in</span> tokens <span class=\"hljs-keyword\">when</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'IDENTIFIER'</span>\n      )</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Generate the AST of the tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      ast = CoffeeScript.nodes tokens</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Add assignment to <code>_</code> variable to force the input to be an expression.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      ast = <span class=\"hljs-keyword\">new</span> Block [\n        <span class=\"hljs-keyword\">new</span> Assign (<span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">'__'</span>), ast, <span class=\"hljs-string\">'='</span>\n      ]\n      js = ast.compile {bare: <span class=\"hljs-literal\">yes</span>, locals: Object.keys(context), referencedVars}\n      cb <span class=\"hljs-literal\">null</span>, runInContext js, context, filename\n    <span class=\"hljs-keyword\">catch</span> err</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>AST’s <code>compile</code> does not add source code information to syntax errors.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      updateSyntaxError err, input\n      cb err\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">runInContext</span> = <span class=\"hljs-params\">(js, context, filename)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">if</span> context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-built_in\">global</span>\n    vm.runInThisContext js, filename\n  <span class=\"hljs-keyword\">else</span>\n    vm.runInContext js, context, filename\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">addMultilineHandler</span> = <span class=\"hljs-params\">(repl)</span> -&gt;</span>\n  {rli, inputStream, outputStream} = repl</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Node 0.11.12 changed API, prompt is now _prompt.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  origPrompt = repl._prompt ? repl.prompt\n\n  multiline =\n    enabled: <span class=\"hljs-literal\">off</span>\n    initialPrompt: origPrompt.replace <span class=\"hljs-regexp\">/^[^&gt; ]*/</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(x)</span> -&gt;</span> x.replace <span class=\"hljs-regexp\">/./g</span>, <span class=\"hljs-string\">'-'</span>\n    prompt: origPrompt.replace <span class=\"hljs-regexp\">/^[^&gt; ]*&gt;?/</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(x)</span> -&gt;</span> x.replace <span class=\"hljs-regexp\">/./g</span>, <span class=\"hljs-string\">'.'</span>\n    buffer: <span class=\"hljs-string\">''</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>Proxy node’s line listener</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  nodeLineListener = rli.listeners(<span class=\"hljs-string\">'line'</span>)[<span class=\"hljs-number\">0</span>]\n  rli.removeListener <span class=\"hljs-string\">'line'</span>, nodeLineListener\n  rli.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">'line'</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(cmd)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> multiline.enabled\n      multiline.buffer += <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{cmd}</span>\\n\"</span>\n      rli.setPrompt multiline.prompt\n      rli.prompt <span class=\"hljs-literal\">true</span>\n    <span class=\"hljs-keyword\">else</span>\n      rli.setPrompt origPrompt\n      nodeLineListener cmd\n    <span class=\"hljs-keyword\">return</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Handle Ctrl-v</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  inputStream.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">'keypress'</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(char, key)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> key <span class=\"hljs-keyword\">and</span> key.ctrl <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> key.meta <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> key.shift <span class=\"hljs-keyword\">and</span> key.name <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'v'</span>\n    <span class=\"hljs-keyword\">if</span> multiline.enabled</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>allow arbitrarily switching between modes any time before multiple lines are entered</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">unless</span> multiline.buffer.match <span class=\"hljs-regexp\">/\\n/</span>\n        multiline.enabled = <span class=\"hljs-keyword\">not</span> multiline.enabled\n        rli.setPrompt origPrompt\n        rli.prompt <span class=\"hljs-literal\">true</span>\n        <span class=\"hljs-keyword\">return</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>no-op unless the current line is empty</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> rli.line? <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> rli.line.match <span class=\"hljs-regexp\">/^\\s*$/</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>eval, print, loop</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      multiline.enabled = <span class=\"hljs-keyword\">not</span> multiline.enabled\n      rli.line = <span class=\"hljs-string\">''</span>\n      rli.cursor = <span class=\"hljs-number\">0</span>\n      rli.output.cursorTo <span class=\"hljs-number\">0</span>\n      rli.output.clearLine <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>XXX: multiline hack</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      multiline.buffer = multiline.buffer.replace <span class=\"hljs-regexp\">/\\n/g</span>, <span class=\"hljs-string\">'\\uFF00'</span>\n      rli.emit <span class=\"hljs-string\">'line'</span>, multiline.buffer\n      multiline.buffer = <span class=\"hljs-string\">''</span>\n    <span class=\"hljs-keyword\">else</span>\n      multiline.enabled = <span class=\"hljs-keyword\">not</span> multiline.enabled\n      rli.setPrompt multiline.initialPrompt\n      rli.prompt <span class=\"hljs-literal\">true</span>\n    <span class=\"hljs-keyword\">return</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>Store and load command history from a file</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">addHistory</span> = <span class=\"hljs-params\">(repl, filename, maxSize)</span> -&gt;</span>\n  lastLine = <span class=\"hljs-literal\">null</span>\n  <span class=\"hljs-keyword\">try</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>Get file info and at most maxSize of command history</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    stat = fs.statSync filename\n    size = Math.min maxSize, stat.size</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <p>Read last <code>size</code> bytes from the file</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    readFd = fs.openSync filename, <span class=\"hljs-string\">'r'</span>\n    buffer = <span class=\"hljs-keyword\">new</span> Buffer(size)\n    fs.readSync readFd, buffer, <span class=\"hljs-number\">0</span>, size, stat.size - size\n    fs.closeSync readFd</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>\n              </div>\n              <p>Set the history on the interpreter</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    repl.rli.history = buffer.toString().split(<span class=\"hljs-string\">'\\n'</span>).reverse()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>\n              </div>\n              <p>If the history file was truncated we should pop off a potential partial line</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    repl.rli.history.pop() <span class=\"hljs-keyword\">if</span> stat.size &gt; maxSize</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-23\">&#182;</a>\n              </div>\n              <p>Shift off the final blank newline</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    repl.rli.history.shift() <span class=\"hljs-keyword\">if</span> repl.rli.history[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">''</span>\n    repl.rli.historyIndex = <span class=\"hljs-number\">-1</span>\n    lastLine = repl.rli.history[<span class=\"hljs-number\">0</span>]\n\n  fd = fs.openSync filename, <span class=\"hljs-string\">'a'</span>\n\n  repl.rli.addListener <span class=\"hljs-string\">'line'</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(code)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> code <span class=\"hljs-keyword\">and</span> code.length <span class=\"hljs-keyword\">and</span> code <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'.history'</span> <span class=\"hljs-keyword\">and</span> code <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'.exit'</span> <span class=\"hljs-keyword\">and</span> lastLine <span class=\"hljs-keyword\">isnt</span> code</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-24\">&#182;</a>\n              </div>\n              <p>Save the latest command in the file</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      fs.writeSync fd, <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{code}</span>\\n\"</span>\n      lastLine = code\n\n  repl.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">'exit'</span>, <span class=\"hljs-function\">-&gt;</span> fs.closeSync fd</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-25\">&#182;</a>\n              </div>\n              <p>Add a command to show the history stack</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  repl.commands[getCommandId(repl, <span class=\"hljs-string\">'history'</span>)] =\n    help: <span class=\"hljs-string\">'Show command history'</span>\n    action: <span class=\"hljs-function\">-&gt;</span>\n      repl.outputStream.write <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{repl.rli.history[..].reverse().join <span class=\"hljs-string\">'\\n'</span>}</span>\\n\"</span>\n      repl.displayPrompt()\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">getCommandId</span> = <span class=\"hljs-params\">(repl, commandName)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-26\">&#182;</a>\n              </div>\n              <p>Node 0.11 changed API, a command such as ‘.help’ is now stored as ‘help’</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  commandsHaveLeadingDot = repl.commands[<span class=\"hljs-string\">'.help'</span>]?\n  <span class=\"hljs-keyword\">if</span> commandsHaveLeadingDot <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">\".<span class=\"hljs-subst\">#{commandName}</span>\"</span> <span class=\"hljs-keyword\">else</span> commandName\n\n<span class=\"hljs-built_in\">module</span>.exports =\n  start: <span class=\"hljs-function\"><span class=\"hljs-params\">(opts = {})</span> -&gt;</span>\n    [major, minor, build] = process.versions.node.split(<span class=\"hljs-string\">'.'</span>).map (n) -&gt; parseInt(n, <span class=\"hljs-number\">10</span>)\n\n    <span class=\"hljs-keyword\">if</span> major <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> minor &lt; <span class=\"hljs-number\">8</span>\n      <span class=\"hljs-built_in\">console</span>.warn <span class=\"hljs-string\">\"Node 0.8.0+ required for CoffeeScript REPL\"</span>\n      process.exit <span class=\"hljs-number\">1</span>\n\n    CoffeeScript.register()\n    process.argv = [<span class=\"hljs-string\">'coffee'</span>].concat process.argv[<span class=\"hljs-number\">2.</span>.]\n    opts = merge replDefaults, opts\n    repl = nodeREPL.start opts\n    runInContext opts.prelude, repl.context, <span class=\"hljs-string\">'prelude'</span> <span class=\"hljs-keyword\">if</span> opts.prelude\n    repl.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">'exit'</span>, <span class=\"hljs-function\">-&gt;</span> repl.outputStream.write <span class=\"hljs-string\">'\\n'</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> repl.rli.closed\n    addMultilineHandler repl\n    addHistory repl, opts.historyFile, opts.historyMaxInputSize <span class=\"hljs-keyword\">if</span> opts.historyFile</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-27\">&#182;</a>\n              </div>\n              <p>Adapt help inherited from the node REPL</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    repl.commands[getCommandId(repl, <span class=\"hljs-string\">'load'</span>)].help = <span class=\"hljs-string\">'Load code from a file into this REPL session'</span>\n    repl</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/rewriter.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>rewriter.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>rewriter.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              <p>The CoffeeScript language has a good deal of optional syntax, implicit syntax,\nand shorthand syntax. This can greatly complicate a grammar and bloat\nthe resulting parse table. Instead of making the parser handle it all, we take\na series of passes over the token stream, using this <strong>Rewriter</strong> to convert\nshorthand into the unambiguous long form, add implicit indentation and\nparentheses, and generally clean things up.</p>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Create a generated token: one that exists due to a use of implicit syntax.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">generate</span> = <span class=\"hljs-params\">(tag, value, origin)</span> -&gt;</span>\n  tok = [tag, value]\n  tok.generated = <span class=\"hljs-literal\">yes</span>\n  tok.origin = origin <span class=\"hljs-keyword\">if</span> origin\n  tok</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>The <strong>Rewriter</strong> class is used by the <a href=\"lexer.html\">Lexer</a>, directly against\nits internal array of tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Rewriter = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Rewriter</span></span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Rewrite the token stream in multiple passes, one logical filter at\na time. This could certainly be changed into a single pass through the\nstream, with a big ol’ efficient switch, but it’s much nicer to work with\nlike this. The order of these passes matters – indentation must be\ncorrected before implicit parentheses can be wrapped around blocks of code.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  rewrite: <span class=\"hljs-function\"><span class=\"hljs-params\">(@tokens)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Helpful snippet for debugging:\n    console.log (t[0] + ‘/‘ + t[1] for t in @tokens).join ‘ ‘</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @removeLeadingNewlines()\n    @closeOpenCalls()\n    @closeOpenIndexes()\n    @normalizeLines()\n    @tagPostfixConditionals()\n    @addImplicitBracesAndParens()\n    @addLocationDataToGeneratedTokens()\n    @fixOutdentLocationData()\n    @tokens</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Rewrite the token stream, looking one token ahead and behind.\nAllow the return value of the block to tell us how many tokens to move\nforwards (or backwards) in the stream, to make sure we don’t miss anything\nas tokens are inserted and removed, and the stream changes length under\nour feet.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  scanTokens: <span class=\"hljs-function\"><span class=\"hljs-params\">(block)</span> -&gt;</span>\n    {tokens} = <span class=\"hljs-keyword\">this</span>\n    i = <span class=\"hljs-number\">0</span>\n    i += block.call <span class=\"hljs-keyword\">this</span>, token, i, tokens <span class=\"hljs-keyword\">while</span> token = tokens[i]\n    <span class=\"hljs-literal\">true</span>\n\n  detectEnd: <span class=\"hljs-function\"><span class=\"hljs-params\">(i, condition, action)</span> -&gt;</span>\n    {tokens} = <span class=\"hljs-keyword\">this</span>\n    levels = <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">while</span> token = tokens[i]\n      <span class=\"hljs-keyword\">return</span> action.call <span class=\"hljs-keyword\">this</span>, token, i     <span class=\"hljs-keyword\">if</span> levels <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> condition.call <span class=\"hljs-keyword\">this</span>, token, i\n      <span class=\"hljs-keyword\">return</span> action.call <span class=\"hljs-keyword\">this</span>, token, i - <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> token <span class=\"hljs-keyword\">or</span> levels &lt; <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> EXPRESSION_START\n        levels += <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> EXPRESSION_END\n        levels -= <span class=\"hljs-number\">1</span>\n      i += <span class=\"hljs-number\">1</span>\n    i - <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Leading newlines would introduce an ambiguity in the grammar, so we\ndispatch them here.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  removeLeadingNewlines: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">for</span> [tag], i <span class=\"hljs-keyword\">in</span> @tokens <span class=\"hljs-keyword\">when</span> tag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'TERMINATOR'</span>\n    @tokens.splice <span class=\"hljs-number\">0</span>, i <span class=\"hljs-keyword\">if</span> i</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>The lexer has tagged the opening parenthesis of a method call. Match it with\nits paired close. We have the mis-nested outdent case included here for\ncalls that close on the same line, just before their outdent.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  closeOpenCalls: <span class=\"hljs-function\">-&gt;</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">condition</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">')'</span>, <span class=\"hljs-string\">'CALL_END'</span>] <span class=\"hljs-keyword\">or</span>\n      token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'OUTDENT'</span> <span class=\"hljs-keyword\">and</span> @tag(i - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">')'</span>\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">action</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      @tokens[<span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'OUTDENT'</span> <span class=\"hljs-keyword\">then</span> i - <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> i][<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'CALL_END'</span>\n\n    @scanTokens (token, i) -&gt;\n      @detectEnd i + <span class=\"hljs-number\">1</span>, condition, action <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'CALL_START'</span>\n      <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>The lexer has tagged the opening parenthesis of an indexing operation call.\nMatch it with its paired close.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  closeOpenIndexes: <span class=\"hljs-function\">-&gt;</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">condition</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">']'</span>, <span class=\"hljs-string\">'INDEX_END'</span>]\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">action</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      token[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'INDEX_END'</span>\n\n    @scanTokens (token, i) -&gt;\n      @detectEnd i + <span class=\"hljs-number\">1</span>, condition, action <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'INDEX_START'</span>\n      <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>Match tags in token stream starting at <code>i</code> with <code>pattern</code>, skipping ‘HERECOMMENT’s.\n<code>pattern</code> may consist of strings (equality), an array of strings (one of)\nor null (wildcard). Returns the index of the match or -1 if no match.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  indexOfTag: <span class=\"hljs-function\"><span class=\"hljs-params\">(i, pattern...)</span> -&gt;</span>\n    fuzz = <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">for</span> j <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-number\">0</span> ... pattern.length]\n      fuzz += <span class=\"hljs-number\">2</span> <span class=\"hljs-keyword\">while</span> @tag(i + j + fuzz) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'HERECOMMENT'</span>\n      <span class=\"hljs-keyword\">continue</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> pattern[j]?\n      pattern[j] = [pattern[j]] <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">typeof</span> pattern[j] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'string'</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">-1</span> <span class=\"hljs-keyword\">if</span> @tag(i + j + fuzz) <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> pattern[j]\n    i + j + fuzz - <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Returns <code>yes</code> if standing in front of something looking like\n<code>@&lt;x&gt;:</code>, <code>&lt;x&gt;:</code> or <code>&lt;EXPRESSION_START&gt;&lt;x&gt;...&lt;EXPRESSION_END&gt;:</code>,\nskipping over ‘HERECOMMENT’s.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  looksObjectish: <span class=\"hljs-function\"><span class=\"hljs-params\">(j)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @indexOfTag(j, <span class=\"hljs-string\">'@'</span>, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-string\">':'</span>) &gt; <span class=\"hljs-number\">-1</span> <span class=\"hljs-keyword\">or</span> @indexOfTag(j, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-string\">':'</span>) &gt; <span class=\"hljs-number\">-1</span>\n    index = @indexOfTag(j, EXPRESSION_START)\n    <span class=\"hljs-keyword\">if</span> index &gt; <span class=\"hljs-number\">-1</span>\n      end = <span class=\"hljs-literal\">null</span>\n      @detectEnd index + <span class=\"hljs-number\">1</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">(token)</span> -&gt;</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> EXPRESSION_END), <span class=\"hljs-function\">(<span class=\"hljs-params\">(token, i)</span> -&gt;</span> end = i)\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @tag(end + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">':'</span>\n    <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>Returns <code>yes</code> if current line of tokens contain an element of tags on same\nexpression level. Stop searching at LINEBREAKS or explicit start of\ncontaining balanced expression.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  findTagsBackwards: <span class=\"hljs-function\"><span class=\"hljs-params\">(i, tags)</span> -&gt;</span>\n    backStack = []\n    <span class=\"hljs-keyword\">while</span> i &gt;= <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> (backStack.length <span class=\"hljs-keyword\">or</span>\n          @tag(i) <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> tags <span class=\"hljs-keyword\">and</span>\n          (@tag(i) <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> EXPRESSION_START <span class=\"hljs-keyword\">or</span> @tokens[i].generated) <span class=\"hljs-keyword\">and</span>\n          @tag(i) <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> LINEBREAKS)\n      backStack.push @tag(i) <span class=\"hljs-keyword\">if</span> @tag(i) <span class=\"hljs-keyword\">in</span> EXPRESSION_END\n      backStack.pop() <span class=\"hljs-keyword\">if</span> @tag(i) <span class=\"hljs-keyword\">in</span> EXPRESSION_START <span class=\"hljs-keyword\">and</span> backStack.length\n      i -= <span class=\"hljs-number\">1</span>\n    @tag(i) <span class=\"hljs-keyword\">in</span> tags</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Look for signs of implicit calls and objects in the token stream and\nadd them.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addImplicitBracesAndParens: <span class=\"hljs-function\">-&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>Track current balancing depth (both implicit and explicit) on stack.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    stack = []\n    start = <span class=\"hljs-literal\">null</span>\n\n    @scanTokens (token, i, tokens) -&gt;\n      [tag]     = token\n      [prevTag] = prevToken = <span class=\"hljs-keyword\">if</span> i &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> tokens[i - <span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">else</span> []\n      [nextTag] = <span class=\"hljs-keyword\">if</span> i &lt; tokens.length - <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">then</span> tokens[i + <span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">else</span> []\n<span class=\"hljs-function\">      <span class=\"hljs-title\">stackTop</span>  = -&gt;</span> stack[stack.length - <span class=\"hljs-number\">1</span>]\n      startIdx  = i</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>Helper function, used for keeping track of the number of tokens consumed\nand spliced, when returning for getting a new token.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">      <span class=\"hljs-title\">forward</span>   = <span class=\"hljs-params\">(n)</span> -&gt;</span> i - startIdx + n</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>Helper functions</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">      <span class=\"hljs-title\">isImplicit</span>        = <span class=\"hljs-params\">(stackItem)</span> -&gt;</span> stackItem?[<span class=\"hljs-number\">2</span>]?.ours\n<span class=\"hljs-function\">      <span class=\"hljs-title\">isImplicitObject</span>  = <span class=\"hljs-params\">(stackItem)</span> -&gt;</span> isImplicit(stackItem) <span class=\"hljs-keyword\">and</span> stackItem?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'{'</span>\n<span class=\"hljs-function\">      <span class=\"hljs-title\">isImplicitCall</span>    = <span class=\"hljs-params\">(stackItem)</span> -&gt;</span> isImplicit(stackItem) <span class=\"hljs-keyword\">and</span> stackItem?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'('</span>\n<span class=\"hljs-function\">      <span class=\"hljs-title\">inImplicit</span>        = -&gt;</span> isImplicit stackTop()\n<span class=\"hljs-function\">      <span class=\"hljs-title\">inImplicitCall</span>    = -&gt;</span> isImplicitCall stackTop()\n<span class=\"hljs-function\">      <span class=\"hljs-title\">inImplicitObject</span>  = -&gt;</span> isImplicitObject stackTop()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>Unclosed control statement inside implicit parens (like\nclass declaration or if-conditionals)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">      <span class=\"hljs-title\">inImplicitControl</span> = -&gt;</span> inImplicit <span class=\"hljs-keyword\">and</span> stackTop()?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'CONTROL'</span>\n<span class=\"hljs-function\">\n      <span class=\"hljs-title\">startImplicitCall</span> = <span class=\"hljs-params\">(j)</span> -&gt;</span>\n        idx = j ? i\n        stack.push [<span class=\"hljs-string\">'('</span>, idx, ours: <span class=\"hljs-literal\">yes</span>]\n        tokens.splice idx, <span class=\"hljs-number\">0</span>, generate <span class=\"hljs-string\">'CALL_START'</span>, <span class=\"hljs-string\">'('</span>, [<span class=\"hljs-string\">''</span>, <span class=\"hljs-string\">'implicit function call'</span>, token[<span class=\"hljs-number\">2</span>]]\n        i += <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> j?\n<span class=\"hljs-function\">\n      <span class=\"hljs-title\">endImplicitCall</span> = -&gt;</span>\n        stack.pop()\n        tokens.splice i, <span class=\"hljs-number\">0</span>, generate <span class=\"hljs-string\">'CALL_END'</span>, <span class=\"hljs-string\">')'</span>, [<span class=\"hljs-string\">''</span>, <span class=\"hljs-string\">'end of input'</span>, token[<span class=\"hljs-number\">2</span>]]\n        i += <span class=\"hljs-number\">1</span>\n<span class=\"hljs-function\">\n      <span class=\"hljs-title\">startImplicitObject</span> = <span class=\"hljs-params\">(j, startsLine = <span class=\"hljs-literal\">yes</span>)</span> -&gt;</span>\n        idx = j ? i\n        stack.push [<span class=\"hljs-string\">'{'</span>, idx, sameLine: <span class=\"hljs-literal\">yes</span>, startsLine: startsLine, ours: <span class=\"hljs-literal\">yes</span>]\n        val = <span class=\"hljs-keyword\">new</span> String <span class=\"hljs-string\">'{'</span>\n        val.generated = <span class=\"hljs-literal\">yes</span>\n        tokens.splice idx, <span class=\"hljs-number\">0</span>, generate <span class=\"hljs-string\">'{'</span>, val, token\n        i += <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> j?\n<span class=\"hljs-function\">\n      <span class=\"hljs-title\">endImplicitObject</span> = <span class=\"hljs-params\">(j)</span> -&gt;</span>\n        j = j ? i\n        stack.pop()\n        tokens.splice j, <span class=\"hljs-number\">0</span>, generate <span class=\"hljs-string\">'}'</span>, <span class=\"hljs-string\">'}'</span>, token\n        i += <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>Don’t end an implicit call on next indent if any of these are in an argument</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> inImplicitCall() <span class=\"hljs-keyword\">and</span> tag <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'IF'</span>, <span class=\"hljs-string\">'TRY'</span>, <span class=\"hljs-string\">'FINALLY'</span>, <span class=\"hljs-string\">'CATCH'</span>,\n        <span class=\"hljs-string\">'CLASS'</span>, <span class=\"hljs-string\">'SWITCH'</span>]\n        stack.push [<span class=\"hljs-string\">'CONTROL'</span>, i, ours: <span class=\"hljs-literal\">yes</span>]\n        <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">1</span>)\n\n      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'INDENT'</span> <span class=\"hljs-keyword\">and</span> inImplicit()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>An <code>INDENT</code> closes an implicit call unless</p>\n<ol>\n<li>We have seen a <code>CONTROL</code> argument on the line.</li>\n<li>The last token before the indent is part of the list below</li>\n</ol>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> prevTag <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'=&gt;'</span>, <span class=\"hljs-string\">'-&gt;'</span>, <span class=\"hljs-string\">'['</span>, <span class=\"hljs-string\">'('</span>, <span class=\"hljs-string\">','</span>, <span class=\"hljs-string\">'{'</span>, <span class=\"hljs-string\">'TRY'</span>, <span class=\"hljs-string\">'ELSE'</span>, <span class=\"hljs-string\">'='</span>]\n          endImplicitCall() <span class=\"hljs-keyword\">while</span> inImplicitCall()\n        stack.pop() <span class=\"hljs-keyword\">if</span> inImplicitControl()\n        stack.push [tag, i]\n        <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">1</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <p>Straightforward start of explicit expression</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> EXPRESSION_START\n        stack.push [tag, i]\n        <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">1</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>\n              </div>\n              <p>Close all implicit expressions inside of explicitly closed expressions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> EXPRESSION_END\n        <span class=\"hljs-keyword\">while</span> inImplicit()\n          <span class=\"hljs-keyword\">if</span> inImplicitCall()\n            endImplicitCall()\n          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> inImplicitObject()\n            endImplicitObject()\n          <span class=\"hljs-keyword\">else</span>\n            stack.pop()\n        start = stack.pop()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>\n              </div>\n              <p>Recognize standard implicit calls like\nf a, f() b, f? c, h[0] d etc.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> (tag <span class=\"hljs-keyword\">in</span> IMPLICIT_FUNC <span class=\"hljs-keyword\">and</span> token.spaced <span class=\"hljs-keyword\">or</span>\n          tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'?'</span> <span class=\"hljs-keyword\">and</span> i &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> tokens[i - <span class=\"hljs-number\">1</span>].spaced) <span class=\"hljs-keyword\">and</span>\n         (nextTag <span class=\"hljs-keyword\">in</span> IMPLICIT_CALL <span class=\"hljs-keyword\">or</span>\n          nextTag <span class=\"hljs-keyword\">in</span> IMPLICIT_UNSPACED_CALL <span class=\"hljs-keyword\">and</span>\n          <span class=\"hljs-keyword\">not</span> tokens[i + <span class=\"hljs-number\">1</span>]?.spaced <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> tokens[i + <span class=\"hljs-number\">1</span>]?.newLine)\n        tag = token[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'FUNC_EXIST'</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'?'</span>\n        startImplicitCall i + <span class=\"hljs-number\">1</span>\n        <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">2</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-23\">&#182;</a>\n              </div>\n              <p>Implicit call taking an implicit indented object as first argument.</p>\n<pre><code>f\n  a: b\n  c: d\n</code></pre><p>and</p>\n<pre><code>f\n  <span class=\"hljs-number\">1</span>\n  a: b\n  b: c\n</code></pre><p>Don’t accept implicit calls of this type, when on the same line\nas the control structures below as that may misinterpret constructs like:</p>\n<pre><code><span class=\"hljs-keyword\">if</span> f\n   a: <span class=\"hljs-number\">1</span>\n</code></pre><p>as</p>\n<pre><code><span class=\"hljs-keyword\">if</span> f(a: <span class=\"hljs-number\">1</span>)\n</code></pre><p>which is probably always unintended.\nFurthermore don’t allow this in literal arrays, as\nthat creates grammatical ambiguities.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> IMPLICIT_FUNC <span class=\"hljs-keyword\">and</span>\n         @indexOfTag(i + <span class=\"hljs-number\">1</span>, <span class=\"hljs-string\">'INDENT'</span>) &gt; <span class=\"hljs-number\">-1</span> <span class=\"hljs-keyword\">and</span> @looksObjectish(i + <span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">and</span>\n         <span class=\"hljs-keyword\">not</span> @findTagsBackwards(i, [<span class=\"hljs-string\">'CLASS'</span>, <span class=\"hljs-string\">'EXTENDS'</span>, <span class=\"hljs-string\">'IF'</span>, <span class=\"hljs-string\">'CATCH'</span>,\n          <span class=\"hljs-string\">'SWITCH'</span>, <span class=\"hljs-string\">'LEADING_WHEN'</span>, <span class=\"hljs-string\">'FOR'</span>, <span class=\"hljs-string\">'WHILE'</span>, <span class=\"hljs-string\">'UNTIL'</span>])\n        startImplicitCall i + <span class=\"hljs-number\">1</span>\n        stack.push [<span class=\"hljs-string\">'INDENT'</span>, i + <span class=\"hljs-number\">2</span>]\n        <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">3</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-24\">&#182;</a>\n              </div>\n              <p>Implicit objects start here</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">':'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-25\">&#182;</a>\n              </div>\n              <p>Go back to the (implicit) start of the object</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        s = <span class=\"hljs-keyword\">switch</span>\n          <span class=\"hljs-keyword\">when</span> @tag(i - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">in</span> EXPRESSION_END <span class=\"hljs-keyword\">then</span> start[<span class=\"hljs-number\">1</span>]\n          <span class=\"hljs-keyword\">when</span> @tag(i - <span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'@'</span> <span class=\"hljs-keyword\">then</span> i - <span class=\"hljs-number\">2</span>\n          <span class=\"hljs-keyword\">else</span> i - <span class=\"hljs-number\">1</span>\n        s -= <span class=\"hljs-number\">2</span> <span class=\"hljs-keyword\">while</span> @tag(s - <span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'HERECOMMENT'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-26\">&#182;</a>\n              </div>\n              <p>Mark if the value is a for loop</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        @insideForDeclaration = nextTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'FOR'</span>\n\n        startsLine = s <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">or</span> @tag(s - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">in</span> LINEBREAKS <span class=\"hljs-keyword\">or</span> tokens[s - <span class=\"hljs-number\">1</span>].newLine</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-27\">&#182;</a>\n              </div>\n              <p>Are we just continuing an already declared object?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> stackTop()\n          [stackTag, stackIdx] = stackTop()\n          <span class=\"hljs-keyword\">if</span> (stackTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'{'</span> <span class=\"hljs-keyword\">or</span> stackTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'INDENT'</span> <span class=\"hljs-keyword\">and</span> @tag(stackIdx - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'{'</span>) <span class=\"hljs-keyword\">and</span>\n             (startsLine <span class=\"hljs-keyword\">or</span> @tag(s - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">','</span> <span class=\"hljs-keyword\">or</span> @tag(s - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'{'</span>)\n            <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">1</span>)\n\n        startImplicitObject(s, !!startsLine)\n        <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">2</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-28\">&#182;</a>\n              </div>\n              <p>End implicit calls when chaining method calls\nlike e.g.:</p>\n<pre><code>f -&gt;\n  a\n.g b, <span class=\"hljs-function\">-&gt;</span>\n  c\n.h a\n</code></pre><p>and also</p>\n<pre><code>f a\n.g b\n.h a\n</code></pre>\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-29\">&#182;</a>\n              </div>\n              <p>Mark all enclosing objects as not sameLine</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> LINEBREAKS\n        <span class=\"hljs-keyword\">for</span> stackItem <span class=\"hljs-keyword\">in</span> stack <span class=\"hljs-keyword\">by</span> <span class=\"hljs-number\">-1</span>\n          <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> isImplicit stackItem\n          stackItem[<span class=\"hljs-number\">2</span>].sameLine = <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">if</span> isImplicitObject stackItem\n\n      newLine = prevTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'OUTDENT'</span> <span class=\"hljs-keyword\">or</span> prevToken.newLine\n      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> IMPLICIT_END <span class=\"hljs-keyword\">or</span> tag <span class=\"hljs-keyword\">in</span> CALL_CLOSERS <span class=\"hljs-keyword\">and</span> newLine\n        <span class=\"hljs-keyword\">while</span> inImplicit()\n          [stackTag, stackIdx, {sameLine, startsLine}] = stackTop()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-30\">&#182;</a>\n              </div>\n              <p>Close implicit calls when reached end of argument list</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">if</span> inImplicitCall() <span class=\"hljs-keyword\">and</span> prevTag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">','</span>\n            endImplicitCall()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-31\">&#182;</a>\n              </div>\n              <p>Close implicit objects such as:\nreturn a: 1, b: 2 unless true</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> inImplicitObject() <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @insideForDeclaration <span class=\"hljs-keyword\">and</span> sameLine <span class=\"hljs-keyword\">and</span>\n                  tag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'TERMINATOR'</span> <span class=\"hljs-keyword\">and</span> prevTag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">':'</span>\n            endImplicitObject()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-32\">&#182;</a>\n              </div>\n              <p>Close implicit objects when at end of line, line didn’t end with a comma\nand the implicit object didn’t start the line or the next line doesn’t look like\nthe continuation of an object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> inImplicitObject() <span class=\"hljs-keyword\">and</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'TERMINATOR'</span> <span class=\"hljs-keyword\">and</span> prevTag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">','</span> <span class=\"hljs-keyword\">and</span>\n                  <span class=\"hljs-keyword\">not</span> (startsLine <span class=\"hljs-keyword\">and</span> @looksObjectish(i + <span class=\"hljs-number\">1</span>))\n            <span class=\"hljs-keyword\">return</span> forward <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> nextTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'HERECOMMENT'</span>\n            endImplicitObject()\n          <span class=\"hljs-keyword\">else</span>\n            <span class=\"hljs-keyword\">break</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-33\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-33\">&#182;</a>\n              </div>\n              <p>Close implicit object if comma is the last character\nand what comes after doesn’t look like it belongs.\nThis is used for trailing commas and calls, like:</p>\n<pre><code>x =\n    a: b,\n    c: d,\ne = <span class=\"hljs-number\">2</span>\n</code></pre><p>and</p>\n<pre><code>f a, b: c, d: e, f, g: h: i, j\n</code></pre>\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">','</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @looksObjectish(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">and</span> inImplicitObject() <span class=\"hljs-keyword\">and</span>\n         <span class=\"hljs-keyword\">not</span> @insideForDeclaration <span class=\"hljs-keyword\">and</span>\n         (nextTag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'TERMINATOR'</span> <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> @looksObjectish(i + <span class=\"hljs-number\">2</span>))</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-34\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-34\">&#182;</a>\n              </div>\n              <p>When nextTag is OUTDENT the comma is insignificant and\nshould just be ignored so embed it in the implicit object.</p>\n<p>When it isn’t the comma go on to play a role in a call or\narray further up the stack, so give it a chance.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n        offset = <span class=\"hljs-keyword\">if</span> nextTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'OUTDENT'</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-number\">0</span>\n        <span class=\"hljs-keyword\">while</span> inImplicitObject()\n          endImplicitObject i + offset\n      <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">1</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-35\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-35\">&#182;</a>\n              </div>\n              <p>Add location data to all tokens generated by the rewriter.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addLocationDataToGeneratedTokens: <span class=\"hljs-function\">-&gt;</span>\n    @scanTokens (token, i, tokens) -&gt;\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span>     token[<span class=\"hljs-number\">2</span>]\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">unless</span> token.generated <span class=\"hljs-keyword\">or</span> token.explicit\n      <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'{'</span> <span class=\"hljs-keyword\">and</span> nextLocation=tokens[i + <span class=\"hljs-number\">1</span>]?[<span class=\"hljs-number\">2</span>]\n        {first_line: line, first_column: column} = nextLocation\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prevLocation = tokens[i - <span class=\"hljs-number\">1</span>]?[<span class=\"hljs-number\">2</span>]\n        {last_line: line, last_column: column} = prevLocation\n      <span class=\"hljs-keyword\">else</span>\n        line = column = <span class=\"hljs-number\">0</span>\n      token[<span class=\"hljs-number\">2</span>] =\n        first_line:   line\n        first_column: column\n        last_line:    line\n        last_column:  column\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-36\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-36\">&#182;</a>\n              </div>\n              <p>OUTDENT tokens should always be positioned at the last character of the\nprevious token, so that AST nodes ending in an OUTDENT token end up with a\nlocation corresponding to the last “real” token under the node.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  fixOutdentLocationData: <span class=\"hljs-function\">-&gt;</span>\n    @scanTokens (token, i, tokens) -&gt;\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">unless</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'OUTDENT'</span> <span class=\"hljs-keyword\">or</span>\n        (token.generated <span class=\"hljs-keyword\">and</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'CALL_END'</span>) <span class=\"hljs-keyword\">or</span>\n        (token.generated <span class=\"hljs-keyword\">and</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'}'</span>)\n      prevLocationData = tokens[i - <span class=\"hljs-number\">1</span>][<span class=\"hljs-number\">2</span>]\n      token[<span class=\"hljs-number\">2</span>] =\n        first_line:   prevLocationData.last_line\n        first_column: prevLocationData.last_column\n        last_line:    prevLocationData.last_line\n        last_column:  prevLocationData.last_column\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-37\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-37\">&#182;</a>\n              </div>\n              <p>Because our grammar is LALR(1), it can’t handle some single-line\nexpressions that lack ending delimiters. The <strong>Rewriter</strong> adds the implicit\nblocks, so it doesn’t need to. To keep the grammar clean and tidy, trailing\nnewlines within expressions are removed and the indentation tokens of empty\nblocks are added.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  normalizeLines: <span class=\"hljs-function\">-&gt;</span>\n    starter = indent = outdent = <span class=\"hljs-literal\">null</span>\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">condition</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      token[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">';'</span> <span class=\"hljs-keyword\">and</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> SINGLE_CLOSERS <span class=\"hljs-keyword\">and</span>\n      <span class=\"hljs-keyword\">not</span> (token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'TERMINATOR'</span> <span class=\"hljs-keyword\">and</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">in</span> EXPRESSION_CLOSE) <span class=\"hljs-keyword\">and</span>\n      <span class=\"hljs-keyword\">not</span> (token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'ELSE'</span> <span class=\"hljs-keyword\">and</span> starter <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'THEN'</span>) <span class=\"hljs-keyword\">and</span>\n      <span class=\"hljs-keyword\">not</span> (token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'CATCH'</span>, <span class=\"hljs-string\">'FINALLY'</span>] <span class=\"hljs-keyword\">and</span> starter <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'-&gt;'</span>, <span class=\"hljs-string\">'=&gt;'</span>]) <span class=\"hljs-keyword\">or</span>\n      token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> CALL_CLOSERS <span class=\"hljs-keyword\">and</span>\n      (@tokens[i - <span class=\"hljs-number\">1</span>].newLine <span class=\"hljs-keyword\">or</span> @tokens[i - <span class=\"hljs-number\">1</span>][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'OUTDENT'</span>)\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">action</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      @tokens.splice (<span class=\"hljs-keyword\">if</span> @tag(i - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">','</span> <span class=\"hljs-keyword\">then</span> i - <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> i), <span class=\"hljs-number\">0</span>, outdent\n\n    @scanTokens (token, i, tokens) -&gt;\n      [tag] = token\n      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'TERMINATOR'</span>\n        <span class=\"hljs-keyword\">if</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'ELSE'</span> <span class=\"hljs-keyword\">and</span> @tag(i - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'OUTDENT'</span>\n          tokens.splice i, <span class=\"hljs-number\">1</span>, @indentation()...\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span>\n        <span class=\"hljs-keyword\">if</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">in</span> EXPRESSION_CLOSE\n          tokens.splice i, <span class=\"hljs-number\">1</span>\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'CATCH'</span>\n        <span class=\"hljs-keyword\">for</span> j <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-number\">1.</span><span class=\"hljs-number\">.2</span>] <span class=\"hljs-keyword\">when</span> @tag(i + j) <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">'OUTDENT'</span>, <span class=\"hljs-string\">'TERMINATOR'</span>, <span class=\"hljs-string\">'FINALLY'</span>]\n          tokens.splice i + j, <span class=\"hljs-number\">0</span>, @indentation()...\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">2</span> + j\n      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> SINGLE_LINERS <span class=\"hljs-keyword\">and</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'INDENT'</span> <span class=\"hljs-keyword\">and</span>\n         <span class=\"hljs-keyword\">not</span> (tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'ELSE'</span> <span class=\"hljs-keyword\">and</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'IF'</span>)\n        starter = tag\n        [indent, outdent] = @indentation tokens[i]\n        indent.fromThen   = <span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> starter <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'THEN'</span>\n        tokens.splice i + <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">0</span>, indent\n        @detectEnd i + <span class=\"hljs-number\">2</span>, condition, action\n        tokens.splice i, <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'THEN'</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-38\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-38\">&#182;</a>\n              </div>\n              <p>Tag postfix conditionals as such, so that we can parse them with a\ndifferent precedence.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  tagPostfixConditionals: <span class=\"hljs-function\">-&gt;</span>\n\n    original = <span class=\"hljs-literal\">null</span>\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">condition</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      [tag] = token\n      [prevTag] = @tokens[i - <span class=\"hljs-number\">1</span>]\n      tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'TERMINATOR'</span> <span class=\"hljs-keyword\">or</span> (tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'INDENT'</span> <span class=\"hljs-keyword\">and</span> prevTag <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> SINGLE_LINERS)\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">action</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">'INDENT'</span> <span class=\"hljs-keyword\">or</span> (token.generated <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> token.fromThen)\n        original[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">'POST_'</span> + original[<span class=\"hljs-number\">0</span>]\n\n    @scanTokens (token, i) -&gt;\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">unless</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'IF'</span>\n      original = token\n      @detectEnd i + <span class=\"hljs-number\">1</span>, condition, action\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-39\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-39\">&#182;</a>\n              </div>\n              <p>Generate the indentation tokens, based on another token on the same line.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  indentation: <span class=\"hljs-function\"><span class=\"hljs-params\">(origin)</span> -&gt;</span>\n    indent  = [<span class=\"hljs-string\">'INDENT'</span>, <span class=\"hljs-number\">2</span>]\n    outdent = [<span class=\"hljs-string\">'OUTDENT'</span>, <span class=\"hljs-number\">2</span>]\n    <span class=\"hljs-keyword\">if</span> origin\n      indent.generated = outdent.generated = <span class=\"hljs-literal\">yes</span>\n      indent.origin = outdent.origin = origin\n    <span class=\"hljs-keyword\">else</span>\n      indent.explicit = outdent.explicit = <span class=\"hljs-literal\">yes</span>\n    [indent, outdent]\n\n  generate: generate</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-40\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-40\">&#182;</a>\n              </div>\n              <p>Look up a tag by token index.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  tag: <span class=\"hljs-function\"><span class=\"hljs-params\">(i)</span> -&gt;</span> @tokens[i]?[<span class=\"hljs-number\">0</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-41\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-41\">&#182;</a>\n              </div>\n              <h2 id=\"constants\">Constants</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-42\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-42\">&#182;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-43\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-43\">&#182;</a>\n              </div>\n              <p>List of the token pairs that must be balanced.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>BALANCED_PAIRS = [\n  [<span class=\"hljs-string\">'('</span>, <span class=\"hljs-string\">')'</span>]\n  [<span class=\"hljs-string\">'['</span>, <span class=\"hljs-string\">']'</span>]\n  [<span class=\"hljs-string\">'{'</span>, <span class=\"hljs-string\">'}'</span>]\n  [<span class=\"hljs-string\">'INDENT'</span>, <span class=\"hljs-string\">'OUTDENT'</span>],\n  [<span class=\"hljs-string\">'CALL_START'</span>, <span class=\"hljs-string\">'CALL_END'</span>]\n  [<span class=\"hljs-string\">'PARAM_START'</span>, <span class=\"hljs-string\">'PARAM_END'</span>]\n  [<span class=\"hljs-string\">'INDEX_START'</span>, <span class=\"hljs-string\">'INDEX_END'</span>]\n  [<span class=\"hljs-string\">'STRING_START'</span>, <span class=\"hljs-string\">'STRING_END'</span>]\n  [<span class=\"hljs-string\">'REGEX_START'</span>, <span class=\"hljs-string\">'REGEX_END'</span>]\n]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-44\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-44\">&#182;</a>\n              </div>\n              <p>The inverse mappings of <code>BALANCED_PAIRS</code> we’re trying to fix up, so we can\nlook things up from either end.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.INVERSES = INVERSES = {}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-45\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-45\">&#182;</a>\n              </div>\n              <p>The tokens that signal the start/end of a balanced pair.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>EXPRESSION_START = []\nEXPRESSION_END   = []\n\n<span class=\"hljs-keyword\">for</span> [left, rite] <span class=\"hljs-keyword\">in</span> BALANCED_PAIRS\n  EXPRESSION_START.push INVERSES[rite] = left\n  EXPRESSION_END  .push INVERSES[left] = rite</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-46\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-46\">&#182;</a>\n              </div>\n              <p>Tokens that indicate the close of a clause of an expression.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>EXPRESSION_CLOSE = [<span class=\"hljs-string\">'CATCH'</span>, <span class=\"hljs-string\">'THEN'</span>, <span class=\"hljs-string\">'ELSE'</span>, <span class=\"hljs-string\">'FINALLY'</span>].concat EXPRESSION_END</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-47\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-47\">&#182;</a>\n              </div>\n              <p>Tokens that, if followed by an <code>IMPLICIT_CALL</code>, indicate a function invocation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>IMPLICIT_FUNC    = [<span class=\"hljs-string\">'IDENTIFIER'</span>, <span class=\"hljs-string\">'PROPERTY'</span>, <span class=\"hljs-string\">'SUPER'</span>, <span class=\"hljs-string\">')'</span>, <span class=\"hljs-string\">'CALL_END'</span>, <span class=\"hljs-string\">']'</span>, <span class=\"hljs-string\">'INDEX_END'</span>, <span class=\"hljs-string\">'@'</span>, <span class=\"hljs-string\">'THIS'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-48\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-48\">&#182;</a>\n              </div>\n              <p>If preceded by an <code>IMPLICIT_FUNC</code>, indicates a function invocation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>IMPLICIT_CALL    = [\n  <span class=\"hljs-string\">'IDENTIFIER'</span>, <span class=\"hljs-string\">'PROPERTY'</span>, <span class=\"hljs-string\">'NUMBER'</span>, <span class=\"hljs-string\">'INFINITY'</span>, <span class=\"hljs-string\">'NAN'</span>\n  <span class=\"hljs-string\">'STRING'</span>, <span class=\"hljs-string\">'STRING_START'</span>, <span class=\"hljs-string\">'REGEX'</span>, <span class=\"hljs-string\">'REGEX_START'</span>, <span class=\"hljs-string\">'JS'</span>\n  <span class=\"hljs-string\">'NEW'</span>, <span class=\"hljs-string\">'PARAM_START'</span>, <span class=\"hljs-string\">'CLASS'</span>, <span class=\"hljs-string\">'IF'</span>, <span class=\"hljs-string\">'TRY'</span>, <span class=\"hljs-string\">'SWITCH'</span>, <span class=\"hljs-string\">'THIS'</span>\n  <span class=\"hljs-string\">'UNDEFINED'</span>, <span class=\"hljs-string\">'NULL'</span>, <span class=\"hljs-string\">'BOOL'</span>\n  <span class=\"hljs-string\">'UNARY'</span>, <span class=\"hljs-string\">'YIELD'</span>, <span class=\"hljs-string\">'UNARY_MATH'</span>, <span class=\"hljs-string\">'SUPER'</span>, <span class=\"hljs-string\">'THROW'</span>\n  <span class=\"hljs-string\">'@'</span>, <span class=\"hljs-string\">'-&gt;'</span>, <span class=\"hljs-string\">'=&gt;'</span>, <span class=\"hljs-string\">'['</span>, <span class=\"hljs-string\">'('</span>, <span class=\"hljs-string\">'{'</span>, <span class=\"hljs-string\">'--'</span>, <span class=\"hljs-string\">'++'</span>\n]\n\nIMPLICIT_UNSPACED_CALL = [<span class=\"hljs-string\">'+'</span>, <span class=\"hljs-string\">'-'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-49\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-49\">&#182;</a>\n              </div>\n              <p>Tokens that always mark the end of an implicit call for single-liners.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>IMPLICIT_END     = [<span class=\"hljs-string\">'POST_IF'</span>, <span class=\"hljs-string\">'FOR'</span>, <span class=\"hljs-string\">'WHILE'</span>, <span class=\"hljs-string\">'UNTIL'</span>, <span class=\"hljs-string\">'WHEN'</span>, <span class=\"hljs-string\">'BY'</span>,\n  <span class=\"hljs-string\">'LOOP'</span>, <span class=\"hljs-string\">'TERMINATOR'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-50\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-50\">&#182;</a>\n              </div>\n              <p>Single-line flavors of block expressions that have unclosed endings.\nThe grammar can’t disambiguate them, so we insert the implicit indentation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>SINGLE_LINERS    = [<span class=\"hljs-string\">'ELSE'</span>, <span class=\"hljs-string\">'-&gt;'</span>, <span class=\"hljs-string\">'=&gt;'</span>, <span class=\"hljs-string\">'TRY'</span>, <span class=\"hljs-string\">'FINALLY'</span>, <span class=\"hljs-string\">'THEN'</span>]\nSINGLE_CLOSERS   = [<span class=\"hljs-string\">'TERMINATOR'</span>, <span class=\"hljs-string\">'CATCH'</span>, <span class=\"hljs-string\">'FINALLY'</span>, <span class=\"hljs-string\">'ELSE'</span>, <span class=\"hljs-string\">'OUTDENT'</span>, <span class=\"hljs-string\">'LEADING_WHEN'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-51\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-51\">&#182;</a>\n              </div>\n              <p>Tokens that end a line.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>LINEBREAKS       = [<span class=\"hljs-string\">'TERMINATOR'</span>, <span class=\"hljs-string\">'INDENT'</span>, <span class=\"hljs-string\">'OUTDENT'</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-52\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-52\">&#182;</a>\n              </div>\n              <p>Tokens that close open calls when they follow a newline.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CALL_CLOSERS     = [<span class=\"hljs-string\">'.'</span>, <span class=\"hljs-string\">'?.'</span>, <span class=\"hljs-string\">'::'</span>, <span class=\"hljs-string\">'?::'</span>]</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/scope.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>scope.litcoffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>scope.litcoffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              <p>The <strong>Scope</strong> class regulates lexical scoping within CoffeeScript. As you\ngenerate code, you create a tree of scopes in the same shape as the nested\nfunction bodies. Each scope knows about the variables declared within it,\nand has a reference to its parent enclosing scope. In this way, we know which\nvariables are new and need to be declared with <code>var</code>, and which are shared\nwith external scopes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>exports.Scope = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Scope</span></span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Initialize a scope with its parent, for lookups up the chain,\nas well as a reference to the <strong>Block</strong> node it belongs to, which is\nwhere it should declare its variables, a reference to the function that\nit belongs to, and a list of variables referenced in the source code\nand therefore should be avoided when generating variables.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@parent, @expressions, @method, @referencedVars)</span> -&gt;</span>\n    @variables = [{name: <span class=\"hljs-string\">'arguments'</span>, type: <span class=\"hljs-string\">'arguments'</span>}]\n    @positions = {}\n    @utilities = {} <span class=\"hljs-keyword\">unless</span> @parent</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>The <code>@root</code> is the top-level <strong>Scope</strong> object for a given file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @root = @parent?.root ? <span class=\"hljs-keyword\">this</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Adds a new variable or overrides an existing one.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  add: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, type, immediate)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> @parent.add name, type, immediate <span class=\"hljs-keyword\">if</span> @shared <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> immediate\n    <span class=\"hljs-keyword\">if</span> Object::hasOwnProperty.call @positions, name\n      @variables[@positions[name]].type = type\n    <span class=\"hljs-keyword\">else</span>\n      @positions[name] = @variables.push({name, type}) - <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>When <code>super</code> is called, we need to find the name of the current method we’re\nin, so that we know how to invoke the same method of the parent class. This\ncan get complicated if super is being called from an inner function.\n<code>namedMethod</code> will walk up the scope tree until it either finds the first\nfunction object that has a name filled in, or bottoms out.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  namedMethod: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> @method <span class=\"hljs-keyword\">if</span> @method?.name <span class=\"hljs-keyword\">or</span> !@parent\n    @parent.namedMethod()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Look up a variable name in lexical scope, and declare it if it does not\nalready exist.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  find: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, type = <span class=\"hljs-string\">'var'</span>)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @check name\n    @add name, type\n    <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Reserve a variable name as originating from a function parameter for this\nscope. No <code>var</code> required for internal references.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  parameter: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> @shared <span class=\"hljs-keyword\">and</span> @parent.check name, <span class=\"hljs-literal\">yes</span>\n    @add name, <span class=\"hljs-string\">'param'</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Just check to see if a variable has already been declared, without reserving,\nwalks up to the root scope.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  check: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    !!(@type(name) <span class=\"hljs-keyword\">or</span> @parent?.check(name))</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Generate a temporary variable name at the given index.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  temporary: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, index, single=<span class=\"hljs-literal\">false</span>)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> single\n      startCode = name.charCodeAt(<span class=\"hljs-number\">0</span>)\n      endCode = <span class=\"hljs-string\">'z'</span>.charCodeAt(<span class=\"hljs-number\">0</span>)\n      diff = endCode - startCode\n      newCode = startCode + index % (diff + <span class=\"hljs-number\">1</span>)\n      letter = String.fromCharCode(newCode)\n      num = index <span class=\"hljs-regexp\">//</span> (diff + <span class=\"hljs-number\">1</span>)\n      <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{letter}</span><span class=\"hljs-subst\">#{num <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">''</span>}</span>\"</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{name}</span><span class=\"hljs-subst\">#{index <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">''</span>}</span>\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>Gets the type of a variable.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  type: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> v.type <span class=\"hljs-keyword\">for</span> v <span class=\"hljs-keyword\">in</span> @variables <span class=\"hljs-keyword\">when</span> v.name <span class=\"hljs-keyword\">is</span> name\n    <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>If we need to store an intermediate result, find an available name for a\ncompiler-generated variable. <code>_var</code>, <code>_var2</code>, and so on…</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  freeVariable: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, options={})</span> -&gt;</span>\n    index = <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">loop</span>\n      temp = @temporary name, index, options.single\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> @check(temp) <span class=\"hljs-keyword\">or</span> temp <span class=\"hljs-keyword\">in</span> @root.referencedVars\n      index++\n    @add temp, <span class=\"hljs-string\">'var'</span>, <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> options.reserve ? <span class=\"hljs-literal\">true</span>\n    temp</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>Ensure that an assignment is made at the top of this scope\n(or at the top-level scope, if requested).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  assign: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, value)</span> -&gt;</span>\n    @add name, {value, assigned: <span class=\"hljs-literal\">yes</span>}, <span class=\"hljs-literal\">yes</span>\n    @hasAssignments = <span class=\"hljs-literal\">yes</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Does this scope have any declared variables?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  hasDeclarations: <span class=\"hljs-function\">-&gt;</span>\n    !!@declaredVariables().length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>Return the list of variables first declared in this scope.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  declaredVariables: <span class=\"hljs-function\">-&gt;</span>\n    (v.name <span class=\"hljs-keyword\">for</span> v <span class=\"hljs-keyword\">in</span> @variables <span class=\"hljs-keyword\">when</span> v.type <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">'var'</span>).sort()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>Return the list of assignments that are supposed to be made at the top\nof this scope.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  assignedVariables: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-string\">\"<span class=\"hljs-subst\">#{v.name}</span> = <span class=\"hljs-subst\">#{v.type.value}</span>\"</span> <span class=\"hljs-keyword\">for</span> v <span class=\"hljs-keyword\">in</span> @variables <span class=\"hljs-keyword\">when</span> v.type.assigned</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/annotated-source/sourcemap.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>sourcemap.litcoffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffee-script.html\">\n                  coffee-script.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>sourcemap.litcoffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              <p>Source maps allow JavaScript runtimes to match running JavaScript back to\nthe original source code that corresponds to it. This can be minified\nJavaScript, but in our case, we’re concerned with mapping pretty-printed\nJavaScript back to CoffeeScript.</p>\n<p>In order to produce maps, we must keep track of positions (line number, column number)\nthat originated every node in the syntax tree, and be able to generate a\n<a href=\"https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit\">map file</a>\n— which is a compact, VLQ-encoded representation of the JSON serialization\nof this information — to write out alongside the generated JavaScript.</p>\n<h2 id=\"linemap\">LineMap</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>A <strong>LineMap</strong> object keeps track of information about original line and column\npositions for a single line of output JavaScript code.\n<strong>SourceMaps</strong> are implemented in terms of <strong>LineMaps</strong>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">LineMap</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@line)</span> -&gt;</span>\n    @columns = []\n\n  add: <span class=\"hljs-function\"><span class=\"hljs-params\">(column, [sourceLine, sourceColumn], options={})</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> @columns[column] <span class=\"hljs-keyword\">and</span> options.noReplace\n    @columns[column] = {line: @line, column, sourceLine, sourceColumn}\n\n  sourceLocation: <span class=\"hljs-function\"><span class=\"hljs-params\">(column)</span> -&gt;</span>\n    column-- <span class=\"hljs-keyword\">until</span> (mapping = @columns[column]) <span class=\"hljs-keyword\">or</span> (column &lt;= <span class=\"hljs-number\">0</span>)\n    mapping <span class=\"hljs-keyword\">and</span> [mapping.sourceLine, mapping.sourceColumn]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <h2 id=\"sourcemap\">SourceMap</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Maps locations in a single generated JavaScript file back to locations in\nthe original CoffeeScript source file.</p>\n<p>This is intentionally agnostic towards how a source map might be represented on\ndisk. Once the compiler is ready to produce a “v3”-style source map, we can walk\nthrough the arrays of line and column buffer to produce it.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">SourceMap</span></span>\n  constructor: <span class=\"hljs-function\">-&gt;</span>\n    @lines = []</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Adds a mapping to this SourceMap. <code>sourceLocation</code> and <code>generatedLocation</code>\nare both <code>[line, column]</code> arrays. If <code>options.noReplace</code> is true, then if there\nis already a mapping for the specified <code>line</code> and <code>column</code>, this will have no\neffect.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  add: <span class=\"hljs-function\"><span class=\"hljs-params\">(sourceLocation, generatedLocation, options = {})</span> -&gt;</span>\n    [line, column] = generatedLocation\n    lineMap = (@lines[line] <span class=\"hljs-keyword\">or</span>= <span class=\"hljs-keyword\">new</span> LineMap(line))\n    lineMap.add column, sourceLocation, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Look up the original position of a given <code>line</code> and <code>column</code> in the generated\ncode.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  sourceLocation: <span class=\"hljs-function\"><span class=\"hljs-params\">([line, column])</span> -&gt;</span>\n    line-- <span class=\"hljs-keyword\">until</span> (lineMap = @lines[line]) <span class=\"hljs-keyword\">or</span> (line &lt;= <span class=\"hljs-number\">0</span>)\n    lineMap <span class=\"hljs-keyword\">and</span> lineMap.sourceLocation column</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <h2 id=\"v3-sourcemap-generation\">V3 SourceMap Generation</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Builds up a V3 source map, returning the generated JSON as a string.\n<code>options.sourceRoot</code> may be used to specify the sourceRoot written to the source\nmap.  Also, <code>options.sourceFiles</code> and <code>options.generatedFile</code> may be passed to\nset “sources” and “file”, respectively.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  generate: <span class=\"hljs-function\"><span class=\"hljs-params\">(options = {}, code = <span class=\"hljs-literal\">null</span>)</span> -&gt;</span>\n    writingline       = <span class=\"hljs-number\">0</span>\n    lastColumn        = <span class=\"hljs-number\">0</span>\n    lastSourceLine    = <span class=\"hljs-number\">0</span>\n    lastSourceColumn  = <span class=\"hljs-number\">0</span>\n    needComma         = <span class=\"hljs-literal\">no</span>\n    buffer            = <span class=\"hljs-string\">\"\"</span>\n\n    <span class=\"hljs-keyword\">for</span> lineMap, lineNumber <span class=\"hljs-keyword\">in</span> @lines <span class=\"hljs-keyword\">when</span> lineMap\n      <span class=\"hljs-keyword\">for</span> mapping <span class=\"hljs-keyword\">in</span> lineMap.columns <span class=\"hljs-keyword\">when</span> mapping\n        <span class=\"hljs-keyword\">while</span> writingline &lt; mapping.line\n          lastColumn = <span class=\"hljs-number\">0</span>\n          needComma = <span class=\"hljs-literal\">no</span>\n          buffer += <span class=\"hljs-string\">\";\"</span>\n          writingline++</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Write a comma if we’ve already written a segment on this line.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> needComma\n          buffer += <span class=\"hljs-string\">\",\"</span>\n          needComma = <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>Write the next segment. Segments can be 1, 4, or 5 values.  If just one, then it\nis a generated column which doesn’t match anything in the source code.</p>\n<p>The starting column in the generated source, relative to any previous recorded\ncolumn for the current line:</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        buffer += @encodeVlq mapping.column - lastColumn\n        lastColumn = mapping.column</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>The index into the list of sources:</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        buffer += @encodeVlq <span class=\"hljs-number\">0</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>The starting line in the original source, relative to the previous source line.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        buffer += @encodeVlq mapping.sourceLine - lastSourceLine\n        lastSourceLine = mapping.sourceLine</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>The starting column in the original source, relative to the previous column.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        buffer += @encodeVlq mapping.sourceColumn - lastSourceColumn\n        lastSourceColumn = mapping.sourceColumn\n        needComma = <span class=\"hljs-literal\">yes</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>Produce the canonical JSON object format for a “v3” source map.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    v3 =\n      version:    <span class=\"hljs-number\">3</span>\n      file:       options.generatedFile <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">''</span>\n      sourceRoot: options.sourceRoot <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">''</span>\n      sources:    options.sourceFiles <span class=\"hljs-keyword\">or</span> [<span class=\"hljs-string\">''</span>]\n      names:      []\n      mappings:   buffer\n\n    v3.sourcesContent = [code] <span class=\"hljs-keyword\">if</span> options.inlineMap\n\n    v3</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <h2 id=\"base64-vlq-encoding\">Base64 VLQ Encoding</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>Note that SourceMap VLQ encoding is “backwards”.  MIDI-style VLQ encoding puts\nthe most-significant-bit (MSB) from the original value into the MSB of the VLQ\nencoded value (see <a href=\"https://en.wikipedia.org/wiki/File:Uintvar_coding.svg\">Wikipedia</a>).\nSourceMap VLQ does things the other way around, with the least significat four\nbits of the original value encoded into the first byte of the VLQ encoded value.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  VLQ_SHIFT            = <span class=\"hljs-number\">5</span>\n  VLQ_CONTINUATION_BIT = <span class=\"hljs-number\">1</span> &lt;&lt; VLQ_SHIFT             <span class=\"hljs-comment\"># 0010 0000</span>\n  VLQ_VALUE_MASK       = VLQ_CONTINUATION_BIT - <span class=\"hljs-number\">1</span>   <span class=\"hljs-comment\"># 0001 1111</span>\n\n  encodeVlq: <span class=\"hljs-function\"><span class=\"hljs-params\">(value)</span> -&gt;</span>\n    answer = <span class=\"hljs-string\">''</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>Least significant bit represents the sign.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    signBit = <span class=\"hljs-keyword\">if</span> value &lt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-number\">0</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>The next bits are the actual value.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    valueToEncode = (Math.abs(value) &lt;&lt; <span class=\"hljs-number\">1</span>) + signBit</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>Make sure we encode at least one character, even if valueToEncode is 0.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">while</span> valueToEncode <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> answer\n      nextChunk = valueToEncode &amp; VLQ_VALUE_MASK\n      valueToEncode = valueToEncode &gt;&gt; VLQ_SHIFT\n      nextChunk |= VLQ_CONTINUATION_BIT <span class=\"hljs-keyword\">if</span> valueToEncode\n      answer += @encodeBase64 nextChunk\n\n    answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <h2 id=\"regular-base64-encoding\">Regular Base64 Encoding</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  BASE64_CHARS = <span class=\"hljs-string\">'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'</span>\n\n  encodeBase64: <span class=\"hljs-function\"><span class=\"hljs-params\">(value)</span> -&gt;</span>\n    BASE64_CHARS[value] <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> Error <span class=\"hljs-string\">\"Cannot Base64 encode value: <span class=\"hljs-subst\">#{value}</span>\"</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>\n              </div>\n              <p>Our API for source maps is just the <code>SourceMap</code> class.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">module</span>.exports = SourceMap</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/browser-compiler/coffee-script.js",
    "content": "/**\n * CoffeeScript Compiler v1.12.7\n * http://coffeescript.org\n *\n * Copyright 2011, Jeremy Ashkenas\n * Released under the MIT License\n */\nvar $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.checkStringArgs=function(u,xa,ya){if(null==u)throw new TypeError(\"The 'this' value for String.prototype.\"+ya+\" must not be null or undefined\");if(xa instanceof RegExp)throw new TypeError(\"First argument to String.prototype.\"+ya+\" must not be a regular expression\");return u+\"\"};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;\n$jscomp.defineProperty=$jscomp.ASSUME_ES5||\"function\"==typeof Object.defineProperties?Object.defineProperty:function(u,xa,ya){u!=Array.prototype&&u!=Object.prototype&&(u[xa]=ya.value)};$jscomp.getGlobal=function(u){return\"undefined\"!=typeof window&&window===u?u:\"undefined\"!=typeof global&&null!=global?global:u};$jscomp.global=$jscomp.getGlobal(this);\n$jscomp.polyfill=function(u,xa,ya,e){if(xa){ya=$jscomp.global;u=u.split(\".\");for(e=0;e<u.length-1;e++){var ra=u[e];ra in ya||(ya[ra]={});ya=ya[ra]}u=u[u.length-1];e=ya[u];xa=xa(e);xa!=e&&null!=xa&&$jscomp.defineProperty(ya,u,{configurable:!0,writable:!0,value:xa})}};\n$jscomp.polyfill(\"String.prototype.repeat\",function(u){return u?u:function(u){var ya=$jscomp.checkStringArgs(this,null,\"repeat\");if(0>u||1342177279<u)throw new RangeError(\"Invalid count value\");u|=0;for(var e=\"\";u;)if(u&1&&(e+=ya),u>>>=1)ya+=ya;return e}},\"es6\",\"es3\");$jscomp.findInternal=function(u,xa,ya){u instanceof String&&(u=String(u));for(var e=u.length,ra=0;ra<e;ra++){var r=u[ra];if(xa.call(ya,r,ra,u))return{i:ra,v:r}}return{i:-1,v:void 0}};\n$jscomp.polyfill(\"Array.prototype.find\",function(u){return u?u:function(u,ya){return $jscomp.findInternal(this,u,ya).v}},\"es6\",\"es3\");$jscomp.SYMBOL_PREFIX=\"jscomp_symbol_\";$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.symbolCounter_=0;$jscomp.Symbol=function(u){return $jscomp.SYMBOL_PREFIX+(u||\"\")+$jscomp.symbolCounter_++};\n$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var u=$jscomp.global.Symbol.iterator;u||(u=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol(\"iterator\"));\"function\"!=typeof Array.prototype[u]&&$jscomp.defineProperty(Array.prototype,u,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};\n$jscomp.arrayIterator=function(u){var xa=0;return $jscomp.iteratorPrototype(function(){return xa<u.length?{done:!1,value:u[xa++]}:{done:!0}})};$jscomp.iteratorPrototype=function(u){$jscomp.initSymbolIterator();u={next:u};u[$jscomp.global.Symbol.iterator]=function(){return this};return u};\n$jscomp.iteratorFromArray=function(u,xa){$jscomp.initSymbolIterator();u instanceof String&&(u+=\"\");var ya=0,e={next:function(){if(ya<u.length){var ra=ya++;return{value:xa(ra,u[ra]),done:!1}}e.next=function(){return{done:!0,value:void 0}};return e.next()}};e[Symbol.iterator]=function(){return e};return e};$jscomp.polyfill(\"Array.prototype.keys\",function(u){return u?u:function(){return $jscomp.iteratorFromArray(this,function(u){return u})}},\"es6\",\"es3\");\n(function(u){var xa=function(){function u(e){return u[e]}u[\"../../package.json\"]={name:\"coffee-script\",description:\"Unfancy JavaScript\",keywords:[\"javascript\",\"language\",\"coffeescript\",\"compiler\"],author:\"Jeremy Ashkenas\",version:\"1.12.7\",license:\"MIT\",engines:{node:\"\\x3e\\x3d0.8.0\"},directories:{lib:\"./lib/coffee-script\"},main:\"./lib/coffee-script/coffee-script\",bin:{coffee:\"./bin/coffee\",cake:\"./bin/cake\"},files:[\"bin\",\"lib\",\"register.js\",\"repl.js\"],scripts:{test:\"node ./bin/cake test\",\"test-harmony\":\"node --harmony ./bin/cake test\"},\nhomepage:\"http://coffeescript.org\",bugs:\"https://github.com/jashkenas/coffeescript/issues\",repository:{type:\"git\",url:\"git://github.com/jashkenas/coffeescript.git\"},devDependencies:{docco:\"~0.7.0\",\"google-closure-compiler-js\":\"^20170626.0.0\",\"highlight.js\":\"~9.12.0\",jison:\"\\x3e\\x3d0.4.17\",\"markdown-it\":\"^8.3.1\",underscore:\"~1.8.3\"}};u[\"./helpers\"]=function(){var e={};(function(){var u,r,x;e.starts=function(a,k,t){return k===a.substr(t,k.length)};e.ends=function(a,k,t){var f=k.length;return k===a.substr(a.length-\nf-(t||0),f)};e.repeat=x=function(a,k){var f;for(f=\"\";0<k;)k&1&&(f+=a),k>>>=1,a+=a;return f};e.compact=function(a){var f,b;var p=[];var x=0;for(b=a.length;x<b;x++)(f=a[x])&&p.push(f);return p};e.count=function(a,k){var f;var b=f=0;if(!k.length)return 1/0;for(;f=1+a.indexOf(k,f);)b++;return b};e.merge=function(f,k){return a(a({},f),k)};var a=e.extend=function(a,k){var f;for(f in k){var b=k[f];a[f]=b}return a};e.flatten=u=function(a){var f;var b=[];var x=0;for(f=a.length;x<f;x++){var e=a[x];\"[object Array]\"===\nObject.prototype.toString.call(e)?b=b.concat(u(e)):b.push(e)}return b};e.del=function(a,k){var f=a[k];delete a[k];return f};e.some=null!=(r=Array.prototype.some)?r:function(a){var f;var b=0;for(f=this.length;b<f;b++){var x=this[b];if(a(x))return!0}return!1};e.invertLiterate=function(a){var f=!0;var b;var x=a.split(\"\\n\");var e=[];var I=0;for(b=x.length;I<b;I++)a=x[I],f&&/^([ ]{4}|[ ]{0,3}\\t)/.test(a)?e.push(a):(f=/^\\s*$/.test(a))?e.push(a):e.push(\"# \"+a);return e.join(\"\\n\")};var b=function(a,b){return b?\n{first_line:a.first_line,first_column:a.first_column,last_line:b.last_line,last_column:b.last_column}:a};e.addLocationDataFn=function(a,k){return function(f){\"object\"===typeof f&&f.updateLocationDataIfMissing&&f.updateLocationDataIfMissing(b(a,k));return f}};e.locationDataToString=function(a){var f;\"2\"in a&&\"first_line\"in a[2]?f=a[2]:\"first_line\"in a&&(f=a);return f?f.first_line+1+\":\"+(f.first_column+1)+\"-\"+(f.last_line+1+\":\"+(f.last_column+1)):\"No location data\"};e.baseFileName=function(a,b,x){null==\nb&&(b=!1);null==x&&(x=!1);a=a.split(x?/\\\\|\\//:/\\//);a=a[a.length-1];if(!(b&&0<=a.indexOf(\".\")))return a;a=a.split(\".\");a.pop();\"coffee\"===a[a.length-1]&&1<a.length&&a.pop();return a.join(\".\")};e.isCoffee=function(a){return/\\.((lit)?coffee|coffee\\.md)$/.test(a)};e.isLiterate=function(a){return/\\.(litcoffee|coffee\\.md)$/.test(a)};e.throwSyntaxError=function(a,b){a=new SyntaxError(a);a.location=b;a.toString=za;a.stack=a.toString();throw a;};e.updateSyntaxError=function(a,b,x){a.toString===za&&(a.code||\n(a.code=b),a.filename||(a.filename=x),a.stack=a.toString());return a};var za=function(){var a,b,e;if(!this.code||!this.location)return Error.prototype.toString.call(this);var p=this.location;var z=p.first_line;var I=p.first_column;var J=p.last_line;var F=p.last_column;null==J&&(J=z);null==F&&(F=I);var u=this.filename||\"[stdin]\";p=this.code.split(\"\\n\")[z];J=z===J?F+1:p.length;F=p.slice(0,I).replace(/[^\\s]/g,\" \")+x(\"^\",J-I);if(\"undefined\"!==typeof process&&null!==process)var y=(null!=(a=process.stdout)?\na.isTTY:void 0)&&!(null!=(b=process.env)&&b.NODE_DISABLE_COLORS);if(null!=(e=this.colorful)?e:y)y=function(a){return\"\\u001b[1;31m\"+a+\"\\u001b[0m\"},p=p.slice(0,I)+y(p.slice(I,J))+p.slice(J),F=y(F);return u+\":\"+(z+1)+\":\"+(I+1)+\": error: \"+this.message+\"\\n\"+p+\"\\n\"+F};e.nameWhitespaceCharacter=function(a){switch(a){case \" \":return\"space\";case \"\\n\":return\"newline\";case \"\\r\":return\"carriage return\";case \"\\t\":return\"tab\";default:return a}}}).call(this);return e}();u[\"./rewriter\"]=function(){var e={};(function(){var u,\nr,x=[].indexOf||function(a){for(var c=0,b=this.length;c<b;c++)if(c in this&&this[c]===a)return c;return-1},a=[].slice;var b=function(a,c,b){a=[a,c];a.generated=!0;b&&(a.origin=b);return a};e.Rewriter=function(){function n(){}n.prototype.rewrite=function(a){this.tokens=a;this.removeLeadingNewlines();this.closeOpenCalls();this.closeOpenIndexes();this.normalizeLines();this.tagPostfixConditionals();this.addImplicitBracesAndParens();this.addLocationDataToGeneratedTokens();this.fixOutdentLocationData();\nreturn this.tokens};n.prototype.scanTokens=function(a){var c,b;var h=this.tokens;for(c=0;b=h[c];)c+=a.call(this,b,c,h);return!0};n.prototype.detectEnd=function(a,b,q){var c,w,n,L;var e=this.tokens;for(c=0;L=e[a];){if(0===c&&b.call(this,L,a))return q.call(this,L,a);if(!L||0>c)return q.call(this,L,a-1);(w=L[0],0<=x.call(f,w))?c+=1:(n=L[0],0<=x.call(k,n))&&--c;a+=1}return a-1};n.prototype.removeLeadingNewlines=function(){var a,b;var q=this.tokens;var h=a=0;for(b=q.length;a<b;h=++a){var f=q[h][0];if(\"TERMINATOR\"!==\nf)break}if(h)return this.tokens.splice(0,h)};n.prototype.closeOpenCalls=function(){var a=function(a,c){var h;return\")\"===(h=a[0])||\"CALL_END\"===h||\"OUTDENT\"===a[0]&&\")\"===this.tag(c-1)};var b=function(a,c){return this.tokens[\"OUTDENT\"===a[0]?c-1:c][0]=\"CALL_END\"};return this.scanTokens(function(c,h){\"CALL_START\"===c[0]&&this.detectEnd(h+1,a,b);return 1})};n.prototype.closeOpenIndexes=function(){var a=function(a,c){var h;return\"]\"===(h=a[0])||\"INDEX_END\"===h};var b=function(a,c){return a[0]=\"INDEX_END\"};\nreturn this.scanTokens(function(c,h){\"INDEX_START\"===c[0]&&this.detectEnd(h+1,a,b);return 1})};n.prototype.indexOfTag=function(){var c,b,f,h;var n=arguments[0];var k=2<=arguments.length?a.call(arguments,1):[];var e=b=c=0;for(f=k.length;0<=f?b<f:b>f;e=0<=f?++b:--b){for(;\"HERECOMMENT\"===this.tag(n+e+c);)c+=2;if(null!=k[e]&&(\"string\"===typeof k[e]&&(k[e]=[k[e]]),h=this.tag(n+e+c),0>x.call(k[e],h)))return-1}return n+e+c-1};n.prototype.looksObjectish=function(a){if(-1<this.indexOfTag(a,\"@\",null,\":\")||\n-1<this.indexOfTag(a,null,\":\"))return!0;a=this.indexOfTag(a,f);if(-1<a){var c=null;this.detectEnd(a+1,function(a){var c;return c=a[0],0<=x.call(k,c)},function(a,b){return c=b});if(\":\"===this.tag(c+1))return!0}return!1};n.prototype.findTagsBackwards=function(a,b){var c,h,n,w,e,p,y;for(c=[];0<=a&&(c.length||(w=this.tag(a),0>x.call(b,w))&&((e=this.tag(a),0>x.call(f,e))||this.tokens[a].generated)&&(p=this.tag(a),0>x.call(Q,p)));)(h=this.tag(a),0<=x.call(k,h))&&c.push(this.tag(a)),(n=this.tag(a),0<=x.call(f,\nn))&&c.length&&c.pop(),--a;return y=this.tag(a),0<=x.call(b,y)};n.prototype.addImplicitBracesAndParens=function(){var a=[];var n=null;return this.scanTokens(function(c,h,e){var q,w,p,t;var H=c[0];var K=(q=0<h?e[h-1]:[])[0];var u=(h<e.length-1?e[h+1]:[])[0];var z=function(){return a[a.length-1]};var D=h;var A=function(a){return h-D+a};var I=function(a){var c;return null!=a?null!=(c=a[2])?c.ours:void 0:void 0};var E=function(a){return I(a)&&\"{\"===(null!=a?a[0]:void 0)};var G=function(a){return I(a)&&\n\"(\"===(null!=a?a[0]:void 0)};var O=function(){return I(z())};var C=function(){return G(z())};var S=function(){return E(z())};var v=function(){var a;return O&&\"CONTROL\"===(null!=(a=z())?a[0]:void 0)};var X=function(f){var n=null!=f?f:h;a.push([\"(\",n,{ours:!0}]);e.splice(n,0,b(\"CALL_START\",\"(\",[\"\",\"implicit function call\",c[2]]));if(null==f)return h+=1};var R=function(){a.pop();e.splice(h,0,b(\"CALL_END\",\")\",[\"\",\"end of input\",c[2]]));return h+=1};var M=function(f,n){null==n&&(n=!0);var q=null!=f?f:\nh;a.push([\"{\",q,{sameLine:!0,startsLine:n,ours:!0}]);n=new String(\"{\");n.generated=!0;e.splice(q,0,b(\"{\",n,c));if(null==f)return h+=1};var r=function(f){f=null!=f?f:h;a.pop();e.splice(f,0,b(\"}\",\"}\",c));return h+=1};if(C()&&(\"IF\"===H||\"TRY\"===H||\"FINALLY\"===H||\"CATCH\"===H||\"CLASS\"===H||\"SWITCH\"===H))return a.push([\"CONTROL\",h,{ours:!0}]),A(1);if(\"INDENT\"===H&&O()){if(\"\\x3d\\x3e\"!==K&&\"-\\x3e\"!==K&&\"[\"!==K&&\"(\"!==K&&\",\"!==K&&\"{\"!==K&&\"TRY\"!==K&&\"ELSE\"!==K&&\"\\x3d\"!==K)for(;C();)R();v()&&a.pop();a.push([H,\nh]);return A(1)}if(0<=x.call(f,H))return a.push([H,h]),A(1);if(0<=x.call(k,H)){for(;O();)C()?R():S()?r():a.pop();n=a.pop()}if((0<=x.call(J,H)&&c.spaced||\"?\"===H&&0<h&&!e[h-1].spaced)&&(0<=x.call(F,u)||0<=x.call(N,u)&&(null==(w=e[h+1])||!w.spaced)&&(null==(p=e[h+1])||!p.newLine)))return\"?\"===H&&(H=c[0]=\"FUNC_EXIST\"),X(h+1),A(2);if(0<=x.call(J,H)&&-1<this.indexOfTag(h+1,\"INDENT\")&&this.looksObjectish(h+2)&&!this.findTagsBackwards(h,\"CLASS EXTENDS IF CATCH SWITCH LEADING_WHEN FOR WHILE UNTIL\".split(\" \")))return X(h+\n1),a.push([\"INDENT\",h+2]),A(3);if(\":\"===H){for(r=function(){var a;switch(!1){case a=this.tag(h-1),0>x.call(k,a):return n[1];case \"@\"!==this.tag(h-2):return h-2;default:return h-1}}.call(this);\"HERECOMMENT\"===this.tag(r-2);)r-=2;this.insideForDeclaration=\"FOR\"===u;q=0===r||(t=this.tag(r-1),0<=x.call(Q,t))||e[r-1].newLine;if(z()&&(S=z(),t=S[0],v=S[1],(\"{\"===t||\"INDENT\"===t&&\"{\"===this.tag(v-1))&&(q||\",\"===this.tag(r-1)||\"{\"===this.tag(r-1))))return A(1);M(r,!!q);return A(2)}if(0<=x.call(Q,H))for(M=\na.length-1;0<=M;M+=-1){t=a[M];if(!I(t))break;E(t)&&(t[2].sameLine=!1)}M=\"OUTDENT\"===K||q.newLine;if(0<=x.call(y,H)||0<=x.call(B,H)&&M)for(;O();)if(M=z(),t=M[0],v=M[1],q=M[2],M=q.sameLine,q=q.startsLine,C()&&\",\"!==K)R();else if(S()&&!this.insideForDeclaration&&M&&\"TERMINATOR\"!==H&&\":\"!==K)r();else if(!S()||\"TERMINATOR\"!==H||\",\"===K||q&&this.looksObjectish(h+1))break;else{if(\"HERECOMMENT\"===u)return A(1);r()}if(!(\",\"!==H||this.looksObjectish(h+1)||!S()||this.insideForDeclaration||\"TERMINATOR\"===u&&\nthis.looksObjectish(h+2)))for(u=\"OUTDENT\"===u?1:0;S();)r(h+u);return A(1)})};n.prototype.addLocationDataToGeneratedTokens=function(){return this.scanTokens(function(a,b,f){var c,n;if(a[2]||!a.generated&&!a.explicit)return 1;if(\"{\"===a[0]&&(c=null!=(n=f[b+1])?n[2]:void 0)){var q=c.first_line;c=c.first_column}else(c=null!=(q=f[b-1])?q[2]:void 0)?(q=c.last_line,c=c.last_column):q=c=0;a[2]={first_line:q,first_column:c,last_line:q,last_column:c};return 1})};n.prototype.fixOutdentLocationData=function(){return this.scanTokens(function(a,\nb,f){if(!(\"OUTDENT\"===a[0]||a.generated&&\"CALL_END\"===a[0]||a.generated&&\"}\"===a[0]))return 1;b=f[b-1][2];a[2]={first_line:b.last_line,first_column:b.last_column,last_line:b.last_line,last_column:b.last_column};return 1})};n.prototype.normalizeLines=function(){var b,f;var n=b=f=null;var h=function(a,b){var c,f,h,e;return\";\"!==a[1]&&(c=a[0],0<=x.call(O,c))&&!(\"TERMINATOR\"===a[0]&&(f=this.tag(b+1),0<=x.call(I,f)))&&!(\"ELSE\"===a[0]&&\"THEN\"!==n)&&!!(\"CATCH\"!==(h=a[0])&&\"FINALLY\"!==h||\"-\\x3e\"!==n&&\"\\x3d\\x3e\"!==\nn)||(e=a[0],0<=x.call(B,e))&&(this.tokens[b-1].newLine||\"OUTDENT\"===this.tokens[b-1][0])};var e=function(a,b){return this.tokens.splice(\",\"===this.tag(b-1)?b-1:b,0,f)};return this.scanTokens(function(c,q,k){var w,p,t;c=c[0];if(\"TERMINATOR\"===c){if(\"ELSE\"===this.tag(q+1)&&\"OUTDENT\"!==this.tag(q-1))return k.splice.apply(k,[q,1].concat(a.call(this.indentation()))),1;if(w=this.tag(q+1),0<=x.call(I,w))return k.splice(q,1),0}if(\"CATCH\"===c)for(w=p=1;2>=p;w=++p)if(\"OUTDENT\"===(t=this.tag(q+w))||\"TERMINATOR\"===\nt||\"FINALLY\"===t)return k.splice.apply(k,[q+w,0].concat(a.call(this.indentation()))),2+w;0<=x.call(G,c)&&\"INDENT\"!==this.tag(q+1)&&(\"ELSE\"!==c||\"IF\"!==this.tag(q+1))&&(n=c,t=this.indentation(k[q]),b=t[0],f=t[1],\"THEN\"===n&&(b.fromThen=!0),k.splice(q+1,0,b),this.detectEnd(q+2,h,e),\"THEN\"===c&&k.splice(q,1));return 1})};n.prototype.tagPostfixConditionals=function(){var a=null;var b=function(a,b){a=a[0];b=this.tokens[b-1][0];return\"TERMINATOR\"===a||\"INDENT\"===a&&0>x.call(G,b)};var f=function(b,c){if(\"INDENT\"!==\nb[0]||b.generated&&!b.fromThen)return a[0]=\"POST_\"+a[0]};return this.scanTokens(function(c,n){if(\"IF\"!==c[0])return 1;a=c;this.detectEnd(n+1,b,f);return 1})};n.prototype.indentation=function(a){var b=[\"INDENT\",2];var c=[\"OUTDENT\",2];a?(b.generated=c.generated=!0,b.origin=c.origin=a):b.explicit=c.explicit=!0;return[b,c]};n.prototype.generate=b;n.prototype.tag=function(a){var b;return null!=(b=this.tokens[a])?b[0]:void 0};return n}();var za=[[\"(\",\")\"],[\"[\",\"]\"],[\"{\",\"}\"],[\"INDENT\",\"OUTDENT\"],[\"CALL_START\",\n\"CALL_END\"],[\"PARAM_START\",\"PARAM_END\"],[\"INDEX_START\",\"INDEX_END\"],[\"STRING_START\",\"STRING_END\"],[\"REGEX_START\",\"REGEX_END\"]];e.INVERSES=u={};var f=[];var k=[];var t=0;for(r=za.length;t<r;t++){var p=za[t];var z=p[0];p=p[1];f.push(u[p]=z);k.push(u[z]=p)}var I=[\"CATCH\",\"THEN\",\"ELSE\",\"FINALLY\"].concat(k);var J=\"IDENTIFIER PROPERTY SUPER ) CALL_END ] INDEX_END @ THIS\".split(\" \");var F=\"IDENTIFIER PROPERTY NUMBER INFINITY NAN STRING STRING_START REGEX REGEX_START JS NEW PARAM_START CLASS IF TRY SWITCH THIS UNDEFINED NULL BOOL UNARY YIELD UNARY_MATH SUPER THROW @ -\\x3e \\x3d\\x3e [ ( { -- ++\".split(\" \");\nvar N=[\"+\",\"-\"];var y=\"POST_IF FOR WHILE UNTIL WHEN BY LOOP TERMINATOR\".split(\" \");var G=\"ELSE -\\x3e \\x3d\\x3e TRY FINALLY THEN\".split(\" \");var O=\"TERMINATOR CATCH FINALLY ELSE OUTDENT LEADING_WHEN\".split(\" \");var Q=[\"TERMINATOR\",\"INDENT\",\"OUTDENT\"];var B=[\".\",\"?.\",\"::\",\"?::\"]}).call(this);return e}();u[\"./lexer\"]=function(){var e={};(function(){var ra,r=[].indexOf||function(a){for(var b=0,c=this.length;b<c;b++)if(b in this&&this[b]===a)return b;return-1},x=[].slice;var a=u(\"./rewriter\");var b=a.Rewriter;\nvar za=a.INVERSES;a=u(\"./helpers\");var f=a.count;var k=a.repeat;var t=a.invertLiterate;var p=a.throwSyntaxError;e.Lexer=function(){function a(){}a.prototype.tokenize=function(a,c){var f,Da;null==c&&(c={});this.literate=c.literate;this.outdebt=this.indebt=this.baseIndent=this.indent=0;this.indents=[];this.ends=[];this.tokens=[];this.exportSpecifierList=this.importSpecifierList=this.seenExport=this.seenImport=this.seenFor=!1;this.chunkLine=c.line||0;this.chunkColumn=c.column||0;a=this.clean(a);for(Da=\n0;this.chunk=a.slice(Da);){var n=this.identifierToken()||this.commentToken()||this.whitespaceToken()||this.lineToken()||this.stringToken()||this.numberToken()||this.regexToken()||this.jsToken()||this.literalToken();var h=this.getLineAndColumnFromChunk(n);this.chunkLine=h[0];this.chunkColumn=h[1];Da+=n;if(c.untilBalanced&&0===this.ends.length)return{tokens:this.tokens,index:Da}}this.closeIndentation();(f=this.ends.pop())&&this.error(\"missing \"+f.tag,f.origin[2]);return!1===c.rewrite?this.tokens:(new b).rewrite(this.tokens)};\na.prototype.clean=function(a){a.charCodeAt(0)===Q&&(a=a.slice(1));a=a.replace(/\\r/g,\"\").replace(Y,\"\");w.test(a)&&(a=\"\\n\"+a,this.chunkLine--);this.literate&&(a=t(a));return a};a.prototype.identifierToken=function(){var a,b,c,f,n,h,q;if(!(a=B.exec(this.chunk)))return 0;var e=a[0];var k=a[1];a=a[2];var x=k.length;var w=void 0;if(\"own\"===k&&\"FOR\"===this.tag())return this.token(\"OWN\",k),k.length;if(\"from\"===k&&\"YIELD\"===this.tag())return this.token(\"FROM\",k),k.length;if(\"as\"===k&&this.seenImport){if(\"*\"===\nthis.value())this.tokens[this.tokens.length-1][0]=\"IMPORT_ALL\";else if(b=this.value(),0<=r.call(F,b))this.tokens[this.tokens.length-1][0]=\"IDENTIFIER\";if(\"DEFAULT\"===(c=this.tag())||\"IMPORT_ALL\"===c||\"IDENTIFIER\"===c)return this.token(\"AS\",k),k.length}if(\"as\"===k&&this.seenExport&&(\"IDENTIFIER\"===(f=this.tag())||\"DEFAULT\"===f))return this.token(\"AS\",k),k.length;if(\"default\"===k&&this.seenExport&&(\"EXPORT\"===(n=this.tag())||\"AS\"===n))return this.token(\"DEFAULT\",k),k.length;b=this.tokens;b=b[b.length-\n1];var p=a||null!=b&&(\".\"===(h=b[0])||\"?.\"===h||\"::\"===h||\"?::\"===h||!b.spaced&&\"@\"===b[0])?\"PROPERTY\":\"IDENTIFIER\";\"IDENTIFIER\"!==p||!(0<=r.call(J,k)||0<=r.call(F,k))||this.exportSpecifierList&&0<=r.call(F,k)?\"IDENTIFIER\"===p&&this.seenFor&&\"from\"===k&&I(b)&&(p=\"FORFROM\",this.seenFor=!1):(p=k.toUpperCase(),\"WHEN\"===p&&(q=this.tag(),0<=r.call(sa,q))?p=\"LEADING_WHEN\":\"FOR\"===p?this.seenFor=!0:\"UNLESS\"===p?p=\"IF\":\"IMPORT\"===p?this.seenImport=!0:\"EXPORT\"===p?this.seenExport=!0:0<=r.call(ia,p)?p=\"UNARY\":\n0<=r.call(qa,p)&&(\"INSTANCEOF\"!==p&&this.seenFor?(p=\"FOR\"+p,this.seenFor=!1):(p=\"RELATION\",\"!\"===this.value()&&(w=this.tokens.pop(),k=\"!\"+k))));\"IDENTIFIER\"===p&&0<=r.call(G,k)&&this.error(\"reserved word '\"+k+\"'\",{length:k.length});if(\"PROPERTY\"!==p){if(0<=r.call(y,k)){var t=k;k=N[k]}p=function(){switch(k){case \"!\":return\"UNARY\";case \"\\x3d\\x3d\":case \"!\\x3d\":return\"COMPARE\";case \"true\":case \"false\":return\"BOOL\";case \"break\":case \"continue\":case \"debugger\":return\"STATEMENT\";case \"\\x26\\x26\":case \"||\":return k;\ndefault:return p}}()}h=this.token(p,k,0,x);t&&(h.origin=[p,t,h[2]]);w&&(t=[w[2].first_line,w[2].first_column],h[2].first_line=t[0],h[2].first_column=t[1]);a&&(t=e.lastIndexOf(\":\"),this.token(\":\",\":\",t,a.length));return e.length};a.prototype.numberToken=function(){var a,b;if(!(a=n.exec(this.chunk)))return 0;var c=a[0];a=c.length;switch(!1){case !/^0[BOX]/.test(c):this.error(\"radix prefix in '\"+c+\"' must be lowercase\",{offset:1});break;case !/^(?!0x).*E/.test(c):this.error(\"exponential notation in '\"+\nc+\"' must be indicated with a lowercase 'e'\",{offset:c.indexOf(\"E\")});break;case !/^0\\d*[89]/.test(c):this.error(\"decimal literal '\"+c+\"' must not be prefixed with '0'\",{length:a});break;case !/^0\\d+/.test(c):this.error(\"octal literal '\"+c+\"' must be prefixed with '0o'\",{length:a})}var f=function(){switch(c.charAt(1)){case \"b\":return 2;case \"o\":return 8;case \"x\":return 16;default:return null}}();f=null!=f?parseInt(c.slice(2),f):parseFloat(c);if(\"b\"===(b=c.charAt(1))||\"o\"===b)c=\"0x\"+f.toString(16);\nthis.token(Infinity===f?\"INFINITY\":\"NUMBER\",c,0,a);return a};a.prototype.stringToken=function(){var a,b,c,f,n;var h=(U.exec(this.chunk)||[])[0];if(!h)return 0;this.tokens.length&&\"from\"===this.value()&&(this.seenImport||this.seenExport)&&(this.tokens[this.tokens.length-1][0]=\"FROM\");var k=function(){switch(h){case \"'\":return W;case '\"':return H;case \"'''\":return Z;case '\"\"\"':return T}}();var q=3===h.length;k=this.matchWithInterpolations(k,h);var e=k.tokens;var p=k.index;var x=e.length-1;k=h.charAt(0);\nif(q){var w=null;for(q=function(){var a,c;var m=[];b=a=0;for(c=e.length;a<c;b=++a)n=e[b],\"NEOSTRING\"===n[0]&&m.push(n[1]);return m}().join(\"#{}\");a=A.exec(q);)if(a=a[1],null===w||0<(f=a.length)&&f<w.length)w=a;w&&(c=RegExp(\"\\\\n\"+w,\"g\"));this.mergeInterpolationTokens(e,{delimiter:k},function(a){return function(b,m){b=a.formatString(b,{delimiter:h});c&&(b=b.replace(c,\"\\n\"));0===m&&(b=b.replace(Aa,\"\"));m===x&&(b=b.replace(ma,\"\"));return b}}(this))}else this.mergeInterpolationTokens(e,{delimiter:k},function(a){return function(b,\nm){b=a.formatString(b,{delimiter:h});return b=b.replace(D,function(a,d){return 0===m&&0===d||m===x&&d+a.length===b.length?\"\":\" \"})}}(this));return p};a.prototype.commentToken=function(){var a,b;if(!(b=this.chunk.match(q)))return 0;var c=b[0];if(a=b[1])(b=X.exec(c))&&this.error(\"block comments cannot contain \"+b[0],{offset:b.index,length:b[0].length}),0<=a.indexOf(\"\\n\")&&(a=a.replace(RegExp(\"\\\\n\"+k(\" \",this.indent),\"g\"),\"\\n\")),this.token(\"HERECOMMENT\",a,0,c.length);return c.length};a.prototype.jsToken=\nfunction(){var a;if(\"`\"!==this.chunk.charAt(0)||!(a=L.exec(this.chunk)||P.exec(this.chunk)))return 0;var b=a[1].replace(/\\\\+(`|$)/g,function(a){return a.slice(-Math.ceil(a.length/2))});this.token(\"JS\",b,0,a[0].length);return a[0].length};a.prototype.regexToken=function(){var a,b,c;switch(!1){case !(a=S.exec(this.chunk)):this.error(\"regular expressions cannot begin with \"+a[2],{offset:a.index+a[1].length});break;case !(a=this.matchWithInterpolations(ba,\"///\")):var f=a.tokens;var h=a.index;break;case !(a=\nic.exec(this.chunk)):var n=a[0];var k=a[1];a=a[2];this.validateEscapes(k,{isRegex:!0,offsetInChunk:1});k=this.formatRegex(k,{delimiter:\"/\"});h=n.length;var q=this.tokens;if(q=q[q.length-1])if(q.spaced&&(b=q[0],0<=r.call(ha,b))){if(!a||v.test(n))return 0}else if(c=q[0],0<=r.call(oa,c))return 0;a||this.error(\"missing / (unclosed regex)\");break;default:return 0}c=E.exec(this.chunk.slice(h))[0];b=h+c.length;a=this.makeToken(\"REGEX\",null,0,b);switch(!1){case !!aa.test(c):this.error(\"invalid regular expression flags \"+\nc,{offset:h,length:c.length});break;case !(n||1===f.length):null==k&&(k=this.formatHeregex(f[0][1]));this.token(\"REGEX\",\"\"+this.makeDelimitedLiteral(k,{delimiter:\"/\"})+c,0,b,a);break;default:this.token(\"REGEX_START\",\"(\",0,0,a),this.token(\"IDENTIFIER\",\"RegExp\",0,0),this.token(\"CALL_START\",\"(\",0,0),this.mergeInterpolationTokens(f,{delimiter:'\"',double:!0},this.formatHeregex),c&&(this.token(\",\",\",\",h-1,0),this.token(\"STRING\",'\"'+c+'\"',h-1,c.length)),this.token(\")\",\")\",b-1,0),this.token(\"REGEX_END\",\")\",\nb-1,0)}return b};a.prototype.lineToken=function(){var a;if(!(a=K.exec(this.chunk)))return 0;a=a[0];this.seenFor=!1;this.importSpecifierList||(this.seenImport=!1);this.exportSpecifierList||(this.seenExport=!1);var b=a.length-1-a.lastIndexOf(\"\\n\");var c=this.unfinished();if(b-this.indebt===this.indent)return c?this.suppressNewlines():this.newlineToken(0),a.length;if(b>this.indent){if(c)return this.indebt=b-this.indent,this.suppressNewlines(),a.length;if(!this.tokens.length)return this.baseIndent=this.indent=\nb,a.length;c=b-this.indent+this.outdebt;this.token(\"INDENT\",c,a.length-b,b);this.indents.push(c);this.ends.push({tag:\"OUTDENT\"});this.outdebt=this.indebt=0;this.indent=b}else b<this.baseIndent?this.error(\"missing indentation\",{offset:a.length}):(this.indebt=0,this.outdentToken(this.indent-b,c,a.length));return a.length};a.prototype.outdentToken=function(a,b,c){var f,h,n;for(f=this.indent-a;0<a;)if(h=this.indents[this.indents.length-1])if(h===this.outdebt)a-=this.outdebt,this.outdebt=0;else if(h<this.outdebt)this.outdebt-=\nh,a-=h;else{var k=this.indents.pop()+this.outdebt;c&&(n=this.chunk[c],0<=r.call(ca,n))&&(f-=k-a,a=k);this.outdebt=0;this.pair(\"OUTDENT\");this.token(\"OUTDENT\",a,0,c);a-=k}else a=0;k&&(this.outdebt-=a);for(;\";\"===this.value();)this.tokens.pop();\"TERMINATOR\"===this.tag()||b||this.token(\"TERMINATOR\",\"\\n\",c,0);this.indent=f;return this};a.prototype.whitespaceToken=function(){var a;if(!(a=w.exec(this.chunk))&&\"\\n\"!==this.chunk.charAt(0))return 0;var b=this.tokens;(b=b[b.length-1])&&(b[a?\"spaced\":\"newLine\"]=\n!0);return a?a[0].length:0};a.prototype.newlineToken=function(a){for(;\";\"===this.value();)this.tokens.pop();\"TERMINATOR\"!==this.tag()&&this.token(\"TERMINATOR\",\"\\n\",a,0);return this};a.prototype.suppressNewlines=function(){\"\\\\\"===this.value()&&this.tokens.pop();return this};a.prototype.literalToken=function(){var a,b,f,n,k;(a=c.exec(this.chunk))?(a=a[0],h.test(a)&&this.tagParameters()):a=this.chunk.charAt(0);var q=a;var e=this.tokens;if((e=e[e.length-1])&&0<=r.call([\"\\x3d\"].concat(x.call(ea)),a)){var p=\n!1;\"\\x3d\"!==a||\"||\"!==(f=e[1])&&\"\\x26\\x26\"!==f||e.spaced||(e[0]=\"COMPOUND_ASSIGN\",e[1]+=\"\\x3d\",e=this.tokens[this.tokens.length-2],p=!0);e&&\"PROPERTY\"!==e[0]&&(f=null!=(b=e.origin)?b:e,(b=z(e[1],f[1]))&&this.error(b,f[2]));if(p)return a.length}\"{\"===a&&this.seenImport?this.importSpecifierList=!0:this.importSpecifierList&&\"}\"===a?this.importSpecifierList=!1:\"{\"===a&&\"EXPORT\"===(null!=e?e[0]:void 0)?this.exportSpecifierList=!0:this.exportSpecifierList&&\"}\"===a&&(this.exportSpecifierList=!1);if(\";\"===\na)this.seenFor=this.seenImport=this.seenExport=!1,q=\"TERMINATOR\";else if(\"*\"===a&&\"EXPORT\"===e[0])q=\"EXPORT_ALL\";else if(0<=r.call(pa,a))q=\"MATH\";else if(0<=r.call(la,a))q=\"COMPARE\";else if(0<=r.call(ea,a))q=\"COMPOUND_ASSIGN\";else if(0<=r.call(ia,a))q=\"UNARY\";else if(0<=r.call(fa,a))q=\"UNARY_MATH\";else if(0<=r.call(ja,a))q=\"SHIFT\";else if(\"?\"===a&&null!=e&&e.spaced)q=\"BIN?\";else if(e&&!e.spaced)if(\"(\"===a&&(n=e[0],0<=r.call(ha,n)))\"?\"===e[0]&&(e[0]=\"FUNC_EXIST\"),q=\"CALL_START\";else if(\"[\"===a&&(k=\ne[0],0<=r.call(ka,k)))switch(q=\"INDEX_START\",e[0]){case \"?\":e[0]=\"INDEX_SOAK\"}n=this.makeToken(q,a);switch(a){case \"(\":case \"{\":case \"[\":this.ends.push({tag:za[a],origin:n});break;case \")\":case \"}\":case \"]\":this.pair(a)}this.tokens.push(n);return a.length};a.prototype.tagParameters=function(){var a;if(\")\"!==this.tag())return this;var b=[];var c=this.tokens;var f=c.length;for(c[--f][0]=\"PARAM_END\";a=c[--f];)switch(a[0]){case \")\":b.push(a);break;case \"(\":case \"CALL_START\":if(b.length)b.pop();else return\"(\"===\na[0]&&(a[0]=\"PARAM_START\"),this}return this};a.prototype.closeIndentation=function(){return this.outdentToken(this.indent)};a.prototype.matchWithInterpolations=function(b,c){var f,h;var n=[];var k=c.length;if(this.chunk.slice(0,k)!==c)return null;for(h=this.chunk.slice(k);;){var e=b.exec(h)[0];this.validateEscapes(e,{isRegex:\"/\"===c.charAt(0),offsetInChunk:k});n.push(this.makeToken(\"NEOSTRING\",e,k));h=h.slice(e.length);k+=e.length;if(\"#{\"!==h.slice(0,2))break;var q=this.getLineAndColumnFromChunk(k+\n1);e=q[0];q=q[1];q=(new a).tokenize(h.slice(1),{line:e,column:q,untilBalanced:!0});e=q.tokens;var p=q.index;p+=1;var x=e[0];q=e[e.length-1];x[0]=x[1]=\"(\";q[0]=q[1]=\")\";q.origin=[\"\",\"end of interpolation\",q[2]];\"TERMINATOR\"===(null!=(f=e[1])?f[0]:void 0)&&e.splice(1,1);n.push([\"TOKENS\",e]);h=h.slice(p);k+=p}h.slice(0,c.length)!==c&&this.error(\"missing \"+c,{length:c.length});b=n[0];f=n[n.length-1];b[2].first_column-=c.length;\"\\n\"===f[1].substr(-1)?(f[2].last_line+=1,f[2].last_column=c.length-1):f[2].last_column+=\nc.length;0===f[1].length&&--f[2].last_column;return{tokens:n,index:k+c.length}};a.prototype.mergeInterpolationTokens=function(a,b,c){var f,h,n,k;1<a.length&&(n=this.token(\"STRING_START\",\"(\",0,0));var e=this.tokens.length;var q=f=0;for(h=a.length;f<h;q=++f){var p=a[q];var x=p[0];var w=p[1];switch(x){case \"TOKENS\":if(2===w.length)continue;var t=w[0];var Ia=w;break;case \"NEOSTRING\":x=c.call(this,p[1],q);if(0===x.length)if(0===q)var m=this.tokens.length;else continue;2===q&&null!=m&&this.tokens.splice(m,\n2);p[0]=\"STRING\";p[1]=this.makeDelimitedLiteral(x,b);t=p;Ia=[p]}this.tokens.length>e&&(q=this.token(\"+\",\"+\"),q[2]={first_line:t[2].first_line,first_column:t[2].first_column,last_line:t[2].first_line,last_column:t[2].first_column});(k=this.tokens).push.apply(k,Ia)}if(n)return a=a[a.length-1],n.origin=[\"STRING\",null,{first_line:n[2].first_line,first_column:n[2].first_column,last_line:a[2].last_line,last_column:a[2].last_column}],n=this.token(\"STRING_END\",\")\"),n[2]={first_line:a[2].last_line,first_column:a[2].last_column,\nlast_line:a[2].last_line,last_column:a[2].last_column}};a.prototype.pair=function(a){var b=this.ends;b=b[b.length-1];return a!==(b=null!=b?b.tag:void 0)?(\"OUTDENT\"!==b&&this.error(\"unmatched \"+a),b=this.indents,b=b[b.length-1],this.outdentToken(b,!0),this.pair(a)):this.ends.pop()};a.prototype.getLineAndColumnFromChunk=function(a){if(0===a)return[this.chunkLine,this.chunkColumn];var b=a>=this.chunk.length?this.chunk:this.chunk.slice(0,+(a-1)+1||9E9);a=f(b,\"\\n\");var c=this.chunkColumn;0<a?(c=b.split(\"\\n\"),\nc=c[c.length-1],c=c.length):c+=b.length;return[this.chunkLine+a,c]};a.prototype.makeToken=function(a,b,c,f){null==c&&(c=0);null==f&&(f=b.length);var h={};var n=this.getLineAndColumnFromChunk(c);h.first_line=n[0];h.first_column=n[1];c=this.getLineAndColumnFromChunk(c+(0<f?f-1:0));h.last_line=c[0];h.last_column=c[1];return[a,b,h]};a.prototype.token=function(a,b,c,f,h){a=this.makeToken(a,b,c,f);h&&(a.origin=h);this.tokens.push(a);return a};a.prototype.tag=function(){var a=this.tokens;a=a[a.length-1];\nreturn null!=a?a[0]:void 0};a.prototype.value=function(){var a=this.tokens;a=a[a.length-1];return null!=a?a[1]:void 0};a.prototype.unfinished=function(){var a;return R.test(this.chunk)||(a=this.tag(),0<=r.call(xa,a))};a.prototype.formatString=function(a,b){return this.replaceUnicodeCodePointEscapes(a.replace(V,\"$1\"),b)};a.prototype.formatHeregex=function(a){return this.formatRegex(a.replace(C,\"$1$2\"),{delimiter:\"///\"})};a.prototype.formatRegex=function(a,b){return this.replaceUnicodeCodePointEscapes(a,\nb)};a.prototype.unicodeCodePointToUnicodeEscapes=function(a){var b=function(a){a=a.toString(16);return\"\\\\u\"+k(\"0\",4-a.length)+a};if(65536>a)return b(a);var c=Math.floor((a-65536)/1024)+55296;a=(a-65536)%1024+56320;return\"\"+b(c)+b(a)};a.prototype.replaceUnicodeCodePointEscapes=function(a,b){return a.replace(ta,function(a){return function(c,f,h,n){if(f)return f;c=parseInt(h,16);1114111<c&&a.error(\"unicode code point escapes greater than \\\\u{10ffff} are not allowed\",{offset:n+b.delimiter.length,length:h.length+\n4});return a.unicodeCodePointToUnicodeEscapes(c)}}(this))};a.prototype.validateEscapes=function(a,b){var c,f;null==b&&(b={});if(c=(b.isRegex?ya:M).exec(a)){c[0];a=c[1];var h=c[2];var n=c[3];var k=c[4];var e=c[5];n=\"\\\\\"+(h||n||k||e);return this.error((h?\"octal escape sequences are not allowed\":\"invalid escape sequence\")+\" \"+n,{offset:(null!=(f=b.offsetInChunk)?f:0)+c.index+a.length,length:n.length})}};a.prototype.makeDelimitedLiteral=function(a,b){null==b&&(b={});\"\"===a&&\"/\"===b.delimiter&&(a=\"(?:)\");\na=a.replace(RegExp(\"(\\\\\\\\\\\\\\\\)|(\\\\\\\\0(?\\x3d[1-7]))|\\\\\\\\?(\"+b.delimiter+\")|\\\\\\\\?(?:(\\\\n)|(\\\\r)|(\\\\u2028)|(\\\\u2029))|(\\\\\\\\.)\",\"g\"),function(a,c,f,h,n,k,e,q,p){switch(!1){case !c:return b.double?c+c:c;case !f:return\"\\\\x00\";case !h:return\"\\\\\"+h;case !n:return\"\\\\n\";case !k:return\"\\\\r\";case !e:return\"\\\\u2028\";case !q:return\"\\\\u2029\";case !p:return b.double?\"\\\\\"+p:p}});return\"\"+b.delimiter+a+b.delimiter};a.prototype.error=function(a,b){var c,f,h,n,k;null==b&&(b={});b=\"first_line\"in b?b:(n=this.getLineAndColumnFromChunk(null!=\n(h=b.offset)?h:0),f=n[0],c=n[1],n,{first_line:f,first_column:c,last_column:c+(null!=(k=b.length)?k:1)-1});return p(a,b)};return a}();var z=function(a,b){null==b&&(b=a);switch(!1){case 0>r.call(x.call(J).concat(x.call(F)),a):return\"keyword '\"+b+\"' can't be assigned\";case 0>r.call(O,a):return\"'\"+b+\"' can't be assigned\";case 0>r.call(G,a):return\"reserved word '\"+b+\"' can't be assigned\";default:return!1}};e.isUnassignable=z;var I=function(a){var b;return\"IDENTIFIER\"===a[0]?(\"from\"===a[1]&&(a[1][0]=\"IDENTIFIER\",\n!0),!0):\"FOR\"===a[0]?!1:\"{\"===(b=a[1])||\"[\"===b||\",\"===b||\":\"===b?!1:!0};var J=\"true false null this new delete typeof in instanceof return throw break continue debugger yield if else switch for while do try catch finally class extends super import export default\".split(\" \");var F=\"undefined Infinity NaN then unless until loop of by when\".split(\" \");var N={and:\"\\x26\\x26\",or:\"||\",is:\"\\x3d\\x3d\",isnt:\"!\\x3d\",not:\"!\",yes:\"true\",no:\"false\",on:\"true\",off:\"false\"};var y=function(){var a=[];for(ra in N)a.push(ra);\nreturn a}();F=F.concat(y);var G=\"case function var void with const let enum native implements interface package private protected public static\".split(\" \");var O=[\"arguments\",\"eval\"];e.JS_FORBIDDEN=J.concat(G).concat(O);var Q=65279;var B=/^(?!\\d)((?:(?!\\s)[$\\w\\x7f-\\uffff])+)([^\\n\\S]*:(?!:))?/;var n=/^0b[01]+|^0o[0-7]+|^0x[\\da-f]+|^\\d*\\.?\\d+(?:e[+-]?\\d+)?/i;var c=/^(?:[-=]>|[-+*\\/%<>&|^!?=]=|>>>=?|([-+:])\\1|([&|<>*\\/%])\\2=?|\\?(\\.|::)|\\.{2,3})/;var w=/^[^\\n\\S]+/;var q=/^###([^#][\\s\\S]*?)(?:###[^\\n\\S]*|###$)|^(?:\\s*#(?!##[^#]).*)+/;\nvar h=/^[-=]>/;var K=/^(?:\\n[^\\n\\S]*)+/;var P=/^`(?!``)((?:[^`\\\\]|\\\\[\\s\\S])*)`/;var L=/^```((?:[^`\\\\]|\\\\[\\s\\S]|`(?!``))*)```/;var U=/^(?:'''|\"\"\"|'|\")/;var W=/^(?:[^\\\\']|\\\\[\\s\\S])*/;var H=/^(?:[^\\\\\"#]|\\\\[\\s\\S]|\\#(?!\\{))*/;var Z=/^(?:[^\\\\']|\\\\[\\s\\S]|'(?!''))*/;var T=/^(?:[^\\\\\"#]|\\\\[\\s\\S]|\"(?!\"\")|\\#(?!\\{))*/;var V=/((?:\\\\\\\\)+)|\\\\[^\\S\\n]*\\n\\s*/g;var D=/\\s*\\n\\s*/g;var A=/\\n+([^\\n\\S]*)(?=\\S)/g;var ic=/^\\/(?!\\/)((?:[^[\\/\\n\\\\]|\\\\[^\\n]|\\[(?:\\\\[^\\n]|[^\\]\\n\\\\])*\\])*)(\\/)?/;var E=/^\\w*/;var aa=/^(?!.*(.).*\\1)[imguy]*$/;\nvar ba=/^(?:[^\\\\\\/#]|\\\\[\\s\\S]|\\/(?!\\/\\/)|\\#(?!\\{))*/;var C=/((?:\\\\\\\\)+)|\\\\(\\s)|\\s+(?:#.*)?/g;var S=/^(\\/|\\/{3}\\s*)(\\*)/;var v=/^\\/=?\\s/;var X=/\\*\\//;var R=/^\\s*(?:,|\\??\\.(?![.\\d])|::)/;var M=/((?:^|[^\\\\])(?:\\\\\\\\)*)\\\\(?:(0[0-7]|[1-7])|(x(?![\\da-fA-F]{2}).{0,2})|(u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?)|(u(?!\\{|[\\da-fA-F]{4}).{0,4}))/;var ya=/((?:^|[^\\\\])(?:\\\\\\\\)*)\\\\(?:(0[0-7])|(x(?![\\da-fA-F]{2}).{0,2})|(u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?)|(u(?!\\{|[\\da-fA-F]{4}).{0,4}))/;var ta=/(\\\\\\\\)|\\\\u\\{([\\da-fA-F]+)\\}/g;\nvar Aa=/^[^\\n\\S]*\\n/;var ma=/\\n[^\\n\\S]*$/;var Y=/\\s+$/;var ea=\"-\\x3d +\\x3d /\\x3d *\\x3d %\\x3d ||\\x3d \\x26\\x26\\x3d ?\\x3d \\x3c\\x3c\\x3d \\x3e\\x3e\\x3d \\x3e\\x3e\\x3e\\x3d \\x26\\x3d ^\\x3d |\\x3d **\\x3d //\\x3d %%\\x3d\".split(\" \");var ia=[\"NEW\",\"TYPEOF\",\"DELETE\",\"DO\"];var fa=[\"!\",\"~\"];var ja=[\"\\x3c\\x3c\",\"\\x3e\\x3e\",\"\\x3e\\x3e\\x3e\"];var la=\"\\x3d\\x3d !\\x3d \\x3c \\x3e \\x3c\\x3d \\x3e\\x3d\".split(\" \");var pa=[\"*\",\"/\",\"%\",\"//\",\"%%\"];var qa=[\"IN\",\"OF\",\"INSTANCEOF\"];var ha=\"IDENTIFIER PROPERTY ) ] ? @ THIS SUPER\".split(\" \");\nvar ka=ha.concat(\"NUMBER INFINITY NAN STRING STRING_END REGEX REGEX_END BOOL NULL UNDEFINED } ::\".split(\" \"));var oa=ka.concat([\"++\",\"--\"]);var sa=[\"INDENT\",\"OUTDENT\",\"TERMINATOR\"];var ca=[\")\",\"}\",\"]\"];var xa=\"\\\\ . ?. ?:: UNARY MATH UNARY_MATH + - ** SHIFT RELATION COMPARE \\x26 ^ | \\x26\\x26 || BIN? THROW EXTENDS DEFAULT\".split(\" \")}).call(this);return e}();u[\"./parser\"]=function(){var e={},ra={exports:e},r=function(){function e(){this.yy={}}var a=function(a,l,m,d){m=m||{};for(d=a.length;d--;m[a[d]]=\nl);return m},b=[1,22],u=[1,25],f=[1,83],k=[1,79],t=[1,84],p=[1,85],z=[1,81],I=[1,82],J=[1,56],F=[1,58],N=[1,59],y=[1,60],G=[1,61],O=[1,62],Q=[1,49],B=[1,50],n=[1,32],c=[1,68],w=[1,69],q=[1,78],h=[1,47],K=[1,51],P=[1,52],L=[1,67],U=[1,65],W=[1,66],H=[1,64],Z=[1,42],T=[1,48],V=[1,63],D=[1,73],A=[1,74],r=[1,75],E=[1,76],aa=[1,46],ba=[1,72],C=[1,34],S=[1,35],v=[1,36],X=[1,37],R=[1,38],M=[1,39],ra=[1,86],ta=[1,6,32,42,131],Aa=[1,101],ma=[1,89],Y=[1,88],ea=[1,87],ia=[1,90],fa=[1,91],ja=[1,92],la=[1,93],\npa=[1,94],qa=[1,95],ha=[1,96],ka=[1,97],oa=[1,98],sa=[1,99],ca=[1,100],ya=[1,104],na=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],Da=[2,167],va=[1,110],xa=[1,111],Ha=[1,112],Ka=[1,113],Fa=[1,115],Ra=[1,116],La=[1,109],Ga=[1,6,32,42,131,133,135,139,156],Wa=[2,27],da=[1,123],Za=[1,121],Ea=[1,6,31,32,40,41,42,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,\n169,170,171,172,173,174],Ia=[2,95],m=[1,6,31,32,42,46,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],l=[2,74],d=[1,128],Ca=[1,133],Ja=[1,134],ua=[1,136],Na=[1,6,31,32,40,41,42,55,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],wa=[2,92],Gb=[1,6,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,163,164,\n165,166,167,168,169,170,171,172,173,174],$a=[2,64],Hb=[1,161],Ib=[1,167],ab=[1,179],Va=[1,181],Jb=[1,176],Qa=[1,183],ub=[1,185],Oa=[1,6,31,32,40,41,42,55,66,71,74,82,83,84,85,87,89,90,94,96,113,114,115,120,122,131,133,134,135,139,140,156,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175],Kb=[2,111],Lb=[1,6,31,32,40,41,42,58,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],Mb=[1,6,31,32,40,41,\n42,46,58,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],Nb=[40,41,114],Ob=[1,242],vb=[1,241],Pa=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156],Ma=[2,72],Pb=[1,251],Ua=[6,31,32,66,71],hb=[6,31,32,55,66,71,74],bb=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,164,166,167,168,169,170,171,172,173,174],Qb=[40,41,82,83,84,85,87,90,113,114],ib=[1,270],cb=[2,62],\njb=[1,281],Xa=[1,283],wb=[1,288],db=[1,290],Rb=[2,188],xb=[1,6,31,32,40,41,42,55,66,71,74,82,83,84,85,87,89,90,94,113,114,115,120,122,131,133,134,135,139,140,146,147,148,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],kb=[1,299],Sa=[6,31,32,71,115,120],Sb=[1,6,31,32,40,41,42,55,58,66,71,74,82,83,84,85,87,89,90,94,96,113,114,115,120,122,131,133,134,135,139,140,146,147,148,156,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175],Tb=[1,6,31,32,42,66,71,74,89,94,115,120,122,\n131,140,156],Ya=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,134,140,156],lb=[146,147,148],mb=[71,146,147,148],nb=[6,31,94],Ub=[1,313],Ba=[6,31,32,71,94],Vb=[6,31,32,58,71,94],yb=[6,31,32,55,58,71,94],Wb=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,166,167,168,169,170,171,172,173,174],Xb=[12,28,34,38,40,41,44,45,48,49,50,51,52,53,61,63,64,68,69,89,92,95,97,105,112,117,118,119,125,129,130,133,135,137,139,149,155,157,158,159,160,161,162],Yb=[2,177],Ta=[6,31,32],eb=[2,\n73],Zb=[1,325],$b=[1,326],ac=[1,6,31,32,42,66,71,74,89,94,115,120,122,127,128,131,133,134,135,139,140,151,153,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],ob=[32,151,153],bc=[1,6,32,42,66,71,74,89,94,115,120,122,131,134,140,156],pb=[1,353],zb=[1,359],Ab=[1,6,32,42,131,156],fb=[2,87],qb=[1,370],rb=[1,371],cc=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,151,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],Bb=[1,6,31,32,42,66,71,74,89,94,115,120,122,131,\n133,135,139,140,156],dc=[1,384],ec=[1,385],Cb=[6,31,32,94],fc=[6,31,32,71],Db=[1,6,31,32,42,66,71,74,89,94,115,120,122,127,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],gc=[31,71],sb=[1,411],tb=[1,412],Eb=[1,418],Fb=[1,419],hc={trace:function(){},yy:{},symbols_:{error:2,Root:3,Body:4,Line:5,TERMINATOR:6,Expression:7,Statement:8,YieldReturn:9,Return:10,Comment:11,STATEMENT:12,Import:13,Export:14,Value:15,Invocation:16,Code:17,Operation:18,Assign:19,If:20,Try:21,\nWhile:22,For:23,Switch:24,Class:25,Throw:26,Yield:27,YIELD:28,FROM:29,Block:30,INDENT:31,OUTDENT:32,Identifier:33,IDENTIFIER:34,Property:35,PROPERTY:36,AlphaNumeric:37,NUMBER:38,String:39,STRING:40,STRING_START:41,STRING_END:42,Regex:43,REGEX:44,REGEX_START:45,REGEX_END:46,Literal:47,JS:48,UNDEFINED:49,NULL:50,BOOL:51,INFINITY:52,NAN:53,Assignable:54,\"\\x3d\":55,AssignObj:56,ObjAssignable:57,\":\":58,SimpleObjAssignable:59,ThisProperty:60,RETURN:61,Object:62,HERECOMMENT:63,PARAM_START:64,ParamList:65,\nPARAM_END:66,FuncGlyph:67,\"-\\x3e\":68,\"\\x3d\\x3e\":69,OptComma:70,\",\":71,Param:72,ParamVar:73,\"...\":74,Array:75,Splat:76,SimpleAssignable:77,Accessor:78,Parenthetical:79,Range:80,This:81,\".\":82,\"?.\":83,\"::\":84,\"?::\":85,Index:86,INDEX_START:87,IndexValue:88,INDEX_END:89,INDEX_SOAK:90,Slice:91,\"{\":92,AssignList:93,\"}\":94,CLASS:95,EXTENDS:96,IMPORT:97,ImportDefaultSpecifier:98,ImportNamespaceSpecifier:99,ImportSpecifierList:100,ImportSpecifier:101,AS:102,DEFAULT:103,IMPORT_ALL:104,EXPORT:105,ExportSpecifierList:106,\nEXPORT_ALL:107,ExportSpecifier:108,OptFuncExist:109,Arguments:110,Super:111,SUPER:112,FUNC_EXIST:113,CALL_START:114,CALL_END:115,ArgList:116,THIS:117,\"@\":118,\"[\":119,\"]\":120,RangeDots:121,\"..\":122,Arg:123,SimpleArgs:124,TRY:125,Catch:126,FINALLY:127,CATCH:128,THROW:129,\"(\":130,\")\":131,WhileSource:132,WHILE:133,WHEN:134,UNTIL:135,Loop:136,LOOP:137,ForBody:138,FOR:139,BY:140,ForStart:141,ForSource:142,ForVariables:143,OWN:144,ForValue:145,FORIN:146,FOROF:147,FORFROM:148,SWITCH:149,Whens:150,ELSE:151,\nWhen:152,LEADING_WHEN:153,IfBlock:154,IF:155,POST_IF:156,UNARY:157,UNARY_MATH:158,\"-\":159,\"+\":160,\"--\":161,\"++\":162,\"?\":163,MATH:164,\"**\":165,SHIFT:166,COMPARE:167,\"\\x26\":168,\"^\":169,\"|\":170,\"\\x26\\x26\":171,\"||\":172,\"BIN?\":173,RELATION:174,COMPOUND_ASSIGN:175,$accept:0,$end:1},terminals_:{2:\"error\",6:\"TERMINATOR\",12:\"STATEMENT\",28:\"YIELD\",29:\"FROM\",31:\"INDENT\",32:\"OUTDENT\",34:\"IDENTIFIER\",36:\"PROPERTY\",38:\"NUMBER\",40:\"STRING\",41:\"STRING_START\",42:\"STRING_END\",44:\"REGEX\",45:\"REGEX_START\",46:\"REGEX_END\",\n48:\"JS\",49:\"UNDEFINED\",50:\"NULL\",51:\"BOOL\",52:\"INFINITY\",53:\"NAN\",55:\"\\x3d\",58:\":\",61:\"RETURN\",63:\"HERECOMMENT\",64:\"PARAM_START\",66:\"PARAM_END\",68:\"-\\x3e\",69:\"\\x3d\\x3e\",71:\",\",74:\"...\",82:\".\",83:\"?.\",84:\"::\",85:\"?::\",87:\"INDEX_START\",89:\"INDEX_END\",90:\"INDEX_SOAK\",92:\"{\",94:\"}\",95:\"CLASS\",96:\"EXTENDS\",97:\"IMPORT\",102:\"AS\",103:\"DEFAULT\",104:\"IMPORT_ALL\",105:\"EXPORT\",107:\"EXPORT_ALL\",112:\"SUPER\",113:\"FUNC_EXIST\",114:\"CALL_START\",115:\"CALL_END\",117:\"THIS\",118:\"@\",119:\"[\",120:\"]\",122:\"..\",125:\"TRY\",127:\"FINALLY\",\n128:\"CATCH\",129:\"THROW\",130:\"(\",131:\")\",133:\"WHILE\",134:\"WHEN\",135:\"UNTIL\",137:\"LOOP\",139:\"FOR\",140:\"BY\",144:\"OWN\",146:\"FORIN\",147:\"FOROF\",148:\"FORFROM\",149:\"SWITCH\",151:\"ELSE\",153:\"LEADING_WHEN\",155:\"IF\",156:\"POST_IF\",157:\"UNARY\",158:\"UNARY_MATH\",159:\"-\",160:\"+\",161:\"--\",162:\"++\",163:\"?\",164:\"MATH\",165:\"**\",166:\"SHIFT\",167:\"COMPARE\",168:\"\\x26\",169:\"^\",170:\"|\",171:\"\\x26\\x26\",172:\"||\",173:\"BIN?\",174:\"RELATION\",175:\"COMPOUND_ASSIGN\"},productions_:[0,[3,0],[3,1],[4,1],[4,3],[4,2],[5,1],[5,1],[5,1],[8,\n1],[8,1],[8,1],[8,1],[8,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[27,1],[27,2],[27,3],[30,2],[30,3],[33,1],[35,1],[37,1],[37,1],[39,1],[39,3],[43,1],[43,3],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[19,3],[19,4],[19,5],[56,1],[56,3],[56,5],[56,3],[56,5],[56,1],[59,1],[59,1],[59,1],[57,1],[57,1],[10,2],[10,4],[10,1],[9,3],[9,2],[11,1],[17,5],[17,2],[67,1],[67,1],[70,0],[70,1],[65,0],[65,1],[65,3],[65,4],[65,6],[72,1],[72,2],[72,3],[72,1],[73,1],\n[73,1],[73,1],[73,1],[76,2],[77,1],[77,2],[77,2],[77,1],[54,1],[54,1],[54,1],[15,1],[15,1],[15,1],[15,1],[15,1],[78,2],[78,2],[78,2],[78,2],[78,1],[78,1],[86,3],[86,2],[88,1],[88,1],[62,4],[93,0],[93,1],[93,3],[93,4],[93,6],[25,1],[25,2],[25,3],[25,4],[25,2],[25,3],[25,4],[25,5],[13,2],[13,4],[13,4],[13,5],[13,7],[13,6],[13,9],[100,1],[100,3],[100,4],[100,4],[100,6],[101,1],[101,3],[101,1],[101,3],[98,1],[99,3],[14,3],[14,5],[14,2],[14,4],[14,5],[14,6],[14,3],[14,4],[14,7],[106,1],[106,3],[106,4],\n[106,4],[106,6],[108,1],[108,3],[108,3],[108,1],[108,3],[16,3],[16,3],[16,3],[16,1],[111,1],[111,2],[109,0],[109,1],[110,2],[110,4],[81,1],[81,1],[60,2],[75,2],[75,4],[121,1],[121,1],[80,5],[91,3],[91,2],[91,2],[91,1],[116,1],[116,3],[116,4],[116,4],[116,6],[123,1],[123,1],[123,1],[124,1],[124,3],[21,2],[21,3],[21,4],[21,5],[126,3],[126,3],[126,2],[26,2],[79,3],[79,5],[132,2],[132,4],[132,2],[132,4],[22,2],[22,2],[22,2],[22,1],[136,2],[136,2],[23,2],[23,2],[23,2],[138,2],[138,4],[138,2],[141,2],[141,\n3],[145,1],[145,1],[145,1],[145,1],[143,1],[143,3],[142,2],[142,2],[142,4],[142,4],[142,4],[142,6],[142,6],[142,2],[142,4],[24,5],[24,7],[24,4],[24,6],[150,1],[150,2],[152,3],[152,4],[154,3],[154,5],[20,1],[20,3],[20,3],[20,3],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,2],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,3],[18,5],[18,4],[18,3]],performAction:function(a,l,m,d,Ca,b,g){a=b.length-1;switch(Ca){case 1:return this.$=d.addLocationDataFn(g[a],\ng[a])(new d.Block);case 2:return this.$=b[a];case 3:this.$=d.addLocationDataFn(g[a],g[a])(d.Block.wrap([b[a]]));break;case 4:this.$=d.addLocationDataFn(g[a-2],g[a])(b[a-2].push(b[a]));break;case 5:this.$=b[a-1];break;case 6:case 7:case 8:case 9:case 10:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 35:case 40:case 42:case 56:case 57:case 58:case 59:case 60:case 61:case 72:case 73:case 83:case 84:case 85:case 86:case 91:case 92:case 95:case 99:case 105:case 164:case 188:case 189:case 191:case 221:case 222:case 240:case 246:this.$=\nb[a];break;case 11:this.$=d.addLocationDataFn(g[a],g[a])(new d.StatementLiteral(b[a]));break;case 27:this.$=d.addLocationDataFn(g[a],g[a])(new d.Op(b[a],new d.Value(new d.Literal(\"\"))));break;case 28:case 250:case 251:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Op(b[a-1],b[a]));break;case 29:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Op(b[a-2].concat(b[a-1]),b[a]));break;case 30:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Block);break;case 31:case 106:this.$=d.addLocationDataFn(g[a-2],g[a])(b[a-\n1]);break;case 32:this.$=d.addLocationDataFn(g[a],g[a])(new d.IdentifierLiteral(b[a]));break;case 33:this.$=d.addLocationDataFn(g[a],g[a])(new d.PropertyName(b[a]));break;case 34:this.$=d.addLocationDataFn(g[a],g[a])(new d.NumberLiteral(b[a]));break;case 36:this.$=d.addLocationDataFn(g[a],g[a])(new d.StringLiteral(b[a]));break;case 37:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.StringWithInterpolations(b[a-1]));break;case 38:this.$=d.addLocationDataFn(g[a],g[a])(new d.RegexLiteral(b[a]));break;\ncase 39:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.RegexWithInterpolations(b[a-1].args));break;case 41:this.$=d.addLocationDataFn(g[a],g[a])(new d.PassthroughLiteral(b[a]));break;case 43:this.$=d.addLocationDataFn(g[a],g[a])(new d.UndefinedLiteral);break;case 44:this.$=d.addLocationDataFn(g[a],g[a])(new d.NullLiteral);break;case 45:this.$=d.addLocationDataFn(g[a],g[a])(new d.BooleanLiteral(b[a]));break;case 46:this.$=d.addLocationDataFn(g[a],g[a])(new d.InfinityLiteral(b[a]));break;case 47:this.$=\nd.addLocationDataFn(g[a],g[a])(new d.NaNLiteral);break;case 48:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Assign(b[a-2],b[a]));break;case 49:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.Assign(b[a-3],b[a]));break;case 50:this.$=d.addLocationDataFn(g[a-4],g[a])(new d.Assign(b[a-4],b[a-1]));break;case 51:case 88:case 93:case 94:case 96:case 97:case 98:case 223:case 224:this.$=d.addLocationDataFn(g[a],g[a])(new d.Value(b[a]));break;case 52:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Assign(d.addLocationDataFn(g[a-\n2])(new d.Value(b[a-2])),b[a],\"object\",{operatorToken:d.addLocationDataFn(g[a-1])(new d.Literal(b[a-1]))}));break;case 53:this.$=d.addLocationDataFn(g[a-4],g[a])(new d.Assign(d.addLocationDataFn(g[a-4])(new d.Value(b[a-4])),b[a-1],\"object\",{operatorToken:d.addLocationDataFn(g[a-3])(new d.Literal(b[a-3]))}));break;case 54:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Assign(d.addLocationDataFn(g[a-2])(new d.Value(b[a-2])),b[a],null,{operatorToken:d.addLocationDataFn(g[a-1])(new d.Literal(b[a-1]))}));\nbreak;case 55:this.$=d.addLocationDataFn(g[a-4],g[a])(new d.Assign(d.addLocationDataFn(g[a-4])(new d.Value(b[a-4])),b[a-1],null,{operatorToken:d.addLocationDataFn(g[a-3])(new d.Literal(b[a-3]))}));break;case 62:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Return(b[a]));break;case 63:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.Return(new d.Value(b[a-1])));break;case 64:this.$=d.addLocationDataFn(g[a],g[a])(new d.Return);break;case 65:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.YieldReturn(b[a]));\nbreak;case 66:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.YieldReturn);break;case 67:this.$=d.addLocationDataFn(g[a],g[a])(new d.Comment(b[a]));break;case 68:this.$=d.addLocationDataFn(g[a-4],g[a])(new d.Code(b[a-3],b[a],b[a-1]));break;case 69:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Code([],b[a],b[a-1]));break;case 70:this.$=d.addLocationDataFn(g[a],g[a])(\"func\");break;case 71:this.$=d.addLocationDataFn(g[a],g[a])(\"boundfunc\");break;case 74:case 111:this.$=d.addLocationDataFn(g[a],g[a])([]);\nbreak;case 75:case 112:case 131:case 151:case 183:case 225:this.$=d.addLocationDataFn(g[a],g[a])([b[a]]);break;case 76:case 113:case 132:case 152:case 184:this.$=d.addLocationDataFn(g[a-2],g[a])(b[a-2].concat(b[a]));break;case 77:case 114:case 133:case 153:case 185:this.$=d.addLocationDataFn(g[a-3],g[a])(b[a-3].concat(b[a]));break;case 78:case 115:case 135:case 155:case 187:this.$=d.addLocationDataFn(g[a-5],g[a])(b[a-5].concat(b[a-2]));break;case 79:this.$=d.addLocationDataFn(g[a],g[a])(new d.Param(b[a]));\nbreak;case 80:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Param(b[a-1],null,!0));break;case 81:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Param(b[a-2],b[a]));break;case 82:case 190:this.$=d.addLocationDataFn(g[a],g[a])(new d.Expansion);break;case 87:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Splat(b[a-1]));break;case 89:this.$=d.addLocationDataFn(g[a-1],g[a])(b[a-1].add(b[a]));break;case 90:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Value(b[a-1],[].concat(b[a])));break;case 100:this.$=\nd.addLocationDataFn(g[a-1],g[a])(new d.Access(b[a]));break;case 101:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Access(b[a],\"soak\"));break;case 102:this.$=d.addLocationDataFn(g[a-1],g[a])([d.addLocationDataFn(g[a-1])(new d.Access(new d.PropertyName(\"prototype\"))),d.addLocationDataFn(g[a])(new d.Access(b[a]))]);break;case 103:this.$=d.addLocationDataFn(g[a-1],g[a])([d.addLocationDataFn(g[a-1])(new d.Access(new d.PropertyName(\"prototype\"),\"soak\")),d.addLocationDataFn(g[a])(new d.Access(b[a]))]);break;\ncase 104:this.$=d.addLocationDataFn(g[a],g[a])(new d.Access(new d.PropertyName(\"prototype\")));break;case 107:this.$=d.addLocationDataFn(g[a-1],g[a])(d.extend(b[a],{soak:!0}));break;case 108:this.$=d.addLocationDataFn(g[a],g[a])(new d.Index(b[a]));break;case 109:this.$=d.addLocationDataFn(g[a],g[a])(new d.Slice(b[a]));break;case 110:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.Obj(b[a-2],b[a-3].generated));break;case 116:this.$=d.addLocationDataFn(g[a],g[a])(new d.Class);break;case 117:this.$=d.addLocationDataFn(g[a-\n1],g[a])(new d.Class(null,null,b[a]));break;case 118:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Class(null,b[a]));break;case 119:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.Class(null,b[a-1],b[a]));break;case 120:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Class(b[a]));break;case 121:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Class(b[a-1],null,b[a]));break;case 122:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.Class(b[a-2],b[a]));break;case 123:this.$=d.addLocationDataFn(g[a-4],g[a])(new d.Class(b[a-\n3],b[a-1],b[a]));break;case 124:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.ImportDeclaration(null,b[a]));break;case 125:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.ImportDeclaration(new d.ImportClause(b[a-2],null),b[a]));break;case 126:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.ImportDeclaration(new d.ImportClause(null,b[a-2]),b[a]));break;case 127:this.$=d.addLocationDataFn(g[a-4],g[a])(new d.ImportDeclaration(new d.ImportClause(null,new d.ImportSpecifierList([])),b[a]));break;case 128:this.$=\nd.addLocationDataFn(g[a-6],g[a])(new d.ImportDeclaration(new d.ImportClause(null,new d.ImportSpecifierList(b[a-4])),b[a]));break;case 129:this.$=d.addLocationDataFn(g[a-5],g[a])(new d.ImportDeclaration(new d.ImportClause(b[a-4],b[a-2]),b[a]));break;case 130:this.$=d.addLocationDataFn(g[a-8],g[a])(new d.ImportDeclaration(new d.ImportClause(b[a-7],new d.ImportSpecifierList(b[a-4])),b[a]));break;case 134:case 154:case 170:case 186:this.$=d.addLocationDataFn(g[a-3],g[a])(b[a-2]);break;case 136:this.$=\nd.addLocationDataFn(g[a],g[a])(new d.ImportSpecifier(b[a]));break;case 137:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.ImportSpecifier(b[a-2],b[a]));break;case 138:this.$=d.addLocationDataFn(g[a],g[a])(new d.ImportSpecifier(new d.Literal(b[a])));break;case 139:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.ImportSpecifier(new d.Literal(b[a-2]),b[a]));break;case 140:this.$=d.addLocationDataFn(g[a],g[a])(new d.ImportDefaultSpecifier(b[a]));break;case 141:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.ImportNamespaceSpecifier(new d.Literal(b[a-\n2]),b[a]));break;case 142:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.ExportNamedDeclaration(new d.ExportSpecifierList([])));break;case 143:this.$=d.addLocationDataFn(g[a-4],g[a])(new d.ExportNamedDeclaration(new d.ExportSpecifierList(b[a-2])));break;case 144:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.ExportNamedDeclaration(b[a]));break;case 145:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.ExportNamedDeclaration(new d.Assign(b[a-2],b[a],null,{moduleDeclaration:\"export\"})));break;case 146:this.$=\nd.addLocationDataFn(g[a-4],g[a])(new d.ExportNamedDeclaration(new d.Assign(b[a-3],b[a],null,{moduleDeclaration:\"export\"})));break;case 147:this.$=d.addLocationDataFn(g[a-5],g[a])(new d.ExportNamedDeclaration(new d.Assign(b[a-4],b[a-1],null,{moduleDeclaration:\"export\"})));break;case 148:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.ExportDefaultDeclaration(b[a]));break;case 149:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.ExportAllDeclaration(new d.Literal(b[a-2]),b[a]));break;case 150:this.$=d.addLocationDataFn(g[a-\n6],g[a])(new d.ExportNamedDeclaration(new d.ExportSpecifierList(b[a-4]),b[a]));break;case 156:this.$=d.addLocationDataFn(g[a],g[a])(new d.ExportSpecifier(b[a]));break;case 157:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.ExportSpecifier(b[a-2],b[a]));break;case 158:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.ExportSpecifier(b[a-2],new d.Literal(b[a])));break;case 159:this.$=d.addLocationDataFn(g[a],g[a])(new d.ExportSpecifier(new d.Literal(b[a])));break;case 160:this.$=d.addLocationDataFn(g[a-\n2],g[a])(new d.ExportSpecifier(new d.Literal(b[a-2]),b[a]));break;case 161:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.TaggedTemplateCall(b[a-2],b[a],b[a-1]));break;case 162:case 163:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Call(b[a-2],b[a],b[a-1]));break;case 165:this.$=d.addLocationDataFn(g[a],g[a])(new d.SuperCall);break;case 166:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.SuperCall(b[a]));break;case 167:this.$=d.addLocationDataFn(g[a],g[a])(!1);break;case 168:this.$=d.addLocationDataFn(g[a],\ng[a])(!0);break;case 169:this.$=d.addLocationDataFn(g[a-1],g[a])([]);break;case 171:case 172:this.$=d.addLocationDataFn(g[a],g[a])(new d.Value(new d.ThisLiteral));break;case 173:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Value(d.addLocationDataFn(g[a-1])(new d.ThisLiteral),[d.addLocationDataFn(g[a])(new d.Access(b[a]))],\"this\"));break;case 174:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Arr([]));break;case 175:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.Arr(b[a-2]));break;case 176:this.$=d.addLocationDataFn(g[a],\ng[a])(\"inclusive\");break;case 177:this.$=d.addLocationDataFn(g[a],g[a])(\"exclusive\");break;case 178:this.$=d.addLocationDataFn(g[a-4],g[a])(new d.Range(b[a-3],b[a-1],b[a-2]));break;case 179:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Range(b[a-2],b[a],b[a-1]));break;case 180:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Range(b[a-1],null,b[a]));break;case 181:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Range(null,b[a],b[a-1]));break;case 182:this.$=d.addLocationDataFn(g[a],g[a])(new d.Range(null,\nnull,b[a]));break;case 192:this.$=d.addLocationDataFn(g[a-2],g[a])([].concat(b[a-2],b[a]));break;case 193:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Try(b[a]));break;case 194:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Try(b[a-1],b[a][0],b[a][1]));break;case 195:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.Try(b[a-2],null,null,b[a]));break;case 196:this.$=d.addLocationDataFn(g[a-4],g[a])(new d.Try(b[a-3],b[a-2][0],b[a-2][1],b[a]));break;case 197:this.$=d.addLocationDataFn(g[a-2],g[a])([b[a-\n1],b[a]]);break;case 198:this.$=d.addLocationDataFn(g[a-2],g[a])([d.addLocationDataFn(g[a-1])(new d.Value(b[a-1])),b[a]]);break;case 199:this.$=d.addLocationDataFn(g[a-1],g[a])([null,b[a]]);break;case 200:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Throw(b[a]));break;case 201:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Parens(b[a-1]));break;case 202:this.$=d.addLocationDataFn(g[a-4],g[a])(new d.Parens(b[a-2]));break;case 203:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.While(b[a]));break;case 204:this.$=\nd.addLocationDataFn(g[a-3],g[a])(new d.While(b[a-2],{guard:b[a]}));break;case 205:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.While(b[a],{invert:!0}));break;case 206:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.While(b[a-2],{invert:!0,guard:b[a]}));break;case 207:this.$=d.addLocationDataFn(g[a-1],g[a])(b[a-1].addBody(b[a]));break;case 208:case 209:this.$=d.addLocationDataFn(g[a-1],g[a])(b[a].addBody(d.addLocationDataFn(g[a-1])(d.Block.wrap([b[a-1]]))));break;case 210:this.$=d.addLocationDataFn(g[a],\ng[a])(b[a]);break;case 211:this.$=d.addLocationDataFn(g[a-1],g[a])((new d.While(d.addLocationDataFn(g[a-1])(new d.BooleanLiteral(\"true\")))).addBody(b[a]));break;case 212:this.$=d.addLocationDataFn(g[a-1],g[a])((new d.While(d.addLocationDataFn(g[a-1])(new d.BooleanLiteral(\"true\")))).addBody(d.addLocationDataFn(g[a])(d.Block.wrap([b[a]]))));break;case 213:case 214:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.For(b[a-1],b[a]));break;case 215:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.For(b[a],b[a-\n1]));break;case 216:this.$=d.addLocationDataFn(g[a-1],g[a])({source:d.addLocationDataFn(g[a])(new d.Value(b[a]))});break;case 217:this.$=d.addLocationDataFn(g[a-3],g[a])({source:d.addLocationDataFn(g[a-2])(new d.Value(b[a-2])),step:b[a]});break;case 218:d=d.addLocationDataFn(g[a-1],g[a]);b[a].own=b[a-1].own;b[a].ownTag=b[a-1].ownTag;b[a].name=b[a-1][0];b[a].index=b[a-1][1];this.$=d(b[a]);break;case 219:this.$=d.addLocationDataFn(g[a-1],g[a])(b[a]);break;case 220:Ca=d.addLocationDataFn(g[a-2],g[a]);\nb[a].own=!0;b[a].ownTag=d.addLocationDataFn(g[a-1])(new d.Literal(b[a-1]));this.$=Ca(b[a]);break;case 226:this.$=d.addLocationDataFn(g[a-2],g[a])([b[a-2],b[a]]);break;case 227:this.$=d.addLocationDataFn(g[a-1],g[a])({source:b[a]});break;case 228:this.$=d.addLocationDataFn(g[a-1],g[a])({source:b[a],object:!0});break;case 229:this.$=d.addLocationDataFn(g[a-3],g[a])({source:b[a-2],guard:b[a]});break;case 230:this.$=d.addLocationDataFn(g[a-3],g[a])({source:b[a-2],guard:b[a],object:!0});break;case 231:this.$=\nd.addLocationDataFn(g[a-3],g[a])({source:b[a-2],step:b[a]});break;case 232:this.$=d.addLocationDataFn(g[a-5],g[a])({source:b[a-4],guard:b[a-2],step:b[a]});break;case 233:this.$=d.addLocationDataFn(g[a-5],g[a])({source:b[a-4],step:b[a-2],guard:b[a]});break;case 234:this.$=d.addLocationDataFn(g[a-1],g[a])({source:b[a],from:!0});break;case 235:this.$=d.addLocationDataFn(g[a-3],g[a])({source:b[a-2],guard:b[a],from:!0});break;case 236:this.$=d.addLocationDataFn(g[a-4],g[a])(new d.Switch(b[a-3],b[a-1]));\nbreak;case 237:this.$=d.addLocationDataFn(g[a-6],g[a])(new d.Switch(b[a-5],b[a-3],b[a-1]));break;case 238:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.Switch(null,b[a-1]));break;case 239:this.$=d.addLocationDataFn(g[a-5],g[a])(new d.Switch(null,b[a-3],b[a-1]));break;case 241:this.$=d.addLocationDataFn(g[a-1],g[a])(b[a-1].concat(b[a]));break;case 242:this.$=d.addLocationDataFn(g[a-2],g[a])([[b[a-1],b[a]]]);break;case 243:this.$=d.addLocationDataFn(g[a-3],g[a])([[b[a-2],b[a-1]]]);break;case 244:this.$=\nd.addLocationDataFn(g[a-2],g[a])(new d.If(b[a-1],b[a],{type:b[a-2]}));break;case 245:this.$=d.addLocationDataFn(g[a-4],g[a])(b[a-4].addElse(d.addLocationDataFn(g[a-2],g[a])(new d.If(b[a-1],b[a],{type:b[a-2]}))));break;case 247:this.$=d.addLocationDataFn(g[a-2],g[a])(b[a-2].addElse(b[a]));break;case 248:case 249:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.If(b[a],d.addLocationDataFn(g[a-2])(d.Block.wrap([b[a-2]])),{type:b[a-1],statement:!0}));break;case 252:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Op(\"-\",\nb[a]));break;case 253:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Op(\"+\",b[a]));break;case 254:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Op(\"--\",b[a]));break;case 255:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Op(\"++\",b[a]));break;case 256:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Op(\"--\",b[a-1],null,!0));break;case 257:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Op(\"++\",b[a-1],null,!0));break;case 258:this.$=d.addLocationDataFn(g[a-1],g[a])(new d.Existence(b[a-1]));break;case 259:this.$=\nd.addLocationDataFn(g[a-2],g[a])(new d.Op(\"+\",b[a-2],b[a]));break;case 260:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Op(\"-\",b[a-2],b[a]));break;case 261:case 262:case 263:case 264:case 265:case 266:case 267:case 268:case 269:case 270:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Op(b[a-1],b[a-2],b[a]));break;case 271:g=d.addLocationDataFn(g[a-2],g[a]);b=\"!\"===b[a-1].charAt(0)?(new d.Op(b[a-1].slice(1),b[a-2],b[a])).invert():new d.Op(b[a-1],b[a-2],b[a]);this.$=g(b);break;case 272:this.$=d.addLocationDataFn(g[a-\n2],g[a])(new d.Assign(b[a-2],b[a],b[a-1]));break;case 273:this.$=d.addLocationDataFn(g[a-4],g[a])(new d.Assign(b[a-4],b[a-1],b[a-3]));break;case 274:this.$=d.addLocationDataFn(g[a-3],g[a])(new d.Assign(b[a-3],b[a],b[a-2]));break;case 275:this.$=d.addLocationDataFn(g[a-2],g[a])(new d.Extends(b[a-2],b[a]))}},table:[{1:[2,1],3:1,4:2,5:3,7:4,8:5,9:6,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:u,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,\n44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{1:[3]},{1:[2,2],6:ra},a(ta,[2,3]),a(ta,[2,6],{141:77,132:102,138:103,133:D,135:A,139:E,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(ta,\n[2,7],{141:77,132:105,138:106,133:D,135:A,139:E,156:ya}),a(ta,[2,8]),a(na,[2,14],{109:107,78:108,86:114,40:Da,41:Da,114:Da,82:va,83:xa,84:Ha,85:Ka,87:Fa,90:Ra,113:La}),a(na,[2,15],{86:114,109:117,78:118,82:va,83:xa,84:Ha,85:Ka,87:Fa,90:Ra,113:La,114:Da}),a(na,[2,16]),a(na,[2,17]),a(na,[2,18]),a(na,[2,19]),a(na,[2,20]),a(na,[2,21]),a(na,[2,22]),a(na,[2,23]),a(na,[2,24]),a(na,[2,25]),a(na,[2,26]),a(Ga,[2,9]),a(Ga,[2,10]),a(Ga,[2,11]),a(Ga,[2,12]),a(Ga,[2,13]),a([1,6,32,42,131,133,135,139,156,163,164,\n165,166,167,168,169,170,171,172,173,174],Wa,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,7:120,8:122,12:b,28:da,29:Za,34:f,38:k,40:t,41:p,44:z,45:I,48:J,49:F,50:N,51:y,52:G,53:O,61:[1,119],63:B,64:n,68:c,69:w,92:q,95:h,97:K,105:P,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,137:r,149:aa,155:ba,157:C,158:S,159:v,160:X,161:R,\n162:M}),a(Ea,Ia,{55:[1,124]}),a(Ea,[2,96]),a(Ea,[2,97]),a(Ea,[2,98]),a(Ea,[2,99]),a(m,[2,164]),a([6,31,66,71],l,{65:125,72:126,73:127,33:129,60:130,75:131,62:132,34:f,74:d,92:q,118:Ca,119:Ja}),{30:135,31:ua},{7:137,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,\n95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:138,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,\n117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:139,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,\n130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:140,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,\n137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{15:142,16:143,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:144,60:71,62:54,75:53,77:141,79:28,80:29,81:30,92:q,111:31,112:L,117:U,118:W,119:H,130:V},{15:142,16:143,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:144,60:71,62:54,75:53,77:145,79:28,80:29,81:30,92:q,111:31,112:L,117:U,118:W,119:H,130:V},a(Na,wa,{96:[1,149],161:[1,\n146],162:[1,147],175:[1,148]}),a(na,[2,246],{151:[1,150]}),{30:151,31:ua},{30:152,31:ua},a(na,[2,210]),{30:153,31:ua},{7:154,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,31:[1,155],33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,\n135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(Gb,[2,116],{47:27,79:28,80:29,81:30,111:31,75:53,62:54,37:55,43:57,33:70,60:71,39:80,15:142,16:143,54:144,30:156,77:158,31:ua,34:f,38:k,40:t,41:p,44:z,45:I,48:J,49:F,50:N,51:y,52:G,53:O,92:q,96:[1,157],112:L,117:U,118:W,119:H,130:V}),{7:159,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,\n45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(Ga,$a,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,\n43:57,33:70,60:71,141:77,39:80,8:122,7:160,12:b,28:da,31:Hb,34:f,38:k,40:t,41:p,44:z,45:I,48:J,49:F,50:N,51:y,52:G,53:O,61:Q,63:B,64:n,68:c,69:w,92:q,95:h,97:K,105:P,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,137:r,149:aa,155:ba,157:C,158:S,159:v,160:X,161:R,162:M}),a([1,6,31,32,42,71,94,131,133,135,139,156],[2,67]),{33:166,34:f,39:162,40:t,41:p,92:[1,165],98:163,99:164,104:Ib},{25:169,33:170,34:f,92:[1,168],95:h,103:[1,171],107:[1,172]},a(Na,[2,93]),a(Na,[2,94]),a(Ea,[2,40]),a(Ea,[2,41]),a(Ea,[2,\n42]),a(Ea,[2,43]),a(Ea,[2,44]),a(Ea,[2,45]),a(Ea,[2,46]),a(Ea,[2,47]),{4:173,5:3,7:4,8:5,9:6,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:u,31:[1,174],33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,\n149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:175,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,31:ab,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,74:Va,75:53,76:180,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,116:177,117:U,118:W,119:H,120:Jb,123:178,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,\n139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(Ea,[2,171]),a(Ea,[2,172],{35:182,36:Qa}),a([1,6,31,32,42,46,66,71,74,82,83,84,85,87,89,90,94,113,115,120,122,131,133,134,135,139,140,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],[2,165],{110:184,114:ub}),{31:[2,70]},{31:[2,71]},a(Oa,[2,88]),a(Oa,[2,91]),{7:186,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,\n43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:187,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,\n50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:188,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,\n61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:190,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,30:189,31:ua,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,\n64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{33:195,34:f,60:196,62:198,75:197,80:191,92:q,118:Ca,119:H,143:192,144:[1,193],145:194},{142:199,146:[1,200],147:[1,201],148:[1,202]},a([6,31,71,94],Kb,{39:80,93:203,56:204,57:205,59:206,11:207,37:208,33:209,35:210,60:211,34:f,36:Qa,38:k,40:t,41:p,63:B,118:Ca}),a(Lb,[2,\n34]),a(Lb,[2,35]),a(Ea,[2,38]),{15:142,16:212,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:144,60:71,62:54,75:53,77:213,79:28,80:29,81:30,92:q,111:31,112:L,117:U,118:W,119:H,130:V},a([1,6,29,31,32,40,41,42,55,58,66,71,74,82,83,84,85,87,89,90,94,96,102,113,114,115,120,122,131,133,134,135,139,140,146,147,148,156,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175],[2,32]),a(Mb,[2,36]),{4:214,5:3,7:4,8:5,9:6,10:20,11:21,12:b,13:23,14:24,\n15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:u,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(ta,[2,5],{7:4,8:5,9:6,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,\n24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,5:215,12:b,28:u,34:f,38:k,40:t,41:p,44:z,45:I,48:J,49:F,50:N,51:y,52:G,53:O,61:Q,63:B,64:n,68:c,69:w,92:q,95:h,97:K,105:P,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,133:D,135:A,137:r,139:E,149:aa,155:ba,157:C,158:S,159:v,160:X,161:R,162:M}),a(na,[2,258]),{7:216,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,\n21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:217,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,\n26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:218,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,\n37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:219,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,\n44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:220,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,\n51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:221,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,\n62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:222,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,\n75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:223,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,\n92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:224,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,\n117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:225,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,\n130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:226,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,\n137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:227,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,\n154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:228,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,\n160:X,161:R,162:M},{7:229,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(na,[2,209]),\na(na,[2,214]),{7:230,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(na,[2,208]),a(na,\n[2,213]),{39:231,40:t,41:p,110:232,114:ub},a(Oa,[2,89]),a(Nb,[2,168]),{35:233,36:Qa},{35:234,36:Qa},a(Oa,[2,104],{35:235,36:Qa}),{35:236,36:Qa},a(Oa,[2,105]),{7:238,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,74:Ob,75:53,77:40,79:28,80:29,81:30,88:237,91:239,92:q,95:h,97:K,105:P,111:31,112:L,\n117:U,118:W,119:H,121:240,122:vb,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{86:243,87:Fa,90:Ra},{110:244,114:ub},a(Oa,[2,90]),a(ta,[2,66],{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,8:122,7:245,12:b,28:da,31:Hb,34:f,38:k,40:t,41:p,44:z,\n45:I,48:J,49:F,50:N,51:y,52:G,53:O,61:Q,63:B,64:n,68:c,69:w,92:q,95:h,97:K,105:P,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,133:$a,135:$a,139:$a,156:$a,137:r,149:aa,155:ba,157:C,158:S,159:v,160:X,161:R,162:M}),a(Pa,[2,28],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),{7:246,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,\n43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{132:105,133:D,135:A,138:106,139:E,141:77,156:ya},a([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,163,164,165,166,167,168,169,170,171,172,173,174],Wa,{15:7,16:8,17:9,18:10,\n19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,7:120,8:122,12:b,28:da,29:Za,34:f,38:k,40:t,41:p,44:z,45:I,48:J,49:F,50:N,51:y,52:G,53:O,61:Q,63:B,64:n,68:c,69:w,92:q,95:h,97:K,105:P,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,137:r,149:aa,155:ba,157:C,158:S,159:v,160:X,161:R,162:M}),{6:[1,248],7:247,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,\n17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,31:[1,249],33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a([6,31],Ma,{70:252,66:[1,250],71:Pb}),a(Ua,[2,75]),a(Ua,[2,79],{55:[1,\n254],74:[1,253]}),a(Ua,[2,82]),a(hb,[2,83]),a(hb,[2,84]),a(hb,[2,85]),a(hb,[2,86]),{35:182,36:Qa},{7:255,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,31:ab,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,74:Va,75:53,76:180,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,116:177,117:U,118:W,119:H,120:Jb,123:178,125:Z,129:T,130:V,\n132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(na,[2,69]),{4:257,5:3,7:4,8:5,9:6,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:u,32:[1,256],33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,\n132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,159,160,164,165,166,167,168,169,170,171,172,173,174],[2,250],{141:77,132:102,138:103,163:ea}),a(bb,[2,251],{141:77,132:102,138:103,163:ea,165:fa}),a(bb,[2,252],{141:77,132:102,138:103,163:ea,165:fa}),a(bb,[2,253],{141:77,132:102,138:103,163:ea,165:fa}),a(na,[2,254],{40:wa,41:wa,82:wa,83:wa,84:wa,85:wa,87:wa,90:wa,113:wa,\n114:wa}),a(Nb,Da,{109:107,78:108,86:114,82:va,83:xa,84:Ha,85:Ka,87:Fa,90:Ra,113:La}),{78:118,82:va,83:xa,84:Ha,85:Ka,86:114,87:Fa,90:Ra,109:117,113:La,114:Da},a(Qb,Ia),a(na,[2,255],{40:wa,41:wa,82:wa,83:wa,84:wa,85:wa,87:wa,90:wa,113:wa,114:wa}),a(na,[2,256]),a(na,[2,257]),{6:[1,260],7:258,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,31:[1,259],33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,\n53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:261,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,\n64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{30:262,31:ua,155:[1,263]},a(na,[2,193],{126:264,127:[1,265],128:[1,266]}),a(na,[2,207]),a(na,[2,215]),{31:[1,267],132:102,133:D,135:A,138:103,139:E,141:77,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca},{150:268,\n152:269,153:ib},a(na,[2,117]),{7:271,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},\na(Gb,[2,120],{30:272,31:ua,40:wa,41:wa,82:wa,83:wa,84:wa,85:wa,87:wa,90:wa,113:wa,114:wa,96:[1,273]}),a(Pa,[2,200],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Ga,cb,{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),{62:274,92:q},a(Ga,[2,124]),{29:[1,275],71:[1,276]},{29:[1,277]},{31:jb,33:282,34:f,94:[1,278],100:279,101:280,103:Xa},a([29,71],[2,\n140]),{102:[1,284]},{31:wb,33:289,34:f,94:[1,285],103:db,106:286,108:287},a(Ga,[2,144]),{55:[1,291]},{7:292,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,\n139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{29:[1,293]},{6:ra,131:[1,294]},{4:295,5:3,7:4,8:5,9:6,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:u,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,\n138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a([6,31,71,120],Rb,{141:77,132:102,138:103,121:296,74:[1,297],122:vb,133:D,135:A,139:E,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(xb,[2,174]),a([6,31,120],Ma,{70:298,71:kb}),a(Sa,[2,183]),{7:255,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,31:ab,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,\n44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,74:Va,75:53,76:180,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,116:300,117:U,118:W,119:H,123:178,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(Sa,[2,189]),a(Sa,[2,190]),a(Sb,[2,173]),a(Sb,[2,33]),a(m,[2,166]),{7:255,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,\n25:17,26:18,27:19,28:da,31:ab,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,74:Va,75:53,76:180,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,115:[1,301],116:302,117:U,118:W,119:H,123:178,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{30:303,31:ua,132:102,133:D,135:A,138:103,139:E,141:77,156:Aa,159:ma,160:Y,163:ea,\n164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca},a(Tb,[2,203],{141:77,132:102,138:103,133:D,134:[1,304],135:A,139:E,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Tb,[2,205],{141:77,132:102,138:103,133:D,134:[1,305],135:A,139:E,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(na,[2,211]),a(Ya,[2,212],{141:77,132:102,138:103,133:D,135:A,139:E,159:ma,160:Y,163:ea,164:ia,\n165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,156,159,160,163,164,165,166,167,168,169,170,171,172,173,174],[2,216],{140:[1,306]}),a(lb,[2,219]),{33:195,34:f,60:196,62:198,75:197,92:q,118:Ca,119:Ja,143:307,145:194},a(lb,[2,225],{71:[1,308]}),a(mb,[2,221]),a(mb,[2,222]),a(mb,[2,223]),a(mb,[2,224]),a(na,[2,218]),{7:309,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,\n26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:310,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,\n37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:311,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,\n44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(nb,Ma,{70:312,71:Ub}),a(Ba,[2,112]),a(Ba,[2,51],{58:[1,314]}),a(Vb,[2,60],{55:[1,315]}),a(Ba,[2,56]),a(Vb,[2,61]),a(yb,[2,57]),a(yb,[2,58]),a(yb,[2,59]),{46:[1,316],78:118,82:va,83:xa,84:Ha,85:Ka,\n86:114,87:Fa,90:Ra,109:117,113:La,114:Da},a(Qb,wa),{6:ra,42:[1,317]},a(ta,[2,4]),a(Wb,[2,259],{141:77,132:102,138:103,163:ea,164:ia,165:fa}),a(Wb,[2,260],{141:77,132:102,138:103,163:ea,164:ia,165:fa}),a(bb,[2,261],{141:77,132:102,138:103,163:ea,165:fa}),a(bb,[2,262],{141:77,132:102,138:103,163:ea,165:fa}),a([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,166,167,168,169,170,171,172,173,174],[2,263],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa}),a([1,6,31,32,42,66,\n71,74,89,94,115,120,122,131,133,134,135,139,140,156,167,168,169,170,171,172,173],[2,264],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,174:ca}),a([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,168,169,170,171,172,173],[2,265],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,174:ca}),a([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,169,170,171,172,173],[2,266],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,\n166:ja,167:la,168:pa,174:ca}),a([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,170,171,172,173],[2,267],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,174:ca}),a([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,171,172,173],[2,268],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,174:ca}),a([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,172,173],[2,269],\n{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,174:ca}),a([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,173],[2,270],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,174:ca}),a([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,140,156,167,168,169,170,171,172,173,174],[2,271],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja}),a(Ya,[2,249],\n{141:77,132:102,138:103,133:D,135:A,139:E,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Ya,[2,248],{141:77,132:102,138:103,133:D,135:A,139:E,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(m,[2,161]),a(m,[2,162]),a(Oa,[2,100]),a(Oa,[2,101]),a(Oa,[2,102]),a(Oa,[2,103]),{89:[1,318]},{74:Ob,89:[2,108],121:319,122:vb,132:102,133:D,135:A,138:103,139:E,141:77,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,\n166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca},{89:[2,109]},{7:320,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,89:[2,182],92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,\n149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(Xb,[2,176]),a(Xb,Yb),a(Oa,[2,107]),a(m,[2,163]),a(ta,[2,65],{141:77,132:102,138:103,133:cb,135:cb,139:cb,156:cb,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Pa,[2,29],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Pa,[2,48],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,\n170:ha,171:ka,172:oa,173:sa,174:ca}),{7:321,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,\n162:M},{7:322,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{67:323,68:c,69:w},a(Ta,\neb,{73:127,33:129,60:130,75:131,62:132,72:324,34:f,74:d,92:q,118:Ca,119:Ja}),{6:Zb,31:$b},a(Ua,[2,80]),{7:327,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,\n139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(Sa,Rb,{141:77,132:102,138:103,74:[1,328],133:D,135:A,139:E,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(ac,[2,30]),{6:ra,32:[1,329]},a(Pa,[2,272],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),{7:330,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,\n25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:331,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,\n34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(Pa,[2,275],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(na,[2,247]),{7:332,8:122,\n10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(na,[2,194],{127:[1,333]}),{30:334,31:ua},\n{30:337,31:ua,33:335,34:f,62:336,92:q},{150:338,152:269,153:ib},{32:[1,339],151:[1,340],152:341,153:ib},a(ob,[2,240]),{7:343,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,124:342,125:Z,129:T,130:V,132:43,133:D,\n135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(bc,[2,118],{141:77,132:102,138:103,30:344,31:ua,133:D,135:A,139:E,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(na,[2,121]),{7:345,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,\n61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{32:[1,346]},{39:347,40:t,41:p},{92:[1,349],99:348,104:Ib},{39:350,40:t,41:p},{29:[1,351]},a(nb,Ma,{70:352,71:pb}),a(Ba,[2,131]),{31:jb,33:282,34:f,100:354,101:280,103:Xa},a(Ba,[2,136],{102:[1,355]}),a(Ba,[2,138],{102:[1,356]}),{33:357,34:f},a(Ga,[2,142]),\na(nb,Ma,{70:358,71:zb}),a(Ba,[2,151]),{31:wb,33:289,34:f,103:db,106:360,108:287},a(Ba,[2,156],{102:[1,361]}),a(Ba,[2,159],{102:[1,362]}),{6:[1,364],7:363,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,31:[1,365],33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,\n125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(Ab,[2,148],{141:77,132:102,138:103,133:D,135:A,139:E,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),{39:366,40:t,41:p},a(Ea,[2,201]),{6:ra,32:[1,367]},{7:368,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,\n45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a([12,28,34,38,40,41,44,45,48,49,50,51,52,53,61,63,64,68,69,92,95,97,105,112,117,118,119,125,129,130,133,135,137,139,149,155,157,158,159,160,161,162],Yb,{6:fb,31:fb,71:fb,120:fb}),{6:qb,31:rb,120:[1,369]},\na([6,31,32,115,120],eb,{15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,10:20,11:21,13:23,14:24,54:26,47:27,79:28,80:29,81:30,111:31,67:33,77:40,154:41,132:43,136:44,138:45,75:53,62:54,37:55,43:57,33:70,60:71,141:77,39:80,8:122,76:180,7:255,123:372,12:b,28:da,34:f,38:k,40:t,41:p,44:z,45:I,48:J,49:F,50:N,51:y,52:G,53:O,61:Q,63:B,64:n,68:c,69:w,74:Va,92:q,95:h,97:K,105:P,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,133:D,135:A,137:r,139:E,149:aa,155:ba,157:C,158:S,159:v,160:X,\n161:R,162:M}),a(Ta,Ma,{70:373,71:kb}),a(m,[2,169]),a([6,31,115],Ma,{70:374,71:kb}),a(cc,[2,244]),{7:375,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,\n141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:376,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,\n158:S,159:v,160:X,161:R,162:M},{7:377,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},\na(lb,[2,220]),{33:195,34:f,60:196,62:198,75:197,92:q,118:Ca,119:Ja,145:378},a([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,135,139,156],[2,227],{141:77,132:102,138:103,134:[1,379],140:[1,380],159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Bb,[2,228],{141:77,132:102,138:103,134:[1,381],159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Bb,[2,234],{141:77,132:102,138:103,134:[1,382],159:ma,160:Y,\n163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),{6:dc,31:ec,94:[1,383]},a(Cb,eb,{39:80,57:205,59:206,11:207,37:208,33:209,35:210,60:211,56:386,34:f,36:Qa,38:k,40:t,41:p,63:B,118:Ca}),{7:387,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,31:[1,388],33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,\n79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:389,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,31:[1,390],33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,\n92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(Ea,[2,39]),a(Mb,[2,37]),a(Oa,[2,106]),{7:391,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,\n81:30,89:[2,180],92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{89:[2,181],132:102,133:D,135:A,138:103,139:E,141:77,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca},a(Pa,[2,49],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),{32:[1,392],\n132:102,133:D,135:A,138:103,139:E,141:77,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca},{30:393,31:ua},a(Ua,[2,76]),{33:129,34:f,60:130,62:132,72:394,73:127,74:d,75:131,92:q,118:Ca,119:Ja},a(fc,l,{72:126,73:127,33:129,60:130,75:131,62:132,65:395,34:f,74:d,92:q,118:Ca,119:Ja}),a(Ua,[2,81],{141:77,132:102,138:103,133:D,135:A,139:E,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Sa,fb),\na(ac,[2,31]),{32:[1,396],132:102,133:D,135:A,138:103,139:E,141:77,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca},a(Pa,[2,274],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),{30:397,31:ua,132:102,133:D,135:A,138:103,139:E,141:77,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca},{30:398,31:ua},a(na,[2,195]),{30:399,\n31:ua},{30:400,31:ua},a(Db,[2,199]),{32:[1,401],151:[1,402],152:341,153:ib},a(na,[2,238]),{30:403,31:ua},a(ob,[2,241]),{30:404,31:ua,71:[1,405]},a(gc,[2,191],{141:77,132:102,138:103,133:D,135:A,139:E,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(na,[2,119]),a(bc,[2,122],{141:77,132:102,138:103,30:406,31:ua,133:D,135:A,139:E,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Ga,[2,63]),a(Ga,\n[2,125]),{29:[1,407]},{31:jb,33:282,34:f,100:408,101:280,103:Xa},a(Ga,[2,126]),{39:409,40:t,41:p},{6:sb,31:tb,94:[1,410]},a(Cb,eb,{33:282,101:413,34:f,103:Xa}),a(Ta,Ma,{70:414,71:pb}),{33:415,34:f},{33:416,34:f},{29:[2,141]},{6:Eb,31:Fb,94:[1,417]},a(Cb,eb,{33:289,108:420,34:f,103:db}),a(Ta,Ma,{70:421,71:zb}),{33:422,34:f,103:[1,423]},{33:424,34:f},a(Ab,[2,145],{141:77,132:102,138:103,133:D,135:A,139:E,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),\n{7:425,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:426,8:122,10:20,11:21,12:b,\n13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(Ga,[2,149]),{131:[1,427]},{120:[1,428],132:102,133:D,135:A,\n138:103,139:E,141:77,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca},a(xb,[2,175]),{7:255,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,74:Va,75:53,76:180,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,123:429,\n125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:255,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,31:ab,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,74:Va,75:53,76:180,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,116:430,117:U,118:W,119:H,123:178,\n125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(Sa,[2,184]),{6:qb,31:rb,32:[1,431]},{6:qb,31:rb,115:[1,432]},a(Ya,[2,204],{141:77,132:102,138:103,133:D,135:A,139:E,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Ya,[2,206],{141:77,132:102,138:103,133:D,135:A,139:E,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Ya,\n[2,217],{141:77,132:102,138:103,133:D,135:A,139:E,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(lb,[2,226]),{7:433,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,\n119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:434,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,\n133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:435,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,\n139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:436,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,\n157:C,158:S,159:v,160:X,161:R,162:M},a(xb,[2,110]),{11:207,33:209,34:f,35:210,36:Qa,37:208,38:k,39:80,40:t,41:p,56:437,57:205,59:206,60:211,63:B,118:Ca},a(fc,Kb,{39:80,56:204,57:205,59:206,11:207,37:208,33:209,35:210,60:211,93:438,34:f,36:Qa,38:k,40:t,41:p,63:B,118:Ca}),a(Ba,[2,113]),a(Ba,[2,52],{141:77,132:102,138:103,133:D,135:A,139:E,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),{7:439,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,\n18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(Ba,[2,54],{141:77,132:102,138:103,133:D,135:A,139:E,156:Aa,159:ma,160:Y,163:ea,164:ia,\n165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),{7:440,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,\n157:C,158:S,159:v,160:X,161:R,162:M},{89:[2,179],132:102,133:D,135:A,138:103,139:E,141:77,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca},a(na,[2,50]),a(na,[2,68]),a(Ua,[2,77]),a(Ta,Ma,{70:441,71:Pb}),a(na,[2,273]),a(cc,[2,245]),a(na,[2,196]),a(Db,[2,197]),a(Db,[2,198]),a(na,[2,236]),{30:442,31:ua},{32:[1,443]},a(ob,[2,242],{6:[1,444]}),{7:445,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,\n26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,161:R,162:M},a(na,[2,123]),{39:446,40:t,41:p},a(nb,Ma,{70:447,71:pb}),a(Ga,[2,127]),{29:[1,448]},{33:282,34:f,101:449,103:Xa},{31:jb,33:282,34:f,100:450,\n101:280,103:Xa},a(Ba,[2,132]),{6:sb,31:tb,32:[1,451]},a(Ba,[2,137]),a(Ba,[2,139]),a(Ga,[2,143],{29:[1,452]}),{33:289,34:f,103:db,108:453},{31:wb,33:289,34:f,103:db,106:454,108:287},a(Ba,[2,152]),{6:Eb,31:Fb,32:[1,455]},a(Ba,[2,157]),a(Ba,[2,158]),a(Ba,[2,160]),a(Ab,[2,146],{141:77,132:102,138:103,133:D,135:A,139:E,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),{32:[1,456],132:102,133:D,135:A,138:103,139:E,141:77,156:Aa,159:ma,160:Y,163:ea,164:ia,\n165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca},a(Ea,[2,202]),a(Ea,[2,178]),a(Sa,[2,185]),a(Ta,Ma,{70:457,71:kb}),a(Sa,[2,186]),a(m,[2,170]),a([1,6,31,32,42,66,71,74,89,94,115,120,122,131,133,134,135,139,156],[2,229],{141:77,132:102,138:103,140:[1,458],159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Bb,[2,231],{141:77,132:102,138:103,134:[1,459],159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,\n173:sa,174:ca}),a(Pa,[2,230],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Pa,[2,235],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Ba,[2,114]),a(Ta,Ma,{70:460,71:Ub}),{32:[1,461],132:102,133:D,135:A,138:103,139:E,141:77,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca},{32:[1,462],132:102,\n133:D,135:A,138:103,139:E,141:77,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca},{6:Zb,31:$b,32:[1,463]},{32:[1,464]},a(na,[2,239]),a(ob,[2,243]),a(gc,[2,192],{141:77,132:102,138:103,133:D,135:A,139:E,156:Aa,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Ga,[2,129]),{6:sb,31:tb,94:[1,465]},{39:466,40:t,41:p},a(Ba,[2,133]),a(Ta,Ma,{70:467,71:pb}),a(Ba,[2,134]),{39:468,40:t,41:p},a(Ba,[2,153]),\na(Ta,Ma,{70:469,71:zb}),a(Ba,[2,154]),a(Ga,[2,147]),{6:qb,31:rb,32:[1,470]},{7:471,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,\n155:ba,157:C,158:S,159:v,160:X,161:R,162:M},{7:472,8:122,10:20,11:21,12:b,13:23,14:24,15:7,16:8,17:9,18:10,19:11,20:12,21:13,22:14,23:15,24:16,25:17,26:18,27:19,28:da,33:70,34:f,37:55,38:k,39:80,40:t,41:p,43:57,44:z,45:I,47:27,48:J,49:F,50:N,51:y,52:G,53:O,54:26,60:71,61:Q,62:54,63:B,64:n,67:33,68:c,69:w,75:53,77:40,79:28,80:29,81:30,92:q,95:h,97:K,105:P,111:31,112:L,117:U,118:W,119:H,125:Z,129:T,130:V,132:43,133:D,135:A,136:44,137:r,138:45,139:E,141:77,149:aa,154:41,155:ba,157:C,158:S,159:v,160:X,\n161:R,162:M},{6:dc,31:ec,32:[1,473]},a(Ba,[2,53]),a(Ba,[2,55]),a(Ua,[2,78]),a(na,[2,237]),{29:[1,474]},a(Ga,[2,128]),{6:sb,31:tb,32:[1,475]},a(Ga,[2,150]),{6:Eb,31:Fb,32:[1,476]},a(Sa,[2,187]),a(Pa,[2,232],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Pa,[2,233],{141:77,132:102,138:103,159:ma,160:Y,163:ea,164:ia,165:fa,166:ja,167:la,168:pa,169:qa,170:ha,171:ka,172:oa,173:sa,174:ca}),a(Ba,[2,115]),{39:477,40:t,41:p},a(Ba,\n[2,135]),a(Ba,[2,155]),a(Ga,[2,130])],defaultActions:{68:[2,70],69:[2,71],239:[2,109],357:[2,141]},parseError:function(a,d){if(d.recoverable)this.trace(a);else{var b=function(a,d){this.message=a;this.hash=d};b.prototype=Error;throw new b(a,d);}},parse:function(a){var d=[0],b=[null],l=[],m=this.table,Ca=\"\",g=0,Ja=0,c=0,f=l.slice.call(arguments,1),ua=Object.create(this.lexer),h={};for(n in this.yy)Object.prototype.hasOwnProperty.call(this.yy,n)&&(h[n]=this.yy[n]);ua.setInput(a,h);h.lexer=ua;h.parser=\nthis;\"undefined\"==typeof ua.yylloc&&(ua.yylloc={});var n=ua.yylloc;l.push(n);var k=ua.options&&ua.options.ranges;this.parseError=\"function\"===typeof h.parseError?h.parseError:Object.getPrototypeOf(this).parseError;for(var e,q,Na,Ia,p={},wa,x;;){Na=d[d.length-1];if(this.defaultActions[Na])Ia=this.defaultActions[Na];else{if(null===e||\"undefined\"==typeof e)e=ua.lex()||1,\"number\"!==typeof e&&(e=this.symbols_[e]||e);Ia=m[Na]&&m[Na][e]}if(\"undefined\"===typeof Ia||!Ia.length||!Ia[0]){x=[];for(wa in m[Na])this.terminals_[wa]&&\n2<wa&&x.push(\"'\"+this.terminals_[wa]+\"'\");var w=ua.showPosition?\"Parse error on line \"+(g+1)+\":\\n\"+ua.showPosition()+\"\\nExpecting \"+x.join(\", \")+\", got '\"+(this.terminals_[e]||e)+\"'\":\"Parse error on line \"+(g+1)+\": Unexpected \"+(1==e?\"end of input\":\"'\"+(this.terminals_[e]||e)+\"'\");this.parseError(w,{text:ua.match,token:this.terminals_[e]||e,line:ua.yylineno,loc:n,expected:x})}if(Ia[0]instanceof Array&&1<Ia.length)throw Error(\"Parse Error: multiple actions possible at state: \"+Na+\", token: \"+e);switch(Ia[0]){case 1:d.push(e);\nb.push(ua.yytext);l.push(ua.yylloc);d.push(Ia[1]);e=null;q?(e=q,q=null):(Ja=ua.yyleng,Ca=ua.yytext,g=ua.yylineno,n=ua.yylloc,0<c&&c--);break;case 2:x=this.productions_[Ia[1]][1];p.$=b[b.length-x];p._$={first_line:l[l.length-(x||1)].first_line,last_line:l[l.length-1].last_line,first_column:l[l.length-(x||1)].first_column,last_column:l[l.length-1].last_column};k&&(p._$.range=[l[l.length-(x||1)].range[0],l[l.length-1].range[1]]);Na=this.performAction.apply(p,[Ca,Ja,g,h,Ia[1],b,l].concat(f));if(\"undefined\"!==\ntypeof Na)return Na;x&&(d=d.slice(0,-2*x),b=b.slice(0,-1*x),l=l.slice(0,-1*x));d.push(this.productions_[Ia[1]][0]);b.push(p.$);l.push(p._$);Ia=m[d[d.length-2]][d[d.length-1]];d.push(Ia);break;case 3:return!0}}}};e.prototype=hc;hc.Parser=e;return new e}();\"undefined\"!==typeof u&&\"undefined\"!==typeof e&&(e.parser=r,e.Parser=r.Parser,e.parse=function(){return r.parse.apply(r,arguments)},e.main=function(x){x[1]||(console.log(\"Usage: \"+x[0]+\" FILE\"),process.exit(1));var a=\"\",b=u(\"fs\");\"undefined\"!==typeof b&&\nnull!==b&&(a=b.readFileSync(u(\"path\").normalize(x[1]),\"utf8\"));return e.parser.parse(a)},\"undefined\"!==typeof ra&&u.main===ra&&e.main(process.argv.slice(1)));return ra.exports}();u[\"./scope\"]=function(){var e={};(function(){var u=[].indexOf||function(e){for(var x=0,a=this.length;x<a;x++)if(x in this&&this[x]===e)return x;return-1};e.Scope=function(){function e(e,a,b,r){var f,k;this.parent=e;this.expressions=a;this.method=b;this.referencedVars=r;this.variables=[{name:\"arguments\",type:\"arguments\"}];\nthis.positions={};this.parent||(this.utilities={});this.root=null!=(f=null!=(k=this.parent)?k.root:void 0)?f:this}e.prototype.add=function(e,a,b){return this.shared&&!b?this.parent.add(e,a,b):Object.prototype.hasOwnProperty.call(this.positions,e)?this.variables[this.positions[e]].type=a:this.positions[e]=this.variables.push({name:e,type:a})-1};e.prototype.namedMethod=function(){var e;return null!=(e=this.method)&&e.name||!this.parent?this.method:this.parent.namedMethod()};e.prototype.find=function(e,\na){null==a&&(a=\"var\");if(this.check(e))return!0;this.add(e,a);return!1};e.prototype.parameter=function(e){if(!this.shared||!this.parent.check(e,!0))return this.add(e,\"param\")};e.prototype.check=function(e){var a;return!!(this.type(e)||null!=(a=this.parent)&&a.check(e))};e.prototype.temporary=function(e,a,b){null==b&&(b=!1);return b?(b=e.charCodeAt(0),e=122-b,b=String.fromCharCode(b+a%(e+1)),a=Math.floor(a/(e+1)),\"\"+b+(a||\"\")):\"\"+e+(a||\"\")};e.prototype.type=function(e){var a;var b=this.variables;var x=\n0;for(a=b.length;x<a;x++){var f=b[x];if(f.name===e)return f.type}return null};e.prototype.freeVariable=function(e,a){var b,x;null==a&&(a={});for(b=0;;){var f=this.temporary(e,b,a.single);if(!(this.check(f)||0<=u.call(this.root.referencedVars,f)))break;b++}(null!=(x=a.reserve)?x:1)&&this.add(f,\"var\",!0);return f};e.prototype.assign=function(e,a){this.add(e,{value:a,assigned:!0},!0);return this.hasAssignments=!0};e.prototype.hasDeclarations=function(){return!!this.declaredVariables().length};e.prototype.declaredVariables=\nfunction(){var e;var a=this.variables;var b=[];var r=0;for(e=a.length;r<e;r++){var f=a[r];\"var\"===f.type&&b.push(f.name)}return b.sort()};e.prototype.assignedVariables=function(){var e;var a=this.variables;var b=[];var r=0;for(e=a.length;r<e;r++){var f=a[r];f.type.assigned&&b.push(f.name+\" \\x3d \"+f.type.value)}return b};return e}()}).call(this);return e}();u[\"./nodes\"]=function(){var e={};(function(){var ra,r,x,a,b,za,f,k,t,p,z,I,J,F,N,y,G,O,Q,B,n,c,w,q,h,K,P,L,U,W,H,Z,T,V,D,A,xa,E,aa,ba,C,S,v=function(a,\nb){function l(){this.constructor=a}for(var d in b)X.call(b,d)&&(a[d]=b[d]);l.prototype=b.prototype;a.prototype=new l;a.__super__=b.prototype;return a},X={}.hasOwnProperty,R=[].indexOf||function(a){for(var b=0,l=this.length;b<l;b++)if(b in this&&this[b]===a)return b;return-1},M=[].slice;Error.stackTraceLimit=Infinity;var ya=u(\"./scope\").Scope;var ta=u(\"./lexer\");var Aa=ta.isUnassignable;var ma=ta.JS_FORBIDDEN;var Y=u(\"./helpers\");var ea=Y.compact;var ia=Y.flatten;var fa=Y.extend;var ja=Y.merge;var la=\nY.del;ta=Y.addLocationDataFn;var pa=Y.locationDataToString;var qa=Y.throwSyntaxError;e.extend=fa;e.addLocationDataFn=ta;var ha=function(){return!0};var ka=function(){return!1};var oa=function(){return this};var sa=function(){this.negated=!this.negated;return this};e.CodeFragment=t=function(){function a(a,b){var d;this.code=\"\"+b;this.locationData=null!=a?a.locationData:void 0;this.type=(null!=a?null!=(d=a.constructor)?d.name:void 0:void 0)||\"unknown\"}a.prototype.toString=function(){return\"\"+this.code+\n(this.locationData?\": \"+pa(this.locationData):\"\")};return a}();var ca=function(a){var b;var l=[];var d=0;for(b=a.length;d<b;d++){var Ca=a[d];l.push(Ca.code)}return l.join(\"\")};e.Base=ta=function(){function b(){}b.prototype.compile=function(a,b){return ca(this.compileToFragments(a,b))};b.prototype.compileToFragments=function(a,b){a=fa({},a);b&&(a.level=b);b=this.unfoldSoak(a)||this;b.tab=a.indent;return a.level!==na&&b.isStatement(a)?b.compileClosure(a):b.compileNode(a)};b.prototype.compileClosure=\nfunction(b){var l,d,m;(d=this.jumps())&&d.error(\"cannot use a pure statement in an expression\");b.sharedScope=!0;d=new k([],a.wrap([this]));var Ja=[];if((l=this.contains(Wa))||this.contains(da))Ja=[new E],l?(l=\"apply\",Ja.push(new y(\"arguments\"))):l=\"call\",d=new C(d,[new ra(new L(l))]);b=(new za(d,Ja)).compileNode(b);if(d.isGenerator||null!=(m=d.base)&&m.isGenerator)b.unshift(this.makeCode(\"(yield* \")),b.push(this.makeCode(\")\"));return b};b.prototype.cache=function(a,b,d){if(null!=d?d(this):this.isComplex()){d=\nnew y(a.scope.freeVariable(\"ref\"));var l=new x(d,this);return b?[l.compileToFragments(a,b),[this.makeCode(d.value)]]:[l,d]}d=b?this.compileToFragments(a,b):this;return[d,d]};b.prototype.cacheToCodeFragments=function(a){return[ca(a[0]),ca(a[1])]};b.prototype.makeReturn=function(a){var b=this.unwrapAll();return a?new za(new B(a+\".push\"),[b]):new H(b)};b.prototype.contains=function(a){var b=void 0;this.traverseChildren(!1,function(d){if(a(d))return b=d,!1});return b};b.prototype.lastNonComment=function(a){var b;\nfor(b=a.length;b--;)if(!(a[b]instanceof p))return a[b];return null};b.prototype.toString=function(a,b){null==a&&(a=\"\");null==b&&(b=this.constructor.name);var d=\"\\n\"+a+b;this.soak&&(d+=\"?\");this.eachChild(function(b){return d+=b.toString(a+Fa)});return d};b.prototype.eachChild=function(a){var b,d;if(!this.children)return this;var m=this.children;var Ja=0;for(b=m.length;Ja<b;Ja++){var c=m[Ja];if(this[c]){var e=ia([this[c]]);var f=0;for(d=e.length;f<d;f++)if(c=e[f],!1===a(c))return this}}return this};\nb.prototype.traverseChildren=function(a,b){return this.eachChild(function(d){if(!1!==b(d))return d.traverseChildren(a,b)})};b.prototype.invert=function(){return new h(\"!\",this)};b.prototype.unwrapAll=function(){var a;for(a=this;a!==(a=a.unwrap()););return a};b.prototype.children=[];b.prototype.isStatement=ka;b.prototype.jumps=ka;b.prototype.isComplex=ha;b.prototype.isChainable=ka;b.prototype.isAssignable=ka;b.prototype.isNumber=ka;b.prototype.unwrap=oa;b.prototype.unfoldSoak=ka;b.prototype.assigns=\nka;b.prototype.updateLocationDataIfMissing=function(a){if(this.locationData)return this;this.locationData=a;return this.eachChild(function(b){return b.updateLocationDataIfMissing(a)})};b.prototype.error=function(a){return qa(a,this.locationData)};b.prototype.makeCode=function(a){return new t(this,a)};b.prototype.wrapInBraces=function(a){return[].concat(this.makeCode(\"(\"),a,this.makeCode(\")\"))};b.prototype.joinFragmentArrays=function(a,b){var d,l;var m=[];var c=d=0;for(l=a.length;d<l;c=++d){var e=\na[c];c&&m.push(this.makeCode(b));m=m.concat(e)}return m};return b}();e.Block=a=function(a){function b(a){this.expressions=ea(ia(a||[]))}v(b,a);b.prototype.children=[\"expressions\"];b.prototype.push=function(a){this.expressions.push(a);return this};b.prototype.pop=function(){return this.expressions.pop()};b.prototype.unshift=function(a){this.expressions.unshift(a);return this};b.prototype.unwrap=function(){return 1===this.expressions.length?this.expressions[0]:this};b.prototype.isEmpty=function(){return!this.expressions.length};\nb.prototype.isStatement=function(a){var d;var b=this.expressions;var l=0;for(d=b.length;l<d;l++){var m=b[l];if(m.isStatement(a))return!0}return!1};b.prototype.jumps=function(a){var d;var b=this.expressions;var l=0;for(d=b.length;l<d;l++){var m=b[l];if(m=m.jumps(a))return m}};b.prototype.makeReturn=function(a){var d;for(d=this.expressions.length;d--;){var b=this.expressions[d];if(!(b instanceof p)){this.expressions[d]=b.makeReturn(a);b instanceof H&&!b.expression&&this.expressions.splice(d,1);break}}return this};\nb.prototype.compileToFragments=function(a,d){null==a&&(a={});return a.scope?b.__super__.compileToFragments.call(this,a,d):this.compileRoot(a)};b.prototype.compileNode=function(a){var d,l;this.tab=a.indent;var m=a.level===na;var c=[];var e=this.expressions;var f=d=0;for(l=e.length;d<l;f=++d){var h=e[f];h=h.unwrapAll();h=h.unfoldSoak(a)||h;h instanceof b?c.push(h.compileNode(a)):m?(h.front=!0,f=h.compileToFragments(a),h.isStatement(a)||(f.unshift(this.makeCode(\"\"+this.tab)),f.push(this.makeCode(\";\"))),\nc.push(f)):c.push(h.compileToFragments(a,va))}if(m)return this.spaced?[].concat(this.joinFragmentArrays(c,\"\\n\\n\"),this.makeCode(\"\\n\")):this.joinFragmentArrays(c,\"\\n\");d=c.length?this.joinFragmentArrays(c,\", \"):[this.makeCode(\"void 0\")];return 1<c.length&&a.level>=va?this.wrapInBraces(d):d};b.prototype.compileRoot=function(a){var d,b;a.indent=a.bare?\"\":Fa;a.level=na;this.spaced=!0;a.scope=new ya(null,this,null,null!=(b=a.referencedVars)?b:[]);var l=a.locals||[];b=0;for(d=l.length;b<d;b++){var m=l[b];\na.scope.parameter(m)}b=[];if(!a.bare){var c=this.expressions;d=[];var e=m=0;for(l=c.length;m<l;e=++m){e=c[e];if(!(e.unwrap()instanceof p))break;d.push(e)}m=this.expressions.slice(d.length);this.expressions=d;d.length&&(b=this.compileNode(ja(a,{indent:\"\"})),b.push(this.makeCode(\"\\n\")));this.expressions=m}d=this.compileWithDeclarations(a);return a.bare?d:[].concat(b,this.makeCode(\"(function() {\\n\"),d,this.makeCode(\"\\n}).call(this);\\n\"))};b.prototype.compileWithDeclarations=function(a){var d,b;var l=\n[];var m=this.expressions;var c=b=0;for(d=m.length;b<d;c=++b){var e=m[c];e=e.unwrap();if(!(e instanceof p||e instanceof B))break}a=ja(a,{level:na});c&&(e=this.expressions.splice(c,9E9),l=[this.spaced,!1],b=l[0],this.spaced=l[1],b=[this.compileNode(a),b],l=b[0],this.spaced=b[1],this.expressions=e);e=this.compileNode(a);b=a.scope;b.expressions===this&&(d=a.scope.hasDeclarations(),a=b.hasAssignments,d||a?(c&&l.push(this.makeCode(\"\\n\")),l.push(this.makeCode(this.tab+\"var \")),d&&l.push(this.makeCode(b.declaredVariables().join(\", \"))),\na&&(d&&l.push(this.makeCode(\",\\n\"+(this.tab+Fa))),l.push(this.makeCode(b.assignedVariables().join(\",\\n\"+(this.tab+Fa))))),l.push(this.makeCode(\";\\n\"+(this.spaced?\"\\n\":\"\")))):l.length&&e.length&&l.push(this.makeCode(\"\\n\")));return l.concat(e)};b.wrap=function(a){return 1===a.length&&a[0]instanceof b?a[0]:new b(a)};return b}(ta);e.Literal=B=function(a){function b(a){this.value=a}v(b,a);b.prototype.isComplex=ka;b.prototype.assigns=function(a){return a===this.value};b.prototype.compileNode=function(a){return[this.makeCode(this.value)]};\nb.prototype.toString=function(){return\" \"+(this.isStatement()?b.__super__.toString.apply(this,arguments):this.constructor.name)+\": \"+this.value};return b}(ta);e.NumberLiteral=w=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);return b}(B);e.InfinityLiteral=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);b.prototype.compileNode=function(){return[this.makeCode(\"2e308\")]};return b}(w);e.NaNLiteral=function(a){function b(){b.__super__.constructor.call(this,\n\"NaN\")}v(b,a);b.prototype.compileNode=function(a){var d=[this.makeCode(\"0/0\")];return a.level>=Ha?this.wrapInBraces(d):d};return b}(w);e.StringLiteral=D=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);return b}(B);e.RegexLiteral=W=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);return b}(B);e.PassthroughLiteral=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);return b}(B);e.IdentifierLiteral=\ny=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);b.prototype.isAssignable=ha;return b}(B);e.PropertyName=L=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);b.prototype.isAssignable=ha;return b}(B);e.StatementLiteral=V=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);b.prototype.isStatement=ha;b.prototype.makeReturn=oa;b.prototype.jumps=function(a){if(\"break\"===this.value&&!(null!=a&&a.loop||\nnull!=a&&a.block)||\"continue\"===this.value&&(null==a||!a.loop))return this};b.prototype.compileNode=function(a){return[this.makeCode(\"\"+this.tab+this.value+\";\")]};return b}(B);e.ThisLiteral=E=function(a){function b(){b.__super__.constructor.call(this,\"this\")}v(b,a);b.prototype.compileNode=function(a){var d;a=null!=(d=a.scope.method)&&d.bound?a.scope.method.context:this.value;return[this.makeCode(a)]};return b}(B);e.UndefinedLiteral=ba=function(a){function b(){b.__super__.constructor.call(this,\"undefined\")}\nv(b,a);b.prototype.compileNode=function(a){return[this.makeCode(a.level>=Ka?\"(void 0)\":\"void 0\")]};return b}(B);e.NullLiteral=c=function(a){function b(){b.__super__.constructor.call(this,\"null\")}v(b,a);return b}(B);e.BooleanLiteral=b=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);return b}(B);e.Return=H=function(a){function b(a){this.expression=a}v(b,a);b.prototype.children=[\"expression\"];b.prototype.isStatement=ha;b.prototype.makeReturn=oa;b.prototype.jumps=\noa;b.prototype.compileToFragments=function(a,d){var l;var m=null!=(l=this.expression)?l.makeReturn():void 0;return!m||m instanceof b?b.__super__.compileToFragments.call(this,a,d):m.compileToFragments(a,d)};b.prototype.compileNode=function(a){var d=[];d.push(this.makeCode(this.tab+(\"return\"+(this.expression?\" \":\"\"))));this.expression&&(d=d.concat(this.expression.compileToFragments(a,Da)));d.push(this.makeCode(\";\"));return d};return b}(ta);e.YieldReturn=S=function(a){function b(){return b.__super__.constructor.apply(this,\narguments)}v(b,a);b.prototype.compileNode=function(a){null==a.scope.parent&&this.error(\"yield can only occur inside functions\");return b.__super__.compileNode.apply(this,arguments)};return b}(H);e.Value=C=function(a){function m(a,b,Ca){if(!b&&a instanceof m)return a;this.base=a;this.properties=b||[];Ca&&(this[Ca]=!0);return this}v(m,a);m.prototype.children=[\"base\",\"properties\"];m.prototype.add=function(a){this.properties=this.properties.concat(a);return this};m.prototype.hasProperties=function(){return!!this.properties.length};\nm.prototype.bareLiteral=function(a){return!this.properties.length&&this.base instanceof a};m.prototype.isArray=function(){return this.bareLiteral(r)};m.prototype.isRange=function(){return this.bareLiteral(U)};m.prototype.isComplex=function(){return this.hasProperties()||this.base.isComplex()};m.prototype.isAssignable=function(){return this.hasProperties()||this.base.isAssignable()};m.prototype.isNumber=function(){return this.bareLiteral(w)};m.prototype.isString=function(){return this.bareLiteral(D)};\nm.prototype.isRegex=function(){return this.bareLiteral(W)};m.prototype.isUndefined=function(){return this.bareLiteral(ba)};m.prototype.isNull=function(){return this.bareLiteral(c)};m.prototype.isBoolean=function(){return this.bareLiteral(b)};m.prototype.isAtomic=function(){var a;var b=this.properties.concat(this.base);var m=0;for(a=b.length;m<a;m++){var c=b[m];if(c.soak||c instanceof za)return!1}return!0};m.prototype.isNotCallable=function(){return this.isNumber()||this.isString()||this.isRegex()||\nthis.isArray()||this.isRange()||this.isSplice()||this.isObject()||this.isUndefined()||this.isNull()||this.isBoolean()};m.prototype.isStatement=function(a){return!this.properties.length&&this.base.isStatement(a)};m.prototype.assigns=function(a){return!this.properties.length&&this.base.assigns(a)};m.prototype.jumps=function(a){return!this.properties.length&&this.base.jumps(a)};m.prototype.isObject=function(a){return this.properties.length?!1:this.base instanceof q&&(!a||this.base.generated)};m.prototype.isSplice=\nfunction(){var a=this.properties;return a[a.length-1]instanceof Z};m.prototype.looksStatic=function(a){var b;return this.base.value===a&&1===this.properties.length&&\"prototype\"!==(null!=(b=this.properties[0].name)?b.value:void 0)};m.prototype.unwrap=function(){return this.properties.length?this:this.base};m.prototype.cacheReference=function(a){var b=this.properties;var l=b[b.length-1];if(2>this.properties.length&&!this.base.isComplex()&&(null==l||!l.isComplex()))return[this,this];b=new m(this.base,\nthis.properties.slice(0,-1));if(b.isComplex()){var c=new y(a.scope.freeVariable(\"base\"));b=new m(new P(new x(c,b)))}if(!l)return[b,c];if(l.isComplex()){var e=new y(a.scope.freeVariable(\"name\"));l=new Q(new x(e,l.index));e=new Q(e)}return[b.add(l),new m(c||b.base,[e||l])]};m.prototype.compileNode=function(a){var b;this.base.front=this.front;var l=this.properties;var m=this.base.compileToFragments(a,l.length?Ka:null);l.length&&Ra.test(ca(m))&&m.push(this.makeCode(\".\"));var c=0;for(b=l.length;c<b;c++){var e=\nl[c];m.push.apply(m,e.compileToFragments(a))}return m};m.prototype.unfoldSoak=function(a){return null!=this.unfoldedSoak?this.unfoldedSoak:this.unfoldedSoak=function(b){return function(){var d,l,c;if(l=b.base.unfoldSoak(a))return(d=l.body.properties).push.apply(d,b.properties),l;var e=b.properties;l=d=0;for(c=e.length;d<c;l=++d){var f=e[l];if(f.soak)return f.soak=!1,d=new m(b.base,b.properties.slice(0,l)),c=new m(b.base,b.properties.slice(l)),d.isComplex()&&(l=new y(a.scope.freeVariable(\"ref\")),d=\nnew P(new x(l,d)),c.base=l),new G(new z(d),c,{soak:!0})}return!1}}(this)()};return m}(ta);e.Comment=p=function(a){function b(a){this.comment=a}v(b,a);b.prototype.isStatement=ha;b.prototype.makeReturn=oa;b.prototype.compileNode=function(a,b){var d=this.comment.replace(/^(\\s*)#(?=\\s)/gm,\"$1 *\");d=\"/*\"+Ga(d,this.tab)+(0<=R.call(d,\"\\n\")?\"\\n\"+this.tab:\"\")+\" */\";(b||a.level)===na&&(d=a.indent+d);return[this.makeCode(\"\\n\"),this.makeCode(d)]};return b}(ta);e.Call=za=function(a){function b(a,b,m){this.variable=\na;this.args=null!=b?b:[];this.soak=m;this.isNew=!1;this.variable instanceof C&&this.variable.isNotCallable()&&this.variable.error(\"literal is not a function\")}v(b,a);b.prototype.children=[\"variable\",\"args\"];b.prototype.updateLocationDataIfMissing=function(a){var d;if(this.locationData&&this.needsUpdatedStartLocation){this.locationData.first_line=a.first_line;this.locationData.first_column=a.first_column;var l=(null!=(d=this.variable)?d.base:void 0)||this.variable;l.needsUpdatedStartLocation&&(this.variable.locationData.first_line=\na.first_line,this.variable.locationData.first_column=a.first_column,l.updateLocationDataIfMissing(a));delete this.needsUpdatedStartLocation}return b.__super__.updateLocationDataIfMissing.apply(this,arguments)};b.prototype.newInstance=function(){var a;var d=(null!=(a=this.variable)?a.base:void 0)||this.variable;d instanceof b&&!d.isNew?d.newInstance():this.isNew=!0;this.needsUpdatedStartLocation=!0;return this};b.prototype.unfoldSoak=function(a){var d,l;if(this.soak){if(this instanceof xa){var m=new B(this.superReference(a));\nvar c=new C(m)}else{if(c=Ea(a,this,\"variable\"))return c;c=(new C(this.variable)).cacheReference(a);m=c[0];c=c[1]}c=new b(c,this.args);c.isNew=this.isNew;m=new B(\"typeof \"+m.compile(a)+' \\x3d\\x3d\\x3d \"function\"');return new G(m,new C(c),{soak:!0})}m=this;for(d=[];;)if(m.variable instanceof b)d.push(m),m=m.variable;else{if(!(m.variable instanceof C))break;d.push(m);if(!((m=m.variable.base)instanceof b))break}var e=d.reverse();d=0;for(l=e.length;d<l;d++)m=e[d],c&&(m.variable instanceof b?m.variable=\nc:m.variable.base=c),c=Ea(a,m,\"variable\");return c};b.prototype.compileNode=function(a){var b,l,m;null!=(b=this.variable)&&(b.front=this.front);b=T.compileSplattedArray(a,this.args,!0);if(b.length)return this.compileSplat(a,b);b=[];var c=this.args;var e=l=0;for(m=c.length;l<m;e=++l){var f=c[e];e&&b.push(this.makeCode(\", \"));b.push.apply(b,f.compileToFragments(a,va))}f=[];this instanceof xa?(a=this.superReference(a)+(\".call(\"+this.superThis(a)),b.length&&(a+=\", \"),f.push(this.makeCode(a))):(this.isNew&&\nf.push(this.makeCode(\"new \")),f.push.apply(f,this.variable.compileToFragments(a,Ka)),f.push(this.makeCode(\"(\")));f.push.apply(f,b);f.push(this.makeCode(\")\"));return f};b.prototype.compileSplat=function(a,b){var d;if(this instanceof xa)return[].concat(this.makeCode(this.superReference(a)+\".apply(\"+this.superThis(a)+\", \"),b,this.makeCode(\")\"));if(this.isNew){var l=this.tab+Fa;return[].concat(this.makeCode(\"(function(func, args, ctor) {\\n\"+l+\"ctor.prototype \\x3d func.prototype;\\n\"+l+\"var child \\x3d new ctor, result \\x3d func.apply(child, args);\\n\"+\nl+\"return Object(result) \\x3d\\x3d\\x3d result ? result : child;\\n\"+this.tab+\"})(\"),this.variable.compileToFragments(a,va),this.makeCode(\", \"),b,this.makeCode(\", function(){})\"))}l=[];var m=new C(this.variable);if((d=m.properties.pop())&&m.isComplex()){var c=a.scope.freeVariable(\"ref\");l=l.concat(this.makeCode(\"(\"+c+\" \\x3d \"),m.compileToFragments(a,va),this.makeCode(\")\"),d.compileToFragments(a))}else m=m.compileToFragments(a,Ka),Ra.test(ca(m))&&(m=this.wrapInBraces(m)),d?(c=ca(m),m.push.apply(m,d.compileToFragments(a))):\nc=\"null\",l=l.concat(m);return l.concat(this.makeCode(\".apply(\"+c+\", \"),b,this.makeCode(\")\"))};return b}(ta);e.SuperCall=xa=function(a){function b(a){b.__super__.constructor.call(this,null,null!=a?a:[new T(new y(\"arguments\"))]);this.isBare=null!=a}v(b,a);b.prototype.superReference=function(a){var b=a.scope.namedMethod();if(null!=b&&b.klass){var l=b.klass;var m=b.name;var c=b.variable;if(l.isComplex()){var e=new y(a.scope.parent.freeVariable(\"base\"));var f=new C(new P(new x(e,l)));c.base=f;c.properties.splice(0,\nl.properties.length)}if(m.isComplex()||m instanceof Q&&m.index.isAssignable()){var h=new y(a.scope.parent.freeVariable(\"name\"));m=new Q(new x(h,m.index));c.properties.pop();c.properties.push(m)}f=[new ra(new L(\"__super__\"))];b[\"static\"]&&f.push(new ra(new L(\"constructor\")));f.push(null!=h?new Q(h):m);return(new C(null!=e?e:l,f)).compile(a)}return null!=b&&b.ctor?b.name+\".__super__.constructor\":this.error(\"cannot call super outside of an instance method.\")};b.prototype.superThis=function(a){return(a=\na.scope.method)&&!a.klass&&a.context||\"this\"};return b}(za);e.RegexWithInterpolations=function(a){function b(a){null==a&&(a=[]);b.__super__.constructor.call(this,new C(new y(\"RegExp\")),a,!1)}v(b,a);return b}(za);e.TaggedTemplateCall=function(b){function m(b,d,c){d instanceof D&&(d=new A(a.wrap([new C(d)])));m.__super__.constructor.call(this,b,[d],c)}v(m,b);m.prototype.compileNode=function(a){a.inTaggedTemplateCall=!0;return this.variable.compileToFragments(a,Ka).concat(this.args[0].compileToFragments(a,\nva))};return m}(za);e.Extends=F=function(a){function b(a,b){this.child=a;this.parent=b}v(b,a);b.prototype.children=[\"child\",\"parent\"];b.prototype.compileToFragments=function(a){return(new za(new C(new B(La(\"extend\",a))),[this.child,this.parent])).compileToFragments(a)};return b}(ta);e.Access=ra=function(a){function b(a,b){this.name=a;this.soak=\"soak\"===b}v(b,a);b.prototype.children=[\"name\"];b.prototype.compileToFragments=function(a){var b;a=this.name.compileToFragments(a);var l=this.name.unwrap();\nreturn l instanceof L?(b=l.value,0<=R.call(ma,b))?[this.makeCode('[\"')].concat(M.call(a),[this.makeCode('\"]')]):[this.makeCode(\".\")].concat(M.call(a)):[this.makeCode(\"[\")].concat(M.call(a),[this.makeCode(\"]\")])};b.prototype.isComplex=ka;return b}(ta);e.Index=Q=function(a){function b(a){this.index=a}v(b,a);b.prototype.children=[\"index\"];b.prototype.compileToFragments=function(a){return[].concat(this.makeCode(\"[\"),this.index.compileToFragments(a,Da),this.makeCode(\"]\"))};b.prototype.isComplex=function(){return this.index.isComplex()};\nreturn b}(ta);e.Range=U=function(a){function b(a,b,c){this.from=a;this.to=b;this.equals=(this.exclusive=\"exclusive\"===c)?\"\":\"\\x3d\"}v(b,a);b.prototype.children=[\"from\",\"to\"];b.prototype.compileVariables=function(a){a=ja(a,{top:!0});var b=la(a,\"isComplex\");var l=this.cacheToCodeFragments(this.from.cache(a,va,b));this.fromC=l[0];this.fromVar=l[1];l=this.cacheToCodeFragments(this.to.cache(a,va,b));this.toC=l[0];this.toVar=l[1];if(l=la(a,\"step\"))a=this.cacheToCodeFragments(l.cache(a,va,b)),this.step=a[0],\nthis.stepVar=a[1];this.fromNum=this.from.isNumber()?Number(this.fromVar):null;this.toNum=this.to.isNumber()?Number(this.toVar):null;return this.stepNum=null!=l&&l.isNumber()?Number(this.stepVar):null};b.prototype.compileNode=function(a){var b,l,c,m;this.fromVar||this.compileVariables(a);if(!a.index)return this.compileArray(a);var e=null!=this.fromNum&&null!=this.toNum;var f=la(a,\"index\");var h=(a=la(a,\"name\"))&&a!==f;var n=f+\" \\x3d \"+this.fromC;this.toC!==this.toVar&&(n+=\", \"+this.toC);this.step!==\nthis.stepVar&&(n+=\", \"+this.step);var k=[f+\" \\x3c\"+this.equals,f+\" \\x3e\"+this.equals];var q=k[0];k=k[1];q=null!=this.stepNum?0<this.stepNum?q+\" \"+this.toVar:k+\" \"+this.toVar:e?(c=[this.fromNum,this.toNum],l=c[0],m=c[1],c,l<=m?q+\" \"+m:k+\" \"+m):(b=this.stepVar?this.stepVar+\" \\x3e 0\":this.fromVar+\" \\x3c\\x3d \"+this.toVar,b+\" ? \"+q+\" \"+this.toVar+\" : \"+k+\" \"+this.toVar);b=this.stepVar?f+\" +\\x3d \"+this.stepVar:e?h?l<=m?\"++\"+f:\"--\"+f:l<=m?f+\"++\":f+\"--\":h?b+\" ? ++\"+f+\" : --\"+f:b+\" ? \"+f+\"++ : \"+f+\"--\";h&&\n(n=a+\" \\x3d \"+n);h&&(b=a+\" \\x3d \"+b);return[this.makeCode(n+\"; \"+q+\"; \"+b)]};b.prototype.compileArray=function(a){var b,l,c;if((b=null!=this.fromNum&&null!=this.toNum)&&20>=Math.abs(this.fromNum-this.toNum)){var m=function(){c=[];for(var a=l=this.fromNum,b=this.toNum;l<=b?a<=b:a>=b;l<=b?a++:a--)c.push(a);return c}.apply(this);this.exclusive&&m.pop();return[this.makeCode(\"[\"+m.join(\", \")+\"]\")]}var e=this.tab+Fa;var f=a.scope.freeVariable(\"i\",{single:!0});var h=a.scope.freeVariable(\"results\");var n=\n\"\\n\"+e+h+\" \\x3d [];\";if(b)a.index=f,b=ca(this.compileNode(a));else{var k=f+\" \\x3d \"+this.fromC+(this.toC!==this.toVar?\", \"+this.toC:\"\");b=this.fromVar+\" \\x3c\\x3d \"+this.toVar;b=\"var \"+k+\"; \"+b+\" ? \"+f+\" \\x3c\"+this.equals+\" \"+this.toVar+\" : \"+f+\" \\x3e\"+this.equals+\" \"+this.toVar+\"; \"+b+\" ? \"+f+\"++ : \"+f+\"--\"}f=\"{ \"+h+\".push(\"+f+\"); }\\n\"+e+\"return \"+h+\";\\n\"+a.indent;a=function(a){return null!=a?a.contains(Wa):void 0};if(a(this.from)||a(this.to))m=\", arguments\";return[this.makeCode(\"(function() {\"+n+\n\"\\n\"+e+\"for (\"+b+\")\"+f+\"}).apply(this\"+(null!=m?m:\"\")+\")\")]};return b}(ta);e.Slice=Z=function(a){function b(a){this.range=a;b.__super__.constructor.call(this)}v(b,a);b.prototype.children=[\"range\"];b.prototype.compileNode=function(a){var b=this.range;var l=b.to;var c=(b=b.from)&&b.compileToFragments(a,Da)||[this.makeCode(\"0\")];if(l){b=l.compileToFragments(a,Da);var m=ca(b);if(this.range.exclusive||-1!==+m)var e=\", \"+(this.range.exclusive?m:l.isNumber()?\"\"+(+m+1):(b=l.compileToFragments(a,Ka),\"+\"+ca(b)+\n\" + 1 || 9e9\"))}return[this.makeCode(\".slice(\"+ca(c)+(e||\"\")+\")\")]};return b}(ta);e.Obj=q=function(a){function b(a,b){this.generated=null!=b?b:!1;this.objects=this.properties=a||[]}v(b,a);b.prototype.children=[\"properties\"];b.prototype.compileNode=function(a){var b,l,c;var m=this.properties;if(this.generated){var e=0;for(b=m.length;e<b;e++){var f=m[e];f instanceof C&&f.error(\"cannot have an implicit value in an implicit object\")}}e=b=0;for(f=m.length;b<f;e=++b){var h=m[e];if((h.variable||h).base instanceof\nP)break}f=e<m.length;var n=a.indent+=Fa;var k=this.lastNonComment(this.properties);b=[];if(f){var q=a.scope.freeVariable(\"obj\");b.push(this.makeCode(\"(\\n\"+n+q+\" \\x3d \"))}b.push(this.makeCode(\"{\"+(0===m.length||0===e?\"}\":\"\\n\")));var w=l=0;for(c=m.length;l<c;w=++l){h=m[w];w===e&&(0!==w&&b.push(this.makeCode(\"\\n\"+n+\"}\")),b.push(this.makeCode(\",\\n\")));var t=w===m.length-1||w===e-1?\"\":h===k||h instanceof p?\"\\n\":\",\\n\";var r=h instanceof p?\"\":n;f&&w<e&&(r+=Fa);h instanceof x&&(\"object\"!==h.context&&h.operatorToken.error(\"unexpected \"+\nh.operatorToken.value),h.variable instanceof C&&h.variable.hasProperties()&&h.variable.error(\"invalid object key\"));h instanceof C&&h[\"this\"]&&(h=new x(h.properties[0].name,h,\"object\"));h instanceof p||(w<e?h instanceof x||(h=new x(h,h,\"object\")):(h instanceof x?(w=h.variable,h=h.value):(h=h.base.cache(a),w=h[0],h=h[1],w instanceof y&&(w=new L(w.value))),h=new x(new C(new y(q),[new ra(w)]),h)));r&&b.push(this.makeCode(r));b.push.apply(b,h.compileToFragments(a,na));t&&b.push(this.makeCode(t))}f?b.push(this.makeCode(\",\\n\"+\nn+q+\"\\n\"+this.tab+\")\")):0!==m.length&&b.push(this.makeCode(\"\\n\"+this.tab+\"}\"));return this.front&&!f?this.wrapInBraces(b):b};b.prototype.assigns=function(a){var b;var l=this.properties;var c=0;for(b=l.length;c<b;c++){var m=l[c];if(m.assigns(a))return!0}return!1};return b}(ta);e.Arr=r=function(a){function b(a){this.objects=a||[]}v(b,a);b.prototype.children=[\"objects\"];b.prototype.compileNode=function(a){var b;if(!this.objects.length)return[this.makeCode(\"[]\")];a.indent+=Fa;var l=T.compileSplattedArray(a,\nthis.objects);if(l.length)return l;l=[];var c=this.objects;var m=[];var e=0;for(b=c.length;e<b;e++){var f=c[e];m.push(f.compileToFragments(a,va))}e=b=0;for(c=m.length;b<c;e=++b)f=m[e],e&&l.push(this.makeCode(\", \")),l.push.apply(l,f);0<=ca(l).indexOf(\"\\n\")?(l.unshift(this.makeCode(\"[\\n\"+a.indent)),l.push(this.makeCode(\"\\n\"+this.tab+\"]\"))):(l.unshift(this.makeCode(\"[\")),l.push(this.makeCode(\"]\")));return l};b.prototype.assigns=function(a){var b;var l=this.objects;var c=0;for(b=l.length;c<b;c++){var m=\nl[c];if(m.assigns(a))return!0}return!1};return b}(ta);e.Class=f=function(b){function c(b,d,c){this.variable=b;this.parent=d;this.body=null!=c?c:new a;this.boundFuncs=[];this.body.classBody=!0}v(c,b);c.prototype.children=[\"variable\",\"parent\",\"body\"];c.prototype.defaultClassVariableName=\"_Class\";c.prototype.determineName=function(){var a;if(!this.variable)return this.defaultClassVariableName;var b=this.variable.properties;b=(a=b[b.length-1])?a instanceof ra&&a.name:this.variable.base;if(!(b instanceof\ny||b instanceof L))return this.defaultClassVariableName;b=b.value;a||(a=Aa(b))&&this.variable.error(a);return 0<=R.call(ma,b)?\"_\"+b:b};c.prototype.setContext=function(a){return this.body.traverseChildren(!1,function(b){if(b.classBody)return!1;if(b instanceof E)return b.value=a;if(b instanceof k&&b.bound)return b.context=a})};c.prototype.addBoundFunctions=function(a){var b;var l=this.boundFuncs;var c=0;for(b=l.length;c<b;c++){var m=l[c];m=(new C(new E,[new ra(m)])).compile(a);this.ctor.body.unshift(new B(m+\n\" \\x3d \"+La(\"bind\",a)+\"(\"+m+\", this)\"))}};c.prototype.addProperties=function(a,b,c){var d;var l=a.base.properties.slice(0);var m;for(m=[];d=l.shift();){if(d instanceof x){var e=d.variable.base;delete d.context;var f=d.value;\"constructor\"===e.value?(this.ctor&&d.error(\"cannot define more than one constructor in a class\"),f.bound&&d.error(\"cannot define a constructor as a bound function\"),f instanceof k?d=this.ctor=f:(this.externalCtor=c.classScope.freeVariable(\"ctor\"),d=new x(new y(this.externalCtor),\nf))):d.variable[\"this\"]?f[\"static\"]=!0:(a=e.isComplex()?new Q(e):new ra(e),d.variable=new C(new y(b),[new ra(new L(\"prototype\")),a]),f instanceof k&&f.bound&&(this.boundFuncs.push(e),f.bound=!1))}m.push(d)}return ea(m)};c.prototype.walkBody=function(b,d){return this.traverseChildren(!1,function(l){return function(m){var e,f,h;var Ca=!0;if(m instanceof c)return!1;if(m instanceof a){var n=e=m.expressions;var k=f=0;for(h=n.length;f<h;k=++f){var q=n[k];q instanceof x&&q.variable.looksStatic(b)?q.value[\"static\"]=\n!0:q instanceof C&&q.isObject(!0)&&(Ca=!1,e[k]=l.addProperties(q,b,d))}m.expressions=ia(e)}return Ca&&!(m instanceof c)}}(this))};c.prototype.hoistDirectivePrologue=function(){var a,b;var c=0;for(a=this.body.expressions;(b=a[c])&&b instanceof p||b instanceof C&&b.isString();)++c;return this.directives=a.splice(0,c)};c.prototype.ensureConstructor=function(a){this.ctor||(this.ctor=new k,this.externalCtor?this.ctor.body.push(new B(this.externalCtor+\".apply(this, arguments)\")):this.parent&&this.ctor.body.push(new B(a+\n\".__super__.constructor.apply(this, arguments)\")),this.ctor.body.makeReturn(),this.body.expressions.unshift(this.ctor));this.ctor.ctor=this.ctor.name=a;this.ctor.klass=null;return this.ctor.noReturn=!0};c.prototype.compileNode=function(b){var d,l,c;(l=this.body.jumps())&&l.error(\"Class bodies cannot contain pure statements\");(d=this.body.contains(Wa))&&d.error(\"Class bodies shouldn't reference arguments\");var m=this.determineName();var e=new y(m);l=new k([],a.wrap([this.body]));d=[];b.classScope=\nl.makeScope(b.scope);this.hoistDirectivePrologue();this.setContext(m);this.walkBody(m,b);this.ensureConstructor(m);this.addBoundFunctions(b);this.body.spaced=!0;this.body.expressions.push(e);this.parent&&(m=new y(b.classScope.freeVariable(\"superClass\",{reserve:!1})),this.body.expressions.unshift(new F(e,m)),l.params.push(new K(m)),d.push(this.parent));(c=this.body.expressions).unshift.apply(c,this.directives);c=new P(new za(l,d));this.variable&&(c=new x(this.variable,c,null,{moduleDeclaration:this.moduleDeclaration}));\nreturn c.compileToFragments(b)};return c}(ta);e.ModuleDeclaration=Y=function(a){function b(a,b){this.clause=a;this.source=b;this.checkSource()}v(b,a);b.prototype.children=[\"clause\",\"source\"];b.prototype.isStatement=ha;b.prototype.jumps=oa;b.prototype.makeReturn=oa;b.prototype.checkSource=function(){if(null!=this.source&&this.source instanceof A)return this.source.error(\"the name of the module to be imported from must be an uninterpolated string\")};b.prototype.checkScope=function(a,b){if(0!==a.indent.length)return this.error(b+\n\" statements must be at top-level scope\")};return b}(ta);e.ImportDeclaration=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);b.prototype.compileNode=function(a){var b;this.checkScope(a,\"import\");a.importedSymbols=[];var l=[];l.push(this.makeCode(this.tab+\"import \"));null!=this.clause&&l.push.apply(l,this.clause.compileNode(a));null!=(null!=(b=this.source)?b.value:void 0)&&(null!==this.clause&&l.push(this.makeCode(\" from \")),l.push(this.makeCode(this.source.value)));\nl.push(this.makeCode(\";\"));return l};return b}(Y);e.ImportClause=function(a){function b(a,b){this.defaultBinding=a;this.namedImports=b}v(b,a);b.prototype.children=[\"defaultBinding\",\"namedImports\"];b.prototype.compileNode=function(a){var b=[];null!=this.defaultBinding&&(b.push.apply(b,this.defaultBinding.compileNode(a)),null!=this.namedImports&&b.push(this.makeCode(\", \")));null!=this.namedImports&&b.push.apply(b,this.namedImports.compileNode(a));return b};return b}(ta);e.ExportDeclaration=Y=function(b){function c(){return c.__super__.constructor.apply(this,\narguments)}v(c,b);c.prototype.compileNode=function(b){var d;this.checkScope(b,\"export\");var l=[];l.push(this.makeCode(this.tab+\"export \"));this instanceof J&&l.push(this.makeCode(\"default \"));this instanceof J||!(this.clause instanceof x||this.clause instanceof f)||(this.clause instanceof f&&!this.clause.variable&&this.clause.error(\"anonymous classes cannot be exported\"),l.push(this.makeCode(\"var \")),this.clause.moduleDeclaration=\"export\");l=null!=this.clause.body&&this.clause.body instanceof a?l.concat(this.clause.compileToFragments(b,\nna)):l.concat(this.clause.compileNode(b));null!=(null!=(d=this.source)?d.value:void 0)&&l.push(this.makeCode(\" from \"+this.source.value));l.push(this.makeCode(\";\"));return l};return c}(Y);e.ExportNamedDeclaration=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);return b}(Y);e.ExportDefaultDeclaration=J=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);return b}(Y);e.ExportAllDeclaration=function(a){function b(){return b.__super__.constructor.apply(this,\narguments)}v(b,a);return b}(Y);e.ModuleSpecifierList=Y=function(a){function b(a){this.specifiers=a}v(b,a);b.prototype.children=[\"specifiers\"];b.prototype.compileNode=function(a){var b;var l=[];a.indent+=Fa;var c=this.specifiers;var m=[];var e=0;for(b=c.length;e<b;e++){var f=c[e];m.push(f.compileToFragments(a,va))}if(0!==this.specifiers.length){l.push(this.makeCode(\"{\\n\"+a.indent));e=b=0;for(c=m.length;b<c;e=++b)f=m[e],e&&l.push(this.makeCode(\",\\n\"+a.indent)),l.push.apply(l,f);l.push(this.makeCode(\"\\n}\"))}else l.push(this.makeCode(\"{}\"));\nreturn l};return b}(ta);e.ImportSpecifierList=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);return b}(Y);e.ExportSpecifierList=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);return b}(Y);e.ModuleSpecifier=n=function(a){function b(a,b,c){this.original=a;this.alias=b;this.moduleDeclarationType=c;this.identifier=null!=this.alias?this.alias.value:this.original.value}v(b,a);b.prototype.children=[\"original\",\"alias\"];b.prototype.compileNode=\nfunction(a){a.scope.find(this.identifier,this.moduleDeclarationType);a=[];a.push(this.makeCode(this.original.value));null!=this.alias&&a.push(this.makeCode(\" as \"+this.alias.value));return a};return b}(ta);e.ImportSpecifier=Y=function(a){function b(a,d){b.__super__.constructor.call(this,a,d,\"import\")}v(b,a);b.prototype.compileNode=function(a){var d;(d=this.identifier,0<=R.call(a.importedSymbols,d))||a.scope.check(this.identifier)?this.error(\"'\"+this.identifier+\"' has already been declared\"):a.importedSymbols.push(this.identifier);\nreturn b.__super__.compileNode.call(this,a)};return b}(n);e.ImportDefaultSpecifier=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);return b}(Y);e.ImportNamespaceSpecifier=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);return b}(Y);e.ExportSpecifier=function(a){function b(a,d){b.__super__.constructor.call(this,a,d,\"export\")}v(b,a);return b}(n);e.Assign=x=function(a){function b(a,b,c,e){this.variable=a;this.value=b;this.context=\nc;null==e&&(e={});this.param=e.param;this.subpattern=e.subpattern;this.operatorToken=e.operatorToken;this.moduleDeclaration=e.moduleDeclaration}v(b,a);b.prototype.children=[\"variable\",\"value\"];b.prototype.isStatement=function(a){return(null!=a?a.level:void 0)===na&&null!=this.context&&(this.moduleDeclaration||0<=R.call(this.context,\"?\"))};b.prototype.checkAssignability=function(a,b){if(Object.prototype.hasOwnProperty.call(a.scope.positions,b.value)&&\"import\"===a.scope.variables[a.scope.positions[b.value]].type)return b.error(\"'\"+\nb.value+\"' is read-only\")};b.prototype.assigns=function(a){return this[\"object\"===this.context?\"value\":\"variable\"].assigns(a)};b.prototype.unfoldSoak=function(a){return Ea(a,this,\"variable\")};b.prototype.compileNode=function(a){var b,c,l,e,f,m,h;if(c=this.variable instanceof C){if(this.variable.isArray()||this.variable.isObject())return this.compilePatternMatch(a);if(this.variable.isSplice())return this.compileSplice(a);if(\"||\\x3d\"===(e=this.context)||\"\\x26\\x26\\x3d\"===e||\"?\\x3d\"===e)return this.compileConditional(a);\nif(\"**\\x3d\"===(f=this.context)||\"//\\x3d\"===f||\"%%\\x3d\"===f)return this.compileSpecialMath(a)}this.value instanceof k&&(this.value[\"static\"]?(this.value.klass=this.variable.base,this.value.name=this.variable.properties[0],this.value.variable=this.variable):2<=(null!=(m=this.variable.properties)?m.length:void 0)&&(m=this.variable.properties,e=3<=m.length?M.call(m,0,l=m.length-2):(l=0,[]),f=m[l++],l=m[l++],\"prototype\"===(null!=(h=f.name)?h.value:void 0)&&(this.value.klass=new C(this.variable.base,e),\nthis.value.name=l,this.value.variable=this.variable)));this.context||(h=this.variable.unwrapAll(),h.isAssignable()||this.variable.error(\"'\"+this.variable.compile(a)+\"' can't be assigned\"),\"function\"===typeof h.hasProperties&&h.hasProperties()||(this.moduleDeclaration?(this.checkAssignability(a,h),a.scope.add(h.value,this.moduleDeclaration)):this.param?a.scope.add(h.value,\"var\"):(this.checkAssignability(a,h),a.scope.find(h.value))));h=this.value.compileToFragments(a,va);c&&this.variable.base instanceof\nq&&(this.variable.front=!0);c=this.variable.compileToFragments(a,va);if(\"object\"===this.context){if(b=ca(c),0<=R.call(ma,b))c.unshift(this.makeCode('\"')),c.push(this.makeCode('\"'));return c.concat(this.makeCode(\": \"),h)}b=c.concat(this.makeCode(\" \"+(this.context||\"\\x3d\")+\" \"),h);return a.level<=va?b:this.wrapInBraces(b)};b.prototype.compilePatternMatch=function(a){var d,c,l;var e=a.level===na;var f=this.value;var m=this.variable.base.objects;if(!(l=m.length)){var n=f.compileToFragments(a);return a.level>=\nHa?this.wrapInBraces(n):n}var k=m[0];1===l&&k instanceof I&&k.error(\"Destructuring assignment has no target\");var q=this.variable.isObject();if(e&&1===l&&!(k instanceof T)){var p=null;if(k instanceof b&&\"object\"===k.context){n=k;var t=n.variable;var r=t.base;k=n.value;k instanceof b&&(p=k.value,k=k.variable)}else k instanceof b&&(p=k.value,k=k.variable),r=q?k[\"this\"]?k.properties[0].name:new L(k.unwrap().value):new w(0);var x=r.unwrap()instanceof L;f=new C(f);f.properties.push(new (x?ra:Q)(r));(c=\nAa(k.unwrap().value))&&k.error(c);p&&(f=new h(\"?\",f,p));return(new b(k,f,null,{param:this.param})).compileToFragments(a,na)}var v=f.compileToFragments(a,va);var u=ca(v);n=[];t=!1;f.unwrap()instanceof y&&!this.variable.assigns(u)||(n.push([this.makeCode((p=a.scope.freeVariable(\"ref\"))+\" \\x3d \")].concat(M.call(v))),v=[this.makeCode(p)],u=p);p=f=0;for(d=m.length;f<d;p=++f){k=m[p];r=p;if(!t&&k instanceof T){c=k.name.unwrap().value;k=k.unwrap();r=l+\" \\x3c\\x3d \"+u+\".length ? \"+La(\"slice\",a)+\".call(\"+u+\n\", \"+p;if(x=l-p-1){var K=a.scope.freeVariable(\"i\",{single:!0});r+=\", \"+K+\" \\x3d \"+u+\".length - \"+x+\") : (\"+K+\" \\x3d \"+p+\", [])\"}else r+=\") : []\";r=new B(r);t=K+\"++\"}else if(!t&&k instanceof I){if(x=l-p-1)1===x?t=u+\".length - 1\":(K=a.scope.freeVariable(\"i\",{single:!0}),r=new B(K+\" \\x3d \"+u+\".length - \"+x),t=K+\"++\",n.push(r.compileToFragments(a,va)));continue}else(k instanceof T||k instanceof I)&&k.error(\"multiple splats/expansions are disallowed in an assignment\"),p=null,k instanceof b&&\"object\"===\nk.context?(r=k.variable,r=r.base,k=k.value,k instanceof b&&(p=k.value,k=k.variable)):(k instanceof b&&(p=k.value,k=k.variable),r=q?k[\"this\"]?k.properties[0].name:new L(k.unwrap().value):new B(t||r)),c=k.unwrap().value,x=r.unwrap()instanceof L,r=new C(new B(u),[new (x?ra:Q)(r)]),p&&(r=new h(\"?\",r,p));null!=c&&(c=Aa(c))&&k.error(c);n.push((new b(k,r,null,{param:this.param,subpattern:!0})).compileToFragments(a,va))}e||this.subpattern||n.push(v);n=this.joinFragmentArrays(n,\", \");return a.level<va?n:this.wrapInBraces(n)};\nb.prototype.compileConditional=function(a){var d=this.variable.cacheReference(a);var c=d[0];d=d[1];c.properties.length||!(c.base instanceof B)||c.base instanceof E||a.scope.check(c.base.value)||this.variable.error('the variable \"'+c.base.value+\"\\\" can't be assigned with \"+this.context+\" because it has not been declared before\");if(0<=R.call(this.context,\"?\"))return a.isExistentialEquals=!0,(new G(new z(c),d,{type:\"if\"})).addElse(new b(d,this.value,\"\\x3d\")).compileToFragments(a);c=(new h(this.context.slice(0,\n-1),c,new b(d,this.value,\"\\x3d\"))).compileToFragments(a);return a.level<=va?c:this.wrapInBraces(c)};b.prototype.compileSpecialMath=function(a){var d=this.variable.cacheReference(a);var c=d[0];d=d[1];return(new b(c,new h(this.context.slice(0,-1),d,this.value))).compileToFragments(a)};b.prototype.compileSplice=function(a){var b=this.variable.properties.pop().range;var c=b.from;var l=b.to;var e=b.exclusive;var f=this.variable.compile(a);if(c){var m=this.cacheToCodeFragments(c.cache(a,Ha));b=m[0];m=m[1]}else b=\nm=\"0\";l?null!=c&&c.isNumber()&&l.isNumber()?(l=l.compile(a)-m,e||(l+=1)):(l=l.compile(a,Ka)+\" - \"+m,e||(l+=\" + 1\")):l=\"9e9\";e=this.value.cache(a,va);c=e[0];e=e[1];l=[].concat(this.makeCode(\"[].splice.apply(\"+f+\", [\"+b+\", \"+l+\"].concat(\"),c,this.makeCode(\")), \"),e);return a.level>na?this.wrapInBraces(l):l};return b}(ta);e.Code=k=function(b){function c(b,d,c){this.params=b||[];this.body=d||new a;this.bound=\"boundfunc\"===c;this.isGenerator=!!this.body.contains(function(a){return a instanceof h&&a.isYield()||\na instanceof S})}v(c,b);c.prototype.children=[\"params\",\"body\"];c.prototype.isStatement=function(){return!!this.ctor};c.prototype.jumps=ka;c.prototype.makeScope=function(a){return new ya(a,this.body,this)};c.prototype.compileNode=function(b){var d,l,e,f;this.bound&&null!=(d=b.scope.method)&&d.bound&&(this.context=b.scope.method.context);if(this.bound&&!this.context)return this.context=\"_this\",d=new c([new K(new y(this.context))],new a([this])),d=new za(d,[new E]),d.updateLocationDataIfMissing(this.locationData),\nd.compileNode(b);b.scope=la(b,\"classScope\")||this.makeScope(b.scope);b.scope.shared=la(b,\"sharedScope\");b.indent+=Fa;delete b.bare;delete b.isExistentialEquals;d=[];var m=[];var k=this.params;var n=0;for(e=k.length;n<e;n++){var q=k[n];q instanceof I||b.scope.parameter(q.asReference(b))}k=this.params;n=0;for(e=k.length;n<e;n++)if(q=k[n],q.splat||q instanceof I){n=this.params;var p=0;for(q=n.length;p<q;p++){var w=n[p];w instanceof I||!w.name.value||b.scope.add(w.name.value,\"var\",!0)}p=new x(new C(new r(function(){var a;\nvar d=this.params;var c=[];var l=0;for(a=d.length;l<a;l++)w=d[l],c.push(w.asReference(b));return c}.call(this))),new C(new y(\"arguments\")));break}var t=this.params;k=0;for(n=t.length;k<n;k++){q=t[k];if(q.isComplex()){var v=f=q.asReference(b);q.value&&(v=new h(\"?\",f,q.value));m.push(new x(new C(q.name),v,\"\\x3d\",{param:!0}))}else f=q,q.value&&(e=new B(f.name.value+\" \\x3d\\x3d null\"),v=new x(new C(q.name),q.value,\"\\x3d\"),m.push(new G(e,v)));p||d.push(f)}q=this.body.isEmpty();p&&m.unshift(p);m.length&&\n(l=this.body.expressions).unshift.apply(l,m);l=p=0;for(m=d.length;p<m;l=++p)w=d[l],d[l]=w.compileToFragments(b),b.scope.parameter(ca(d[l]));var u=[];this.eachParamName(function(a,b){0<=R.call(u,a)&&b.error(\"multiple parameters named \"+a);return u.push(a)});q||this.noReturn||this.body.makeReturn();l=\"function\";this.isGenerator&&(l+=\"*\");this.ctor&&(l+=\" \"+this.name);m=[this.makeCode(l+\"(\")];l=q=0;for(p=d.length;q<p;l=++q)w=d[l],l&&m.push(this.makeCode(\", \")),m.push.apply(m,w);m.push(this.makeCode(\") {\"));\nthis.body.isEmpty()||(m=m.concat(this.makeCode(\"\\n\"),this.body.compileWithDeclarations(b),this.makeCode(\"\\n\"+this.tab)));m.push(this.makeCode(\"}\"));return this.ctor?[this.makeCode(this.tab)].concat(M.call(m)):this.front||b.level>=Ka?this.wrapInBraces(m):m};c.prototype.eachParamName=function(a){var b;var c=this.params;var l=[];var e=0;for(b=c.length;e<b;e++){var f=c[e];l.push(f.eachName(a))}return l};c.prototype.traverseChildren=function(a,b){if(a)return c.__super__.traverseChildren.call(this,a,b)};\nreturn c}(ta);e.Param=K=function(a){function b(a,b,c){this.name=a;this.value=b;this.splat=c;(a=Aa(this.name.unwrapAll().value))&&this.name.error(a);this.name instanceof q&&this.name.generated&&(a=this.name.objects[0].operatorToken,a.error(\"unexpected \"+a.value))}v(b,a);b.prototype.children=[\"name\",\"value\"];b.prototype.compileToFragments=function(a){return this.name.compileToFragments(a,va)};b.prototype.asReference=function(a){if(this.reference)return this.reference;var b=this.name;b[\"this\"]?(b=b.properties[0].name.value,\n0<=R.call(ma,b)&&(b=\"_\"+b),b=new y(a.scope.freeVariable(b))):b.isComplex()&&(b=new y(a.scope.freeVariable(\"arg\")));b=new C(b);this.splat&&(b=new T(b));b.updateLocationDataIfMissing(this.locationData);return this.reference=b};b.prototype.isComplex=function(){return this.name.isComplex()};b.prototype.eachName=function(a,b){var d,c;null==b&&(b=this.name);var l=function(b){return a(\"@\"+b.properties[0].name.value,b)};if(b instanceof B)return a(b.value,b);if(b instanceof C)return l(b);b=null!=(d=b.objects)?\nd:[];d=0;for(c=b.length;d<c;d++){var e=b[d];e instanceof x&&null==e.context&&(e=e.variable);e instanceof x?(e.value instanceof x&&(e=e.value),this.eachName(a,e.value.unwrap())):e instanceof T?(e=e.name.unwrap(),a(e.value,e)):e instanceof C?e.isArray()||e.isObject()?this.eachName(a,e.base):e[\"this\"]?l(e):a(e.base.value,e.base):e instanceof I||e.error(\"illegal parameter \"+e.compile())}};return b}(ta);e.Splat=T=function(a){function b(a){this.name=a.compile?a:new B(a)}v(b,a);b.prototype.children=[\"name\"];\nb.prototype.isAssignable=ha;b.prototype.assigns=function(a){return this.name.assigns(a)};b.prototype.compileToFragments=function(a){return this.name.compileToFragments(a)};b.prototype.unwrap=function(){return this.name};b.compileSplattedArray=function(a,d,c){var e,l,f,m;for(l=-1;(e=d[++l])&&!(e instanceof b););if(l>=d.length)return[];if(1===d.length)return e=d[0],d=e.compileToFragments(a,va),c?d:[].concat(e.makeCode(La(\"slice\",a)+\".call(\"),d,e.makeCode(\")\"));c=d.slice(l);var h=f=0;for(m=c.length;f<\nm;h=++f){e=c[h];var k=e.compileToFragments(a,va);c[h]=e instanceof b?[].concat(e.makeCode(La(\"slice\",a)+\".call(\"),k,e.makeCode(\")\")):[].concat(e.makeCode(\"[\"),k,e.makeCode(\"]\"))}if(0===l)return e=d[0],a=e.joinFragmentArrays(c.slice(1),\", \"),c[0].concat(e.makeCode(\".concat(\"),a,e.makeCode(\")\"));f=d.slice(0,l);m=[];k=0;for(h=f.length;k<h;k++)e=f[k],m.push(e.compileToFragments(a,va));e=d[0].joinFragmentArrays(m,\", \");a=d[l].joinFragmentArrays(c,\", \");c=d[d.length-1];return[].concat(d[0].makeCode(\"[\"),\ne,d[l].makeCode(\"].concat(\"),a,c.makeCode(\")\"))};return b}(ta);e.Expansion=I=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);b.prototype.isComplex=ka;b.prototype.compileNode=function(a){return this.error(\"Expansion must be used inside a destructuring assignment or parameter list\")};b.prototype.asReference=function(a){return this};b.prototype.eachName=function(a){};return b}(ta);e.While=Y=function(b){function c(a,b){this.condition=null!=b&&b.invert?a.invert():a;\nthis.guard=null!=b?b.guard:void 0}v(c,b);c.prototype.children=[\"condition\",\"guard\",\"body\"];c.prototype.isStatement=ha;c.prototype.makeReturn=function(a){if(a)return c.__super__.makeReturn.apply(this,arguments);this.returns=!this.jumps({loop:!0});return this};c.prototype.addBody=function(a){this.body=a;return this};c.prototype.jumps=function(){var a;var b=this.body.expressions;if(!b.length)return!1;var c=0;for(a=b.length;c<a;c++){var e=b[c];if(e=e.jumps({loop:!0}))return e}return!1};c.prototype.compileNode=\nfunction(b){var d;b.indent+=Fa;var c=\"\";var e=this.body;e.isEmpty()?e=this.makeCode(\"\"):(this.returns&&(e.makeReturn(d=b.scope.freeVariable(\"results\")),c=\"\"+this.tab+d+\" \\x3d [];\\n\"),this.guard&&(1<e.expressions.length?e.expressions.unshift(new G((new P(this.guard)).invert(),new V(\"continue\"))):this.guard&&(e=a.wrap([new G(this.guard,e)]))),e=[].concat(this.makeCode(\"\\n\"),e.compileToFragments(b,na),this.makeCode(\"\\n\"+this.tab)));b=[].concat(this.makeCode(c+this.tab+\"while (\"),this.condition.compileToFragments(b,\nDa),this.makeCode(\") {\"),e,this.makeCode(\"}\"));this.returns&&b.push(this.makeCode(\"\\n\"+this.tab+\"return \"+d+\";\"));return b};return c}(ta);e.Op=h=function(a){function b(a,b,d,e){if(\"in\"===a)return new O(b,d);if(\"do\"===a)return this.generateDo(b);if(\"new\"===a){if(b instanceof za&&!b[\"do\"]&&!b.isNew)return b.newInstance();if(b instanceof k&&b.bound||b[\"do\"])b=new P(b)}this.operator=c[a]||a;this.first=b;this.second=d;this.flip=!!e;return this}v(b,a);var c={\"\\x3d\\x3d\":\"\\x3d\\x3d\\x3d\",\"!\\x3d\":\"!\\x3d\\x3d\",\nof:\"in\",yieldfrom:\"yield*\"};var d={\"!\\x3d\\x3d\":\"\\x3d\\x3d\\x3d\",\"\\x3d\\x3d\\x3d\":\"!\\x3d\\x3d\"};b.prototype.children=[\"first\",\"second\"];b.prototype.isNumber=function(){var a;return this.isUnary()&&(\"+\"===(a=this.operator)||\"-\"===a)&&this.first instanceof C&&this.first.isNumber()};b.prototype.isYield=function(){var a;return\"yield\"===(a=this.operator)||\"yield*\"===a};b.prototype.isUnary=function(){return!this.second};b.prototype.isComplex=function(){return!this.isNumber()};b.prototype.isChainable=function(){var a;\nreturn\"\\x3c\"===(a=this.operator)||\"\\x3e\"===a||\"\\x3e\\x3d\"===a||\"\\x3c\\x3d\"===a||\"\\x3d\\x3d\\x3d\"===a||\"!\\x3d\\x3d\"===a};b.prototype.invert=function(){var a,c;if(this.isChainable()&&this.first.isChainable()){var e=!0;for(a=this;a&&a.operator;)e&&(e=a.operator in d),a=a.first;if(!e)return(new P(this)).invert();for(a=this;a&&a.operator;)a.invert=!a.invert,a.operator=d[a.operator],a=a.first;return this}return(a=d[this.operator])?(this.operator=a,this.first.unwrap()instanceof b&&this.first.invert(),this):this.second?\n(new P(this)).invert():\"!\"===this.operator&&(e=this.first.unwrap())instanceof b&&(\"!\"===(c=e.operator)||\"in\"===c||\"instanceof\"===c)?e:new b(\"!\",this)};b.prototype.unfoldSoak=function(a){var b;return(\"++\"===(b=this.operator)||\"--\"===b||\"delete\"===b)&&Ea(a,this,\"first\")};b.prototype.generateDo=function(a){var b,d;var c=[];var e=(a instanceof x&&(b=a.value.unwrap())instanceof k?b:a).params||[];b=0;for(d=e.length;b<d;b++){var l=e[b];l.value?(c.push(l.value),delete l.value):c.push(l)}a=new za(a,c);a[\"do\"]=\n!0;return a};b.prototype.compileNode=function(a){var b;var d=this.isChainable()&&this.first.isChainable();d||(this.first.front=this.front);\"delete\"===this.operator&&a.scope.check(this.first.unwrapAll().value)&&this.error(\"delete operand may not be argument or var\");(\"--\"===(b=this.operator)||\"++\"===b)&&(b=Aa(this.first.unwrapAll().value))&&this.first.error(b);if(this.isYield())return this.compileYield(a);if(this.isUnary())return this.compileUnary(a);if(d)return this.compileChain(a);switch(this.operator){case \"?\":return this.compileExistence(a);\ncase \"**\":return this.compilePower(a);case \"//\":return this.compileFloorDivision(a);case \"%%\":return this.compileModulo(a);default:return d=this.first.compileToFragments(a,Ha),b=this.second.compileToFragments(a,Ha),d=[].concat(d,this.makeCode(\" \"+this.operator+\" \"),b),a.level<=Ha?d:this.wrapInBraces(d)}};b.prototype.compileChain=function(a){var b=this.first.second.cache(a);this.first.second=b[0];b=b[1];a=this.first.compileToFragments(a,Ha).concat(this.makeCode(\" \"+(this.invert?\"\\x26\\x26\":\"||\")+\" \"),\nb.compileToFragments(a),this.makeCode(\" \"+this.operator+\" \"),this.second.compileToFragments(a,Ha));return this.wrapInBraces(a)};b.prototype.compileExistence=function(a){if(this.first.isComplex()){var b=new y(a.scope.freeVariable(\"ref\"));var d=new P(new x(b,this.first))}else b=d=this.first;return(new G(new z(d),b,{type:\"if\"})).addElse(this.second).compileToFragments(a)};b.prototype.compileUnary=function(a){var d=[];var c=this.operator;d.push([this.makeCode(c)]);if(\"!\"===c&&this.first instanceof z)return this.first.negated=\n!this.first.negated,this.first.compileToFragments(a);if(a.level>=Ka)return(new P(this)).compileToFragments(a);var e=\"+\"===c||\"-\"===c;(\"new\"===c||\"typeof\"===c||\"delete\"===c||e&&this.first instanceof b&&this.first.operator===c)&&d.push([this.makeCode(\" \")]);if(e&&this.first instanceof b||\"new\"===c&&this.first.isStatement(a))this.first=new P(this.first);d.push(this.first.compileToFragments(a,Ha));this.flip&&d.reverse();return this.joinFragmentArrays(d,\"\")};b.prototype.compileYield=function(a){var b;\nvar d=[];var c=this.operator;null==a.scope.parent&&this.error(\"yield can only occur inside functions\");0<=R.call(Object.keys(this.first),\"expression\")&&!(this.first instanceof aa)?null!=this.first.expression&&d.push(this.first.expression.compileToFragments(a,Ha)):(a.level>=Da&&d.push([this.makeCode(\"(\")]),d.push([this.makeCode(c)]),\"\"!==(null!=(b=this.first.base)?b.value:void 0)&&d.push([this.makeCode(\" \")]),d.push(this.first.compileToFragments(a,Ha)),a.level>=Da&&d.push([this.makeCode(\")\")]));return this.joinFragmentArrays(d,\n\"\")};b.prototype.compilePower=function(a){var b=new C(new y(\"Math\"),[new ra(new L(\"pow\"))]);return(new za(b,[this.first,this.second])).compileToFragments(a)};b.prototype.compileFloorDivision=function(a){var d=new C(new y(\"Math\"),[new ra(new L(\"floor\"))]);var c=this.second.isComplex()?new P(this.second):this.second;c=new b(\"/\",this.first,c);return(new za(d,[c])).compileToFragments(a)};b.prototype.compileModulo=function(a){var b=new C(new B(La(\"modulo\",a)));return(new za(b,[this.first,this.second])).compileToFragments(a)};\nb.prototype.toString=function(a){return b.__super__.toString.call(this,a,this.constructor.name+\" \"+this.operator)};return b}(ta);e.In=O=function(a){function b(a,b){this.object=a;this.array=b}v(b,a);b.prototype.children=[\"object\",\"array\"];b.prototype.invert=sa;b.prototype.compileNode=function(a){var b;if(this.array instanceof C&&this.array.isArray()&&this.array.base.objects.length){var c=this.array.base.objects;var e=0;for(b=c.length;e<b;e++){var l=c[e];if(l instanceof T){var f=!0;break}}if(!f)return this.compileOrTest(a)}return this.compileLoopTest(a)};\nb.prototype.compileOrTest=function(a){var b,c;var e=this.object.cache(a,Ha);var f=e[0];var l=e[1];var h=this.negated?[\" !\\x3d\\x3d \",\" \\x26\\x26 \"]:[\" \\x3d\\x3d\\x3d \",\" || \"];e=h[0];h=h[1];var m=[];var k=this.array.base.objects;var n=b=0;for(c=k.length;b<c;n=++b){var q=k[n];n&&m.push(this.makeCode(h));m=m.concat(n?l:f,this.makeCode(e),q.compileToFragments(a,Ka))}return a.level<Ha?m:this.wrapInBraces(m)};b.prototype.compileLoopTest=function(a){var b=this.object.cache(a,va);var c=b[0];var e=b[1];b=[].concat(this.makeCode(La(\"indexOf\",\na)+\".call(\"),this.array.compileToFragments(a,va),this.makeCode(\", \"),e,this.makeCode(\") \"+(this.negated?\"\\x3c 0\":\"\\x3e\\x3d 0\")));if(ca(c)===ca(e))return b;b=c.concat(this.makeCode(\", \"),b);return a.level<va?b:this.wrapInBraces(b)};b.prototype.toString=function(a){return b.__super__.toString.call(this,a,this.constructor.name+(this.negated?\"!\":\"\"))};return b}(ta);e.Try=function(a){function b(a,b,c,e){this.attempt=a;this.errorVariable=b;this.recovery=c;this.ensure=e}v(b,a);b.prototype.children=[\"attempt\",\n\"recovery\",\"ensure\"];b.prototype.isStatement=ha;b.prototype.jumps=function(a){var b;return this.attempt.jumps(a)||(null!=(b=this.recovery)?b.jumps(a):void 0)};b.prototype.makeReturn=function(a){this.attempt&&(this.attempt=this.attempt.makeReturn(a));this.recovery&&(this.recovery=this.recovery.makeReturn(a));return this};b.prototype.compileNode=function(a){var b,c,e;a.indent+=Fa;var f=this.attempt.compileToFragments(a,na);var l=this.recovery?(b=a.scope.freeVariable(\"error\",{reserve:!1}),e=new y(b),\nthis.errorVariable?(c=Aa(this.errorVariable.unwrapAll().value),c?this.errorVariable.error(c):void 0,this.recovery.unshift(new x(this.errorVariable,e))):void 0,[].concat(this.makeCode(\" catch (\"),e.compileToFragments(a),this.makeCode(\") {\\n\"),this.recovery.compileToFragments(a,na),this.makeCode(\"\\n\"+this.tab+\"}\"))):this.ensure||this.recovery?[]:(b=a.scope.freeVariable(\"error\",{reserve:!1}),[this.makeCode(\" catch (\"+b+\") {}\")]);a=this.ensure?[].concat(this.makeCode(\" finally {\\n\"),this.ensure.compileToFragments(a,\nna),this.makeCode(\"\\n\"+this.tab+\"}\")):[];return[].concat(this.makeCode(this.tab+\"try {\\n\"),f,this.makeCode(\"\\n\"+this.tab+\"}\"),l,a)};return b}(ta);e.Throw=aa=function(a){function b(a){this.expression=a}v(b,a);b.prototype.children=[\"expression\"];b.prototype.isStatement=ha;b.prototype.jumps=ka;b.prototype.makeReturn=oa;b.prototype.compileNode=function(a){return[].concat(this.makeCode(this.tab+\"throw \"),this.expression.compileToFragments(a),this.makeCode(\";\"))};return b}(ta);e.Existence=z=function(a){function b(a){this.expression=\na}v(b,a);b.prototype.children=[\"expression\"];b.prototype.invert=sa;b.prototype.compileNode=function(a){this.expression.front=this.front;var b=this.expression.compile(a,Ha);if(this.expression.unwrap()instanceof y&&!a.scope.check(b)){var c=this.negated?[\"\\x3d\\x3d\\x3d\",\"||\"]:[\"!\\x3d\\x3d\",\"\\x26\\x26\"];var e=c[0];c=c[1];b=\"typeof \"+b+\" \"+e+' \"undefined\" '+c+\" \"+b+\" \"+e+\" null\"}else b=b+\" \"+(this.negated?\"\\x3d\\x3d\":\"!\\x3d\")+\" null\";return[this.makeCode(a.level<=gb?b:\"(\"+b+\")\")]};return b}(ta);e.Parens=P=\nfunction(a){function b(a){this.body=a}v(b,a);b.prototype.children=[\"body\"];b.prototype.unwrap=function(){return this.body};b.prototype.isComplex=function(){return this.body.isComplex()};b.prototype.compileNode=function(a){var b=this.body.unwrap();if(b instanceof C&&b.isAtomic())return b.front=this.front,b.compileToFragments(a);var c=b.compileToFragments(a,Da);return a.level<Ha&&(b instanceof h||b instanceof za||b instanceof N&&b.returns)&&(a.level<gb||3>=c.length)?c:this.wrapInBraces(c)};return b}(ta);\ne.StringWithInterpolations=A=function(a){function b(){return b.__super__.constructor.apply(this,arguments)}v(b,a);b.prototype.compileNode=function(a){var d;if(!a.inTaggedTemplateCall)return b.__super__.compileNode.apply(this,arguments);var c=this.body.unwrap();var e=[];c.traverseChildren(!1,function(a){if(a instanceof D)e.push(a);else if(a instanceof P)return e.push(a),!1;return!0});c=[];c.push(this.makeCode(\"`\"));var f=0;for(d=e.length;f<d;f++){var l=e[f];l instanceof D?(l=l.value.slice(1,-1),l=\nl.replace(/(\\\\*)(`|\\$\\{)/g,function(a,b,d){return 0===b.length%2?b+\"\\\\\"+d:a}),c.push(this.makeCode(l))):(c.push(this.makeCode(\"${\")),c.push.apply(c,l.compileToFragments(a,Da)),c.push(this.makeCode(\"}\")))}c.push(this.makeCode(\"`\"));return c};return b}(P);e.For=N=function(b){function c(b,d){this.source=d.source;this.guard=d.guard;this.step=d.step;this.name=d.name;this.index=d.index;this.body=a.wrap([b]);this.own=!!d.own;this.object=!!d.object;(this.from=!!d.from)&&this.index&&this.index.error(\"cannot use index with for-from\");\nthis.own&&!this.object&&d.ownTag.error(\"cannot use own with for-\"+(this.from?\"from\":\"in\"));this.object&&(b=[this.index,this.name],this.name=b[0],this.index=b[1]);this.index instanceof C&&!this.index.isAssignable()&&this.index.error(\"index cannot be a pattern matching expression\");this.range=this.source instanceof C&&this.source.base instanceof U&&!this.source.properties.length&&!this.from;this.pattern=this.name instanceof C;this.range&&this.index&&this.index.error(\"indexes do not apply to range loops\");\nthis.range&&this.pattern&&this.name.error(\"cannot pattern match over range loops\");this.returns=!1}v(c,b);c.prototype.children=[\"body\",\"source\",\"guard\",\"step\"];c.prototype.compileNode=function(b){var d,c,e,f,l,h,k;var n=a.wrap([this.body]);var m=n.expressions;m=m[m.length-1];(null!=m?m.jumps():void 0)instanceof H&&(this.returns=!1);var q=this.range?this.source.base:this.source;var p=b.scope;this.pattern||(e=this.name&&this.name.compile(b,va));m=this.index&&this.index.compile(b,va);e&&!this.pattern&&\np.find(e);!m||this.index instanceof C||p.find(m);this.returns&&(c=p.freeVariable(\"results\"));this.from?this.pattern&&(f=p.freeVariable(\"x\",{single:!0})):f=this.object&&m||p.freeVariable(\"i\",{single:!0});var w=(this.range||this.from)&&e||m||f;var r=w!==f?w+\" \\x3d \":\"\";if(this.step&&!this.range){m=this.cacheToCodeFragments(this.step.cache(b,va,Za));var t=m[0];var v=m[1];this.step.isNumber()&&(h=Number(v))}this.pattern&&(e=f);var u=m=k=\"\";var K=this.tab+Fa;if(this.range)var A=q.compileToFragments(ja(b,\n{index:f,name:e,step:this.step,isComplex:Za}));else{var z=this.source.compile(b,va);!e&&!this.own||this.source.unwrap()instanceof y||(u+=\"\"+this.tab+(q=p.freeVariable(\"ref\"))+\" \\x3d \"+z+\";\\n\",z=q);!e||this.pattern||this.from||(l=e+\" \\x3d \"+z+\"[\"+w+\"]\");this.object||this.from||(t!==v&&(u+=\"\"+this.tab+t+\";\\n\"),e=0>h,this.step&&null!=h&&e||(d=p.freeVariable(\"len\")),A=\"\"+r+f+\" \\x3d 0, \"+d+\" \\x3d \"+z+\".length\",t=\"\"+r+f+\" \\x3d \"+z+\".length - 1\",d=f+\" \\x3c \"+d,p=f+\" \\x3e\\x3d 0\",this.step?(null!=h?e&&(d=\np,A=t):(d=v+\" \\x3e 0 ? \"+d+\" : \"+p,A=\"(\"+v+\" \\x3e 0 ? (\"+A+\") : \"+t+\")\"),f=f+\" +\\x3d \"+v):f=\"\"+(w!==f?\"++\"+f:f+\"++\"),A=[this.makeCode(A+\"; \"+d+\"; \"+r+f)])}if(this.returns){var U=\"\"+this.tab+c+\" \\x3d [];\\n\";var D=\"\\n\"+this.tab+\"return \"+c+\";\";n.makeReturn(c)}this.guard&&(1<n.expressions.length?n.expressions.unshift(new G((new P(this.guard)).invert(),new V(\"continue\"))):this.guard&&(n=a.wrap([new G(this.guard,n)])));this.pattern&&n.expressions.unshift(new x(this.name,this.from?new y(w):new B(z+\"[\"+\nw+\"]\")));c=[].concat(this.makeCode(u),this.pluckDirectCall(b,n));l&&(k=\"\\n\"+K+l+\";\");this.object?(A=[this.makeCode(w+\" in \"+z)],this.own&&(m=\"\\n\"+K+\"if (!\"+La(\"hasProp\",b)+\".call(\"+z+\", \"+w+\")) continue;\")):this.from&&(A=[this.makeCode(w+\" of \"+z)]);(b=n.compileToFragments(ja(b,{indent:K}),na))&&0<b.length&&(b=[].concat(this.makeCode(\"\\n\"),b,this.makeCode(\"\\n\")));return[].concat(c,this.makeCode(\"\"+(U||\"\")+this.tab+\"for (\"),A,this.makeCode(\") {\"+m+k),b,this.makeCode(this.tab+\"}\"+(D||\"\")))};c.prototype.pluckDirectCall=\nfunction(a,b){var d,c,e,f,h,l,n;var m=[];var q=b.expressions;var p=d=0;for(c=q.length;d<c;p=++d){var w=q[p];w=w.unwrapAll();if(w instanceof za){var r=null!=(e=w.variable)?e.unwrapAll():void 0;if(r instanceof k||r instanceof C&&(null!=(f=r.base)?f.unwrapAll():void 0)instanceof k&&1===r.properties.length&&(\"call\"===(h=null!=(l=r.properties[0].name)?l.value:void 0)||\"apply\"===h)){var t=(null!=(n=r.base)?n.unwrapAll():void 0)||r;var v=new y(a.scope.freeVariable(\"fn\"));var u=new C(v);r.base&&(u=[u,r],\nr.base=u[0],u=u[1]);b.expressions[p]=new za(u,w.args);m=m.concat(this.makeCode(this.tab),(new x(v,t)).compileToFragments(a,na),this.makeCode(\";\\n\"))}}}return m};return c}(Y);e.Switch=function(b){function c(a,b,c){this.subject=a;this.cases=b;this.otherwise=c}v(c,b);c.prototype.children=[\"subject\",\"cases\",\"otherwise\"];c.prototype.isStatement=ha;c.prototype.jumps=function(a){var b,c;null==a&&(a={block:!0});var e=this.cases;var f=0;for(b=e.length;f<b;f++){var h=e[f];h=h[1];if(h=h.jumps(a))return h}return null!=\n(c=this.otherwise)?c.jumps(a):void 0};c.prototype.makeReturn=function(b){var d,c;var e=this.cases;var f=0;for(d=e.length;f<d;f++){var h=e[f];h[1].makeReturn(b)}b&&(this.otherwise||(this.otherwise=new a([new B(\"void 0\")])));null!=(c=this.otherwise)&&c.makeReturn(b);return this};c.prototype.compileNode=function(a){var b,c,e,f;var h=a.indent+Fa;var l=a.indent=h+Fa;var k=[].concat(this.makeCode(this.tab+\"switch (\"),this.subject?this.subject.compileToFragments(a,Da):this.makeCode(\"false\"),this.makeCode(\") {\\n\"));\nvar n=this.cases;var m=c=0;for(e=n.length;c<e;m=++c){var q=n[m];var p=q[0];q=q[1];var w=ia([p]);p=0;for(f=w.length;p<f;p++){var r=w[p];this.subject||(r=r.invert());k=k.concat(this.makeCode(h+\"case \"),r.compileToFragments(a,Da),this.makeCode(\":\\n\"))}0<(b=q.compileToFragments(a,na)).length&&(k=k.concat(b,this.makeCode(\"\\n\")));if(m===this.cases.length-1&&!this.otherwise)break;m=this.lastNonComment(q.expressions);m instanceof H||m instanceof B&&m.jumps()&&\"debugger\"!==m.value||k.push(r.makeCode(l+\"break;\\n\"))}this.otherwise&&\nthis.otherwise.expressions.length&&k.push.apply(k,[this.makeCode(h+\"default:\\n\")].concat(M.call(this.otherwise.compileToFragments(a,na)),[this.makeCode(\"\\n\")]));k.push(this.makeCode(this.tab+\"}\"));return k};return c}(ta);e.If=G=function(b){function c(a,b,c){this.body=b;null==c&&(c={});this.condition=\"unless\"===c.type?a.invert():a;this.elseBody=null;this.isChain=!1;this.soak=c.soak}v(c,b);c.prototype.children=[\"condition\",\"body\",\"elseBody\"];c.prototype.bodyNode=function(){var a;return null!=(a=this.body)?\na.unwrap():void 0};c.prototype.elseBodyNode=function(){var a;return null!=(a=this.elseBody)?a.unwrap():void 0};c.prototype.addElse=function(a){this.isChain?this.elseBodyNode().addElse(a):(this.isChain=a instanceof c,this.elseBody=this.ensureBlock(a),this.elseBody.updateLocationDataIfMissing(a.locationData));return this};c.prototype.isStatement=function(a){var b;return(null!=a?a.level:void 0)===na||this.bodyNode().isStatement(a)||(null!=(b=this.elseBodyNode())?b.isStatement(a):void 0)};c.prototype.jumps=\nfunction(a){var b;return this.body.jumps(a)||(null!=(b=this.elseBody)?b.jumps(a):void 0)};c.prototype.compileNode=function(a){return this.isStatement(a)?this.compileStatement(a):this.compileExpression(a)};c.prototype.makeReturn=function(b){b&&(this.elseBody||(this.elseBody=new a([new B(\"void 0\")])));this.body&&(this.body=new a([this.body.makeReturn(b)]));this.elseBody&&(this.elseBody=new a([this.elseBody.makeReturn(b)]));return this};c.prototype.ensureBlock=function(b){return b instanceof a?b:new a([b])};\nc.prototype.compileStatement=function(a){var b=la(a,\"chainChild\");if(la(a,\"isExistentialEquals\"))return(new c(this.condition.invert(),this.elseBodyNode(),{type:\"if\"})).compileToFragments(a);var e=a.indent+Fa;var f=this.condition.compileToFragments(a,Da);var h=this.ensureBlock(this.body).compileToFragments(ja(a,{indent:e}));h=[].concat(this.makeCode(\"if (\"),f,this.makeCode(\") {\\n\"),h,this.makeCode(\"\\n\"+this.tab+\"}\"));b||h.unshift(this.makeCode(this.tab));if(!this.elseBody)return h;b=h.concat(this.makeCode(\" else \"));\nthis.isChain?(a.chainChild=!0,b=b.concat(this.elseBody.unwrap().compileToFragments(a,na))):b=b.concat(this.makeCode(\"{\\n\"),this.elseBody.compileToFragments(ja(a,{indent:e}),na),this.makeCode(\"\\n\"+this.tab+\"}\"));return b};c.prototype.compileExpression=function(a){var b=this.condition.compileToFragments(a,gb);var c=this.bodyNode().compileToFragments(a,va);var e=this.elseBodyNode()?this.elseBodyNode().compileToFragments(a,va):[this.makeCode(\"void 0\")];e=b.concat(this.makeCode(\" ? \"),c,this.makeCode(\" : \"),\ne);return a.level>=gb?this.wrapInBraces(e):e};c.prototype.unfoldSoak=function(){return this.soak&&this};return c}(ta);var jc={extend:function(a){return\"function(child, parent) { for (var key in parent) { if (\"+La(\"hasProp\",a)+\".call(parent, key)) child[key] \\x3d parent[key]; } function ctor() { this.constructor \\x3d child; } ctor.prototype \\x3d parent.prototype; child.prototype \\x3d new ctor(); child.__super__ \\x3d parent.prototype; return child; }\"},bind:function(){return\"function(fn, me){ return function(){ return fn.apply(me, arguments); }; }\"},\nindexOf:function(){return\"[].indexOf || function(item) { for (var i \\x3d 0, l \\x3d this.length; i \\x3c l; i++) { if (i in this \\x26\\x26 this[i] \\x3d\\x3d\\x3d item) return i; } return -1; }\"},modulo:function(){return\"function(a, b) { return (+a % (b \\x3d +b) + b) % b; }\"},hasProp:function(){return\"{}.hasOwnProperty\"},slice:function(){return\"[].slice\"}};var na=1;var Da=2;var va=3;var gb=4;var Ha=5;var Ka=6;var Fa=\"  \";var Ra=/^[+-]?\\d+$/;var La=function(a,b){var c=b.scope.root;if(a in c.utilities)return c.utilities[a];\nvar d=c.freeVariable(a);c.assign(d,jc[a](b));return c.utilities[a]=d};var Ga=function(a,b){a=a.replace(/\\n/g,\"$\\x26\"+b);return a.replace(/\\s+$/,\"\")};var Wa=function(a){return a instanceof y&&\"arguments\"===a.value};var da=function(a){return a instanceof E||a instanceof k&&a.bound||a instanceof xa};var Za=function(a){return a.isComplex()||(\"function\"===typeof a.isAssignable?a.isAssignable():void 0)};var Ea=function(a,b,c){if(a=b[c].unfoldSoak(a))return b[c]=a.body,a.body=new C(b),a}}).call(this);return e}();\nu[\"./sourcemap\"]=function(){var e={};(function(){var u=function(){function e(e){this.line=e;this.columns=[]}e.prototype.add=function(e,a,b){var r=a[0];a=a[1];null==b&&(b={});if(!this.columns[e]||!b.noReplace)return this.columns[e]={line:this.line,column:e,sourceLine:r,sourceColumn:a}};e.prototype.sourceLocation=function(e){for(var a;!((a=this.columns[e])||0>=e);)e--;return a&&[a.sourceLine,a.sourceColumn]};return e}();e=function(){function e(){this.lines=[]}e.prototype.add=function(e,a,b){var r;null==\nb&&(b={});var f=a[0];a=a[1];return((r=this.lines)[f]||(r[f]=new u(f))).add(a,e,b)};e.prototype.sourceLocation=function(e){var a;var b=e[0];for(e=e[1];!((a=this.lines[b])||0>=b);)b--;return a&&a.sourceLocation(e)};e.prototype.generate=function(e,a){var b,r,f,k,t,p,u;null==e&&(e={});null==a&&(a=null);var x=f=r=u=0;var J=!1;var F=\"\";var N=this.lines;var y=b=0;for(k=N.length;b<k;y=++b)if(y=N[y]){var G=y.columns;y=0;for(t=G.length;y<t;y++)if(p=G[y]){for(;u<p.line;)r=0,J=!1,F+=\";\",u++;J&&(F+=\",\");F+=this.encodeVlq(p.column-\nr);r=p.column;F+=this.encodeVlq(0);F+=this.encodeVlq(p.sourceLine-f);f=p.sourceLine;F+=this.encodeVlq(p.sourceColumn-x);x=p.sourceColumn;J=!0}}F={version:3,file:e.generatedFile||\"\",sourceRoot:e.sourceRoot||\"\",sources:e.sourceFiles||[\"\"],names:[],mappings:F};e.inlineMap&&(F.sourcesContent=[a]);return F};e.prototype.encodeVlq=function(e){var a;var b=\"\";for(a=(Math.abs(e)<<1)+(0>e?1:0);a||!b;)e=a&31,(a>>=5)&&(e|=32),b+=this.encodeBase64(e);return b};e.prototype.encodeBase64=function(e){var a;if(!(a=\n\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"[e]))throw Error(\"Cannot Base64 encode value: \"+e);return a};return e}()}).call(this);return e}();u[\"./coffee-script\"]=function(){var e={};(function(){var ra,r,x={}.hasOwnProperty;var a=u(\"fs\");var b=u(\"vm\");var za=u(\"path\");var f=u(\"./lexer\").Lexer;var k=u(\"./parser\").parser;var t=u(\"./helpers\");var p=u(\"./sourcemap\");var z=u(\"../../package.json\");e.VERSION=z.version;e.FILE_EXTENSIONS=[\".coffee\",\".litcoffee\",\".coffee.md\"];e.helpers=\nt;var I=function(a){switch(!1){case \"function\"!==typeof Buffer:return(new Buffer(a)).toString(\"base64\");case \"function\"!==typeof btoa:return btoa(encodeURIComponent(a).replace(/%([0-9A-F]{2})/g,function(a,b){return String.fromCharCode(\"0x\"+b)}));default:throw Error(\"Unable to base64 encode inline sourcemap.\");}};z=function(a){return function(b,e){null==e&&(e={});try{return a.call(this,b,e)}catch(h){var c=h;if(\"string\"!==typeof b)throw c;throw t.updateSyntaxError(c,b,e.filename);}}};var J={};var F=\n{};e.compile=ra=z(function(a,b){var c,e,f,n;var r=t.extend;b=r({},b);var u=b.sourceMap||b.inlineMap||null==b.filename;r=b.filename||\"\\x3canonymous\\x3e\";J[r]=a;u&&(f=new p);var y=O.tokenize(a,b);var x=b;var z=[];var B=0;for(c=y.length;B<c;B++){var G=y[B];\"IDENTIFIER\"===G[0]&&z.push(G[1])}x.referencedVars=z;if(null==b.bare||!0!==b.bare)for(x=0,B=y.length;x<B;x++)if(G=y[x],\"IMPORT\"===(e=G[0])||\"EXPORT\"===e){b.bare=!0;break}B=k.parse(y).compileToFragments(b);y=0;b.header&&(y+=1);b.shiftLine&&(y+=1);G=\n0;e=\"\";c=0;for(z=B.length;c<z;c++){x=B[c];if(u){x.locationData&&!/^[;\\s]*$/.test(x.code)&&f.add([x.locationData.first_line,x.locationData.first_column],[y,G],{noReplace:!0});var N=t.count(x.code,\"\\n\");y+=N;G=N?x.code.length-(x.code.lastIndexOf(\"\\n\")+1):G+x.code.length}e+=x.code}b.header&&(G=\"Generated by CoffeeScript \"+this.VERSION,e=\"// \"+G+\"\\n\"+e);if(u){var D=f.generate(b,a);F[r]=f}b.inlineMap&&(a=I(JSON.stringify(D)),r=\"//# sourceURL\\x3d\"+(null!=(n=b.filename)?n:\"coffeescript\"),e=e+\"\\n\"+(\"//# sourceMappingURL\\x3ddata:application/json;base64,\"+\na)+\"\\n\"+r);return b.sourceMap?{js:e,sourceMap:f,v3SourceMap:JSON.stringify(D,null,2)}:e});e.tokens=z(function(a,b){return O.tokenize(a,b)});e.nodes=z(function(a,b){return\"string\"===typeof a?k.parse(O.tokenize(a,b)):k.parse(a)});e.run=function(b,c){var e;null==c&&(c={});var f=u.main;f.filename=process.argv[1]=c.filename?a.realpathSync(c.filename):\"\\x3canonymous\\x3e\";f.moduleCache&&(f.moduleCache={});var h=null!=c.filename?za.dirname(a.realpathSync(c.filename)):a.realpathSync(\".\");f.paths=u(\"module\")._nodeModulePaths(h);\nif(!t.isCoffee(f.filename)||u.extensions)b=ra(b,c),b=null!=(e=b.js)?e:b;return f._compile(b,f.filename)};e.eval=function(a,c){var e,f,h,k,n;null==c&&(c={});if(a=a.trim()){var p=null!=(h=b.Script.createContext)?h:b.createContext;h=null!=(f=b.isContext)?f:function(a){return c.sandbox instanceof p().constructor};if(p){if(null!=c.sandbox){if(h(c.sandbox))var r=c.sandbox;else for(k in r=p(),h=c.sandbox,h)x.call(h,k)&&(f=h[k],r[k]=f);r.global=r.root=r.GLOBAL=r}else r=global;r.__filename=c.filename||\"eval\";\nr.__dirname=za.dirname(r.__filename);if(r===global&&!r.module&&!r.require){var t=u(\"module\");r.module=e=new t(c.modulename||\"eval\");r.require=f=function(a){return t._load(a,e,!0)};e.filename=r.__filename;var y=Object.getOwnPropertyNames(u);h=0;for(n=y.length;h<n;h++){var z=y[h];\"paths\"!==z&&\"arguments\"!==z&&\"caller\"!==z&&(f[z]=u[z])}f.paths=e.paths=t._nodeModulePaths(process.cwd());f.resolve=function(a){return t._resolveFilename(a,e)}}}h={};for(k in c)x.call(c,k)&&(f=c[k],h[k]=f);h.bare=!0;a=ra(a,\nh);return r===global?b.runInThisContext(a):b.runInContext(a,r)}};e.register=function(){return u(\"./register\")};if(u.extensions){var N=this.FILE_EXTENSIONS;var y=function(a){var b;return null!=(b=u.extensions)[a]?b[a]:b[a]=function(){throw Error(\"Use CoffeeScript.register() or require the coffee-script/register module to require \"+a+\" files.\");}};var G=0;for(r=N.length;G<r;G++)z=N[G],y(z)}e._compileFile=function(b,c,e){null==c&&(c=!1);null==e&&(e=!1);var f=a.readFileSync(b,\"utf8\");f=65279===f.charCodeAt(0)?\nf.substring(1):f;try{var h=ra(f,{filename:b,sourceMap:c,inlineMap:e,sourceFiles:[b],literate:t.isLiterate(b)})}catch(K){throw c=K,t.updateSyntaxError(c,f,b);}return h};var O=new f;k.lexer={lex:function(){var a;if(a=k.tokens[this.pos++]){var b=a[0];this.yytext=a[1];this.yylloc=a[2];k.errorToken=a.origin||a;this.yylineno=this.yylloc.first_line}else b=\"\";return b},setInput:function(a){k.tokens=a;return this.pos=0},upcomingInput:function(){return\"\"}};k.yy=u(\"./nodes\");k.yy.parseError=function(a,b){var c=\nk.errorToken;var e=k.tokens;var f=c[0];var n=c[1];a=c[2];n=function(){switch(!1){case c!==e[e.length-1]:return\"end of input\";case \"INDENT\"!==f&&\"OUTDENT\"!==f:return\"indentation\";case \"IDENTIFIER\"!==f&&\"NUMBER\"!==f&&\"INFINITY\"!==f&&\"STRING\"!==f&&\"STRING_START\"!==f&&\"REGEX\"!==f&&\"REGEX_START\"!==f:return f.replace(/_START$/,\"\").toLowerCase();default:return t.nameWhitespaceCharacter(n)}}();return t.throwSyntaxError(\"unexpected \"+n,a)};var Q=function(a,b){var c;if(a.isNative())var e=\"native\";else{a.isEval()?\n(c=a.getScriptNameOrSourceURL())||a.getEvalOrigin():c=a.getFileName();c||(c=\"\\x3canonymous\\x3e\");var f=a.getLineNumber();e=a.getColumnNumber();e=(b=b(c,f,e))?c+\":\"+b[0]+\":\"+b[1]:c+\":\"+f+\":\"+e}c=a.getFunctionName();f=a.isConstructor();if(a.isToplevel()||f)return f?\"new \"+(c||\"\\x3canonymous\\x3e\")+\" (\"+e+\")\":c?c+\" (\"+e+\")\":e;f=a.getMethodName();var k=a.getTypeName();return c?(b=a=\"\",k&&c.indexOf(k)&&(b=k+\".\"),f&&c.indexOf(\".\"+f)!==c.length-f.length-1&&(a=\" [as \"+f+\"]\"),\"\"+b+c+a+\" (\"+e+\")\"):k+\".\"+(f||\n\"\\x3canonymous\\x3e\")+\" (\"+e+\")\"};var B=function(a){return null!=F[a]?F[a]:null!=F[\"\\x3canonymous\\x3e\"]?F[\"\\x3canonymous\\x3e\"]:null!=J[a]?(a=ra(J[a],{filename:a,sourceMap:!0,literate:t.isLiterate(a)}),a.sourceMap):null};Error.prepareStackTrace=function(a,b){var c;var f=function(a,b,c){var e;a=B(a);null!=a&&(e=a.sourceLocation([b-1,c-1]));return null!=e?[e[0]+1,e[1]+1]:null};var h=function(){var a;var h=[];var k=0;for(a=b.length;k<a;k++){c=b[k];if(c.getFunction()===e.run)break;h.push(\"    at \"+Q(c,\nf))}return h}();return a.toString()+\"\\n\"+h.join(\"\\n\")+\"\\n\"}}).call(this);return e}();u[\"./browser\"]=function(){(function(){var e=[].indexOf||function(a){for(var b=0,e=this.length;b<e;b++)if(b in this&&this[b]===a)return b;return-1};var ra=u(\"./coffee-script\");ra.require=u;var r=ra.compile;ra.eval=function(a,b){null==b&&(b={});null==b.bare&&(b.bare=!0);return eval(r(a,b))};ra.run=function(a,b){null==b&&(b={});b.bare=!0;b.shiftLine=!0;return Function(r(a,b))()};if(\"undefined\"!==typeof window&&null!==\nwindow){\"undefined\"!==typeof btoa&&null!==btoa&&\"undefined\"!==typeof JSON&&null!==JSON&&(r=function(a,b){null==b&&(b={});b.inlineMap=!0;return ra.compile(a,b)});ra.load=function(a,b,e,f){null==e&&(e={});null==f&&(f=!1);e.sourceFiles=[a];var k=window.ActiveXObject?new window.ActiveXObject(\"Microsoft.XMLHTTP\"):new window.XMLHttpRequest;k.open(\"GET\",a,!0);\"overrideMimeType\"in k&&k.overrideMimeType(\"text/plain\");k.onreadystatechange=function(){var r;if(4===k.readyState){if(0===(r=k.status)||200===r)r=\n[k.responseText,e],f||ra.run.apply(ra,r);else throw Error(\"Could not load \"+a);if(b)return b(r)}};return k.send(null)};var x=function(){var a,b,r;var f=window.document.getElementsByTagName(\"script\");var k=[\"text/coffeescript\",\"text/literate-coffeescript\"];var t=function(){var a,b;var p=[];var t=0;for(a=f.length;t<a;t++)r=f[t],(b=r.type,0<=e.call(k,b))&&p.push(r);return p}();var p=0;var u=function(){var a=t[p];if(a instanceof Array)return ra.run.apply(ra,a),p++,u()};var x=function(a,b){var e;var f=\n{literate:a.type===k[1]};if(e=a.src||a.getAttribute(\"data-src\"))return ra.load(e,function(a){t[b]=a;return u()},f,!0);f.sourceFiles=[\"embedded\"];return t[b]=[a.innerHTML,f]};var J=a=0;for(b=t.length;a<b;J=++a){var F=t[J];x(F,J)}return u()};window.addEventListener?window.addEventListener(\"DOMContentLoaded\",x,!1):window.attachEvent(\"onload\",x)}}).call(this);return{}}();return u[\"./coffee-script\"]}();\"function\"===typeof define&&define.amd?define(function(){return xa}):u.CoffeeScript=xa})(this);"
  },
  {
    "path": "docs/v1/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv=\"content-type\" content=\"text/html;charset=UTF-8\" />\n<title>CoffeeScript</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<link rel=\"canonical\" href=\"http://coffeescript.org\" />\n\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/apple-touch-icon.png\">\n<link rel=\"icon\" type=\"image/png\" href=\"/favicon-32x32.png\" sizes=\"32x32\">\n<link rel=\"icon\" type=\"image/png\" href=\"/favicon-16x16.png\" sizes=\"16x16\">\n<link rel=\"manifest\" href=\"/manifest.json\">\n<link rel=\"mask-icon\" href=\"/safari-pinned-tab.svg\" color=\"#5bbad5\">\n<meta name=\"theme-color\" content=\"#ffffff\">\n\n<style>\nbody {\n  font-size: 14px;\n  line-height: 21px;\n  color: #333;\n  background: #f6f6f6 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAADCAIAAABee8vuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAB1JREFUeNpi/P79O8PgAyzMzMyD0FlMDIMSAAQYAC22AvZUamhbAAAAAElFTkSuQmCC);\n  font-family: \"Helvetica Neue\", \"Lucida Grande\", \"Lucida Sans Unicode\", Helvetica, Arial, sans-serif !important;\n}\n.container {\n  width: 950px;\n  margin: 0;\n  padding: 80px 0px 50px 50px;\n  clear: both;\n}\np, li {\n  width: 625px;\n}\na {\n  color: #191933;\n}\nh1, h2, h3, h4, h5, h6, b.header {\n  color: #000;\n  margin-top: 40px;\n  margin-bottom: 15px;\n  text-shadow: #fff 0 1px 1px;\n}\nh2 {\n  font-size: 18px;\n}\nh3 {\n  font-size: 14px;\n}\nbr.clear {\n  height: 0;\n  clear: both;\n}\nul {\n  padding-left: 20px;\n}\nb.header {\n  display: block;\n}\nli {\n  margin-bottom: 10px;\n}\ntable {\n  margin: 16px 0 0 13px; padding: 0;\n}\n  tr, td {\n    margin: 0; padding: 0;\n  }\n    td {\n      padding: 9px 15px 9px 0;\n      vertical-align: top;\n    }\n    th {\n      text-align: left;\n    }\ntable.definitions {\n  width: auto;\n  margin: 30px 0;\n  border-left: 5px solid rgba(0,0,0,0.2);;\n}\n  table.definitions td {\n    text-align: center;\n    padding: 5px 20px;\n  }\nblockquote {\n  margin-left: 0;\n  margin-right: 0;\n}\ncode, pre, pre > code, textarea {\n  font-family: Monaco, Consolas, \"Lucida Console\", monospace;\n  font-size: 12px;\n  line-height: 18px;\n  color: #155;\n  white-space: pre-wrap;\n  word-wrap: break-word;\n}\n  p > code, li > code {\n    display: inline-block;\n    background: #fff;\n    border: 1px solid #dedede;\n    padding: 0px 0.2em;\n  }\n  blockquote > pre {\n    margin: 0;\n    border-left: 5px solid rgba(0,0,0,0.2);\n    padding: 3px 0 3px 12px;\n    font-size: 12px;\n  }\n  td code {\n    white-space: nowrap;\n  }\n.timestamp {\n  font-size: 11px;\n  font-weight: normal;\n  text-transform: uppercase;\n}\n.nowrap {\n  white-space: nowrap;\n}\ndiv.anchor {\n  position: relative;\n  top: -90px;\n  margin: 0 0 -20px;\n}\ndiv.code {\n  position: relative;\n  background: #fff;\n  border: 1px solid #d8d8d8;\n  -webkit-box-shadow: 0px 0px 4px rgba(0,0,0,0.23);\n  -moz-box-shadow: 0px 0px 4px rgba(0,0,0,0.23);\n  box-shadow: 0px 0px 4px rgba(0,0,0,0.23);\n  zoom: 1;\n}\n  div.code .minibutton {\n    text-transform: none;\n    position: absolute;\n    right: 8px; bottom: 8px;\n  }\n  div.code .load {\n    left: 8px; right: auto;\n  }\n  div.code pre, div.code textarea {\n    float: left;\n    width: 450px;\n    background: #fff;\n    border: 1px dotted #d0d0d0;\n    border-top-width: 0;\n    border-bottom-width: 0;\n    border-right-width: 0;\n    margin: 15px 3px;\n    padding: 0 0 26px 12px;\n  }\n    div.code pre:first-child {\n      border-left: 0;\n    }\n\n#fadeout {\n  z-index: 50;\n  position: fixed;\n  left: 0; top: 0; right: 0;\n  height: 100px;\n  background: -webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 255)), to(rgba(255, 255, 255, 0)));\n  background: -moz-linear-gradient(top, rgba(255, 255, 255, 255), rgba(255, 255, 255, 0));\n}\n\n#flybar {\n  position: fixed;\n  z-index: 100;\n  height: 50px;\n  min-width: 490px;\n  left: 40px; right: 40px; top: 25px;\n  background: #eee;\n  background: -webkit-gradient(linear, left top, left bottom, from(#f8f8f8), to(#dadada));\n  background: -moz-linear-gradient(top, #f8f8f8, #dadada);\n  border: 1px solid #aaa;\n  border-top: 1px solid #bbb;\n  border-bottom: 1px solid #888;\n  -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px;\n  -webkit-box-shadow: 0 3px 5px rgba(0,0,0,0.1);\n  -moz-box-shadow: 0 3px 5px rgba(0,0,0,0.1);\n  box-shadow: 0 3px 5px rgba(0,0,0,0.1);\n}\n  #logo {\n    display: block;\n    outline: none;\n    float: left;\n    width: 242px;\n    margin-left: 10px;\n  }\n    #logo svg {\n      width: 225px;\n      height: 40px;\n      margin: 5px 0 0 3px;\n    }\n    #logo path {\n      fill: #28334C;\n    }\n  .navigation {\n    height: 50px;\n    font-size: 11px;\n    line-height: 50px;\n    text-transform: uppercase;\n    position: relative;\n    float: left;\n    padding: 0 20px;\n    border: 1px solid #aaa;\n    border-top: 0; border-bottom: 0; border-left-width: 0;\n    cursor: pointer;\n  }\n    .navigation.toc {\n      border-left-width: 1px;\n    }\n    .navigation:hover,\n    .navigation.active {\n      background: #eee;\n      background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#f8f8f8));\n      background: -moz-linear-gradient(top, #eee, #f8f8f8);\n    }\n      .navigation.active {\n        height: 51px;\n        color: #000;\n        background: -webkit-gradient(linear, left top, left bottom, from(#e5e5e5), to(#fff));\n        background: -moz-linear-gradient(top, #e5e5e5, #fff);\n      }\n    .navigation .button {\n      font-weight: bold;\n    }\n      .navigation .button::selection {\n        background: transparent;\n      }\n    .navigation .contents {\n      display: none;\n      position: absolute;\n      background: #fff;\n      opacity: 0.97;\n      top: 51px; left: 0;\n      padding: 5px 0;\n      margin-left: -1px;\n      border: 1px solid #aaa;\n      -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px;\n      -webkit-box-shadow: 0 3px 5px rgba(0,0,0,0.2);\n      -moz-box-shadow: 0 3px 5px rgba(0,0,0,0.2);\n      box-shadow: 0 3px 5px rgba(0,0,0,0.2);\n    }\n      .navigation .contents a {\n        display: block;\n        width: 290px;\n        text-transform: none;\n        text-decoration: none;\n        height: 12px;\n        line-height: 12px;\n        padding: 4px 10px;\n        border: 1px solid transparent;\n        border-left: 0; border-right: 0;\n      }\n        .navigation .contents a:hover {\n          border-color: #ddd;\n          background: #eee;\n        }\n      .navigation.active .contents {\n        display: block;\n      }\n      .navigation .contents.menu {\n        z-index: 100;\n        border-top: 0;\n        -webkit-border-top-left-radius: 0; -moz-border-radius-topleft: 0; border-top-left-radius: 0;\n        -webkit-border-top-right-radius: 0; -moz-border-radius-topright: 0; border-top-right-radius: 0;\n      }\n      .navigation .contents.repl_wrapper {\n        padding: 0;\n        position: fixed;\n        width: auto; height: auto;\n        left: 40px; top: 90px; right: 40px; bottom: 30px;\n        background: -webkit-gradient(linear, left top, left bottom, from(#fafafa), to(#eaeaea));\n      }\n        .navigation .repl_bridge {\n          position: absolute;\n          height: 12px;\n          left: -1px; right: -1px;\n          bottom: -14px;\n          border: 1px solid #aaa;\n          z-index: 5;\n          background: #fff;\n          display: none;\n          border-top-color: #fff; border-bottom-color: #fff;\n        }\n          .navigation.active .repl_bridge {\n            display: block;\n          }\n        .navigation .code .minibutton {\n          top: 10px; right: 10px;\n          width: 40px;\n          text-transform: none;\n        }\n          .navigation .code a.minibutton.permalink {\n            top: 38px;\n            display: block;\n          }\n\n.bookmark {\n  display: block;\n  width: 0; height: 0;\n  position: relative;\n  top: -90px;\n}\n\n.navigation .contents.repl_wrapper .code {\n  cursor: text;\n  -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none;\n  background: #181a3a url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACZJREFUeNpi/P//PyMDBYCJgULAAsQD64JRL1ApDP6PeoEyABBgAKOyBSJI2bJcAAAAAElFTkSuQmCC);\n  border: 2px solid #555;\n  padding: 0;\n  position: absolute;\n  top: 15px; left: 15px; right: 15px; bottom: 15px;\n}\n  .repl_wrapper .screenshadow {\n    position: absolute;\n    width: 200px; height: 150px;\n    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsCAYAAADtt+XCAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEQZJREFUeNrs3Qly27i6gFGKouwF3DV09r+erOTFmp7oBtMIo5HiAIDnVKXct+t2LGvApx8k5c0///zzv4p3Hds/m83m++v5wl2Sv58/f361X3/8+PHh3sjf5fW5uXzZXl6e2/Zr+MMbGnfBeNHQjeyce19v/btDu/5061C8Jl35d6T6YP/7Am0fy4OYCMgSTiEaB9HIJgrPRuLR4373ze0TcRGb9GPShJDU7iEBGXNBOoYn2kE0kng8zlf++dr/XnKSuRebzY3/vRGY5WMSQtLFxOMhIIPE0TiFJ5p7ZblAvDo15PDzPTPNCMz8Mdm3fy6v/boXEwTk4VaFLaplI3F239wN5UZcZotJux58XdaDNii2uATkuWlDNEYPhUjMM8FcC4qwjDOVdFtcphIB+f1CPISzqBzbEIqS4yIs00wlTTiLq1nrfbnGgJyiaeMoGm/HQijyD4uoDJtKumMl22gqWdX21poCYptKLHgcFlF5PSbdNWH7tW1vrSEgwiEWiMocIem2tw5rCUnJATlUrt14tFCcosXi5C7hhajUUVxqQbkakngiKXKtLfGHEg7TBdM79aZ8U8rfIfk+TtKbSIpac0v6YY7Rg7X2cAgGS08pgnI7JLuqkK2tEgLSHePYrzwcJ8Ego6Cs7mK8Xkh2VQHHSHIOyCl6MNZ4cLx7gZ4Eg4yDUq9tOgkh+epNJFkGtcn0ibgPE8fawmHKoMQ3QKucTnpnbe1CSLIKaW4B6SaOw0rCYcrAdFL4dBJC8qv9VIxoIhGQER3DRwfsVxAO0UBQ/p5Oio9J+8Y4+iDXLA60px6QP45zFP6C6W9PAbe3uoq89iS8Qd73ppFkt/RSDkhb46+CP69KNGBYTKob00lJIemOj7Tr30eqa3WKN+qP03ILfjclGjBuTIrb5mrfQF/Wwv9L9bTf1ALSnV1V2tRxEg2Y5Y1ZPJUUcTZXdNrvMTpbS0B6U0cXj5Ke1KfoKzBvTOqqoC2uMI0cw6f/JnGQPYWAlDR12KKCtCb/qipoiys6yH5KYRppFn5w94Uc6zBtgKlk7mnkFA62L3am1lIB6Q6S535BoGMbkP9UkuWxkujYyCk6yF58QPbh9Nxc36nH72ZMG1DGVJLt9la4APEUgjLrltacATlF8cj1CWebCsqcSrLe3mrfkIfTfWfd0porIMcQjhy3rOJpwzYVlB2S6spUkktE2i/dllZ78eHkZ2nNEZDfV5QLB5DJa/+YcUjaNfc8xxXsUwfkK8TjnNmTRziAbEMSXcHeRuQjt4Cco3gIByAk80fkfFmDf4U38B9T3OYpAvL9IWBVPh+9LhxAkSHpjouE2/5RjXxwfewj9d8Hy9t4ZPKEOIUnxFE8gBdD0sUkB/uwNo96LHrMCeT3mVaZhMN1HMAY60hdZXBB4mVt3kcH10c5Q2usgBzDXlvqZ1rZrgKmCEl3YWLS21rRGVqfY0RkjGLmEg/bVcCUb06z2NYKZ2j9qkbYzno3IIcM4tE+sIfwx5YVMPUb1W69SfaNahSRtw45vBOQYwYXCJ6EA7D23IzIWwfWhwYk9W2rcw7vAoCiJb8OvbudNSQgqU8epg7AmjTDJPJqQE6Jn6pr6gBSn0ZSjMghROSlyNUv3gGpxuNs6gAymkaSe5Mb1vavV27bK9eBpHqFeXfanKkDyCUi3TUj28RuW7vGt9exfI45gXyF8SbFqcN1HUBuuutGkptGwlr/1Hr/TEAOCX6qrgPlQCnTSFJrWbvWh4g8PFzxKCDHxH6fR7LVBnhjXUtqNyV8FPzDM7PuBaT9C/YJna4bfxQJQGmS+iiUcHrv/l7U7h1EbyePfUJ3rAPlQOniD2Zc/AB7aMDNg+q3JpBDKI/RDmD+dS+ZrfrQgsOzATklctzjVOX1C1sAilsDo+Mhp2cCksJxj9x+2xfAlBFZdE0OTdg/CkgKW1eOdwBE63cUksVc28qKA7L01pXjHQC318dFj4tc28qKA7Lk1tW5smUF8MhpyTfZ/a2sLiDt+b5LfUiieABkEpHQimMckHb6OC14R4gHQAZrZ2jFvgvIYaHp4xT9ASCTNTQ049CEjys5r+UHBygsIp16rm8aDqjvmwV+QZR4AOQfkUOzwA8qHgAFRGTOgJzFA2DyiGzCn8nNVSqn6gLME5HZTvGdIyDiAVBgROYIiHgALBORrAMiHgCFRmTKgPj1swDLmnQdniogzrYCSGcSmWQ9niIg3em6PpIdYHmTrclTBMRxD4D0ppDRt7LGDoh4AKwkIvXIN048ANKOyGjr9FgBcdwDIH2jrtVjBcT0AbCyKaQe6ca43gMgH6Mcr343IGeTB0C2k8hbW1n1CDdAQADyDMhb63e95DcHIN+IDA2Is64A8vfWWj40IKYPgJVPIUMC4sA5QHkReXkKGRKQ2X5dIgCz6H5z7KQBcdwDoNyIvLS7JCAATB4QB84ByvbSOv9qQAAoPyKjBsT0AWAKGRwQAEwhLwXE9AFgChkcEABMIS8FxGm7AOv08LTe+om/QEAA1hmQ89CA+MwrgHW7uwtVD/0PAVjFFHIaOoEAICIvBcSpuwDc7UFt+gBgyBRS3/g/mj4AiKeQ87MBMYEAcLcL9Y3SAMDdNtSmDwCGTCECAsAoAbF9BcAtp0cTCADcmkKuBsRHlwDwKCCnawERDwCenkIEBIC3AuLsKwCeDchZQAAYJSAA8GxEBAQAAQFg5oA4/gHAqwE51+IBwJCICAgAAgLAvAEBgJeZQAAYNIFszmf9AGDYBAIAAgKAgAAgIAAICAAICAACAoCAACAgAAgIAAgIAAICgIAAICAACAgACAgAAgKAgAAgIAAICAAICAACAoCAACAgAAgIAAgIAAICgIAAICAACAgACAgAAgKAgAAgIAAICAAICAACAoCAACAgAAiIuwAAAQFAQAAQEAAEBAAEBAABAUBAABAQAAQEAAQEAAEBQEAAEBAABAQABAQAAQFAQAAQEAAEBAAEBAABASAJzY8fPzaXr2d3Bfzp58+f318vrxF3Bvxt004gG/cDAEMCAgAvM4EAMHgCERAABASAeQMiIgA8HY8qOoguIAC8EpBKQAAQEACWCYiIAPBMPAQEgPcDUgkIAE8GpBIQAEYJiIsKAXgUj/paQEwhADw1fVwLiE/nBeCW+l4wnI0FwK3pYyMgAIwekFv/DoB1q5+JhSkEgIdduBUQUwgAcSueCkhlAgHgURPqO7UxhQBwswf1q8UBwPTxKCA+2gRAPOohAXEwHWDd6qETSBcRUwjAOqePzaO6DK4PAEUHpH4nIM/+fwAoS/32/6FySi/AGuMxSkBMIQCmj7cCIiIApo9Bk4WAAJg+BgdERABMH4OmCqf1ApTp5YvHBQSAWQLS2ooIQHHx2L76H9UDv5FjIQDlGLS7VL/xzUQEoIx41EP/w6HjjuMhAHl7ay1/Z4owhQCsdPp4NyAiArDSeIwREAfUAfINyObdv2CMG7H1WABkYzvG+j/W9GArCyCfyaMe6y8ag7OyANI36lo95tRgCgFYyfQxdkBa20pEAFKNx3bsv3BsIgJQeDymCojjIQDpmGxNnmpScDwEIJ3po57qL57KtnJ9CMCSJl2H6xluvEkEYJnJYzv1N5ijgCICUFA85grIRkQAZo/HZo5vNAcRASgoHnMGpIuIs7MAplvPZ72EolngB+ycPN4Ao8Zj1jfo9WazadbwgwKIx3jadtTn83l3+YfNGn5gAPEYJR6bth3tN20u/9Cs5QcHEI/3hGY03Tdup5B6oTvA2VkAmaydoRW7Kvrm24WmkO/bIyIAL8djkQ+sDa3YVr1Fu51ClvrsKhEBSDweoRG7+Mb8/udLWT4WOKAeR6RZ8s4BSFT3JrtZMB7tgfOPuBv9d/ztAfXdwndUN4mICMB/F2Ev+unmoQ1NfxzqW3IrK46ILS1g7eoqgV+N0d+6uheQpbey+neciABrjseia+C1rat7AWmlsJXVjW6OiwBrsvjxjti1ratHAWm1U8gukTvUlhawpqkjid/mGhrwce/G3vxvw8ecbN2xAOt6o9yu/WH62AwJyPcPlMjxkCRHO4CR1rWktuqj4x7bR+/qH2lCRFIb85rKlhaQt+TWsnatD/Fonrnxz/gIf6FqA4yzfiW5mxLW+qfW+1c+/6r9C8+XP/vEHohuz/BY+SVVQB5TR6pvfHfPxuOVCaQr5scCv4DqlWnElhaQejySPIYb1vaPV27bqwtud5Fhk+iD01QOsAPpvslNcu1s1/RbFwuOGZBWd2ZWqqfTOsAOWJOej8f2mTOuxgpIF5HPhCOyMY0A1qGn4vFZDby+7p0ipj6JmEYAa88Ek0fn3f24dt+svebk1+XrMfF3AafoD8BU4Vjk95TPOXmMMYHEk8hn4pNI97N2HxVgWwsY+41qFp/ZN1Y8qhF/0C4ijQcZWOHUkcWb03C21SjxaI254P/+3KzL130GD3j7x7YW8O46ksWb0faTdcOHI462WzT2xNBGpCvwPpMnwCb8aSNy9poAHq3FUThy2Q7fDbnOY+6AdIvy57/B23xdbnQOT4ZtbyIREiD7cEQfjPgxxW1uJryjP8MZWm1Ezpk8OYQEKGHiiD+SfbIPwp36oHf7Kb51iMgxoyeLkABZhiPEY/vsR7KnHJDv7xFNIofMnjxCAsKR143/73OtJr+0Yq7TbrvzjutMjovcC8m5ctYWlKiO4pFjOL6Pd4QzrWY5M6yZ+cH5jLa0cluEu5Cce1MJkH844jMy8xuZNps6TB27Ob/vEhf+7cKW1j6zLa04JJvq760t21uQ5+s464uKw5bVbon1fKkrx9sf+PuBCyHJdfHtnnznyvYW5PKazXabqheO9iyr3ZxbVqkEpHsguy2tfUZnad16N9Pf3jKVQHrTRrbbVL14bEM4dkvejhQ+u2oXppF9CEkpT1RTCZg2xg5HFU0di3+AbSoffvj9QWSXO2VbwDTSn0qqyrESWOJNXFEfmJrK1JFiQPrTyCHzYyPX3gnVUUDEBKaJRhFbVL1wdMc6mhSmjpQD0p9GvgqZRq490fshERN4/bVU1BbVjalj8ivKSwrI79sWHRs5ZHjdyDMvgO7dhJiAaMThaK/raJY8wyr3gFTVf2dqNe2WVhuTcna17sbENhf8PbUXtz11JRztl2QOkucekM73llb7NUwjh5W8YMQE0VjJr6AOFwS2a/Iul9vcZHYfdweSulN+Tyt6IVXV39tcgkJJz/P+830dP/y/21Xd1JFVLJtMn2wfUUgOKwhJJ35hmU4wZeQfjuSPc5QWkHgx/QwhKe20X9MJpoxyw5HsablrCkinO+03nkjWuHhem04EhVSCscop40o4mlwOkK8lIP2QHMJEstaQVFderIKCYCwfjqawNbesHyb6mRohuRuULirxb1n0eV0MmXiLvyZDONYVkH5IjlFILJJ/RmVrSsF0MXo46igc25J/1mYFj2d8jERIXp9SREUsxEI4VhuQfkh2UUiOnvai4vEVizfDsY3Csaqzy5oVPt7tA/wRheR7i8txklGjUglLso+ZWIwTjfa+a6PR7W6s8r5sVv6i6q7+dJxk/KgIi1CUGI7VbVMJyGPx9taxDUn71VQyeVgqcRklEpVQTD5tdNtU22rFF0EKyH3fv/jJVLJYWB7FpVpBYDZXvoqEaUNAMp1KPnox8Q55ubg8mlhymGD6P59AJDZtdNdthGnD4yEgb7/guydUO4nY4ko/MNWDyWXsaaY/NdyaJCoLUprRqGxRCcgM+ltcx3AWl5ikFZhnF+pHcTlFj/szkSC/aPz+XUPuFQGZU7fFVYlJsbH58joRDW77fwEGANUZsxMt/7FyAAAAAElFTkSuQmCC);\n  }\n    .repl_wrapper .screenshadow.tl {\n      top: 0; left: 0;\n      background-position: 0 0;\n    }\n    .repl_wrapper .screenshadow.tr {\n      top: 0; right: 0;\n      background-position: -200px 0;\n    }\n    .repl_wrapper .screenshadow.bl {\n      bottom: 0; left: 0;\n      background-position: 0 -150px;\n    }\n    .repl_wrapper .screenshadow.br {\n      bottom: 0; right: 0;\n      background-position: -200px -150px;\n    }\n\n#repl_source, #repl_results {\n  background: transparent;\n  outline: none;\n  margin: 5px 0 20px;\n  color: #def;\n  -webkit-tab-size: 2;\n  -moz-tab-size: 2;\n  -o-tab-size: 2;\n  tab-size: 2;\n}\n  #repl_results, #repl_source_wrap {\n    width: auto; height: auto;\n    position: absolute;\n    margin-bottom: 0;\n    top: 10px; left: 10px; right: 10px; bottom: 15px;\n  }\n    #repl_results.error {\n      color: red\n    }\n    #repl_source_wrap {\n      margin-left: 5px;\n      width: 47%; right: 50%;\n      float: left;\n    }\n      #repl_source {\n        padding-left: 5px;\n        width: 100%;\n        height: 100%;\n        border: 0;\n        overflow-y: auto;\n        resize: none;\n      }\n    #repl_results_wrap {\n      white-space: pre;\n    }\n      #repl_results {\n        text-transform: none;\n        overflow-y: auto;\n        left: 50%;\n        border-left-color: #555;\n      }\n\n/*----------------------------- Mini Buttons ---------------------------------*/\n.minibutton {\n  cursor: pointer;\n  color: #333;\n  text-shadow: #eee 0 1px 1px;\n  font-weight: bold;\n  font-size: 11px;\n  line-height: 11px;\n  padding: 5px 10px 6px;\n  height: 11px;\n  text-align: center;\n  -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px;\n  box-shadow: 0 1px 2px rgba(0,0,0,0.2); -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.2); -moz-box-shadow: 0 1px 2px rgba(0,0,0,0.2);\n  border: 1px solid #b2b2b2; border-top-color: #c9c9c9; border-bottom-color: #9a9a9a;\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAWCAIAAACOpGH9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACxJREFUeNpifvr0KRMDAwPT////4RjE//fvHxiD+Mjsv3//4uSD2FD1AAEGAHv9O3d7p0bEAAAAAElFTkSuQmCC) repeat-x left top;\n}\n  .minibutton:active {\n    border-color: #aaa;\n    box-shadow: 0 1px 2px #e4e4e4; -webkit-box-shadow: 0 1px 2px #e4e4e4; -moz-box-shadow: 0 1px 2px #e4e4e4;\n  }\n  .minibutton::selection {\n    background: transparent;\n  }\n  .minibutton ::-moz-selection {\n    background: transparent;\n  }\n  .minibutton.ok {\n    color: #fff;\n    background-image: url(data:image/gif;base64,R0lGODlhAQAYALMAADOtbj3BeyqVXDq6dTClZy2gYzKoazu+eDm1cyyaYDaycj7DfAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABABgAAAQMcMlJZzgDKWBISUIEADs=);\n    border-color: #4ba47c; border-top-color: #53b388; border-bottom-color: #459671;\n    text-shadow: #aaa 0 -1px 0;\n  }\n  .minibutton.dark {\n    border: 0;\n    color: #fff;\n    box-shadow: none; -webkit-box-shadow: none; -moz-box-shadow: none;\n    background-image: url(data:image/gif;base64,R0lGODlhAQAYAMQAAFZWVn19fW1tbXd3d3FxcWtra1tbW3V1dWVlZWJiYlJSUnx8fF9fX3l5eWlpaXNzc35+fgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABABgAAAURICSOYrA0w/EQQuEgCWMASggAOw==);\n    text-shadow: none;\n  }\n  .minibutton.error {\n     opacity: 0.5;\n     color: #600;\n     cursor: not-allowed;\n  }\n\n@media (max-width: 820px) {\n  .container {\n    width: auto;\n    padding: 1em;\n  }\n  p, li, table {\n    width: auto;\n  }\n  #fadeout {\n    display: none;\n  }\n  #flybar {\n    position: static;\n    height: auto;\n    min-width: 245px;\n  }\n    #logo {\n      float: none;\n    }\n    .navigation {\n      float: none;\n      border: none;\n    }\n  div.code pre, div.code textarea {\n    border-left: none;\n    border-top-width: 1px;\n    width: auto;\n    float: none;\n    margin: 5px;\n    padding: 10px 5px;\n  }\n    div.code pre:first-child {\n      border-top: none;\n    }\n}\n\n/* Highlight.js syntax highlighting */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n/* Forked from http://softwaremaniacs.org/media/soft/highlight/styles/tomorrow.css */\n.tomorrow-comment, pre .comment, pre .title {\n  color: #8e908c;\n}\n\n.tomorrow-red, pre .variable, pre .tag, pre .regexp, pre .ruby .constant, pre .xml .tag .title, pre .xml .pi, pre .xml .doctype, pre .html .doctype, pre .css .id, pre .css .class, pre .css .pseudo {\n  color: #c82829;\n}\n\n.tomorrow-orange, pre .number, pre .preprocessor, pre .built_in, pre .params, pre .constant {\n  color: #000000;\n}\n\n.tomorrow-yellow, pre .class, pre .ruby .class .title, pre .css .rules .attribute {\n  color: #eab700;\n}\n\n.tomorrow-green, pre .string, pre .value, pre .inheritance, pre .header, pre .ruby .symbol, pre .xml .cdata {\n  color: #718c00;\n}\n\n.tomorrow-aqua, pre .css .hexcolor {\n  color: #3e999f;\n}\n\n.tomorrow-blue, pre .function, pre .function .title, pre .python .decorator, pre .python .title, pre .ruby .function .title, pre .ruby .title .keyword, pre .perl .sub, pre .javascript .title, pre .coffeescript .title {\n  color: #21439C;\n}\n\n.tomorrow-purple, pre .keyword, pre .reserved, pre .javascript .function {\n  color: #FF5600;\n}\n\npre .subst {\n  color: #A535AE;\n}\n\npre .literal {\n  color: #A535AE;\n}\n\npre .property {\n  color: #A535AE;\n}\n\npre .class .title {\n  color: #21439C;\n}\n\npre .coffeescript .javascript,\npre .javascript .xml,\npre .tex .formula,\npre .xml .javascript,\npre .xml .vbscript,\npre .xml .css,\npre .xml .cdata {\n  opacity: 0.5;\n}\n\n</style>\n\n</head>\n<body>\n\n<div id=\"fadeout\"></div>\n\n<div id=\"flybar\">\n  <a id=\"logo\" href=\"#top\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-22 347 566 100\">\n\t<title>\n\t\tCoffeeScript Logo\n\t</title>\n\t<path d=\"M21.7 351.1c.1.6-.2 1.1-1.2 1.6-1.3-.7-4.1-1.1-6.4-.9-2.5.2-4.6 1-4.3 2.7.4 1.7 2.8 2.7 7.1 2.3 10.5-.9 10.4-8 25.8-9.4 12-1.1 18.7 2.6 19.6 7.1.7 3.5-2.2 6.9-10.9 7.6-7.7.7-12.2-1.4-12.6-3.5-.2-1.1.4-2.7 4.1-3.1.4 1.7 2.5 3.5 7.5 3 3.6-.3 6.6-1.6 6.2-3.6-.4-2.1-4.2-3.3-10.2-2.8-12.2 1.1-15.2 7.8-25.6 8.7-7.4.7-13.4-2-14.2-6-.3-1.5-.3-5 7.5-5.7 4-.3 7.2.4 7.6 2zm-39 41.8c-3.4 4.3-4.9 9.3-4.6 14.2.3 4.9 2.7 8.9 6.5 12 4 3.1 8.3 4 13.2 3.1 1.9-.3 4-1.3 5.9-1.9-4 0-7.4-1.3-10.8-4-3.7-2.7-6.2-6.5-6.8-11.1-.9-4.3 0-8.3 2.4-11.8 2.7-3.4 6.2-5.3 10.8-5.9 4.6-.3 8.6.9 12.6 3.7-.9-1.3-2.2-2.2-3.4-3.4-4-2.7-8.3-4-13.6-2.7-4.8 1-8.8 3.5-12.2 7.8zm53.6-23.1c-12.9 0-24.4-1.3-32.7-3.1-8.9-2.2-13.6-4.6-13.6-7.7 0-1.3.6-2.4 2.4-3.7-5.6 2.2-8.6 4-8.6 6.8.3 3.1 5.3 6.2 15.5 8.6 9.6 2.4 21.9 3.7 36.7 3.7 15.1 0 27.1-1.3 36.7-3.7 10.2-2.4 15.1-5.6 15.1-8.6 0-2.2-2.2-4.3-6.2-5.9.9.6 1.6 1.6 1.6 2.7 0 3.1-4.6 5.6-13.9 7.7-8.6 1.9-19.6 3.2-33 3.2zm36.8 8.6c-9.6 2.2-21.9 3.7-36.7 3.7-15.1 0-27.4-1.6-37-3.7-8.6-2.2-13.2-4.6-14.8-7.1 1.6 10.8 5.3 21 10.2 30 3.7 5.6 7.4 10.5 11.1 15.8 1.6 3.1 2.7 6.2 3.4 9.3 2.4 3.4 5.9 5.6 10.2 6.8 5.3 1.9 10.8 2.7 16.4 2.4h.6c5.6.3 11.5-.6 16.9-2.4 4-1.3 7.4-3.4 9.9-6.8h.3c.6-3.1 1.6-6.2 3.1-9.3 3.7-5.3 7.4-10.2 11.1-15.8 4.9-8.9 8.3-19.1 10.2-30-2 2.8-6.6 5.2-14.9 7.1zm106.2 30.1c-4.8 12.1-17.6 16.9-25.9 16.9-13.4 0-19.9-6-19.9-22.3 0-16.5 7.9-47.3 31.7-47.3 8.5 0 15.2 3.3 15.2 12.1 0 4.8-1.8 8.3-6.4 8.3-1.5 0-3.4-.4-5.2-2.4 2.2-1.1 4.2-4.9 4.2-8.3 0-2.9-1.5-5.6-5.6-5.6-10 0-18.9 23.9-18.9 42.4 0 8.3 2.2 14.2 10.9 14.2 7.1 0 13.5-3.4 17.7-9.1l2.2 1.1zm32.9-16.3c.4.2.7.2 1 .2 4.2 0 10.1-2.7 14-5.5l.8 2.4c-3.4 3.7-9.5 6.5-16.1 7.5-1.5 16.8-10.6 27.3-21.7 27.3-8.4 0-14.5-4-14.5-14.4 0-10.5 6.2-32.2 24.9-32.2 7.8.3 11.6 5.3 11.6 14.7zm-7.7 5c-1.9-.5-2.4-2-2.4-3.8 0-2.5 1.2-4.2 2.8-4.9-.2-3.8-1.1-5.3-3.4-5.3-6.5 0-12 16.6-12 25.6 0 6 1.2 7.3 4.6 7.3 4.2.1 8.9-8 10.4-18.9zm-6.6 39.7c0-8.3 7.1-11 15.8-13.6l10.9-51.9c2.7-13 10.6-15.5 16.5-15.5 4.1 0 8 2.2 9.7 5.7 3.6-4.6 8.4-5.7 12.4-5.7 5.6 0 10.8 3.9 10.8 9.8 0 1.5-.1 2.6-.3 3.7h-4.3c.1-.9.2-1.7.2-2.4 0-2.1-1.7-3.1-3.4-3.1-2 0-4.8 1.1-6.2 7.1l-1.7 7.4h9.1l-.8 3.6h-9l-10.3 49.1c-2.7 13-10.6 15.5-16.5 15.5-5.2 0-8.3-2.3-9.8-5.7-3.5 4.6-8.3 5.7-12.3 5.7-5.6.1-10.8-3.8-10.8-9.7zm9.1 1.8c1.9 0 4.2-1.8 5.4-7.1l1.1-5.3c-5.7 2-10.1 4.4-10.1 9.4 0 1.2 1.7 3 3.6 3zm21.7 0c1.9 0 4.2-1.8 5.4-7.1l2.2-10.4-9.4 1.8-1.8 8.3c-.5 2.1-1.1 4-1.8 5.6.9 1.3 3 1.8 5.4 1.8zm-1.4-18l9.4-1.7 7.7-36.8h-9l-8.1 38.5zm16.6-56.7c-2 0-4.8 1.1-6.2 7.1l-1.7 7.4h9l2.1-9.5c.2-.7.2-1.3.2-2 .1-2-1.5-3-3.4-3zm37.9 53c7.1 0 11.6-4 16.1-9.2h3.1c-5.2 8.3-12.9 16.8-25 16.8-8.5 0-14.2-4.2-14.2-14.5 0-10.5 5.9-32.3 24.6-32.3 8.1 0 10 4.2 10 8.7 0 10.5-10 18.5-20.9 19.2-.1 1.3-.2 2.5-.2 3.6 0 6.2 2.2 7.7 6.5 7.7zm5.3-34.4c-4.6 0-9.1 9.7-10.9 18.7 7-.5 13.2-7.4 13.2-15 0-2.2-.5-3.7-2.3-3.7zm28.6 33.4c3.4 0 7.8-2.3 10.8-4.8-2 10.4-8.4 13.4-15.8 13.4-8.4 0-14.1-4.2-14.1-14.5 0-10.5 5.9-32.3 24.6-32.3 8.1 0 10 4.2 10 8.7 0 10.6-10 18.5-20.9 19.2-.1.9-.2 2-.2 2.7 0 5.7 2.5 7.6 5.6 7.6zm6.2-33.4c-4.5 0-9.1 10.1-11 18.7 7.1-.4 13.3-7.3 13.3-15 0-2.2-.6-3.7-2.3-3.7zm51.3-6.7c-1.7 0-3-.6-4.2-1.9 2.4-1.5 4.1-4.8 4.1-7.8 0-3.1-1.8-6.1-6.8-6.1s-8.3 2.8-8.3 8.2c0 13.3 20.5 15.2 20.5 34.8 0 15.3-12.3 22.7-25.6 22.7-10.4 0-19.3-4.5-19.3-15.7 0-9.8 7-14.9 13.3-14.9 3.1 0 7.7 1.3 8 6-4.9 0-10.7 2.3-10.7 8.5 0 4.5 2.9 8.7 8.7 8.7 6.1 0 10.6-4.4 10.6-12 0-15.6-18.6-21.1-18.6-34.5 0-9.5 9.3-16.3 21-16.3 4.3 0 14.6.9 14.6 10.9.1 5.5-2.8 9.4-7.3 9.4zm36.2 10.3c0-2.3-.8-3.7-2.5-3.7-5.7 0-11.7 16.6-11.7 26.7 0 6.2 2.2 7.6 6.6 7.6 7.1 0 11.6-4 16.1-9.2h3.1c-5.2 8.3-12.9 16.8-25 16.8-8.5 0-14.2-4.2-14.2-14.5 0-10.6 6-32.3 24.5-32.3 8.1 0 10.1 4.2 10.1 8.3 0 4.4-2.2 6.7-4.8 6.7-1 0-2.1-.4-3.1-1.1.5-1.9.9-3.6.9-5.3zm27.7-7.6l-1.2 5.7c3.1-2.7 6.7-5.7 11-5.7 4.1 0 6.3 3.3 6.3 6.9 0 3.1-2.1 6.7-6.6 6.7-5.1 0-2.5-6-5.3-6-2.7 0-4.4 1.4-6.7 3.4l-7.2 34.6h-13.1l9.6-45.4 13.2-.2zm34.2 0l-6.6 30.9c-.3 1.2-.4 2.1-.4 2.9 0 2.5 1.2 3.3 3.7 3.3 3.5 0 6.9-3.4 8.1-8h3.8c-5.2 14.8-14.2 16.8-19.1 16.8-5.5 0-9.7-3.2-9.7-10.9 0-1.8.3-3.7.7-5.9l6.2-29.2 13.3.1zm-4.1-19.4c4 0 7.2 3.2 7.2 7.2s-3.2 7.1-7.2 7.1-7.1-3.1-7.1-7.1c-.1-4 3.2-7.2 7.1-7.2zm29.1 16l-1.5 6.9c2.6-2.3 6.1-3.9 10.7-3.9 6.2 0 11.1 3.5 11.1 14.4 0 12.2-4.7 32.1-22.3 32.1-4.5 0-6.8-1.6-7.7-3.2l-4.7 22.1-13.7 3.2 15.2-71.5 12.9-.1zm7.8 17c0-7-2.9-7.5-4.5-7.5-2 0-4.5 1.6-6.3 4.4l-5.4 25.5c.4 1 1.4 2.1 3.4 2.1 9.7 0 12.8-15.9 12.8-24.5zm27.8 17.3c-.3 1.1-.5 2.2-.5 3.1 0 1.9.7 3.2 3.1 3.2.7 0 1.7 0 2.4-.3-2.5 7.8-6.6 8.9-9.6 8.9-6.4 0-9.1-4.4-9.1-10.3 0-1.6.2-3.1.6-4.8l5.8-27.2h-3l.7-3.6h3L528 366l13.4-1.9s-1.4 6.2-3.1 14.4h5.5l-.7 3.6h-5.5l-5.7 27.4z\"/>\n</svg>\n</a>\n  <div class=\"navigation toc\">\n    <div class=\"button\">\n      Table of Contents\n    </div>\n    <div class=\"contents menu\">\n      <a href=\"#overview\">Overview</a>\n      <a href=\"#installation\">Installation</a>\n      <a href=\"#usage\">Usage</a>\n      <a href=\"#literate\">Literate CoffeeScript</a>\n      <a href=\"#language\">Language Reference</a>\n      <a href=\"#literals\">Literals: Functions, Objects and Arrays</a>\n      <a href=\"#lexical-scope\">Lexical Scoping and Variable Safety</a>\n      <a href=\"#conditionals\">If, Else, Unless, and Conditional Assignment</a>\n      <a href=\"#splats\">Splats…</a>\n      <a href=\"#loops\">Loops and Comprehensions</a>\n      <a href=\"#slices\">Array Slicing and Splicing</a>\n      <a href=\"#expressions\">Everything is an Expression</a>\n      <a href=\"#operators\">Operators and Aliases</a>\n      <a href=\"#existential-operator\">Existential Operator</a>\n      <a href=\"#classes\">Classes, Inheritance, and Super</a>\n      <a href=\"#destructuring\">Destructuring Assignment</a>\n      <a href=\"#fat-arrow\">Bound and Generator Functions</a>\n      <a href=\"#embedded\">Embedded JavaScript</a>\n      <a href=\"#switch\">Switch/When/Else</a>\n      <a href=\"#try-catch\">Try/Catch/Finally</a>\n      <a href=\"#comparisons\">Chained Comparisons</a>\n      <a href=\"#strings\">String Interpolation, Block Strings, and Block Comments</a>\n      <a href=\"#tagged-template-literals\">Tagged Template Literals</a>\n      <a href=\"#regexes\">Block Regular Expressions</a>\n      <a href=\"#modules\">Modules</a>\n      <a href=\"#cake\">Cake, and Cakefiles</a>\n      <a href=\"#source-maps\">Source Maps</a>\n      <a href=\"#scripts\">\"text/coffeescript\" Script Tags</a>\n      <a href=\"#resources\">Books, Screencasts, Examples and Resources</a>\n      <a href=\"#changelog\">Change Log</a>\n    </div>\n  </div>\n  <div class=\"navigation try\">\n    <div class=\"button\">\n      Try CoffeeScript\n      <div class=\"repl_bridge\"></div>\n    </div>\n    <div class=\"contents repl_wrapper\">\n      <div class=\"code\">\n        <div class=\"screenshadow tl\"></div>\n        <div class=\"screenshadow tr\"></div>\n        <div class=\"screenshadow bl\"></div>\n        <div class=\"screenshadow br\"></div>\n        <div id=\"repl_source_wrap\">\n          <textarea id=\"repl_source\" rows=\"100\" spellcheck=\"false\">alert \"Hello CoffeeScript!\"</textarea>\n        </div>\n        <div id=\"repl_results_wrap\"><pre id=\"repl_results\"></pre></div>\n        <div class=\"minibutton dark run\" title=\"Ctrl-Enter\">Run</div>\n        <a class=\"minibutton permalink\" id=\"repl_permalink\">Link</a>\n        <br class=\"clear\" />\n      </div>\n    </div>\n  </div>\n  <div class=\"navigation annotated\">\n    <div class=\"button\">\n      Annotated Source\n    </div>\n    <div class=\"contents menu\">\n      <a href=\"annotated-source/grammar.html\">Grammar Rules — src/grammar</a>\n      <a href=\"annotated-source/lexer.html\">Lexing Tokens — src/lexer</a>\n      <a href=\"annotated-source/rewriter.html\">The Rewriter — src/rewriter</a>\n      <a href=\"annotated-source/nodes.html\">The Syntax Tree — src/nodes</a>\n      <a href=\"annotated-source/scope.html\">Lexical Scope — src/scope</a>\n      <a href=\"annotated-source/helpers.html\">Helpers &amp; Utility Functions — src/helpers</a>\n      <a href=\"annotated-source/coffee-script.html\">The CoffeeScript Module — src/coffee-script</a>\n      <a href=\"annotated-source/cake.html\">Cake &amp; Cakefiles — src/cake</a>\n      <a href=\"annotated-source/command.html\">“coffee” Command-Line Utility — src/command</a>\n      <a href=\"annotated-source/optparse.html\">Option Parsing — src/optparse</a>\n      <a href=\"annotated-source/repl.html\">Interactive REPL — src/repl</a>\n      <a href=\"annotated-source/sourcemap.html\">Source Maps — src/sourcemap</a>\n    </div>\n  </div>\n</div>\n\n<div id=\"top\" class=\"container\">\n  <span class=\"bookmark\" id=\"overview\"></span>\n    <p><strong>CoffeeScript is a little language that compiles into JavaScript.</strong> Underneath that awkward Java-esque patina, JavaScript has always had a gorgeous heart. CoffeeScript is an attempt to expose the good parts of JavaScript in a simple way.</p>\n<p>The golden rule of CoffeeScript is: <em>“It’s just JavaScript”</em>. The code compiles one-to-one into the equivalent JS, and there is no interpretation at runtime. You can use any existing JavaScript library seamlessly from CoffeeScript (and vice-versa). The compiled output is readable, pretty-printed, and tends to run as fast or faster than the equivalent handwritten JavaScript.</p>\n<p>The CoffeeScript compiler goes to great lengths to generate output JavaScript that runs in every JavaScript runtime, but there are exceptions. Use <a href=\"#generator-functions\">generator functions</a>, <a href=\"#generator-iteration\"><code>for…from</code></a>, or <a href=\"#tagged-template-literals\">tagged template literals</a> only if you know that your <a href=\"http://kangax.github.io/compat-table/es6/\">target runtimes can support them</a>. If you use <a href=\"#modules\">modules</a>, you will need to <a href=\"#modules-note\">use an additional tool to resolve them</a>.</p>\n<p><strong>Latest 1.x Version:</strong> <a href=\"https://github.com/jashkenas/coffeescript/tarball/1.12.7\">1.12.7</a></p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\">npm install -g coffeescript\n</code></pre>\n</blockquote><p><strong>Upgrade to CoffeeScript 2!</strong> It adds support for <a href=\"/#classes\">ES2015 classes</a>, <a href=\"/#async-functions\"><code>async</code>/<code>await</code></a>, <a href=\"/#jsx\">JSX</a>, <span class=\"nowrap\"><a href=\"/#splats\">object rest/spread syntax</a></span>, and <a href=\"/#coffeescript-2\">JavaScript generated using modern syntax</a>. <a href=\"/announcing-coffeescript-2/\">Learn more</a>.</p>\n\n    <h2>Overview</h2>\n<p><em>CoffeeScript on the left, compiled JavaScript output on the right.</em></p>\n<div class='code'><pre><code><span class=\"comment\"># Assignment:</span>\nnumber   = <span class=\"number\">42</span>\nopposite = <span class=\"literal\">true</span>\n\n<span class=\"comment\"># Conditions:</span>\nnumber = <span class=\"number\">-42</span> <span class=\"keyword\">if</span> opposite\n\n<span class=\"comment\"># Functions:</span>\n<span class=\"function\"><span class=\"title\">square</span> = <span class=\"params\">(x)</span> -&gt;</span> x * x\n\n<span class=\"comment\"># Arrays:</span>\nlist = [<span class=\"number\">1</span>, <span class=\"number\">2</span>, <span class=\"number\">3</span>, <span class=\"number\">4</span>, <span class=\"number\">5</span>]\n\n<span class=\"comment\"># Objects:</span>\nmath =\n  root:   Math.sqrt\n  square: square\n  cube:   <span class=\"function\"><span class=\"params\">(x)</span> -&gt;</span> x * square x\n\n<span class=\"comment\"># Splats:</span>\n<span class=\"function\"><span class=\"title\">race</span> = <span class=\"params\">(winner, runners...)</span> -&gt;</span>\n  <span class=\"built_in\">print</span> winner, runners\n\n<span class=\"comment\"># Existence:</span>\nalert <span class=\"string\">\"I knew it!\"</span> <span class=\"keyword\">if</span> elvis?\n\n<span class=\"comment\"># Array comprehensions:</span>\ncubes = (math.cube num <span class=\"keyword\">for</span> num <span class=\"keyword\">in</span> list)\n</code></pre><pre><code><span class=\"keyword\">var</span> cubes, list, math, num, number, opposite, race, square,\n  slice = [].slice;\n\nnumber = <span class=\"number\">42</span>;\n\nopposite = <span class=\"literal\">true</span>;\n\n<span class=\"keyword\">if</span> (opposite) {\n  number = <span class=\"number\">-42</span>;\n}\n\nsquare = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">x</span>) </span>{\n  <span class=\"keyword\">return</span> x * x;\n};\n\nlist = [<span class=\"number\">1</span>, <span class=\"number\">2</span>, <span class=\"number\">3</span>, <span class=\"number\">4</span>, <span class=\"number\">5</span>];\n\nmath = {\n  <span class=\"attr\">root</span>: <span class=\"built_in\">Math</span>.sqrt,\n  <span class=\"attr\">square</span>: square,\n  <span class=\"attr\">cube</span>: <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">x</span>) </span>{\n    <span class=\"keyword\">return</span> x * square(x);\n  }\n};\n\nrace = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">var</span> runners, winner;\n  winner = <span class=\"built_in\">arguments</span>[<span class=\"number\">0</span>], runners = <span class=\"number\">2</span> &lt;= <span class=\"built_in\">arguments</span>.length ? slice.call(<span class=\"built_in\">arguments</span>, <span class=\"number\">1</span>) : [];\n  <span class=\"keyword\">return</span> print(winner, runners);\n};\n\n<span class=\"keyword\">if</span> (<span class=\"keyword\">typeof</span> elvis !== <span class=\"string\">\"undefined\"</span> &amp;&amp; elvis !== <span class=\"literal\">null</span>) {\n  alert(<span class=\"string\">\"I knew it!\"</span>);\n}\n\ncubes = (<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">var</span> i, len, results;\n  results = [];\n  <span class=\"keyword\">for</span> (i = <span class=\"number\">0</span>, len = list.length; i &lt; len; i++) {\n    num = list[i];\n    results.push(math.cube(num));\n  }\n  <span class=\"keyword\">return</span> results;\n})();\n</code></pre><script>window.example1 = \"# Assignment:\\nnumber   = 42\\nopposite = true\\n\\n# Conditions:\\nnumber = -42 if opposite\\n\\n# Functions:\\nsquare = (x) -> x * x\\n\\n# Arrays:\\nlist = [1, 2, 3, 4, 5]\\n\\n# Objects:\\nmath =\\n  root:   Math.sqrt\\n  square: square\\n  cube:   (x) -> x * square x\\n\\n# Splats:\\nrace = (winner, runners...) ->\\n  print winner, runners\\n\\n# Existence:\\nalert \\\"I knew it!\\\" if elvis?\\n\\n# Array comprehensions:\\ncubes = (math.cube num for num in list)\\n\"</script><div class=\"minibutton ok\" onclick=\"javascript: var cubes, list, math, num, number, opposite, race, square,\n  slice = [].slice;\n\nnumber = 42;\n\nopposite = true;\n\nif (opposite) {\n  number = -42;\n}\n\nsquare = function(x) {\n  return x * x;\n};\n\nlist = [1, 2, 3, 4, 5];\n\nmath = {\n  root: Math.sqrt,\n  square: square,\n  cube: function(x) {\n    return x * square(x);\n  }\n};\n\nrace = function() {\n  var runners, winner;\n  winner = arguments[0], runners = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n  return print(winner, runners);\n};\n\nif (typeof elvis !== &quot;undefined&quot; && elvis !== null) {\n  alert(&quot;I knew it!&quot;);\n}\n\ncubes = (function() {\n  var i, len, results;\n  results = [];\n  for (i = 0, len = list.length; i < len; i++) {\n    num = list[i];\n    results.push(math.cube(num));\n  }\n  return results;\n})();\n;alert(cubes);\">run: cubes</div><br class='clear' /></div>\n  <span class=\"bookmark\" id=\"installation\"></span>\n    <h2>Installation</h2>\n<p>The command-line version of <code>coffee</code> is available as a <a href=\"https://nodejs.org/\">Node.js</a> utility. The <a href=\"browser-compiler/coffee-script.js\">core compiler</a> however, does not depend on Node, and can be run in any JavaScript environment, or in the browser (see <a href=\"#try\">Try CoffeeScript</a>).</p>\n<p>To install, first make sure you have a working copy of the latest stable version of <a href=\"https://nodejs.org/\">Node.js</a>. You can then install CoffeeScript globally with <a href=\"https://www.npmjs.com/\">npm</a>:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\">npm install --global coffeescript\n</code></pre>\n</blockquote><p>This will make the <code>coffee</code> and <code>cake</code> commands available globally.</p>\n<p>When you need CoffeeScript as a dependency of a project, within that project’s folder you can install it locally:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\">npm install --save coffeescript\n</code></pre>\n</blockquote><p>The <code>coffee</code> and <code>cake</code> commands will first look in the current folder to see if CoffeeScript is installed locally, and use that version if so. This allows different versions of CoffeeScript to be installed globally and locally.</p>\n\n  <span class=\"bookmark\" id=\"usage\"></span>\n    <h2>Usage</h2>\n<p>Once installed, you should have access to the <code>coffee</code> command, which can execute scripts, compile <code>.coffee</code> files into <code>.js</code>, and provide an interactive REPL. The <code>coffee</code> command takes the following options:</p>\n<table>\n<thead>\n<tr>\n<th>Option</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>-c, --compile</code></td>\n<td>Compile a <code>.coffee</code> script into a <code>.js</code> JavaScript file of the same name.</td>\n</tr>\n<tr>\n<td><code>-m, --map</code></td>\n<td>Generate source maps alongside the compiled JavaScript files. Adds <code>sourceMappingURL</code> directives to the JavaScript as well.</td>\n</tr>\n<tr>\n<td><code>-M, --inline-map</code></td>\n<td>Just like <code>--map</code>, but include the source map directly in the compiled JavaScript files, rather than in a separate file.</td>\n</tr>\n<tr>\n<td><code>-i, --interactive</code></td>\n<td>Launch an interactive CoffeeScript session to try short snippets. Identical to calling <code>coffee</code> with no arguments.</td>\n</tr>\n<tr>\n<td><code>-o, --output [DIR]</code></td>\n<td>Write out all compiled JavaScript files into the specified directory. Use in conjunction with <code>--compile</code> or <code>--watch</code>.</td>\n</tr>\n<tr>\n<td><code>-w, --watch</code></td>\n<td>Watch files for changes, rerunning the specified command when any file is updated.</td>\n</tr>\n<tr>\n<td><code>-p, --print</code></td>\n<td>Instead of writing out the JavaScript as a file, print it directly to <strong>stdout</strong>.</td>\n</tr>\n<tr>\n<td><code>-s, --stdio</code></td>\n<td>Pipe in CoffeeScript to STDIN and get back JavaScript over STDOUT. Good for use with processes written in other languages. An example:<br><code>cat src/cake.coffee | coffee -sc</code></td>\n</tr>\n<tr>\n<td><code>-l, --literate</code></td>\n<td>Parses the code as Literate CoffeeScript. You only need to specify this when passing in code directly over <strong>stdio</strong>, or using some sort of extension-less file name.</td>\n</tr>\n<tr>\n<td><code>-e, --eval</code></td>\n<td>Compile and print a little snippet of CoffeeScript directly from the command line. For example:<br><code>coffee -e &quot;console.log num for num in [10..1]&quot;</code></td>\n</tr>\n<tr>\n<td><code>-r, --require [MODULE]</code> </td>\n<td><code>require()</code> the given module before starting the REPL or evaluating the code given with the <code>--eval</code> flag.</td>\n</tr>\n<tr>\n<td><code>-b, --bare</code></td>\n<td>Compile the JavaScript without the <a href=\"#lexical-scope\">top-level function safety wrapper</a>.</td>\n</tr>\n<tr>\n<td><code>-t, --tokens</code></td>\n<td>Instead of parsing the CoffeeScript, just lex it, and print out the token stream. Used for debugging the compiler.</td>\n</tr>\n<tr>\n<td><code>-n, --nodes</code></td>\n<td>Instead of compiling the CoffeeScript, just lex and parse it, and print out the parse tree. Used for debugging the compiler.</td>\n</tr>\n<tr>\n<td><code>--nodejs</code></td>\n<td>The <code>node</code> executable has some useful options you can set, such as <code>--debug</code>, <code>--debug-brk</code>, <code>--max-stack-size</code>, and <code>--expose-gc</code>. Use this flag to forward options directly to Node.js. To pass multiple flags, use <code>--nodejs</code> multiple times.</td>\n</tr>\n<tr>\n<td><code>--no-header</code></td>\n<td>Suppress the “Generated by CoffeeScript” header.</td>\n</tr>\n</tbody>\n</table>\n<h3>Examples:</h3>\n<ul>\n<li>Compile a directory tree of <code>.coffee</code> files in <code>src</code> into a parallel tree of <code>.js</code> files in <code>lib</code>:<br>\n<code>coffee --compile --output lib/ src/</code></li>\n<li>Watch a file for changes, and recompile it every time the file is saved:<br>\n<code>coffee --watch --compile experimental.coffee</code></li>\n<li>Concatenate a list of files into a single script:<br>\n<code>coffee --join project.js --compile src/*.coffee</code></li>\n<li>Print out the compiled JS from a one-liner:<br>\n<code>coffee -bpe &quot;alert i for i in [0..10]&quot;</code></li>\n<li>All together now, watch and recompile an entire project as you work on it:<br>\n<code>coffee -o lib/ -cw src/</code></li>\n<li>Start the CoffeeScript REPL (<code>Ctrl-D</code> to exit, <code>Ctrl-V</code>for multi-line):<br>\n<code>coffee</code></li>\n</ul>\n\n  <span class=\"bookmark\" id=\"literate\"></span>\n    <h2>Literate CoffeeScript</h2>\n<p>Besides being used as an ordinary programming language, CoffeeScript may also be written in “literate” mode. If you name your file with a <code>.litcoffee</code> extension, you can write it as a Markdown document — a document that also happens to be executable CoffeeScript code. The compiler will treat any indented blocks (Markdown’s way of indicating source code) as code, and ignore the rest as comments.</p>\n<p>Just for kicks, a little bit of the compiler is currently implemented in this fashion: See it <a href=\"https://gist.github.com/jashkenas/3fc3c1a8b1009c00d9df\">as a document</a>, <a href=\"https://raw.githubusercontent.com/jashkenas/coffeescript/master/src/scope.litcoffee\">raw</a>, and <a href=\"http://cl.ly/LxEu\">properly highlighted in a text editor</a>.</p>\n\n  <span class=\"bookmark\" id=\"language\"></span>\n    <h2>Language Reference</h2>\n<p><em>This reference is structured so that it can be read from top to bottom, if you like. Later sections use ideas and syntax previously introduced. Familiarity with JavaScript is assumed. In all of the following examples, the source CoffeeScript is provided on the left, and the direct compilation into JavaScript is on the right.</em></p>\n<p><em>Many of the examples can be run (where it makes sense) by pressing the <strong>run</strong> button on the right, and can be loaded into the “Try CoffeeScript” console by pressing the <strong>load</strong> button on the left.</em></p>\n<p>First, the basics: CoffeeScript uses significant whitespace to delimit blocks of code. You don’t need to use semicolons <code>;</code> to terminate expressions, ending the line will do just as well (although semicolons can still be used to fit multiple expressions onto a single line). Instead of using curly braces <code>{ }</code> to surround blocks of code in <a href=\"#literals\">functions</a>, <a href=\"#conditionals\">if-statements</a>, <a href=\"#switch\">switch</a>, and <a href=\"#try-catch\">try/catch</a>, use indentation.</p>\n<p>You don’t need to use parentheses to invoke a function if you’re passing arguments. The implicit call wraps forward to the end of the line or block expression.<br>\n<code>console.log sys.inspect object</code> → <code>console.log(sys.inspect(object));</code></p>\n\n    <span class=\"bookmark\" id=\"literals\"></span>\n      <h2>Functions</h2>\n<p>Functions are defined by an optional list of parameters in parentheses, an arrow, and the function body. The empty function looks like this: <code>-&gt;</code></p>\n<div class='code'><pre><code><span class=\"function\"><span class=\"title\">square</span> = <span class=\"params\">(x)</span> -&gt;</span> x * x\n<span class=\"function\"><span class=\"title\">cube</span>   = <span class=\"params\">(x)</span> -&gt;</span> square(x) * x\n</code></pre><pre><code><span class=\"keyword\">var</span> cube, square;\n\nsquare = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">x</span>) </span>{\n  <span class=\"keyword\">return</span> x * x;\n};\n\ncube = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">x</span>) </span>{\n  <span class=\"keyword\">return</span> square(x) * x;\n};\n</code></pre><script>window.example1 = \"square = (x) -> x * x\\ncube   = (x) -> square(x) * x\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var cube, square;\n\nsquare = function(x) {\n  return x * x;\n};\n\ncube = function(x) {\n  return square(x) * x;\n};\n;alert(cube(5));\">run: cube(5)</div><br class='clear' /></div><p>Functions may also have default values for arguments, which will be used if the incoming argument is missing (<code>null</code> or <code>undefined</code>).</p>\n<div class='code'><pre><code><span class=\"function\"><span class=\"title\">fill</span> = <span class=\"params\">(container, liquid = <span class=\"string\">\"coffee\"</span>)</span> -&gt;</span>\n  <span class=\"string\">\"Filling the <span class=\"subst\">#{container}</span> with <span class=\"subst\">#{liquid}</span>...\"</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> fill;\n\nfill = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">container, liquid</span>) </span>{\n  <span class=\"keyword\">if</span> (liquid == <span class=\"literal\">null</span>) {\n    liquid = <span class=\"string\">\"coffee\"</span>;\n  }\n  <span class=\"keyword\">return</span> <span class=\"string\">\"Filling the \"</span> + container + <span class=\"string\">\" with \"</span> + liquid + <span class=\"string\">\"...\"</span>;\n};\n</code></pre><script>window.example2 = \"fill = (container, liquid = \\\"coffee\\\") ->\\n  \\\"Filling the #{container} with #{liquid}...\\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example2);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var fill;\n\nfill = function(container, liquid) {\n  if (liquid == null) {\n    liquid = &quot;coffee&quot;;\n  }\n  return &quot;Filling the &quot; + container + &quot; with &quot; + liquid + &quot;...&quot;;\n};\n;alert(fill(&quot;cup&quot;));\">run: fill(\"cup\")</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"objects-and-arrays\"></span>\n      <h2>Objects and Arrays</h2>\n<p>The CoffeeScript literals for objects and arrays look very similar to their JavaScript cousins. When each property is listed on its own line, the commas are optional. Objects may be created using indentation instead of explicit braces, similar to <a href=\"http://yaml.org\">YAML</a>.</p>\n<div class='code'><pre><code>song = [<span class=\"string\">\"do\"</span>, <span class=\"string\">\"re\"</span>, <span class=\"string\">\"mi\"</span>, <span class=\"string\">\"fa\"</span>, <span class=\"string\">\"so\"</span>]\n\nsingers = {Jagger: <span class=\"string\">\"Rock\"</span>, Elvis: <span class=\"string\">\"Roll\"</span>}\n\nbitlist = [\n  <span class=\"number\">1</span>, <span class=\"number\">0</span>, <span class=\"number\">1</span>\n  <span class=\"number\">0</span>, <span class=\"number\">0</span>, <span class=\"number\">1</span>\n  <span class=\"number\">1</span>, <span class=\"number\">1</span>, <span class=\"number\">0</span>\n]\n\nkids =\n  brother:\n    name: <span class=\"string\">\"Max\"</span>\n    age:  <span class=\"number\">11</span>\n  sister:\n    name: <span class=\"string\">\"Ida\"</span>\n    age:  <span class=\"number\">9</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> bitlist, kids, singers, song;\n\nsong = [<span class=\"string\">\"do\"</span>, <span class=\"string\">\"re\"</span>, <span class=\"string\">\"mi\"</span>, <span class=\"string\">\"fa\"</span>, <span class=\"string\">\"so\"</span>];\n\nsingers = {\n  <span class=\"attr\">Jagger</span>: <span class=\"string\">\"Rock\"</span>,\n  <span class=\"attr\">Elvis</span>: <span class=\"string\">\"Roll\"</span>\n};\n\nbitlist = [<span class=\"number\">1</span>, <span class=\"number\">0</span>, <span class=\"number\">1</span>, <span class=\"number\">0</span>, <span class=\"number\">0</span>, <span class=\"number\">1</span>, <span class=\"number\">1</span>, <span class=\"number\">1</span>, <span class=\"number\">0</span>];\n\nkids = {\n  <span class=\"attr\">brother</span>: {\n    <span class=\"attr\">name</span>: <span class=\"string\">\"Max\"</span>,\n    <span class=\"attr\">age</span>: <span class=\"number\">11</span>\n  },\n  <span class=\"attr\">sister</span>: {\n    <span class=\"attr\">name</span>: <span class=\"string\">\"Ida\"</span>,\n    <span class=\"attr\">age</span>: <span class=\"number\">9</span>\n  }\n};\n</code></pre><script>window.example1 = \"song = [\\\"do\\\", \\\"re\\\", \\\"mi\\\", \\\"fa\\\", \\\"so\\\"]\\n\\nsingers = {Jagger: \\\"Rock\\\", Elvis: \\\"Roll\\\"}\\n\\nbitlist = [\\n  1, 0, 1\\n  0, 0, 1\\n  1, 1, 0\\n]\\n\\nkids =\\n  brother:\\n    name: \\\"Max\\\"\\n    age:  11\\n  sister:\\n    name: \\\"Ida\\\"\\n    age:  9\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var bitlist, kids, singers, song;\n\nsong = [&quot;do&quot;, &quot;re&quot;, &quot;mi&quot;, &quot;fa&quot;, &quot;so&quot;];\n\nsingers = {\n  Jagger: &quot;Rock&quot;,\n  Elvis: &quot;Roll&quot;\n};\n\nbitlist = [1, 0, 1, 0, 0, 1, 1, 1, 0];\n\nkids = {\n  brother: {\n    name: &quot;Max&quot;,\n    age: 11\n  },\n  sister: {\n    name: &quot;Ida&quot;,\n    age: 9\n  }\n};\n;alert(song.join(&quot; … &quot;));\">run: song.join(\" … \")</div><br class='clear' /></div><p>In JavaScript, you can’t use reserved words, like <code>class</code>, as properties of an object, without quoting them as strings. CoffeeScript notices reserved words used as keys in objects and quotes them for you, so you don’t have to worry about it (say, when using jQuery).</p>\n<div class='code'><pre><code>$('.account').attr class: 'active'\n\nlog object.class\n</code></pre><pre><code>$(<span class=\"string\">'.account'</span>).attr({\n  <span class=\"string\">\"class\"</span>: <span class=\"string\">'active'</span>\n});\n\nlog(object[<span class=\"string\">\"class\"</span>]);\n</code></pre><script>window.example2 = \"$('.account').attr class: 'active'\\n\\nlog object.class\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example2);'>load</div><br class='clear' /></div><p>CoffeeScript has a shortcut for creating objects when you want the key to be set with a variable of the same name.</p>\n<div class='code'><pre><code>name = <span class=\"string\">\"Michelangelo\"</span>\nmask = <span class=\"string\">\"orange\"</span>\nweapon = <span class=\"string\">\"nunchuks\"</span>\nturtle = {name, mask, weapon}\noutput = <span class=\"string\">\"<span class=\"subst\">#{turtle.name}</span> wears an <span class=\"subst\">#{turtle.mask}</span> mask. Watch out for his <span class=\"subst\">#{turtle.weapon}</span>!\"</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> mask, name, output, turtle, weapon;\n\nname = <span class=\"string\">\"Michelangelo\"</span>;\n\nmask = <span class=\"string\">\"orange\"</span>;\n\nweapon = <span class=\"string\">\"nunchuks\"</span>;\n\nturtle = {\n  <span class=\"attr\">name</span>: name,\n  <span class=\"attr\">mask</span>: mask,\n  <span class=\"attr\">weapon</span>: weapon\n};\n\noutput = turtle.name + <span class=\"string\">\" wears an \"</span> + turtle.mask + <span class=\"string\">\" mask. Watch out for his \"</span> + turtle.weapon + <span class=\"string\">\"!\"</span>;\n</code></pre><script>window.example3 = \"name = \\\"Michelangelo\\\"\\nmask = \\\"orange\\\"\\nweapon = \\\"nunchuks\\\"\\nturtle = {name, mask, weapon}\\noutput = \\\"#{turtle.name} wears an #{turtle.mask} mask. Watch out for his #{turtle.weapon}!\\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example3);'>load</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"lexical-scope\"></span>\n      <h2>Lexical Scoping and Variable Safety</h2>\n<p>The CoffeeScript compiler takes care to make sure that all of your variables are properly declared within lexical scope — you never need to write <code>var</code> yourself.</p>\n<div class='code'><pre><code>outer = <span class=\"number\">1</span>\n<span class=\"function\"><span class=\"title\">changeNumbers</span> = -&gt;</span>\n  inner = <span class=\"number\">-1</span>\n  outer = <span class=\"number\">10</span>\ninner = changeNumbers()\n</code></pre><pre><code><span class=\"keyword\">var</span> changeNumbers, inner, outer;\n\nouter = <span class=\"number\">1</span>;\n\nchangeNumbers = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">var</span> inner;\n  inner = <span class=\"number\">-1</span>;\n  <span class=\"keyword\">return</span> outer = <span class=\"number\">10</span>;\n};\n\ninner = changeNumbers();\n</code></pre><script>window.example1 = \"outer = 1\\nchangeNumbers = ->\\n  inner = -1\\n  outer = 10\\ninner = changeNumbers()\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var changeNumbers, inner, outer;\n\nouter = 1;\n\nchangeNumbers = function() {\n  var inner;\n  inner = -1;\n  return outer = 10;\n};\n\ninner = changeNumbers();\n;alert(inner);\">run: inner</div><br class='clear' /></div><p>Notice how all of the variable declarations have been pushed up to the top of the closest scope, the first time they appear. <strong>outer</strong> is not redeclared within the inner function, because it’s already in scope; <strong>inner</strong> within the function, on the other hand, should not be able to change the value of the external variable of the same name, and therefore has a declaration of its own.</p>\n<p>This behavior is effectively identical to Ruby’s scope for local variables. Because you don’t have direct access to the <code>var</code> keyword, it’s impossible to shadow an outer variable on purpose, you may only refer to it. So be careful that you’re not reusing the name of an external variable accidentally, if you’re writing a deeply nested function.</p>\n<p>Although suppressed within this documentation for clarity, all CoffeeScript output is wrapped in an anonymous function: <code>(function(){ … })();</code> This safety wrapper, combined with the automatic generation of the <code>var</code> keyword, make it exceedingly difficult to pollute the global namespace by accident.</p>\n<p>If you’d like to create top-level variables for other scripts to use, attach them as properties on <strong>window</strong>; attach them as properties on the <strong>exports</strong> object in CommonJS; or use an <a href=\"#modules\"><code>export</code> statement</a>. If you’re targeting both CommonJS and the browser, the <strong>existential operator</strong> (covered below), gives you a reliable way to figure out where to add them: <code>exports ? this</code></p>\n\n    <span class=\"bookmark\" id=\"conditionals\"></span>\n      <h2>If, Else, Unless, and Conditional Assignment</h2>\n<p><strong>If/else</strong> statements can be written without the use of parentheses and curly brackets. As with functions and other block expressions, multi-line conditionals are delimited by indentation. There’s also a handy postfix form, with the <code>if</code> or <code>unless</code> at the end.</p>\n<p>CoffeeScript can compile <strong>if</strong> statements into JavaScript expressions, using the ternary operator when possible, and closure wrapping otherwise. There is no explicit ternary statement in CoffeeScript — you simply use a regular <strong>if</strong> statement on a single line.</p>\n<div class='code'><pre><code>mood = greatlyImproved <span class=\"keyword\">if</span> singing\n\n<span class=\"keyword\">if</span> happy <span class=\"keyword\">and</span> knowsIt\n  clapsHands()\n  chaChaCha()\n<span class=\"keyword\">else</span>\n  showIt()\n\ndate = <span class=\"keyword\">if</span> friday <span class=\"keyword\">then</span> sue <span class=\"keyword\">else</span> jill\n</code></pre><pre><code><span class=\"keyword\">var</span> date, mood;\n\n<span class=\"keyword\">if</span> (singing) {\n  mood = greatlyImproved;\n}\n\n<span class=\"keyword\">if</span> (happy &amp;&amp; knowsIt) {\n  clapsHands();\n  chaChaCha();\n} <span class=\"keyword\">else</span> {\n  showIt();\n}\n\ndate = friday ? sue : jill;\n</code></pre><script>window.example1 = \"mood = greatlyImproved if singing\\n\\nif happy and knowsIt\\n  clapsHands()\\n  chaChaCha()\\nelse\\n  showIt()\\n\\ndate = if friday then sue else jill\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"splats\"></span>\n      <h2>Splats…</h2>\n<p>The JavaScript <strong>arguments object</strong> is a useful way to work with functions that accept variable numbers of arguments. CoffeeScript provides splats <code>...</code>, both for function definition as well as invocation, making variable numbers of arguments a little bit more palatable.</p>\n<div class='code'><pre><code>gold = silver = rest = <span class=\"string\">\"unknown\"</span>\n<span class=\"function\">\n<span class=\"title\">awardMedals</span> = <span class=\"params\">(first, second, others...)</span> -&gt;</span>\n  gold   = first\n  silver = second\n  rest   = others\n\ncontenders = [\n  <span class=\"string\">\"Michael Phelps\"</span>\n  <span class=\"string\">\"Liu Xiang\"</span>\n  <span class=\"string\">\"Yao Ming\"</span>\n  <span class=\"string\">\"Allyson Felix\"</span>\n  <span class=\"string\">\"Shawn Johnson\"</span>\n  <span class=\"string\">\"Roman Sebrle\"</span>\n  <span class=\"string\">\"Guo Jingjing\"</span>\n  <span class=\"string\">\"Tyson Gay\"</span>\n  <span class=\"string\">\"Asafa Powell\"</span>\n  <span class=\"string\">\"Usain Bolt\"</span>\n]\n\nawardMedals contenders...\n\nalert <span class=\"string\">\"Gold: \"</span> + gold\nalert <span class=\"string\">\"Silver: \"</span> + silver\nalert <span class=\"string\">\"The Field: \"</span> + rest\n</code></pre><pre><code><span class=\"keyword\">var</span> awardMedals, contenders, gold, rest, silver,\n  slice = [].slice;\n\ngold = silver = rest = <span class=\"string\">\"unknown\"</span>;\n\nawardMedals = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">var</span> first, others, second;\n  first = <span class=\"built_in\">arguments</span>[<span class=\"number\">0</span>], second = <span class=\"built_in\">arguments</span>[<span class=\"number\">1</span>], others = <span class=\"number\">3</span> &lt;= <span class=\"built_in\">arguments</span>.length ? slice.call(<span class=\"built_in\">arguments</span>, <span class=\"number\">2</span>) : [];\n  gold = first;\n  silver = second;\n  <span class=\"keyword\">return</span> rest = others;\n};\n\ncontenders = [<span class=\"string\">\"Michael Phelps\"</span>, <span class=\"string\">\"Liu Xiang\"</span>, <span class=\"string\">\"Yao Ming\"</span>, <span class=\"string\">\"Allyson Felix\"</span>, <span class=\"string\">\"Shawn Johnson\"</span>, <span class=\"string\">\"Roman Sebrle\"</span>, <span class=\"string\">\"Guo Jingjing\"</span>, <span class=\"string\">\"Tyson Gay\"</span>, <span class=\"string\">\"Asafa Powell\"</span>, <span class=\"string\">\"Usain Bolt\"</span>];\n\nawardMedals.apply(<span class=\"literal\">null</span>, contenders);\n\nalert(<span class=\"string\">\"Gold: \"</span> + gold);\n\nalert(<span class=\"string\">\"Silver: \"</span> + silver);\n\nalert(<span class=\"string\">\"The Field: \"</span> + rest);\n</code></pre><script>window.example1 = \"gold = silver = rest = \\\"unknown\\\"\\n\\nawardMedals = (first, second, others...) ->\\n  gold   = first\\n  silver = second\\n  rest   = others\\n\\ncontenders = [\\n  \\\"Michael Phelps\\\"\\n  \\\"Liu Xiang\\\"\\n  \\\"Yao Ming\\\"\\n  \\\"Allyson Felix\\\"\\n  \\\"Shawn Johnson\\\"\\n  \\\"Roman Sebrle\\\"\\n  \\\"Guo Jingjing\\\"\\n  \\\"Tyson Gay\\\"\\n  \\\"Asafa Powell\\\"\\n  \\\"Usain Bolt\\\"\\n]\\n\\nawardMedals contenders...\\n\\nalert \\\"Gold: \\\" + gold\\nalert \\\"Silver: \\\" + silver\\nalert \\\"The Field: \\\" + rest\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var awardMedals, contenders, gold, rest, silver,\n  slice = [].slice;\n\ngold = silver = rest = &quot;unknown&quot;;\n\nawardMedals = function() {\n  var first, others, second;\n  first = arguments[0], second = arguments[1], others = 3 <= arguments.length ? slice.call(arguments, 2) : [];\n  gold = first;\n  silver = second;\n  return rest = others;\n};\n\ncontenders = [&quot;Michael Phelps&quot;, &quot;Liu Xiang&quot;, &quot;Yao Ming&quot;, &quot;Allyson Felix&quot;, &quot;Shawn Johnson&quot;, &quot;Roman Sebrle&quot;, &quot;Guo Jingjing&quot;, &quot;Tyson Gay&quot;, &quot;Asafa Powell&quot;, &quot;Usain Bolt&quot;];\n\nawardMedals.apply(null, contenders);\n\nalert(&quot;Gold: &quot; + gold);\n\nalert(&quot;Silver: &quot; + silver);\n\nalert(&quot;The Field: &quot; + rest);\n;\">run</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"loops\"></span>\n      <h2>Loops and Comprehensions</h2>\n<p>Most of the loops you’ll write in CoffeeScript will be <strong>comprehensions</strong> over arrays, objects, and ranges. Comprehensions replace (and compile into) <strong>for</strong> loops, with optional guard clauses and the value of the current array index. Unlike for loops, array comprehensions are expressions, and can be returned and assigned.</p>\n<div class='code'><pre><code><span class=\"comment\"># Eat lunch.</span>\neat food <span class=\"keyword\">for</span> food <span class=\"keyword\">in</span> [<span class=\"string\">'toast'</span>, <span class=\"string\">'cheese'</span>, <span class=\"string\">'wine'</span>]\n\n<span class=\"comment\"># Fine five course dining.</span>\ncourses = [<span class=\"string\">'greens'</span>, <span class=\"string\">'caviar'</span>, <span class=\"string\">'truffles'</span>, <span class=\"string\">'roast'</span>, <span class=\"string\">'cake'</span>]\nmenu i + <span class=\"number\">1</span>, dish <span class=\"keyword\">for</span> dish, i <span class=\"keyword\">in</span> courses\n\n<span class=\"comment\"># Health conscious meal.</span>\nfoods = [<span class=\"string\">'broccoli'</span>, <span class=\"string\">'spinach'</span>, <span class=\"string\">'chocolate'</span>]\neat food <span class=\"keyword\">for</span> food <span class=\"keyword\">in</span> foods <span class=\"keyword\">when</span> food <span class=\"keyword\">isnt</span> <span class=\"string\">'chocolate'</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> courses, dish, food, foods, i, j, k, l, len, len1, len2, ref;\n\nref = [<span class=\"string\">'toast'</span>, <span class=\"string\">'cheese'</span>, <span class=\"string\">'wine'</span>];\n<span class=\"keyword\">for</span> (j = <span class=\"number\">0</span>, len = ref.length; j &lt; len; j++) {\n  food = ref[j];\n  eat(food);\n}\n\ncourses = [<span class=\"string\">'greens'</span>, <span class=\"string\">'caviar'</span>, <span class=\"string\">'truffles'</span>, <span class=\"string\">'roast'</span>, <span class=\"string\">'cake'</span>];\n\n<span class=\"keyword\">for</span> (i = k = <span class=\"number\">0</span>, len1 = courses.length; k &lt; len1; i = ++k) {\n  dish = courses[i];\n  menu(i + <span class=\"number\">1</span>, dish);\n}\n\nfoods = [<span class=\"string\">'broccoli'</span>, <span class=\"string\">'spinach'</span>, <span class=\"string\">'chocolate'</span>];\n\n<span class=\"keyword\">for</span> (l = <span class=\"number\">0</span>, len2 = foods.length; l &lt; len2; l++) {\n  food = foods[l];\n  <span class=\"keyword\">if</span> (food !== <span class=\"string\">'chocolate'</span>) {\n    eat(food);\n  }\n}\n</code></pre><script>window.example1 = \"# Eat lunch.\\neat food for food in ['toast', 'cheese', 'wine']\\n\\n# Fine five course dining.\\ncourses = ['greens', 'caviar', 'truffles', 'roast', 'cake']\\nmenu i + 1, dish for dish, i in courses\\n\\n# Health conscious meal.\\nfoods = ['broccoli', 'spinach', 'chocolate']\\neat food for food in foods when food isnt 'chocolate'\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><br class='clear' /></div><p>Comprehensions should be able to handle most places where you otherwise would use a loop, <strong>each</strong>/<strong>forEach</strong>, <strong>map</strong>, or <strong>select</strong>/<strong>filter</strong>, for example:<br>\n<code>shortNames = (name for name in list when name.length &lt; 5)</code><br>\nIf you know the start and end of your loop, or would like to step through in fixed-size increments, you can use a range to specify the start and end of your comprehension.</p>\n<div class='code'><pre><code>countdown = (num <span class=\"keyword\">for</span> num <span class=\"keyword\">in</span> [<span class=\"number\">10.</span><span class=\"number\">.1</span>])\n</code></pre><pre><code><span class=\"keyword\">var</span> countdown, num;\n\ncountdown = (<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">var</span> i, results;\n  results = [];\n  <span class=\"keyword\">for</span> (num = i = <span class=\"number\">10</span>; i &gt;= <span class=\"number\">1</span>; num = --i) {\n    results.push(num);\n  }\n  <span class=\"keyword\">return</span> results;\n})();\n</code></pre><script>window.example2 = \"countdown = (num for num in [10..1])\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example2);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var countdown, num;\n\ncountdown = (function() {\n  var i, results;\n  results = [];\n  for (num = i = 10; i >= 1; num = --i) {\n    results.push(num);\n  }\n  return results;\n})();\n;alert(countdown);\">run: countdown</div><br class='clear' /></div><p>Note how because we are assigning the value of the comprehensions to a variable in the example above, CoffeeScript is collecting the result of each iteration into an array. Sometimes functions end with loops that are intended to run only for their side-effects. Be careful that you’re not accidentally returning the results of the comprehension in these cases, by adding a meaningful return value — like <code>true</code> — or <code>null</code>, to the bottom of your function.</p>\n<p>To step through a range comprehension in fixed-size chunks, use <code>by</code>, for example:\n<code>evens = (x for x in [0..10] by 2)</code></p>\n<p>If you don’t need the current iteration value you may omit it:\n<code>browser.closeCurrentTab() for [0...count]</code></p>\n<p>Comprehensions can also be used to iterate over the keys and values in an object. Use <code>of</code> to signal comprehension over the properties of an object instead of the values in an array.</p>\n<div class='code'><pre><code>yearsOld = max: <span class=\"number\">10</span>, ida: <span class=\"number\">9</span>, tim: <span class=\"number\">11</span>\n\nages = <span class=\"keyword\">for</span> child, age <span class=\"keyword\">of</span> yearsOld\n  <span class=\"string\">\"<span class=\"subst\">#{child}</span> is <span class=\"subst\">#{age}</span>\"</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> age, ages, child, yearsOld;\n\nyearsOld = {\n  <span class=\"attr\">max</span>: <span class=\"number\">10</span>,\n  <span class=\"attr\">ida</span>: <span class=\"number\">9</span>,\n  <span class=\"attr\">tim</span>: <span class=\"number\">11</span>\n};\n\nages = (<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">var</span> results;\n  results = [];\n  <span class=\"keyword\">for</span> (child <span class=\"keyword\">in</span> yearsOld) {\n    age = yearsOld[child];\n    results.push(child + <span class=\"string\">\" is \"</span> + age);\n  }\n  <span class=\"keyword\">return</span> results;\n})();\n</code></pre><script>window.example3 = \"yearsOld = max: 10, ida: 9, tim: 11\\n\\nages = for child, age of yearsOld\\n  \\\"#{child} is #{age}\\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example3);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var age, ages, child, yearsOld;\n\nyearsOld = {\n  max: 10,\n  ida: 9,\n  tim: 11\n};\n\nages = (function() {\n  var results;\n  results = [];\n  for (child in yearsOld) {\n    age = yearsOld[child];\n    results.push(child + &quot; is &quot; + age);\n  }\n  return results;\n})();\n;alert(ages.join(&quot;, &quot;));\">run: ages.join(\", \")</div><br class='clear' /></div><p>If you would like to iterate over just the keys that are defined on the object itself, by adding a <code>hasOwnProperty</code> check to avoid properties that may be inherited from the prototype, use <code>for own key, value of object</code>.</p>\n<p>To iterate a generator function, use <code>from</code>. See <a href=\"#generator-iteration\">Generator Functions</a>.</p>\n<p>The only low-level loop that CoffeeScript provides is the <strong>while</strong> loop. The main difference from JavaScript is that the <strong>while</strong> loop can be used as an expression, returning an array containing the result of each iteration through the loop.</p>\n<div class='code'><pre><code><span class=\"comment\"># Econ 101</span>\n<span class=\"keyword\">if</span> <span class=\"keyword\">this</span>.studyingEconomics\n  buy()  <span class=\"keyword\">while</span> supply &gt; demand\n  sell() <span class=\"keyword\">until</span> supply &gt; demand\n\n<span class=\"comment\"># Nursery Rhyme</span>\nnum = <span class=\"number\">6</span>\nlyrics = <span class=\"keyword\">while</span> num -= <span class=\"number\">1</span>\n  <span class=\"string\">\"<span class=\"subst\">#{num}</span> little monkeys, jumping on the bed.\n    One fell out and bumped his head.\"</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> lyrics, num;\n\n<span class=\"keyword\">if</span> (<span class=\"keyword\">this</span>.studyingEconomics) {\n  <span class=\"keyword\">while</span> (supply &gt; demand) {\n    buy();\n  }\n  <span class=\"keyword\">while</span> (!(supply &gt; demand)) {\n    sell();\n  }\n}\n\nnum = <span class=\"number\">6</span>;\n\nlyrics = (<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">var</span> results;\n  results = [];\n  <span class=\"keyword\">while</span> (num -= <span class=\"number\">1</span>) {\n    results.push(num + <span class=\"string\">\" little monkeys, jumping on the bed. One fell out and bumped his head.\"</span>);\n  }\n  <span class=\"keyword\">return</span> results;\n})();\n</code></pre><script>window.example4 = \"# Econ 101\\nif this.studyingEconomics\\n  buy()  while supply > demand\\n  sell() until supply > demand\\n\\n# Nursery Rhyme\\nnum = 6\\nlyrics = while num -= 1\\n  \\\"#{num} little monkeys, jumping on the bed.\\n    One fell out and bumped his head.\\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example4);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var lyrics, num;\n\nif (this.studyingEconomics) {\n  while (supply > demand) {\n    buy();\n  }\n  while (!(supply > demand)) {\n    sell();\n  }\n}\n\nnum = 6;\n\nlyrics = (function() {\n  var results;\n  results = [];\n  while (num -= 1) {\n    results.push(num + &quot; little monkeys, jumping on the bed. One fell out and bumped his head.&quot;);\n  }\n  return results;\n})();\n;alert(lyrics.join(&quot;\\n&quot;));\">run: lyrics.join(\"\\n\")</div><br class='clear' /></div><p>For readability, the <strong>until</strong> keyword is equivalent to <code>while not</code>, and the <strong>loop</strong> keyword is equivalent to <code>while true</code>.</p>\n<p>When using a JavaScript loop to generate functions, it’s common to insert a closure wrapper in order to ensure that loop variables are closed over, and all the generated functions don’t just share the final values. CoffeeScript provides the <code>do</code> keyword, which immediately invokes a passed function, forwarding any arguments.</p>\n<div class='code'><pre><code><span class=\"keyword\">for</span> filename <span class=\"keyword\">in</span> list\n  <span class=\"keyword\">do</span> (filename) -&gt;\n    fs.readFile filename, <span class=\"function\"><span class=\"params\">(err, contents)</span> -&gt;</span>\n      compile filename, contents.toString()\n</code></pre><pre><code><span class=\"keyword\">var</span> filename, fn, i, len;\n\nfn = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">filename</span>) </span>{\n  <span class=\"keyword\">return</span> fs.readFile(filename, <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">err, contents</span>) </span>{\n    <span class=\"keyword\">return</span> compile(filename, contents.toString());\n  });\n};\n<span class=\"keyword\">for</span> (i = <span class=\"number\">0</span>, len = list.length; i &lt; len; i++) {\n  filename = list[i];\n  fn(filename);\n}\n</code></pre><script>window.example5 = \"for filename in list\\n  do (filename) ->\\n    fs.readFile filename, (err, contents) ->\\n      compile filename, contents.toString()\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example5);'>load</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"slices\"></span>\n      <h2>Array Slicing and Splicing with Ranges</h2>\n<p>Ranges can also be used to extract slices of arrays. With two dots (<code>3..6</code>), the range is inclusive (<code>3, 4, 5, 6</code>); with three dots (<code>3...6</code>), the range excludes the end (<code>3, 4, 5</code>). Slices indices have useful defaults. An omitted first index defaults to zero and an omitted second index defaults to the size of the array.</p>\n<div class='code'><pre><code>numbers = [<span class=\"number\">1</span>, <span class=\"number\">2</span>, <span class=\"number\">3</span>, <span class=\"number\">4</span>, <span class=\"number\">5</span>, <span class=\"number\">6</span>, <span class=\"number\">7</span>, <span class=\"number\">8</span>, <span class=\"number\">9</span>]\n\nstart   = numbers[<span class=\"number\">0.</span><span class=\"number\">.2</span>]\n\nmiddle  = numbers[<span class=\"number\">3.</span>..<span class=\"number\">-2</span>]\n\nend     = numbers[<span class=\"number\">-2.</span>.]\n\ncopy    = numbers[..]\n</code></pre><pre><code><span class=\"keyword\">var</span> copy, end, middle, numbers, start;\n\nnumbers = [<span class=\"number\">1</span>, <span class=\"number\">2</span>, <span class=\"number\">3</span>, <span class=\"number\">4</span>, <span class=\"number\">5</span>, <span class=\"number\">6</span>, <span class=\"number\">7</span>, <span class=\"number\">8</span>, <span class=\"number\">9</span>];\n\nstart = numbers.slice(<span class=\"number\">0</span>, <span class=\"number\">3</span>);\n\nmiddle = numbers.slice(<span class=\"number\">3</span>, <span class=\"number\">-2</span>);\n\nend = numbers.slice(<span class=\"number\">-2</span>);\n\ncopy = numbers.slice(<span class=\"number\">0</span>);\n</code></pre><script>window.example1 = \"numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]\\n\\nstart   = numbers[0..2]\\n\\nmiddle  = numbers[3...-2]\\n\\nend     = numbers[-2..]\\n\\ncopy    = numbers[..]\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var copy, end, middle, numbers, start;\n\nnumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n\nstart = numbers.slice(0, 3);\n\nmiddle = numbers.slice(3, -2);\n\nend = numbers.slice(-2);\n\ncopy = numbers.slice(0);\n;alert(middle);\">run: middle</div><br class='clear' /></div><p>The same syntax can be used with assignment to replace a segment of an array with new values, splicing it.</p>\n<div class='code'><pre><code>numbers = [<span class=\"number\">0</span>, <span class=\"number\">1</span>, <span class=\"number\">2</span>, <span class=\"number\">3</span>, <span class=\"number\">4</span>, <span class=\"number\">5</span>, <span class=\"number\">6</span>, <span class=\"number\">7</span>, <span class=\"number\">8</span>, <span class=\"number\">9</span>]\n\nnumbers[<span class=\"number\">3.</span><span class=\"number\">.6</span>] = [<span class=\"number\">-3</span>, <span class=\"number\">-4</span>, <span class=\"number\">-5</span>, <span class=\"number\">-6</span>]\n</code></pre><pre><code><span class=\"keyword\">var</span> numbers, ref;\n\nnumbers = [<span class=\"number\">0</span>, <span class=\"number\">1</span>, <span class=\"number\">2</span>, <span class=\"number\">3</span>, <span class=\"number\">4</span>, <span class=\"number\">5</span>, <span class=\"number\">6</span>, <span class=\"number\">7</span>, <span class=\"number\">8</span>, <span class=\"number\">9</span>];\n\n[].splice.apply(numbers, [<span class=\"number\">3</span>, <span class=\"number\">4</span>].concat(ref = [<span class=\"number\">-3</span>, <span class=\"number\">-4</span>, <span class=\"number\">-5</span>, <span class=\"number\">-6</span>])), ref;\n</code></pre><script>window.example2 = \"numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\\n\\nnumbers[3..6] = [-3, -4, -5, -6]\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example2);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var numbers, ref;\n\nnumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n\n[].splice.apply(numbers, [3, 4].concat(ref = [-3, -4, -5, -6])), ref;\n;alert(numbers);\">run: numbers</div><br class='clear' /></div><p>Note that JavaScript strings are immutable, and can’t be spliced.</p>\n\n    <span class=\"bookmark\" id=\"expressions\"></span>\n      <h2>Everything is an Expression (at least, as much as possible)</h2>\n<p>You might have noticed how even though we don’t add return statements to CoffeeScript functions, they nonetheless return their final value. The CoffeeScript compiler tries to make sure that all statements in the language can be used as expressions. Watch how the <code>return</code> gets pushed down into each possible branch of execution in the function below.</p>\n<div class='code'><pre><code><span class=\"function\"><span class=\"title\">grade</span> = <span class=\"params\">(student)</span> -&gt;</span>\n  <span class=\"keyword\">if</span> student.excellentWork\n    <span class=\"string\">\"A+\"</span>\n  <span class=\"keyword\">else</span> <span class=\"keyword\">if</span> student.okayStuff\n    <span class=\"keyword\">if</span> student.triedHard <span class=\"keyword\">then</span> <span class=\"string\">\"B\"</span> <span class=\"keyword\">else</span> <span class=\"string\">\"B-\"</span>\n  <span class=\"keyword\">else</span>\n    <span class=\"string\">\"C\"</span>\n\neldest = <span class=\"keyword\">if</span> <span class=\"number\">24</span> &gt; <span class=\"number\">21</span> <span class=\"keyword\">then</span> <span class=\"string\">\"Liz\"</span> <span class=\"keyword\">else</span> <span class=\"string\">\"Ike\"</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> eldest, grade;\n\ngrade = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">student</span>) </span>{\n  <span class=\"keyword\">if</span> (student.excellentWork) {\n    <span class=\"keyword\">return</span> <span class=\"string\">\"A+\"</span>;\n  } <span class=\"keyword\">else</span> <span class=\"keyword\">if</span> (student.okayStuff) {\n    <span class=\"keyword\">if</span> (student.triedHard) {\n      <span class=\"keyword\">return</span> <span class=\"string\">\"B\"</span>;\n    } <span class=\"keyword\">else</span> {\n      <span class=\"keyword\">return</span> <span class=\"string\">\"B-\"</span>;\n    }\n  } <span class=\"keyword\">else</span> {\n    <span class=\"keyword\">return</span> <span class=\"string\">\"C\"</span>;\n  }\n};\n\neldest = <span class=\"number\">24</span> &gt; <span class=\"number\">21</span> ? <span class=\"string\">\"Liz\"</span> : <span class=\"string\">\"Ike\"</span>;\n</code></pre><script>window.example1 = \"grade = (student) ->\\n  if student.excellentWork\\n    \\\"A+\\\"\\n  else if student.okayStuff\\n    if student.triedHard then \\\"B\\\" else \\\"B-\\\"\\n  else\\n    \\\"C\\\"\\n\\neldest = if 24 > 21 then \\\"Liz\\\" else \\\"Ike\\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var eldest, grade;\n\ngrade = function(student) {\n  if (student.excellentWork) {\n    return &quot;A+&quot;;\n  } else if (student.okayStuff) {\n    if (student.triedHard) {\n      return &quot;B&quot;;\n    } else {\n      return &quot;B-&quot;;\n    }\n  } else {\n    return &quot;C&quot;;\n  }\n};\n\neldest = 24 > 21 ? &quot;Liz&quot; : &quot;Ike&quot;;\n;alert(eldest);\">run: eldest</div><br class='clear' /></div><p>Even though functions will always return their final value, it’s both possible and encouraged to return early from a function body writing out the explicit return (<code>return value</code>), when you know that you’re done.</p>\n<p>Because variable declarations occur at the top of scope, assignment can be used within expressions, even for variables that haven’t been seen before:</p>\n<div class='code'><pre><code>six = (one = <span class=\"number\">1</span>) + (two = <span class=\"number\">2</span>) + (three = <span class=\"number\">3</span>)\n</code></pre><pre><code><span class=\"keyword\">var</span> one, six, three, two;\n\nsix = (one = <span class=\"number\">1</span>) + (two = <span class=\"number\">2</span>) + (three = <span class=\"number\">3</span>);\n</code></pre><script>window.example2 = \"six = (one = 1) + (two = 2) + (three = 3)\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example2);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var one, six, three, two;\n\nsix = (one = 1) + (two = 2) + (three = 3);\n;alert(six);\">run: six</div><br class='clear' /></div><p>Things that would otherwise be statements in JavaScript, when used as part of an expression in CoffeeScript, are converted into expressions by wrapping them in a closure. This lets you do useful things, like assign the result of a comprehension to a variable:</p>\n<div class='code'><pre><code><span class=\"comment\"># The first ten global properties.</span>\n\nglobals = (name <span class=\"keyword\">for</span> name <span class=\"keyword\">of</span> <span class=\"built_in\">window</span>)[<span class=\"number\">0.</span>.<span class=\"number\">.10</span>]\n</code></pre><pre><code><span class=\"keyword\">var</span> globals, name;\n\nglobals = ((<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">var</span> results;\n  results = [];\n  <span class=\"keyword\">for</span> (name <span class=\"keyword\">in</span> <span class=\"built_in\">window</span>) {\n    results.push(name);\n  }\n  <span class=\"keyword\">return</span> results;\n})()).slice(<span class=\"number\">0</span>, <span class=\"number\">10</span>);\n</code></pre><script>window.example3 = \"# The first ten global properties.\\n\\nglobals = (name for name of window)[0...10]\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example3);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var globals, name;\n\nglobals = ((function() {\n  var results;\n  results = [];\n  for (name in window) {\n    results.push(name);\n  }\n  return results;\n})()).slice(0, 10);\n;alert(globals);\">run: globals</div><br class='clear' /></div><p>As well as silly things, like passing a <strong>try/catch</strong> statement directly into a function call:</p>\n<div class='code'><pre><code>alert(\n  <span class=\"keyword\">try</span>\n    nonexistent / <span class=\"literal\">undefined</span>\n  <span class=\"keyword\">catch</span> error\n    <span class=\"string\">\"And the error is ... <span class=\"subst\">#{error}</span>\"</span>\n)\n</code></pre><pre><code><span class=\"keyword\">var</span> error;\n\nalert((<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">try</span> {\n    <span class=\"keyword\">return</span> nonexistent / <span class=\"keyword\">void</span> <span class=\"number\">0</span>;\n  } <span class=\"keyword\">catch</span> (error1) {\n    error = error1;\n    <span class=\"keyword\">return</span> <span class=\"string\">\"And the error is ... \"</span> + error;\n  }\n})());\n</code></pre><script>window.example4 = \"alert(\\n  try\\n    nonexistent / undefined\\n  catch error\\n    \\\"And the error is ... #{error}\\\"\\n)\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example4);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var error;\n\nalert((function() {\n  try {\n    return nonexistent / void 0;\n  } catch (error1) {\n    error = error1;\n    return &quot;And the error is ... &quot; + error;\n  }\n})());\n;\">run</div><br class='clear' /></div><p>There are a handful of statements in JavaScript that can’t be meaningfully converted into expressions, namely <code>break</code>, <code>continue</code>, and <code>return</code>. If you make use of them within a block of code, CoffeeScript won’t try to perform the conversion.</p>\n\n    <span class=\"bookmark\" id=\"operators\"></span>\n      <h2>Operators and Aliases</h2>\n<p>Because the <code>==</code> operator frequently causes undesirable coercion, is intransitive, and has a different meaning than in other languages, CoffeeScript compiles <code>==</code> into <code>===</code>, and <code>!=</code> into <code>!==</code>. In addition, <code>is</code> compiles into <code>===</code>, and <code>isnt</code> into <code>!==</code>.</p>\n<p>You can use <code>not</code> as an alias for <code>!</code>.</p>\n<p>For logic, <code>and</code> compiles to <code>&amp;&amp;</code>, and <code>or</code> into <code>||</code>.</p>\n<p>Instead of a newline or semicolon, <code>then</code> can be used to separate conditions from expressions, in <strong>while</strong>, <strong>if</strong>/<strong>else</strong>, and <strong>switch</strong>/<strong>when</strong> statements.</p>\n<p>As in <a href=\"http://yaml.org/\">YAML</a>, <code>on</code> and <code>yes</code> are the same as boolean <code>true</code>, while <code>off</code> and <code>no</code> are boolean <code>false</code>.</p>\n<p><code>unless</code> can be used as the inverse of <code>if</code>.</p>\n<p>As a shortcut for <code>this.property</code>, you can use <code>@property</code>.</p>\n<p>You can use <code>in</code> to test for array presence, and <code>of</code> to test for JavaScript object-key presence.</p>\n<p>To simplify math expressions, <code>**</code> can be used for exponentiation and <code>//</code> performs integer division. <code>%</code> works just like in JavaScript, while <code>%%</code> provides <a href=\"https://en.wikipedia.org/wiki/Modulo_operation\">“dividend dependent modulo”</a>:</p>\n<div class='code'><pre><code><span class=\"number\">-7</span> % <span class=\"number\">5</span> == <span class=\"number\">-2</span> <span class=\"comment\"># The remainder of 7 / 5</span>\n<span class=\"number\">-7</span> %% <span class=\"number\">5</span> == <span class=\"number\">3</span> <span class=\"comment\"># n %% 5 is always between 0 and 4</span>\n\ntabs.selectTabAtIndex((tabs.currentIndex - count) %% tabs.length)\n</code></pre><pre><code><span class=\"keyword\">var</span> modulo = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">a, b</span>) </span>{ <span class=\"keyword\">return</span> (+a % (b = +b) + b) % b; };\n\n<span class=\"number\">-7</span> % <span class=\"number\">5</span> === <span class=\"number\">-2</span>;\n\nmodulo(<span class=\"number\">-7</span>, <span class=\"number\">5</span>) === <span class=\"number\">3</span>;\n\ntabs.selectTabAtIndex(modulo(tabs.currentIndex - count, tabs.length));\n</code></pre><script>window.example1 = \"-7 % 5 == -2 # The remainder of 7 / 5\\n-7 %% 5 == 3 # n %% 5 is always between 0 and 4\\n\\ntabs.selectTabAtIndex((tabs.currentIndex - count) %% tabs.length)\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><br class='clear' /></div><p>All together now:</p>\n<table>\n<thead>\n<tr>\n<th>CoffeeScript</th>\n<th>JavaScript</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>is</code></td>\n<td><code>===</code></td>\n</tr>\n<tr>\n<td><code>isnt</code></td>\n<td><code>!==</code></td>\n</tr>\n<tr>\n<td><code>not</code></td>\n<td><code>!</code></td>\n</tr>\n<tr>\n<td><code>and</code></td>\n<td><code>&amp;&amp;</code></td>\n</tr>\n<tr>\n<td><code>or</code></td>\n<td><code>||</code></td>\n</tr>\n<tr>\n<td><code>true</code>, <code>yes</code>, <code>on</code></td>\n<td><code>true</code></td>\n</tr>\n<tr>\n<td><code>false</code>, <code>no</code>, <code>off</code> </td>\n<td><code>false</code></td>\n</tr>\n<tr>\n<td><code>@</code>, <code>this</code></td>\n<td><code>this</code></td>\n</tr>\n<tr>\n<td><code>of</code></td>\n<td><code>in</code></td>\n</tr>\n<tr>\n<td><code>in</code></td>\n<td><em>no JS equivalent</em></td>\n</tr>\n<tr>\n<td><code>a ** b</code></td>\n<td><code>Math.pow(a, b)</code></td>\n</tr>\n<tr>\n<td><code>a // b</code></td>\n<td><code>Math.floor(a / b)</code></td>\n</tr>\n<tr>\n<td><code>a %% b</code></td>\n<td><code>(a % b + b) % b</code></td>\n</tr>\n</tbody>\n</table>\n<div class='code'><pre><code>launch() <span class=\"keyword\">if</span> ignition <span class=\"keyword\">is</span> <span class=\"literal\">on</span>\n\nvolume = <span class=\"number\">10</span> <span class=\"keyword\">if</span> band <span class=\"keyword\">isnt</span> SpinalTap\n\nletTheWildRumpusBegin() <span class=\"keyword\">unless</span> answer <span class=\"keyword\">is</span> <span class=\"literal\">no</span>\n\n<span class=\"keyword\">if</span> car.speed &lt; limit <span class=\"keyword\">then</span> accelerate()\n\nwinner = <span class=\"literal\">yes</span> <span class=\"keyword\">if</span> pick <span class=\"keyword\">in</span> [<span class=\"number\">47</span>, <span class=\"number\">92</span>, <span class=\"number\">13</span>]\n\n<span class=\"built_in\">print</span> inspect <span class=\"string\">\"My name is <span class=\"subst\">#{@name}</span>\"</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> volume, winner;\n\n<span class=\"keyword\">if</span> (ignition === <span class=\"literal\">true</span>) {\n  launch();\n}\n\n<span class=\"keyword\">if</span> (band !== SpinalTap) {\n  volume = <span class=\"number\">10</span>;\n}\n\n<span class=\"keyword\">if</span> (answer !== <span class=\"literal\">false</span>) {\n  letTheWildRumpusBegin();\n}\n\n<span class=\"keyword\">if</span> (car.speed &lt; limit) {\n  accelerate();\n}\n\n<span class=\"keyword\">if</span> (pick === <span class=\"number\">47</span> || pick === <span class=\"number\">92</span> || pick === <span class=\"number\">13</span>) {\n  winner = <span class=\"literal\">true</span>;\n}\n\nprint(inspect(<span class=\"string\">\"My name is \"</span> + <span class=\"keyword\">this</span>.name));\n</code></pre><script>window.example2 = \"launch() if ignition is on\\n\\nvolume = 10 if band isnt SpinalTap\\n\\nletTheWildRumpusBegin() unless answer is no\\n\\nif car.speed < limit then accelerate()\\n\\nwinner = yes if pick in [47, 92, 13]\\n\\nprint inspect \\\"My name is #{@name}\\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example2);'>load</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"existential-operator\"></span>\n      <h2>The Existential Operator</h2>\n<p>It’s a little difficult to check for the existence of a variable in JavaScript. <code>if (variable) …</code> comes close, but fails for zero, the empty string, and false. CoffeeScript’s existential operator <code>?</code> returns true unless a variable is <strong>null</strong> or <strong>undefined</strong>, which makes it analogous to Ruby’s <code>nil?</code></p>\n<p>It can also be used for safer conditional assignment than <code>||=</code> provides, for cases where you may be handling numbers or strings.</p>\n<div class='code'><pre><code>solipsism = <span class=\"literal\">true</span> <span class=\"keyword\">if</span> mind? <span class=\"keyword\">and</span> <span class=\"keyword\">not</span> world?\n\nspeed = <span class=\"number\">0</span>\nspeed ?= <span class=\"number\">15</span>\n\nfootprints = yeti ? <span class=\"string\">\"bear\"</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> footprints, solipsism, speed;\n\n<span class=\"keyword\">if</span> ((<span class=\"keyword\">typeof</span> mind !== <span class=\"string\">\"undefined\"</span> &amp;&amp; mind !== <span class=\"literal\">null</span>) &amp;&amp; (<span class=\"keyword\">typeof</span> world === <span class=\"string\">\"undefined\"</span> || world === <span class=\"literal\">null</span>)) {\n  solipsism = <span class=\"literal\">true</span>;\n}\n\nspeed = <span class=\"number\">0</span>;\n\n<span class=\"keyword\">if</span> (speed == <span class=\"literal\">null</span>) {\n  speed = <span class=\"number\">15</span>;\n}\n\nfootprints = <span class=\"keyword\">typeof</span> yeti !== <span class=\"string\">\"undefined\"</span> &amp;&amp; yeti !== <span class=\"literal\">null</span> ? yeti : <span class=\"string\">\"bear\"</span>;\n</code></pre><script>window.example1 = \"solipsism = true if mind? and not world?\\n\\nspeed = 0\\nspeed ?= 15\\n\\nfootprints = yeti ? \\\"bear\\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var footprints, solipsism, speed;\n\nif ((typeof mind !== &quot;undefined&quot; && mind !== null) && (typeof world === &quot;undefined&quot; || world === null)) {\n  solipsism = true;\n}\n\nspeed = 0;\n\nif (speed == null) {\n  speed = 15;\n}\n\nfootprints = typeof yeti !== &quot;undefined&quot; && yeti !== null ? yeti : &quot;bear&quot;;\n;alert(footprints);\">run: footprints</div><br class='clear' /></div><p>The accessor variant of the existential operator <code>?.</code> can be used to soak up null references in a chain of properties. Use it instead of the dot accessor <code>.</code> in cases where the base value may be <strong>null</strong> or <strong>undefined</strong>. If all of the properties exist then you’ll get the expected result, if the chain is broken, <strong>undefined</strong> is returned instead of the <strong>TypeError</strong> that would be raised otherwise.</p>\n<div class='code'><pre><code>zip = lottery.drawWinner?().address?.zipcode\n</code></pre><pre><code><span class=\"keyword\">var</span> ref, zip;\n\nzip = <span class=\"keyword\">typeof</span> lottery.drawWinner === <span class=\"string\">\"function\"</span> ? (ref = lottery.drawWinner().address) != <span class=\"literal\">null</span> ? ref.zipcode : <span class=\"keyword\">void</span> <span class=\"number\">0</span> : <span class=\"keyword\">void</span> <span class=\"number\">0</span>;\n</code></pre><script>window.example2 = \"zip = lottery.drawWinner?().address?.zipcode\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example2);'>load</div><br class='clear' /></div><p>Soaking up nulls is similar to Ruby’s <a href=\"https://rubygems.org/gems/andand\">andand gem</a>, and to the <a href=\"http://docs.groovy-lang.org/latest/html/documentation/index.html#_safe_navigation_operator\">safe navigation operator</a> in Groovy.</p>\n\n    <span class=\"bookmark\" id=\"classes\"></span>\n      <h2>Classes, Inheritance, and Super</h2>\n<p>JavaScript’s prototypal inheritance has always been a bit of a brain-bender, with a whole family tree of libraries that provide a cleaner syntax for classical inheritance on top of JavaScript’s prototypes: <a href=\"https://code.google.com/p/base2/\">Base2</a>, <a href=\"http://prototypejs.org/\">Prototype.js</a>, <a href=\"http://jsclass.jcoglan.com/\">JS.Class</a>, etc. The libraries provide syntactic sugar, but the built-in inheritance would be completely usable if it weren’t for a couple of small exceptions: it’s awkward to call <strong>super</strong> (the prototype object’s implementation of the current function), and it’s awkward to correctly set the prototype chain.</p>\n<p>Instead of repetitively attaching functions to a prototype, CoffeeScript provides a basic <code>class</code> structure that allows you to name your class, set the superclass, assign prototypal properties, and define the constructor, in a single assignable expression.</p>\n<p>Constructor functions are named, to better support helpful stack traces. In the first class in the example below, <code>this.constructor.name is &quot;Animal&quot;</code>.</p>\n<div class='code'><pre><code><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Animal</span></span>\n  constructor: <span class=\"function\"><span class=\"params\">(@name)</span> -&gt;</span>\n\n  move: <span class=\"function\"><span class=\"params\">(meters)</span> -&gt;</span>\n    alert @name + <span class=\"string\">\" moved <span class=\"subst\">#{meters}</span>m.\"</span>\n\n<span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Snake</span> <span class=\"keyword\">extends</span> <span class=\"title\">Animal</span></span>\n  move: <span class=\"function\">-&gt;</span>\n    alert <span class=\"string\">\"Slithering...\"</span>\n    <span class=\"keyword\">super</span> <span class=\"number\">5</span>\n\n<span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Horse</span> <span class=\"keyword\">extends</span> <span class=\"title\">Animal</span></span>\n  move: <span class=\"function\">-&gt;</span>\n    alert <span class=\"string\">\"Galloping...\"</span>\n    <span class=\"keyword\">super</span> <span class=\"number\">45</span>\n\nsam = <span class=\"keyword\">new</span> Snake <span class=\"string\">\"Sammy the Python\"</span>\ntom = <span class=\"keyword\">new</span> Horse <span class=\"string\">\"Tommy the Palomino\"</span>\n\nsam.move()\ntom.move()\n</code></pre><pre><code><span class=\"keyword\">var</span> Animal, Horse, Snake, sam, tom,\n  extend = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">child, parent</span>) </span>{ <span class=\"keyword\">for</span> (<span class=\"keyword\">var</span> key <span class=\"keyword\">in</span> parent) { <span class=\"keyword\">if</span> (hasProp.call(parent, key)) child[key] = parent[key]; } <span class=\"function\"><span class=\"keyword\">function</span> <span class=\"title\">ctor</span>(<span class=\"params\"></span>) </span>{ <span class=\"keyword\">this</span>.constructor = child; } ctor.prototype = parent.prototype; child.prototype = <span class=\"keyword\">new</span> ctor(); child.__super__ = parent.prototype; <span class=\"keyword\">return</span> child; },\n  hasProp = {}.hasOwnProperty;\n\nAnimal = (<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"function\"><span class=\"keyword\">function</span> <span class=\"title\">Animal</span>(<span class=\"params\">name</span>) </span>{\n    <span class=\"keyword\">this</span>.name = name;\n  }\n\n  Animal.prototype.move = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">meters</span>) </span>{\n    <span class=\"keyword\">return</span> alert(<span class=\"keyword\">this</span>.name + (<span class=\"string\">\" moved \"</span> + meters + <span class=\"string\">\"m.\"</span>));\n  };\n\n  <span class=\"keyword\">return</span> Animal;\n\n})();\n\nSnake = (<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">superClass</span>) </span>{\n  extend(Snake, superClass);\n\n  <span class=\"function\"><span class=\"keyword\">function</span> <span class=\"title\">Snake</span>(<span class=\"params\"></span>) </span>{\n    <span class=\"keyword\">return</span> Snake.__super__.constructor.apply(<span class=\"keyword\">this</span>, <span class=\"built_in\">arguments</span>);\n  }\n\n  Snake.prototype.move = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n    alert(<span class=\"string\">\"Slithering...\"</span>);\n    <span class=\"keyword\">return</span> Snake.__super__.move.call(<span class=\"keyword\">this</span>, <span class=\"number\">5</span>);\n  };\n\n  <span class=\"keyword\">return</span> Snake;\n\n})(Animal);\n\nHorse = (<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">superClass</span>) </span>{\n  extend(Horse, superClass);\n\n  <span class=\"function\"><span class=\"keyword\">function</span> <span class=\"title\">Horse</span>(<span class=\"params\"></span>) </span>{\n    <span class=\"keyword\">return</span> Horse.__super__.constructor.apply(<span class=\"keyword\">this</span>, <span class=\"built_in\">arguments</span>);\n  }\n\n  Horse.prototype.move = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n    alert(<span class=\"string\">\"Galloping...\"</span>);\n    <span class=\"keyword\">return</span> Horse.__super__.move.call(<span class=\"keyword\">this</span>, <span class=\"number\">45</span>);\n  };\n\n  <span class=\"keyword\">return</span> Horse;\n\n})(Animal);\n\nsam = <span class=\"keyword\">new</span> Snake(<span class=\"string\">\"Sammy the Python\"</span>);\n\ntom = <span class=\"keyword\">new</span> Horse(<span class=\"string\">\"Tommy the Palomino\"</span>);\n\nsam.move();\n\ntom.move();\n</code></pre><script>window.example1 = \"class Animal\\n  constructor: (@name) ->\\n\\n  move: (meters) ->\\n    alert @name + \\\" moved #{meters}m.\\\"\\n\\nclass Snake extends Animal\\n  move: ->\\n    alert \\\"Slithering...\\\"\\n    super 5\\n\\nclass Horse extends Animal\\n  move: ->\\n    alert \\\"Galloping...\\\"\\n    super 45\\n\\nsam = new Snake \\\"Sammy the Python\\\"\\ntom = new Horse \\\"Tommy the Palomino\\\"\\n\\nsam.move()\\ntom.move()\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var Animal, Horse, Snake, sam, tom,\n  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\nAnimal = (function() {\n  function Animal(name) {\n    this.name = name;\n  }\n\n  Animal.prototype.move = function(meters) {\n    return alert(this.name + (&quot; moved &quot; + meters + &quot;m.&quot;));\n  };\n\n  return Animal;\n\n})();\n\nSnake = (function(superClass) {\n  extend(Snake, superClass);\n\n  function Snake() {\n    return Snake.__super__.constructor.apply(this, arguments);\n  }\n\n  Snake.prototype.move = function() {\n    alert(&quot;Slithering...&quot;);\n    return Snake.__super__.move.call(this, 5);\n  };\n\n  return Snake;\n\n})(Animal);\n\nHorse = (function(superClass) {\n  extend(Horse, superClass);\n\n  function Horse() {\n    return Horse.__super__.constructor.apply(this, arguments);\n  }\n\n  Horse.prototype.move = function() {\n    alert(&quot;Galloping...&quot;);\n    return Horse.__super__.move.call(this, 45);\n  };\n\n  return Horse;\n\n})(Animal);\n\nsam = new Snake(&quot;Sammy the Python&quot;);\n\ntom = new Horse(&quot;Tommy the Palomino&quot;);\n\nsam.move();\n\ntom.move();\n;\">run</div><br class='clear' /></div><p>If structuring your prototypes classically isn’t your cup of tea, CoffeeScript provides a couple of lower-level conveniences. The <code>extends</code> operator helps with proper prototype setup, and can be used to create an inheritance chain between any pair of constructor functions; <code>::</code> gives you quick access to an object’s prototype; and <code>super()</code> is converted into a call against the immediate ancestor’s method of the same name.</p>\n<div class='code'><pre><code>String::dasherize = <span class=\"function\">-&gt;</span>\n  <span class=\"keyword\">this</span>.replace <span class=\"regexp\">/_/g</span>, <span class=\"string\">\"-\"</span>\n</code></pre><pre><code><span class=\"built_in\">String</span>.prototype.dasherize = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">return</span> <span class=\"keyword\">this</span>.replace(<span class=\"regexp\">/_/g</span>, <span class=\"string\">\"-\"</span>);\n};\n</code></pre><script>window.example2 = \"String::dasherize = ->\\n  this.replace /_/g, \\\"-\\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example2);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: String.prototype.dasherize = function() {\n  return this.replace(/_/g, &quot;-&quot;);\n};\n;alert(&quot;one_two&quot;.dasherize());\">run: \"one_two\".dasherize()</div><br class='clear' /></div><p>Finally, class definitions are blocks of executable code, which make for interesting metaprogramming possibilities. Because in the context of a class definition, <code>this</code> is the class object itself (the constructor function), you can assign static properties by using\n<code>@property: value</code>, and call functions defined in parent classes: <code>@attr 'title', type: 'text'</code></p>\n\n    <span class=\"bookmark\" id=\"destructuring\"></span>\n      <h2>Destructuring Assignment</h2>\n<p>Just like JavaScript (since ES2015), CoffeeScript has destructuring assignment syntax. When you assign an array or object literal to a value, CoffeeScript breaks up and matches both sides against each other, assigning the values on the right to the variables on the left. In the simplest case, it can be used for parallel assignment:</p>\n<div class='code'><pre><code>theBait   = <span class=\"number\">1000</span>\ntheSwitch = <span class=\"number\">0</span>\n\n[theBait, theSwitch] = [theSwitch, theBait]\n</code></pre><pre><code><span class=\"keyword\">var</span> ref, theBait, theSwitch;\n\ntheBait = <span class=\"number\">1000</span>;\n\ntheSwitch = <span class=\"number\">0</span>;\n\nref = [theSwitch, theBait], theBait = ref[<span class=\"number\">0</span>], theSwitch = ref[<span class=\"number\">1</span>];\n</code></pre><script>window.example1 = \"theBait   = 1000\\ntheSwitch = 0\\n\\n[theBait, theSwitch] = [theSwitch, theBait]\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var ref, theBait, theSwitch;\n\ntheBait = 1000;\n\ntheSwitch = 0;\n\nref = [theSwitch, theBait], theBait = ref[0], theSwitch = ref[1];\n;alert(theBait);\">run: theBait</div><br class='clear' /></div><p>But it’s also helpful for dealing with functions that return multiple values.</p>\n<div class='code'><pre><code><span class=\"function\"><span class=\"title\">weatherReport</span> = <span class=\"params\">(location)</span> -&gt;</span>\n  <span class=\"comment\"># Make an Ajax request to fetch the weather...</span>\n  [location, <span class=\"number\">72</span>, <span class=\"string\">\"Mostly Sunny\"</span>]\n\n[city, temp, forecast] = weatherReport <span class=\"string\">\"Berkeley, CA\"</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> city, forecast, ref, temp, weatherReport;\n\nweatherReport = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">location</span>) </span>{\n  <span class=\"keyword\">return</span> [location, <span class=\"number\">72</span>, <span class=\"string\">\"Mostly Sunny\"</span>];\n};\n\nref = weatherReport(<span class=\"string\">\"Berkeley, CA\"</span>), city = ref[<span class=\"number\">0</span>], temp = ref[<span class=\"number\">1</span>], forecast = ref[<span class=\"number\">2</span>];\n</code></pre><script>window.example2 = \"weatherReport = (location) ->\\n  # Make an Ajax request to fetch the weather...\\n  [location, 72, \\\"Mostly Sunny\\\"]\\n\\n[city, temp, forecast] = weatherReport \\\"Berkeley, CA\\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example2);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var city, forecast, ref, temp, weatherReport;\n\nweatherReport = function(location) {\n  return [location, 72, &quot;Mostly Sunny&quot;];\n};\n\nref = weatherReport(&quot;Berkeley, CA&quot;), city = ref[0], temp = ref[1], forecast = ref[2];\n;alert(forecast);\">run: forecast</div><br class='clear' /></div><p>Destructuring assignment can be used with any depth of array and object nesting, to help pull out deeply nested properties.</p>\n<div class='code'><pre><code>futurists =\n  sculptor: <span class=\"string\">\"Umberto Boccioni\"</span>\n  painter:  <span class=\"string\">\"Vladimir Burliuk\"</span>\n  poet:\n    name:   <span class=\"string\">\"F.T. Marinetti\"</span>\n    address: [\n      <span class=\"string\">\"Via Roma 42R\"</span>\n      <span class=\"string\">\"Bellagio, Italy 22021\"</span>\n    ]\n\n{sculptor} = futurists\n\n{poet: {name, address: [street, city]}} = futurists\n</code></pre><pre><code><span class=\"keyword\">var</span> city, futurists, name, ref, ref1, sculptor, street;\n\nfuturists = {\n  <span class=\"attr\">sculptor</span>: <span class=\"string\">\"Umberto Boccioni\"</span>,\n  <span class=\"attr\">painter</span>: <span class=\"string\">\"Vladimir Burliuk\"</span>,\n  <span class=\"attr\">poet</span>: {\n    <span class=\"attr\">name</span>: <span class=\"string\">\"F.T. Marinetti\"</span>,\n    <span class=\"attr\">address</span>: [<span class=\"string\">\"Via Roma 42R\"</span>, <span class=\"string\">\"Bellagio, Italy 22021\"</span>]\n  }\n};\n\nsculptor = futurists.sculptor;\n\nref = futurists.poet, name = ref.name, (ref1 = ref.address, street = ref1[<span class=\"number\">0</span>], city = ref1[<span class=\"number\">1</span>]);\n</code></pre><script>window.example3 = \"futurists =\\n  sculptor: \\\"Umberto Boccioni\\\"\\n  painter:  \\\"Vladimir Burliuk\\\"\\n  poet:\\n    name:   \\\"F.T. Marinetti\\\"\\n    address: [\\n      \\\"Via Roma 42R\\\"\\n      \\\"Bellagio, Italy 22021\\\"\\n    ]\\n\\n{sculptor} = futurists\\n\\n{poet: {name, address: [street, city]}} = futurists\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example3);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var city, futurists, name, ref, ref1, sculptor, street;\n\nfuturists = {\n  sculptor: &quot;Umberto Boccioni&quot;,\n  painter: &quot;Vladimir Burliuk&quot;,\n  poet: {\n    name: &quot;F.T. Marinetti&quot;,\n    address: [&quot;Via Roma 42R&quot;, &quot;Bellagio, Italy 22021&quot;]\n  }\n};\n\nsculptor = futurists.sculptor;\n\nref = futurists.poet, name = ref.name, (ref1 = ref.address, street = ref1[0], city = ref1[1]);\n;alert(name + &quot;-&quot; + street);\">run: name + \"-\" + street</div><br class='clear' /></div><p>Destructuring assignment can even be combined with splats.</p>\n<div class='code'><pre><code>tag = <span class=\"string\">\"&lt;impossible&gt;\"</span>\n\n[open, contents..., close] = tag.split(<span class=\"string\">\"\"</span>)\n</code></pre><pre><code><span class=\"keyword\">var</span> close, contents, i, open, ref, tag,\n  slice = [].slice;\n\ntag = <span class=\"string\">\"&lt;impossible&gt;\"</span>;\n\nref = tag.split(<span class=\"string\">\"\"</span>), open = ref[<span class=\"number\">0</span>], contents = <span class=\"number\">3</span> &lt;= ref.length ? slice.call(ref, <span class=\"number\">1</span>, i = ref.length - <span class=\"number\">1</span>) : (i = <span class=\"number\">1</span>, []), close = ref[i++];\n</code></pre><script>window.example4 = \"tag = \\\"<impossible>\\\"\\n\\n[open, contents..., close] = tag.split(\\\"\\\")\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example4);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var close, contents, i, open, ref, tag,\n  slice = [].slice;\n\ntag = &quot;<impossible>&quot;;\n\nref = tag.split(&quot;&quot;), open = ref[0], contents = 3 <= ref.length ? slice.call(ref, 1, i = ref.length - 1) : (i = 1, []), close = ref[i++];\n;alert(contents.join(&quot;&quot;));\">run: contents.join(\"\")</div><br class='clear' /></div><p>Expansion can be used to retrieve elements from the end of an array without having to assign the rest of its values. It works in function parameter lists as well.</p>\n<div class='code'><pre><code>text = <span class=\"string\">\"Every literary critic believes he will\n        outwit history and have the last word\"</span>\n\n[first, ..., last] = text.split <span class=\"string\">\" \"</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> first, last, ref, text;\n\ntext = <span class=\"string\">\"Every literary critic believes he will outwit history and have the last word\"</span>;\n\nref = text.split(<span class=\"string\">\" \"</span>), first = ref[<span class=\"number\">0</span>], last = ref[ref.length - <span class=\"number\">1</span>];\n</code></pre><script>window.example5 = \"text = \\\"Every literary critic believes he will\\n        outwit history and have the last word\\\"\\n\\n[first, ..., last] = text.split \\\" \\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example5);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var first, last, ref, text;\n\ntext = &quot;Every literary critic believes he will outwit history and have the last word&quot;;\n\nref = text.split(&quot; &quot;), first = ref[0], last = ref[ref.length - 1];\n;alert(first + &quot; &quot; + last);\">run: first + \" \" + last</div><br class='clear' /></div><p>Destructuring assignment is also useful when combined with class constructors to assign properties to your instance from an options object passed to the constructor.</p>\n<div class='code'><pre><code><span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Person</span></span>\n  constructor: <span class=\"function\"><span class=\"params\">(options)</span> -&gt;</span>\n    {@name, @age, @height = <span class=\"string\">'average'</span>} = options\n\ntim = <span class=\"keyword\">new</span> Person name: <span class=\"string\">'Tim'</span>, age: <span class=\"number\">4</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> Person, tim;\n\nPerson = (<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"function\"><span class=\"keyword\">function</span> <span class=\"title\">Person</span>(<span class=\"params\">options</span>) </span>{\n    <span class=\"keyword\">var</span> ref;\n    <span class=\"keyword\">this</span>.name = options.name, <span class=\"keyword\">this</span>.age = options.age, <span class=\"keyword\">this</span>.height = (ref = options.height) != <span class=\"literal\">null</span> ? ref : <span class=\"string\">'average'</span>;\n  }\n\n  <span class=\"keyword\">return</span> Person;\n\n})();\n\ntim = <span class=\"keyword\">new</span> Person({\n  <span class=\"attr\">name</span>: <span class=\"string\">'Tim'</span>,\n  <span class=\"attr\">age</span>: <span class=\"number\">4</span>\n});\n</code></pre><script>window.example6 = \"class Person\\n  constructor: (options) ->\\n    {@name, @age, @height = 'average'} = options\\n\\ntim = new Person name: 'Tim', age: 4\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example6);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var Person, tim;\n\nPerson = (function() {\n  function Person(options) {\n    var ref;\n    this.name = options.name, this.age = options.age, this.height = (ref = options.height) != null ? ref : 'average';\n  }\n\n  return Person;\n\n})();\n\ntim = new Person({\n  name: 'Tim',\n  age: 4\n});\n;alert(tim.age + &quot; &quot; + tim.height);\">run: tim.age + \" \" + tim.height</div><br class='clear' /></div><p>The above example also demonstrates that if properties are missing in the destructured object or array, you can, just like in JavaScript, provide defaults. The difference with JavaScript is that CoffeeScript, as always, treats both null and undefined the same.</p>\n\n    <span class=\"bookmark\" id=\"fat-arrow\"></span>\n      <h2>Bound Functions, Generator Functions</h2>\n<p>In JavaScript, the <code>this</code> keyword is dynamically scoped to mean the object that the current function is attached to. If you pass a function as a callback or attach it to a different object, the original value of <code>this</code> will be lost. If you’re not familiar with this behavior, <a href=\"http://64.13.255.16/articles/scope_in_javascript/\">this Digital Web article</a> gives a good overview of the quirks.</p>\n<p>The fat arrow <code>=&gt;</code> can be used to both define a function, and to bind it to the current value of <code>this</code>, right on the spot. This is helpful when using callback-based libraries like Prototype or jQuery, for creating iterator functions to pass to <code>each</code>, or event-handler functions to use with <code>on</code>. Functions created with the fat arrow are able to access properties of the <code>this</code> where they’re defined.</p>\n<div class='code'><pre><code><span class=\"function\"><span class=\"title\">Account</span> = <span class=\"params\">(customer, cart)</span> -&gt;</span>\n  @customer = customer\n  @cart = cart\n\n  $(<span class=\"string\">'.shopping_cart'</span>).<span class=\"literal\">on</span> <span class=\"string\">'click'</span>, <span class=\"function\"><span class=\"params\">(event)</span> =&gt;</span>\n    @customer.purchase @cart\n</code></pre><pre><code><span class=\"keyword\">var</span> Account;\n\nAccount = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">customer, cart</span>) </span>{\n  <span class=\"keyword\">this</span>.customer = customer;\n  <span class=\"keyword\">this</span>.cart = cart;\n  <span class=\"keyword\">return</span> $(<span class=\"string\">'.shopping_cart'</span>).on(<span class=\"string\">'click'</span>, (<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">_this</span>) </span>{\n    <span class=\"keyword\">return</span> <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">event</span>) </span>{\n      <span class=\"keyword\">return</span> _this.customer.purchase(_this.cart);\n    };\n  })(<span class=\"keyword\">this</span>));\n};\n</code></pre><script>window.example1 = \"Account = (customer, cart) ->\\n  @customer = customer\\n  @cart = cart\\n\\n  $('.shopping_cart').on 'click', (event) =>\\n    @customer.purchase @cart\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><br class='clear' /></div><p>If we had used <code>-&gt;</code> in the callback above, <code>@customer</code> would have referred to the undefined “customer” property of the DOM element, and trying to call <code>purchase()</code> on it would have raised an exception.</p>\n<p>When used in a class definition, methods declared with the fat arrow will be automatically bound to each instance of the class when the instance is constructed.</p>\n<div id=\"generator-functions\" class=\"bookmark\"></div>\n<p>CoffeeScript functions also support <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*\">ES2015 generator functions</a> through the <code>yield</code> keyword. There’s no <code>function*(){}</code> nonsense — a generator in CoffeeScript is simply a function that yields.</p>\n<div class='code'><pre><code><span class=\"function\"><span class=\"title\">perfectSquares</span> = -&gt;</span>\n  num = <span class=\"number\">0</span>\n  <span class=\"keyword\">loop</span>\n    num += <span class=\"number\">1</span>\n    <span class=\"keyword\">yield</span> num * num\n  <span class=\"keyword\">return</span>\n\n<span class=\"built_in\">window</span>.ps <span class=\"keyword\">or</span>= perfectSquares()\n</code></pre><pre><code><span class=\"keyword\">var</span> perfectSquares;\n\nperfectSquares = <span class=\"function\"><span class=\"keyword\">function</span>*(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">var</span> num;\n  num = <span class=\"number\">0</span>;\n  <span class=\"keyword\">while</span> (<span class=\"literal\">true</span>) {\n    num += <span class=\"number\">1</span>;\n    <span class=\"keyword\">yield</span> num * num;\n  }\n};\n\n<span class=\"built_in\">window</span>.ps || (<span class=\"built_in\">window</span>.ps = perfectSquares());\n</code></pre><script>window.example2 = \"perfectSquares = ->\\n  num = 0\\n  loop\\n    num += 1\\n    yield num * num\\n  return\\n\\nwindow.ps or= perfectSquares()\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example2);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var perfectSquares;\n\nperfectSquares = function*() {\n  var num;\n  num = 0;\n  while (true) {\n    num += 1;\n    yield num * num;\n  }\n};\n\nwindow.ps || (window.ps = perfectSquares());\n;alert(ps.next().value);\">run: ps.next().value</div><br class='clear' /></div><p><code>yield*</code> is called <code>yield from</code>, and <code>yield return</code> may be used if you need to force a generator that doesn’t yield.</p>\n<div id=\"generator-iteration\" class=\"bookmark\"></div>\n<p>You can iterate over a generator function using <code>for…from</code>.</p>\n<div class='code'><pre><code><span class=\"function\"><span class=\"title\">fibonacci</span> = -&gt;</span>\n  [previous, current] = [<span class=\"number\">1</span>, <span class=\"number\">1</span>]\n  <span class=\"keyword\">loop</span>\n    [previous, current] = [current, previous + current]\n    <span class=\"keyword\">yield</span> current\n  <span class=\"keyword\">return</span>\n<span class=\"function\">\n<span class=\"title\">getFibonacciNumbers</span> = <span class=\"params\">(length)</span> -&gt;</span>\n  results = [<span class=\"number\">1</span>]\n  <span class=\"keyword\">for</span> n <span class=\"keyword\">from</span> fibonacci()\n    results.push n\n    <span class=\"keyword\">break</span> <span class=\"keyword\">if</span> results.length <span class=\"keyword\">is</span> length\n  results\n</code></pre><pre><code><span class=\"keyword\">var</span> fibonacci, getFibonacciNumbers;\n\nfibonacci = <span class=\"function\"><span class=\"keyword\">function</span>*(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">var</span> current, previous, ref, ref1;\n  ref = [<span class=\"number\">1</span>, <span class=\"number\">1</span>], previous = ref[<span class=\"number\">0</span>], current = ref[<span class=\"number\">1</span>];\n  <span class=\"keyword\">while</span> (<span class=\"literal\">true</span>) {\n    ref1 = [current, previous + current], previous = ref1[<span class=\"number\">0</span>], current = ref1[<span class=\"number\">1</span>];\n    <span class=\"keyword\">yield</span> current;\n  }\n};\n\ngetFibonacciNumbers = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">length</span>) </span>{\n  <span class=\"keyword\">var</span> n, ref, results;\n  results = [<span class=\"number\">1</span>];\n  ref = fibonacci();\n  <span class=\"keyword\">for</span> (n <span class=\"keyword\">of</span> ref) {\n    results.push(n);\n    <span class=\"keyword\">if</span> (results.length === length) {\n      <span class=\"keyword\">break</span>;\n    }\n  }\n  <span class=\"keyword\">return</span> results;\n};\n</code></pre><script>window.example3 = \"fibonacci = ->\\n  [previous, current] = [1, 1]\\n  loop\\n    [previous, current] = [current, previous + current]\\n    yield current\\n  return\\n\\ngetFibonacciNumbers = (length) ->\\n  results = [1]\\n  for n from fibonacci()\\n    results.push n\\n    break if results.length is length\\n  results\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example3);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var fibonacci, getFibonacciNumbers;\n\nfibonacci = function*() {\n  var current, previous, ref, ref1;\n  ref = [1, 1], previous = ref[0], current = ref[1];\n  while (true) {\n    ref1 = [current, previous + current], previous = ref1[0], current = ref1[1];\n    yield current;\n  }\n};\n\ngetFibonacciNumbers = function(length) {\n  var n, ref, results;\n  results = [1];\n  ref = fibonacci();\n  for (n of ref) {\n    results.push(n);\n    if (results.length === length) {\n      break;\n    }\n  }\n  return results;\n};\n;alert(getFibonacciNumbers(10));\">run: getFibonacciNumbers(10)</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"embedded\"></span>\n      <h2>Embedded JavaScript</h2>\n<p>Hopefully, you’ll never need to use it, but if you ever need to intersperse snippets of JavaScript within your CoffeeScript, you can use backticks to pass it straight through.</p>\n<div class='code'><pre><code>hi = `<span class=\"javascript\"><span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">return</span> [<span class=\"built_in\">document</span>.title, <span class=\"string\">\"Hello JavaScript\"</span>].join(<span class=\"string\">\": \"</span>);\n}</span>`\n</code></pre><pre><code><span class=\"keyword\">var</span> hi;\n\nhi = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">return</span> [<span class=\"built_in\">document</span>.title, <span class=\"string\">\"Hello JavaScript\"</span>].join(<span class=\"string\">\": \"</span>);\n};\n</code></pre><script>window.example1 = \"hi = `function() {\\n  return [document.title, \\\"Hello JavaScript\\\"].join(\\\": \\\");\\n}`\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var hi;\n\nhi = function() {\n  return [document.title, &quot;Hello JavaScript&quot;].join(&quot;: &quot;);\n};\n;alert(hi());\">run: hi()</div><br class='clear' /></div><p>Escape backticks with backslashes: <code>\\`​</code> becomes <code>`​</code>.</p>\n<p>Escape backslashes before backticks with more backslashes: <code>\\\\\\`​</code> becomes <code>\\`​</code>.</p>\n<div class='code'><pre><code>markdown = `<span class=\"javascript\"><span class=\"function\"><span class=\"keyword\">function</span> (<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">return</span> \\</span>`In Markdown, write code like \\\\\\`<span class=\"javascript\"><span class=\"keyword\">this</span>\\\\\\</span>`\\`<span class=\"javascript\">;\n}</span>`\n</code></pre><pre><code><span class=\"keyword\">var</span> markdown;\n\nmarkdown = <span class=\"function\"><span class=\"keyword\">function</span> (<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">return</span> <span class=\"string\">`In Markdown, write code like \\`this\\``</span>;\n};\n</code></pre><script>window.example2 = \"markdown = `function () {\\n  return \\\\`In Markdown, write code like \\\\\\\\\\\\`this\\\\\\\\\\\\`\\\\`;\\n}`\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example2);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var markdown;\n\nmarkdown = function () {\n  return `In Markdown, write code like \\`this\\``;\n};\n;alert(markdown());\">run: markdown()</div><br class='clear' /></div><p>You can also embed blocks of JavaScript using triple backticks. That’s easier than escaping backticks, if you need them inside your JavaScript block.</p>\n<div class='code'><pre><code>```<span class=\"javascript\">\n<span class=\"function\"><span class=\"keyword\">function</span> <span class=\"title\">time</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">return</span> <span class=\"string\">`The time is <span class=\"subst\">${<span class=\"keyword\">new</span> <span class=\"built_in\">Date</span>().toLocaleTimeString()}</span>`</span>;\n}\n</span>```\n</code></pre><pre><code>\n<span class=\"function\"><span class=\"keyword\">function</span> <span class=\"title\">time</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">return</span> <span class=\"string\">`The time is <span class=\"subst\">${<span class=\"keyword\">new</span> <span class=\"built_in\">Date</span>().toLocaleTimeString()}</span>`</span>;\n}\n;\n\n</code></pre><script>window.example3 = \"```\\nfunction time() {\\n  return `The time is ${new Date().toLocaleTimeString()}`;\\n}\\n```\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example3);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: \nfunction time() {\n  return `The time is ${new Date().toLocaleTimeString()}`;\n}\n;\n\n;alert(time());\">run: time()</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"switch\"></span>\n      <h2>Switch/When/Else</h2>\n<p><strong>Switch</strong> statements in JavaScript are a bit awkward. You need to remember to <strong>break</strong> at the end of every <strong>case</strong> statement to avoid accidentally falling through to the default case. CoffeeScript prevents accidental fall-through, and can convert the <code>switch</code> into a returnable, assignable expression. The format is: <code>switch</code> condition, <code>when</code> clauses, <code>else</code> the default case.</p>\n<p>As in Ruby, <strong>switch</strong> statements in CoffeeScript can take multiple values for each <strong>when</strong> clause. If any of the values match, the clause runs.</p>\n<div class='code'><pre><code><span class=\"keyword\">switch</span> day\n  <span class=\"keyword\">when</span> <span class=\"string\">\"Mon\"</span> <span class=\"keyword\">then</span> go work\n  <span class=\"keyword\">when</span> <span class=\"string\">\"Tue\"</span> <span class=\"keyword\">then</span> go relax\n  <span class=\"keyword\">when</span> <span class=\"string\">\"Thu\"</span> <span class=\"keyword\">then</span> go iceFishing\n  <span class=\"keyword\">when</span> <span class=\"string\">\"Fri\"</span>, <span class=\"string\">\"Sat\"</span>\n    <span class=\"keyword\">if</span> day <span class=\"keyword\">is</span> bingoDay\n      go bingo\n      go dancing\n  <span class=\"keyword\">when</span> <span class=\"string\">\"Sun\"</span> <span class=\"keyword\">then</span> go church\n  <span class=\"keyword\">else</span> go work\n</code></pre><pre><code><span class=\"keyword\">switch</span> (day) {\n  <span class=\"keyword\">case</span> <span class=\"string\">\"Mon\"</span>:\n    go(work);\n    <span class=\"keyword\">break</span>;\n  <span class=\"keyword\">case</span> <span class=\"string\">\"Tue\"</span>:\n    go(relax);\n    <span class=\"keyword\">break</span>;\n  <span class=\"keyword\">case</span> <span class=\"string\">\"Thu\"</span>:\n    go(iceFishing);\n    <span class=\"keyword\">break</span>;\n  <span class=\"keyword\">case</span> <span class=\"string\">\"Fri\"</span>:\n  <span class=\"keyword\">case</span> <span class=\"string\">\"Sat\"</span>:\n    <span class=\"keyword\">if</span> (day === bingoDay) {\n      go(bingo);\n      go(dancing);\n    }\n    <span class=\"keyword\">break</span>;\n  <span class=\"keyword\">case</span> <span class=\"string\">\"Sun\"</span>:\n    go(church);\n    <span class=\"keyword\">break</span>;\n  <span class=\"keyword\">default</span>:\n    go(work);\n}\n</code></pre><script>window.example1 = \"switch day\\n  when \\\"Mon\\\" then go work\\n  when \\\"Tue\\\" then go relax\\n  when \\\"Thu\\\" then go iceFishing\\n  when \\\"Fri\\\", \\\"Sat\\\"\\n    if day is bingoDay\\n      go bingo\\n      go dancing\\n  when \\\"Sun\\\" then go church\\n  else go work\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><br class='clear' /></div><p>Switch statements can also be used without a control expression, turning them in to a cleaner alternative to if/else chains.</p>\n<div class='code'><pre><code>score = <span class=\"number\">76</span>\ngrade = <span class=\"keyword\">switch</span>\n  <span class=\"keyword\">when</span> score &lt; <span class=\"number\">60</span> <span class=\"keyword\">then</span> <span class=\"string\">'F'</span>\n  <span class=\"keyword\">when</span> score &lt; <span class=\"number\">70</span> <span class=\"keyword\">then</span> <span class=\"string\">'D'</span>\n  <span class=\"keyword\">when</span> score &lt; <span class=\"number\">80</span> <span class=\"keyword\">then</span> <span class=\"string\">'C'</span>\n  <span class=\"keyword\">when</span> score &lt; <span class=\"number\">90</span> <span class=\"keyword\">then</span> <span class=\"string\">'B'</span>\n  <span class=\"keyword\">else</span> <span class=\"string\">'A'</span>\n<span class=\"comment\"># grade == 'C'</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> grade, score;\n\nscore = <span class=\"number\">76</span>;\n\ngrade = (<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">switch</span> (<span class=\"literal\">false</span>) {\n    <span class=\"keyword\">case</span> !(score &lt; <span class=\"number\">60</span>):\n      <span class=\"keyword\">return</span> <span class=\"string\">'F'</span>;\n    <span class=\"keyword\">case</span> !(score &lt; <span class=\"number\">70</span>):\n      <span class=\"keyword\">return</span> <span class=\"string\">'D'</span>;\n    <span class=\"keyword\">case</span> !(score &lt; <span class=\"number\">80</span>):\n      <span class=\"keyword\">return</span> <span class=\"string\">'C'</span>;\n    <span class=\"keyword\">case</span> !(score &lt; <span class=\"number\">90</span>):\n      <span class=\"keyword\">return</span> <span class=\"string\">'B'</span>;\n    <span class=\"keyword\">default</span>:\n      <span class=\"keyword\">return</span> <span class=\"string\">'A'</span>;\n  }\n})();\n</code></pre><script>window.example2 = \"score = 76\\ngrade = switch\\n  when score < 60 then 'F'\\n  when score < 70 then 'D'\\n  when score < 80 then 'C'\\n  when score < 90 then 'B'\\n  else 'A'\\n# grade == 'C'\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example2);'>load</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"try-catch\"></span>\n      <h2>Try/Catch/Finally</h2>\n<p>Try-expressions have the same semantics as try-statements in JavaScript, though in CoffeeScript, you may omit <em>both</em> the catch and finally parts. The catch part may also omit the error parameter if it is not needed.</p>\n<div class='code'><pre><code><span class=\"keyword\">try</span>\n  allHellBreaksLoose()\n  catsAndDogsLivingTogether()\n<span class=\"keyword\">catch</span> error\n  <span class=\"built_in\">print</span> error\n<span class=\"keyword\">finally</span>\n  cleanUp()\n</code></pre><pre><code><span class=\"keyword\">var</span> error;\n\n<span class=\"keyword\">try</span> {\n  allHellBreaksLoose();\n  catsAndDogsLivingTogether();\n} <span class=\"keyword\">catch</span> (error1) {\n  error = error1;\n  print(error);\n} <span class=\"keyword\">finally</span> {\n  cleanUp();\n}\n</code></pre><script>window.example1 = \"try\\n  allHellBreaksLoose()\\n  catsAndDogsLivingTogether()\\ncatch error\\n  print error\\nfinally\\n  cleanUp()\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"comparisons\"></span>\n      <h2>Chained Comparisons</h2>\n<p>CoffeeScript borrows <a href=\"https://docs.python.org/3/reference/expressions.html#not-in\">chained comparisons</a> from Python — making it easy to test if a value falls within a certain range.</p>\n<div class='code'><pre><code>cholesterol = <span class=\"number\">127</span>\n\nhealthy = <span class=\"number\">200</span> &gt; cholesterol &gt; <span class=\"number\">60</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> cholesterol, healthy;\n\ncholesterol = <span class=\"number\">127</span>;\n\nhealthy = (<span class=\"number\">200</span> &gt; cholesterol &amp;&amp; cholesterol &gt; <span class=\"number\">60</span>);\n</code></pre><script>window.example1 = \"cholesterol = 127\\n\\nhealthy = 200 > cholesterol > 60\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var cholesterol, healthy;\n\ncholesterol = 127;\n\nhealthy = (200 > cholesterol && cholesterol > 60);\n;alert(healthy);\">run: healthy</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"strings\"></span>\n      <h2>String Interpolation, Block Strings, and Block Comments</h2>\n<p>Ruby-style string interpolation is included in CoffeeScript. Double-quoted strings allow for interpolated values, using <code>#{ … }</code>, and single-quoted strings are literal. You may even use interpolation in object keys.</p>\n<div class='code'><pre><code>author = <span class=\"string\">\"Wittgenstein\"</span>\nquote  = <span class=\"string\">\"A picture is a fact. -- <span class=\"subst\">#{ author }</span>\"</span>\n\nsentence = <span class=\"string\">\"<span class=\"subst\">#{ <span class=\"number\">22</span> / <span class=\"number\">7</span> }</span> is a decent approximation of π\"</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> author, quote, sentence;\n\nauthor = <span class=\"string\">\"Wittgenstein\"</span>;\n\nquote = <span class=\"string\">\"A picture is a fact. -- \"</span> + author;\n\nsentence = (<span class=\"number\">22</span> / <span class=\"number\">7</span>) + <span class=\"string\">\" is a decent approximation of π\"</span>;\n</code></pre><script>window.example1 = \"author = \\\"Wittgenstein\\\"\\nquote  = \\\"A picture is a fact. -- #{ author }\\\"\\n\\nsentence = \\\"#{ 22 / 7 } is a decent approximation of π\\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var author, quote, sentence;\n\nauthor = &quot;Wittgenstein&quot;;\n\nquote = &quot;A picture is a fact. -- &quot; + author;\n\nsentence = (22 / 7) + &quot; is a decent approximation of π&quot;;\n;alert(sentence);\">run: sentence</div><br class='clear' /></div><p>Multiline strings are allowed in CoffeeScript. Lines are joined by a single space unless they end with a backslash. Indentation is ignored.</p>\n<div class='code'><pre><code>mobyDick = <span class=\"string\">\"Call me Ishmael. Some years ago --\n  never mind how long precisely -- having little\n  or no money in my purse, and nothing particular\n  to interest me on shore, I thought I would sail\n  about a little and see the watery part of the\n  world...\"</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> mobyDick;\n\nmobyDick = <span class=\"string\">\"Call me Ishmael. Some years ago -- never mind how long precisely -- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world...\"</span>;\n</code></pre><script>window.example2 = \"mobyDick = \\\"Call me Ishmael. Some years ago --\\n  never mind how long precisely -- having little\\n  or no money in my purse, and nothing particular\\n  to interest me on shore, I thought I would sail\\n  about a little and see the watery part of the\\n  world...\\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example2);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var mobyDick;\n\nmobyDick = &quot;Call me Ishmael. Some years ago -- never mind how long precisely -- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world...&quot;;\n;alert(mobyDick);\">run: mobyDick</div><br class='clear' /></div><p>Block strings can be used to hold formatted or indentation-sensitive text (or, if you just don’t feel like escaping quotes and apostrophes). The indentation level that begins the block is maintained throughout, so you can keep it all aligned with the body of your code.</p>\n<div class='code'><pre><code>html = <span class=\"string\">\"\"\"\n       &lt;strong&gt;\n         cup of coffeescript\n       &lt;/strong&gt;\n       \"\"\"</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> html;\n\nhtml = <span class=\"string\">\"&lt;strong&gt;\\n  cup of coffeescript\\n&lt;/strong&gt;\"</span>;\n</code></pre><script>window.example3 = \"html = \\\"\\\"\\\"\\n       <strong>\\n         cup of coffeescript\\n       </strong>\\n       \\\"\\\"\\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example3);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var html;\n\nhtml = &quot;<strong>\\n  cup of coffeescript\\n</strong>&quot;;\n;alert(html);\">run: html</div><br class='clear' /></div><p>Double-quoted block strings, like other double-quoted strings, allow interpolation.</p>\n<p>Sometimes you’d like to pass a block comment through to the generated JavaScript. For example, when you need to embed a licensing header at the top of a file. Block comments, which mirror the syntax for block strings, are preserved in the generated code.</p>\n<div class='code'><pre><code><span class=\"comment\">###\nSkinnyMochaHalfCaffScript Compiler v1.0\nReleased under the MIT License\n###</span>\n</code></pre><pre><code>\n<span class=\"comment\">/*\nSkinnyMochaHalfCaffScript Compiler v1.0\nReleased under the MIT License\n */</span>\n\n</code></pre><script>window.example4 = \"###\\nSkinnyMochaHalfCaffScript Compiler v1.0\\nReleased under the MIT License\\n###\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example4);'>load</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"tagged-template-literals\"></span>\n      <h2>Tagged Template Literals</h2>\n<p>CoffeeScript supports <a href=\"https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals#Tagged_template_literals\">ES2015 tagged template literals</a>, which enable customized string interpolation. If you immediately prefix a string with a function name (no space between the two), CoffeeScript will output this “function plus string” combination as an ES2015 tagged template literal, which will <a href=\"https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals#Tagged_template_literals\">behave accordingly</a>: the function is called, with the parameters being the input text and expression parts that make up the interpolated string. The function can then assemble these parts into an output string, providing custom string interpolation.</p>\n<p>Be aware that the CoffeeScript compiler is outputting ES2015 syntax for this feature, so your target JavaScript runtime(s) must support this syntax for your code to work; or you could use tools like <a href=\"http://babeljs.io/\">Babel</a> or <a href=\"https://github.com/google/traceur-compiler\">Traceur Compiler</a> to convert this ES2015 syntax into compatible JavaScript.</p>\n<div class='code'><pre><code><span class=\"function\"><span class=\"title\">upperCaseExpr</span> = <span class=\"params\">(textParts, expressions...)</span> -&gt;</span>\n  textParts.reduce (text, textPart, i) -&gt;\n    text + expressions[i - <span class=\"number\">1</span>].toUpperCase() + textPart\n<span class=\"function\">\n<span class=\"title\">greet</span> = <span class=\"params\">(name, adjective)</span> -&gt;</span>\n  upperCaseExpr<span class=\"string\">\"\"\"\n               Hi <span class=\"subst\">#{name}</span>. You look <span class=\"subst\">#{adjective}</span>!\n               \"\"\"</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> greet, upperCaseExpr,\n  slice = [].slice;\n\nupperCaseExpr = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"keyword\">var</span> expressions, textParts;\n  textParts = <span class=\"built_in\">arguments</span>[<span class=\"number\">0</span>], expressions = <span class=\"number\">2</span> &lt;= <span class=\"built_in\">arguments</span>.length ? slice.call(<span class=\"built_in\">arguments</span>, <span class=\"number\">1</span>) : [];\n  <span class=\"keyword\">return</span> textParts.reduce(<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">text, textPart, i</span>) </span>{\n    <span class=\"keyword\">return</span> text + expressions[i - <span class=\"number\">1</span>].toUpperCase() + textPart;\n  });\n};\n\ngreet = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">name, adjective</span>) </span>{\n  <span class=\"keyword\">return</span> upperCaseExpr<span class=\"string\">`Hi <span class=\"subst\">${name}</span>. You look <span class=\"subst\">${adjective}</span>!`</span>;\n};\n</code></pre><script>window.example1 = \"upperCaseExpr = (textParts, expressions...) ->\\n  textParts.reduce (text, textPart, i) ->\\n    text + expressions[i - 1].toUpperCase() + textPart\\n\\ngreet = (name, adjective) ->\\n  upperCaseExpr\\\"\\\"\\\"\\n               Hi #{name}. You look #{adjective}!\\n               \\\"\\\"\\\"\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><div class=\"minibutton ok\" onclick=\"javascript: var greet, upperCaseExpr,\n  slice = [].slice;\n\nupperCaseExpr = function() {\n  var expressions, textParts;\n  textParts = arguments[0], expressions = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n  return textParts.reduce(function(text, textPart, i) {\n    return text + expressions[i - 1].toUpperCase() + textPart;\n  });\n};\n\ngreet = function(name, adjective) {\n  return upperCaseExpr`Hi ${name}. You look ${adjective}!`;\n};\n;alert(greet(&quot;greg&quot;, &quot;awesome&quot;));\">run: greet(\"greg\", \"awesome\")</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"regexes\"></span>\n      <h2>Block Regular Expressions</h2>\n<p>Similar to block strings and comments, CoffeeScript supports block regexes — extended regular expressions that ignore internal whitespace and can contain comments and interpolation. Modeled after Perl’s <code>/x</code> modifier, CoffeeScript’s block regexes are delimited by <code>///</code> and go a long way towards making complex regular expressions readable. To quote from the CoffeeScript source:</p>\n<div class='code'><pre><code>OPERATOR = <span class=\"regexp\">/// ^ (\n  ?: [-=]&gt;             <span class=\"comment\"># function</span>\n   | [-+*/%&lt;&gt;&amp;|^!?=]=  <span class=\"comment\"># compound assign / compare</span>\n   | &gt;&gt;&gt;=?             <span class=\"comment\"># zero-fill right shift</span>\n   | ([-+:])\\1         <span class=\"comment\"># doubles</span>\n   | ([&amp;|&lt;&gt;])\\2=?      <span class=\"comment\"># logic / shift</span>\n   | \\?\\.              <span class=\"comment\"># soak access</span>\n   | \\.{2,3}           <span class=\"comment\"># range or splat</span>\n) ///</span>\n</code></pre><pre><code><span class=\"keyword\">var</span> OPERATOR;\n\nOPERATOR = <span class=\"regexp\">/^(?:[-=]&gt;|[-+*\\/%&lt;&gt;&amp;|^!?=]=|&gt;&gt;&gt;=?|([-+:])\\1|([&amp;|&lt;&gt;])\\2=?|\\?\\.|\\.{2,3})/</span>;\n</code></pre><script>window.example1 = \"OPERATOR = /// ^ (\\n  ?: [-=]>             # function\\n   | [-+*/%<>&|^!?=]=  # compound assign / compare\\n   | >>>=?             # zero-fill right shift\\n   | ([-+:])\\\\1         # doubles\\n   | ([&|<>])\\\\2=?      # logic / shift\\n   | \\\\?\\\\.              # soak access\\n   | \\\\.{2,3}           # range or splat\\n) ///\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><br class='clear' /></div>\n    <span class=\"bookmark\" id=\"modules\"></span>\n      <h2>Modules</h2>\n<p>ES2015 modules are supported in CoffeeScript, with very similar <code>import</code> and <code>export</code> syntax:</p>\n<div class='code'><pre><code><span class=\"keyword\">import</span> <span class=\"string\">'local-file.coffee'</span>\n<span class=\"keyword\">import</span> <span class=\"string\">'coffeescript'</span>\n\n<span class=\"keyword\">import</span> _ <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>\n<span class=\"keyword\">import</span> * <span class=\"keyword\">as</span> underscore <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>\n\n<span class=\"keyword\">import</span> { now } <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>\n<span class=\"keyword\">import</span> { now <span class=\"keyword\">as</span> currentTimestamp } <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>\n<span class=\"keyword\">import</span> { first, last } <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>\n<span class=\"keyword\">import</span> utilityBelt, { each } <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>\n\n<span class=\"keyword\">export</span> <span class=\"keyword\">default</span> Math\n<span class=\"keyword\">export</span> square = <span class=\"function\"><span class=\"params\">(x)</span> -&gt;</span> x * x\n<span class=\"keyword\">export</span> <span class=\"class\"><span class=\"keyword\">class</span> <span class=\"title\">Mathematics</span></span>\n  least: <span class=\"function\"><span class=\"params\">(x, y)</span> -&gt;</span> <span class=\"keyword\">if</span> x &lt; y <span class=\"keyword\">then</span> x <span class=\"keyword\">else</span> y\n\n<span class=\"keyword\">export</span> { sqrt }\n<span class=\"keyword\">export</span> { sqrt <span class=\"keyword\">as</span> squareRoot }\n<span class=\"keyword\">export</span> { Mathematics <span class=\"keyword\">as</span> <span class=\"keyword\">default</span>, sqrt <span class=\"keyword\">as</span> squareRoot }\n\n<span class=\"keyword\">export</span> * <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>\n<span class=\"keyword\">export</span> { max, min } <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>\n</code></pre><pre><code><span class=\"keyword\">import</span> <span class=\"string\">'local-file.coffee'</span>;\n\n<span class=\"keyword\">import</span> <span class=\"string\">'coffeescript'</span>;\n\n<span class=\"keyword\">import</span> _ <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>;\n\n<span class=\"keyword\">import</span> * <span class=\"keyword\">as</span> underscore <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>;\n\n<span class=\"keyword\">import</span> {\n  now\n} <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>;\n\n<span class=\"keyword\">import</span> {\n  now <span class=\"keyword\">as</span> currentTimestamp\n} <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>;\n\n<span class=\"keyword\">import</span> {\n  first,\n  last\n} <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>;\n\n<span class=\"keyword\">import</span> utilityBelt, {\n  each\n} <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>;\n\n<span class=\"keyword\">export</span> <span class=\"keyword\">default</span> <span class=\"built_in\">Math</span>;\n\n<span class=\"keyword\">export</span> <span class=\"keyword\">var</span> square = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">x</span>) </span>{\n  <span class=\"keyword\">return</span> x * x;\n};\n\n<span class=\"keyword\">export</span> <span class=\"keyword\">var</span> Mathematics = (<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\"></span>) </span>{\n  <span class=\"function\"><span class=\"keyword\">function</span> <span class=\"title\">Mathematics</span>(<span class=\"params\"></span>) </span>{}\n\n  Mathematics.prototype.least = <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">x, y</span>) </span>{\n    <span class=\"keyword\">if</span> (x &lt; y) {\n      <span class=\"keyword\">return</span> x;\n    } <span class=\"keyword\">else</span> {\n      <span class=\"keyword\">return</span> y;\n    }\n  };\n\n  <span class=\"keyword\">return</span> Mathematics;\n\n})();\n\n<span class=\"keyword\">export</span> {\n  sqrt\n};\n\n<span class=\"keyword\">export</span> {\n  sqrt <span class=\"keyword\">as</span> squareRoot\n};\n\n<span class=\"keyword\">export</span> {\n  Mathematics <span class=\"keyword\">as</span> <span class=\"keyword\">default</span>,\n  sqrt <span class=\"keyword\">as</span> squareRoot\n};\n\n<span class=\"keyword\">export</span> * <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>;\n\n<span class=\"keyword\">export</span> {\n  max,\n  min\n} <span class=\"keyword\">from</span> <span class=\"string\">'underscore'</span>;\n</code></pre><script>window.example1 = \"import 'local-file.coffee'\\nimport 'coffeescript'\\n\\nimport _ from 'underscore'\\nimport * as underscore from 'underscore'\\n\\nimport { now } from 'underscore'\\nimport { now as currentTimestamp } from 'underscore'\\nimport { first, last } from 'underscore'\\nimport utilityBelt, { each } from 'underscore'\\n\\nexport default Math\\nexport square = (x) -> x * x\\nexport class Mathematics\\n  least: (x, y) -> if x < y then x else y\\n\\nexport { sqrt }\\nexport { sqrt as squareRoot }\\nexport { Mathematics as default, sqrt as squareRoot }\\n\\nexport * from 'underscore'\\nexport { max, min } from 'underscore'\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><br class='clear' /></div><div id=\"modules-note\" class=\"bookmark\"></div>\n<p>Note that the CoffeeScript compiler <strong>does not resolve modules</strong>; writing an <code>import</code> or <code>export</code> statement in CoffeeScript will produce an <code>import</code> or <code>export</code> statement in the resulting output. It is your responsibility attach another transpiler, such as <a href=\"https://github.com/google/traceur-compiler\">Traceur Compiler</a>, <a href=\"http://babeljs.io/\">Babel</a> or <a href=\"https://github.com/rollup/rollup\">Rollup</a>, to convert this ES2015 syntax into code that will work in your target runtimes.</p>\n<p>Also note that any file with an <code>import</code> or <code>export</code> statement will be output without a <a href=\"#lexical-scope\">top-level function safety wrapper</a>; in other words, importing or exporting modules will automatically trigger <a href=\"#usage\">bare</a> mode for that file. This is because per the ES2015 spec, <code>import</code> or <code>export</code> statements must occur at the topmost scope.</p>\n\n  <span class=\"bookmark\" id=\"cake\"></span>\n    <h2>Cake, and Cakefiles</h2>\n<p>CoffeeScript includes a (very) simple build system similar to <a href=\"http://www.gnu.org/software/make/\">Make</a> and <a href=\"http://rake.rubyforge.org/\">Rake</a>. Naturally, it’s called Cake, and is used for the tasks that build and test the CoffeeScript language itself. Tasks are defined in a file named <code>Cakefile</code>, and can be invoked by running <code>cake [task]</code> from within the directory. To print a list of all the tasks and options, just type <code>cake</code>.</p>\n<p>Task definitions are written in CoffeeScript, so you can put arbitrary code in your Cakefile. Define a task with a name, a long description, and the function to invoke when the task is run. If your task takes a command-line option, you can define the option with short and long flags, and it will be made available in the <code>options</code> object. Here’s a task that uses the Node.js API to rebuild CoffeeScript’s parser:</p>\n<div class='code'><pre><code>fs = <span class=\"built_in\">require</span> <span class=\"string\">'fs'</span>\n\noption <span class=\"string\">'-o'</span>, <span class=\"string\">'--output [DIR]'</span>, <span class=\"string\">'directory for compiled code'</span>\n\ntask <span class=\"string\">'build:parser'</span>, <span class=\"string\">'rebuild the Jison parser'</span>, <span class=\"function\"><span class=\"params\">(options)</span> -&gt;</span>\n  <span class=\"built_in\">require</span> <span class=\"string\">'jison'</span>\n  code = <span class=\"built_in\">require</span>(<span class=\"string\">'./lib/grammar'</span>).parser.generate()\n  dir  = options.output <span class=\"keyword\">or</span> <span class=\"string\">'lib'</span>\n  fs.writeFile <span class=\"string\">\"<span class=\"subst\">#{dir}</span>/parser.js\"</span>, code\n</code></pre><pre><code><span class=\"keyword\">var</span> fs;\n\nfs = <span class=\"built_in\">require</span>(<span class=\"string\">'fs'</span>);\n\noption(<span class=\"string\">'-o'</span>, <span class=\"string\">'--output [DIR]'</span>, <span class=\"string\">'directory for compiled code'</span>);\n\ntask(<span class=\"string\">'build:parser'</span>, <span class=\"string\">'rebuild the Jison parser'</span>, <span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">options</span>) </span>{\n  <span class=\"keyword\">var</span> code, dir;\n  <span class=\"built_in\">require</span>(<span class=\"string\">'jison'</span>);\n  code = <span class=\"built_in\">require</span>(<span class=\"string\">'./lib/grammar'</span>).parser.generate();\n  dir = options.output || <span class=\"string\">'lib'</span>;\n  <span class=\"keyword\">return</span> fs.writeFile(dir + <span class=\"string\">\"/parser.js\"</span>, code);\n});\n</code></pre><script>window.example1 = \"fs = require 'fs'\\n\\noption '-o', '--output [DIR]', 'directory for compiled code'\\n\\ntask 'build:parser', 'rebuild the Jison parser', (options) ->\\n  require 'jison'\\n  code = require('./lib/grammar').parser.generate()\\n  dir  = options.output or 'lib'\\n  fs.writeFile \\\"#{dir}/parser.js\\\", code\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><br class='clear' /></div><p>If you need to invoke one task before another — for example, running <code>build</code> before <code>test</code>, you can use the <code>invoke</code> function: <code>invoke 'build'</code>. Cake tasks are a minimal way to expose your CoffeeScript functions to the command line, so <a href=\"annotated-source/cake.html\">don’t expect any fanciness built-in</a>. If you need dependencies, or async callbacks, it’s best to put them in your code itself — not the cake task.</p>\n\n  <span class=\"bookmark\" id=\"source-maps\"></span>\n    <h2>Source Maps</h2>\n<p>CoffeeScript 1.6.1 and above include support for generating source maps, a way to tell your JavaScript engine what part of your CoffeeScript program matches up with the code being evaluated. Browsers that support it can automatically use source maps to show your original source code in the debugger. To generate source maps alongside your JavaScript files, pass the <code>--map</code> or <code>-m</code> flag to the compiler.</p>\n<p>For a full introduction to source maps, how they work, and how to hook them up in your browser, read the <a href=\"https://www.html5rocks.com/en/tutorials/developertools/sourcemaps/\">HTML5 Tutorial</a>.</p>\n\n  <span class=\"bookmark\" id=\"scripts\"></span>\n    <h2>“text/coffeescript” Script Tags</h2>\n<p>While it’s not recommended for serious use, CoffeeScripts may be included directly within the browser using <code>&lt;script type=&quot;text/coffeescript&quot;&gt;</code> tags. The source includes a compressed and minified version of the compiler (<a href=\"browser-compiler/coffee-script.js\">Download current version here, 51k when gzipped</a>) as <code>docs/v1/browser-compiler/coffee-script.js</code>. Include this file on a page with inline CoffeeScript tags, and it will compile and evaluate them in order.</p>\n<p>In fact, the little bit of glue script that runs “Try CoffeeScript” above, as well as the jQuery for the menu, is implemented in just this way. View source and look at the bottom of the page to see the example. Including the script also gives you access to <code>CoffeeScript.compile()</code> so you can pop open Firebug and try compiling some strings.</p>\n<p>The usual caveats about CoffeeScript apply — your inline scripts will run within a closure wrapper, so if you want to expose global variables or functions, attach them to the <code>window</code> object.</p>\n\n  <span class=\"bookmark\" id=\"resources\"></span>\n    <h2>Books</h2>\n<p>There are a number of excellent resources to help you get started with CoffeeScript, some of which are freely available online.</p>\n<ul>\n<li><a href=\"http://arcturo.github.io/library/coffeescript/\">The Little Book on CoffeeScript</a> is a brief 5-chapter introduction to CoffeeScript, written with great clarity and precision by <a href=\"http://alexmaccaw.co.uk/\">Alex MacCaw</a>.</li>\n<li><a href=\"http://autotelicum.github.io/Smooth-CoffeeScript/\">Smooth CoffeeScript</a> is a reimagination of the excellent book <a href=\"http://eloquentjavascript.net/\">Eloquent JavaScript</a>, as if it had been written in CoffeeScript instead. Covers language features as well as the functional and object oriented programming styles. By <a href=\"https://github.com/autotelicum\">E. Hoigaard</a>.</li>\n<li><a href=\"http://pragprog.com/book/tbcoffee/coffeescript\">CoffeeScript: Accelerated JavaScript Development</a> is <a href=\"http://trevorburnham.com/\">Trevor Burnham</a>’s thorough introduction to the language. By the end of the book, you’ll have built a fast-paced multiplayer word game, writing both the client-side and Node.js portions in CoffeeScript.</li>\n<li><a href=\"https://www.packtpub.com/web-development/coffeescript-programming-jquery-rails-and-nodejs\">CoffeeScript Programming with jQuery, Rails, and Node.js</a> is a new book by Michael Erasmus that covers CoffeeScript with an eye towards real-world usage both in the browser (jQuery) and on the server-side (Rails, Node).</li>\n<li><a href=\"https://leanpub.com/coffeescript-ristretto/read\">CoffeeScript Ristretto</a> is a deep dive into CoffeeScript’s semantics from simple functions up through closures, higher-order functions, objects, classes, combinators, and decorators. By <a href=\"http://braythwayt.com/\">Reg Braithwaite</a>.</li>\n<li><a href=\"https://efendibooks.com/minibooks/testing-with-coffeescript\">Testing with CoffeeScript</a> is a succinct and freely downloadable guide to building testable applications with CoffeeScript and Jasmine.</li>\n<li><a href=\"https://www.packtpub.com/web-development/coffeescript-application-development\">CoffeeScript Application Development</a> from Packt, introduces CoffeeScript while walking through the process of building a demonstration web application. A <a href=\"https://www.packtpub.com/web-development/coffeescript-application-development-cookbook\">CoffeeScript Application Development Coookbook</a> with over 90 “recipes” is also available.</li>\n<li><a href=\"https://www.manning.com/books/coffeescript-in-action\">CoffeeScript in Action</a> from Manning Publications, covers CoffeeScript syntax, composition techniques and application development.</li>\n<li><a href=\"https://www.dpunkt.de/buecher/4021/coffeescript.html\">CoffeeScript: Die Alternative zu JavaScript</a> from dpunkt.verlag, is the first CoffeeScript book in Deutsch.</li>\n</ul>\n\n  <span class=\"bookmark\" id=\"screencasts\"></span>\n    <h2>Screencasts</h2>\n<ul>\n<li><a href=\"http://coffeescript.codeschool.com/\">A Sip of CoffeeScript</a> is a <a href=\"https://www.codeschool.com\">Code School Course</a> which combines 6 screencasts with in-browser coding to make learning fun. The first level is free to try out.</li>\n<li><a href=\"https://www.pluralsight.com/courses/meet-coffeescript\">Meet CoffeeScript</a> is a 75-minute long screencast by PeepCode, now <a href=\"https://www.pluralsight.com/\">PluralSight</a>. Highly memorable for its animations which demonstrate transforming CoffeeScript into the equivalent JS.</li>\n<li>If you’re looking for less of a time commitment, RailsCasts’ <a href=\"http://railscasts.com/episodes/267-coffeescript-basics\">CoffeeScript Basics</a> should have you covered, hitting all of the important notes about CoffeeScript in 11 minutes.</li>\n</ul>\n\n  <span class=\"bookmark\" id=\"examples\"></span>\n    <h2>Examples</h2>\n<p>The <a href=\"https://github.com/trending?l=coffeescript&amp;since=monthly\">best list of open-source CoffeeScript examples</a> can be found on GitHub. But just to throw out a few more:</p>\n<ul>\n<li><strong>GitHub</strong>’s <a href=\"https://hubot.github.com/\">Hubot</a>, a friendly IRC robot that can perform any number of useful and useless tasks.</li>\n<li><strong>sstephenson</strong>’s <a href=\"http://pow.cx/\">Pow</a>, a zero-configuration Rack server, with comprehensive annotated source.</li>\n<li><strong>technoweenie</strong>’s <a href=\"https://github.com/technoweenie/coffee-resque\">Coffee-Resque</a>, a port of <a href=\"https://github.com/defunkt/resque\">Resque</a> for Node.js.</li>\n<li><strong>stephank</strong>’s <a href=\"https://github.com/stephank/orona\">Orona</a>, a remake of the Bolo tank game for modern browsers.</li>\n<li><strong>GitHub</strong>’s <a href=\"https://atom.io/\">Atom</a>, a hackable text editor built on web technologies.</li>\n<li><strong>Basecamp</strong>’s <a href=\"https://trix-editor.org/\">Trix</a>, a rich text editor for web apps.</li>\n</ul>\n\n  <span class=\"bookmark\" id=\"additional-resources\"></span>\n    <h2>Resources</h2>\n<ul>\n<li>\n<p><a href=\"https://github.com/jashkenas/coffeescript/\">Source Code</a><br>\nUse <code>bin/coffee</code> to test your changes,<br>\n<code>bin/cake test</code> to run the test suite,<br>\n<code>bin/cake build</code> to rebuild the full CoffeeScript compiler, and<br>\n<code>bin/cake build:except-parser</code> to recompile much faster if you’re not editing <code>grammar.coffee</code>.</p>\n<p><code>git checkout lib &amp;&amp; bin/cake build:full</code> is a good command to run when you’re working on the core language. It’ll refresh the <code>lib</code> folder (in case you broke something), build your altered compiler, use that to rebuild itself (a good sanity test) and then run all of the tests. If they pass, there’s a good chance you’ve made a successful change.</p>\n</li>\n<li>\n<p><a href=\"test.html\">Browser Tests</a><br>\nRun CoffeeScript’s test suite in your current browser.</p>\n</li>\n<li>\n<p><a href=\"https://github.com/jashkenas/coffeescript/issues\">CoffeeScript Issues</a><br>\nBug reports, feature proposals, and ideas for changes to the language belong here.</p>\n</li>\n<li>\n<p><a href=\"https://groups.google.com/forum/#!forum/coffeescript\">CoffeeScript Google Group</a><br>\nIf you’d like to ask a question, the mailing list is a good place to get help.</p>\n</li>\n<li>\n<p><a href=\"https://github.com/jashkenas/coffeescript/wiki\">The CoffeeScript Wiki</a><br>\nIf you’ve ever learned a neat CoffeeScript tip or trick, or ran into a gotcha — share it on the wiki. The wiki also serves as a directory of handy <a href=\"https://github.com/jashkenas/coffeescript/wiki/Text-editor-plugins\">text editor extensions</a>, <a href=\"https://github.com/jashkenas/coffeescript/wiki/Web-framework-plugins\">web framework plugins</a>, and general <a href=\"https://github.com/jashkenas/coffeescript/wiki/Build-tools\">CoffeeScript build tools</a>.</p>\n</li>\n<li>\n<p><a href=\"https://github.com/jashkenas/coffeescript/wiki/FAQ\">The FAQ</a><br>\nPerhaps your CoffeeScript-related question has been asked before. Check the FAQ first.</p>\n</li>\n<li>\n<p><a href=\"http://js2coffee.org\">JS2Coffee</a><br>\nIs a very well done reverse JavaScript-to-CoffeeScript compiler. It’s not going to be perfect (infer what your JavaScript classes are, when you need bound functions, and so on…) — but it’s a great starting point for converting simple scripts.</p>\n</li>\n<li>\n<p><a href=\"https://github.com/jashkenas/coffeescript/tree/master/documentation/images\">High-Rez Logo</a><br>\nThe CoffeeScript logo is available in SVG for use in presentations.</p>\n</li>\n</ul>\n\n  <span class=\"bookmark\" id=\"chat\"></span>\n    <h2>Web Chat (IRC)</h2>\n<p>Quick help and advice can usually be found in the CoffeeScript IRC room. Join <code>#coffeescript</code> on <code>irc.freenode.net</code>, or click the button below to open a webchat session on this page.</p>\n<p><button id=\"open_webchat\">click to open #coffeescript</button></p>\n\n  <span class=\"bookmark\" id=\"changelog\"></span>\n    <h2>Change Log</h2>\n<div class=\"anchor\" id=\"1.12.7\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.6...1.12.7\">1.12.7</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-07-16\">July 16, 2017</time></span>\n</h2><ul>\n<li>Fix regressions in 1.12.6 related to chained function calls and indented <code>return</code> and <code>throw</code> arguments.</li>\n<li>The REPL no longer warns about assigning to <code>_</code>.</li>\n</ul>\n<div class=\"anchor\" id=\"1.12.6\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.5...1.12.6\">1.12.6</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-05-15\">May 15, 2017</time></span>\n</h2><ul>\n<li>The <code>return</code> and <code>export</code> keywords can now accept implicit objects (defined by indentation, without needing braces).</li>\n<li>Support Unicode code point escapes (e.g. <code>\\u{1F4A9}</code>).</li>\n<li>The <code>coffee</code> command now first looks to see if CoffeeScript is installed under <code>node_modules</code> in the current folder, and executes the <code>coffee</code> binary there if so; or otherwise it runs the globally installed one. This allows you to have one version of CoffeeScript installed globally and a different one installed locally for a particular project. (Likewise for the <code>cake</code> command.)</li>\n<li>Bugfixes for chained function calls not closing implicit objects or ternaries.</li>\n<li>Bugfixes for incorrect code generated by the <code>?</code> operator within a termary <code>if</code> statement.</li>\n<li>Fixed some tests, and failing tests now result in a nonzero exit code.</li>\n</ul>\n<div class=\"anchor\" id=\"1.12.5\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.4...1.12.5\">1.12.5</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-04-10\">April 10, 2017</time></span>\n</h2><ul>\n<li>Better handling of <code>default</code>, <code>from</code>, <code>as</code> and <code>*</code> within <code>import</code> and <code>export</code> statements. You can now import or export a member named <code>default</code> and the compiler won’t interpret it as the <code>default</code> keyword.</li>\n<li>Fixed a bug where invalid octal escape sequences weren’t throwing errors in the compiler.</li>\n</ul>\n<div class=\"anchor\" id=\"1.12.4\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.3...1.12.4\">1.12.4</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-02-18\">February 18, 2017</time></span>\n</h2><ul>\n<li>The <code>cake</code> commands have been updated, with new <code>watch</code> options for most tasks. Clone the <a href=\"https://github.com/jashkenas/coffeescript\">CoffeeScript repo</a> and run <code>cake</code> at the root of the repo to see the options.</li>\n<li>Fixed a bug where <code>export</code>ing a referenced variable was preventing the variable from being declared.</li>\n<li>Fixed a bug where the <code>coffee</code> command wasn’t working for a <code>.litcoffee</code> file.</li>\n<li>Bugfixes related to tokens and location data, for better source maps and improved compatibility with downstream tools.</li>\n</ul>\n<div class=\"anchor\" id=\"1.12.3\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.2...1.12.3\">1.12.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-01-24\">January 24, 2017</time></span>\n</h2><ul>\n<li><code>@</code> values can now be used as indices in <code>for</code> expressions. This loosens the compilation of <code>for</code> expressions to allow the index variable to be an <code>@</code> value, e.g. <code>do @visit for @node, @index in nodes</code>. Within <code>@visit</code>, the index of the current node (<code>@node</code>) would be available as <code>@index</code>.</li>\n<li>CoffeeScript’s patched <code>Error.prepareStackTrace</code> has been restored, with some revisions that should prevent the erroneous exceptions that were making life difficult for some downstream projects. This fixes the incorrect line numbers in stack traces since 1.12.2.</li>\n<li>The <code>//=</code> operator’s output now wraps parentheses around the right operand, like the other assignment operators.</li>\n</ul>\n<div class=\"anchor\" id=\"1.12.2\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.1...1.12.2\">1.12.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2016-12-16\">December 16, 2016</time></span>\n</h2><ul>\n<li>The browser compiler can once again be built unminified via <code>MINIFY=false cake build:browser</code>.</li>\n<li>The error-prone patched version of <code>Error.prepareStackTrace</code> has been removed.</li>\n<li>Command completion in the REPL (pressing tab to get suggestions) has been fixed for Node 6.9.1+.</li>\n<li>The <a href=\"test.html\">browser-based tests</a> now include all the tests as the Node-based version.</li>\n</ul>\n<div class=\"anchor\" id=\"1.12.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.0...1.12.1\">1.12.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2016-12-07\">December 7, 2016</time></span>\n</h2><ul>\n<li>You can now import a module member named <code>default</code>, e.g. <code>import { default } from 'lib'</code>. Though like in ES2015, you cannot import an entire module and name it <code>default</code> (so <code>import default from 'lib'</code> is not allowed).</li>\n<li>Fix regression where <code>from</code> as a variable name was breaking <code>for</code> loop declarations. For the record, <code>from</code> is not a reserved word in CoffeeScript; you may use it for variable names. <code>from</code> behaves like a keyword within the context of <code>import</code> and <code>export</code> statements, and in the declaration of a <code>for</code> loop; though you should also be able to use variables named <code>from</code> in those contexts, and the compiler should be able to tell the difference.</li>\n</ul>\n<div class=\"anchor\" id=\"1.12.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.11.1...1.12.0\">1.12.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2016-12-04\">December 4, 2016</time></span>\n</h2><ul>\n<li>CoffeeScript now supports ES2015 <a href=\"#tagged-template-literals\">tagged template literals</a>. Note that using tagged template literals in your code makes you responsible for ensuring that either your runtime supports tagged template literals or that you transpile the output JavaScript further to a version your target runtime(s) support.</li>\n<li>CoffeeScript now provides a <a href=\"#generator-iteration\"><code>for…from</code></a> syntax for outputting ES2015 <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of\"><code>for…of</code></a>. (Sorry they couldn’t match, but we came up with <code>for…of</code> first for something else.) This allows iterating over generators or any other iterable object. Note that using <code>for…from</code> in your code makes you responsible for ensuring that either your runtime supports <code>for…of</code> or that you transpile the output JavaScript further to a version your target runtime(s) support.</li>\n<li>Triple backticks (<code>```​</code>) allow the creation of embedded JavaScript blocks where escaping single backticks is not required, which should improve interoperability with ES2015 template literals and with Markdown.</li>\n<li>Within single-backtick embedded JavaScript, backticks can now be escaped via <code>\\`​</code>.</li>\n<li>The browser tests now run in the browser again, and are accessible <a href=\"test.html\">here</a> if you would like to test your browser.</li>\n<li>CoffeeScript-only keywords in ES2015 <code>import</code>s and <code>export</code>s are now ignored.</li>\n<li>The compiler now throws an error on trying to export an anonymous class.</li>\n<li>Bugfixes related to tokens and location data, for better source maps and improved compatibility with downstream tools.</li>\n</ul>\n<div class=\"anchor\" id=\"1.11.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.11.0...1.11.1\">1.11.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2016-10-02\">October 2, 2016</time></span>\n</h2><ul>\n<li>Bugfix for shorthand object syntax after interpolated keys.</li>\n<li>Bugfix for indentation-stripping in <code>&quot;&quot;&quot;</code> strings.</li>\n<li>Bugfix for not being able to use the name “arguments” for a prototype property of class.</li>\n<li>Correctly compile large hexadecimal numbers literals to <code>2e308</code> (just like all other large number literals do).</li>\n</ul>\n<div class=\"anchor\" id=\"1.11.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.10.0...1.11.0\">1.11.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2016-09-24\">September 24, 2016</time></span>\n</h2><ul>\n<li>\n<p>CoffeeScript now supports ES2015 <a href=\"#modules\"><code>import</code> and <code>export</code> syntax</a>.</p>\n</li>\n<li>\n<p>Added the <code>-M, --inline-map</code> flag to the compiler, allowing you embed the source map directly into the output JavaScript, rather than as a separate file.</p>\n</li>\n<li>\n<p>A bunch of fixes for <code>yield</code>:</p>\n<ul>\n<li>\n<p><code>yield return</code> can no longer mistakenly be used as an expression.</p>\n</li>\n<li>\n<p><code>yield</code> now mirrors <code>return</code> in that it can be used stand-alone as well as with expressions. Where you previously wrote <code>yield undefined</code>, you may now write simply <code>yield</code>. However, this means also inheriting the same syntax limitations that <code>return</code> has, so these examples no longer compile:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code>doubles = -&gt;\n  yield for i in [1..3]\n    i * 2\nsix = -&gt;\n  yield\n    2 * 3\n</code></pre>\n</blockquote></li>\n<li>\n<p>The JavaScript output is a bit nicer, with unnecessary parentheses and spaces, double indentation and double semicolons around <code>yield</code> no longer present.</p>\n</li>\n</ul>\n</li>\n<li>\n<p><code>&amp;&amp;=</code>, <code>||=</code>, <code>and=</code> and <code>or=</code> no longer accidentally allow a space before the equals sign.</p>\n</li>\n<li>\n<p>Improved several error messages.</p>\n</li>\n<li>\n<p>Just like <code>undefined</code> compiles to <code>void 0</code>, <code>NaN</code> now compiles into <code>0/0</code> and <code>Infinity</code> into <code>2e308</code>.</p>\n</li>\n<li>\n<p>Bugfix for renamed destructured parameters with defaults. <code>({a: b = 1}) -&gt;</code> no longer crashes the compiler.</p>\n</li>\n<li>\n<p>Improved the internal representation of a CoffeeScript program. This is only noticeable to tools that use <code>CoffeeScript.tokens</code> or <code>CoffeeScript.nodes</code>. Such tools need to update to take account for changed or added tokens and nodes.</p>\n</li>\n<li>\n<p>Several minor bug fixes, including:</p>\n<ul>\n<li>The caught error in <code>catch</code> blocks is no longer declared unnecessarily, and no longer mistakenly named <code>undefined</code> for <code>catch</code>-less <code>try</code> blocks.</li>\n<li>Unassignable parameter destructuring no longer crashes the compiler.</li>\n<li>Source maps are now used correctly for errors thrown from .coffee.md files.</li>\n<li><code>coffee -e 'throw null'</code> no longer crashes.</li>\n<li>The REPL no longer crashes when using <code>.exit</code> to exit it.</li>\n<li>Invalid JavaScript is no longer output when lots of <code>for</code> loops are used in the same scope.</li>\n<li>A unicode issue when using stdin with the CLI.</li>\n</ul>\n</li>\n</ul>\n<div class=\"anchor\" id=\"1.10.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.9.3...1.10.0\">1.10.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2015-09-03\">September 3, 2015</time></span>\n</h2><ul>\n<li>\n<p>CoffeeScript now supports ES2015-style destructuring defaults.</p>\n</li>\n<li>\n<p><code>(offsetHeight: height) -&gt;</code> no longer compiles. That syntax was accidental and partly broken. Use <code>({offsetHeight: height}) -&gt;</code> instead. Object destructuring always requires braces.</p>\n</li>\n<li>\n<p>Several minor bug fixes, including:</p>\n<ul>\n<li>A bug where the REPL would sometimes report valid code as invalid, based on what you had typed earlier.</li>\n<li>A problem with multiple JS contexts in the jest test framework.</li>\n<li>An error in io.js where strict mode is set on internal modules.</li>\n<li>A variable name clash for the caught error in <code>catch</code> blocks.</li>\n</ul>\n</li>\n</ul>\n<div class=\"anchor\" id=\"1.9.3\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.9.2...1.9.3\">1.9.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2015-05-27\">May 27, 2015</time></span>\n</h2><ul>\n<li>Bugfix for interpolation in the first key of an object literal in an implicit call.</li>\n<li>Fixed broken error messages in the REPL, as well as a few minor bugs with the REPL.</li>\n<li>Fixed source mappings for tokens at the beginning of lines when compiling with the <code>--bare</code> option. This has the nice side effect of generating smaller source maps.</li>\n<li>Slight formatting improvement of compiled block comments.</li>\n<li>Better error messages for <code>on</code>, <code>off</code>, <code>yes</code> and <code>no</code>.</li>\n</ul>\n<div class=\"anchor\" id=\"1.9.2\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.9.1...1.9.2\">1.9.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2015-04-15\">April 15, 2015</time></span>\n</h2><ul>\n<li>Fixed a <strong>watch</strong> mode error introduced in 1.9.1 when compiling multiple files with the same filename.</li>\n<li>Bugfix for <code>yield</code> around expressions containing <code>this</code>.</li>\n<li>Added a Ruby-style <code>-r</code> option to the REPL, which allows requiring a module before execution with <code>--eval</code> or <code>--interactive</code>.</li>\n<li>In <code>&lt;script type=&quot;text/coffeescript&quot;&gt;</code> tags, to avoid possible duplicate browser requests for .coffee files, you can now use the <code>data-src</code> attribute instead of <code>src</code>.</li>\n<li>Minor bug fixes for IE8, strict ES5 regular expressions and Browserify.</li>\n</ul>\n<div class=\"anchor\" id=\"1.9.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.9.0...1.9.1\">1.9.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2015-02-18\">February 18, 2015</time></span>\n</h2><ul>\n<li>Interpolation now works in object literal keys (again). You can use this to dynamically name properties.</li>\n<li>Internal compiler variable names no longer start with underscores. This makes the generated JavaScript a bit prettier, and also fixes an issue with the completely broken and ungodly way that AngularJS “parses” function arguments.</li>\n<li>Fixed a few <code>yield</code>-related edge cases with <code>yield return</code> and <code>yield throw</code>.</li>\n<li>Minor bug fixes and various improvements to compiler error messages.</li>\n</ul>\n<div class=\"anchor\" id=\"1.9.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.8.0...1.9.0\">1.9.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2015-01-29\">January 29, 2015</time></span>\n</h2><ul>\n<li>CoffeeScript now supports ES2015 generators. A generator is simply a function that <code>yield</code>s.</li>\n<li>More robust parsing and improved error messages for strings and regexes — especially with respect to interpolation.</li>\n<li>Changed strategy for the generation of internal compiler variable names. Note that this means that <code>@example</code> function parameters are no longer available as naked <code>example</code> variables within the function body.</li>\n<li>Fixed REPL compatibility with latest versions of Node and Io.js.</li>\n<li>Various minor bug fixes.</li>\n</ul>\n<div class=\"anchor\" id=\"1.8.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.7.1...1.8.0\">1.8.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2014-08-26\">August 26, 2014</time></span>\n</h2><ul>\n<li>The <code>--join</code> option of the CLI is now deprecated.</li>\n<li>Source maps now use <code>.js.map</code> as file extension, instead of just <code>.map</code>.</li>\n<li>The CLI now exits with the exit code 1 when it fails to write a file to disk.</li>\n<li>The compiler no longer crashes on unterminated, single-quoted strings.</li>\n<li>Fixed location data for string interpolations, which made source maps out of sync.</li>\n<li>The error marker in error messages is now correctly positioned if the code is indented with tabs.</li>\n<li>Fixed a slight formatting error in CoffeeScript’s source map-patched stack traces.</li>\n<li>The <code>%%</code> operator now coerces its right operand only once.</li>\n<li>It is now possible to require CoffeeScript files from Cakefiles without having to register the compiler first.</li>\n<li>The CoffeeScript REPL is now exported and can be required using <code>require 'coffee-script/repl'</code>.</li>\n<li>Fixes for the REPL in Node 0.11.</li>\n</ul>\n<div class=\"anchor\" id=\"1.7.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.7.0...1.7.1\">1.7.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2014-01-29\">January 29, 2014</time></span>\n</h2><ul>\n<li>Fixed a typo that broke node module lookup when running a script directly with the <code>coffee</code> binary.</li>\n</ul>\n<div class=\"anchor\" id=\"1.7.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.6.3...1.7.0\">1.7.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2014-01-28\">January 28, 2014</time></span>\n</h2><ul>\n<li>When requiring CoffeeScript files in Node you must now explicitly register the compiler. This can be done with <code>require 'coffee-script/register'</code> or <code>CoffeeScript.register()</code>. Also for configuration such as Mocha’s, use <strong>coffee-script/register</strong>.</li>\n<li>Improved error messages, source maps and stack traces. Source maps now use the updated <code>//#</code> syntax.</li>\n<li>Leading <code>.</code> now closes all open calls, allowing for simpler chaining syntax.</li>\n</ul>\n<div class='code'><pre><code>$ <span class=\"string\">'body'</span>\n.click (e) -&gt;\n  $ <span class=\"string\">'.box'</span>\n  .fadeIn <span class=\"string\">'fast'</span>\n  .addClass <span class=\"string\">'.active'</span>\n.css <span class=\"string\">'background'</span>, <span class=\"string\">'white'</span>\n</code></pre><pre><code>$(<span class=\"string\">'body'</span>).click(<span class=\"function\"><span class=\"keyword\">function</span>(<span class=\"params\">e</span>) </span>{\n  <span class=\"keyword\">return</span> $(<span class=\"string\">'.box'</span>).fadeIn(<span class=\"string\">'fast'</span>).addClass(<span class=\"string\">'.active'</span>);\n}).css(<span class=\"string\">'background'</span>, <span class=\"string\">'white'</span>);\n</code></pre><script>window.example1 = \"$ 'body'\\n.click (e) ->\\n  $ '.box'\\n  .fadeIn 'fast'\\n  .addClass '.active'\\n.css 'background', 'white'\\n\"</script><div class='minibutton load' onclick='javascript: loadConsole(example1);'>load</div><br class='clear' /></div><ul>\n<li>Added <code>**</code>, <code>//</code> and <code>%%</code> operators and <code>...</code> expansion in parameter lists and destructuring expressions.</li>\n<li>Multiline strings are now joined by a single space and ignore all indentation. A backslash at the end of a line can denote the amount of whitespace between lines, in both strings and heredocs. Backslashes correctly escape whitespace in block regexes.</li>\n<li>Closing brackets can now be indented and therefore no longer cause unexpected error.</li>\n<li>Several breaking compilation fixes. Non-callable literals (strings, numbers etc.) don’t compile in a call now and multiple postfix conditionals compile properly. Postfix conditionals and loops always bind object literals. Conditional assignment compiles properly in subexpressions. <code>super</code> is disallowed outside of methods and works correctly inside <code>for</code> loops.</li>\n<li>Formatting of compiled block comments has been improved.</li>\n<li>No more <code>-p</code> folders on Windows.</li>\n<li>The <code>options</code> object passed to CoffeeScript is no longer mutated.</li>\n</ul>\n<div class=\"anchor\" id=\"1.6.3\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.6.2...1.6.3\">1.6.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2013-06-02\">June 2, 2013</time></span>\n</h2><ul>\n<li>The CoffeeScript REPL now remembers your history between sessions. Just like a proper REPL should.</li>\n<li>You can now use <code>require</code> in Node to load <code>.coffee.md</code> Literate CoffeeScript files. In the browser, <code>text/literate-coffeescript</code> script tags.</li>\n<li>The old <code>coffee --lint</code> command has been removed. It was useful while originally working on the compiler, but has been surpassed by JSHint. You may now use <code>-l</code> to pass literate files in over <strong>stdio</strong>.</li>\n<li>Bugfixes for Windows path separators, <code>catch</code> without naming the error, and executable-class-bodies-with- prototypal-property-attachment.</li>\n</ul>\n<div class=\"anchor\" id=\"1.6.2\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.6.1...1.6.2\">1.6.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2013-03-18\">March 18, 2013</time></span>\n</h2><ul>\n<li>Source maps have been used to provide automatic line-mapping when running CoffeeScript directly via the <code>coffee</code> command, and for automatic line-mapping when running CoffeeScript directly in the browser. Also, to provide better error messages for semantic errors thrown by the compiler — <a href=\"http://cl.ly/NdOA\">with colors, even</a>.</li>\n<li>Improved support for mixed literate/vanilla-style CoffeeScript projects, and generating source maps for both at the same time.</li>\n<li>Fixes for <strong>1.6.x</strong> regressions with overriding inherited bound functions, and for Windows file path management.</li>\n<li>The <code>coffee</code> command can now correctly <code>fork()</code> both <code>.coffee</code> and <code>.js</code> files. (Requires Node.js 0.9+)</li>\n</ul>\n<div class=\"anchor\" id=\"1.6.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.5.0...1.6.1\">1.6.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2013-03-05\">March 5, 2013</time></span>\n</h2><ul>\n<li>First release of <a href=\"#source-maps\">source maps</a>. Pass the <code>--map</code> flag to the compiler, and off you go. Direct all your thanks over to <a href=\"https://github.com/jwalton\">Jason Walton</a>.</li>\n<li>Fixed a 1.5.0 regression with multiple implicit calls against an indented implicit object. Combinations of implicit function calls and implicit objects should generally be parsed better now — but it still isn’t good <em>style</em> to nest them too heavily.</li>\n<li><code>.coffee.md</code> is now also supported as a Literate CoffeeScript file extension, for existing tooling. <code>.litcoffee</code> remains the canonical one.</li>\n<li>Several minor fixes surrounding member properties, bound methods and <code>super</code> in class declarations.</li>\n</ul>\n<div class=\"anchor\" id=\"1.5.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.4.0...1.5.0\">1.5.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2013-02-25\">February 25, 2013</time></span>\n</h2><ul>\n<li>First release of <a href=\"#literate\">Literate CoffeeScript</a>.</li>\n<li>The CoffeeScript REPL is now based on the Node.js REPL, and should work better and more familiarly.</li>\n<li>Returning explicit values from constructors is now forbidden. If you want to return an arbitrary value, use a function, not a constructor.</li>\n<li>You can now loop over an array backwards, without having to manually deal with the indexes: <code>for item in list by -1</code></li>\n<li>Source locations are now preserved in the CoffeeScript AST, although source maps are not yet being emitted.</li>\n</ul>\n<div class=\"anchor\" id=\"1.4.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.3.3...1.4.0\">1.4.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2012-10-23\">October 23, 2012</time></span>\n</h2><ul>\n<li>The CoffeeScript compiler now strips Microsoft’s UTF-8 BOM if it exists, allowing you to compile BOM-borked source files.</li>\n<li>Fix Node/compiler deprecation warnings by removing <code>registerExtension</code>, and moving from <code>path.exists</code> to <code>fs.exists</code>.</li>\n<li>Small tweaks to splat compilation, backticks, slicing, and the error for duplicate keys in object literals.</li>\n</ul>\n<div class=\"anchor\" id=\"1.3.3\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.3.1...1.3.3\">1.3.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2012-05-15\">May 15, 2012</time></span>\n</h2><ul>\n<li>Due to the new semantics of JavaScript’s strict mode, CoffeeScript no longer guarantees that constructor functions have names in all runtimes. See <a href=\"https://github.com/jashkenas/coffeescript/issues/2052\">#2052</a> for discussion.</li>\n<li>Inside of a nested function inside of an instance method, it’s now possible to call <code>super</code> more reliably (walks recursively up).</li>\n<li>Named loop variables no longer have different scoping heuristics than other local variables. (Reverts #643)</li>\n<li>Fix for splats nested within the LHS of destructuring assignment.</li>\n<li>Corrections to our compile time strict mode forbidding of octal literals.</li>\n</ul>\n<div class=\"anchor\" id=\"1.3.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.2.0...1.3.1\">1.3.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2012-04-10\">April 10, 2012</time></span>\n</h2><ul>\n<li>CoffeeScript now enforces all of JavaScript’s <strong>Strict Mode</strong> early syntax errors at compile time. This includes old-style octal literals, duplicate property names in object literals, duplicate parameters in a function definition, deleting naked variables, setting the value of <code>eval</code> or <code>arguments</code>, and more. See a full discussion at <a href=\"https://github.com/jashkenas/coffeescript/issues/1547\">#1547</a>.</li>\n<li>The REPL now has a handy new multi-line mode for entering large blocks of code. It’s useful when copy-and-pasting examples into the REPL. Enter multi-line mode with <code>Ctrl-V</code>. You may also now pipe input directly into the REPL.</li>\n<li>CoffeeScript now prints a <code>Generated by CoffeeScript VERSION</code> header at the top of each compiled file.</li>\n<li>Conditional assignment of previously undefined variables <code>a or= b</code> is now considered a syntax error.</li>\n<li>A tweak to the semantics of <code>do</code>, which can now be used to more easily simulate a namespace: <code>do (x = 1, y = 2) -&gt; …</code></li>\n<li>Loop indices are now mutable within a loop iteration, and immutable between them.</li>\n<li>Both endpoints of a slice are now allowed to be omitted for consistency, effectively creating a shallow copy of the list.</li>\n<li>Additional tweaks and improvements to <code>coffee --watch</code> under Node’s “new” file watching API. Watch will now beep by default if you introduce a syntax error into a watched script. We also now ignore hidden directories by default when watching recursively.</li>\n</ul>\n<div class=\"anchor\" id=\"1.2.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.1.3...1.2.0\">1.2.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2011-12-18\">December 18, 2011</time></span>\n</h2><ul>\n<li>Multiple improvements to <code>coffee --watch</code> and <code>--join</code>. You may now use both together, as well as add and remove files and directories within a <code>--watch</code>’d folder.</li>\n<li>The <code>throw</code> statement can now be used as part of an expression.</li>\n<li>Block comments at the top of the file will now appear outside of the safety closure wrapper.</li>\n<li>Fixed a number of minor 1.1.3 regressions having to do with trailing operators and unfinished lines, and a more major 1.1.3 regression that caused bound functions <em>within</em> bound class functions to have the incorrect <code>this</code>.</li>\n</ul>\n<div class=\"anchor\" id=\"1.1.3\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.1.2...1.1.3\">1.1.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2011-11-08\">November 8, 2011</time></span>\n</h2><ul>\n<li>Ahh, whitespace. CoffeeScript’s compiled JS now tries to space things out and keep it readable, as you can see in the examples on this page.</li>\n<li>You can now call <code>super</code> in class level methods in class bodies, and bound class methods now preserve their correct context.</li>\n<li>JavaScript has always supported octal numbers <code>010 is 8</code>, and hexadecimal numbers <code>0xf is 15</code>, but CoffeeScript now also supports binary numbers: <code>0b10 is 2</code>.</li>\n<li>The CoffeeScript module has been nested under a subdirectory to make it easier to <code>require</code> individual components separately, without having to use <strong>npm</strong>. For example, after adding the CoffeeScript folder to your path: <code>require('coffee-script/lexer')</code></li>\n<li>There’s a new “link” feature in Try CoffeeScript on this webpage. Use it to get a shareable permalink for your example script.</li>\n<li>The <code>coffee --watch</code> feature now only works on Node.js 0.6.0 and higher, but now also works properly on Windows.</li>\n<li>Lots of small bug fixes from <strong><a href=\"https://github.com/michaelficarra\">@michaelficarra</a></strong>, <strong><a href=\"https://github.com/geraldalewis\">@geraldalewis</a></strong>, <strong><a href=\"https://github.com/satyr\">@satyr</a></strong>, and <strong><a href=\"https://github.com/trevorburnham\">@trevorburnham</a></strong>.</li>\n</ul>\n<div class=\"anchor\" id=\"1.1.2\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.1.1...1.1.2\">1.1.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2011-08-04\">August 4, 2011</time></span>\n</h2><p>Fixes for block comment formatting, <code>?=</code> compilation, implicit calls against control structures, implicit invocation of a try/catch block, variadic arguments leaking from local scope, line numbers in syntax errors following heregexes, property access on parenthesized number literals, bound class methods and super with reserved names, a REPL overhaul, consecutive compiled semicolons, block comments in implicitly called objects, and a Chrome bug.</p>\n<div class=\"anchor\" id=\"1.1.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.1.0...1.1.1\">1.1.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2011-05-10\">May 10, 2011</time></span>\n</h2><p>Bugfix release for classes with external constructor functions, see issue #1182.</p>\n<div class=\"anchor\" id=\"1.1.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.0.1...1.1.0\">1.1.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2011-05-01\">May 1, 2011</time></span>\n</h2><p>When running via the <code>coffee</code> executable, <code>process.argv</code> and friends now report <code>coffee</code> instead of <code>node</code>. Better compatibility with <strong>Node.js 0.4.x</strong> module lookup changes. The output in the REPL is now colorized, like Node’s is. Giving your concatenated CoffeeScripts a name when using <code>--join</code> is now mandatory. Fix for lexing compound division <code>/=</code> as a regex accidentally. All <code>text/coffeescript</code> tags should now execute in the order they’re included. Fixed an issue with extended subclasses using external constructor functions. Fixed an edge-case infinite loop in <code>addImplicitParentheses</code>. Fixed exponential slowdown with long chains of function calls. Globals no longer leak into the CoffeeScript REPL. Splatted parameters are declared local to the function.</p>\n<div class=\"anchor\" id=\"1.0.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/1.0.0...1.0.1\">1.0.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2011-01-31\">January 31, 2011</time></span>\n</h2><p>Fixed a lexer bug with Unicode identifiers. Updated REPL for compatibility with Node.js 0.3.7. Fixed requiring relative paths in the REPL. Trailing <code>return</code> and <code>return undefined</code> are now optimized away. Stopped requiring the core Node.js <code>util</code> module for back-compatibility with Node.js 0.2.5. Fixed a case where a conditional <code>return</code> would cause fallthrough in a <code>switch</code> statement. Optimized empty objects in destructuring assignment.</p>\n<div class=\"anchor\" id=\"1.0.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.6...1.0.0\">1.0.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-12-24\">December 24, 2010</time></span>\n</h2><p>CoffeeScript loops no longer try to preserve block scope when functions are being generated within the loop body. Instead, you can use the <code>do</code> keyword to create a convenient closure wrapper. Added a <code>--nodejs</code> flag for passing through options directly to the <code>node</code> executable. Better behavior around the use of pure statements within expressions. Fixed inclusive slicing through <code>-1</code>, for all browsers, and splicing with arbitrary expressions as endpoints.</p>\n<div class=\"anchor\" id=\"0.9.6\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.5...0.9.6\">0.9.6</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-12-06\">December 6, 2010</time></span>\n</h2><p>The REPL now properly formats stacktraces, and stays alive through asynchronous exceptions. Using <code>--watch</code> now prints timestamps as files are compiled. Fixed some accidentally-leaking variables within plucked closure-loops. Constructors now maintain their declaration location within a class body. Dynamic object keys were removed. Nested classes are now supported. Fixes execution context for naked splatted functions. Bugfix for inversion of chained comparisons. Chained class instantiation now works properly with splats.</p>\n<div class=\"anchor\" id=\"0.9.5\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.4...0.9.5\">0.9.5</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-11-21\">November 21, 2010</time></span>\n</h2><p>0.9.5 should be considered the first release candidate for CoffeeScript 1.0. There have been a large number of internal changes since the previous release, many contributed from <strong>satyr</strong>’s <a href=\"https://github.com/satyr/coco\">Coco</a> dialect of CoffeeScript. Heregexes (extended regexes) were added. Functions can now have default arguments. Class bodies are now executable code. Improved syntax errors for invalid CoffeeScript. <code>undefined</code> now works like <code>null</code>, and cannot be assigned a new value. There was a precedence change with respect to single-line comprehensions: <code>result = i for i in list</code>\nused to parse as <code>result = (i for i in list)</code> by default … it now parses as\n<code>(result = i) for i in list</code>.</p>\n<div class=\"anchor\" id=\"0.9.4\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.3...0.9.4\">0.9.4</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-09-21\">September 21, 2010</time></span>\n</h2><p>CoffeeScript now uses appropriately-named temporary variables, and recycles their references after use. Added <code>require.extensions</code> support for <strong>Node.js 0.3</strong>. Loading CoffeeScript in the browser now adds just a single <code>CoffeeScript</code> object to global scope. Fixes for implicit object and block comment edge cases.</p>\n<div class=\"anchor\" id=\"0.9.3\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.2...0.9.3\">0.9.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-09-16\">September 16, 2010</time></span>\n</h2><p>CoffeeScript <code>switch</code> statements now compile into JS <code>switch</code> statements — they previously compiled into <code>if/else</code> chains for JavaScript 1.3 compatibility. Soaking a function invocation is now supported. Users of the RubyMine editor should now be able to use <code>--watch</code> mode.</p>\n<div class=\"anchor\" id=\"0.9.2\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.1...0.9.2\">0.9.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-08-23\">August 23, 2010</time></span>\n</h2><p>Specifying the start and end of a range literal is now optional, eg. <code>array[3..]</code>. You can now say <code>a not instanceof b</code>. Fixed important bugs with nested significant and non-significant indentation (Issue #637). Added a <code>--require</code> flag that allows you to hook into the <code>coffee</code> command. Added a custom <code>jsl.conf</code> file for our preferred JavaScriptLint setup. Sped up Jison grammar compilation time by flattening rules for operations. Block comments can now be used with JavaScript-minifier-friendly syntax. Added JavaScript’s compound assignment bitwise operators. Bugfixes to implicit object literals with leading number and string keys, as the subject of implicit calls, and as part of compound assignment.</p>\n<div class=\"anchor\" id=\"0.9.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.0...0.9.1\">0.9.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-08-11\">August 11, 2010</time></span>\n</h2><p>Bugfix release for <strong>0.9.1</strong>. Greatly improves the handling of mixed implicit objects, implicit function calls, and implicit indentation. String and regex interpolation is now strictly <code>#{ … }</code> (Ruby style). The compiler now takes a <code>--require</code> flag, which specifies scripts to run before compilation.</p>\n<div class=\"anchor\" id=\"0.9.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.7.2...0.9.0\">0.9.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-08-04\">August 4, 2010</time></span>\n</h2><p>The CoffeeScript <strong>0.9</strong> series is considered to be a release candidate for <strong>1.0</strong>; let’s give her a shakedown cruise. <strong>0.9.0</strong> introduces a massive backwards-incompatible change: Assignment now uses <code>=</code>, and object literals use <code>:</code>, as in JavaScript. This allows us to have implicit object literals, and YAML-style object definitions. Half assignments are removed, in favor of <code>+=</code>, <code>or=</code>, and friends. Interpolation now uses a hash mark <code>#</code> instead of the dollar sign <code>$</code> — because dollar signs may be part of a valid JS identifier. Downwards range comprehensions are now safe again, and are optimized to straight for loops when created with integer endpoints. A fast, unguarded form of object comprehension was added: <code>for all key, value of object</code>. Mentioning the <code>super</code> keyword with no arguments now forwards all arguments passed to the function, as in Ruby. If you extend class <code>B</code> from parent class <code>A</code>, if <code>A</code> has an <code>extended</code> method defined, it will be called, passing in <code>B</code> — this enables static inheritance, among other things. Cleaner output for functions bound with the fat arrow. <code>@variables</code> can now be used in parameter lists, with the parameter being automatically set as a property on the object — useful in constructors and setter functions. Constructor functions can now take splats.</p>\n<div class=\"anchor\" id=\"0.7.2\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.7.1...0.7.2\">0.7.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-07-12\">July 12, 2010</time></span>\n</h2><p>Quick bugfix (right after 0.7.1) for a problem that prevented <code>coffee</code> command-line options from being parsed in some circumstances.</p>\n<div class=\"anchor\" id=\"0.7.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.7.0...0.7.1\">0.7.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-07-11\">July 11, 2010</time></span>\n</h2><p>Block-style comments are now passed through and printed as JavaScript block comments – making them useful for licenses and copyright headers. Better support for running coffee scripts standalone via hashbangs. Improved syntax errors for tokens that are not in the grammar.</p>\n<div class=\"anchor\" id=\"0.7.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.6.2...0.7.0\">0.7.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-06-28\">June 28, 2010</time></span>\n</h2><p>Official CoffeeScript variable style is now camelCase, as in JavaScript. Reserved words are now allowed as object keys, and will be quoted for you. Range comprehensions now generate cleaner code, but you have to specify <code>by -1</code> if you’d like to iterate downward. Reporting of syntax errors is greatly improved from the previous release. Running <code>coffee</code> with no arguments now launches the REPL, with Readline support. The <code>&lt;-</code> bind operator has been removed from CoffeeScript. The <code>loop</code> keyword was added, which is equivalent to a <code>while true</code> loop. Comprehensions that contain closures will now close over their variables, like the semantics of a <code>forEach</code>. You can now use bound function in class definitions (bound to the instance). For consistency, <code>a in b</code> is now an array presence check, and <code>a of b</code> is an object-key check. Comments are no longer passed through to the generated JavaScript.</p>\n<div class=\"anchor\" id=\"0.6.2\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.6.1...0.6.2\">0.6.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-05-15\">May 15, 2010</time></span>\n</h2><p>The <code>coffee</code> command will now preserve directory structure when compiling a directory full of scripts. Fixed two omissions that were preventing the CoffeeScript compiler from running live within Internet Explorer. There’s now a syntax for block comments, similar in spirit to CoffeeScript’s heredocs. ECMA Harmony DRY-style pattern matching is now supported, where the name of the property is the same as the name of the value: <code>{name, length}: func</code>. Pattern matching is now allowed within comprehension variables. <code>unless</code> is now allowed in block form. <code>until</code> loops were added, as the inverse of <code>while</code> loops. <code>switch</code> statements are now allowed without switch object clauses. Compatible with Node.js <strong>v0.1.95</strong>.</p>\n<div class=\"anchor\" id=\"0.6.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.6.0...0.6.1\">0.6.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-04-12\">April 12, 2010</time></span>\n</h2><p>Upgraded CoffeeScript for compatibility with the new Node.js <strong>v0.1.90</strong> series.</p>\n<div class=\"anchor\" id=\"0.6.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.6...0.6.0\">0.6.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-04-03\">April 3, 2010</time></span>\n</h2><p>Trailing commas are now allowed, a-la Python. Static properties may be assigned directly within class definitions, using <code>@property</code> notation.</p>\n<div class=\"anchor\" id=\"0.5.6\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.5...0.5.6\">0.5.6</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-03-23\">March 23, 2010</time></span>\n</h2><p>Interpolation can now be used within regular expressions and heredocs, as well as strings. Added the <code>&lt;-</code> bind operator. Allowing assignment to half-expressions instead of special <code>||=</code>-style operators. The arguments object is no longer automatically converted into an array. After requiring <code>coffee-script</code>, Node.js can now directly load <code>.coffee</code> files, thanks to <strong>registerExtension</strong>. Multiple splats can now be used in function calls, arrays, and pattern matching.</p>\n<div class=\"anchor\" id=\"0.5.5\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.4...0.5.5\">0.5.5</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-03-08\">March 8, 2010</time></span>\n</h2><p>String interpolation, contributed by <a href=\"https://github.com/StanAngeloff\">Stan Angeloff</a>. Since <code>--run</code> has been the default since <strong>0.5.3</strong>, updating <code>--stdio</code> and <code>--eval</code> to run by default, pass <code>--compile</code> as well if you’d like to print the result.</p>\n<div class=\"anchor\" id=\"0.5.4\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.3...0.5.4\">0.5.4</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-03-03\">March 3, 2010</time></span>\n</h2><p>Bugfix that corrects the Node.js global constants <code>__filename</code> and <code>__dirname</code>. Tweaks for more flexible parsing of nested function literals and improperly-indented comments. Updates for the latest Node.js API.</p>\n<div class=\"anchor\" id=\"0.5.3\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.2...0.5.3\">0.5.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-02-27\">February 27, 2010</time></span>\n</h2><p>CoffeeScript now has a syntax for defining classes. Many of the core components (Nodes, Lexer, Rewriter, Scope, Optparse) are using them. Cakefiles can use <code>optparse.coffee</code> to define options for tasks. <code>--run</code> is now the default flag for the <code>coffee</code> command, use <code>--compile</code> to save JavaScripts. Bugfix for an ambiguity between RegExp literals and chained divisions.</p>\n<div class=\"anchor\" id=\"0.5.2\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.1...0.5.2\">0.5.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-02-25\">February 25, 2010</time></span>\n</h2><p>Added a compressed version of the compiler for inclusion in web pages as\n<code>browser-compiler/coffee-script.js</code>. It’ll automatically run any script tags with type <code>text/coffeescript</code> for you. Added a <code>--stdio</code> option to the <code>coffee</code> command, for piped-in compiles.</p>\n<div class=\"anchor\" id=\"0.5.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.0...0.5.1\">0.5.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-02-24\">February 24, 2010</time></span>\n</h2><p>Improvements to null soaking with the existential operator, including soaks on indexed properties. Added conditions to <code>while</code> loops, so you can use them as filters with <code>when</code>, in the same manner as comprehensions.</p>\n<div class=\"anchor\" id=\"0.5.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.3.2...0.5.0\">0.5.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-02-21\">February 21, 2010</time></span>\n</h2><p>CoffeeScript 0.5.0 is a major release, While there are no language changes, the Ruby compiler has been removed in favor of a self-hosting compiler written in pure CoffeeScript.</p>\n<div class=\"anchor\" id=\"0.3.2\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.3.0...0.3.2\">0.3.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-02-08\">February 8, 2010</time></span>\n</h2><p><code>@property</code> is now a shorthand for <code>this.property</code>.\nSwitched the default JavaScript engine from Narwhal to Node.js. Pass the <code>--narwhal</code> flag if you’d like to continue using it.</p>\n<div class=\"anchor\" id=\"0.3.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.6...0.3.0\">0.3.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-26\">January 26, 2010</time></span>\n</h2><p>CoffeeScript 0.3 includes major syntax changes:\nThe function symbol was changed to <code>-&gt;</code>, and the bound function symbol is now <code>=&gt;</code>.\nParameter lists in function definitions must now be wrapped in parentheses.\nAdded property soaking, with the <code>?.</code> operator.\nMade parentheses optional, when invoking functions with arguments.\nRemoved the obsolete block literal syntax.</p>\n<div class=\"anchor\" id=\"0.2.6\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.5...0.2.6\">0.2.6</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-17\">January 17, 2010</time></span>\n</h2><p>Added Python-style chained comparisons, the conditional existence operator <code>?=</code>, and some examples from <em>Beautiful Code</em>. Bugfixes relating to statement-to-expression conversion, arguments-to-array conversion, and the TextMate syntax highlighter.</p>\n<div class=\"anchor\" id=\"0.2.5\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.4...0.2.5\">0.2.5</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-13\">January 13, 2010</time></span>\n</h2><p>The conditions in switch statements can now take multiple values at once — If any of them are true, the case will run. Added the long arrow <code>==&gt;</code>, which defines and immediately binds a function to <code>this</code>. While loops can now be used as expressions, in the same way that comprehensions can. Splats can be used within pattern matches to soak up the rest of an array.</p>\n<div class=\"anchor\" id=\"0.2.4\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.3...0.2.4\">0.2.4</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-12\">January 12, 2010</time></span>\n</h2><p>Added ECMAScript Harmony style destructuring assignment, for dealing with extracting values from nested arrays and objects. Added indentation-sensitive heredocs for nicely formatted strings or chunks of code.</p>\n<div class=\"anchor\" id=\"0.2.3\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.2...0.2.3\">0.2.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-11\">January 11, 2010</time></span>\n</h2><p>Axed the unsatisfactory <code>ino</code> keyword, replacing it with <code>of</code> for object comprehensions. They now look like: <code>for prop, value of object</code>.</p>\n<div class=\"anchor\" id=\"0.2.2\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.1...0.2.2\">0.2.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-10\">January 10, 2010</time></span>\n</h2><p>When performing a comprehension over an object, use <code>ino</code>, instead of <code>in</code>, which helps us generate smaller, more efficient code at compile time.\nAdded <code>::</code> as a shorthand for saying <code>.prototype.</code>\nThe “splat” symbol has been changed from a prefix asterisk <code>*</code>, to a postfix ellipsis <code>...</code>\nAdded JavaScript’s <code>in</code> operator, empty <code>return</code> statements, and empty <code>while</code> loops.\nConstructor functions that start with capital letters now include a safety check to make sure that the new instance of the object is returned.\nThe <code>extends</code> keyword now functions identically to <code>goog.inherits</code> in Google’s Closure Library.</p>\n<div class=\"anchor\" id=\"0.2.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.0...0.2.1\">0.2.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-05\">January 5, 2010</time></span>\n</h2><p>Arguments objects are now converted into real arrays when referenced.</p>\n<div class=\"anchor\" id=\"0.2.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.6...0.2.0\">0.2.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-05\">January 5, 2010</time></span>\n</h2><p>Major release. Significant whitespace. Better statement-to-expression conversion. Splats. Splice literals. Object comprehensions. Blocks. The existential operator. Many thanks to all the folks who posted issues, with special thanks to <a href=\"https://github.com/liamoc\">Liam O’Connor-Davis</a> for whitespace and expression help.</p>\n<div class=\"anchor\" id=\"0.1.6\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.5...0.1.6\">0.1.6</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-27\">December 27, 2009</time></span>\n</h2><p>Bugfix for running <code>coffee --interactive</code> and <code>--run</code> from outside of the CoffeeScript directory. Bugfix for nested function/if-statements.</p>\n<div class=\"anchor\" id=\"0.1.5\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.4...0.1.5\">0.1.5</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-26\">December 26, 2009</time></span>\n</h2><p>Array slice literals and array comprehensions can now both take Ruby-style ranges to specify the start and end. JavaScript variable declaration is now pushed up to the top of the scope, making all assignment statements into expressions. You can use <code>\\</code> to escape newlines. The <code>coffee-script</code> command is now called <code>coffee</code>.</p>\n<div class=\"anchor\" id=\"0.1.4\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.3...0.1.4\">0.1.4</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-25\">December 25, 2009</time></span>\n</h2><p>The official CoffeeScript extension is now <code>.coffee</code> instead of <code>.cs</code>, which properly belongs to <a href=\"https://en.wikipedia.org/wiki/C_Sharp_(programming_language)\">C#</a>. Due to popular demand, you can now also use <code>=</code> to assign. Unlike JavaScript, <code>=</code> can also be used within object literals, interchangeably with <code>:</code>. Made a grammatical fix for chained function calls like <code>func(1)(2)(3)(4)</code>. Inheritance and super no longer use <code>__proto__</code>, so they should be IE-compatible now.</p>\n<div class=\"anchor\" id=\"0.1.3\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.2...0.1.3\">0.1.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-25\">December 25, 2009</time></span>\n</h2><p>The <code>coffee</code> command now includes <code>--interactive</code>, which launches an interactive CoffeeScript session, and <code>--run</code>, which directly compiles and executes a script. Both options depend on a working installation of Narwhal. The <code>aint</code> keyword has been replaced by <code>isnt</code>, which goes together a little smoother with <code>is</code>. Quoted strings are now allowed as identifiers within object literals: eg. <code>{&quot;5+5&quot;: 10}</code>. All assignment operators now use a colon: <code>+:</code>, <code>-:</code>, <code>*:</code>, etc.</p>\n<div class=\"anchor\" id=\"0.1.2\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.1...0.1.2\">0.1.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-24\">December 24, 2009</time></span>\n</h2><p>Fixed a bug with calling <code>super()</code> through more than one level of inheritance, with the re-addition of the <code>extends</code> keyword. Added experimental <a href=\"http://narwhaljs.org/\">Narwhal</a> support (as a Tusk package), contributed by <a href=\"http://blog.tlrobinson.net/\">Tom Robinson</a>, including <strong>bin/cs</strong> as a CoffeeScript REPL and interpreter. New <code>--no-wrap</code> option to suppress the safety function wrapper.</p>\n<div class=\"anchor\" id=\"0.1.1\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.0...0.1.1\">0.1.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-24\">December 24, 2009</time></span>\n</h2><p>Added <code>instanceof</code> and <code>typeof</code> as operators.</p>\n<div class=\"anchor\" id=\"0.1.0\"></div>\n<h2 class=\"header\">\n  <a href=\"https://github.com/jashkenas/coffeescript/compare/8e9d637985d2dc9b44922076ad54ffef7fa8e9c2...0.1.0\">0.1.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-24\">December 24, 2009</time></span>\n</h2><p>Initial CoffeeScript release.</p>\n\n</div>\n\n\n<script type=\"text/coffeescript\">\nsourceFragment = \"try:\"\n\n# Set up the compilation function, to run when you stop typing.\ncompileSource = ->\n  source = $('#repl_source').val()\n  results = $('#repl_results')\n  window.compiledJS = ''\n  try\n    window.compiledJS = CoffeeScript.compile source, bare: on\n    el = results[0]\n    if el.innerText\n      el.innerText = window.compiledJS\n    else\n      results.text(window.compiledJS)\n    results.removeClass 'error'\n    $('.minibutton.run').removeClass 'error'\n  catch {location, message}\n    if location?\n      message = \"Error on line #{location.first_line + 1}: #{message}\"\n    results.text(message).addClass 'error'\n    $('.minibutton.run').addClass 'error'\n\n  # Update permalink\n  $('#repl_permalink').attr 'href', \"##{sourceFragment}#{encodeURIComponent source}\"\n\n# Listen for keypresses and recompile.\n$('#repl_source').keyup -> compileSource()\n\n# Use tab key to insert tabs\n$('#repl_source').keydown (e) ->\n  if e.keyCode is 9\n    e.preventDefault()\n    textbox = e.target\n    # Insert tab character at caret or in selection\n    textbox.value = textbox.value[0...textbox.selectionStart] + \"\\t\" + textbox.value[textbox.selectionEnd...]\n    # Put caret in correct position\n    textbox.selectionEnd = ++textbox.selectionStart\n\n# Eval the compiled js.\nevalJS = ->\n  try\n    eval window.compiledJS\n  catch error then alert error\n\n# Load the console with a string of CoffeeScript.\nwindow.loadConsole = (coffee) ->\n  $('#repl_source').val coffee\n  compileSource()\n  $('.navigation.try').addClass('active')\n  false\n\n# Helper to hide the menus.\ncloseMenus = ->\n  $('.navigation.active').removeClass 'active'\n\n$('.minibutton.run').click -> evalJS()\n\n# Bind navigation buttons to open the menus.\n$('.navigation').click (e) ->\n  return if e.target.tagName.toLowerCase() is 'a'\n  return false if $(e.target).closest('.repl_wrapper').length\n  if $(this).hasClass('active')\n    closeMenus()\n  else\n    closeMenus()\n    $(this).addClass 'active'\n  false\n\n$(document).on 'click', '[href=\"#try\"]', (e) ->\n  $('.navigation.try').addClass 'active'\n\n# Dismiss console if Escape pressed or click falls outside console\n# Trigger Run button on Ctrl-Enter\n$(document.body)\n  .keydown (e) ->\n    closeMenus() if e.which == 27\n    evalJS() if e.which == 13 and (e.metaKey or e.ctrlKey) and $('.minibutton.run:visible').length\n  .click (e) ->\n    return false if $(e.target).hasClass('minibutton')\n    closeMenus()\n\n$('#open_webchat').click ->\n  $(this).replaceWith $('<iframe src=\"http://webchat.freenode.net/?channels=coffeescript\" width=\"625\" height=\"400\"></iframe>')\n\n$(\"#repl_permalink\").click (e) ->\n    window.location = $(this).attr(\"href\")\n    false\n\n# If source code is included in location.hash, display it.\nhash = decodeURIComponent location.hash.replace(/^#/, '')\nif hash.indexOf(sourceFragment) == 0\n    src = hash.substr sourceFragment.length\n    loadConsole src\n\ncompileSource()\n\n</script>\n\n<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js\"></script>\n<script src=\"browser-compiler/coffee-script.js\"></script>\n\n</body>\n</html>\n"
  },
  {
    "path": "docs/v1/test.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n  <title>CoffeeScript Test Suite</title>\n  <script src=\"browser-compiler/coffee-script.js\"></script>\n  <script src=\"https://cdn.jsdelivr.net/underscorejs/1.8.3/underscore-min.js\"></script>\n  <style>\n    body, pre {\n      font-family: Consolas, Menlo, Monaco, monospace;\n    }\n    body {\n      margin: 1em;\n    }\n    h1 {\n      font-size: 1.3em;\n    }\n    div {\n      margin: 0.6em;\n    }\n    .good {\n      color: #22b24c\n    }\n    .bad {\n      color: #eb6864\n    }\n    .subtle {\n      font-size: 0.7em;\n      color: #999999\n    }\n  </style>\n</head>\n<body>\n\n<h1>CoffeeScript Test Suite</h1>\n\n<pre id=\"stdout\"></pre>\n\n<script type=\"text/coffeescript\">\n@testingBrowser = yes\n@global = window\nstdout  = document.getElementById 'stdout'\nstart   = new Date\nsuccess = total = done = failed = 0\n\nsay = (msg, className) ->\n  div = document.createElement 'div'\n  div.className = className if className?\n  div.appendChild document.createTextNode msg\n  stdout.appendChild div\n  msg\n\n@test = (description, fn) ->\n  ++total\n  try\n    fn.call(fn)\n    ++success\n  catch exception\n    say \"#{description}:\", 'bad'\n    say fn.toString(), 'subtle' if fn.toString?\n    say exception, 'bad'\n    console.error exception\n\n@ok = (good, msg = 'Error') ->\n  throw Error msg unless good\n\n# Polyfill Node assert's fail\n@fail = ->\n  ok no\n\n# Polyfill Node assert's deepEqual with Underscore's isEqual\n@deepEqual = (a, b) ->\n  ok _.isEqual(a, b), \"Expected #{JSON.stringify a} to deep equal #{JSON.stringify b}\"\n\n# See http://wiki.ecmascript.org/doku.php?id=harmony:egal\negal = (a, b) ->\n  if a is b\n    a isnt 0 or 1/a is 1/b\n  else\n    a isnt a and b isnt b\n\n# A recursive functional equivalence helper; uses egal for testing equivalence.\narrayEgal = (a, b) ->\n  if egal a, b then yes\n  else if a instanceof Array and b instanceof Array\n    return no unless a.length is b.length\n    return no for el, idx in a when not arrayEgal el, b[idx]\n    yes\n\n@eq      = (a, b, msg) -> ok egal(a, b), msg or \"Expected #{a} to equal #{b}\"\n@arrayEq = (a, b, msg) -> ok arrayEgal(a,b), msg or \"Expected #{a} to deep equal #{b}\"\n\n@toJS = (str) ->\n  CoffeeScript.compile str, bare: yes\n  .replace /^\\s+|\\s+$/g, '' # Trim leading/trailing whitespace\n\n\n@doesNotThrow = (fn) ->\n  fn()\n  ok yes\n\n@throws = (fun, err, msg) ->\n  try\n    fun()\n  catch e\n    if err\n      if typeof err is 'function' and e instanceof err # Handle comparing exceptions\n        ok yes\n      else if e.toString().indexOf('[stdin]') is 0 # Handle comparing error messages\n        ok err e\n      else\n        eq e, err\n    else\n      ok yes\n    return\n  ok no\n\n\n# Run the tests\nfor test in document.getElementsByClassName 'test'\n  say '\\u2714 ' + test.id\n  options = {}\n  options.literate = yes if test.type is 'text/x-literate-coffeescript'\n  CoffeeScript.run test.innerHTML, options\n\n# Finish up\nyay = success is total and not failed\nsec = (new Date - start) / 1000\nmsg = \"passed #{success} tests in #{ sec.toFixed 2 } seconds\"\nmsg = \"failed #{ total - success } tests and #{msg}\" unless yay\nsay msg, (if yay then 'good' else 'bad')\n</script>\n\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"arrays\">\n# Array Literals\n# --------------\n\n# * Array Literals\n# * Splats in Array Literals\n\n# TODO: add indexing and method invocation tests: [1][0] is 1, [].toString()\n\ntest \"trailing commas\", ->\n  trailingComma = [1, 2, 3,]\n  ok (trailingComma[0] is 1) and (trailingComma[2] is 3) and (trailingComma.length is 3)\n\n  trailingComma = [\n    1, 2, 3,\n    4, 5, 6\n    7, 8, 9,\n  ]\n  (sum = (sum or 0) + n) for n in trailingComma\n\n  a = [((x) -> x), ((x) -> x * x)]\n  ok a.length is 2\n\ntest \"incorrect indentation without commas\", ->\n  result = [['a']\n   {b: 'c'}]\n  ok result[0][0] is 'a'\n  ok result[1]['b'] is 'c'\n\n\n# Splats in Array Literals\n\ntest \"array splat expansions with assignments\", ->\n  nums = [1, 2, 3]\n  list = [a = 0, nums..., b = 4]\n  eq 0, a\n  eq 4, b\n  arrayEq [0,1,2,3,4], list\n\n\ntest \"mixed shorthand objects in array lists\", ->\n\n  arr = [\n    a:1\n    'b'\n    c:1\n  ]\n  ok arr.length is 3\n  ok arr[2].c is 1\n\n  arr = [b: 1, a: 2, 100]\n  eq arr[1], 100\n\n  arr = [a:0, b:1, (1 + 1)]\n  eq arr[1], 2\n\n  arr = [a:1, 'a', b:1, 'b']\n  eq arr.length, 4\n  eq arr[2].b, 1\n  eq arr[3], 'b'\n\n\ntest \"array splats with nested arrays\", ->\n  nonce = {}\n  a = [nonce]\n  list = [1, 2, a...]\n  eq list[0], 1\n  eq list[2], nonce\n\n  a = [[nonce]]\n  list = [1, 2, a...]\n  arrayEq list, [1, 2, [nonce]]\n\ntest \"#1274: `[] = a()` compiles to `false` instead of `a()`\", ->\n  a = false\n  fn = -> a = true\n  [] = fn()\n  ok a\n\ntest \"#3194: string interpolation in array\", ->\n  arr = [ \"a\"\n          key: 'value'\n        ]\n  eq 2, arr.length\n  eq 'a', arr[0]\n  eq 'value', arr[1].key\n\n  b = 'b'\n  arr = [ \"a#{b}\"\n          key: 'value'\n        ]\n  eq 2, arr.length\n  eq 'ab', arr[0]\n  eq 'value', arr[1].key\n\ntest \"regex interpolation in array\", ->\n  arr = [ /a/\n          key: 'value'\n        ]\n  eq 2, arr.length\n  eq 'a', arr[0].source\n  eq 'value', arr[1].key\n\n  b = 'b'\n  arr = [ ///a#{b}///\n          key: 'value'\n        ]\n  eq 2, arr.length\n  eq 'ab', arr[0].source\n  eq 'value', arr[1].key\n\n\ntest \"for-from loops over Array\", ->\n  array1 = [50, 30, 70, 20]\n  array2 = []\n  for x from array1\n    array2.push(x)\n  arrayEq array1, array2\n\n  array1 = [[20, 30], [40, 50]]\n  array2 = []\n  for [a, b] from array1\n    array2.push(b)\n    array2.push(a)\n  arrayEq array2, [30, 20, 50, 40]\n\n  array1 = [{a: 10, b: 20, c: 30}, {a: 40, b: 50, c: 60}]\n  array2 = []\n  for {a: a, b, c: d} from array1\n    array2.push([a, b, d])\n  arrayEq array2, [[10, 20, 30], [40, 50, 60]]\n\n  array1 = [[10, 20, 30, 40, 50]]\n  for [a, b..., c] from array1\n    eq 10, a\n    arrayEq [20, 30, 40], b\n    eq 50, c\n\ntest \"for-from comprehensions over Array\", ->\n  array1 = (x + 10 for x from [10, 20, 30])\n  ok array1.join(' ') is '20 30 40'\n\n  array2 = (x for x from [30, 41, 57] when x %% 3 is 0)\n  ok array2.join(' ') is '30 57'\n\n  array1 = (b + 5 for [a, b] from [[20, 30], [40, 50]])\n  ok array1.join(' ') is '35 55'\n\n  array2 = (a + b for [a, b] from [[10, 20], [30, 40], [50, 60]] when a + b >= 70)\n  ok array2.join(' ') is '70 110'\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"assignment\">\n# Assignment\n# ----------\n\n# * Assignment\n# * Compound Assignment\n# * Destructuring Assignment\n# * Context Property (@) Assignment\n# * Existential Assignment (?=)\n# * Assignment to variables similar to generated variables\n\ntest \"context property assignment (using @)\", ->\n  nonce = {}\n  addMethod = ->\n    @method = -> nonce\n    this\n  eq nonce, addMethod.call({}).method()\n\ntest \"unassignable values\", ->\n  nonce = {}\n  for nonref in ['', '\"\"', '0', 'f()'].concat CoffeeScript.RESERVED\n    eq nonce, (try CoffeeScript.compile \"#{nonref} = v\" catch e then nonce)\n\n# Compound Assignment\n\ntest \"boolean operators\", ->\n  nonce = {}\n\n  a  = 0\n  a or= nonce\n  eq nonce, a\n\n  b  = 1\n  b or= nonce\n  eq 1, b\n\n  c = 0\n  c and= nonce\n  eq 0, c\n\n  d = 1\n  d and= nonce\n  eq nonce, d\n\n  # ensure that RHS is treated as a group\n  e = f = false\n  e and= f or true\n  eq false, e\n\ntest \"compound assignment as a sub expression\", ->\n  [a, b, c] = [1, 2, 3]\n  eq 6, (a + b += c)\n  eq 1, a\n  eq 5, b\n  eq 3, c\n\n# *note: this test could still use refactoring*\ntest \"compound assignment should be careful about caching variables\", ->\n  count = 0\n  list = []\n\n  list[++count] or= 1\n  eq 1, list[1]\n  eq 1, count\n\n  list[++count] ?= 2\n  eq 2, list[2]\n  eq 2, count\n\n  list[count++] and= 6\n  eq 6, list[2]\n  eq 3, count\n\n  base = ->\n    ++count\n    base\n\n  base().four or= 4\n  eq 4, base.four\n  eq 4, count\n\n  base().five ?= 5\n  eq 5, base.five\n  eq 5, count\n\n  eq 5, base().five ?= 6\n  eq 6, count\n\ntest \"compound assignment with implicit objects\", ->\n  obj = undefined\n  obj ?=\n    one: 1\n\n  eq 1, obj.one\n\n  obj and=\n    two: 2\n\n  eq undefined, obj.one\n  eq         2, obj.two\n\ntest \"compound assignment (math operators)\", ->\n  num = 10\n  num -= 5\n  eq 5, num\n\n  num *= 10\n  eq 50, num\n\n  num /= 10\n  eq 5, num\n\n  num %= 3\n  eq 2, num\n\ntest \"more compound assignment\", ->\n  a = {}\n  val = undefined\n  val ||= a\n  val ||= true\n  eq a, val\n\n  b = {}\n  val &&= true\n  eq val, true\n  val &&= b\n  eq b, val\n\n  c = {}\n  val = null\n  val ?= c\n  val ?= true\n  eq c, val\n\ntest \"#1192: assignment starting with object literals\", ->\n  doesNotThrow (-> CoffeeScript.run \"{}.p = 0\")\n  doesNotThrow (-> CoffeeScript.run \"{}.p++\")\n  doesNotThrow (-> CoffeeScript.run \"{}[0] = 1\")\n  doesNotThrow (-> CoffeeScript.run \"\"\"{a: 1, 'b', \"#{1}\": 2}.p = 0\"\"\")\n  doesNotThrow (-> CoffeeScript.run \"{a:{0:{}}}.a[0] = 0\")\n\n\n# Destructuring Assignment\n\ntest \"empty destructuring assignment\", ->\n  {} = [] = undefined\n\ntest \"chained destructuring assignments\", ->\n  [a] = {0: b} = {'0': c} = [nonce={}]\n  eq nonce, a\n  eq nonce, b\n  eq nonce, c\n\ntest \"variable swapping to verify caching of RHS values when appropriate\", ->\n  a = nonceA = {}\n  b = nonceB = {}\n  c = nonceC = {}\n  [a, b, c] = [b, c, a]\n  eq nonceB, a\n  eq nonceC, b\n  eq nonceA, c\n  [a, b, c] = [b, c, a]\n  eq nonceC, a\n  eq nonceA, b\n  eq nonceB, c\n  fn = ->\n    [a, b, c] = [b, c, a]\n  arrayEq [nonceA,nonceB,nonceC], fn()\n  eq nonceA, a\n  eq nonceB, b\n  eq nonceC, c\n\ntest \"#713: destructuring assignment should return right-hand-side value\", ->\n  nonces = [nonceA={},nonceB={}]\n  eq nonces, [a, b] = [c, d] = nonces\n  eq nonceA, a\n  eq nonceA, c\n  eq nonceB, b\n  eq nonceB, d\n\ntest \"destructuring assignment with splats\", ->\n  a = {}; b = {}; c = {}; d = {}; e = {}\n  [x,y...,z] = [a,b,c,d,e]\n  eq a, x\n  arrayEq [b,c,d], y\n  eq e, z\n\ntest \"deep destructuring assignment with splats\", ->\n  a={}; b={}; c={}; d={}; e={}; f={}; g={}; h={}; i={}\n  [u, [v, w..., x], y..., z] = [a, [b, c, d, e], f, g, h, i]\n  eq a, u\n  eq b, v\n  arrayEq [c,d], w\n  eq e, x\n  arrayEq [f,g,h], y\n  eq i, z\n\ntest \"destructuring assignment with objects\", ->\n  a={}; b={}; c={}\n  obj = {a,b,c}\n  {a:x, b:y, c:z} = obj\n  eq a, x\n  eq b, y\n  eq c, z\n\ntest \"deep destructuring assignment with objects\", ->\n  a={}; b={}; c={}; d={}\n  obj = {\n    a\n    b: {\n      'c': {\n        d: [\n          b\n          {e: c, f: d}\n        ]\n      }\n    }\n  }\n  {a: w, 'b': {c: d: [x, {'f': z, e: y}]}} = obj\n  eq a, w\n  eq b, x\n  eq c, y\n  eq d, z\n\ntest \"destructuring assignment with objects and splats\", ->\n  a={}; b={}; c={}; d={}\n  obj = a: b: [a, b, c, d]\n  {a: b: [y, z...]} = obj\n  eq a, y\n  arrayEq [b,c,d], z\n\ntest \"destructuring assignment against an expression\", ->\n  a={}; b={}\n  [y, z] = if true then [a, b] else [b, a]\n  eq a, y\n  eq b, z\n\ntest \"bracket insertion when necessary\", ->\n  [a] = [0] ? [1]\n  eq a, 0\n\n# for implicit destructuring assignment in comprehensions, see the comprehension tests\n\ntest \"destructuring assignment with context (@) properties\", ->\n  a={}; b={}; c={}; d={}; e={}\n  obj =\n    fn: () ->\n      local = [a, {b, c}, d, e]\n      [@a, {b: @b, c: @c}, @d, @e] = local\n  eq undefined, obj[key] for key in ['a','b','c','d','e']\n  obj.fn()\n  eq a, obj.a\n  eq b, obj.b\n  eq c, obj.c\n  eq d, obj.d\n  eq e, obj.e\n\ntest \"#1024: destructure empty assignments to produce javascript-like results\", ->\n  eq 2 * [] = 3 + 5, 16\n\ntest \"#1005: invalid identifiers allowed on LHS of destructuring assignment\", ->\n  disallowed = ['eval', 'arguments'].concat CoffeeScript.RESERVED\n  throws (-> CoffeeScript.compile \"[#{disallowed.join ', '}] = x\"), null, 'all disallowed'\n  throws (-> CoffeeScript.compile \"[#{disallowed.join '..., '}...] = x\"), null, 'all disallowed as splats'\n  t = tSplat = null\n  for v in disallowed when v isnt 'class' # `class` by itself is an expression\n    throws (-> CoffeeScript.compile t), null, t = \"[#{v}] = x\"\n    throws (-> CoffeeScript.compile tSplat), null, tSplat = \"[#{v}...] = x\"\n  doesNotThrow ->\n    for v in disallowed\n      CoffeeScript.compile \"[a.#{v}] = x\"\n      CoffeeScript.compile \"[a.#{v}...] = x\"\n      CoffeeScript.compile \"[@#{v}] = x\"\n      CoffeeScript.compile \"[@#{v}...] = x\"\n\ntest \"#2055: destructuring assignment with `new`\", ->\n  {length} = new Array\n  eq 0, length\n\ntest \"#156: destructuring with expansion\", ->\n  array = [1..5]\n  [first, ..., last] = array\n  eq 1, first\n  eq 5, last\n  [..., lastButOne, last] = array\n  eq 4, lastButOne\n  eq 5, last\n  [first, second, ..., last] = array\n  eq 2, second\n  [..., last] = 'strings as well -> x'\n  eq 'x', last\n  throws (-> CoffeeScript.compile \"[1, ..., 3]\"),        null, \"prohibit expansion outside of assignment\"\n  throws (-> CoffeeScript.compile \"[..., a, b...] = c\"), null, \"prohibit expansion and a splat\"\n  throws (-> CoffeeScript.compile \"[...] = c\"),          null, \"prohibit lone expansion\"\n\ntest \"destructuring with dynamic keys\", ->\n  {\"#{'a'}\": a, \"\"\"#{'b'}\"\"\": b, c} = {a: 1, b: 2, c: 3}\n  eq 1, a\n  eq 2, b\n  eq 3, c\n  throws -> CoffeeScript.compile '{\"#{a}\"} = b'\n\ntest \"simple array destructuring defaults\", ->\n  [a = 1] = []\n  eq 1, a\n  [a = 2] = [undefined]\n  eq 2, a\n  [a = 3] = [null]\n  eq 3, a\n  [a = 4] = [0]\n  eq 0, a\n  arr = [a = 5]\n  eq 5, a\n  arrayEq [5], arr\n\ntest \"simple object destructuring defaults\", ->\n  {b = 1} = {}\n  eq b, 1\n  {b = 2} = {b: undefined}\n  eq b, 2\n  {b = 3} = {b: null}\n  eq b, 3\n  {b = 4} = {b: 0}\n  eq b, 0\n\n  {b: c = 1} = {}\n  eq c, 1\n  {b: c = 2} = {b: undefined}\n  eq c, 2\n  {b: c = 3} = {b: null}\n  eq c, 3\n  {b: c = 4} = {b: 0}\n  eq c, 0\n\ntest \"multiple array destructuring defaults\", ->\n  [a = 1, b = 2, c] = [null, 12, 13]\n  eq a, 1\n  eq b, 12\n  eq c, 13\n  [a, b = 2, c = 3] = [null, 12, 13]\n  eq a, null\n  eq b, 12\n  eq c, 13\n  [a = 1, b, c = 3] = [11, 12]\n  eq a, 11\n  eq b, 12\n  eq c, 3\n\ntest \"multiple object destructuring defaults\", ->\n  {a = 1, b: bb = 2, 'c': c = 3, \"#{0}\": d = 4} = {\"#{'b'}\": 12}\n  eq a, 1\n  eq bb, 12\n  eq c, 3\n  eq d, 4\n\ntest \"array destructuring defaults with splats\", ->\n  [..., a = 9] = []\n  eq a, 9\n  [..., b = 9] = [19]\n  eq b, 19\n\ntest \"deep destructuring assignment with defaults\", ->\n  [a, [{b = 1, c = 3}] = [c: 2]] = [0]\n  eq a, 0\n  eq b, 1\n  eq c, 2\n\ntest \"destructuring assignment with context (@) properties and defaults\", ->\n  a={}; b={}; c={}; d={}; e={}\n  obj =\n    fn: () ->\n      local = [a, {b, c: null}, d]\n      [@a, {b: @b = b, @c = c}, @d, @e = e] = local\n  eq undefined, obj[key] for key in ['a','b','c','d','e']\n  obj.fn()\n  eq a, obj.a\n  eq b, obj.b\n  eq c, obj.c\n  eq d, obj.d\n  eq e, obj.e\n\ntest \"destructuring assignment with defaults single evaluation\", ->\n  callCount = 0\n  fn = -> callCount++\n  [a = fn()] = []\n  eq 0, a\n  eq 1, callCount\n  [a = fn()] = [10]\n  eq 10, a\n  eq 1, callCount\n  {a = fn(), b: c = fn()} = {a: 20, b: null}\n  eq 20, a\n  eq c, 1\n  eq callCount, 2\n\n\n# Existential Assignment\n\ntest \"existential assignment\", ->\n  nonce = {}\n  a = false\n  a ?= nonce\n  eq false, a\n  b = undefined\n  b ?= nonce\n  eq nonce, b\n  c = null\n  c ?= nonce\n  eq nonce, c\n\ntest \"#1627: prohibit conditional assignment of undefined variables\", ->\n  throws (-> CoffeeScript.compile \"x ?= 10\"),        null, \"prohibit (x ?= 10)\"\n  throws (-> CoffeeScript.compile \"x ||= 10\"),       null, \"prohibit (x ||= 10)\"\n  throws (-> CoffeeScript.compile \"x or= 10\"),       null, \"prohibit (x or= 10)\"\n  throws (-> CoffeeScript.compile \"do -> x ?= 10\"),  null, \"prohibit (do -> x ?= 10)\"\n  throws (-> CoffeeScript.compile \"do -> x ||= 10\"), null, \"prohibit (do -> x ||= 10)\"\n  throws (-> CoffeeScript.compile \"do -> x or= 10\"), null, \"prohibit (do -> x or= 10)\"\n  doesNotThrow (-> CoffeeScript.compile \"x = null; x ?= 10\"),        \"allow (x = null; x ?= 10)\"\n  doesNotThrow (-> CoffeeScript.compile \"x = null; x ||= 10\"),       \"allow (x = null; x ||= 10)\"\n  doesNotThrow (-> CoffeeScript.compile \"x = null; x or= 10\"),       \"allow (x = null; x or= 10)\"\n  doesNotThrow (-> CoffeeScript.compile \"x = null; do -> x ?= 10\"),  \"allow (x = null; do -> x ?= 10)\"\n  doesNotThrow (-> CoffeeScript.compile \"x = null; do -> x ||= 10\"), \"allow (x = null; do -> x ||= 10)\"\n  doesNotThrow (-> CoffeeScript.compile \"x = null; do -> x or= 10\"), \"allow (x = null; do -> x or= 10)\"\n\n  throws (-> CoffeeScript.compile \"-> -> -> x ?= 10\"), null, \"prohibit (-> -> -> x ?= 10)\"\n  doesNotThrow (-> CoffeeScript.compile \"x = null; -> -> -> x ?= 10\"), \"allow (x = null; -> -> -> x ?= 10)\"\n\ntest \"more existential assignment\", ->\n  global.temp ?= 0\n  eq global.temp, 0\n  global.temp or= 100\n  eq global.temp, 100\n  delete global.temp\n\ntest \"#1348, #1216: existential assignment compilation\", ->\n  nonce = {}\n  a = nonce\n  b = (a ?= 0)\n  eq nonce, b\n  #the first ?= compiles into a statement; the second ?= compiles to a ternary expression\n  eq a ?= b ?= 1, nonce\n\n  if a then a ?= 2 else a = 3\n  eq a, nonce\n\ntest \"#1591, #1101: splatted expressions in destructuring assignment must be assignable\", ->\n  nonce = {}\n  for nonref in ['', '\"\"', '0', 'f()', '(->)'].concat CoffeeScript.RESERVED\n    eq nonce, (try CoffeeScript.compile \"[#{nonref}...] = v\" catch e then nonce)\n\ntest \"#1643: splatted accesses in destructuring assignments should not be declared as variables\", ->\n  nonce = {}\n  accesses = ['o.a', 'o[\"a\"]', '(o.a)', '(o.a).a', '@o.a', 'C::a', 'C::', 'f().a', 'o?.a', 'o?.a.b', 'f?().a']\n  for access in accesses\n    for i,j in [1,2,3] #position can matter\n      code =\n        \"\"\"\n        nonce = {}; nonce2 = {}; nonce3 = {};\n        @o = o = new (class C then a:{}); f = -> o\n        [#{new Array(i).join('x,')}#{access}...] = [#{new Array(i).join('0,')}nonce, nonce2, nonce3]\n        unless #{access}[0] is nonce and #{access}[1] is nonce2 and #{access}[2] is nonce3 then throw new Error('[...]')\n        \"\"\"\n      eq nonce, unless (try CoffeeScript.run code, bare: true catch e then true) then nonce\n  # subpatterns like `[[a]...]` and `[{a}...]`\n  subpatterns = ['[sub, sub2, sub3]', '{0: sub, 1: sub2, 2: sub3}']\n  for subpattern in subpatterns\n    for i,j in [1,2,3]\n      code =\n        \"\"\"\n        nonce = {}; nonce2 = {}; nonce3 = {};\n        [#{new Array(i).join('x,')}#{subpattern}...] = [#{new Array(i).join('0,')}nonce, nonce2, nonce3]\n        unless sub is nonce and sub2 is nonce2 and sub3 is nonce3 then throw new Error('[sub...]')\n        \"\"\"\n      eq nonce, unless (try CoffeeScript.run code, bare: true catch e then true) then nonce\n\ntest \"#1838: Regression with variable assignment\", ->\n  name =\n  'dave'\n\n  eq name, 'dave'\n\ntest '#2211: splats in destructured parameters', ->\n  doesNotThrow -> CoffeeScript.compile '([a...]) ->'\n  doesNotThrow -> CoffeeScript.compile '([a...],b) ->'\n  doesNotThrow -> CoffeeScript.compile '([a...],[b...]) ->'\n  throws -> CoffeeScript.compile '([a...,[a...]]) ->'\n  doesNotThrow -> CoffeeScript.compile '([a...,[b...]]) ->'\n\ntest '#2213: invocations within destructured parameters', ->\n  throws -> CoffeeScript.compile '([a()])->'\n  throws -> CoffeeScript.compile '([a:b()])->'\n  throws -> CoffeeScript.compile '([a:b.c()])->'\n  throws -> CoffeeScript.compile '({a()})->'\n  throws -> CoffeeScript.compile '({a:b()})->'\n  throws -> CoffeeScript.compile '({a:b.c()})->'\n\ntest '#2532: compound assignment with terminator', ->\n  doesNotThrow -> CoffeeScript.compile \"\"\"\n  a = \"hello\"\n  a +=\n  \"\n  world\n  !\n  \"\n  \"\"\"\n\ntest \"#2613: parens on LHS of destructuring\", ->\n  a = {}\n  [(a).b] = [1, 2, 3]\n  eq a.b, 1\n\ntest \"#2181: conditional assignment as a subexpression\", ->\n  a = false\n  false && a or= true\n  eq false, a\n  eq false, not a or= true\n\ntest \"#1500: Assignment to variables similar to generated variables\", ->\n  len = 0\n  x = ((results = null; n) for n in [1, 2, 3])\n  arrayEq [1, 2, 3], x\n  eq 0, len\n\n  for x in [1, 2, 3]\n    f = ->\n      i = 0\n    f()\n    eq 'undefined', typeof i\n\n  ref = 2\n  x = ref * 2 ? 1\n  eq x, 4\n  eq 'undefined', typeof ref1\n\n  x = {}\n  base = -> x\n  name = -1\n  base()[-name] ?= 2\n  eq x[1], 2\n  eq base(), x\n  eq name, -1\n\n  f = (@a, a) -> [@a, a]\n  arrayEq [1, 2], f.call scope = {}, 1, 2\n  eq 1, scope.a\n\n  try throw 'foo'\n  catch error\n    eq error, 'foo'\n\n  eq error, 'foo'\n\n  doesNotThrow -> CoffeeScript.compile '(@slice...) ->'\n\ntest \"Assignment to variables similar to helper functions\", ->\n  f = (slice...) -> slice\n  arrayEq [1, 2, 3], f 1, 2, 3\n  eq 'undefined', typeof slice1\n\n  class A\n  class B extends A\n    extend = 3\n    hasProp = 4\n    value: 5\n    method: (bind, bind1) => [bind, bind1, extend, hasProp, @value]\n  {method} = new B\n  arrayEq [1, 2, 3, 4, 5], method 1, 2\n\n  modulo = -1 %% 3\n  eq 2, modulo\n\n  indexOf = [1, 2, 3]\n  ok 2 in indexOf\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"booleans\">\n# Boolean Literals\n# ----------------\n\n# TODO: add method invocation tests: true.toString() is \"true\"\n\ntest \"#764 Booleans should be indexable\", ->\n  toString = Boolean::toString\n\n  eq toString, true['toString']\n  eq toString, false['toString']\n  eq toString, yes['toString']\n  eq toString, no['toString']\n  eq toString, on['toString']\n  eq toString, off['toString']\n\n  eq toString, true.toString\n  eq toString, false.toString\n  eq toString, yes.toString\n  eq toString, no.toString\n  eq toString, on.toString\n  eq toString, off.toString\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"classes\">\n# Classes\n# -------\n\n# * Class Definition\n# * Class Instantiation\n# * Inheritance and Super\n\ntest \"classes with a four-level inheritance chain\", ->\n\n  class Base\n    func: (string) ->\n      \"zero/#{string}\"\n\n    @static: (string) ->\n      \"static/#{string}\"\n\n  class FirstChild extends Base\n    func: (string) ->\n      super('one/') + string\n\n  SecondChild = class extends FirstChild\n    func: (string) ->\n      super('two/') + string\n\n  thirdCtor = ->\n    @array = [1, 2, 3]\n\n  class ThirdChild extends SecondChild\n    constructor: -> thirdCtor.call this\n\n    # Gratuitous comment for testing.\n    func: (string) ->\n      super('three/') + string\n\n  result = (new ThirdChild).func 'four'\n\n  ok result is 'zero/one/two/three/four'\n  ok Base.static('word') is 'static/word'\n\n  FirstChild::func = (string) ->\n    super('one/').length + string\n\n  result = (new ThirdChild).func 'four'\n\n  ok result is '9two/three/four'\n\n  ok (new ThirdChild).array.join(' ') is '1 2 3'\n\n\ntest \"constructors with inheritance and super\", ->\n\n  identity = (f) -> f\n\n  class TopClass\n    constructor: (arg) ->\n      @prop = 'top-' + arg\n\n  class SuperClass extends TopClass\n    constructor: (arg) ->\n      identity super 'super-' + arg\n\n  class SubClass extends SuperClass\n    constructor: ->\n      identity super 'sub'\n\n  ok (new SubClass).prop is 'top-super-sub'\n\n\ntest \"Overriding the static property new doesn't clobber Function::new\", ->\n\n  class OneClass\n    @new: 'new'\n    function: 'function'\n    constructor: (name) -> @name = name\n\n  class TwoClass extends OneClass\n  delete TwoClass.new\n\n  Function.prototype.new = -> new this arguments...\n\n  ok (TwoClass.new('three')).name is 'three'\n  ok (new OneClass).function is 'function'\n  ok OneClass.new is 'new'\n\n  delete Function.prototype.new\n\n\ntest \"basic classes, again, but in the manual prototype style\", ->\n\n  Base = ->\n  Base::func = (string) ->\n    'zero/' + string\n  Base::['func-func'] = (string) ->\n    \"dynamic-#{string}\"\n\n  FirstChild = ->\n  SecondChild = ->\n  ThirdChild = ->\n    @array = [1, 2, 3]\n    this\n\n  ThirdChild extends SecondChild extends FirstChild extends Base\n\n  FirstChild::func = (string) ->\n    super('one/') + string\n\n  SecondChild::func = (string) ->\n    super('two/') + string\n\n  ThirdChild::func = (string) ->\n    super('three/') + string\n\n  result = (new ThirdChild).func 'four'\n\n  ok result is 'zero/one/two/three/four'\n\n  ok (new ThirdChild)['func-func']('thing') is 'dynamic-thing'\n\n\ntest \"super with plain ol' prototypes\", ->\n\n  TopClass = ->\n  TopClass::func = (arg) ->\n    'top-' + arg\n\n  SuperClass = ->\n  SuperClass extends TopClass\n  SuperClass::func = (arg) ->\n    super 'super-' + arg\n\n  SubClass = ->\n  SubClass extends SuperClass\n  SubClass::func = ->\n    super 'sub'\n\n  eq (new SubClass).func(), 'top-super-sub'\n\n\ntest \"'@' referring to the current instance, and not being coerced into a call\", ->\n\n  class ClassName\n    amI: ->\n      @ instanceof ClassName\n\n  obj = new ClassName\n  ok obj.amI()\n\n\ntest \"super() calls in constructors of classes that are defined as object properties\", ->\n\n  class Hive\n    constructor: (name) -> @name = name\n\n  class Hive.Bee extends Hive\n    constructor: (name) -> super\n\n  maya = new Hive.Bee 'Maya'\n  ok maya.name is 'Maya'\n\n\ntest \"classes with JS-keyword properties\", ->\n\n  class Class\n    class: 'class'\n    name: -> @class\n\n  instance = new Class\n  ok instance.class is 'class'\n  ok instance.name() is 'class'\n\n\ntest \"Classes with methods that are pre-bound to the instance, or statically, to the class\", ->\n\n  class Dog\n    constructor: (name) ->\n      @name = name\n\n    bark: =>\n      \"#{@name} woofs!\"\n\n    @static = =>\n      new this('Dog')\n\n  spark = new Dog('Spark')\n  fido  = new Dog('Fido')\n  fido.bark = spark.bark\n\n  ok fido.bark() is 'Spark woofs!'\n\n  obj = func: Dog.static\n\n  ok obj.func().name is 'Dog'\n\n\ntest \"a bound function in a bound function\", ->\n\n  class Mini\n    num: 10\n    generate: =>\n      for i in [1..3]\n        =>\n          @num\n\n  m = new Mini\n  eq (func() for func in m.generate()).join(' '), '10 10 10'\n\n\ntest \"contructor called with varargs\", ->\n\n  class Connection\n    constructor: (one, two, three) ->\n      [@one, @two, @three] = [one, two, three]\n\n    out: ->\n      \"#{@one}-#{@two}-#{@three}\"\n\n  list = [3, 2, 1]\n  conn = new Connection list...\n  ok conn instanceof Connection\n  ok conn.out() is '3-2-1'\n\n\ntest \"calling super and passing along all arguments\", ->\n\n  class Parent\n    method: (args...) -> @args = args\n\n  class Child extends Parent\n    method: -> super\n\n  c = new Child\n  c.method 1, 2, 3, 4\n  ok c.args.join(' ') is '1 2 3 4'\n\n\ntest \"classes wrapped in decorators\", ->\n\n  func = (klass) ->\n    klass::prop = 'value'\n    klass\n\n  func class Test\n    prop2: 'value2'\n\n  ok (new Test).prop  is 'value'\n  ok (new Test).prop2 is 'value2'\n\n\ntest \"anonymous classes\", ->\n\n  obj =\n    klass: class\n      method: -> 'value'\n\n  instance = new obj.klass\n  ok instance.method() is 'value'\n\n\ntest \"Implicit objects as static properties\", ->\n\n  class Static\n    @static =\n      one: 1\n      two: 2\n\n  ok Static.static.one is 1\n  ok Static.static.two is 2\n\n\ntest \"nothing classes\", ->\n\n  c = class\n  ok c instanceof Function\n\n\ntest \"classes with static-level implicit objects\", ->\n\n  class A\n    @static = one: 1\n    two: 2\n\n  class B\n    @static = one: 1,\n    two: 2\n\n  eq A.static.one, 1\n  eq A.static.two, undefined\n  eq (new A).two, 2\n\n  eq B.static.one, 1\n  eq B.static.two, 2\n  eq (new B).two, undefined\n\n\ntest \"classes with value'd constructors\", ->\n\n  counter = 0\n  classMaker = ->\n    inner = ++counter\n    ->\n      @value = inner\n\n  class One\n    constructor: classMaker()\n\n  class Two\n    constructor: classMaker()\n\n  eq (new One).value, 1\n  eq (new Two).value, 2\n  eq (new One).value, 1\n  eq (new Two).value, 2\n\n\ntest \"executable class bodies\", ->\n\n  class A\n    if true\n      b: 'b'\n    else\n      c: 'c'\n\n  a = new A\n\n  eq a.b, 'b'\n  eq a.c, undefined\n\n\ntest \"#2502: parenthesizing inner object values\", ->\n\n  class A\n    category:  (type: 'string')\n    sections:  (type: 'number', default: 0)\n\n  eq (new A).category.type, 'string'\n\n  eq (new A).sections.default, 0\n\n\ntest \"conditional prototype property assignment\", ->\n  debug = false\n\n  class Person\n    if debug\n      age: -> 10\n    else\n      age: -> 20\n\n  eq (new Person).age(), 20\n\n\ntest \"mild metaprogramming\", ->\n\n  class Base\n    @attr: (name) ->\n      @::[name] = (val) ->\n        if arguments.length > 0\n          @[\"_#{name}\"] = val\n        else\n          @[\"_#{name}\"]\n\n  class Robot extends Base\n    @attr 'power'\n    @attr 'speed'\n\n  robby = new Robot\n\n  ok robby.power() is undefined\n\n  robby.power 11\n  robby.speed Infinity\n\n  eq robby.power(), 11\n  eq robby.speed(), Infinity\n\n\ntest \"namespaced classes do not reserve their function name in outside scope\", ->\n\n  one = {}\n  two = {}\n\n  class one.Klass\n    @label = \"one\"\n\n  class two.Klass\n    @label = \"two\"\n\n  eq typeof Klass, 'undefined'\n  eq one.Klass.label, 'one'\n  eq two.Klass.label, 'two'\n\n\ntest \"nested classes\", ->\n\n  class Outer\n    constructor: ->\n      @label = 'outer'\n\n    class @Inner\n      constructor: ->\n        @label = 'inner'\n\n  eq (new Outer).label, 'outer'\n  eq (new Outer.Inner).label, 'inner'\n\n\ntest \"variables in constructor bodies are correctly scoped\", ->\n\n  class A\n    x = 1\n    constructor: ->\n      x = 10\n      y = 20\n    y = 2\n    captured: ->\n      {x, y}\n\n  a = new A\n  eq a.captured().x, 10\n  eq a.captured().y, 2\n\n\ntest \"Issue #924: Static methods in nested classes\", ->\n\n  class A\n    @B: class\n      @c = -> 5\n\n  eq A.B.c(), 5\n\n\ntest \"`class extends this`\", ->\n\n  class A\n    func: -> 'A'\n\n  B = null\n  makeClass = ->\n    B = class extends this\n      func: -> super + ' B'\n\n  makeClass.call A\n\n  eq (new B()).func(), 'A B'\n\n\ntest \"ensure that constructors invoked with splats return a new object\", ->\n\n  args = [1, 2, 3]\n  Type = (@args) ->\n  type = new Type args\n\n  ok type and type instanceof Type\n  ok type.args and type.args instanceof Array\n  ok v is args[i] for v, i in type.args\n\n  Type1 = (@a, @b, @c) ->\n  type1 = new Type1 args...\n\n  ok type1 instanceof   Type1\n  eq type1.constructor, Type1\n  ok type1.a is args[0] and type1.b is args[1] and type1.c is args[2]\n\n  # Ensure that constructors invoked with splats cache the function.\n  called = 0\n  get = -> if called++ then false else class Type\n  new get() args...\n\ntest \"`new` shouldn't add extra parens\", ->\n\n  ok new Date().constructor is Date\n\n\ntest \"`new` works against bare function\", ->\n\n  eq Date, new ->\n    eq this, new => this\n    Date\n\n\ntest \"#1182: a subclass should be able to set its constructor to an external function\", ->\n  ctor = ->\n    @val = 1\n  class A\n  class B extends A\n    constructor: ctor\n  eq (new B).val, 1\n\ntest \"#1182: external constructors continued\", ->\n  ctor = ->\n  class A\n  class B extends A\n    method: ->\n    constructor: ctor\n  ok B::method\n\ntest \"#1313: misplaced __extends\", ->\n  nonce = {}\n  class A\n  class B extends A\n    prop: nonce\n    constructor: ->\n  eq nonce, B::prop\n\ntest \"#1182: execution order needs to be considered as well\", ->\n  counter = 0\n  makeFn = (n) -> eq n, ++counter; ->\n  class B extends (makeFn 1)\n    @B: makeFn 2\n    constructor: makeFn 3\n\ntest \"#1182: external constructors with bound functions\", ->\n  fn = ->\n    {one: 1}\n    this\n  class B\n  class A\n    constructor: fn\n    method: => this instanceof A\n  ok (new A).method.call(new B)\n\ntest \"#1372: bound class methods with reserved names\", ->\n  class C\n    delete: =>\n  ok C::delete\n\ntest \"#1380: `super` with reserved names\", ->\n  class C\n    do: -> super\n  ok C::do\n\n  class B\n    0: -> super\n  ok B::[0]\n\ntest \"#1464: bound class methods should keep context\", ->\n  nonce  = {}\n  nonce2 = {}\n  class C\n    constructor: (@id) ->\n    @boundStaticColon: => new this(nonce)\n    @boundStaticEqual= => new this(nonce2)\n  eq nonce,  C.boundStaticColon().id\n  eq nonce2, C.boundStaticEqual().id\n\ntest \"#1009: classes with reserved words as determined names\", -> (->\n  eq 'function', typeof (class @for)\n  ok not /\\beval\\b/.test (class @eval).toString()\n  ok not /\\barguments\\b/.test (class @arguments).toString()\n).call {}\n\ntest \"#1482: classes can extend expressions\", ->\n  id = (x) -> x\n  nonce = {}\n  class A then nonce: nonce\n  class B extends id A\n  eq nonce, (new B).nonce\n\ntest \"#1598: super works for static methods too\", ->\n\n  class Parent\n    method: ->\n      'NO'\n    @method: ->\n      'yes'\n\n  class Child extends Parent\n    @method: ->\n      'pass? ' + super\n\n  eq Child.method(), 'pass? yes'\n\ntest \"#1842: Regression with bound functions within bound class methods\", ->\n\n  class Store\n    @bound: =>\n      do =>\n        eq this, Store\n\n  Store.bound()\n\n  # And a fancier case:\n\n  class Store\n\n    eq this, Store\n\n    @bound: =>\n      do =>\n        eq this, Store\n\n    @unbound: ->\n      eq this, Store\n\n    instance: =>\n      ok this instanceof Store\n\n  Store.bound()\n  Store.unbound()\n  (new Store).instance()\n\ntest \"#1876: Class @A extends A\", ->\n  class A\n  class @A extends A\n\n  ok (new @A) instanceof A\n\ntest \"#1813: Passing class definitions as expressions\", ->\n  ident = (x) -> x\n\n  result = ident class A then x = 1\n\n  eq result, A\n\n  result = ident class B extends A\n    x = 1\n\n  eq result, B\n\ntest \"#1966: external constructors should produce their return value\", ->\n  ctor = -> {}\n  class A then constructor: ctor\n  ok (new A) not instanceof A\n\ntest \"#1980: regression with an inherited class with static function members\", ->\n\n  class A\n\n  class B extends A\n    @static: => 'value'\n\n  eq B.static(), 'value'\n\ntest \"#1534: class then 'use strict'\", ->\n  # [14.1 Directive Prologues and the Use Strict Directive](http://es5.github.com/#x14.1)\n  nonce = {}\n  error = 'do -> ok this'\n  strictTest = \"do ->'use strict';#{error}\"\n  return unless (try CoffeeScript.run strictTest, bare: yes catch e then nonce) is nonce\n\n  throws -> CoffeeScript.run \"class then 'use strict';#{error}\", bare: yes\n  doesNotThrow -> CoffeeScript.run \"class then #{error}\", bare: yes\n  doesNotThrow -> CoffeeScript.run \"class then #{error};'use strict'\", bare: yes\n\n  # comments are ignored in the Directive Prologue\n  comments = [\"\"\"\n  class\n    ### comment ###\n    'use strict'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    ### comment 1 ###\n    ### comment 2 ###\n    'use strict'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    ### comment 1 ###\n    ### comment 2 ###\n    'use strict'\n    #{error}\n    ### comment 3 ###\"\"\"\n  ]\n  throws (-> CoffeeScript.run comment, bare: yes) for comment in comments\n\n  # [ES5 §14.1](http://es5.github.com/#x14.1) allows for other directives\n  directives = [\"\"\"\n  class\n    'directive 1'\n    'use strict'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    'use strict'\n    'directive 2'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    ### comment 1 ###\n    'directive 1'\n    'use strict'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    ### comment 1 ###\n    'directive 1'\n    ### comment 2 ###\n    'use strict'\n    #{error}\"\"\"\n  ]\n  throws (-> CoffeeScript.run directive, bare: yes) for directive in directives\n\ntest \"#2052: classes should work in strict mode\", ->\n  try\n    do ->\n      'use strict'\n      class A\n  catch e\n    ok no\n\ntest \"directives in class with extends \", ->\n  strictTest = \"\"\"\n    class extends Object\n      ### comment ###\n      'use strict'\n      do -> eq this, undefined\n  \"\"\"\n  CoffeeScript.run strictTest, bare: yes\n\ntest \"#2630: class bodies can't reference arguments\", ->\n  throws ->\n    CoffeeScript.compile('class Test then arguments')\n\n  # #4320: Don't be too eager when checking, though.\n  class Test\n    arguments: 5\n  eq 5, Test::arguments\n\ntest \"#2319: fn class n extends o.p [INDENT] x = 123\", ->\n  first = ->\n\n  base = onebase: ->\n\n  first class OneKeeper extends base.onebase\n    one = 1\n    one: -> one\n\n  eq new OneKeeper().one(), 1\n\n\ntest \"#2599: other typed constructors should be inherited\", ->\n  class Base\n    constructor: -> return {}\n\n  class Derived extends Base\n\n  ok (new Derived) not instanceof Derived\n  ok (new Derived) not instanceof Base\n  ok (new Base) not instanceof Base\n\ntest \"#2359: extending native objects that use other typed constructors requires defining a constructor\", ->\n  class BrokenArray extends Array\n    method: -> 'no one will call me'\n\n  brokenArray = new BrokenArray\n  ok brokenArray not instanceof BrokenArray\n  ok typeof brokenArray.method is 'undefined'\n\n  class WorkingArray extends Array\n    constructor: -> super\n    method: -> 'yes!'\n\n  workingArray = new WorkingArray\n  ok workingArray instanceof WorkingArray\n  eq 'yes!', workingArray.method()\n\n\ntest \"#2782: non-alphanumeric-named bound functions\", ->\n  class A\n    'b:c': =>\n      'd'\n\n  eq (new A)['b:c'](), 'd'\n\n\ntest \"#2781: overriding bound functions\", ->\n  class A\n    a: ->\n        @b()\n    b: =>\n        1\n\n  class B extends A\n    b: =>\n        2\n\n  b = (new A).b\n  eq b(), 1\n\n  b = (new B).b\n  eq b(), 2\n\n\ntest \"#2791: bound function with destructured argument\", ->\n  class Foo\n    method: ({a}) => 'Bar'\n\n  eq (new Foo).method({a: 'Bar'}), 'Bar'\n\n\ntest \"#2796: ditto, ditto, ditto\", ->\n  answer = null\n\n  outsideMethod = (func) ->\n    func.call message: 'wrong!'\n\n  class Base\n    constructor: ->\n      @message = 'right!'\n      outsideMethod @echo\n\n    echo: =>\n      answer = @message\n\n  new Base\n  eq answer, 'right!'\n\ntest \"#3063: Class bodies cannot contain pure statements\", ->\n  throws -> CoffeeScript.compile \"\"\"\n    class extends S\n      return if S.f\n      @f: => this\n  \"\"\"\n\ntest \"#2949: super in static method with reserved name\", ->\n  class Foo\n    @static: -> 'baz'\n\n  class Bar extends Foo\n    @static: -> super\n\n  eq Bar.static(), 'baz'\n\ntest \"#3232: super in static methods (not object-assigned)\", ->\n  class Foo\n    @baz = -> true\n    @qux = -> true\n\n  class Bar extends Foo\n    @baz = -> super\n    Bar.qux = -> super\n\n  ok Bar.baz()\n  ok Bar.qux()\n\ntest \"#1392 calling `super` in methods defined on namespaced classes\", ->\n  class Base\n    m: -> 5\n    n: -> 4\n  namespace =\n    A: ->\n    B: ->\n  namespace.A extends Base\n\n  namespace.A::m = -> super\n  eq 5, (new namespace.A).m()\n  namespace.B::m = namespace.A::m\n  namespace.A::m = null\n  eq 5, (new namespace.B).m()\n\n  count = 0\n  getNamespace = -> count++; namespace\n  getNamespace().A::n = -> super\n  eq 4, (new namespace.A).n()\n  eq 1, count\n\n  class C\n    @a: ->\n    @a extends Base\n    @a::m = -> super\n  eq 5, (new C.a).m()\n\ntest \"dynamic method names and super\", ->\n  class Base\n    @m: -> 6\n    m: -> 5\n    m2: -> 4.5\n    n: -> 4\n  A = ->\n  A extends Base\n\n  m = 'm'\n  A::[m] = -> super\n  m = 'n'\n  eq 5, (new A).m()\n\n  name = -> count++; 'n'\n\n  count = 0\n  A::[name()] = -> super\n  eq 4, (new A).n()\n  eq 1, count\n\n  m = 'm'\n  m2 = 'm2'\n  count = 0\n  class B extends Base\n    @[name()] = -> super\n    @::[m] = -> super\n    \"#{m2}\": -> super\n  b = new B\n  m = m2 = 'n'\n  eq 6, B.m()\n  eq 5, b.m()\n  eq 4.5, b.m2()\n  eq 1, count\n\n  class C extends B\n    m: -> super\n  eq 5, (new C).m()\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"cluster\">\n# Cluster Module\n# ---------\n\nreturn if testingBrowser?\n\ncluster = require 'cluster'\n\nif cluster.isMaster\n  test \"#2737 - cluster module can spawn workers from a coffeescript process\", ->\n    cluster.once 'exit', (worker, code) ->\n      eq code, 0\n\n    cluster.fork()\nelse\n  process.exit 0\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"comments\">\n# Comments\n# --------\n\n# * Single-Line Comments\n# * Block Comments\n\n# Note: awkward spacing seen in some tests is likely intentional.\n\ntest \"comments in objects\", ->\n  obj1 = {\n  # comment\n    # comment\n      # comment\n    one: 1\n  # comment\n    two: 2\n      # comment\n  }\n\n  ok Object::hasOwnProperty.call(obj1,'one')\n  eq obj1.one, 1\n  ok Object::hasOwnProperty.call(obj1,'two')\n  eq obj1.two, 2\n\ntest \"comments in YAML-style objects\", ->\n  obj2 =\n  # comment\n    # comment\n      # comment\n    three: 3\n  # comment\n    four: 4\n      # comment\n\n  ok Object::hasOwnProperty.call(obj2,'three')\n  eq obj2.three, 3\n  ok Object::hasOwnProperty.call(obj2,'four')\n  eq obj2.four, 4\n\ntest \"comments following operators that continue lines\", ->\n  sum =\n    1 +\n    1 + # comment\n    1\n  eq 3, sum\n\ntest \"comments in functions\", ->\n  fn = ->\n  # comment\n    false\n    false   # comment\n    false\n    # comment\n\n  # comment\n    true\n\n  ok fn()\n\n  fn2 = -> #comment\n    fn()\n    # comment\n\n  ok fn2()\n\ntest \"trailing comment before an outdent\", ->\n  nonce = {}\n  fn3 = ->\n    if true\n      undefined # comment\n    nonce\n\n  eq nonce, fn3()\n\ntest \"comments in a switch\", ->\n  nonce = {}\n  result = switch nonce #comment\n    # comment\n    when false then undefined\n    # comment\n    when null #comment\n      undefined\n    else nonce # comment\n\n  eq nonce, result\n\ntest \"comment with conditional statements\", ->\n  nonce = {}\n  result = if false # comment\n    undefined\n  #comment\n  else # comment\n    nonce\n    # comment\n  eq nonce, result\n\ntest \"spaced comments with conditional statements\", ->\n  nonce = {}\n  result = if false\n    undefined\n\n  # comment\n  else if false\n    undefined\n\n  # comment\n  else\n    nonce\n\n  eq nonce, result\n\n\n# Block Comments\n\n###\n  This is a here-comment.\n  Kind of like a heredoc.\n###\n\ntest \"block comments in objects\", ->\n  a = {}\n  b = {}\n  obj = {\n    a: a\n    ###\n    comment\n    ###\n    b: b\n  }\n\n  eq a, obj.a\n  eq b, obj.b\n\ntest \"block comments in YAML-style\", ->\n  a = {}\n  b = {}\n  obj =\n    a: a\n    ###\n    comment\n    ###\n    b: b\n\n  eq a, obj.a\n  eq b, obj.b\n\n\ntest \"block comments in functions\", ->\n  nonce = {}\n\n  fn1 = ->\n    true\n    ###\n    false\n    ###\n\n  ok fn1()\n\n  fn2 =  ->\n    ###\n    block comment\n    ###\n    nonce\n\n  eq nonce, fn2()\n\n  fn3 = ->\n    nonce\n  ###\n  block comment\n  ###\n\n  eq nonce, fn3()\n\n  fn4 = ->\n    one = ->\n      ###\n        block comment\n      ###\n      two = ->\n        three = ->\n          nonce\n\n  eq nonce, fn4()()()()\n\ntest \"block comments inside class bodies\", ->\n  class A\n    a: ->\n\n    ###\n    Comment\n    ###\n    b: ->\n\n  ok A.prototype.b instanceof Function\n\n  class B\n    ###\n    Comment\n    ###\n    a: ->\n    b: ->\n\n  ok B.prototype.a instanceof Function\n\ntest \"#2037: herecomments shouldn't imply line terminators\", ->\n  do (-> ### ###; fail)\n\ntest \"#2916: block comment before implicit call with implicit object\", ->\n  fn = (obj) -> ok obj.a\n  ### ###\n  fn\n    a: yes\n\ntest \"#3132: Format single-line block comment nicely\", ->\n  input = \"\"\"\n  ### Single-line block comment without additional space here => ###\"\"\"\n\n  result = \"\"\"\n\n  /* Single-line block comment without additional space here => */\n\n\n  \"\"\"\n  eq CoffeeScript.compile(input, bare: on), result\n\ntest \"#3132: Format multi-line block comment nicely\", ->\n  input = \"\"\"\n  ###\n  # Multi-line\n  # block\n  # comment\n  ###\"\"\"\n\n  result = \"\"\"\n\n  /*\n   * Multi-line\n   * block\n   * comment\n   */\n\n\n  \"\"\"\n  eq CoffeeScript.compile(input, bare: on), result\n\ntest \"#3132: Format simple block comment nicely\", ->\n  input = \"\"\"\n  ###\n  No\n  Preceding hash\n  ###\"\"\"\n\n  result = \"\"\"\n\n  /*\n  No\n  Preceding hash\n   */\n\n\n  \"\"\"\n\n  eq CoffeeScript.compile(input, bare: on), result\n\ntest \"#3132: Format indented block-comment nicely\", ->\n  input = \"\"\"\n  fn = () ->\n    ###\n    # Indented\n    Multiline\n    ###\n    1\"\"\"\n\n  result = \"\"\"\n  var fn;\n\n  fn = function() {\n\n    /*\n     * Indented\n    Multiline\n     */\n    return 1;\n  };\n\n  \"\"\"\n  eq CoffeeScript.compile(input, bare: on), result\n\n# Although adequately working, block comment-placement is not yet perfect.\n# (Considering a case where multiple variables have been declared …)\ntest \"#3132: Format jsdoc-style block-comment nicely\", ->\n  input = \"\"\"\n  ###*\n  # Multiline for jsdoc-\"@doctags\"\n  #\n  # @type {Function}\n  ###\n  fn = () -> 1\n  \"\"\"\n\n  result = \"\"\"\n\n  /**\n   * Multiline for jsdoc-\"@doctags\"\n   *\n   * @type {Function}\n   */\n  var fn;\n\n  fn = function() {\n    return 1;\n  };\n\n  \"\"\"\n  eq CoffeeScript.compile(input, bare: on), result\n\n# Although adequately working, block comment-placement is not yet perfect.\n# (Considering a case where multiple variables have been declared …)\ntest \"#3132: Format hand-made (raw) jsdoc-style block-comment nicely\", ->\n  input = \"\"\"\n  ###*\n   * Multiline for jsdoc-\"@doctags\"\n   *\n   * @type {Function}\n  ###\n  fn = () -> 1\n  \"\"\"\n\n  result = \"\"\"\n\n  /**\n   * Multiline for jsdoc-\"@doctags\"\n   *\n   * @type {Function}\n   */\n  var fn;\n\n  fn = function() {\n    return 1;\n  };\n\n  \"\"\"\n  eq CoffeeScript.compile(input, bare: on), result\n\n# Although adequately working, block comment-placement is not yet perfect.\n# (Considering a case where multiple variables have been declared …)\ntest \"#3132: Place block-comments nicely\", ->\n  input = \"\"\"\n  ###*\n  # A dummy class definition\n  #\n  # @class\n  ###\n  class DummyClass\n\n    ###*\n    # @constructor\n    ###\n    constructor: ->\n\n    ###*\n    # Singleton reference\n    #\n    # @type {DummyClass}\n    ###\n    @instance = new DummyClass()\n\n  \"\"\"\n\n  result = \"\"\"\n\n  /**\n   * A dummy class definition\n   *\n   * @class\n   */\n  var DummyClass;\n\n  DummyClass = (function() {\n\n    /**\n     * @constructor\n     */\n    function DummyClass() {}\n\n\n    /**\n     * Singleton reference\n     *\n     * @type {DummyClass}\n     */\n\n    DummyClass.instance = new DummyClass();\n\n    return DummyClass;\n\n  })();\n\n  \"\"\"\n  eq CoffeeScript.compile(input, bare: on), result\n\ntest \"#3638: Demand a whitespace after # symbol\", ->\n  input = \"\"\"\n  ###\n  #No\n  #whitespace\n  ###\"\"\"\n\n  result = \"\"\"\n\n  /*\n  #No\n  #whitespace\n   */\n\n\n  \"\"\"\n\n  eq CoffeeScript.compile(input, bare: on), result\n\ntest \"#3761: Multiline comment at end of an object\", ->\n  anObject =\n    x: 3\n    ###\n    #Comment\n    ###\n\n  ok anObject.x is 3\n\ntest \"#4375: UTF-8 characters in comments\", ->\n  # 智に働けば角が立つ、情に掉させば流される。\n  ok yes\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"compilation\">\n# Compilation\n# -----------\n\n# helper to assert that a string should fail compilation\ncantCompile = (code) ->\n  throws -> CoffeeScript.compile code\n\n\ntest \"ensure that carriage returns don't break compilation on Windows\", ->\n  doesNotThrow -> CoffeeScript.compile 'one\\r\\ntwo', bare: on\n\ntest \"#3089 - don't mutate passed in options to compile\", ->\n  opts = {}\n  CoffeeScript.compile '1 + 1', opts\n  ok !opts.scope\n\ntest \"--bare\", ->\n  eq -1, CoffeeScript.compile('x = y', bare: on).indexOf 'function'\n  ok 'passed' is CoffeeScript.eval '\"passed\"', bare: on, filename: 'test'\n\ntest \"header (#1778)\", ->\n  header = \"// Generated by CoffeeScript #{CoffeeScript.VERSION}\\n\"\n  eq 0, CoffeeScript.compile('x = y', header: on).indexOf header\n\ntest \"header is disabled by default\", ->\n  header = \"// Generated by CoffeeScript #{CoffeeScript.VERSION}\\n\"\n  eq -1, CoffeeScript.compile('x = y').indexOf header\n\ntest \"multiple generated references\", ->\n  a = {b: []}\n  a.b[true] = -> this == a.b\n  c = 0\n  d = []\n  ok a.b[0<++c<2] d...\n\ntest \"splat on a line by itself is invalid\", ->\n  cantCompile \"x 'a'\\n...\\n\"\n\ntest \"Issue 750\", ->\n\n  cantCompile 'f(->'\n\n  cantCompile 'a = (break)'\n\n  cantCompile 'a = (return 5 for item in list)'\n\n  cantCompile 'a = (return 5 while condition)'\n\n  cantCompile 'a = for x in y\\n  return 5'\n\ntest \"Issue #986: Unicode identifiers\", ->\n  λ = 5\n  eq λ, 5\n\ntest \"#2516: Unicode spaces should not be part of identifiers\", ->\n  a = (x) -> x * 2\n  b = 3\n  eq 6, a b # U+00A0 NO-BREAK SPACE\n  eq 6, a b # U+1680 OGHAM SPACE MARK\n  eq 6, a b # U+2000 EN QUAD\n  eq 6, a b # U+2001 EM QUAD\n  eq 6, a b # U+2002 EN SPACE\n  eq 6, a b # U+2003 EM SPACE\n  eq 6, a b # U+2004 THREE-PER-EM SPACE\n  eq 6, a b # U+2005 FOUR-PER-EM SPACE\n  eq 6, a b # U+2006 SIX-PER-EM SPACE\n  eq 6, a b # U+2007 FIGURE SPACE\n  eq 6, a b # U+2008 PUNCTUATION SPACE\n  eq 6, a b # U+2009 THIN SPACE\n  eq 6, a b # U+200A HAIR SPACE\n  eq 6, a b # U+202F NARROW NO-BREAK SPACE\n  eq 6, a b # U+205F MEDIUM MATHEMATICAL SPACE\n  eq 6, a　b # U+3000 IDEOGRAPHIC SPACE\n\n  # #3560: Non-breaking space (U+00A0) (before `'c'`)\n  eq 5, {c: 5}[ 'c' ]\n\n  # A line where every space in non-breaking\n  eq 1 + 1, 2  \n\ntest \"don't accidentally stringify keywords\", ->\n  ok (-> this == 'this')() is false\n\ntest \"#1026: no if/else/else allowed\", ->\n  cantCompile '''\n    if a\n      b\n    else\n      c\n    else\n      d\n  '''\n\ntest \"#1050: no closing asterisk comments from within block comments\", ->\n  cantCompile \"### */ ###\"\n\ntest \"#1273: escaping quotes at the end of heredocs\", ->\n  cantCompile '\"\"\"\\\\\"\"\"' # \"\"\"\\\"\"\"\n  cantCompile '\"\"\"\\\\\\\\\\\\\"\"\"' # \"\"\"\\\\\\\"\"\"\n\ntest \"#1106: __proto__ compilation\", ->\n  object = eq\n  @[\"__proto__\"] = true\n  ok __proto__\n\ntest \"reference named hasOwnProperty\", ->\n  CoffeeScript.compile 'hasOwnProperty = 0; a = 1'\n\ntest \"#1055: invalid keys in real (but not work-product) objects\", ->\n  cantCompile \"@key: value\"\n\ntest \"#1066: interpolated strings are not implicit functions\", ->\n  cantCompile '\"int#{er}polated\" arg'\n\ntest \"#2846: while with empty body\", ->\n  CoffeeScript.compile 'while 1 then', {sourceMap: true}\n\ntest \"#2944: implicit call with a regex argument\", ->\n  CoffeeScript.compile 'o[key] /regex/'\n\ntest \"#3001: `own` shouldn't be allowed in a `for`-`in` loop\", ->\n  cantCompile \"a for own b in c\"\n\ntest \"#2994: single-line `if` requires `then`\", ->\n  cantCompile \"if b else x\"\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"comprehensions\">\n# Comprehensions\n# --------------\n\n# * Array Comprehensions\n# * Range Comprehensions\n# * Object Comprehensions\n# * Implicit Destructuring Assignment\n# * Comprehensions with Nonstandard Step\n\n# TODO: refactor comprehension tests\n\ntest \"Basic array comprehensions.\", ->\n\n  nums    = (n * n for n in [1, 2, 3] when n & 1)\n  results = (n * 2 for n in nums)\n\n  ok results.join(',') is '2,18'\n\n\ntest \"Basic object comprehensions.\", ->\n\n  obj   = {one: 1, two: 2, three: 3}\n  names = (prop + '!' for prop of obj)\n  odds  = (prop + '!' for prop, value of obj when value & 1)\n\n  ok names.join(' ') is \"one! two! three!\"\n  ok odds.join(' ')  is \"one! three!\"\n\n\ntest \"Basic range comprehensions.\", ->\n\n  nums = (i * 3 for i in [1..3])\n\n  negs = (x for x in [-20..-5*2])\n  negs = negs[0..2]\n\n  result = nums.concat(negs).join(', ')\n\n  ok result is '3, 6, 9, -20, -19, -18'\n\n\ntest \"With range comprehensions, you can loop in steps.\", ->\n\n  results = (x for x in [0...15] by 5)\n  ok results.join(' ') is '0 5 10'\n\n  results = (x for x in [0..100] by 10)\n  ok results.join(' ') is '0 10 20 30 40 50 60 70 80 90 100'\n\n\ntest \"And can loop downwards, with a negative step.\", ->\n\n  results = (x for x in [5..1])\n\n  ok results.join(' ') is '5 4 3 2 1'\n  ok results.join(' ') is [(10-5)..(-2+3)].join(' ')\n\n  results = (x for x in [10..1])\n  ok results.join(' ') is [10..1].join(' ')\n\n  results = (x for x in [10...0] by -2)\n  ok results.join(' ') is [10, 8, 6, 4, 2].join(' ')\n\n\ntest \"Range comprehension gymnastics.\", ->\n\n  eq \"#{i for i in [5..1]}\", '5,4,3,2,1'\n  eq \"#{i for i in [5..-5] by -5}\", '5,0,-5'\n\n  a = 6\n  b = 0\n  c = -2\n\n  eq \"#{i for i in [a..b]}\", '6,5,4,3,2,1,0'\n  eq \"#{i for i in [a..b] by c}\", '6,4,2,0'\n\n\ntest \"Multiline array comprehension with filter.\", ->\n\n  evens = for num in [1, 2, 3, 4, 5, 6] when not (num & 1)\n             num *= -1\n             num -= 2\n             num * -1\n  eq evens + '', '4,6,8'\n\n\n  test \"The in operator still works, standalone.\", ->\n\n    ok 2 of evens\n\n\ntest \"all isn't reserved.\", ->\n\n  all = 1\n\n\ntest \"Ensure that the closure wrapper preserves local variables.\", ->\n\n  obj = {}\n\n  for method in ['one', 'two', 'three'] then do (method) ->\n    obj[method] = ->\n      \"I'm \" + method\n\n  ok obj.one()   is \"I'm one\"\n  ok obj.two()   is \"I'm two\"\n  ok obj.three() is \"I'm three\"\n\n\ntest \"Index values at the end of a loop.\", ->\n\n  i = 0\n  for i in [1..3]\n    -> 'func'\n    break if false\n  ok i is 4\n\n\ntest \"Ensure that local variables are closed over for range comprehensions.\", ->\n\n  funcs = for i in [1..3]\n    do (i) ->\n      -> -i\n\n  eq (func() for func in funcs).join(' '), '-1 -2 -3'\n  ok i is 4\n\n\ntest \"Even when referenced in the filter.\", ->\n\n  list = ['one', 'two', 'three']\n\n  methods = for num, i in list when num isnt 'two' and i isnt 1\n    do (num, i) ->\n      -> num + ' ' + i\n\n  ok methods.length is 2\n  ok methods[0]() is 'one 0'\n  ok methods[1]() is 'three 2'\n\n\ntest \"Even a convoluted one.\", ->\n\n  funcs = []\n\n  for i in [1..3]\n    do (i) ->\n      x = i * 2\n      ((z)->\n        funcs.push -> z + ' ' + i\n      )(x)\n\n  ok (func() for func in funcs).join(', ') is '2 1, 4 2, 6 3'\n\n  funcs = []\n\n  results = for i in [1..3]\n    do (i) ->\n      z = (x * 3 for x in [1..i])\n      ((a, b, c) -> [a, b, c].join(' ')).apply this, z\n\n  ok results.join(', ') is '3  , 3 6 , 3 6 9'\n\n\ntest \"Naked ranges are expanded into arrays.\", ->\n\n  array = [0..10]\n  ok(num % 2 is 0 for num in array by 2)\n\n\ntest \"Nested shared scopes.\", ->\n\n  foo = ->\n    for i in [0..7]\n      do (i) ->\n        for j in [0..7]\n          do (j) ->\n            -> i + j\n\n  eq foo()[3][4](), 7\n\n\ntest \"Scoped loop pattern matching.\", ->\n\n  a = [[0], [1]]\n  funcs = []\n\n  for [v] in a\n    do (v) ->\n      funcs.push -> v\n\n  eq funcs[0](), 0\n  eq funcs[1](), 1\n\n\ntest \"Nested comprehensions.\", ->\n\n  multiLiner =\n    for x in [3..5]\n      for y in [3..5]\n        [x, y]\n\n  singleLiner =\n    (([x, y] for y in [3..5]) for x in [3..5])\n\n  ok multiLiner.length is singleLiner.length\n  ok 5 is multiLiner[2][2][1]\n  ok 5 is singleLiner[2][2][1]\n\n\ntest \"Comprehensions within parentheses.\", ->\n\n  result = null\n  store = (obj) -> result = obj\n  store (x * 2 for x in [3, 2, 1])\n\n  ok result.join(' ') is '6 4 2'\n\n\ntest \"Closure-wrapped comprehensions that refer to the 'arguments' object.\", ->\n\n  expr = ->\n    result = (item * item for item in arguments)\n\n  ok expr(2, 4, 8).join(' ') is '4 16 64'\n\n\ntest \"Fast object comprehensions over all properties, including prototypal ones.\", ->\n\n  class Cat\n    constructor: -> @name = 'Whiskers'\n    breed: 'tabby'\n    hair:  'cream'\n\n  whiskers = new Cat\n  own = (value for own key, value of whiskers)\n  all = (value for key, value of whiskers)\n\n  ok own.join(' ') is 'Whiskers'\n  ok all.sort().join(' ') is 'Whiskers cream tabby'\n\n\ntest \"Optimized range comprehensions.\", ->\n\n  exxes = ('x' for [0...10])\n  ok exxes.join(' ') is 'x x x x x x x x x x'\n\n\ntest \"#3671: Allow step in optimized range comprehensions.\", ->\n\n  exxes = ('x' for [0...10] by 2)\n  eq exxes.join(' ') , 'x x x x x'\n\n\ntest \"#3671: Disallow guard in optimized range comprehensions.\", ->\n\n  throws -> CoffeeScript.compile \"exxes = ('x' for [0...10] when a)\"\n\n\ntest \"Loop variables should be able to reference outer variables\", ->\n  outer = 1\n  do ->\n    null for outer in [1, 2, 3]\n  eq outer, 3\n\n\ntest \"Lenient on pure statements not trying to reach out of the closure\", ->\n\n  val = for i in [1]\n    for j in [] then break\n    i\n  ok val[0] is i\n\n\ntest \"Comprehensions only wrap their last line in a closure, allowing other lines\n  to have pure expressions in them.\", ->\n\n  func = -> for i in [1]\n    break if i is 2\n    j for j in [1]\n\n  ok func()[0][0] is 1\n\n  i = 6\n  odds = while i--\n    continue unless i & 1\n    i\n\n  ok odds.join(', ') is '5, 3, 1'\n\n\ntest \"Issue #897: Ensure that plucked function variables aren't leaked.\", ->\n\n  facets = {}\n  list = ['one', 'two']\n\n  (->\n    for entity in list\n      facets[entity] = -> entity\n  )()\n\n  eq typeof entity, 'undefined'\n  eq facets['two'](), 'two'\n\n\ntest \"Issue #905. Soaks as the for loop subject.\", ->\n\n  a = {b: {c: [1, 2, 3]}}\n  for d in a.b?.c\n    e = d\n\n  eq e, 3\n\n\ntest \"Issue #948. Capturing loop variables.\", ->\n\n  funcs = []\n  list  = ->\n    [1, 2, 3]\n\n  for y in list()\n    do (y) ->\n      z = y\n      funcs.push -> \"y is #{y} and z is #{z}\"\n\n  eq funcs[1](), \"y is 2 and z is 2\"\n\n\ntest \"Cancel the comprehension if there's a jump inside the loop.\", ->\n\n  result = try\n    for i in [0...10]\n      continue if i < 5\n    i\n\n  eq result, 10\n\n\ntest \"Comprehensions over break.\", ->\n\n  arrayEq (break for [1..10]), []\n\n\ntest \"Comprehensions over continue.\", ->\n\n  arrayEq (continue for [1..10]), []\n\n\ntest \"Comprehensions over function literals.\", ->\n\n  a = 0\n  for f in [-> a = 1]\n    do (f) ->\n      do f\n\n  eq a, 1\n\n\ntest \"Comprehensions that mention arguments.\", ->\n\n  list = [arguments: 10]\n  args = for f in list\n    do (f) ->\n      f.arguments\n  eq args[0], 10\n\n\ntest \"expression conversion under explicit returns\", ->\n  nonce = {}\n  fn = ->\n    return (nonce for x in [1,2,3])\n  arrayEq [nonce,nonce,nonce], fn()\n  fn = ->\n    return [nonce for x in [1,2,3]][0]\n  arrayEq [nonce,nonce,nonce], fn()\n  fn = ->\n    return [(nonce for x in [1..3])][0]\n  arrayEq [nonce,nonce,nonce], fn()\n\n\ntest \"implicit destructuring assignment in object of objects\", ->\n  a={}; b={}; c={}\n  obj = {\n    a: { d: a },\n    b: { d: b }\n    c: { d: c }\n  }\n  result = ([y,z] for y, { d: z } of obj)\n  arrayEq [['a',a],['b',b],['c',c]], result\n\n\ntest \"implicit destructuring assignment in array of objects\", ->\n  a={}; b={}; c={}; d={}; e={}; f={}\n  arr = [\n    { a: a, b: { c: b } },\n    { a: c, b: { c: d } },\n    { a: e, b: { c: f } }\n  ]\n  result = ([y,z] for { a: y, b: { c: z } } in arr)\n  arrayEq [[a,b],[c,d],[e,f]], result\n\n\ntest \"implicit destructuring assignment in array of arrays\", ->\n  a={}; b={}; c={}; d={}; e={}; f={}\n  arr = [[a, [b]], [c, [d]], [e, [f]]]\n  result = ([y,z] for [y, [z]] in arr)\n  arrayEq [[a,b],[c,d],[e,f]], result\n\ntest \"issue #1124: don't assign a variable in two scopes\", ->\n  lista = [1, 2, 3, 4, 5]\n  listb = (_i + 1 for _i in lista)\n  arrayEq [2, 3, 4, 5, 6], listb\n\ntest \"#1326: `by` value is uncached\", ->\n  a = [0,1,2]\n  fi = gi = hi = 0\n  f = -> ++fi\n  g = -> ++gi\n  h = -> ++hi\n\n  forCompile = []\n  rangeCompileSimple = []\n\n  #exercises For.compile\n  for v, i in a by f()\n    forCompile.push i\n\n  #exercises Range.compileSimple\n  rangeCompileSimple = (i for i in [0..2] by g())\n\n  arrayEq a, forCompile\n  arrayEq a, rangeCompileSimple\n  #exercises Range.compile\n  eq \"#{i for i in [0..2] by h()}\", '0,1,2'\n\ntest \"#1669: break/continue should skip the result only for that branch\", ->\n  ns = for n in [0..99]\n    if n > 9\n      break\n    else if n & 1\n      continue\n    else\n      n\n  eq \"#{ns}\", '0,2,4,6,8'\n\n  # `else undefined` is implied.\n  ns = for n in [1..9]\n    if n % 2\n      continue unless n % 5\n      n\n  eq \"#{ns}\", \"1,,3,,,7,,9\"\n\n  # Ditto.\n  ns = for n in [1..9]\n    switch\n      when n % 2\n        continue unless n % 5\n        n\n  eq \"#{ns}\", \"1,,3,,,7,,9\"\n\ntest \"#1850: inner `for` should not be expression-ized if `return`ing\", ->\n  eq '3,4,5', do ->\n    for a in [1..9] then \\\n    for b in [1..9]\n      c = Math.sqrt a*a + b*b\n      return String [a, b, c] unless c % 1\n\ntest \"#1910: loop index should be mutable within a loop iteration and immutable between loop iterations\", ->\n  n = 1\n  iterations = 0\n  arr = [0..n]\n  for v, k in arr\n    ++iterations\n    v = k = 5\n    eq 5, k\n  eq 2, k\n  eq 2, iterations\n\n  iterations = 0\n  for v in [0..n]\n    ++iterations\n  eq 2, k\n  eq 2, iterations\n\n  arr = ([v, v + 1] for v in [0..5])\n  iterations = 0\n  for [v0, v1], k in arr when v0\n    k += 3\n    ++iterations\n  eq 6, k\n  eq 5, iterations\n\ntest \"#2007: Return object literal from comprehension\", ->\n  y = for x in [1, 2]\n    foo: \"foo\" + x\n  eq 2, y.length\n  eq \"foo1\", y[0].foo\n  eq \"foo2\", y[1].foo\n\n  x = 2\n  y = while x\n    x: --x\n  eq 2, y.length\n  eq 1, y[0].x\n  eq 0, y[1].x\n\ntest \"#2274: Allow @values as loop variables\", ->\n  obj = {\n    item: null\n    method: ->\n      for @item in [1, 2, 3]\n        null\n  }\n  eq obj.item, null\n  obj.method()\n  eq obj.item, 3\n\ntest \"#4411: Allow @values as loop indices\", ->\n  obj =\n    index: null\n    get: -> @index\n    method: ->\n      @get() for _, @index in [1, 2, 3]\n  eq obj.index, null\n  arrayEq obj.method(), [0, 1, 2]\n  eq obj.index, 3\n\ntest \"#2525, #1187, #1208, #1758, looping over an array forwards\", ->\n  list = [0, 1, 2, 3, 4]\n\n  ident = (x) -> x\n\n  arrayEq (i for i in list), list\n\n  arrayEq (index for i, index in list), list\n\n  arrayEq (i for i in list by 1), list\n\n  arrayEq (i for i in list by ident 1), list\n\n  arrayEq (i for i in list by ident(1) * 2), [0, 2, 4]\n\n  arrayEq (index for i, index in list by ident(1) * 2), [0, 2, 4]\n\ntest \"#2525, #1187, #1208, #1758, looping over an array backwards\", ->\n  list = [0, 1, 2, 3, 4]\n  backwards = [4, 3, 2, 1, 0]\n\n  ident = (x) -> x\n\n  arrayEq (i for i in list by -1), backwards\n\n  arrayEq (index for i, index in list by -1), backwards\n\n  arrayEq (i for i in list by ident -1), backwards\n\n  arrayEq (i for i in list by ident(-1) * 2), [4, 2, 0]\n\n  arrayEq (index for i, index in list by ident(-1) * 2), [4, 2, 0]\n\ntest \"splats in destructuring in comprehensions\", ->\n  list = [[0, 1, 2], [2, 3, 4], [4, 5, 6]]\n  arrayEq (seq for [rep, seq...] in list), [[1, 2], [3, 4], [5, 6]]\n\ntest \"#156: expansion in destructuring in comprehensions\", ->\n  list = [[0, 1, 2], [2, 3, 4], [4, 5, 6]]\n  arrayEq (last for [..., last] in list), [2, 4, 6]\n\ntest \"#3778: Consistently always cache for loop range boundaries and steps, even\n      if they are simple identifiers\", ->\n  a = 1; arrayEq [1, 2, 3], (for n in [1, 2, 3] by  a then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [1, 2, 3] by +a then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [a..3]          then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [+a..3]         then a = 4; n)\n  a = 3; arrayEq [1, 2, 3], (for n in [1..a]          then a = 4; n)\n  a = 3; arrayEq [1, 2, 3], (for n in [1..+a]         then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [1..3] by  a    then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [1..3] by +a    then a = 4; n)\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"control_flow\">\n# Control Flow\n# ------------\n\n# * Conditionals\n# * Loops\n#   * For\n#   * While\n#   * Until\n#   * Loop\n# * Switch\n# * Throw\n\n# TODO: make sure postfix forms and expression coercion are properly tested\n\n# shared identity function\nid = (_) -> if arguments.length is 1 then _ else Array::slice.call(arguments)\n\n# Conditionals\n\ntest \"basic conditionals\", ->\n  if false\n    ok false\n  else if false\n    ok false\n  else\n    ok true\n\n  if true\n    ok true\n  else if true\n    ok false\n  else\n    ok true\n\n  unless true\n    ok false\n  else unless true\n    ok false\n  else\n    ok true\n\n  unless false\n    ok true\n  else unless false\n    ok false\n  else\n    ok true\n\ntest \"single-line conditional\", ->\n  if false then ok false else ok true\n  unless false then ok true else ok false\n\ntest \"nested conditionals\", ->\n  nonce = {}\n  eq nonce, (if true\n    unless false\n      if false then false else\n        if true\n          nonce)\n\ntest \"nested single-line conditionals\", ->\n  nonce = {}\n\n  a = if false then undefined else b = if 0 then undefined else nonce\n  eq nonce, a\n  eq nonce, b\n\n  c = if false then undefined else (if 0 then undefined else nonce)\n  eq nonce, c\n\n  d = if true then id(if false then undefined else nonce)\n  eq nonce, d\n\ntest \"empty conditional bodies\", ->\n  eq undefined, (if false\n  else if false\n  else)\n\ntest \"conditional bodies containing only comments\", ->\n  eq undefined, (if true\n    ###\n    block comment\n    ###\n  else\n    # comment\n  )\n\n  eq undefined, (if false\n    # comment\n  else if true\n    ###\n    block comment\n    ###\n  else)\n\ntest \"return value of if-else is from the proper body\", ->\n  nonce = {}\n  eq nonce, if false then undefined else nonce\n\ntest \"return value of unless-else is from the proper body\", ->\n  nonce = {}\n  eq nonce, unless true then undefined else nonce\n\ntest \"assign inside the condition of a conditional statement\", ->\n  nonce = {}\n  if a = nonce then 1\n  eq nonce, a\n  1 if b = nonce\n  eq nonce, b\n\n\n# Interactions With Functions\n\ntest \"single-line function definition with single-line conditional\", ->\n  fn = -> if 1 < 0.5 then 1 else -1\n  ok fn() is -1\n\ntest \"function resturns conditional value with no `else`\", ->\n  fn = ->\n    return if false then true\n  eq undefined, fn()\n\ntest \"function returns a conditional value\", ->\n  a = {}\n  fnA = ->\n    return if false then undefined else a\n  eq a, fnA()\n\n  b = {}\n  fnB = ->\n    return unless false then b else undefined\n  eq b, fnB()\n\ntest \"passing a conditional value to a function\", ->\n  nonce = {}\n  eq nonce, id if false then undefined else nonce\n\ntest \"unmatched `then` should catch implicit calls\", ->\n  a = 0\n  trueFn = -> true\n  if trueFn undefined then a++\n  eq 1, a\n\n\n# if-to-ternary\n\ntest \"if-to-ternary with instanceof requires parentheses\", ->\n  nonce = {}\n  eq nonce, (if {} instanceof Object\n    nonce\n  else\n    undefined)\n\ntest \"if-to-ternary as part of a larger operation requires parentheses\", ->\n  ok 2, 1 + if false then 0 else 1\n\n\n# Odd Formatting\n\ntest \"if-else indented within an assignment\", ->\n  nonce = {}\n  result =\n    if false\n      undefined\n    else\n      nonce\n  eq nonce, result\n\ntest \"suppressed indentation via assignment\", ->\n  nonce = {}\n  result =\n    if      false then undefined\n    else if no    then undefined\n    else if 0     then undefined\n    else if 1 < 0 then undefined\n    else               id(\n         if false then undefined\n         else          nonce\n    )\n  eq nonce, result\n\ntest \"tight formatting with leading `then`\", ->\n  nonce = {}\n  eq nonce,\n  if true\n  then nonce\n  else undefined\n\ntest \"#738: inline function defintion\", ->\n  nonce = {}\n  fn = if true then -> nonce\n  eq nonce, fn()\n\ntest \"#748: trailing reserved identifiers\", ->\n  nonce = {}\n  obj = delete: true\n  result = if obj.delete\n    nonce\n  eq nonce, result\n\ntest 'if-else within an assignment, condition parenthesized', ->\n  result = if (1 is 1) then 'correct'\n  eq result, 'correct'\n\n  result = if ('whatever' ? no) then 'correct'\n  eq result, 'correct'\n\n  f = -> 'wrong'\n  result = if (f?()) then 'correct' else 'wrong'\n  eq result, 'correct'\n\n# Postfix\n\ntest \"#3056: multiple postfix conditionals\", ->\n  temp = 'initial'\n  temp = 'ignored' unless true if false\n  eq temp, 'initial'\n\n# Loops\n\ntest \"basic `while` loops\", ->\n\n  i = 5\n  list = while i -= 1\n    i * 2\n  ok list.join(' ') is \"8 6 4 2\"\n\n  i = 5\n  list = (i * 3 while i -= 1)\n  ok list.join(' ') is \"12 9 6 3\"\n\n  i = 5\n  func   = (num) -> i -= num\n  assert = -> ok i < 5 > 0\n  results = while func 1\n    assert()\n    i\n  ok results.join(' ') is '4 3 2 1'\n\n  i = 10\n  results = while i -= 1 when i % 2 is 0\n    i * 2\n  ok results.join(' ') is '16 12 8 4'\n\n\ntest \"Issue 759: `if` within `while` condition\", ->\n\n  2 while if 1 then 0\n\n\ntest \"assignment inside the condition of a `while` loop\", ->\n\n  nonce = {}\n  count = 1\n  a = nonce while count--\n  eq nonce, a\n  count = 1\n  while count--\n    b = nonce\n  eq nonce, b\n\n\ntest \"While over break.\", ->\n\n  i = 0\n  result = while i < 10\n    i++\n    break\n  arrayEq result, []\n\n\ntest \"While over continue.\", ->\n\n  i = 0\n  result = while i < 10\n    i++\n    continue\n  arrayEq result, []\n\n\ntest \"Basic `until`\", ->\n\n  value = false\n  i = 0\n  results = until value\n    value = true if i is 5\n    i++\n  ok i is 6\n\n\ntest \"Basic `loop`\", ->\n\n  i = 5\n  list = []\n  loop\n    i -= 1\n    break if i is 0\n    list.push i * 2\n  ok list.join(' ') is '8 6 4 2'\n\n\ntest \"break at the top level\", ->\n  for i in [1,2,3]\n    result = i\n    if i == 2\n      break\n  eq 2, result\n\ntest \"break *not* at the top level\", ->\n  someFunc = ->\n    i = 0\n    while ++i < 3\n      result = i\n      break if i > 1\n    result\n  eq 2, someFunc()\n\n# Switch\n\ntest \"basic `switch`\", ->\n\n  num = 10\n  result = switch num\n    when 5 then false\n    when 'a'\n      true\n      true\n      false\n    when 10 then true\n\n\n    # Mid-switch comment with whitespace\n    # and multi line\n    when 11 then false\n    else false\n\n  ok result\n\n\n  func = (num) ->\n    switch num\n      when 2, 4, 6\n        true\n      when 1, 3, 5\n        false\n\n  ok func(2)\n  ok func(6)\n  ok !func(3)\n  eq func(8), undefined\n\n\ntest \"Ensure that trailing switch elses don't get rewritten.\", ->\n\n  result = false\n  switch \"word\"\n    when \"one thing\"\n      doSomething()\n    else\n      result = true unless false\n\n  ok result\n\n  result = false\n  switch \"word\"\n    when \"one thing\"\n      doSomething()\n    when \"other thing\"\n      doSomething()\n    else\n      result = true unless false\n\n  ok result\n\n\ntest \"Should be able to handle switches sans-condition.\", ->\n\n  result = switch\n    when null                     then 0\n    when !1                       then 1\n    when '' not of {''}           then 2\n    when [] not instanceof Array  then 3\n    when true is false            then 4\n    when 'x' < 'y' > 'z'          then 5\n    when 'a' in ['b', 'c']        then 6\n    when 'd' in (['e', 'f'])      then 7\n    else ok\n\n  eq result, ok\n\n\ntest \"Should be able to use `@properties` within the switch clause.\", ->\n\n  obj = {\n    num: 101\n    func: ->\n      switch @num\n        when 101 then '101!'\n        else 'other'\n  }\n\n  ok obj.func() is '101!'\n\n\ntest \"Should be able to use `@properties` within the switch cases.\", ->\n\n  obj = {\n    num: 101\n    func: (yesOrNo) ->\n      result = switch yesOrNo\n        when yes then @num\n        else 'other'\n      result\n  }\n\n  ok obj.func(yes) is 101\n\n\ntest \"Switch with break as the return value of a loop.\", ->\n\n  i = 10\n  results = while i > 0\n    i--\n    switch i % 2\n      when 1 then i\n      when 0 then break\n\n  eq results.join(', '), '9, 7, 5, 3, 1'\n\n\ntest \"Issue #997. Switch doesn't fallthrough.\", ->\n\n  val = 1\n  switch true\n    when true\n      if false\n        return 5\n    else\n      val = 2\n\n  eq val, 1\n\n# Throw\n\ntest \"Throw should be usable as an expression.\", ->\n  try\n    false or throw 'up'\n    throw new Error 'failed'\n  catch e\n    ok e is 'up'\n\n\ntest \"#2555, strange function if bodies\", ->\n  success = -> ok true\n  failure = -> ok false\n\n  success() if do ->\n    yes\n\n  failure() if try\n    false\n\ntest \"#1057: `catch` or `finally` in single-line functions\", ->\n  ok do -> try throw 'up' catch then yes\n  ok do -> try yes finally 'nothing'\n\ntest \"#2367: super in for-loop\", ->\n  class Foo\n    sum: 0\n    add: (val) -> @sum += val\n\n  class Bar extends Foo\n    add: (vals...) ->\n      super val for val in vals\n      @sum\n\n  eq 10, (new Bar).add 2, 3, 5\n\ntest \"#4267: lots of for-loops in the same scope\", ->\n  # This used to include the invalid JavaScript `var do = 0`.\n  code = \"\"\"\n    do ->\n      #{Array(200).join('for [0..0] then\\n  ')}\n      true\n  \"\"\"\n  ok CoffeeScript.eval(code)\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"error_messages\">\n# Error Formatting\n# ----------------\n\n# Ensure that errors of different kinds (lexer, parser and compiler) are shown\n# in a consistent way.\n\nassertErrorFormat = (code, expectedErrorFormat) ->\n  throws (-> CoffeeScript.run code), (err) ->\n    err.colorful = no\n    eq expectedErrorFormat, \"#{err}\"\n    yes\n\ntest \"lexer errors formatting\", ->\n  assertErrorFormat '''\n    normalObject    = {}\n    insideOutObject = }{\n  ''',\n  '''\n    [stdin]:2:19: error: unmatched }\n    insideOutObject = }{\n                      ^\n  '''\n\ntest \"parser error formatting\", ->\n  assertErrorFormat '''\n    foo in bar or in baz\n  ''',\n  '''\n    [stdin]:1:15: error: unexpected in\n    foo in bar or in baz\n                  ^^\n  '''\n\ntest \"compiler error formatting\", ->\n  assertErrorFormat '''\n    evil = (foo, eval, bar) ->\n  ''',\n  '''\n    [stdin]:1:14: error: 'eval' can't be assigned\n    evil = (foo, eval, bar) ->\n                 ^^^^\n  '''\n\ntest \"compiler error formatting with mixed tab and space\", ->\n  assertErrorFormat \"\"\"\n    \\t  if a\n    \\t  test\n  \"\"\",\n  '''\n    [stdin]:1:4: error: unexpected if\n    \\t  if a\n    \\t  ^^\n  '''\n\n\nif require?\n  os   = require 'os'\n  fs   = require 'fs'\n  path = require 'path'\n\n  test \"patchStackTrace line patching\", ->\n    err = new Error 'error'\n    ok err.stack.match /test[\\/\\\\]error_messages\\.coffee:\\d+:\\d+\\b/\n\n  test \"patchStackTrace stack prelude consistent with V8\", ->\n    err = new Error\n    ok err.stack.match /^Error\\n/ # Notice no colon when no message.\n\n    err = new Error 'error'\n    ok err.stack.match /^Error: error\\n/\n\n  test \"#2849: compilation error in a require()d file\", ->\n    # Create a temporary file to require().\n    tempFile = path.join os.tmpdir(), 'syntax-error.coffee'\n    ok not fs.existsSync tempFile\n    fs.writeFileSync tempFile, 'foo in bar or in baz'\n\n    try\n      assertErrorFormat \"\"\"\n        require '#{tempFile}'\n      \"\"\",\n      \"\"\"\n        #{fs.realpathSync tempFile}:1:15: error: unexpected in\n        foo in bar or in baz\n                      ^^\n      \"\"\"\n    finally\n      fs.unlinkSync tempFile\n\n  test \"#3890 Error.prepareStackTrace doesn't throw an error if a compiled file is deleted\", ->\n    # Adapted from https://github.com/atom/coffee-cash/blob/master/spec/coffee-cash-spec.coffee\n    filePath = path.join os.tmpdir(), 'PrepareStackTraceTestFile.coffee'\n    fs.writeFileSync filePath, \"module.exports = -> throw new Error('hello world')\"\n    throwsAnError = require filePath\n    fs.unlinkSync filePath\n\n    try\n      throwsAnError()\n    catch error\n\n    eq error.message, 'hello world'\n    doesNotThrow(-> error.stack)\n    notEqual error.stack.toString().indexOf(filePath), -1\n\n  test \"#4418 stack traces for compiled files reference the correct line number\", ->\n    filePath = path.join os.tmpdir(), 'StackTraceLineNumberTestFile.coffee'\n    fileContents = \"\"\"\n      testCompiledFileStackTraceLineNumber = ->\n        # `a` on the next line is undefined and should throw a ReferenceError\n        console.log a if true\n\n      do testCompiledFileStackTraceLineNumber\n      \"\"\"\n    fs.writeFileSync filePath, fileContents\n\n    try\n      require filePath\n    catch error\n    fs.unlinkSync filePath\n\n    # Make sure the line number reported is line 3 (the original Coffee source)\n    # and not line 6 (the generated JavaScript).\n    eq /StackTraceLineNumberTestFile.coffee:(\\d)/.exec(error.stack.toString())[1], '3'\n\n\ntest \"#4418 stack traces for compiled strings reference the correct line number\", ->\n  try\n    CoffeeScript.run \"\"\"\n      testCompiledStringStackTraceLineNumber = ->\n        # `a` on the next line is undefined and should throw a ReferenceError\n        console.log a if true\n\n      do testCompiledStringStackTraceLineNumber\n      \"\"\"\n  catch error\n\n  # Make sure the line number reported is line 3 (the original Coffee source)\n  # and not line 6 (the generated JavaScript).\n  eq /at testCompiledStringStackTraceLineNumber.*:(\\d):/.exec(error.stack.toString())[1], '3'\n\n\ntest \"#1096: unexpected generated tokens\", ->\n  # Implicit ends\n  assertErrorFormat 'a:, b', '''\n    [stdin]:1:3: error: unexpected ,\n    a:, b\n      ^\n  '''\n  # Explicit ends\n  assertErrorFormat '(a:)', '''\n    [stdin]:1:4: error: unexpected )\n    (a:)\n       ^\n  '''\n  # Unexpected end of file\n  assertErrorFormat 'a:', '''\n    [stdin]:1:3: error: unexpected end of input\n    a:\n      ^\n  '''\n  assertErrorFormat 'a +', '''\n    [stdin]:1:4: error: unexpected end of input\n    a +\n       ^\n  '''\n  # Unexpected key in implicit object (an implicit object itself is _not_\n  # unexpected here)\n  assertErrorFormat '''\n    for i in [1]:\n      1\n  ''', '''\n    [stdin]:1:10: error: unexpected [\n    for i in [1]:\n             ^\n  '''\n  # Unexpected regex\n  assertErrorFormat '{/a/i: val}', '''\n    [stdin]:1:2: error: unexpected regex\n    {/a/i: val}\n     ^^^^\n  '''\n  assertErrorFormat '{///a///i: val}', '''\n    [stdin]:1:2: error: unexpected regex\n    {///a///i: val}\n     ^^^^^^^^\n  '''\n  assertErrorFormat '{///#{a}///i: val}', '''\n    [stdin]:1:2: error: unexpected regex\n    {///#{a}///i: val}\n     ^^^^^^^^^^^\n  '''\n  # Unexpected string\n  assertErrorFormat 'import foo from \"lib-#{version}\"', '''\n    [stdin]:1:17: error: the name of the module to be imported from must be an uninterpolated string\n    import foo from \"lib-#{version}\"\n                    ^^^^^^^^^^^^^^^^\n  '''\n\n  # Unexpected number\n  assertErrorFormat '\"a\"0x00Af2', '''\n    [stdin]:1:4: error: unexpected number\n    \"a\"0x00Af2\n       ^^^^^^^\n  '''\n\ntest \"#1316: unexpected end of interpolation\", ->\n  assertErrorFormat '''\n    \"#{+}\"\n  ''', '''\n    [stdin]:1:5: error: unexpected end of interpolation\n    \"#{+}\"\n        ^\n  '''\n  assertErrorFormat '''\n    \"#{++}\"\n  ''', '''\n    [stdin]:1:6: error: unexpected end of interpolation\n    \"#{++}\"\n         ^\n  '''\n  assertErrorFormat '''\n    \"#{-}\"\n  ''', '''\n    [stdin]:1:5: error: unexpected end of interpolation\n    \"#{-}\"\n        ^\n  '''\n  assertErrorFormat '''\n    \"#{--}\"\n  ''', '''\n    [stdin]:1:6: error: unexpected end of interpolation\n    \"#{--}\"\n         ^\n  '''\n  assertErrorFormat '''\n    \"#{~}\"\n  ''', '''\n    [stdin]:1:5: error: unexpected end of interpolation\n    \"#{~}\"\n        ^\n  '''\n  assertErrorFormat '''\n    \"#{!}\"\n  ''', '''\n    [stdin]:1:5: error: unexpected end of interpolation\n    \"#{!}\"\n        ^\n  '''\n  assertErrorFormat '''\n    \"#{not}\"\n  ''', '''\n    [stdin]:1:7: error: unexpected end of interpolation\n    \"#{not}\"\n          ^\n  '''\n  assertErrorFormat '''\n    \"#{5) + (4}_\"\n  ''', '''\n    [stdin]:1:5: error: unmatched )\n    \"#{5) + (4}_\"\n        ^\n  '''\n  # #2918\n  assertErrorFormat '''\n    \"#{foo.}\"\n  ''', '''\n    [stdin]:1:8: error: unexpected end of interpolation\n    \"#{foo.}\"\n           ^\n  '''\n\ntest \"#3325: implicit indentation errors\", ->\n  assertErrorFormat '''\n    i for i in a then i\n  ''', '''\n    [stdin]:1:14: error: unexpected then\n    i for i in a then i\n                 ^^^^\n  '''\n\ntest \"explicit indentation errors\", ->\n  assertErrorFormat '''\n    a = b\n      c\n  ''', '''\n    [stdin]:2:1: error: unexpected indentation\n      c\n    ^^\n  '''\n\ntest \"unclosed strings\", ->\n  assertErrorFormat '''\n    '\n  ''', '''\n    [stdin]:1:1: error: missing '\n    '\n    ^\n  '''\n  assertErrorFormat '''\n    \"\n  ''', '''\n    [stdin]:1:1: error: missing \"\n    \"\n    ^\n  '''\n  assertErrorFormat \"\"\"\n    '''\n  \"\"\", \"\"\"\n    [stdin]:1:1: error: missing '''\n    '''\n    ^^^\n  \"\"\"\n  assertErrorFormat '''\n    \"\"\"\n  ''', '''\n    [stdin]:1:1: error: missing \"\"\"\n    \"\"\"\n    ^^^\n  '''\n  assertErrorFormat '''\n    \"#{\"\n  ''', '''\n    [stdin]:1:4: error: missing \"\n    \"#{\"\n       ^\n  '''\n  assertErrorFormat '''\n    \"\"\"#{\"\n  ''', '''\n    [stdin]:1:6: error: missing \"\n    \"\"\"#{\"\n         ^\n  '''\n  assertErrorFormat '''\n    \"#{\"\"\"\n  ''', '''\n    [stdin]:1:4: error: missing \"\"\"\n    \"#{\"\"\"\n       ^^^\n  '''\n  assertErrorFormat '''\n    \"\"\"#{\"\"\"\n  ''', '''\n    [stdin]:1:6: error: missing \"\"\"\n    \"\"\"#{\"\"\"\n         ^^^\n  '''\n  assertErrorFormat '''\n    ///#{\"\"\"\n  ''', '''\n    [stdin]:1:6: error: missing \"\"\"\n    ///#{\"\"\"\n         ^^^\n  '''\n  assertErrorFormat '''\n    \"a\n      #{foo \"\"\"\n        bar\n          #{ +'12 }\n        baz\n        \"\"\"} b\"\n  ''', '''\n    [stdin]:4:11: error: missing '\n          #{ +'12 }\n              ^\n  '''\n  # https://github.com/jashkenas/coffeescript/issues/3301#issuecomment-31735168\n  assertErrorFormat '''\n    # Note the double escaping; this would be `\"\"\"a\\\"\"\"` real code.\n    \"\"\"a\\\\\"\"\"\n  ''', '''\n    [stdin]:2:1: error: missing \"\"\"\n    \"\"\"a\\\\\"\"\"\n    ^^^\n  '''\n\ntest \"unclosed heregexes\", ->\n  assertErrorFormat '''\n    ///\n  ''', '''\n    [stdin]:1:1: error: missing ///\n    ///\n    ^^^\n  '''\n  # https://github.com/jashkenas/coffeescript/issues/3301#issuecomment-31735168\n  assertErrorFormat '''\n    # Note the double escaping; this would be `///a\\///` real code.\n    ///a\\\\///\n  ''', '''\n    [stdin]:2:1: error: missing ///\n    ///a\\\\///\n    ^^^\n  '''\n\ntest \"unexpected token after string\", ->\n  # Parsing error.\n  assertErrorFormat '''\n    'foo'bar\n  ''', '''\n    [stdin]:1:6: error: unexpected identifier\n    'foo'bar\n         ^^^\n  '''\n  assertErrorFormat '''\n    \"foo\"bar\n  ''', '''\n    [stdin]:1:6: error: unexpected identifier\n    \"foo\"bar\n         ^^^\n  '''\n  # Lexing error.\n  assertErrorFormat '''\n    'foo'bar'\n  ''', '''\n    [stdin]:1:9: error: missing '\n    'foo'bar'\n            ^\n  '''\n  assertErrorFormat '''\n    \"foo\"bar\"\n  ''', '''\n    [stdin]:1:9: error: missing \"\n    \"foo\"bar\"\n            ^\n  '''\n\ntest \"#3348: Location data is wrong in interpolations with leading whitespace\", ->\n  assertErrorFormat '''\n    \"#{ * }\"\n  ''', '''\n    [stdin]:1:5: error: unexpected *\n    \"#{ * }\"\n        ^\n  '''\n\ntest \"octal escapes\", ->\n  assertErrorFormat '''\n    \"a\\\\0\\\\tb\\\\\\\\\\\\07c\"\n  ''', '''\n    [stdin]:1:10: error: octal escape sequences are not allowed \\\\07\n    \"a\\\\0\\\\tb\\\\\\\\\\\\07c\"\n      \\  \\   \\ \\ ^\\^^\n  '''\n  assertErrorFormat '''\n    \"a\n      #{b} \\\\1\"\n  ''', '''\n    [stdin]:2:8: error: octal escape sequences are not allowed \\\\1\n      #{b} \\\\1\"\n           ^\\^\n  '''\n  assertErrorFormat '''\n    /a\\\\0\\\\tb\\\\\\\\\\\\07c/\n  ''', '''\n    [stdin]:1:10: error: octal escape sequences are not allowed \\\\07\n    /a\\\\0\\\\tb\\\\\\\\\\\\07c/\n      \\  \\   \\ \\ ^\\^^\n  '''\n  assertErrorFormat '''\n    /a\\\\1\\\\tb\\\\\\\\\\\\07c/\n  ''', '''\n    [stdin]:1:10: error: octal escape sequences are not allowed \\\\07\n    /a\\\\1\\\\tb\\\\\\\\\\\\07c/\n      \\  \\   \\ \\ ^\\^^\n  '''\n  assertErrorFormat '''\n    ///a\n      #{b} \\\\01///\n  ''', '''\n    [stdin]:2:8: error: octal escape sequences are not allowed \\\\01\n      #{b} \\\\01///\n           ^\\^^\n  '''\n\ntest \"#3795: invalid escapes\", ->\n  assertErrorFormat '''\n    \"a\\\\0\\\\tb\\\\\\\\\\\\x7g\"\n  ''', '''\n    [stdin]:1:10: error: invalid escape sequence \\\\x7g\n    \"a\\\\0\\\\tb\\\\\\\\\\\\x7g\"\n      \\  \\   \\ \\ ^\\^^^\n  '''\n  assertErrorFormat '''\n    \"a\n      #{b} \\\\uA02\n     c\"\n  ''', '''\n    [stdin]:2:8: error: invalid escape sequence \\\\uA02\n      #{b} \\\\uA02\n           ^\\^^^^\n  '''\n  assertErrorFormat '''\n    /a\\\\u002space/\n  ''', '''\n    [stdin]:1:3: error: invalid escape sequence \\\\u002s\n    /a\\\\u002space/\n      ^\\^^^^^\n  '''\n  assertErrorFormat '''\n    ///a \\\\u002 0 space///\n  ''', '''\n    [stdin]:1:6: error: invalid escape sequence \\\\u002 \\n\\\n    ///a \\\\u002 0 space///\n         ^\\^^^^^\n  '''\n  assertErrorFormat '''\n    ///a\n      #{b} \\\\x0\n     c///\n  ''', '''\n    [stdin]:2:8: error: invalid escape sequence \\\\x0\n      #{b} \\\\x0\n           ^\\^^\n  '''\n  assertErrorFormat '''\n    /ab\\\\u/\n  ''', '''\n    [stdin]:1:4: error: invalid escape sequence \\\\u\n    /ab\\\\u/\n       ^\\^\n  '''\n\ntest \"illegal herecomment\", ->\n  assertErrorFormat '''\n    ###\n      Regex: /a*/g\n    ###\n  ''', '''\n    [stdin]:2:12: error: block comments cannot contain */\n      Regex: /a*/g\n               ^^\n  '''\n\ntest \"#1724: regular expressions beginning with *\", ->\n  assertErrorFormat '''\n    /* foo/\n  ''', '''\n    [stdin]:1:2: error: regular expressions cannot begin with *\n    /* foo/\n     ^\n  '''\n  assertErrorFormat '''\n    ///\n      * foo\n    ///\n  ''', '''\n    [stdin]:2:3: error: regular expressions cannot begin with *\n      * foo\n      ^\n  '''\n\ntest \"invalid regex flags\", ->\n  assertErrorFormat '''\n    /a/ii\n  ''', '''\n    [stdin]:1:4: error: invalid regular expression flags ii\n    /a/ii\n       ^^\n  '''\n  assertErrorFormat '''\n    /a/G\n  ''', '''\n    [stdin]:1:4: error: invalid regular expression flags G\n    /a/G\n       ^\n  '''\n  assertErrorFormat '''\n    /a/gimi\n  ''', '''\n    [stdin]:1:4: error: invalid regular expression flags gimi\n    /a/gimi\n       ^^^^\n  '''\n  assertErrorFormat '''\n    /a/g_\n  ''', '''\n    [stdin]:1:4: error: invalid regular expression flags g_\n    /a/g_\n       ^^\n  '''\n  assertErrorFormat '''\n    ///a///ii\n  ''', '''\n    [stdin]:1:8: error: invalid regular expression flags ii\n    ///a///ii\n           ^^\n  '''\n  doesNotThrow -> CoffeeScript.compile '/a/ymgi'\n\ntest \"missing `)`, `}`, `]`\", ->\n  assertErrorFormat '''\n    (\n  ''', '''\n    [stdin]:1:1: error: missing )\n    (\n    ^\n  '''\n  assertErrorFormat '''\n    {\n  ''', '''\n    [stdin]:1:1: error: missing }\n    {\n    ^\n  '''\n  assertErrorFormat '''\n    [\n  ''', '''\n    [stdin]:1:1: error: missing ]\n    [\n    ^\n  '''\n  assertErrorFormat '''\n    obj = {a: [1, (2+\n  ''', '''\n    [stdin]:1:15: error: missing )\n    obj = {a: [1, (2+\n                  ^\n  '''\n  assertErrorFormat '''\n    \"#{\n  ''', '''\n    [stdin]:1:3: error: missing }\n    \"#{\n      ^\n  '''\n  assertErrorFormat '''\n    \"\"\"\n      foo#{ bar \"#{1}\"\n  ''', '''\n    [stdin]:2:7: error: missing }\n      foo#{ bar \"#{1}\"\n          ^\n  '''\n\ntest \"unclosed regexes\", ->\n  assertErrorFormat '''\n    /\n  ''', '''\n    [stdin]:1:1: error: missing / (unclosed regex)\n    /\n    ^\n  '''\n  assertErrorFormat '''\n    # Note the double escaping; this would be `/a\\/` real code.\n    /a\\\\/\n  ''', '''\n    [stdin]:2:1: error: missing / (unclosed regex)\n    /a\\\\/\n    ^\n  '''\n  assertErrorFormat '''\n    /// ^\n      a #{\"\"\" \"\"#{if /[/].test \"|\" then 1 else 0}\"\" \"\"\"}\n    ///\n  ''', '''\n    [stdin]:2:18: error: missing / (unclosed regex)\n      a #{\"\"\" \"\"#{if /[/].test \"|\" then 1 else 0}\"\" \"\"\"}\n                     ^\n  '''\n\ntest \"duplicate function arguments\", ->\n  assertErrorFormat '''\n    (foo, bar, foo) ->\n  ''', '''\n    [stdin]:1:12: error: multiple parameters named foo\n    (foo, bar, foo) ->\n               ^^^\n  '''\n  assertErrorFormat '''\n    (@foo, bar, @foo) ->\n  ''', '''\n    [stdin]:1:13: error: multiple parameters named @foo\n    (@foo, bar, @foo) ->\n                ^^^^\n  '''\n\ntest \"reserved words\", ->\n  assertErrorFormat '''\n    case\n  ''', '''\n    [stdin]:1:1: error: reserved word 'case'\n    case\n    ^^^^\n  '''\n  assertErrorFormat '''\n    case = 1\n  ''', '''\n    [stdin]:1:1: error: reserved word 'case'\n    case = 1\n    ^^^^\n  '''\n  assertErrorFormat '''\n    for = 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'for' can't be assigned\n    for = 1\n    ^^^\n  '''\n  assertErrorFormat '''\n    unless = 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'unless' can't be assigned\n    unless = 1\n    ^^^^^^\n  '''\n  assertErrorFormat '''\n    for += 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'for' can't be assigned\n    for += 1\n    ^^^\n  '''\n  assertErrorFormat '''\n    for &&= 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'for' can't be assigned\n    for &&= 1\n    ^^^\n  '''\n  # Make sure token look-behind doesn't go out of range.\n  assertErrorFormat '''\n    &&= 1\n  ''', '''\n    [stdin]:1:1: error: unexpected &&=\n    &&= 1\n    ^^^\n  '''\n  # #2306: Show unaliased name in error messages.\n  assertErrorFormat '''\n    on = 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'on' can't be assigned\n    on = 1\n    ^^\n  '''\n\ntest \"strict mode errors\", ->\n  assertErrorFormat '''\n    eval = 1\n  ''', '''\n    [stdin]:1:1: error: 'eval' can't be assigned\n    eval = 1\n    ^^^^\n  '''\n  assertErrorFormat '''\n    class eval\n  ''', '''\n    [stdin]:1:7: error: 'eval' can't be assigned\n    class eval\n          ^^^^\n  '''\n  assertErrorFormat '''\n    arguments++\n  ''', '''\n    [stdin]:1:1: error: 'arguments' can't be assigned\n    arguments++\n    ^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    --arguments\n  ''', '''\n    [stdin]:1:3: error: 'arguments' can't be assigned\n    --arguments\n      ^^^^^^^^^\n  '''\n\ntest \"invalid numbers\", ->\n  assertErrorFormat '''\n    0X0\n  ''', '''\n    [stdin]:1:2: error: radix prefix in '0X0' must be lowercase\n    0X0\n     ^\n  '''\n  assertErrorFormat '''\n    10E0\n  ''', '''\n    [stdin]:1:3: error: exponential notation in '10E0' must be indicated with a lowercase 'e'\n    10E0\n      ^\n  '''\n  assertErrorFormat '''\n    018\n  ''', '''\n    [stdin]:1:1: error: decimal literal '018' must not be prefixed with '0'\n    018\n    ^^^\n  '''\n  assertErrorFormat '''\n    010\n  ''', '''\n    [stdin]:1:1: error: octal literal '010' must be prefixed with '0o'\n    010\n    ^^^\n'''\n\ntest \"unexpected object keys\", ->\n  assertErrorFormat '''\n    {[[]]}\n  ''', '''\n    [stdin]:1:2: error: unexpected [\n    {[[]]}\n     ^\n  '''\n  assertErrorFormat '''\n    {[[]]: 1}\n  ''', '''\n    [stdin]:1:2: error: unexpected [\n    {[[]]: 1}\n     ^\n  '''\n  assertErrorFormat '''\n    [[]]: 1\n  ''', '''\n    [stdin]:1:1: error: unexpected [\n    [[]]: 1\n    ^\n  '''\n  assertErrorFormat '''\n    {(a + \"b\")}\n  ''', '''\n    [stdin]:1:2: error: unexpected (\n    {(a + \"b\")}\n     ^\n  '''\n  assertErrorFormat '''\n    {(a + \"b\"): 1}\n  ''', '''\n    [stdin]:1:2: error: unexpected (\n    {(a + \"b\"): 1}\n     ^\n  '''\n  assertErrorFormat '''\n    (a + \"b\"): 1\n  ''', '''\n    [stdin]:1:1: error: unexpected (\n    (a + \"b\"): 1\n    ^\n  '''\n  assertErrorFormat '''\n    a: 1, [[]]: 2\n  ''', '''\n    [stdin]:1:7: error: unexpected [\n    a: 1, [[]]: 2\n          ^\n  '''\n  assertErrorFormat '''\n    {a: 1, [[]]: 2}\n  ''', '''\n    [stdin]:1:8: error: unexpected [\n    {a: 1, [[]]: 2}\n           ^\n  '''\n\ntest \"invalid object keys\", ->\n  assertErrorFormat '''\n    @a: 1\n  ''', '''\n    [stdin]:1:1: error: invalid object key\n    @a: 1\n    ^^\n  '''\n  assertErrorFormat '''\n    f\n      @a: 1\n  ''', '''\n    [stdin]:2:3: error: invalid object key\n      @a: 1\n      ^^\n  '''\n  assertErrorFormat '''\n    {a=2}\n  ''', '''\n    [stdin]:1:3: error: unexpected =\n    {a=2}\n      ^\n  '''\n\ntest \"invalid destructuring default target\", ->\n  assertErrorFormat '''\n    {'a' = 2} = obj\n  ''', '''\n    [stdin]:1:6: error: unexpected =\n    {'a' = 2} = obj\n         ^\n  '''\n\ntest \"#4070: lone expansion\", ->\n  assertErrorFormat '''\n    [...] = a\n  ''', '''\n    [stdin]:1:2: error: Destructuring assignment has no target\n    [...] = a\n     ^^^\n  '''\n  assertErrorFormat '''\n    [ ..., ] = a\n  ''', '''\n    [stdin]:1:3: error: Destructuring assignment has no target\n    [ ..., ] = a\n      ^^^\n  '''\n\ntest \"#3926: implicit object in parameter list\", ->\n  assertErrorFormat '''\n    (a: b) ->\n  ''', '''\n    [stdin]:1:3: error: unexpected :\n    (a: b) ->\n      ^\n  '''\n  assertErrorFormat '''\n    (one, two, {three, four: five}, key: value) ->\n  ''', '''\n    [stdin]:1:36: error: unexpected :\n    (one, two, {three, four: five}, key: value) ->\n                                       ^\n  '''\n\ntest \"#4130: unassignable in destructured param\", ->\n  assertErrorFormat '''\n    fun = ({\n      @param : null\n    }) ->\n      console.log \"Oh hello!\"\n  ''', '''\n    [stdin]:2:12: error: keyword 'null' can't be assigned\n      @param : null\n               ^^^^\n  '''\n  assertErrorFormat '''\n    ({a: null}) ->\n  ''', '''\n    [stdin]:1:6: error: keyword 'null' can't be assigned\n    ({a: null}) ->\n         ^^^^\n  '''\n  assertErrorFormat '''\n    ({a: 1}) ->\n  ''', '''\n    [stdin]:1:6: error: '1' can't be assigned\n    ({a: 1}) ->\n         ^\n  '''\n  assertErrorFormat '''\n    ({1}) ->\n  ''', '''\n    [stdin]:1:3: error: '1' can't be assigned\n    ({1}) ->\n      ^\n  '''\n  assertErrorFormat '''\n    ({a: true = 1}) ->\n  ''', '''\n    [stdin]:1:6: error: keyword 'true' can't be assigned\n    ({a: true = 1}) ->\n         ^^^^\n  '''\n\ntest \"`yield` outside of a function\", ->\n  assertErrorFormat '''\n    yield 1\n  ''', '''\n    [stdin]:1:1: error: yield can only occur inside functions\n    yield 1\n    ^^^^^^^\n  '''\n  assertErrorFormat '''\n    yield return\n  ''', '''\n    [stdin]:1:1: error: yield can only occur inside functions\n    yield return\n    ^^^^^^^^^^^^\n  '''\n\ntest \"#4097: `yield return` as an expression\", ->\n  assertErrorFormat '''\n    -> (yield return)\n  ''', '''\n    [stdin]:1:5: error: cannot use a pure statement in an expression\n    -> (yield return)\n        ^^^^^^^^^^^^\n  '''\n\ntest \"`&&=` and `||=` with a space in-between\", ->\n  assertErrorFormat '''\n    a = 0\n    a && = 1\n  ''', '''\n    [stdin]:2:6: error: unexpected =\n    a && = 1\n         ^\n  '''\n  assertErrorFormat '''\n    a = 0\n    a and = 1\n  ''', '''\n    [stdin]:2:7: error: unexpected =\n    a and = 1\n          ^\n  '''\n  assertErrorFormat '''\n    a = 0\n    a || = 1\n  ''', '''\n    [stdin]:2:6: error: unexpected =\n    a || = 1\n         ^\n  '''\n  assertErrorFormat '''\n    a = 0\n    a or = 1\n  ''', '''\n    [stdin]:2:6: error: unexpected =\n    a or = 1\n         ^\n  '''\n\ntest \"anonymous functions cannot be exported\", ->\n  assertErrorFormat '''\n    export ->\n      console.log 'hello, world!'\n  ''', '''\n    [stdin]:1:8: error: unexpected ->\n    export ->\n           ^^\n  '''\n\ntest \"anonymous classes cannot be exported\", ->\n  assertErrorFormat '''\n    export class\n      constructor: ->\n        console.log 'hello, world!'\n  ''', '''\n    [stdin]:1:8: error: anonymous classes cannot be exported\n    export class\n           ^^^^^\n  '''\n\ntest \"unless enclosed by curly braces, only * can be aliased\", ->\n  assertErrorFormat '''\n    import foo as bar from 'lib'\n  ''', '''\n    [stdin]:1:12: error: unexpected as\n    import foo as bar from 'lib'\n               ^^\n  '''\n\ntest \"unwrapped imports must follow constrained syntax\", ->\n  assertErrorFormat '''\n    import foo, bar from 'lib'\n  ''', '''\n    [stdin]:1:13: error: unexpected identifier\n    import foo, bar from 'lib'\n                ^^^\n  '''\n  assertErrorFormat '''\n    import foo, bar, baz from 'lib'\n  ''', '''\n    [stdin]:1:13: error: unexpected identifier\n    import foo, bar, baz from 'lib'\n                ^^^\n  '''\n  assertErrorFormat '''\n    import foo, bar as baz from 'lib'\n  ''', '''\n    [stdin]:1:13: error: unexpected identifier\n    import foo, bar as baz from 'lib'\n                ^^^\n  '''\n\ntest \"cannot export * without a module to export from\", ->\n  assertErrorFormat '''\n    export *\n  ''', '''\n    [stdin]:1:9: error: unexpected end of input\n    export *\n            ^\n  '''\n\ntest \"imports and exports must be top-level\", ->\n  assertErrorFormat '''\n    if foo\n      import { bar } from 'lib'\n  ''', '''\n    [stdin]:2:3: error: import statements must be at top-level scope\n      import { bar } from 'lib'\n      ^^^^^^^^^^^^^^^^^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    foo = ->\n      export { bar }\n  ''', '''\n    [stdin]:2:3: error: export statements must be at top-level scope\n      export { bar }\n      ^^^^^^^^^^^^^^\n  '''\n\ntest \"cannot import the same member more than once\", ->\n  assertErrorFormat '''\n    import { foo, foo } from 'lib'\n  ''', '''\n    [stdin]:1:15: error: 'foo' has already been declared\n    import { foo, foo } from 'lib'\n                  ^^^\n  '''\n  assertErrorFormat '''\n    import { foo, bar, foo } from 'lib'\n  ''', '''\n    [stdin]:1:20: error: 'foo' has already been declared\n    import { foo, bar, foo } from 'lib'\n                       ^^^\n  '''\n  assertErrorFormat '''\n    import { foo, bar as foo } from 'lib'\n  ''', '''\n    [stdin]:1:15: error: 'foo' has already been declared\n    import { foo, bar as foo } from 'lib'\n                  ^^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    import foo, { foo } from 'lib'\n  ''', '''\n    [stdin]:1:15: error: 'foo' has already been declared\n    import foo, { foo } from 'lib'\n                  ^^^\n  '''\n  assertErrorFormat '''\n    import foo, { bar as foo } from 'lib'\n  ''', '''\n    [stdin]:1:15: error: 'foo' has already been declared\n    import foo, { bar as foo } from 'lib'\n                  ^^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    import foo from 'libA'\n    import foo from 'libB'\n  ''', '''\n    [stdin]:2:8: error: 'foo' has already been declared\n    import foo from 'libB'\n           ^^^\n  '''\n  assertErrorFormat '''\n    import * as foo from 'libA'\n    import { foo } from 'libB'\n  ''', '''\n    [stdin]:2:10: error: 'foo' has already been declared\n    import { foo } from 'libB'\n             ^^^\n  '''\n\ntest \"imported members cannot be reassigned\", ->\n  assertErrorFormat '''\n    import { foo } from 'lib'\n    foo = 'bar'\n  ''', '''\n    [stdin]:2:1: error: 'foo' is read-only\n    foo = 'bar'\n    ^^^\n  '''\n  assertErrorFormat '''\n    import { foo } from 'lib'\n    export default foo = 'bar'\n  ''', '''\n    [stdin]:2:16: error: 'foo' is read-only\n    export default foo = 'bar'\n                   ^^^\n  '''\n  assertErrorFormat '''\n    import { foo } from 'lib'\n    export foo = 'bar'\n  ''', '''\n    [stdin]:2:8: error: 'foo' is read-only\n    export foo = 'bar'\n           ^^^\n  '''\n\ntest \"CoffeeScript keywords cannot be used as unaliased names in import lists\", ->\n  assertErrorFormat \"\"\"\n    import { unless, baz as bar } from 'lib'\n    bar.barMethod()\n  \"\"\", '''\n    [stdin]:1:10: error: unexpected unless\n    import { unless, baz as bar } from 'lib'\n             ^^^^^^\n  '''\n\ntest \"CoffeeScript keywords cannot be used as local names in import list aliases\", ->\n  assertErrorFormat \"\"\"\n    import { bar as unless, baz as bar } from 'lib'\n    bar.barMethod()\n  \"\"\", '''\n    [stdin]:1:17: error: unexpected unless\n    import { bar as unless, baz as bar } from 'lib'\n                    ^^^^^^\n  '''\n\ntest \"indexes are not supported in for-from loops\", ->\n  assertErrorFormat \"x for x, i from [1, 2, 3]\", '''\n    [stdin]:1:10: error: cannot use index with for-from\n    x for x, i from [1, 2, 3]\n             ^\n  '''\n\ntest \"own is not supported in for-from loops\", ->\n  assertErrorFormat \"x for own x from [1, 2, 3]\", '''\n    [stdin]:1:7: error: cannot use own with for-from\n    x for own x from [1, 2, 3]\n          ^^^\n    '''\n\ntest \"tagged template literals must be called by an identifier\", ->\n  assertErrorFormat \"1''\", '''\n    [stdin]:1:1: error: literal is not a function\n    1''\n    ^\n  '''\n  assertErrorFormat '1\"\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"\"\n    ^\n  '''\n  assertErrorFormat \"1'b'\", '''\n    [stdin]:1:1: error: literal is not a function\n    1'b'\n    ^\n  '''\n  assertErrorFormat '1\"b\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"b\"\n    ^\n  '''\n  assertErrorFormat \"1'''b'''\", \"\"\"\n    [stdin]:1:1: error: literal is not a function\n    1'''b'''\n    ^\n  \"\"\"\n  assertErrorFormat '1\"\"\"b\"\"\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"\"\"b\"\"\"\n    ^\n  '''\n  assertErrorFormat '1\"#{b}\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"#{b}\"\n    ^\n  '''\n  assertErrorFormat '1\"\"\"#{b}\"\"\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"\"\"#{b}\"\"\"\n    ^\n  '''\n\ntest \"can't use pattern matches for loop indices\", ->\n  assertErrorFormat 'a for b, {c} in d', '''\n    [stdin]:1:10: error: index cannot be a pattern matching expression\n    a for b, {c} in d\n             ^^^\n  '''\n\ntest \"#4248: Unicode code point escapes\", ->\n  assertErrorFormat '''\n    \"a\n      #{b} \\\\u{G02}\n     c\"\n  ''', '''\n    [stdin]:2:8: error: invalid escape sequence \\\\u{G02}\n      #{b} \\\\u{G02}\n           ^\\^^^^^^\n  '''\n  assertErrorFormat '''\n    /a\\\\u{}b/\n  ''', '''\n    [stdin]:1:3: error: invalid escape sequence \\\\u{}\n    /a\\\\u{}b/\n      ^\\^^^\n  '''\n  assertErrorFormat '''\n    ///a \\\\u{01abc///\n  ''', '''\n    [stdin]:1:6: error: invalid escape sequence \\\\u{01abc\n    ///a \\\\u{01abc///\n         ^\\^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    /\\\\u{123} \\\\u{110000}/\n  ''', '''\n    [stdin]:1:10: error: unicode code point escapes greater than \\\\u{10ffff} are not allowed\n    /\\\\u{123} \\\\u{110000}/\n      \\       ^\\^^^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    ///abc\\\\\\\\\\\\u{123456}///u\n  ''', '''\n    [stdin]:1:9: error: unicode code point escapes greater than \\\\u{10ffff} are not allowed\n    ///abc\\\\\\\\\\\\u{123456}///u\n           \\ \\^\\^^^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    \"\"\"\n      \\\\u{123}\n      a\n        \\\\u{00110000}\n      #{ 'b' }\n    \"\"\"\n  ''', '''\n    [stdin]:4:5: error: unicode code point escapes greater than \\\\u{10ffff} are not allowed\n        \\\\u{00110000}\n        ^\\^^^^^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    '\\\\u{a}\\\\u{1111110000}'\n  ''', '''\n    [stdin]:1:7: error: unicode code point escapes greater than \\\\u{10ffff} are not allowed\n    '\\\\u{a}\\\\u{1111110000}'\n      \\    ^\\^^^^^^^^^^^^^\n  '''\n\ntest \"#4283: error message for implicit call\", ->\n  assertErrorFormat '''\n    console.log {search, users, contacts users_to_display}\n  ''', '''\n    [stdin]:1:29: error: unexpected implicit function call\n    console.log {search, users, contacts users_to_display}\n                                ^^^^^^^^\n  '''\n\ntest \"#3199: error message for call indented non-object\", ->\n  assertErrorFormat '''\n    fn = ->\n    fn\n      1\n  ''', '''\n    [stdin]:3:1: error: unexpected indentation\n      1\n    ^^\n  '''\n\ntest \"#3199: error message for call indented comprehension\", ->\n  assertErrorFormat '''\n    fn = ->\n    fn\n      x for x in [1, 2, 3]\n  ''', '''\n    [stdin]:3:1: error: unexpected indentation\n      x for x in [1, 2, 3]\n    ^^\n  '''\n\ntest \"#3199: error message for return indented non-object\", ->\n  assertErrorFormat '''\n    return\n      1\n  ''', '''\n    [stdin]:2:3: error: unexpected number\n      1\n      ^\n  '''\n\ntest \"#3199: error message for return indented comprehension\", ->\n  assertErrorFormat '''\n    return\n      x for x in [1, 2, 3]\n  ''', '''\n    [stdin]:2:3: error: unexpected identifier\n      x for x in [1, 2, 3]\n      ^\n  '''\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"eval\">\nif vm = require? 'vm'\n\n  test \"CoffeeScript.eval runs in the global context by default\", ->\n    global.punctuation = '!'\n    code = '''\n    global.fhqwhgads = \"global superpower#{global.punctuation}\"\n    '''\n    result = CoffeeScript.eval code\n    eq result, 'global superpower!'\n    eq fhqwhgads, 'global superpower!'\n\n  test \"CoffeeScript.eval can run in, and modify, a Script context sandbox\", ->\n    createContext = vm.Script.createContext ? vm.createContext\n    sandbox = createContext()\n    sandbox.foo = 'bar'\n    code = '''\n    global.foo = 'not bar!'\n    '''\n    result = CoffeeScript.eval code, {sandbox}\n    eq result, 'not bar!'\n    eq sandbox.foo, 'not bar!'\n\n  test \"CoffeeScript.eval can run in, but cannot modify, an ordinary object sandbox\", ->\n    sandbox = {foo: 'bar'}\n    code = '''\n    global.foo = 'not bar!'\n    '''\n    result = CoffeeScript.eval code, {sandbox}\n    eq result, 'not bar!'\n    eq sandbox.foo, 'bar'\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"exception_handling\">\n# Exception Handling\n# ------------------\n\n# shared nonce\nnonce = {}\n\n\n# Throw\n\ntest \"basic exception throwing\", ->\n  throws (-> throw 'error'), 'error'\n\n\n# Empty Try/Catch/Finally\n\ntest \"try can exist alone\", ->\n  try\n\ntest \"try/catch with empty try, empty catch\", ->\n  try\n    # nothing\n  catch err\n    # nothing\n\ntest \"single-line try/catch with empty try, empty catch\", ->\n  try catch err\n\ntest \"try/finally with empty try, empty finally\", ->\n  try\n    # nothing\n  finally\n    # nothing\n\ntest \"single-line try/finally with empty try, empty finally\", ->\n  try finally\n\ntest \"try/catch/finally with empty try, empty catch, empty finally\", ->\n  try\n  catch err\n  finally\n\ntest \"single-line try/catch/finally with empty try, empty catch, empty finally\", ->\n  try catch err then finally\n\n\n# Try/Catch/Finally as an Expression\n\ntest \"return the result of try when no exception is thrown\", ->\n  result = try\n    nonce\n  catch err\n    undefined\n  finally\n    undefined\n  eq nonce, result\n\ntest \"single-line result of try when no exception is thrown\", ->\n  result = try nonce catch err then undefined\n  eq nonce, result\n\ntest \"return the result of catch when an exception is thrown\", ->\n  fn = ->\n    try\n      throw ->\n    catch err\n      nonce\n  doesNotThrow fn\n  eq nonce, fn()\n\ntest \"single-line result of catch when an exception is thrown\", ->\n  fn = ->\n    try throw (->) catch err then nonce\n  doesNotThrow fn\n  eq nonce, fn()\n\ntest \"optional catch\", ->\n  fn = ->\n    try throw ->\n    nonce\n  doesNotThrow fn\n  eq nonce, fn()\n\n\n# Try/Catch/Finally Interaction With Other Constructs\n\ntest \"try/catch with empty catch as last statement in a function body\", ->\n  fn = ->\n    try nonce\n    catch err\n  eq nonce, fn()\n\n\n# Catch leads to broken scoping: #1595\n\ntest \"try/catch with a reused variable name.\", ->\n  do ->\n    try\n      inner = 5\n    catch inner\n      # nothing\n  eq typeof inner, 'undefined'\n\n\n# Allowed to destructure exceptions: #2580\n\ntest \"try/catch with destructuring the exception object\", ->\n\n  result = try\n    missing.object\n  catch {message}\n    message\n\n  eq message, 'missing is not defined'\n\n\n\ntest \"Try catch finally as implicit arguments\", ->\n  first = (x) -> x\n\n  foo = no\n  try\n    first try iamwhoiam() finally foo = yes\n  catch e\n  eq foo, yes\n\n  bar = no\n  try\n    first try iamwhoiam() catch e finally\n    bar = yes\n  catch e\n  eq bar, yes\n\n# Catch Should Not Require Param: #2900\ntest \"parameter-less catch clause\", ->\n  try\n    throw new Error 'failed'\n  catch\n    ok true\n\n  try throw new Error 'failed' catch finally ok true\n\n  ok try throw new Error 'failed' catch then true\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"formatting\">\n# Formatting\n# ----------\n\n# TODO: maybe this file should be split up into their respective sections:\n#   operators -> operators\n#   array literals -> array literals\n#   string literals -> string literals\n#   function invocations -> function invocations\n\ndoesNotThrow -> CoffeeScript.compile \"a = then b\"\n\ntest \"multiple semicolon-separated statements in parentheticals\", ->\n  nonce = {}\n  eq nonce, (1; 2; nonce)\n  eq nonce, (-> return (1; 2; nonce))()\n\n# * Line Continuation\n#   * Property Accesss\n#   * Operators\n#   * Array Literals\n#   * Function Invocations\n#   * String Literals\n\n# Property Access\n\ntest \"chained accesses split on period/newline, backwards and forwards\", ->\n  str = 'abc'\n  result = str.\n    split('').\n    reverse().\n    reverse().\n    reverse()\n  arrayEq ['c','b','a'], result\n  arrayEq ['c','b','a'], str.\n    split('').\n    reverse().\n    reverse().\n    reverse()\n  result = str\n    .split('')\n    .reverse()\n    .reverse()\n    .reverse()\n  arrayEq ['c','b','a'], result\n  arrayEq ['c','b','a'],\n    str\n    .split('')\n    .reverse()\n    .reverse()\n    .reverse()\n  arrayEq ['c','b','a'],\n    str.\n    split('')\n    .reverse().\n    reverse()\n    .reverse()\n\n# Operators\n\ntest \"newline suppression for operators\", ->\n  six =\n    1 +\n    2 +\n    3\n  eq 6, six\n\ntest \"`?.` and `::` should continue lines\", ->\n  ok not (\n    Date\n    ::\n    ?.foo\n  )\n  #eq Object::toString, Date?.\n  #prototype\n  #::\n  #?.foo\n\ndoesNotThrow -> CoffeeScript.compile \"\"\"\n  oh. yes\n  oh?. true\n  oh:: return\n  \"\"\"\n\ndoesNotThrow -> CoffeeScript.compile \"\"\"\n  a?[b..]\n  a?[...b]\n  a?[b..c]\n  \"\"\"\n\n# Array Literals\n\ntest \"indented array literals don't trigger whitespace rewriting\", ->\n  getArgs = -> arguments\n  result = getArgs(\n    [[[[[],\n                  []],\n                [[]]]],\n      []])\n  eq 1, result.length\n\n# Function Invocations\n\ndoesNotThrow -> CoffeeScript.compile \"\"\"\n  obj = then fn 1,\n    1: 1\n    a:\n      b: ->\n        fn c,\n          d: e\n    f: 1\n  \"\"\"\n\n# String Literals\n\ntest \"indented heredoc\", ->\n  result = ((_) -> _)(\n                \"\"\"\n                abc\n                \"\"\")\n  eq \"abc\", result\n\n# Chaining - all open calls are closed by property access starting a new line\n# * chaining after\n#   * indented argument\n#   * function block\n#   * indented object\n#\n#   * single line arguments\n#   * inline function literal\n#   * inline object literal\n#\n# * chaining inside\n#   * implicit object literal\n\ntest \"chaining after outdent\", ->\n  id = (x) -> x\n\n  # indented argument\n  ff = id parseInt \"ff\",\n    16\n  .toString()\n  eq '255', ff\n\n  # function block\n  str = 'abc'\n  zero = parseInt str.replace /\\w/, (letter) ->\n    0\n  .toString()\n  eq '0', zero\n\n  # indented object\n  a = id id\n    a: 1\n  .a\n  eq 1, a\n\ntest \"#1495, method call chaining\", ->\n  str = 'abc'\n\n  result = str.split ''\n              .join ', '\n  eq 'a, b, c', result\n\n  result = str\n  .split ''\n  .join ', '\n  eq 'a, b, c', result\n\n  eq 'a, b, c', (str\n    .split ''\n    .join ', '\n  )\n\n  eq 'abc',\n    'aaabbbccc'.replace /(\\w)\\1\\1/g, '$1$1'\n               .replace /([abc])\\1/g, '$1'\n\n  # Nested calls\n  result = [1..3]\n    .slice Math.max 0, 1\n    .concat [3]\n  arrayEq [2, 3, 3], result\n\n  # Single line function arguments\n  result = [1..6]\n    .map (x) -> x * x\n    .filter (x) -> x % 2 is 0\n    .reverse()\n  arrayEq [36, 16, 4], result\n\n  # Single line implicit objects\n  id = (x) -> x\n  result = id a: 1\n    .a\n  eq 1, result\n\n  # The parens are forced\n  result = str.split(''.\n    split ''\n    .join ''\n  ).join ', '\n  eq 'a, b, c', result\n\ntest \"chaining should not wrap spilling ternary\", ->\n  throws -> CoffeeScript.compile \"\"\"\n    if 0 then 1 else g\n      a: 42\n    .h()\n  \"\"\"\n\ntest \"chaining should wrap calls containing spilling ternary\", ->\n  f = (x) -> h: x\n  id = (x) -> x\n  result = f if true then 42 else id\n      a: 2\n  .h\n  eq 42, result\n\ntest \"chaining should work within spilling ternary\", ->\n  f = (x) -> h: x\n  id = (x) -> x\n  result = f if false then 1 else id\n      a: 3\n      .a\n  eq 3, result.h\n\ntest \"method call chaining inside objects\", ->\n  f = (x) -> c: 42\n  result =\n    a: f 1\n    b: f a: 1\n      .c\n  eq 42, result.b\n\ntest \"#4568: refine sameLine implicit object tagging\", ->\n  condition = yes\n  fn = -> yes\n\n  x =\n    fn bar: {\n      foo: 123\n    } if not condition\n  eq x, undefined\n\n# Nested blocks caused by paren unwrapping\ntest \"#1492: Nested blocks don't cause double semicolons\", ->\n  js = CoffeeScript.compile '(0;0)'\n  eq -1, js.indexOf ';;'\n\ntest \"#1195 Ignore trailing semicolons (before newlines or as the last char in a program)\", ->\n  preNewline = (numSemicolons) ->\n    \"\"\"\n    nonce = {}; nonce2 = {}\n    f = -> nonce#{Array(numSemicolons+1).join(';')}\n    nonce2\n    unless f() is nonce then throw new Error('; before linebreak should = newline')\n    \"\"\"\n  CoffeeScript.run(preNewline(n), bare: true) for n in [1,2,3]\n\n  lastChar = '-> lastChar;'\n  doesNotThrow -> CoffeeScript.compile lastChar, bare: true\n\ntest \"#1299: Disallow token misnesting\", ->\n  try\n    CoffeeScript.compile '''\n      [{\n         ]}\n    '''\n    ok no\n  catch e\n    eq 'unmatched ]', e.message\n\ntest \"#2981: Enforce initial indentation\", ->\n  try\n    CoffeeScript.compile '  a\\nb-'\n    ok no\n  catch e\n    eq 'missing indentation', e.message\n\ntest \"'single-line' expression containing multiple lines\", ->\n  doesNotThrow -> CoffeeScript.compile \"\"\"\n    (a, b) -> if a\n      -a\n    else if b\n    then -b\n    else null\n  \"\"\"\n\ntest \"#1275: allow indentation before closing brackets\", ->\n  array = [\n      1\n      2\n      3\n    ]\n  eq array, array\n  do ->\n  (\n    a = 1\n   )\n  eq 1, a\n\ntest \"#3199: return multiline implicit object\", ->\n  y = do ->\n    if no then return\n      type: 'a'\n      msg: 'b'\n  eq undefined, y\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"function_invocation\">\n# Function Invocation\n# -------------------\n\n# * Function Invocation\n# * Splats in Function Invocations\n# * Implicit Returns\n# * Explicit Returns\n\n# shared identity function\nid = (_) -> if arguments.length is 1 then _ else [arguments...]\n\n# helper to assert that a string should fail compilation\ncantCompile = (code) ->\n  throws -> CoffeeScript.compile code\n\ntest \"basic argument passing\", ->\n\n  a = {}\n  b = {}\n  c = {}\n  eq 1, (id 1)\n  eq 2, (id 1, 2)[1]\n  eq a, (id a)\n  eq c, (id a, b, c)[2]\n\n\ntest \"passing arguments on separate lines\", ->\n\n  a = {}\n  b = {}\n  c = {}\n  ok(id(\n    a\n    b\n    c\n  )[1] is b)\n  eq(0, id(\n    0\n    10\n  )[0])\n  eq(a,id(\n    a\n  ))\n  eq b,\n  (id b)\n\n\ntest \"optional parens can be used in a nested fashion\", ->\n\n  call = (func) -> func()\n  add = (a,b) -> a + b\n  result = call ->\n    inner = call ->\n      add 5, 5\n  ok result is 10\n\n\ntest \"hanging commas and semicolons in argument list\", ->\n\n  fn = () -> arguments.length\n  eq 2, fn(0,1,)\n  eq 3, fn 0, 1,\n  2\n  eq 2, fn(0, 1;)\n  # TODO: this test fails (the string compiles), but should it?\n  #throws -> CoffeeScript.compile \"fn(0,1,;)\"\n  throws -> CoffeeScript.compile \"fn(0,1,;;)\"\n  throws -> CoffeeScript.compile \"fn(0, 1;,)\"\n  throws -> CoffeeScript.compile \"fn(,0)\"\n  throws -> CoffeeScript.compile \"fn(;0)\"\n\n\ntest \"function invocation\", ->\n\n  func = ->\n    return if true\n  eq undefined, func()\n\n  result = (\"hello\".slice) 3\n  ok result is 'lo'\n\n\ntest \"And even with strange things like this:\", ->\n\n  funcs  = [((x) -> x), ((x) -> x * x)]\n  result = funcs[1] 5\n  ok result is 25\n\n\ntest \"More fun with optional parens.\", ->\n\n  fn = (arg) -> arg\n  ok fn(fn {prop: 101}).prop is 101\n\n  okFunc = (f) -> ok(f())\n  okFunc -> true\n\n\ntest \"chained function calls\", ->\n  nonce = {}\n  identityWrap = (x) ->\n    -> x\n  eq nonce, identityWrap(identityWrap(nonce))()()\n  eq nonce, (identityWrap identityWrap nonce)()()\n\n\ntest \"Multi-blocks with optional parens.\", ->\n\n  fn = (arg) -> arg\n  result = fn( ->\n    fn ->\n      \"Wrapped\"\n  )\n  ok result()() is 'Wrapped'\n\n\ntest \"method calls\", ->\n\n  fnId = (fn) -> -> fn.apply this, arguments\n  math = {\n    add: (a, b) -> a + b\n    anonymousAdd: (a, b) -> a + b\n    fastAdd: fnId (a, b) -> a + b\n  }\n  ok math.add(5, 5) is 10\n  ok math.anonymousAdd(10, 10) is 20\n  ok math.fastAdd(20, 20) is 40\n\n\ntest \"Ensure that functions can have a trailing comma in their argument list\", ->\n\n  mult = (x, mids..., y) ->\n    x *= n for n in mids\n    x *= y\n  #ok mult(1, 2,) is 2\n  #ok mult(1, 2, 3,) is 6\n  ok mult(10, (i for i in [1..6])...) is 7200\n\n\ntest \"`@` and `this` should both be able to invoke a method\", ->\n  nonce = {}\n  fn          = (arg) -> eq nonce, arg\n  fn.withAt   = -> @ nonce\n  fn.withThis = -> this nonce\n  fn.withAt()\n  fn.withThis()\n\n\ntest \"Trying an implicit object call with a trailing function.\", ->\n\n  a = null\n  meth = (arg, obj, func) -> a = [obj.a, arg, func()].join ' '\n  meth 'apple', b: 1, a: 13, ->\n    'orange'\n  ok a is '13 apple orange'\n\n\ntest \"Ensure that empty functions don't return mistaken values.\", ->\n\n  obj =\n    func: (@param, @rest...) ->\n  ok obj.func(101, 102, 103, 104) is undefined\n  ok obj.param is 101\n  ok obj.rest.join(' ') is '102 103 104'\n\n\ntest \"Passing multiple functions without paren-wrapping is legal, and should compile.\", ->\n\n  sum = (one, two) -> one() + two()\n  result = sum ->\n    7 + 9\n  , ->\n    1 + 3\n  ok result is 20\n\n\ntest \"Implicit call with a trailing if statement as a param.\", ->\n\n  func = -> arguments[1]\n  result = func 'one', if false then 100 else 13\n  ok result is 13\n\n\ntest \"Test more function passing:\", ->\n\n  sum = (one, two) -> one() + two()\n\n  result = sum( ->\n    1 + 2\n  , ->\n    2 + 1\n  )\n  ok result is 6\n\n  sum = (a, b) -> a + b\n  result = sum(1\n  , 2)\n  ok result is 3\n\n\ntest \"Chained blocks, with proper indentation levels:\", ->\n\n  counter =\n    results: []\n    tick: (func) ->\n      @results.push func()\n      this\n  counter\n    .tick ->\n      3\n    .tick ->\n      2\n    .tick ->\n      1\n  arrayEq [3,2,1], counter.results\n\n\ntest \"This is a crazy one.\", ->\n\n  x = (obj, func) -> func obj\n  ident = (x) -> x\n  result = x {one: ident 1}, (obj) ->\n    inner = ident(obj)\n    ident inner\n  ok result.one is 1\n\n\ntest \"More paren compilation tests:\", ->\n\n  reverse = (obj) -> obj.reverse()\n  ok reverse([1, 2].concat 3).join(' ') is '3 2 1'\n\n\ntest \"Test for inline functions with parentheses and implicit calls.\", ->\n\n  combine = (func, num) -> func() * num\n  result  = combine (-> 1 + 2), 3\n  ok result is 9\n\n\ntest \"Test for calls/parens/multiline-chains.\", ->\n\n  f = (x) -> x\n  result = (f 1).toString()\n    .length\n  ok result is 1\n\n\ntest \"Test implicit calls in functions in parens:\", ->\n\n  result = ((val) ->\n    [].push val\n    val\n  )(10)\n  ok result is 10\n\n\ntest \"Ensure that chained calls with indented implicit object literals below are alright.\", ->\n\n  result = null\n  obj =\n    method: (val)  -> this\n    second: (hash) -> result = hash.three\n  obj\n    .method(\n      101\n    ).second(\n      one:\n        two: 2\n      three: 3\n    )\n  eq result, 3\n\n\ntest \"Test newline-supressed call chains with nested functions.\", ->\n\n  obj  =\n    call: -> this\n  func = ->\n    obj\n      .call ->\n        one two\n      .call ->\n        three four\n    101\n  eq func(), 101\n\n\ntest \"Implicit objects with number arguments.\", ->\n\n  func = (x, y) -> y\n  obj =\n    prop: func \"a\", 1\n  ok obj.prop is 1\n\n\ntest \"Non-spaced unary and binary operators should cause a function call.\", ->\n\n  func = (val) -> val + 1\n  ok (func +5) is 6\n  ok (func -5) is -4\n\n\ntest \"Prefix unary assignment operators are allowed in parenless calls.\", ->\n\n  func = (val) -> val + 1\n  val = 5\n  ok (func --val) is 5\n\ntest \"#855: execution context for `func arr...` should be `null`\", ->\n  contextTest = -> eq @, if window? then window else global\n  array = []\n  contextTest array\n  contextTest.apply null, array\n  contextTest array...\n\ntest \"#904: Destructuring function arguments with same-named variables in scope\", ->\n  a = b = nonce = {}\n  fn = ([a,b]) -> {a:a,b:b}\n  result = fn([c={},d={}])\n  eq c, result.a\n  eq d, result.b\n  eq nonce, a\n  eq nonce, b\n\ntest \"Simple Destructuring function arguments with same-named variables in scope\", ->\n  x = 1\n  f = ([x]) -> x\n  eq f([2]), 2\n  eq x, 1\n\ntest \"caching base value\", ->\n\n  obj =\n    index: 0\n    0: {method: -> this is obj[0]}\n  ok obj[obj.index++].method([]...)\n\n\ntest \"passing splats to functions\", ->\n  arrayEq [0..4], id id [0..4]...\n  fn = (a, b, c..., d) -> [a, b, c, d]\n  range = [0..3]\n  [first, second, others, last] = fn range..., 4, [5...8]...\n  eq 0, first\n  eq 1, second\n  arrayEq [2..6], others\n  eq 7, last\n\ntest \"splat variables are local to the function\", ->\n  outer = \"x\"\n  clobber = (avar, outer...) -> outer\n  clobber \"foo\", \"bar\"\n  eq \"x\", outer\n\n\ntest \"Issue 894: Splatting against constructor-chained functions.\", ->\n\n  x = null\n  class Foo\n    bar: (y) -> x = y\n  new Foo().bar([101]...)\n  eq x, 101\n\n\ntest \"Functions with splats being called with too few arguments.\", ->\n\n  pen = null\n  method = (first, variable..., penultimate, ultimate) ->\n    pen = penultimate\n  method 1, 2, 3, 4, 5, 6, 7, 8, 9\n  ok pen is 8\n  method 1, 2, 3\n  ok pen is 2\n  method 1, 2\n  ok pen is 2\n\n\ntest \"splats with super() within classes.\", ->\n\n  class Parent\n    meth: (args...) ->\n      args\n  class Child extends Parent\n    meth: ->\n      nums = [3, 2, 1]\n      super nums...\n  ok (new Child).meth().join(' ') is '3 2 1'\n\n\ntest \"#1011: passing a splat to a method of a number\", ->\n  eq '1011', 11.toString [2]...\n  eq '1011', (31).toString [3]...\n  eq '1011', 69.0.toString [4]...\n  eq '1011', (131.0).toString [5]...\n\n\ntest \"splats and the `new` operator: functions that return `null` should construct their instance\", ->\n  args = []\n  child = new (constructor = -> null) args...\n  ok child instanceof constructor\n\ntest \"splats and the `new` operator: functions that return functions should construct their return value\", ->\n  args = []\n  fn = ->\n  child = new (constructor = -> fn) args...\n  ok child not instanceof constructor\n  eq fn, child\n\ntest \"implicit return\", ->\n\n  eq ok, new ->\n    ok\n    ### Should `return` implicitly   ###\n    ### even with trailing comments. ###\n\n\ntest \"implicit returns with multiple branches\", ->\n  nonce = {}\n  fn = ->\n    if false\n      for a in b\n        return c if d\n    else\n      nonce\n  eq nonce, fn()\n\n\ntest \"implicit returns with switches\", ->\n  nonce = {}\n  fn = ->\n    switch nonce\n      when nonce then nonce\n      else return undefined\n  eq nonce, fn()\n\n\ntest \"preserve context when generating closure wrappers for expression conversions\", ->\n  nonce = {}\n  obj =\n    property: nonce\n    method: ->\n      this.result = if false\n        10\n      else\n        \"a\"\n        \"b\"\n        this.property\n  eq nonce, obj.method()\n  eq nonce, obj.property\n\n\ntest \"don't wrap 'pure' statements in a closure\", ->\n  nonce = {}\n  items = [0, 1, 2, 3, nonce, 4, 5]\n  fn = (items) ->\n    for item in items\n      return item if item is nonce\n  eq nonce, fn items\n\n\ntest \"usage of `new` is careful about where the invocation parens end up\", ->\n  eq 'object', typeof new try Array\n  eq 'object', typeof new do -> ->\n\n\ntest \"implicit call against control structures\", ->\n  result = null\n  save   = (obj) -> result = obj\n\n  save switch id false\n    when true\n      'true'\n    when false\n      'false'\n\n  eq result, 'false'\n\n  save if id false\n    'false'\n  else\n    'true'\n\n  eq result, 'true'\n\n  save unless id false\n    'true'\n  else\n    'false'\n\n  eq result, 'true'\n\n  save try\n    doesnt exist\n  catch error\n    'caught'\n\n  eq result, 'caught'\n\n  save try doesnt(exist) catch error then 'caught2'\n\n  eq result, 'caught2'\n\n\ntest \"#1420: things like `(fn() ->)`; there are no words for this one\", ->\n  fn = -> (f) -> f()\n  nonce = {}\n  eq nonce, (fn() -> nonce)\n\ntest \"#1416: don't omit one 'new' when compiling 'new new'\", ->\n  nonce = {}\n  obj = new new -> -> {prop: nonce}\n  eq obj.prop, nonce\n\ntest \"#1416: don't omit one 'new' when compiling 'new new fn()()'\", ->\n  nonce = {}\n  argNonceA = {}\n  argNonceB = {}\n  fn = (a) -> (b) -> {a, b, prop: nonce}\n  obj = new new fn(argNonceA)(argNonceB)\n  eq obj.prop, nonce\n  eq obj.a, argNonceA\n  eq obj.b, argNonceB\n\ntest \"#1840: accessing the `prototype` after function invocation should compile\", ->\n  doesNotThrow -> CoffeeScript.compile 'fn()::prop'\n\n  nonce = {}\n  class Test then id: nonce\n\n  dotAccess = -> Test::\n  protoAccess = -> Test\n\n  eq dotAccess().id, nonce\n  eq protoAccess()::id, nonce\n\ntest \"#960: improved 'do'\", ->\n\n  do (nonExistent = 'one') ->\n    eq nonExistent, 'one'\n\n  overridden = 1\n  do (overridden = 2) ->\n    eq overridden, 2\n\n  two = 2\n  do (one = 1, two, three = 3) ->\n    eq one, 1\n    eq two, 2\n    eq three, 3\n\n  ret = do func = (two) ->\n    eq two, 2\n    func\n  eq ret, func\n\ntest \"#2617: implicit call before unrelated implicit object\", ->\n  pass = ->\n    true\n\n  result = if pass 1\n    one: 1\n  eq result.one, 1\n\ntest \"#2292, b: f (z),(x)\", ->\n  f = (x, y) -> y\n  one = 1\n  two = 2\n  o = b: f (one),(two)\n  eq o.b, 2\n\ntest \"#2297, Different behaviors on interpreting literal\", ->\n  foo = (x, y) -> y\n  bar =\n    baz: foo 100, on\n\n  eq bar.baz, on\n\n  qux = (x) -> x\n  quux = qux\n    corge: foo 100, true\n\n  eq quux.corge, on\n\n  xyzzy =\n    e: 1\n    f: foo\n      a: 1\n      b: 2\n    ,\n      one: 1\n      two: 2\n      three: 3\n    g:\n      a: 1\n      b: 2\n      c: foo 2,\n        one: 1\n        two: 2\n        three: 3\n      d: 3\n    four: 4\n    h: foo one: 1, two: 2, three: three: three: 3,\n      2\n\n  eq xyzzy.f.two, 2\n  eq xyzzy.g.c.three, 3\n  eq xyzzy.four, 4\n  eq xyzzy.h, 2\n\ntest \"#2715, Chained implicit calls\", ->\n  first  = (x)    -> x\n  second = (x, y) -> y\n\n  foo = first first\n    one: 1\n  eq foo.one, 1\n\n  bar = first second\n    one: 1, 2\n  eq bar, 2\n\n  baz = first second\n    one: 1,\n    2\n  eq baz, 2\n\ntest \"Implicit calls and new\", ->\n  first = (x) -> x\n  foo = (@x) ->\n  bar = first new foo first 1\n  eq bar.x, 1\n\n  third = (x, y, z) -> z\n  baz = first new foo new foo third\n        one: 1\n        two: 2\n        1\n        three: 3\n        2\n  eq baz.x.x.three, 3\n\ntest \"Loose tokens inside of explicit call lists\", ->\n  first = (x) -> x\n  second = (x, y) -> y\n  one = 1\n\n  foo = second( one\n                2)\n  eq foo, 2\n\n  bar = first( first\n               one: 1)\n  eq bar.one, 1\n\ntest \"Non-callable literals shouldn't compile\", ->\n  cantCompile '1(2)'\n  cantCompile '1 2'\n  cantCompile '/t/(2)'\n  cantCompile '/t/ 2'\n  cantCompile '///t///(2)'\n  cantCompile '///t/// 2'\n  cantCompile \"''(2)\"\n  cantCompile \"'' 2\"\n  cantCompile '\"\"(2)'\n  cantCompile '\"\" 2'\n  cantCompile '\"\"\"\"\"\"(2)'\n  cantCompile '\"\"\"\"\"\" 2'\n  cantCompile '{}(2)'\n  cantCompile '{} 2'\n  cantCompile '[](2)'\n  cantCompile '[] 2'\n  cantCompile '[2..9] 2'\n  cantCompile '[2..9](2)'\n  cantCompile '[1..10][2..9] 2'\n  cantCompile '[1..10][2..9](2)'\n\ntest 'implicit invocation with implicit object literal', ->\n  f = (obj) -> eq 1, obj.a\n\n  f\n    a: 1\n  obj =\n    if f\n      a: 2\n    else\n      a: 1\n  eq 2, obj.a\n\n  f\n    \"a\": 1\n  obj =\n    if f\n      \"a\": 2\n    else\n      \"a\": 1\n  eq 2, obj.a\n\n  # #3935: Implicit call when the first key of an implicit object has interpolation.\n  a = 'a'\n  f\n    \"#{a}\": 1\n  obj =\n    if f\n      \"#{a}\": 2\n    else\n      \"#{a}\": 1\n  eq 2, obj.a\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"functions\">\n# Function Literals\n# -----------------\n\n# TODO: add indexing and method invocation tests: (->)[0], (->).call()\n\n# * Function Definition\n# * Bound Function Definition\n# * Parameter List Features\n#   * Splat Parameters\n#   * Context (@) Parameters\n#   * Parameter Destructuring\n#   * Default Parameters\n\n# Function Definition\n\nx = 1\ny = {}\ny.x = -> 3\nok x is 1\nok typeof(y.x) is 'function'\nok y.x instanceof Function\nok y.x() is 3\n\n# The empty function should not cause a syntax error.\n->\n() ->\n\n# Multiple nested function declarations mixed with implicit calls should not\n# cause a syntax error.\n(one) -> (two) -> three four, (five) -> six seven, eight, (nine) ->\n\n# with multiple single-line functions on the same line.\nfunc = (x) -> (x) -> (x) -> x\nok func(1)(2)(3) is 3\n\n# Make incorrect indentation safe.\nfunc = ->\n  obj = {\n          key: 10\n        }\n  obj.key - 5\neq func(), 5\n\n# Ensure that functions with the same name don't clash with helper functions.\ndel = -> 5\nok del() is 5\n\n\n# Bound Function Definition\n\nobj =\n  bound: ->\n    (=> this)()\n  unbound: ->\n    (-> this)()\n  nested: ->\n    (=>\n      (=>\n        (=> this)()\n      )()\n    )()\neq obj, obj.bound()\nok obj isnt obj.unbound()\neq obj, obj.nested()\n\n\ntest \"even more fancy bound functions\", ->\n  obj =\n    one: ->\n      do =>\n        return this.two()\n    two: ->\n      do =>\n        do =>\n          do =>\n            return this.three\n    three: 3\n\n  eq obj.one(), 3\n\n\ntest \"self-referencing functions\", ->\n  changeMe = ->\n    changeMe = 2\n\n  changeMe()\n  eq changeMe, 2\n\ntest \"#2009: don't touch `` `this` ``\", ->\n  nonceA = {}\n  nonceB = {}\n  fn = null\n  (->\n    fn = => this is nonceA and `this` is nonceB\n  ).call nonceA\n  ok fn.call nonceB\n\n\n# Parameter List Features\n\ntest \"splats\", ->\n  arrayEq [0, 1, 2], (((splat...) -> splat) 0, 1, 2)\n  arrayEq [2, 3], (((_, _1, splat...) -> splat) 0, 1, 2, 3)\n  arrayEq [0, 1], (((splat..., _, _1) -> splat) 0, 1, 2, 3)\n  arrayEq [2], (((_, _1, splat..., _2) -> splat) 0, 1, 2, 3)\n\ntest \"destructured splatted parameters\", ->\n  arr = [0,1,2]\n  splatArray = ([a...]) -> a\n  splatArrayRest = ([a...],b...) -> arrayEq(a,b); b\n  arrayEq splatArray(arr), arr\n  arrayEq splatArrayRest(arr,0,1,2), arr\n\ntest \"@-parameters: automatically assign an argument's value to a property of the context\", ->\n  nonce = {}\n\n  ((@prop) ->).call context = {}, nonce\n  eq nonce, context.prop\n\n  # allow splats along side the special argument\n  ((splat..., @prop) ->).apply context = {}, [0, 0, nonce]\n  eq nonce, context.prop\n\n  # allow the argument itself to be a splat\n  ((@prop...) ->).call context = {}, 0, nonce, 0\n  eq nonce, context.prop[1]\n\n  # the argument should not be able to be referenced normally\n  code = '((@prop) -> prop).call {}'\n  doesNotThrow -> CoffeeScript.compile code\n  throws (-> CoffeeScript.run code), ReferenceError\n  code = '((@prop) -> _at_prop).call {}'\n  doesNotThrow -> CoffeeScript.compile code\n  throws (-> CoffeeScript.run code), ReferenceError\n\ntest \"@-parameters and splats with constructors\", ->\n  a = {}\n  b = {}\n  class Klass\n    constructor: (@first, splat..., @last) ->\n\n  obj = new Klass a, 0, 0, b\n  eq a, obj.first\n  eq b, obj.last\n\ntest \"destructuring in function definition\", ->\n  (([{a: [b], c}]...) ->\n    eq 1, b\n    eq 2, c\n  ) {a: [1], c: 2}\n\n  context = {}\n  (([{a: [b, c = 2], @d, e = 4}]...) ->\n    eq 1, b\n    eq 2, c\n    eq @d, 3\n    eq context.d, 3\n    eq e, 4\n  ).call context, {a: [1], d: 3}\n\n  (({a: aa = 1, b: bb = 2}) ->\n    eq 5, aa\n    eq 2, bb\n  ) {a: 5}\n\n  ajax = (url, {\n    async = true,\n    beforeSend = (->),\n    cache = true,\n    method = 'get',\n    data = {}\n  }) ->\n    {url, async, beforeSend, cache, method, data}\n\n  fn = ->\n  deepEqual ajax('/home', beforeSend: fn, cache: null, method: 'post'), {\n    url: '/home', async: true, beforeSend: fn, cache: true, method: 'post', data: {}\n  }\n\ntest \"#4005: `([a = {}]..., b) ->` weirdness\", ->\n  fn = ([a = {}]..., b) -> [a, b]\n  deepEqual fn(5), [{}, 5]\n\ntest \"default values\", ->\n  nonceA = {}\n  nonceB = {}\n  a = (_,_1,arg=nonceA) -> arg\n  eq nonceA, a()\n  eq nonceA, a(0)\n  eq nonceB, a(0,0,nonceB)\n  eq nonceA, a(0,0,undefined)\n  eq nonceA, a(0,0,null)\n  eq false , a(0,0,false)\n  eq nonceB, a(undefined,undefined,nonceB,undefined)\n  b = (_,arg=nonceA,_1,_2) -> arg\n  eq nonceA, b()\n  eq nonceA, b(0)\n  eq nonceB, b(0,nonceB)\n  eq nonceA, b(0,undefined)\n  eq nonceA, b(0,null)\n  eq false , b(0,false)\n  eq nonceB, b(undefined,nonceB,undefined)\n  c = (arg=nonceA,_,_1) -> arg\n  eq nonceA, c()\n  eq      0, c(0)\n  eq nonceB, c(nonceB)\n  eq nonceA, c(undefined)\n  eq nonceA, c(null)\n  eq false , c(false)\n  eq nonceB, c(nonceB,undefined,undefined)\n\ntest \"default values with @-parameters\", ->\n  a = {}\n  b = {}\n  obj = f: (q = a, @p = b) -> q\n  eq a, obj.f()\n  eq b, obj.p\n\ntest \"default values with splatted arguments\", ->\n  withSplats = (a = 2, b..., c = 3, d = 5) -> a * (b.length + 1) * c * d\n  eq 30, withSplats()\n  eq 15, withSplats(1)\n  eq  5, withSplats(1,1)\n  eq  1, withSplats(1,1,1)\n  eq  2, withSplats(1,1,1,1)\n\ntest \"#156: parameter lists with expansion\", ->\n  expandArguments = (first, ..., lastButOne, last) ->\n    eq 1, first\n    eq 4, lastButOne\n    last\n  eq 5, expandArguments 1, 2, 3, 4, 5\n\n  throws (-> CoffeeScript.compile \"(..., a, b...) ->\"), null, \"prohibit expansion and a splat\"\n  throws (-> CoffeeScript.compile \"(...) ->\"),          null, \"prohibit lone expansion\"\n\ntest \"#156: parameter lists with expansion in array destructuring\", ->\n  expandArray = (..., [..., last]) ->\n    last\n  eq 3, expandArray 1, 2, 3, [1, 2, 3]\n\ntest \"#3502: variable definitions and expansion\", ->\n  a = b = 0\n  f = (a, ..., b) -> [a, b]\n  arrayEq [1, 5], f 1, 2, 3, 4, 5\n  eq 0, a\n  eq 0, b\n\ntest \"variable definitions and splat\", ->\n  a = b = 0\n  f = (a, middle..., b) -> [a, middle, b]\n  arrayEq [1, [2, 3, 4], 5], f 1, 2, 3, 4, 5\n  eq 0, a\n  eq 0, b\n\ntest \"default values with function calls\", ->\n  doesNotThrow -> CoffeeScript.compile \"(x = f()) ->\"\n\ntest \"arguments vs parameters\", ->\n  doesNotThrow -> CoffeeScript.compile \"f(x) ->\"\n  f = (g) -> g()\n  eq 5, f (x) -> 5\n\ntest \"reserved keyword as parameters\", ->\n  f = (_case, @case) -> [_case, @case]\n  [a, b] = f(1, 2)\n  eq 1, a\n  eq 2, b\n\n  f = (@case, _case...) -> [@case, _case...]\n  [a, b, c] = f(1, 2, 3)\n  eq 1, a\n  eq 2, b\n  eq 3, c\n\ntest \"reserved keyword at-splat\", ->\n  f = (@case...) -> @case\n  [a, b] = f(1, 2)\n  eq 1, a\n  eq 2, b\n\ntest \"#1574: Destructuring and a parameter named _arg\", ->\n  f = ({a, b}, _arg, _arg1) -> [a, b, _arg, _arg1]\n  arrayEq [1, 2, 3, 4], f a: 1, b: 2, 3, 4\n\ntest \"#1844: bound functions in nested comprehensions causing empty var statements\", ->\n  a = ((=>) for a in [0] for b in [0])\n  eq 1, a.length\n\ntest \"#1859: inline function bodies shouldn't modify prior postfix ifs\", ->\n  list = [1, 2, 3]\n  ok true if list.some (x) -> x is 2\n\ntest \"#2258: allow whitespace-style parameter lists in function definitions\", ->\n  func = (\n    a, b, c\n  ) -> c\n  eq func(1, 2, 3), 3\n\n  func = (\n    a\n    b\n    c\n  ) -> b\n  eq func(1, 2, 3), 2\n\ntest \"#2621: fancy destructuring in parameter lists\", ->\n  func = ({ prop1: { key1 }, prop2: { key2, key3: [a, b, c] } }) ->\n    eq(key2, 'key2')\n    eq(a, 'a')\n\n  func({prop1: {key1: 'key1'}, prop2: {key2: 'key2', key3: ['a', 'b', 'c']}})\n\ntest \"#1435 Indented property access\", ->\n  rec = -> rec: rec\n\n  eq 1, do ->\n    rec()\n      .rec ->\n        rec()\n          .rec ->\n            rec.rec()\n          .rec()\n    1\n\ntest \"#1038 Optimize trailing return statements\", ->\n  compile = (code) -> CoffeeScript.compile(code, bare: yes).trim().replace(/\\s+/g, \" \")\n\n  eq \"(function() {});\",                 compile(\"->\")\n  eq \"(function() {});\",                 compile(\"-> return\")\n  eq \"(function() { return void 0; });\", compile(\"-> undefined\")\n  eq \"(function() { return void 0; });\", compile(\"-> return undefined\")\n  eq \"(function() { foo(); });\",         compile(\"\"\"\n                                                 ->\n                                                   foo()\n                                                   return\n                                                 \"\"\")\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"generators\">\n# Generators\n# -----------------\n#\n# * Generator Definition\n\ntest \"most basic generator support\", ->\n  ok -> yield\n\ntest \"empty generator\", ->\n  x = do -> yield return\n\n  y = x.next()\n  ok y.value is undefined and y.done is true\n\ntest \"generator iteration\", ->\n  x = do ->\n    yield 0\n    yield\n    yield 2\n    3\n\n  y = x.next()\n  ok y.value is 0 and y.done is false\n\n  y = x.next()\n  ok y.value is undefined and y.done is false\n\n  y = x.next()\n  ok y.value is 2 and y.done is false\n\n  y = x.next()\n  ok y.value is 3 and y.done is true\n\ntest \"last line yields are returned\", ->\n  x = do ->\n    yield 3\n  y = x.next()\n  ok y.value is 3 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"yield return can be used anywhere in the function body\", ->\n  x = do ->\n    if 2 is yield 1\n      yield return 42\n    throw new Error \"this code shouldn't be reachable\"\n\n  y = x.next()\n  ok y.value is 1 and y.done is false\n\n  y = x.next 2\n  ok y.value is 42 and y.done is true\n\ntest \"bound generator\", ->\n  obj =\n    bound: ->\n      do =>\n        yield this\n    unbound: ->\n      do ->\n        yield this\n    nested: ->\n      do =>\n        yield do =>\n          yield do =>\n            yield this\n\n  eq obj, obj.bound().next().value\n  ok obj isnt obj.unbound().next().value\n  eq obj, obj.nested().next().value.next().value.next().value\n\ntest \"`yield from` support\", ->\n  x = do ->\n    yield from do ->\n      yield i for i in [3..4]\n\n  y = x.next()\n  ok y.value is 3 and y.done is false\n\n  y = x.next 1\n  ok y.value is 4 and y.done is false\n\n  y = x.next 2\n  arrayEq y.value, [1, 2]\n  ok y.done is true\n\ntest \"error if `yield from` occurs outside of a function\", ->\n  throws -> CoffeeScript.compile 'yield from 1'\n\ntest \"`yield from` at the end of a function errors\", ->\n  throws -> CoffeeScript.compile 'x = -> x = 1; yield from'\n\ntest \"yield in if statements\", ->\n  x = do -> if 1 is yield 2 then 3 else 4\n\n  y = x.next()\n  ok y.value is 2 and y.done is false\n\n  y = x.next 1\n  ok y.value is 3 and y.done is true\n\ntest \"yielding if statements\", ->\n  x = do -> yield if true then 3 else 4\n\n  y = x.next()\n  ok y.value is 3 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"yield in for loop expressions\", ->\n  x = do ->\n    y = for i in [1..3]\n      yield i * 2\n\n  z = x.next()\n  ok z.value is 2 and z.done is false\n\n  z = x.next 10\n  ok z.value is 4 and z.done is false\n\n  z = x.next 20\n  ok z.value is 6 and z.done is false\n\n  z = x.next 30\n  arrayEq z.value, [10, 20, 30]\n  ok z.done is true\n\ntest \"yield in switch expressions\", ->\n  x = do ->\n    y = switch yield 1\n      when 2 then yield 1337\n      else 1336\n\n  z = x.next()\n  ok z.value is 1 and z.done is false\n\n  z = x.next 2\n  ok z.value is 1337 and z.done is false\n\n  z = x.next 3\n  ok z.value is 3 and z.done is true\n\ntest \"yielding switch expressions\", ->\n  x = do ->\n    yield switch 1337\n      when 1337 then 1338\n      else 1336\n\n  y = x.next()\n  ok y.value is 1338 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"yield in try expressions\", ->\n  x = do ->\n    try yield 1 catch\n\n  y = x.next()\n  ok y.value is 1 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"yielding try expressions\", ->\n  x = do ->\n    yield try 1\n\n  y = x.next()\n  ok y.value is 1 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"`yield` can be thrown\", ->\n  x = do ->\n    throw yield null\n  x.next()\n  throws -> x.next new Error \"boom\"\n\ntest \"`throw` can be yielded\", ->\n  x = do ->\n    yield throw new Error \"boom\"\n  throws -> x.next()\n\ntest \"symbolic operators has precedence over the `yield`\", ->\n  symbolic   = '+ - * / << >> & | || && ** ^ // or and'.split ' '\n  compound   = (\"#{op}=\" for op in symbolic)\n  relations  = '< > == != <= >= is isnt'.split ' '\n\n  operators  = [symbolic..., '=', compound..., relations...]\n\n  collect = (gen) -> ref.value until (ref = gen.next()).done\n\n  values = [0, 1, 2, 3]\n  for op in operators\n    expression = \"i #{op} 2\"\n\n    yielded = CoffeeScript.eval \"(arr) ->  yield #{expression} for i in arr\"\n    mapped  = CoffeeScript.eval \"(arr) ->       (#{expression} for i in arr)\"\n\n    arrayEq mapped(values), collect yielded values\n\ntest \"yield handles 'this' correctly\", ->\n  x = ->\n    yield switch\n      when true then yield => this\n    array = for item in [1]\n      yield => this\n    yield array\n    yield if true then yield => this\n    yield try throw yield => this\n    throw yield => this\n\n  y = x.call [1, 2, 3]\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  z = y.next 123\n  ok z.value is 123 and z.done is false\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  z = y.next 42\n  arrayEq z.value, [42]\n  ok z.done is false\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  z = y.next 456\n  ok z.value is 456 and z.done is false\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  z = y.next new Error \"ignore me\"\n  ok z.value is undefined and z.done is false\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  throws -> y.next new Error \"boom\"\n\ntest \"for-from loops over generators\", ->\n  array1 = [50, 30, 70, 20]\n  gen = -> yield from array1\n\n  array2 = []\n  array3 = []\n  array4 = []\n\n  iterator = gen()\n  for x from iterator\n    array2.push(x)\n    break if x is 30\n\n  for x from iterator\n    array3.push(x)\n\n  for x from iterator\n    array4.push(x)\n\n  arrayEq array2, [50, 30]\n  # Different JS engines have different opinions on the value of array3:\n  # https://github.com/jashkenas/coffeescript/pull/4306#issuecomment-257066877\n  # As a temporary measure, either result is accepted.\n  ok array3.length is 0 or array3.join(',') is '70,20'\n  arrayEq array4, []\n\ntest \"for-from comprehensions over generators\", ->\n  gen = ->\n    yield from [30, 41, 51, 60]\n\n  iterator = gen()\n  array1 = (x for x from iterator when x %% 2 is 1)\n  array2 = (x for x from iterator)\n\n  ok array1.join(' ') is '41 51'\n  ok array2.length is 0\n\ntest \"from as an iterable variable name in a for loop declaration\", ->\n  from = [1, 2, 3]\n  out = []\n  for i from from\n    out.push i\n  arrayEq from, out\n\ntest \"from as an iterator variable name in a for loop declaration\", ->\n  a = [1, 2, 3]\n  b = []\n  for from from a\n    b.push from\n  arrayEq a, b\n\ntest \"from as a destructured object variable name in a for loop declaration\", ->\n  a = [\n      from: 1\n      to: 2\n    ,\n      from: 3\n      to: 4\n  ]\n  b = []\n  for {from, to} in a\n    b.push from\n  arrayEq b, [1, 3]\n\n  c = []\n  for {to, from} in a\n    c.push from\n  arrayEq c, [1, 3]\n\ntest \"from as a destructured, aliased object variable name in a for loop declaration\", ->\n  a = [\n      b: 1\n      c: 2\n    ,\n      b: 3\n      c: 4\n  ]\n  out = []\n\n  for {b: from} in a\n    out.push from\n  arrayEq out, [1, 3]\n\ntest \"from as a destructured array variable name in a for loop declaration\", ->\n  a = [\n    [1, 2]\n    [3, 4]\n  ]\n  b = []\n  for [from, to] from a\n    b.push from\n  arrayEq b, [1, 3]\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"helpers\">\n# Helpers\n# -------\n\n# pull the helpers from `CoffeeScript.helpers` into local variables\n{starts, ends, repeat, compact, count, merge, extend, flatten, del, baseFileName} = CoffeeScript.helpers\n\n\n# `starts`\n\ntest \"the `starts` helper tests if a string starts with another string\", ->\n  ok     starts('01234', '012')\n  ok not starts('01234', '123')\n\ntest \"the `starts` helper can take an optional offset\", ->\n  ok     starts('01234', '34', 3)\n  ok not starts('01234', '01', 1)\n\n\n# `ends`\n\ntest \"the `ends` helper tests if a string ends with another string\", ->\n  ok     ends('01234', '234')\n  ok not ends('01234', '012')\n\ntest \"the `ends` helper can take an optional offset\", ->\n  ok     ends('01234', '012', 2)\n  ok not ends('01234', '234', 6)\n\n\n# `repeat`\n\ntest \"the `repeat` helper concatenates a given number of times\", ->\n  eq 'asdasdasd', repeat('asd', 3)\n\ntest \"`repeat`ing a string 0 times always returns the empty string\", ->\n  eq '', repeat('whatever', 0)\n\n\n# `compact`\n\ntest \"the `compact` helper removes falsey values from an array, preserves truthy ones\", ->\n  allValues = [1, 0, false, obj={}, [], '', ' ', -1, null, undefined, true]\n  truthyValues = [1, obj, [], ' ', -1, true]\n  arrayEq truthyValues, compact(allValues)\n\n\n# `count`\n\ntest \"the `count` helper counts the number of occurrences of a string in another string\", ->\n  eq 1/0, count('abc', '')\n  eq 0, count('abc', 'z')\n  eq 1, count('abc', 'a')\n  eq 1, count('abc', 'b')\n  eq 2, count('abcdc', 'c')\n  eq 2, count('abcdabcd','abc')\n\n\n# `merge`\n\ntest \"the `merge` helper makes a new object with all properties of the objects given as its arguments\", ->\n  ary = [0, 1, 2, 3, 4]\n  obj = {}\n  merged = merge obj, ary\n  ok merged isnt obj\n  ok merged isnt ary\n  for own key, val of ary\n    eq val, merged[key]\n\n\n# `extend`\n\ntest \"the `extend` helper performs a shallow copy\", ->\n  ary = [0, 1, 2, 3]\n  obj = {}\n  # should return the object being extended\n  eq obj, extend(obj, ary)\n  # should copy the other object's properties as well (obviously)\n  eq 2, obj[2]\n\n\n# `flatten`\n\ntest \"the `flatten` helper flattens an array\", ->\n  success = yes\n  (success and= typeof n is 'number') for n in flatten [0, [[[1]], 2], 3, [4]]\n  ok success\n\n\n# `del`\n\ntest \"the `del` helper deletes a property from an object and returns the deleted value\", ->\n  obj = [0, 1, 2]\n  eq 1, del(obj, 1)\n  ok 1 not of obj\n\n\n# `baseFileName`\n\ntest \"the `baseFileName` helper returns the file name to write to\", ->\n  ext = '.js'\n  sourceToCompiled =\n    '.coffee': ext\n    'a.coffee': 'a' + ext\n    'b.coffee': 'b' + ext\n    'coffee.coffee': 'coffee' + ext\n\n    '.litcoffee': ext\n    'a.litcoffee': 'a' + ext\n    'b.litcoffee': 'b' + ext\n    'coffee.litcoffee': 'coffee' + ext\n\n    '.lit': ext\n    'a.lit': 'a' + ext\n    'b.lit': 'b' + ext\n    'coffee.lit': 'coffee' + ext\n\n    '.coffee.md': ext\n    'a.coffee.md': 'a' + ext\n    'b.coffee.md': 'b' + ext\n    'coffee.coffee.md': 'coffee' + ext\n\n  for sourceFileName, expectedFileName of sourceToCompiled\n    name = baseFileName sourceFileName, yes\n    filename = name + ext\n    eq filename, expectedFileName\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"importing\">\n# Importing\n# ---------\n\nunless window? or testingBrowser?\n  test \"coffeescript modules can be imported and executed\", ->\n\n    magicKey = __filename\n    magicValue = 0xFFFF\n\n    if global[magicKey]?\n      if exports?\n        local = magicValue\n        exports.method = -> local\n    else\n      global[magicKey] = {}\n      if require?.extensions?\n        ok require(__filename).method() is magicValue\n      delete global[magicKey]\n\n  test \"javascript modules can be imported\", ->\n    magicVal = 1\n    for module in 'import.js import2 .import2 import.extension.js import.unknownextension .coffee .coffee.md'.split ' '\n      ok require(\"./importing/#{module}\").value?() is magicVal, module\n\n  test \"coffeescript modules can be imported\", ->\n    magicVal = 2\n    for module in '.import.coffee import.coffee import.extension.coffee'.split ' '\n      ok require(\"./importing/#{module}\").value?() is magicVal, module\n\n  test \"literate coffeescript modules can be imported\", ->\n    magicVal = 3\n    # Leading space intentional to check for index.coffee.md\n    for module in ' .import.coffee.md import.coffee.md import.litcoffee import.extension.coffee.md'.split ' '\n      ok require(\"./importing/#{module}\").value?() is magicVal, module\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"interpolation\">\n# Interpolation\n# -------------\n\n# * String Interpolation\n# * Regular Expression Interpolation\n\n# String Interpolation\n\n# TODO: refactor string interpolation tests\n\neq 'multiline nested \"interpolations\" work', \"\"\"multiline #{\n  \"nested #{\n    ok true\n    \"\\\"interpolations\\\"\"\n  }\"\n} work\"\"\"\n\n# Issue #923: Tricky interpolation.\neq \"#{ \"{\" }\", \"{\"\neq \"#{ '#{}}' } }\", '#{}} }'\neq \"#{\"'#{ ({a: \"b#{1}\"}['a']) }'\"}\", \"'b1'\"\n\n# Issue #1150: String interpolation regression\neq \"#{'\"/'}\",                '\"/'\neq \"#{\"/'\"}\",                \"/'\"\neq \"#{/'\"/}\",                '/\\'\"/'\neq \"#{\"'/\" + '/\"' + /\"'/}\",  '\\'//\"/\"\\'/'\neq \"#{\"'/\"}#{'/\"'}#{/\"'/}\",  '\\'//\"/\"\\'/'\neq \"#{6 / 2}\",               '3'\neq \"#{6 / 2}#{6 / 2}\",       '33' # parsed as division\neq \"#{6 + /2}#{6/ + 2}\",     '6/2}#{6/2' # parsed as a regex\neq \"#{6/2}\n    #{6/2}\",                 '3 3' # newline cannot be part of a regex, so it's division\neq \"#{/// \"'/'\"/\" ///}\",     '/\"\\'\\\\/\\'\"\\\\/\"/' # heregex, stuffed with spicy characters\neq \"#{/\\\\'/}\",               \"/\\\\\\\\'/\"\n\n# Issue #2321: Regex/division conflict in interpolation\neq \"#{4/2}/\", '2/'\ncurWidth = 4\neq \"<i style='left:#{ curWidth/2 }%;'></i>\",   \"<i style='left:2%;'></i>\"\nthrows -> CoffeeScript.compile '''\n   \"<i style='left:#{ curWidth /2 }%;'></i>\"'''\n#                 valid regex--^^^^^^^^^^^ ^--unclosed string\neq \"<i style='left:#{ curWidth/2 }%;'></i>\",   \"<i style='left:2%;'></i>\"\neq \"<i style='left:#{ curWidth/ 2 }%;'></i>\",  \"<i style='left:2%;'></i>\"\neq \"<i style='left:#{ curWidth / 2 }%;'></i>\", \"<i style='left:2%;'></i>\"\n\nhello = 'Hello'\nworld = 'World'\nok '#{hello} #{world}!' is '#{hello} #{world}!'\nok \"#{hello} #{world}!\" is 'Hello World!'\nok \"[#{hello}#{world}]\" is '[HelloWorld]'\nok \"#{hello}##{world}\" is 'Hello#World'\nok \"Hello #{ 1 + 2 } World\" is 'Hello 3 World'\nok \"#{hello} #{ 1 + 2 } #{world}\" is \"Hello 3 World\"\nok 1 + \"#{2}px\" is '12px'\nok isNaN \"a#{2}\" * 2\nok \"#{2}\" is '2'\nok \"#{2}#{2}\" is '22'\n\n[s, t, r, i, n, g] = ['s', 't', 'r', 'i', 'n', 'g']\nok \"#{s}#{t}#{r}#{i}#{n}#{g}\" is 'string'\nok \"\\#{s}\\#{t}\\#{r}\\#{i}\\#{n}\\#{g}\" is '#{s}#{t}#{r}#{i}#{n}#{g}'\nok \"\\#{string}\" is '#{string}'\n\nok \"\\#{Escaping} first\" is '#{Escaping} first'\nok \"Escaping \\#{in} middle\" is 'Escaping #{in} middle'\nok \"Escaping \\#{last}\" is 'Escaping #{last}'\n\nok \"##\" is '##'\nok \"#{}\" is ''\nok \"#{}A#{} #{} #{}B#{}\" is 'A  B'\nok \"\\\\\\#{}\" is '\\\\#{}'\n\nok \"I won ##{20} last night.\" is 'I won #20 last night.'\nok \"I won ##{'#20'} last night.\" is 'I won ##20 last night.'\n\nok \"#{hello + world}\" is 'HelloWorld'\nok \"#{hello + ' ' + world + '!'}\" is 'Hello World!'\n\nlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\nok \"values: #{list.join(', ')}, length: #{list.length}.\" is 'values: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, length: 10.'\nok \"values: #{list.join ' '}\" is 'values: 0 1 2 3 4 5 6 7 8 9'\n\nobj = {\n  name: 'Joe'\n  hi: -> \"Hello #{@name}.\"\n  cya: -> \"Hello #{@name}.\".replace('Hello','Goodbye')\n}\nok obj.hi() is \"Hello Joe.\"\nok obj.cya() is \"Goodbye Joe.\"\n\nok \"With #{\"quotes\"}\" is 'With quotes'\nok 'With #{\"quotes\"}' is 'With #{\"quotes\"}'\n\nok \"Where is #{obj[\"name\"] + '?'}\" is 'Where is Joe?'\n\nok \"Where is #{\"the nested #{obj[\"name\"]}\"}?\" is 'Where is the nested Joe?'\nok \"Hello #{world ? \"#{hello}\"}\" is 'Hello World'\n\nok \"Hello #{\"#{\"#{obj[\"name\"]}\" + '!'}\"}\" is 'Hello Joe!'\n\na = \"\"\"\n    Hello #{ \"Joe\" }\n    \"\"\"\nok a is \"Hello Joe\"\n\na = 1\nb = 2\nc = 3\nok \"#{a}#{b}#{c}\" is '123'\n\nresult = null\nstash = (str) -> result = str\nstash \"a #{ ('aa').replace /a/g, 'b' } c\"\nok result is 'a bb c'\n\nfoo = \"hello\"\nok \"#{foo.replace(\"\\\"\", \"\")}\" is 'hello'\n\nval = 10\na = \"\"\"\n    basic heredoc #{val}\n    on two lines\n    \"\"\"\nb = '''\n    basic heredoc #{val}\n    on two lines\n    '''\nok a is \"basic heredoc 10\\non two lines\"\nok b is \"basic heredoc \\#{val}\\non two lines\"\n\neq 'multiline nested \"interpolations\" work', \"\"\"multiline #{\n  \"nested #{(->\n    ok yes\n    \"\\\"interpolations\\\"\"\n  )()}\"\n} work\"\"\"\n\neq 'function(){}', \"#{->}\".replace /\\s/g, ''\nok /^a[\\s\\S]+b$/.test \"a#{=>}b\"\nok /^a[\\s\\S]+b$/.test \"a#{ (x) -> x ** 2 }b\"\n\n# Regular Expression Interpolation\n\n# TODO: improve heregex interpolation tests\n\ntest \"heregex interpolation\", ->\n  eq /\\\\#{}\\\\\"/ + '', ///\n   #{\n     \"#{ '\\\\' }\" # normal comment\n   }\n   # regex comment\n   \\#{}\n   \\\\ \"\n  /// + ''\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"javascript_literals\">\n# JavaScript Literals\n# -------------------\n\ntest \"inline JavaScript is evaluated\", ->\n  eq '\\\\`', `\n    // Inline JS\n    \"\\\\\\\\\\`\"\n  `\n\ntest \"escaped backticks are output correctly\", ->\n  `var a = \\`2 + 2 = ${4}\\``\n  eq a, '2 + 2 = 4'\n\ntest \"backslashes before a newline don’t break JavaScript blocks\", ->\n  `var a = \\`To be, or not\\\\\n  to be.\\``\n  eq a, '''\n  To be, or not\\\\\n    to be.'''\n\ntest \"block inline JavaScript is evaluated\", ->\n  ```\n  var a = 1;\n  var b = 2;\n  ```\n  c = 3\n  ```var d = 4;```\n  eq a + b + c + d, 10\n\ntest \"block inline JavaScript containing backticks\", ->\n  ```\n  // This is a comment with `backticks`\n  var a = 42;\n  var b = `foo ${'bar'}`;\n  var c = 3;\n  var d = 'foo`bar`';\n  ```\n  eq a + c, 45\n  eq b, 'foo bar'\n  eq d, 'foo`bar`'\n\ntest \"block JavaScript can end with an escaped backtick character\", ->\n  ```var a = \\`hello\\````\n  ```\n  var b = \\`world${'!'}\\````\n  eq a, 'hello'\n  eq b, 'world!'\n\ntest \"JavaScript block only escapes backslashes followed by backticks\", ->\n  eq `'\\\\\\n'`, '\\\\\\n'\n\ntest \"escaped JavaScript blocks speed round\", ->\n  # The following has escaped backslashes because they’re required in strings, but the intent is this:\n  # `hello`                                       → hello;\n  # `\\`hello\\``                                   → `hello`;\n  # `\\`Escaping backticks in JS: \\\\\\`hello\\\\\\`\\`` → `Escaping backticks in JS: \\`hello\\``;\n  # `Single backslash: \\ `                        → Single backslash: \\ ;\n  # `Double backslash: \\\\ `                       → Double backslash: \\\\ ;\n  # `Single backslash at EOS: \\\\`                 → Single backslash at EOS: \\;\n  # `Double backslash at EOS: \\\\\\\\`               → Double backslash at EOS: \\\\;\n  for [input, output] in [\n    ['`hello`',                                               'hello;']\n    ['`\\\\`hello\\\\``',                                         '`hello`;']\n    ['`\\\\`Escaping backticks in JS: \\\\\\\\\\\\`hello\\\\\\\\\\\\`\\\\``', '`Escaping backticks in JS: \\\\`hello\\\\``;']\n    ['`Single backslash: \\\\ `',                               'Single backslash: \\\\ ;']\n    ['`Double backslash: \\\\\\\\ `',                             'Double backslash: \\\\\\\\ ;']\n    ['`Single backslash at EOS: \\\\\\\\`',                       'Single backslash at EOS: \\\\;']\n    ['`Double backslash at EOS: \\\\\\\\\\\\\\\\`',                   'Double backslash at EOS: \\\\\\\\;']\n  ]\n    eq CoffeeScript.compile(input, bare: yes), \"#{output}\\n\\n\"\n\n</script>\n<script type=\"text/x-literate-coffeescript\" class=\"test\" id=\"literate\">\nLiterate CoffeeScript Test\n--------------------------\n\ncomment comment\n\n    test \"basic literate CoffeeScript parsing\", ->\n      ok yes\n      \nnow with a...\n  \n    test \"broken up indentation\", ->\n    \n... broken up ...\n\n      do ->\n      \n... nested block.\n\n        ok yes\n\nCode must be separated from text by a blank line.\n\n    test \"code blocks must be preceded by a blank line\", ->\n\nThe next line is part of the text and will not be executed.\n      fail()\n\n      ok yes        \n        \nCode in `backticks is not parsed` and...\n\n    test \"comments in indented blocks work\", ->\n      do ->\n        do ->\n          # Regular comment.\n          \n          ###\n            Block comment.\n          ###\n          \n          ok yes\n          \nRegular [Markdown](http://example.com/markdown) features, like links \nand unordered lists, are fine:\n\n  * I \n  \n  * Am\n  \n  * A\n  \n  * List\n\nTabs work too:\n\n\t\t\t\ttest \"tabbed code\", ->\n\t\t\t\t\tok yes\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"location\">\ntestScript = '''\nif true\n  x = 6\n  console.log \"A console #{x + 7} log\"\n\nfoo = \"bar\"\nz = /// ^ (a#{foo}) ///\n\nx = () ->\n    try\n        console.log \"foo\"\n    catch err\n        # Rewriter will generate explicit indentation here.\n\n    return null\n'''\n\ntest \"Verify location of generated tokens\", ->\n  tokens = CoffeeScript.tokens \"a = 79\"\n\n  eq tokens.length, 4\n  [aToken, equalsToken, numberToken] = tokens\n\n  eq aToken[2].first_line, 0\n  eq aToken[2].first_column, 0\n  eq aToken[2].last_line, 0\n  eq aToken[2].last_column, 0\n\n  eq equalsToken[2].first_line, 0\n  eq equalsToken[2].first_column, 2\n  eq equalsToken[2].last_line, 0\n  eq equalsToken[2].last_column, 2\n\n  eq numberToken[2].first_line, 0\n  eq numberToken[2].first_column, 4\n  eq numberToken[2].last_line, 0\n  eq numberToken[2].last_column, 5\n\ntest \"Verify location of generated tokens (with indented first line)\", ->\n  tokens = CoffeeScript.tokens \"  a = 83\"\n\n  eq tokens.length, 4\n  [aToken, equalsToken, numberToken] = tokens\n\n  eq aToken[2].first_line, 0\n  eq aToken[2].first_column, 2\n  eq aToken[2].last_line, 0\n  eq aToken[2].last_column, 2\n\n  eq equalsToken[2].first_line, 0\n  eq equalsToken[2].first_column, 4\n  eq equalsToken[2].last_line, 0\n  eq equalsToken[2].last_column, 4\n\n  eq numberToken[2].first_line, 0\n  eq numberToken[2].first_column, 6\n  eq numberToken[2].last_line, 0\n  eq numberToken[2].last_column, 7\n\ngetMatchingTokens = (str, wantedTokens...) ->\n  tokens = CoffeeScript.tokens str\n  matchingTokens = []\n  i = 0\n  for token in tokens\n    if token[1].replace(/^'|'$/g, '\"') is wantedTokens[i]\n      i++\n      matchingTokens.push token\n  eq wantedTokens.length, matchingTokens.length\n  matchingTokens\n\ntest 'Verify locations in string interpolation (in \"string\")', ->\n  [a, b, c] = getMatchingTokens '\"a#{b}c\"', '\"a\"', 'b', '\"c\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 0\n  eq a[2].last_line, 0\n  eq a[2].last_column, 1\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 4\n  eq b[2].last_line, 0\n  eq b[2].last_column, 4\n\n  eq c[2].first_line, 0\n  eq c[2].first_column, 6\n  eq c[2].last_line, 0\n  eq c[2].last_column, 7\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation)', ->\n  [a, b, c] = getMatchingTokens '\"#{a}b#{c}\"', 'a', '\"b\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 0\n  eq a[2].last_column, 3\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 5\n  eq b[2].last_line, 0\n  eq b[2].last_column, 5\n\n  eq c[2].first_line, 0\n  eq c[2].first_column, 8\n  eq c[2].last_line, 0\n  eq c[2].last_column, 8\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation and line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"#{a}\\nb\\n#{c}\"', 'a', '\" b \"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 0\n  eq a[2].last_column, 3\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 5\n  eq b[2].last_line, 1\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 2\n  eq c[2].first_column, 2\n  eq c[2].last_line, 2\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\\n#{a}\\nb\\n#{c}\"', 'a', '\" b \"', 'c'\n\n  eq a[2].first_line, 1\n  eq a[2].first_column, 2\n  eq a[2].last_line, 1\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 1\n  eq b[2].first_column, 4\n  eq b[2].last_line, 2\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 3\n  eq c[2].first_column, 2\n  eq c[2].last_line, 3\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\\n\\n#{a}\\n\\nb\\n\\n#{c}\"', 'a', '\" b \"', 'c'\n\n  eq a[2].first_line, 2\n  eq a[2].first_column, 2\n  eq a[2].last_line, 2\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 2\n  eq b[2].first_column, 4\n  eq b[2].last_line, 5\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 6\n  eq c[2].first_column, 2\n  eq c[2].last_line, 6\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\\n\\n\\n#{a}\\n\\n\\nb\\n\\n\\n#{c}\"', 'a', '\" b \"', 'c'\n\n  eq a[2].first_line, 3\n  eq a[2].first_column, 2\n  eq a[2].last_line, 3\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 3\n  eq b[2].first_column, 4\n  eq b[2].last_line, 8\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 9\n  eq c[2].first_column, 2\n  eq c[2].last_line, 9\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"a\\n#{b}\\nc\"\"\"', '\"a\\\\n\"', 'b', '\"\\\\nc\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 0\n  eq a[2].last_line, 0\n  eq a[2].last_column, 4\n\n  eq b[2].first_line, 1\n  eq b[2].first_column, 2\n  eq b[2].last_line, 1\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 1\n  eq c[2].first_column, 4\n  eq c[2].last_line, 2\n  eq c[2].last_column, 3\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", starting with a line break)', ->\n  [b, c] = getMatchingTokens '\"\"\"\\n#{b}\\nc\"\"\"', 'b', '\"\\\\nc\"'\n\n  eq b[2].first_line, 1\n  eq b[2].first_column, 2\n  eq b[2].last_line, 1\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 1\n  eq c[2].first_column, 4\n  eq c[2].last_line, 2\n  eq c[2].last_column, 3\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"\\n\\n#{b}\\nc\"\"\"', '\"\\\\n\"', 'b', '\"\\\\nc\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 0\n  eq a[2].last_line, 1\n  eq a[2].last_column, 0\n\n  eq b[2].first_line, 2\n  eq b[2].first_column, 2\n  eq b[2].last_line, 2\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 2\n  eq c[2].first_column, 4\n  eq c[2].last_line, 3\n  eq c[2].last_column, 3\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", multiple interpolation)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"#{a}\\nb\\n#{c}\"\"\"', 'a', '\"\\\\nb\\\\n\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 5\n  eq a[2].last_line, 0\n  eq a[2].last_column, 5\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 7\n  eq b[2].last_line, 1\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 2\n  eq c[2].first_column, 2\n  eq c[2].last_line, 2\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", multiple interpolation, and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"\\n\\n#{a}\\n\\nb\\n\\n#{c}\"\"\"', 'a', '\"\\\\n\\\\nb\\\\n\\\\n\"', 'c'\n\n  eq a[2].first_line, 2\n  eq a[2].first_column, 2\n  eq a[2].last_line, 2\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 2\n  eq b[2].first_column, 4\n  eq b[2].last_line, 5\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 6\n  eq c[2].first_column, 2\n  eq c[2].last_line, 6\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", multiple interpolation, and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"\\n\\n\\n#{a}\\n\\n\\nb\\n\\n\\n#{c}\"\"\"', 'a', '\"\\\\n\\\\n\\\\nb\\\\n\\\\n\\\\n\"', 'c'\n\n  eq a[2].first_line, 3\n  eq a[2].first_column, 2\n  eq a[2].last_line, 3\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 3\n  eq b[2].first_column, 4\n  eq b[2].last_line, 8\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 9\n  eq c[2].first_column, 2\n  eq c[2].last_line, 9\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation)', ->\n  [a, b, c] = getMatchingTokens '///#{a}b#{c}///', 'a', '\"b\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 5\n  eq a[2].last_line, 0\n  eq a[2].last_column, 5\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 7\n  eq b[2].last_line, 0\n  eq b[2].last_column, 7\n\n  eq c[2].first_line, 0\n  eq c[2].first_column, 10\n  eq c[2].last_line, 0\n  eq c[2].last_column, 10\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation)', ->\n  [a, b, c] = getMatchingTokens '///a#{b}c///', '\"a\"', 'b', '\"c\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 0\n  eq a[2].last_line, 0\n  eq a[2].last_column, 3\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 6\n  eq b[2].last_line, 0\n  eq b[2].last_column, 6\n\n  eq c[2].first_line, 0\n  eq c[2].first_column, 8\n  eq c[2].last_line, 0\n  eq c[2].last_column, 11\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks)', ->\n  [a, b, c] = getMatchingTokens '///#{a}\\nb\\n#{c}///', 'a', '\"b\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 5\n  eq a[2].last_line, 0\n  eq a[2].last_column, 5\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 7\n  eq b[2].last_line, 1\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 2\n  eq c[2].first_column, 2\n  eq c[2].last_line, 2\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks)', ->\n  [a, b, c] = getMatchingTokens '///#{a}\\n\\n\\nb\\n\\n\\n#{c}///', 'a', '\"b\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 5\n  eq a[2].last_line, 0\n  eq a[2].last_column, 5\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 7\n  eq b[2].last_line, 5\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 6\n  eq c[2].first_column, 2\n  eq c[2].last_line, 6\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks)', ->\n  [a, b, c] = getMatchingTokens '///a\\n\\n\\n#{b}\\n\\n\\nc///', '\"a\"', 'b', '\"c\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 0\n  eq a[2].last_line, 2\n  eq a[2].last_column, 0\n\n  eq b[2].first_line, 3\n  eq b[2].first_column, 2\n  eq b[2].last_line, 3\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 3\n  eq c[2].first_column, 4\n  eq c[2].last_line, 6\n  eq c[2].last_column, 3\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks and starting with linebreak)', ->\n  [a, b, c] = getMatchingTokens '///\\n#{a}\\nb\\n#{c}///', 'a', '\"b\"', 'c'\n\n  eq a[2].first_line, 1\n  eq a[2].first_column, 2\n  eq a[2].last_line, 1\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 1\n  eq b[2].first_column, 4\n  eq b[2].last_line, 2\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 3\n  eq c[2].first_column, 2\n  eq c[2].last_line, 3\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks and starting with linebreak)', ->\n  [a, b, c] = getMatchingTokens '///\\n\\n\\n#{a}\\n\\n\\nb\\n\\n\\n#{c}///', 'a', '\"b\"', 'c'\n\n  eq a[2].first_line, 3\n  eq a[2].first_column, 2\n  eq a[2].last_line, 3\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 3\n  eq b[2].first_column, 4\n  eq b[2].last_line, 8\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 9\n  eq c[2].first_column, 2\n  eq c[2].last_line, 9\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks and starting with linebreak)', ->\n  [a, b, c] = getMatchingTokens '///\\n\\n\\na\\n\\n\\n#{b}\\n\\n\\nc///', '\"a\"', 'b', '\"c\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 0\n  eq a[2].last_line, 5\n  eq a[2].last_column, 0\n\n  eq b[2].first_line, 6\n  eq b[2].first_column, 2\n  eq b[2].last_line, 6\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 6\n  eq c[2].first_column, 4\n  eq c[2].last_line, 9\n  eq c[2].last_column, 3\n\ntest \"#3822: Simple string/regex start/end should include delimiters\", ->\n  [stringToken] = CoffeeScript.tokens \"'string'\"\n  eq stringToken[2].first_line, 0\n  eq stringToken[2].first_column, 0\n  eq stringToken[2].last_line, 0\n  eq stringToken[2].last_column, 7\n\n  [regexToken] = CoffeeScript.tokens \"/regex/\"\n  eq regexToken[2].first_line, 0\n  eq regexToken[2].first_column, 0\n  eq regexToken[2].last_line, 0\n  eq regexToken[2].last_column, 6\n\ntest \"#3621: Multiline regex and manual `Regex` call with interpolation should\n      result in the same tokens\", ->\n  tokensA = CoffeeScript.tokens '(RegExp(\".*#{a}[0-9]\"))'\n  tokensB = CoffeeScript.tokens '///.*#{a}[0-9]///'\n  eq tokensA.length, tokensB.length\n  for i in [0...tokensA.length] by 1\n    tokenA = tokensA[i]\n    tokenB = tokensB[i]\n    eq tokenA[0], tokenB[0] unless tokenB[0] in ['REGEX_START', 'REGEX_END']\n    eq tokenA[1], tokenB[1]\n    unless tokenA[0] is 'STRING_START' or tokenB[0] is 'REGEX_START'\n      eq tokenA.origin?[1], tokenB.origin?[1]\n    eq tokenA.stringEnd, tokenB.stringEnd\n\ntest \"Verify tokens have locations that are in order\", ->\n  source = '''\n    a {\n      b: ->\n        return c d,\n          if e\n            f\n    }\n    g\n  '''\n  tokens = CoffeeScript.tokens source\n  lastToken = null\n  for token in tokens\n    if lastToken\n      ok token[2].first_line >= lastToken[2].last_line\n      if token[2].first_line == lastToken[2].last_line\n        ok token[2].first_column >= lastToken[2].last_column\n    lastToken = token\n\ntest \"Verify OUTDENT tokens are located at the end of the previous token\", ->\n  source = '''\n    SomeArr = [ ->\n      if something\n        lol =\n          count: 500\n    ]\n  '''\n  tokens = CoffeeScript.tokens source\n  [..., number, curly, outdent1, outdent2, outdent3, bracket, terminator] = tokens\n  eq number[0], 'NUMBER'\n  for outdent in [outdent1, outdent2, outdent3]\n    eq outdent[0], 'OUTDENT'\n    eq outdent[2].first_line, number[2].last_line\n    eq outdent[2].first_column, number[2].last_column\n    eq outdent[2].last_line, number[2].last_line\n    eq outdent[2].last_column, number[2].last_column\n\ntest \"Verify OUTDENT and CALL_END tokens are located at the end of the previous token\", ->\n  source = '''\n    a = b {\n      c: ->\n        d e,\n          if f\n            g {},\n              if h\n                i {}\n    }\n  '''\n  tokens = CoffeeScript.tokens source\n  [..., closeCurly1, callEnd1, outdent1, outdent2, callEnd2, outdent3, outdent4,\n    callEnd3, outdent5, outdent6, closeCurly2, callEnd4, terminator] = tokens\n  eq closeCurly1[0], '}'\n  assertAtCloseCurly = (token) ->\n    eq token[2].first_line, closeCurly1[2].last_line\n    eq token[2].first_column, closeCurly1[2].last_column\n    eq token[2].last_line, closeCurly1[2].last_line\n    eq token[2].last_column, closeCurly1[2].last_column\n\n  for token in [outdent1, outdent2, outdent3, outdent4, outdent5, outdent6]\n    eq token[0], 'OUTDENT'\n    assertAtCloseCurly(token)\n  for token in [callEnd1, callEnd2, callEnd3]\n    eq token[0], 'CALL_END'\n    assertAtCloseCurly(token)\n\ntest \"Verify generated } tokens are located at the end of the previous token\", ->\n  source = '''\n    a(b, ->\n      c: () ->\n        if d\n          e\n    )\n  '''\n  tokens = CoffeeScript.tokens source\n  [..., identifier, outdent1, outdent2, closeCurly, outdent3, callEnd,\n    terminator] = tokens\n  eq identifier[0], 'IDENTIFIER'\n  assertAtIdentifier = (token) ->\n    eq token[2].first_line, identifier[2].last_line\n    eq token[2].first_column, identifier[2].last_column\n    eq token[2].last_line, identifier[2].last_line\n    eq token[2].last_column, identifier[2].last_column\n\n  for token in [outdent1, outdent2, closeCurly, outdent3]\n    assertAtIdentifier(token)\n\ntest \"Verify real CALL_END tokens have the right position\", ->\n  source = '''\n    a()\n  '''\n  tokens = CoffeeScript.tokens source\n  [identifier, callStart, callEnd, terminator] = tokens\n  startIndex = identifier[2].first_column\n  eq identifier[2].last_column, startIndex\n  eq callStart[2].first_column, startIndex + 1\n  eq callStart[2].last_column, startIndex + 1\n  eq callEnd[2].first_column, startIndex + 2\n  eq callEnd[2].last_column, startIndex + 2\n\ntest \"Verify normal heredocs have the right position\", ->\n  source = '''\n    \"\"\"\n    a\"\"\"\n  '''\n  [stringToken] = CoffeeScript.tokens source\n  eq stringToken[2].first_line, 0\n  eq stringToken[2].first_column, 0\n  eq stringToken[2].last_line, 1\n  eq stringToken[2].last_column, 3\n\ntest \"Verify heredocs ending with a newline have the right position\", ->\n  source = '''\n    \"\"\"\n    a\n    \"\"\"\n  '''\n  [stringToken] = CoffeeScript.tokens source\n  eq stringToken[2].first_line, 0\n  eq stringToken[2].first_column, 0\n  eq stringToken[2].last_line, 2\n  eq stringToken[2].last_column, 2\n\ntest \"Verify indented heredocs have the right position\", ->\n  source = '''\n    ->\n      \"\"\"\n        a\n      \"\"\"\n  '''\n  [arrow, indent, stringToken] = CoffeeScript.tokens source\n  eq stringToken[2].first_line, 1\n  eq stringToken[2].first_column, 2\n  eq stringToken[2].last_line, 3\n  eq stringToken[2].last_column, 4\n\ntest \"Verify heregexes with interpolations have the right ending position\", ->\n  source = '''\n    [a ///#{b}///g]\n  '''\n  [..., stringEnd, comma, flagsString, regexCallEnd, regexEnd, fnCallEnd,\n    arrayEnd, terminator] = CoffeeScript.tokens source\n\n  eq comma[0], ','\n  eq arrayEnd[0], ']'\n\n  assertColumn = (token, column) ->\n    eq token[2].first_line, 0\n    eq token[2].first_column, column\n    eq token[2].last_line, 0\n    eq token[2].last_column, column\n\n  arrayEndColumn = arrayEnd[2].first_column\n  for token in [comma, flagsString]\n    assertColumn token, arrayEndColumn - 2\n  for token in [regexCallEnd, regexEnd, fnCallEnd]\n    assertColumn token, arrayEndColumn - 1\n  assertColumn arrayEnd, arrayEndColumn\n\ntest \"Verify all tokens get a location\", ->\n  doesNotThrow ->\n    tokens = CoffeeScript.tokens testScript\n    for token in tokens\n        ok !!token[2]\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"modules\">\n# Modules, a.k.a. ES2015 import/export\n# ------------------------------------\n#\n# Remember, we’re not *resolving* modules, just outputting valid ES2015 syntax.\n\n\n# This is the CoffeeScript import and export syntax, closely modeled after the ES2015 syntax\n# https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import\n# https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export\n\n# import \"module-name\"\n# import defaultMember from \"module-name\"\n# import * as name from \"module-name\"\n# import { } from \"module-name\"\n# import { member } from \"module-name\"\n# import { member as alias } from \"module-name\"\n# import { member1, member2 as alias2, … } from \"module-name\"\n# import defaultMember, * as name from \"module-name\"\n# import defaultMember, { … } from \"module-name\"\n\n# export default expression\n# export class name\n# export { }\n# export { name }\n# export { name as exportedName }\n# export { name as default }\n# export { name1, name2 as exportedName2, name3 as default, … }\n#\n# export * from \"module-name\"\n# export { … } from \"module-name\"\n#\n# As a subsitute for `export var name = …` and `export function name {}`,\n# CoffeeScript also supports:\n# export name = …\n\n# CoffeeScript also supports optional commas within `{ … }`.\n\n\n# Import statements\n\ntest \"backticked import statement\", ->\n  input = \"\"\"\n    if Meteor.isServer\n      `import { foo, bar as baz } from 'lib'`\"\"\"\n  output = \"\"\"\n    if (Meteor.isServer) {\n      import { foo, bar as baz } from 'lib';\n    }\"\"\"\n  eq toJS(input), output\n\ntest \"import an entire module for side effects only, without importing any bindings\", ->\n  input = \"import 'lib'\"\n  output = \"import 'lib';\"\n  eq toJS(input), output\n\ntest \"import default member from module, adding the member to the current scope\", ->\n  input = \"\"\"\n    import foo from 'lib'\n    foo.fooMethod()\"\"\"\n  output = \"\"\"\n    import foo from 'lib';\n\n    foo.fooMethod();\"\"\"\n  eq toJS(input), output\n\ntest \"import an entire module's contents as an alias, adding the alias to the current scope\", ->\n  input = \"\"\"\n    import * as foo from 'lib'\n    foo.fooMethod()\"\"\"\n  output = \"\"\"\n    import * as foo from 'lib';\n\n    foo.fooMethod();\"\"\"\n  eq toJS(input), output\n\ntest \"import empty object\", ->\n  input = \"import { } from 'lib'\"\n  output = \"import {} from 'lib';\"\n  eq toJS(input), output\n\ntest \"import empty object\", ->\n  input = \"import {} from 'lib'\"\n  output = \"import {} from 'lib';\"\n  eq toJS(input), output\n\ntest \"import a single member of a module, adding the member to the current scope\", ->\n  input = \"\"\"\n    import { foo } from 'lib'\n    foo.fooMethod()\"\"\"\n  output = \"\"\"\n    import {\n      foo\n    } from 'lib';\n\n    foo.fooMethod();\"\"\"\n  eq toJS(input), output\n\ntest \"import a single member of a module as an alias, adding the alias to the current scope\", ->\n  input = \"\"\"\n    import { foo as bar } from 'lib'\n    bar.barMethod()\"\"\"\n  output = \"\"\"\n    import {\n      foo as bar\n    } from 'lib';\n\n    bar.barMethod();\"\"\"\n  eq toJS(input), output\n\ntest \"import multiple members of a module, adding the members to the current scope\", ->\n  input = \"\"\"\n    import { foo, bar } from 'lib'\n    foo.fooMethod()\n    bar.barMethod()\"\"\"\n  output = \"\"\"\n    import {\n      foo,\n      bar\n    } from 'lib';\n\n    foo.fooMethod();\n\n    bar.barMethod();\"\"\"\n  eq toJS(input), output\n\ntest \"import multiple members of a module where some are aliased, adding the members or aliases to the current scope\", ->\n  input = \"\"\"\n    import { foo, bar as baz } from 'lib'\n    foo.fooMethod()\n    baz.bazMethod()\"\"\"\n  output = \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib';\n\n    foo.fooMethod();\n\n    baz.bazMethod();\"\"\"\n  eq toJS(input), output\n\ntest \"import default member and other members of a module, adding the members to the current scope\", ->\n  input = \"\"\"\n    import foo, { bar, baz as qux } from 'lib'\n    foo.fooMethod()\n    bar.barMethod()\n    qux.quxMethod()\"\"\"\n  output = \"\"\"\n    import foo, {\n      bar,\n      baz as qux\n    } from 'lib';\n\n    foo.fooMethod();\n\n    bar.barMethod();\n\n    qux.quxMethod();\"\"\"\n  eq toJS(input), output\n\ntest \"import default member from a module as well as the entire module's contents as an alias, adding the member and alias to the current scope\", ->\n  input = \"\"\"\n    import foo, * as bar from 'lib'\n    foo.fooMethod()\n    bar.barMethod()\"\"\"\n  output = \"\"\"\n    import foo, * as bar from 'lib';\n\n    foo.fooMethod();\n\n    bar.barMethod();\"\"\"\n  eq toJS(input), output\n\ntest \"multiline simple import\", ->\n  input = \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib'\"\"\"\n  output = \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"multiline complex import\", ->\n  input = \"\"\"\n    import foo, {\n      bar,\n      baz as qux\n    } from 'lib'\"\"\"\n  output = \"\"\"\n    import foo, {\n      bar,\n      baz as qux\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"import with optional commas\", ->\n  input = \"import { foo, bar, } from 'lib'\"\n  output = \"\"\"\n    import {\n      foo,\n      bar\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"multiline import without commas\", ->\n  input = \"\"\"\n    import {\n      foo\n      bar\n    } from 'lib'\"\"\"\n  output = \"\"\"\n    import {\n      foo,\n      bar\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"multiline import with optional commas\", ->\n  input = \"\"\"\n    import {\n      foo,\n      bar,\n    } from 'lib'\"\"\"\n  output = \"\"\"\n    import {\n      foo,\n      bar\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"a variable can be assigned after an import\", ->\n  input = \"\"\"\n    import { foo } from 'lib'\n    bar = 5\"\"\"\n  output = \"\"\"\n    var bar;\n\n    import {\n      foo\n    } from 'lib';\n\n    bar = 5;\"\"\"\n  eq toJS(input), output\n\ntest \"variables can be assigned before and after an import\", ->\n  input = \"\"\"\n    foo = 5\n    import { bar } from 'lib'\n    baz = 7\"\"\"\n  output = \"\"\"\n    var baz, foo;\n\n    foo = 5;\n\n    import {\n      bar\n    } from 'lib';\n\n    baz = 7;\"\"\"\n  eq toJS(input), output\n\n# Export statements\n\ntest \"export empty object\", ->\n  input = \"export { }\"\n  output = \"export {};\"\n  eq toJS(input), output\n\ntest \"export empty object\", ->\n  input = \"export {}\"\n  output = \"export {};\"\n  eq toJS(input), output\n\ntest \"export named members within an object\", ->\n  input = \"export { foo, bar }\"\n  output = \"\"\"\n    export {\n      foo,\n      bar\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"export named members as aliases, within an object\", ->\n  input = \"export { foo as bar, baz as qux }\"\n  output = \"\"\"\n    export {\n      foo as bar,\n      baz as qux\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"export named members within an object, with an optional comma\", ->\n  input = \"export { foo, bar, }\"\n  output = \"\"\"\n    export {\n      foo,\n      bar\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"multiline export named members within an object\", ->\n  input = \"\"\"\n    export {\n      foo,\n      bar\n    }\"\"\"\n  output = \"\"\"\n    export {\n      foo,\n      bar\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"multiline export named members within an object, with an optional comma\", ->\n  input = \"\"\"\n    export {\n      foo,\n      bar,\n    }\"\"\"\n  output = \"\"\"\n    export {\n      foo,\n      bar\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"export default string\", ->\n  input = \"export default 'foo'\"\n  output = \"export default 'foo';\"\n  eq toJS(input), output\n\ntest \"export default number\", ->\n  input = \"export default 5\"\n  output = \"export default 5;\"\n  eq toJS(input), output\n\ntest \"export default object\", ->\n  input = \"export default { foo: 'bar', baz: 'qux' }\"\n  output = \"\"\"\n    export default {\n      foo: 'bar',\n      baz: 'qux'\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"export default implicit object\", ->\n  input = \"export default foo: 'bar', baz: 'qux'\"\n  output = \"\"\"\n    export default {\n      foo: 'bar',\n      baz: 'qux'\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"export default multiline implicit object\", ->\n  input = \"\"\"\n    export default\n      foo: 'bar',\n      baz: 'qux'\n    \"\"\"\n  output = \"\"\"\n    export default {\n      foo: 'bar',\n      baz: 'qux'\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"export default assignment expression\", ->\n  input = \"export default foo = 'bar'\"\n  output = \"\"\"\n    var foo;\n\n    export default foo = 'bar';\"\"\"\n  eq toJS(input), output\n\ntest \"export assignment expression\", ->\n  input = \"export foo = 'bar'\"\n  output = \"export var foo = 'bar';\"\n  eq toJS(input), output\n\ntest \"export multiline assignment expression\", ->\n  input = \"\"\"\n    export foo =\n    'bar'\"\"\"\n  output = \"export var foo = 'bar';\"\n  eq toJS(input), output\n\ntest \"export multiline indented assignment expression\", ->\n  input = \"\"\"\n    export foo =\n      'bar'\"\"\"\n  output = \"export var foo = 'bar';\"\n  eq toJS(input), output\n\ntest \"export default function\", ->\n  input = \"export default ->\"\n  output = \"export default function() {};\"\n  eq toJS(input), output\n\ntest \"export default multiline function\", ->\n  input = \"\"\"\n    export default (foo) ->\n      console.log foo\"\"\"\n  output = \"\"\"\n    export default function(foo) {\n      return console.log(foo);\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"export assignment function\", ->\n  input = \"\"\"\n    export foo = (bar) ->\n      console.log bar\"\"\"\n  output = \"\"\"\n    export var foo = function(bar) {\n      return console.log(bar);\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"export assignment function which contains assignments in its body\", ->\n  input = \"\"\"\n    export foo = (bar) ->\n      baz = '!'\n      console.log bar + baz\"\"\"\n  output = \"\"\"\n    export var foo = function(bar) {\n      var baz;\n      baz = '!';\n      return console.log(bar + baz);\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"export default predefined function\", ->\n  input = \"\"\"\n    foo = (bar) ->\n      console.log bar\n    export default foo\"\"\"\n  output = \"\"\"\n    var foo;\n\n    foo = function(bar) {\n      return console.log(bar);\n    };\n\n    export default foo;\"\"\"\n  eq toJS(input), output\n\n# Uncomment this test once ES2015+ `class` support is added\n\n# test \"export default class\", ->\n#   input = \"\"\"\n#     export default class foo extends bar\n#       baz: ->\n#         console.log 'hello, world!'\"\"\"\n#   output = \"\"\"\n#     export default class foo extends bar {\n#       baz: function {\n#         return console.log('hello, world!');\n#       }\n#     }\"\"\"\n#   eq toJS(input), output\n\n# Very limited tests for now, testing that `export class foo` either compiles\n# identically (ES2015+) or at least into some function, leaving the specifics\n# vague in case the CoffeeScript `class` interpretation changes\ntest \"export class\", ->\n  input = \"\"\"\n    export class foo\n      baz: ->\n        console.log 'hello, world!'\"\"\"\n  output = toJS input\n  ok /^export (class foo|var foo = \\(function)/.test toJS input\n\ntest \"export class that extends\", ->\n  input = \"\"\"\n    export class foo extends bar\n      baz: ->\n        console.log 'hello, world!'\"\"\"\n  output = toJS input\n  ok /export (class foo|var foo = \\(function)/.test(output) and \\\n    not /var foo(;|,)/.test output\n\ntest \"export default class that extends\", ->\n  input = \"\"\"\n    export default class foo extends bar\n      baz: ->\n        console.log 'hello, world!'\"\"\"\n  ok /export default (class foo|foo = \\(function)/.test toJS input\n\ntest \"export default named member, within an object\", ->\n  input = \"export { foo as default, bar }\"\n  output = \"\"\"\n    export {\n      foo as default,\n      bar\n    };\"\"\"\n  eq toJS(input), output\n\n\n# Import and export in the same statement\n\ntest \"export an entire module's contents\", ->\n  input = \"export * from 'lib'\"\n  output = \"export * from 'lib';\"\n  eq toJS(input), output\n\ntest \"export members imported from another module\", ->\n  input = \"export { foo, bar } from 'lib'\"\n  output = \"\"\"\n    export {\n      foo,\n      bar\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"export as aliases members imported from another module\", ->\n  input = \"export { foo as bar, baz as qux } from 'lib'\"\n  output = \"\"\"\n    export {\n      foo as bar,\n      baz as qux\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"export list can contain CoffeeScript keywords\", ->\n  input = \"export { unless } from 'lib'\"\n  output = \"\"\"\n    export {\n      unless\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"export list can contain CoffeeScript keywords when aliasing\", ->\n  input = \"export { when as bar, baz as unless } from 'lib'\"\n  output = \"\"\"\n    export {\n      when as bar,\n      baz as unless\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\n\n# Edge cases\n\ntest \"multiline import with comments\", ->\n  input = \"\"\"\n    import {\n      foo, # Not as good as bar\n      bar as baz # I prefer qux\n    } from 'lib'\"\"\"\n  output = \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"`from` not part of an import or export statement can still be assigned\", ->\n  from = 5\n  eq 5, from\n\ntest \"a variable named `from` can be assigned after an import\", ->\n  input = \"\"\"\n    import { foo } from 'lib'\n    from = 5\"\"\"\n  output = \"\"\"\n    var from;\n\n    import {\n      foo\n    } from 'lib';\n\n    from = 5;\"\"\"\n  eq toJS(input), output\n\ntest \"`from` can be assigned after a multiline import\", ->\n  input = \"\"\"\n    import {\n      foo\n    } from 'lib'\n    from = 5\"\"\"\n  output = \"\"\"\n    var from;\n\n    import {\n      foo\n    } from 'lib';\n\n    from = 5;\"\"\"\n  eq toJS(input), output\n\ntest \"`from` can be imported as a member name\", ->\n  input = \"import { from } from 'lib'\"\n  output = \"\"\"\n    import {\n      from\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"`from` can be imported as a member name and aliased\", ->\n  input = \"import { from as foo } from 'lib'\"\n  output = \"\"\"\n    import {\n      from as foo\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"`from` can be used as an alias name\", ->\n  input = \"import { foo as from } from 'lib'\"\n  output = \"\"\"\n    import {\n      foo as from\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"`as` can be imported as a member name\", ->\n  input = \"import { as } from 'lib'\"\n  output = \"\"\"\n    import {\n      as\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"`as` can be imported as a member name and aliased\", ->\n  input = \"import { as as foo } from 'lib'\"\n  output = \"\"\"\n    import {\n      as as foo\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"`as` can be used as an alias name\", ->\n  input = \"import { foo as as } from 'lib'\"\n  output = \"\"\"\n    import {\n      foo as as\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"CoffeeScript keywords can be used as imported names in import lists\", ->\n  input = \"\"\"\n    import { unless as bar } from 'lib'\n    bar.barMethod()\"\"\"\n  output = \"\"\"\n    import {\n      unless as bar\n    } from 'lib';\n\n    bar.barMethod();\"\"\"\n  eq toJS(input), output\n\ntest \"`*` can be used in an expression on the same line as an export keyword\", ->\n  input = \"export foo = (x) -> x * x\"\n  output = \"\"\"\n    export var foo = function(x) {\n      return x * x;\n    };\"\"\"\n  eq toJS(input), output\n  input = \"export default foo = (x) -> x * x\"\n  output = \"\"\"\n    var foo;\n\n    export default foo = function(x) {\n      return x * x;\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"`*` and `from` can be used in an export default expression\", ->\n  input = \"\"\"\n    export default foo.extend\n      bar: ->\n        from = 5\n        from = from * 3\"\"\"\n  output = \"\"\"\n    export default foo.extend({\n      bar: function() {\n        var from;\n        from = 5;\n        return from = from * 3;\n      }\n    });\"\"\"\n  eq toJS(input), output\n\ntest \"wrapped members can be imported multiple times if aliased\", ->\n  input = \"import { foo, foo as bar } from 'lib'\"\n  output = \"\"\"\n    import {\n      foo,\n      foo as bar\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"default and wrapped members can be imported multiple times if aliased\", ->\n  input = \"import foo, { foo as bar } from 'lib'\"\n  output = \"\"\"\n    import foo, {\n      foo as bar\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"import a member named default\", ->\n  input = \"import { default } from 'lib'\"\n  output = \"\"\"\n    import {\n      default\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"import an aliased member named default\", ->\n  input = \"import { default as def } from 'lib'\"\n  output = \"\"\"\n    import {\n      default as def\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"export a member named default\", ->\n  input = \"export { default }\"\n  output = \"\"\"\n    export {\n      default\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"export an aliased member named default\", ->\n  input = \"export { def as default }\"\n  output = \"\"\"\n    export {\n      def as default\n    };\"\"\"\n  eq toJS(input), output\n\ntest \"import an imported member named default\", ->\n  input = \"import { default } from 'lib'\"\n  output = \"\"\"\n    import {\n      default\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"import an imported aliased member named default\", ->\n  input = \"import { default as def } from 'lib'\"\n  output = \"\"\"\n    import {\n      default as def\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"export an imported member named default\", ->\n  input = \"export { default } from 'lib'\"\n  output = \"\"\"\n    export {\n      default\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"export an imported aliased member named default\", ->\n  input = \"export { default as def } from 'lib'\"\n  output = \"\"\"\n    export {\n      default as def\n    } from 'lib';\"\"\"\n  eq toJS(input), output\n\ntest \"#4394: export shouldn't prevent variable declarations\", ->\n  input = \"\"\"\n    x = 1\n    export { x }\n  \"\"\"\n  output = \"\"\"\n    var x;\n\n    x = 1;\n\n    export {\n      x\n    };\n  \"\"\"\n  eq toJS(input), output\n\ntest \"#4451: `default` in an export statement is only treated as a keyword when it follows `export` or `as`\", ->\n  input = \"export default { default: 1 }\"\n  output = \"\"\"\n    export default {\n      \"default\": 1\n    };\n  \"\"\"\n  eq toJS(input), output\n\ntest \"#4491: import- and export-specific lexing should stop after import/export statement\", ->\n  input = \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib'\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\"\n  output = \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib';\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n  eq toJS(input), output\n\n  input = \"\"\"\n    import { foo, bar as baz } from 'lib'\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\"\n  output = \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib';\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n  eq toJS(input), output\n\n  input = \"\"\"\n    import * as lib from 'lib'\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\"\n  output = \"\"\"\n    import * as lib from 'lib';\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n  eq toJS(input), output\n\n  input = \"\"\"\n    export {\n      foo,\n      bar\n    }\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\"\n  output = \"\"\"\n    export {\n      foo,\n      bar\n    };\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n  eq toJS(input), output\n\n  input = \"\"\"\n    export * from 'lib'\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\"\n  output = \"\"\"\n    export * from 'lib';\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n  eq toJS(input), output\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"numbers\">\n# Number Literals\n# ---------------\n\n# * Decimal Integer Literals\n# * Octal Integer Literals\n# * Hexadecimal Integer Literals\n# * Scientific Notation Integer Literals\n# * Scientific Notation Non-Integer Literals\n# * Non-Integer Literals\n# * Binary Integer Literals\n\n\n# Binary Integer Literals\n# Binary notation is understood as would be decimal notation.\n\ntest \"Parser recognises binary numbers\", ->\n  eq 4, 0b100\n\n# Decimal Integer Literals\n\ntest \"call methods directly on numbers\", ->\n  eq 4, 4.valueOf()\n  eq '11', 4.toString 3\n\neq -1, 3 -4\n\n#764: Numbers should be indexable\neq Number::toString, 42['toString']\n\neq Number::toString, 42.toString\n\neq Number::toString, 2e308['toString'] # Infinity\n\n\n# Non-Integer Literals\n\n# Decimal number literals.\nvalue = .25 + .75\nok value is 1\nvalue = 0.0 + -.25 - -.75 + 0.0\nok value is 0.5\n\n#764: Numbers should be indexable\neq Number::toString,   4['toString']\neq Number::toString, 4.2['toString']\neq Number::toString, .42['toString']\neq Number::toString, (4)['toString']\n\neq Number::toString,   4.toString\neq Number::toString, 4.2.toString\neq Number::toString, .42.toString\neq Number::toString, (4).toString\n\ntest '#1168: leading floating point suppresses newline', ->\n  eq 1, do ->\n    1\n    .5 + 0.5\n\ntest \"Python-style octal literal notation '0o777'\", ->\n  eq 511, 0o777\n  eq 1, 0o1\n  eq 1, 0o00001\n  eq parseInt('0777', 8), 0o777\n  eq '777', 0o777.toString 8\n  eq 4, 0o4.valueOf()\n  eq Number::toString, 0o777['toString']\n  eq Number::toString, 0o777.toString\n\ntest \"#2060: Disallow uppercase radix prefixes and exponential notation\", ->\n  for char in ['b', 'o', 'x', 'e']\n    program = \"0#{char}0\"\n    doesNotThrow -> CoffeeScript.compile program, bare: yes\n    throws -> CoffeeScript.compile program.toUpperCase(), bare: yes\n\ntest \"#2224: hex literals with 0b or B or E\", ->\n  eq 176, 0x0b0\n  eq 177, 0x0B1\n  eq 225, 0xE1\n\ntest \"Infinity\", ->\n  eq Infinity, CoffeeScript.eval \"0b#{Array(1024 + 1).join('1')}\"\n  eq Infinity, CoffeeScript.eval \"0o#{Array(342 + 1).join('7')}\"\n  eq Infinity, CoffeeScript.eval \"0x#{Array(256 + 1).join('f')}\"\n  eq Infinity, CoffeeScript.eval Array(500 + 1).join('9')\n  eq Infinity, 2e308\n\ntest \"NaN\", ->\n  ok isNaN 1/NaN\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"objects\">\n# Object Literals\n# ---------------\n\n# TODO: refactor object literal tests\n# TODO: add indexing and method invocation tests: {a}['a'] is a, {a}.a()\n\ntrailingComma = {k1: \"v1\", k2: 4, k3: (-> true),}\nok trailingComma.k3() and (trailingComma.k2 is 4) and (trailingComma.k1 is \"v1\")\n\nok {a: (num) -> num is 10 }.a 10\n\nmoe = {\n  name:  'Moe'\n  greet: (salutation) ->\n    salutation + \" \" + @name\n  hello: ->\n    @['greet'] \"Hello\"\n  10: 'number'\n}\nok moe.hello() is \"Hello Moe\"\nok moe[10] is 'number'\nmoe.hello = ->\n  this['greet'] \"Hello\"\nok moe.hello() is 'Hello Moe'\n\nobj = {\n  is:     -> yes,\n  'not':  -> no,\n}\nok obj.is()\nok not obj.not()\n\n### Top-level object literal... ###\nobj: 1\n### ...doesn't break things. ###\n\n# Object literals should be able to include keywords.\nobj = {class: 'höt'}\nobj.function = 'dog'\nok obj.class + obj.function is 'hötdog'\n\n# Implicit objects as part of chained calls.\npluck = (x) -> x.a\neq 100, pluck pluck pluck a: a: a: 100\n\n\ntest \"YAML-style object literals\", ->\n  obj =\n    a: 1\n    b: 2\n  eq 1, obj.a\n  eq 2, obj.b\n\n  config =\n    development:\n      server: 'localhost'\n      timeout: 10\n\n    production:\n      server: 'dreamboat'\n      timeout: 1000\n\n  ok config.development.server  is 'localhost'\n  ok config.production.server   is 'dreamboat'\n  ok config.development.timeout is 10\n  ok config.production.timeout  is 1000\n\nobj =\n  a: 1,\n  b: 2,\nok obj.a is 1\nok obj.b is 2\n\n# Implicit objects nesting.\nobj =\n  options:\n    value: yes\n  fn: ->\n    {}\n    null\nok obj.options.value is yes\nok obj.fn() is null\n\n# Implicit objects with wacky indentation:\nobj =\n  'reverse': (obj) ->\n    Array.prototype.reverse.call obj\n  abc: ->\n    @reverse(\n      @reverse @reverse ['a', 'b', 'c'].reverse()\n    )\n  one: [1, 2,\n    a: 'b'\n  3, 4]\n  red:\n    orange:\n          yellow:\n                  green: 'blue'\n    indigo: 'violet'\n  misdent: [[],\n  [],\n                  [],\n      []]\nok obj.abc().join(' ') is 'a b c'\nok obj.one.length is 5\nok obj.one[4] is 4\nok obj.one[2].a is 'b'\nok (key for key of obj.red).length is 2\nok obj.red.orange.yellow.green is 'blue'\nok obj.red.indigo is 'violet'\nok obj.misdent.toString() is ',,,'\n\n#542: Objects leading expression statement should be parenthesized.\n{f: -> ok yes }.f() + 1\n\n# String-keyed objects shouldn't suppress newlines.\none =\n  '>!': 3\nsix: -> 10\nok not one.six\n\n# Shorthand objects with property references.\nobj =\n  ### comment one ###\n  ### comment two ###\n  one: 1\n  two: 2\n  object: -> {@one, @two}\n  list:   -> [@one, @two]\nresult = obj.object()\neq result.one, 1\neq result.two, 2\neq result.two, obj.list()[1]\n\nthird = (a, b, c) -> c\nobj =\n  one: 'one'\n  two: third 'one', 'two', 'three'\nok obj.one is 'one'\nok obj.two is 'three'\n\ntest \"invoking functions with implicit object literals\", ->\n  generateGetter = (prop) -> (obj) -> obj[prop]\n  getA = generateGetter 'a'\n  getArgs = -> arguments\n  a = b = 30\n\n  result = getA\n    a: 10\n  eq 10, result\n\n  result = getA\n    \"a\": 20\n  eq 20, result\n\n  result = getA a,\n    b:1\n  eq undefined, result\n\n  result = getA b:1,\n  a:43\n  eq 43, result\n\n  result = getA b:1,\n    a:62\n  eq undefined, result\n\n  result = getA\n    b:1\n    a\n  eq undefined, result\n\n  result = getA\n    a:\n      b:2\n    b:1\n  eq 2, result.b\n\n  result = getArgs\n    a:1\n    b\n    c:1\n  ok result.length is 3\n  ok result[2].c is 1\n\n  result = getA b: 13, a: 42, 2\n  eq 42, result\n\n  result = getArgs a:1, (1 + 1)\n  ok result[1] is 2\n\n  result = getArgs a:1, b\n  ok result.length is 2\n  ok result[1] is 30\n\n  result = getArgs a:1, b, b:1, a\n  ok result.length is 4\n  ok result[2].b is 1\n\n  throws -> CoffeeScript.compile \"a = b:1, c\"\n\ntest \"some weird indentation in YAML-style object literals\", ->\n  two = (a, b) -> b\n  obj = then two 1,\n    1: 1\n    a:\n      b: ->\n        fn c,\n          d: e\n    f: 1\n  eq 1, obj[1]\n\ntest \"#1274: `{} = a()` compiles to `false` instead of `a()`\", ->\n  a = false\n  fn = -> a = true\n  {} = fn()\n  ok a\n\ntest \"#1436: `for` etc. work as normal property names\", ->\n  obj = {}\n  eq no, obj.hasOwnProperty 'for'\n  obj.for = 'foo' of obj\n  eq yes, obj.hasOwnProperty 'for'\n\ntest \"#2706, Un-bracketed object as argument causes inconsistent behavior\", ->\n  foo = (x, y) -> y\n  bar = baz: yes\n\n  eq yes, foo x: 1, bar.baz\n\ntest \"#2608, Allow inline objects in arguments to be followed by more arguments\", ->\n  foo = (x, y) -> y\n\n  eq yes, foo x: 1, y: 2, yes\n\ntest \"#2308, a: b = c:1\", ->\n  foo = a: b = c: yes\n  eq b.c, yes\n  eq foo.a.c, yes\n\ntest \"#2317, a: b c: 1\", ->\n  foo = (x) -> x\n  bar = a: foo c: yes\n  eq bar.a.c, yes\n\ntest \"#1896, a: func b, {c: d}\", ->\n  first = (x) -> x\n  second = (x, y) -> y\n  third = (x, y, z) -> z\n\n  one = 1\n  two = 2\n  three = 3\n  four = 4\n\n  foo = a: second one, {c: two}\n  eq foo.a.c, two\n\n  bar = a: second one, c: two\n  eq bar.a.c, two\n\n  baz = a: second one, {c: two}, e: first first h: three\n  eq baz.a.c, two\n\n  qux = a: third one, {c: two}, e: first first h: three\n  eq qux.a.e.h, three\n\n  quux = a: third one, {c: two}, e: first(three), h: four\n  eq quux.a.e, three\n  eq quux.a.h, four\n\n  corge = a: third one, {c: two}, e: second three, h: four\n  eq corge.a.e.h, four\n\ntest \"Implicit objects, functions and arrays\", ->\n  first  = (x) -> x\n  second = (x, y) -> y\n\n  foo = [\n    1\n    one: 1\n    two: 2\n    three: 3\n    more:\n      four: 4\n      five: 5, six: 6\n    2, 3, 4\n    5]\n  eq foo[2], 2\n  eq foo[1].more.six, 6\n\n  bar = [\n    1\n    first first first second 1,\n      one: 1, twoandthree: twoandthree: two: 2, three: 3\n      2,\n    2\n    one: 1\n    two: 2\n    three: first second ->\n      no\n    , ->\n      3\n    3\n    4]\n  eq bar[2], 2\n  eq bar[1].twoandthree.twoandthree.two, 2\n  eq bar[3].three(), 3\n  eq bar[4], 3\n\ntest \"#2549, Brace-less Object Literal as a Second Operand on a New Line\", ->\n  foo = no or\n    one: 1\n    two: 2\n    three: 3\n  eq foo.one, 1\n\n  bar = yes and one: 1\n  eq bar.one, 1\n\n  baz = null ?\n    one: 1\n    two: 2\n  eq baz.two, 2\n\ntest \"#2757, Nested\", ->\n  foo =\n    bar:\n      one: 1,\n  eq foo.bar.one, 1\n\n  baz =\n    qux:\n      one: 1,\n    corge:\n      two: 2,\n      three: three: three: 3,\n    xyzzy:\n      thud:\n        four:\n          four: 4,\n      five: 5,\n\n  eq baz.qux.one, 1\n  eq baz.corge.three.three.three, 3\n  eq baz.xyzzy.thud.four.four, 4\n  eq baz.xyzzy.five, 5\n\ntest \"#1865, syntax regression 1.1.3\", ->\n  foo = (x, y) -> y\n\n  bar = a: foo (->),\n    c: yes\n  eq bar.a.c, yes\n\n  baz = a: foo (->), c: yes\n  eq baz.a.c, yes\n\n\ntest \"#1322: implicit call against implicit object with block comments\", ->\n  ((obj, arg) ->\n    eq obj.x * obj.y, 6\n    ok not arg\n  )\n    ###\n    x\n    ###\n    x: 2\n    ### y ###\n    y: 3\n\ntest \"#1513: Top level bare objs need to be wrapped in parens for unary and existence ops\", ->\n  doesNotThrow -> CoffeeScript.run \"{}?\", bare: true\n  doesNotThrow -> CoffeeScript.run \"{}.a++\", bare: true\n\ntest \"#1871: Special case for IMPLICIT_END in the middle of an implicit object\", ->\n  result = 'result'\n  ident = (x) -> x\n\n  result = ident one: 1 if false\n\n  eq result, 'result'\n\n  result = ident\n    one: 1\n    two: 2 for i in [1..3]\n\n  eq result.two.join(' '), '2 2 2'\n\ntest \"#1871: implicit object closed by IMPLICIT_END in implicit returns\", ->\n  ob = do ->\n    a: 1 if no\n  eq ob, undefined\n\n  # instead these return an object\n  func = ->\n    key:\n      i for i in [1, 2, 3]\n\n  eq func().key.join(' '), '1 2 3'\n\n  func = ->\n    key: (i for i in [1, 2, 3])\n\n  eq func().key.join(' '), '1 2 3'\n\ntest \"#1961, #1974, regression with compound assigning to an implicit object\", ->\n\n  obj = null\n\n  obj ?=\n    one: 1\n    two: 2\n\n  eq obj.two, 2\n\n  obj = null\n\n  obj or=\n    three: 3\n    four: 4\n\n  eq obj.four, 4\n\ntest \"#2207: Immediate implicit closes don't close implicit objects\", ->\n  func = ->\n    key: for i in [1, 2, 3] then i\n\n  eq func().key.join(' '), '1 2 3'\n\ntest \"#3216: For loop declaration as a value of an implicit object\", ->\n  test = [0..2]\n  ob =\n    a: for v, i in test then i\n    b: for v, i in test then i\n    c: for v in test by 1 then v\n    d: for v in test when true then v\n  arrayEq ob.a, test\n  arrayEq ob.b, test\n  arrayEq ob.c, test\n  arrayEq ob.d, test\n\ntest 'inline implicit object literals within multiline implicit object literals', ->\n  x =\n    a: aa: 0\n    b: 0\n  eq 0, x.b\n  eq 0, x.a.aa\n\ntest \"object keys with interpolations\", ->\n  # Simple cases.\n  a = 'a'\n  obj = \"#{a}\": yes\n  eq obj.a, yes\n  obj = {\"#{a}\": yes}\n  eq obj.a, yes\n  obj = {\"#{a}\"}\n  eq obj.a, 'a'\n  obj = {\"#{5}\"}\n  eq obj[5], '5' # Note that the value is a string, just like the key.\n\n  # Commas in implicit object.\n  obj = \"#{'a'}\": 1, b: 2\n  deepEqual obj, {a: 1, b: 2}\n  obj = a: 1, \"#{'b'}\": 2\n  deepEqual obj, {a: 1, b: 2}\n  obj = \"#{'a'}\": 1, \"#{'b'}\": 2\n  deepEqual obj, {a: 1, b: 2}\n\n  # Commas in explicit object.\n  obj = {\"#{'a'}\": 1, b: 2}\n  deepEqual obj, {a: 1, b: 2}\n  obj = {a: 1, \"#{'b'}\": 2}\n  deepEqual obj, {a: 1, b: 2}\n  obj = {\"#{'a'}\": 1, \"#{'b'}\": 2}\n  deepEqual obj, {a: 1, b: 2}\n\n  # Commas after key with interpolation.\n  obj = {\"#{'a'}\": yes,}\n  eq obj.a, yes\n  obj = {\n    \"#{'a'}\": 1,\n    \"#{'b'}\": 2,\n    ### herecomment ###\n    \"#{'c'}\": 3,\n  }\n  deepEqual obj, {a: 1, b: 2, c: 3}\n  obj =\n    \"#{'a'}\": 1,\n    \"#{'b'}\": 2,\n    ### herecomment ###\n    \"#{'c'}\": 3,\n  deepEqual obj, {a: 1, b: 2, c: 3}\n  obj =\n    \"#{'a'}\": 1,\n    \"#{'b'}\": 2,\n    ### herecomment ###\n    \"#{'c'}\": 3, \"#{'d'}\": 4,\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4}\n\n  # Key with interpolation mixed with `@prop`.\n  deepEqual (-> {@a, \"#{'b'}\": 2}).call(a: 1), {a: 1, b: 2}\n\n  # Evaluate only once.\n  count = 0\n  b = -> count++; 'b'\n  obj = {\"#{b()}\"}\n  eq obj.b, 'b'\n  eq count, 1\n\n  # Evaluation order.\n  arr = []\n  obj =\n    a: arr.push 1\n    b: arr.push 2\n    \"#{'c'}\": arr.push 3\n    \"#{'d'}\": arr.push 4\n    e: arr.push 5\n    \"#{'f'}\": arr.push 6\n    g: arr.push 7\n  arrayEq arr, [1..7]\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7}\n\n  # Object starting with dynamic key.\n  obj =\n    \"#{'a'}\": 1\n    b: 2\n  deepEqual obj, {a: 1, b: 2}\n\n  # Comments in implicit object.\n  obj =\n    ### leading comment ###\n    \"#{'a'}\": 1\n\n    ### middle ###\n\n    \"#{'b'}\": 2\n    # regular comment\n    'c': 3\n    ### foo ###\n    d: 4\n    \"#{'e'}\": 5\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5}\n\n  # Comments in explicit object.\n  obj = {\n    ### leading comment ###\n    \"#{'a'}\": 1\n\n    ### middle ###\n\n    \"#{'b'}\": 2\n    # regular comment\n    'c': 3\n    ### foo ###\n    d: 4\n    \"#{'e'}\": 5\n  }\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5}\n\n  # A more complicated case.\n  obj = {\n    \"#{'interpolated'}\":\n      \"\"\"\n        #{ '''nested''' }\n      \"\"\": 123: 456\n  }\n  deepEqual obj,\n    interpolated:\n      nested:\n        123: 456\n\ntest \"#4324: Shorthand after interpolated key\", ->\n  a = 2\n  obj = {\"#{1}\": 1, a}\n  eq 1, obj[1]\n  eq 2, obj.a\n\ntest \"#1263: Braceless object return\", ->\n  fn = ->\n    return\n      a: 1\n      b: 2\n      c: -> 3\n\n  obj = fn()\n  eq 1, obj.a\n  eq 2, obj.b\n  eq 3, obj.c()\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"operators\">\n# Operators\n# ---------\n\n# * Operators\n# * Existential Operator (Binary)\n# * Existential Operator (Unary)\n# * Aliased Operators\n# * [not] in/of\n# * Chained Comparison\n\ntest \"binary (2-ary) math operators do not require spaces\", ->\n  a = 1\n  b = -1\n  eq +1, a*-b\n  eq -1, a*+b\n  eq +1, a/-b\n  eq -1, a/+b\n\ntest \"operators should respect new lines as spaced\", ->\n  a = 123 +\n  456\n  eq 579, a\n\n  b = \"1#{2}3\" +\n  \"456\"\n  eq '123456', b\n\ntest \"multiple operators should space themselves\", ->\n  eq (+ +1), (- -1)\n\ntest \"compound operators on successive lines\", ->\n  a = 1\n  a +=\n  1\n  eq a, 2\n\ntest \"bitwise operators\", ->\n  eq  2, (10 &   3)\n  eq 11, (10 |   3)\n  eq  9, (10 ^   3)\n  eq 80, (10 <<  3)\n  eq  1, (10 >>  3)\n  eq  1, (10 >>> 3)\n  num = 10; eq  2, (num &=   3)\n  num = 10; eq 11, (num |=   3)\n  num = 10; eq  9, (num ^=   3)\n  num = 10; eq 80, (num <<=  3)\n  num = 10; eq  1, (num >>=  3)\n  num = 10; eq  1, (num >>>= 3)\n\ntest \"`instanceof`\", ->\n  ok new String instanceof String\n  ok new Boolean instanceof Boolean\n  # `instanceof` supports negation by prefixing the operator with `not`\n  ok new Number not instanceof String\n  ok new Array not instanceof Boolean\n\ntest \"use `::` operator on keywords `this` and `@`\", ->\n  nonce = {}\n  obj =\n    withAt:   -> @::prop\n    withThis: -> this::prop\n  obj.prototype = prop: nonce\n  eq nonce, obj.withAt()\n  eq nonce, obj.withThis()\n\n\n# Existential Operator (Binary)\n\ntest \"binary existential operator\", ->\n  nonce = {}\n\n  b = a ? nonce\n  eq nonce, b\n\n  a = null\n  b = undefined\n  b = a ? nonce\n  eq nonce, b\n\n  a = false\n  b = a ? nonce\n  eq false, b\n\n  a = 0\n  b = a ? nonce\n  eq 0, b\n\ntest \"binary existential operator conditionally evaluates second operand\", ->\n  i = 1\n  func = -> i -= 1\n  result = func() ? func()\n  eq result, 0\n\ntest \"binary existential operator with negative number\", ->\n  a = null ? - 1\n  eq -1, a\n\n\n# Existential Operator (Unary)\n\ntest \"postfix existential operator\", ->\n  ok (if nonexistent? then false else true)\n  defined = true\n  ok defined?\n  defined = false\n  ok defined?\n\ntest \"postfix existential operator only evaluates its operand once\", ->\n  semaphore = 0\n  fn = ->\n    ok false if semaphore\n    ++semaphore\n  ok(if fn()? then true else false)\n\ntest \"negated postfix existential operator\", ->\n  ok !nothing?.value\n\ntest \"postfix existential operator on expressions\", ->\n  eq true, (1 or 0)?, true\n\n\n# `is`,`isnt`,`==`,`!=`\n\ntest \"`==` and `is` should be interchangeable\", ->\n  a = b = 1\n  ok a is 1 and b == 1\n  ok a == b\n  ok a is b\n\ntest \"`!=` and `isnt` should be interchangeable\", ->\n  a = 0\n  b = 1\n  ok a isnt 1 and b != 0\n  ok a != b\n  ok a isnt b\n\n\n# [not] in/of\n\n# - `in` should check if an array contains a value using `indexOf`\n# - `of` should check if a property is defined on an object using `in`\ntest \"in, of\", ->\n  arr = [1]\n  ok 0 of arr\n  ok 1 in arr\n  # prefixing `not` to `in and `of` should negate them\n  ok 1 not of arr\n  ok 0 not in arr\n\ntest \"`in` should be able to operate on an array literal\", ->\n  ok 2 in [0, 1, 2, 3]\n  ok 4 not in [0, 1, 2, 3]\n  arr = [0, 1, 2, 3]\n  ok 2 in arr\n  ok 4 not in arr\n  # should cache the value used to test the array\n  arr = [0]\n  val = 0\n  ok val++ in arr\n  ok val++ not in arr\n  val = 0\n  ok val++ of arr\n  ok val++ not of arr\n\ntest \"`of` and `in` should be able to operate on instance variables\", ->\n  obj = {\n    list: [2,3]\n    in_list: (value) -> value in @list\n    not_in_list: (value) -> value not in @list\n    of_list: (value) -> value of @list\n    not_of_list: (value) -> value not of @list\n  }\n  ok obj.in_list 3\n  ok obj.not_in_list 1\n  ok obj.of_list 0\n  ok obj.not_of_list 2\n\ntest \"#???: `in` with cache and `__indexOf` should work in argument lists\", ->\n  eq 1, [Object() in Array()].length\n\ntest \"#737: `in` should have higher precedence than logical operators\", ->\n  eq 1, 1 in [1] and 1\n\ntest \"#768: `in` should preserve evaluation order\", ->\n  share = 0\n  a = -> share++ if share is 0\n  b = -> share++ if share is 1\n  c = -> share++ if share is 2\n  ok a() not in [b(),c()]\n  eq 3, share\n\ntest \"#1099: empty array after `in` should compile to `false`\", ->\n  eq 1, [5 in []].length\n  eq false, do -> return 0 in []\n\ntest \"#1354: optimized `in` checks should not happen when splats are present\", ->\n  a = [6, 9]\n  eq 9 in [3, a...], true\n\ntest \"#1100: precedence in or-test compilation of `in`\", ->\n  ok 0 in [1 and 0]\n  ok 0 in [1, 1 and 0]\n  ok not (0 in [1, 0 or 1])\n\ntest \"#1630: `in` should check `hasOwnProperty`\", ->\n  ok undefined not in length: 1\n\ntest \"#1714: lexer bug with raw range `for` followed by `in`\", ->\n  0 for [1..2]\n  ok not ('a' in ['b'])\n\n  0 for [1..2]; ok not ('a' in ['b'])\n\n  0 for [1..10] # comment ending\n  ok not ('a' in ['b'])\n\n  # lexer state (specifically @seenFor) should be reset before each compilation\n  CoffeeScript.compile \"0 for [1..2]\"\n  CoffeeScript.compile \"'a' in ['b']\"\n\ntest \"#1099: statically determined `not in []` reporting incorrect result\", ->\n  ok 0 not in []\n\ntest \"#1099: make sure expression tested gets evaluted when array is empty\", ->\n  a = 0\n  (do -> a = 1) in []\n  eq a, 1\n\n# Chained Comparison\n\ntest \"chainable operators\", ->\n  ok 100 > 10 > 1 > 0 > -1\n  ok -1 < 0 < 1 < 10 < 100\n\ntest \"`is` and `isnt` may be chained\", ->\n  ok true is not false is true is not false\n  ok 0 is 0 isnt 1 is 1\n\ntest \"different comparison operators (`>`,`<`,`is`,etc.) may be combined\", ->\n  ok 1 < 2 > 1\n  ok 10 < 20 > 2+3 is 5\n\ntest \"some chainable operators can be negated by `unless`\", ->\n  ok (true unless 0==10!=100)\n\ntest \"operator precedence: `|` lower than `<`\", ->\n  eq 1, 1 | 2 < 3 < 4\n\ntest \"preserve references\", ->\n  a = b = c = 1\n  # `a == b <= c` should become `a === b && b <= c`\n  # (this test does not seem to test for this)\n  ok a == b <= c\n\ntest \"chained operations should evaluate each value only once\", ->\n  a = 0\n  ok 1 > a++ < 1\n\ntest \"#891: incorrect inversion of chained comparisons\", ->\n  ok (true unless 0 > 1 > 2)\n  ok (true unless (this.NaN = 0/0) < 0/0 < this.NaN)\n\ntest \"#1234: Applying a splat to :: applies the splat to the wrong object\", ->\n  nonce = {}\n  class C\n    method: -> @nonce\n    nonce: nonce\n\n  arr = []\n  eq nonce, C::method arr... # should be applied to `C::`\n\ntest \"#1102: String literal prevents line continuation\", ->\n  eq \"': '\", '' +\n     \"': '\"\n\ntest \"#1703, ---x is invalid JS\", ->\n  x = 2\n  eq (- --x), -1\n\ntest \"Regression with implicit calls against an indented assignment\", ->\n  eq 1, a =\n    1\n\n  eq a, 1\n\ntest \"#2155 ... conditional assignment to a closure\", ->\n  x = null\n  func = -> x ?= (-> if true then 'hi')\n  func()\n  eq x(), 'hi'\n\ntest \"#2197: Existential existential double trouble\", ->\n  counter = 0\n  func = -> counter++\n  func()? ? 100\n  eq counter, 1\n\ntest \"#2567: Optimization of negated existential produces correct result\", ->\n  a = 1\n  ok !(!a?)\n  ok !b?\n\ntest \"#2508: Existential access of the prototype\", ->\n  eq NonExistent?::nothing, undefined\n  ok Object?::toString\n\ntest \"power operator\", ->\n  eq 27, 3 ** 3\n\ntest \"power operator has higher precedence than other maths operators\", ->\n  eq 55, 1 + 3 ** 3 * 2\n  eq -4, -2 ** 2\n  eq false, !2 ** 2\n  eq 0, (!2) ** 2\n  eq -2, ~1 ** 5\n\ntest \"power operator is right associative\", ->\n  eq 2, 2 ** 1 ** 3\n\ntest \"power operator compound assignment\", ->\n  a = 2\n  a **= 3\n  eq 8, a\n\ntest \"floor division operator\", ->\n  eq 2, 7 // 3\n  eq -3, -7 // 3\n  eq NaN, 0 // 0\n\ntest \"floor division operator compound assignment\", ->\n  a = 7\n  a //= 1 + 1\n  eq 3, a\n\ntest \"modulo operator\", ->\n  check = (a, b, expected) ->\n    eq expected, a %% b, \"expected #{a} %%%% #{b} to be #{expected}\"\n  check 0, 1, 0\n  check 0, -1, -0\n  check 1, 0, NaN\n  check 1, 2, 1\n  check 1, -2, -1\n  check 1, 3, 1\n  check 2, 3, 2\n  check 3, 3, 0\n  check 4, 3, 1\n  check -1, 3, 2\n  check -2, 3, 1\n  check -3, 3, 0\n  check -4, 3, 2\n  check 5.5, 2.5, 0.5\n  check -5.5, 2.5, 2.0\n\ntest \"modulo operator compound assignment\", ->\n  a = -2\n  a %%= 5\n  eq 3, a\n\ntest \"modulo operator converts arguments to numbers\", ->\n  eq 1, 1 %% '42'\n  eq 1, '1' %% 42\n  eq 1, '1' %% '42'\n\ntest \"#3361: Modulo operator coerces right operand once\", ->\n  count = 0\n  res = 42 %% valueOf: -> count += 1\n  eq 1, count\n  eq 0, res\n\ntest \"#3363: Modulo operator coercing order\", ->\n  count = 2\n  a = valueOf: -> count *= 2\n  b = valueOf: -> count += 1\n  eq 4, a %% b\n  eq 5, count\n\ntest \"#3598: Unary + and - coerce the operand once when it is an identifier\", ->\n  # Unary + and - do not generate `_ref`s when the operand is a number, for\n  # readability. To make sure that they do when the operand is an identifier,\n  # test that they are consistent with another unary operator as well as another\n  # complex expression.\n  # Tip: Making one of the tests temporarily fail lets you easily inspect the\n  # compiled JavaScript.\n\n  assertOneCoercion = (fn) ->\n    count = 0\n    value = valueOf: -> count++; 1\n    fn value\n    eq 1, count\n\n  eq 1, 1 ? 0\n  eq 1, +1 ? 0\n  eq -1, -1 ? 0\n  assertOneCoercion (a) ->\n    eq 1, +a ? 0\n  assertOneCoercion (a) ->\n    eq -1, -a ? 0\n  assertOneCoercion (a) ->\n    eq -2, ~a ? 0\n  assertOneCoercion (a) ->\n    eq 0.5, a / 2 ? 0\n\n  ok -2 <= 1 < 2\n  ok -2 <= +1 < 2\n  ok -2 <= -1 < 2\n  assertOneCoercion (a) ->\n    ok -2 <= +a < 2\n  assertOneCoercion (a) ->\n    ok -2 <= -a < 2\n  assertOneCoercion (a) ->\n    ok -2 <= ~a < 2\n  assertOneCoercion (a) ->\n    ok -2 <= a / 2 < 2\n\n  arrayEq [0], (n for n in [0] by 1)\n  arrayEq [0], (n for n in [0] by +1)\n  arrayEq [0], (n for n in [0] by -1)\n  assertOneCoercion (a) ->\n    arrayEq [0], (n for n in [0] by +a)\n  assertOneCoercion (a) ->\n    arrayEq [0], (n for n in [0] by -a)\n  assertOneCoercion (a) ->\n    arrayEq [0], (n for n in [0] by ~a)\n  assertOneCoercion (a) ->\n    arrayEq [0], (n for n in [0] by a * 2 / 2)\n\n  ok 1 in [0, 1]\n  ok +1 in [0, 1]\n  ok -1 in [0, -1]\n  assertOneCoercion (a) ->\n    ok +a in [0, 1]\n  assertOneCoercion (a) ->\n    ok -a in [0, -1]\n  assertOneCoercion (a) ->\n    ok ~a in [0, -2]\n  assertOneCoercion (a) ->\n    ok a / 2 in [0, 0.5]\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"option_parser\">\n# Option Parser\n# -------------\n\n# TODO: refactor option parser tests\n\n# Ensure that the OptionParser handles arguments correctly.\nreturn unless require?\n{OptionParser} = require './../lib/coffee-script/optparse'\n\nopt = new OptionParser [\n  ['-r', '--required [DIR]',  'desc required']\n  ['-o', '--optional',        'desc optional']\n  ['-l', '--list [FILES*]',   'desc list']\n]\n\ntest \"basic arguments\", ->\n  args = ['one', 'two', 'three', '-r', 'dir']\n  result = opt.parse args\n  arrayEq args, result.arguments\n  eq undefined, result.required\n\ntest \"boolean and parameterised options\", ->\n  result = opt.parse ['--optional', '-r', 'folder', 'one', 'two']\n  ok result.optional\n  eq 'folder', result.required\n  arrayEq ['one', 'two'], result.arguments\n\ntest \"list options\", ->\n  result = opt.parse ['-l', 'one.txt', '-l', 'two.txt', 'three']\n  arrayEq ['one.txt', 'two.txt'], result.list\n  arrayEq ['three'], result.arguments\n\ntest \"-- and interesting combinations\", ->\n  result = opt.parse ['-o','-r','a','-r','b','-o','--','-a','b','--c','d']\n  arrayEq ['-a', 'b', '--c', 'd'], result.arguments\n  ok result.optional\n  eq 'b', result.required\n\n  args = ['--','-o','a','-r','c','-o','--','-a','arg0','-b','arg1']\n  result = opt.parse args\n  eq undefined, result.optional\n  eq undefined, result.required\n  arrayEq args[1..], result.arguments\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"parser\">\n# Parser\n# ---------\n\ntest \"operator precedence for logical operators\", ->\n  source = '''\n    a or b and c\n  '''\n  block = CoffeeScript.nodes source\n  [expression] = block.expressions\n  eq expression.first.base.value, 'a'\n  eq expression.operator, '||'\n  eq expression.second.first.base.value, 'b'\n  eq expression.second.operator, '&&'\n  eq expression.second.second.base.value, 'c'\n\ntest \"operator precedence for bitwise operators\", ->\n  source = '''\n    a | b ^ c & d\n  '''\n  block = CoffeeScript.nodes source\n  [expression] = block.expressions\n  eq expression.first.base.value, 'a'\n  eq expression.operator, '|'\n  eq expression.second.first.base.value, 'b'\n  eq expression.second.operator, '^'\n  eq expression.second.second.first.base.value, 'c'\n  eq expression.second.second.operator, '&'\n  eq expression.second.second.second.base.value, 'd'\n\ntest \"operator precedence for binary ? operator\", ->\n  source = '''\n     a ? b and c\n  '''\n  block = CoffeeScript.nodes source\n  [expression] = block.expressions\n  eq expression.first.base.value, 'a'\n  eq expression.operator, '?'\n  eq expression.second.first.base.value, 'b'\n  eq expression.second.operator, '&&'\n  eq expression.second.second.base.value, 'c'\n\ntest \"new calls have a range including the new\", ->\n  source = '''\n    a = new B().c(d)\n  '''\n  block = CoffeeScript.nodes source\n\n  assertColumnRange = (node, firstColumn, lastColumn) ->\n    eq node.locationData.first_line, 0\n    eq node.locationData.first_column, firstColumn\n    eq node.locationData.last_line, 0\n    eq node.locationData.last_column, lastColumn\n\n  [assign] = block.expressions\n  outerCall = assign.value\n  innerValue = outerCall.variable\n  innerCall = innerValue.base\n\n  assertColumnRange assign, 0, 15\n  assertColumnRange outerCall, 4, 15\n  assertColumnRange innerValue, 4, 12\n  assertColumnRange innerCall, 4, 10\n\ntest \"location data is properly set for nested `new`\", ->\n  source = '''\n    new new A()()\n  '''\n  block = CoffeeScript.nodes source\n\n  assertColumnRange = (node, firstColumn, lastColumn) ->\n    eq node.locationData.first_line, 0\n    eq node.locationData.first_column, firstColumn\n    eq node.locationData.last_line, 0\n    eq node.locationData.last_column, lastColumn\n\n  [outerCall] = block.expressions\n  innerCall = outerCall.variable\n\n  assertColumnRange outerCall, 0, 12\n  assertColumnRange innerCall, 4, 10\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"ranges\">\n# Range Literals\n# --------------\n\n# TODO: add indexing and method invocation tests: [1..4][0] is 1, [0...3].toString()\n\n# shared array\nshared = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\ntest \"basic inclusive ranges\", ->\n  arrayEq [1, 2, 3] , [1..3]\n  arrayEq [0, 1, 2] , [0..2]\n  arrayEq [0, 1]    , [0..1]\n  arrayEq [0]       , [0..0]\n  arrayEq [-1]      , [-1..-1]\n  arrayEq [-1, 0]   , [-1..0]\n  arrayEq [-1, 0, 1], [-1..1]\n\ntest \"basic exclusive ranges\", ->\n  arrayEq [1, 2, 3] , [1...4]\n  arrayEq [0, 1, 2] , [0...3]\n  arrayEq [0, 1]    , [0...2]\n  arrayEq [0]       , [0...1]\n  arrayEq [-1]      , [-1...0]\n  arrayEq [-1, 0]   , [-1...1]\n  arrayEq [-1, 0, 1], [-1...2]\n\n  arrayEq [], [1...1]\n  arrayEq [], [0...0]\n  arrayEq [], [-1...-1]\n\ntest \"downward ranges\", ->\n  arrayEq shared, [9..0].reverse()\n  arrayEq [5, 4, 3, 2] , [5..2]\n  arrayEq [2, 1, 0, -1], [2..-1]\n\n  arrayEq [3, 2, 1]  , [3..1]\n  arrayEq [2, 1, 0]  , [2..0]\n  arrayEq [1, 0]     , [1..0]\n  arrayEq [0]        , [0..0]\n  arrayEq [-1]       , [-1..-1]\n  arrayEq [0, -1]    , [0..-1]\n  arrayEq [1, 0, -1] , [1..-1]\n  arrayEq [0, -1, -2], [0..-2]\n\n  arrayEq [4, 3, 2], [4...1]\n  arrayEq [3, 2, 1], [3...0]\n  arrayEq [2, 1]   , [2...0]\n  arrayEq [1]      , [1...0]\n  arrayEq []       , [0...0]\n  arrayEq []       , [-1...-1]\n  arrayEq [0]      , [0...-1]\n  arrayEq [0, -1]  , [0...-2]\n  arrayEq [1, 0]   , [1...-1]\n  arrayEq [2, 1, 0], [2...-1]\n\ntest \"ranges with variables as enpoints\", ->\n  [a, b] = [1, 3]\n  arrayEq [1, 2, 3], [a..b]\n  arrayEq [1, 2]   , [a...b]\n  b = -2\n  arrayEq [1, 0, -1, -2], [a..b]\n  arrayEq [1, 0, -1]    , [a...b]\n\ntest \"ranges with expressions as endpoints\", ->\n  [a, b] = [1, 3]\n  arrayEq [2, 3, 4, 5, 6], [(a+1)..2*b]\n  arrayEq [2, 3, 4, 5]   , [(a+1)...2*b]\n\ntest \"large ranges are generated with looping constructs\", ->\n  down = [99..0]\n  eq 100, (len = down.length)\n  eq   0, down[len - 1]\n\n  up = [0...100]\n  eq 100, (len = up.length)\n  eq  99, up[len - 1]\n\ntest \"for-from loops over ranges\", ->\n  array1 = []\n  for x from [20..30]\n    array1.push(x)\n    break if x is 25\n  arrayEq array1, [20, 21, 22, 23, 24, 25]\n\ntest \"for-from comprehensions over ranges\", ->\n  array1 = (x + 10 for x from [20..25])\n  ok array1.join(' ') is '30 31 32 33 34 35'\n\n  array2 = (x for x from [20..30] when x %% 2 == 0)\n  ok array2.join(' ') is '20 22 24 26 28 30'\n\ntest \"#1012 slices with arguments object\", ->\n  expected = [0..9]\n  argsAtStart = (-> [arguments[0]..9]) 0\n  arrayEq expected, argsAtStart\n  argsAtEnd = (-> [0..arguments[0]]) 9\n  arrayEq expected, argsAtEnd\n  argsAtBoth = (-> [arguments[0]..arguments[1]]) 0, 9\n  arrayEq expected, argsAtBoth\n\ntest \"#1409: creating large ranges outside of a function body\", ->\n  CoffeeScript.eval '[0..100]'\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"regexps\">\n# Regular Expression Literals\n# ---------------------------\n\n# TODO: add method invocation tests: /regex/.toString()\n\n# * Regexen\n# * Heregexen\n\ntest \"basic regular expression literals\", ->\n  ok 'a'.match(/a/)\n  ok 'a'.match /a/\n  ok 'a'.match(/a/g)\n  ok 'a'.match /a/g\n\ntest \"division is not confused for a regular expression\", ->\n  # Any spacing around the slash is allowed when it cannot be a regex.\n  eq 2, 4 / 2 / 1\n  eq 2, 4/2/1\n  eq 2, 4/ 2 / 1\n  eq 2, 4 /2 / 1\n  eq 2, 4 / 2/ 1\n  eq 2, 4 / 2 /1\n  eq 2, 4 /2/ 1\n\n  a = (regex) -> regex.test 'a b c'\n  a.valueOf = -> 4\n  b = 2\n  g = 1\n\n  eq 2, a / b/g\n  eq 2, a/ b/g\n  eq 2, a / b/ g\n  eq 2, a\t/\tb/g # Tabs.\n  eq 2, a / b/g # Non-breaking spaces.\n  eq true, a /b/g\n  # Use parentheses to disambiguate.\n  eq true, a(/ b/g)\n  eq true, a(/ b/)\n  eq true, a (/ b/)\n  # Escape to disambiguate.\n  eq true, a /\\ b/g\n  eq false, a\t/\\\tb/g\n  eq true, a /\\ b/\n\n  obj = method: -> 2\n  two = 2\n  eq 2, (obj.method()/two + obj.method()/two)\n\n  i = 1\n  eq 2, (4)/2/i\n  eq 1, i/i/i\n\n  a = ''\n  a += ' ' until /   /.test a\n  eq a, '   '\n\n  a = if /=/.test '=' then yes else no\n  eq a, yes\n\n  a = if !/=/.test '=' then yes else no\n  eq a, no\n\n  #3182:\n  match = 'foo=bar'.match /=/\n  eq match[0], '='\n\n  #3410:\n  ok ' '.match(/ /)[0] is ' '\n\n\ntest \"division vs regex after a callable token\", ->\n  b = 2\n  g = 1\n  r = (r) -> r.test 'b'\n\n  a = 4\n  eq 2, a / b/g\n  eq 2, a/b/g\n  eq 2, a/ b/g\n  eq true, r /b/g\n  eq 2, (1 + 3) / b/g\n  eq 2, (1 + 3)/b/g\n  eq 2, (1 + 3)/ b/g\n  eq true, (r) /b/g\n  eq 2, [4][0] / b/g\n  eq 2, [4][0]/b/g\n  eq 2, [4][0]/ b/g\n  eq true, [r][0] /b/g\n  eq 0.5, 4? / b/g\n  eq 0.5, 4?/b/g\n  eq 0.5, 4?/ b/g\n  eq true, r? /b/g\n  (->\n    eq 2, @ / b/g\n    eq 2, @/b/g\n    eq 2, @/ b/g\n  ).call 4\n  (->\n    eq true, @ /b/g\n  ).call r\n  (->\n    eq 2, this / b/g\n    eq 2, this/b/g\n    eq 2, this/ b/g\n  ).call 4\n  (->\n    eq true, this /b/g\n  ).call r\n  class A\n    p: (regex) -> if regex then r regex else 4\n  class B extends A\n    p: ->\n      eq 2, super / b/g\n      eq 2, super/b/g\n      eq 2, super/ b/g\n      eq true, super /b/g\n  new B().p()\n\ntest \"always division and never regex after some tokens\", ->\n  b = 2\n  g = 1\n\n  eq 2, 4 / b/g\n  eq 2, 4/b/g\n  eq 2, 4/ b/g\n  eq 2, 4 /b/g\n  eq 2, \"4\" / b/g\n  eq 2, \"4\"/b/g\n  eq 2, \"4\"/ b/g\n  eq 2, \"4\" /b/g\n  eq 20, \"4#{0}\" / b/g\n  eq 20, \"4#{0}\"/b/g\n  eq 20, \"4#{0}\"/ b/g\n  eq 20, \"4#{0}\" /b/g\n  ok isNaN /a/ / b/g\n  ok isNaN /a/i / b/g\n  ok isNaN /a//b/g\n  ok isNaN /a/i/b/g\n  ok isNaN /a// b/g\n  ok isNaN /a/i/ b/g\n  ok isNaN /a/ /b/g\n  ok isNaN /a/i /b/g\n  eq 0.5, true / b/g\n  eq 0.5, true/b/g\n  eq 0.5, true/ b/g\n  eq 0.5, true /b/g\n  eq 0, false / b/g\n  eq 0, false/b/g\n  eq 0, false/ b/g\n  eq 0, false /b/g\n  eq 0, null / b/g\n  eq 0, null/b/g\n  eq 0, null/ b/g\n  eq 0, null /b/g\n  ok isNaN undefined / b/g\n  ok isNaN undefined/b/g\n  ok isNaN undefined/ b/g\n  ok isNaN undefined /b/g\n  ok isNaN {a: 4} / b/g\n  ok isNaN {a: 4}/b/g\n  ok isNaN {a: 4}/ b/g\n  ok isNaN {a: 4} /b/g\n  o = prototype: 4\n  eq 2, o:: / b/g\n  eq 2, o::/b/g\n  eq 2, o::/ b/g\n  eq 2, o:: /b/g\n  i = 4\n  eq 2.0, i++ / b/g\n  eq 2.5, i++/b/g\n  eq 3.0, i++/ b/g\n  eq 3.5, i++ /b/g\n  eq 4.0, i-- / b/g\n  eq 3.5, i--/b/g\n  eq 3.0, i--/ b/g\n  eq 2.5, i-- /b/g\n\ntest \"compound division vs regex\", ->\n  c = 4\n  i = 2\n\n  a = 10\n  b = a /= c / i\n  eq a, 5\n\n  a = 10\n  b = a /= c /i\n  eq a, 5\n\n  a = 10\n  b = a\t/=\tc /i # Tabs.\n  eq a, 5\n\n  a = 10\n  b = a /= c /i # Non-breaking spaces.\n  eq a, 5\n\n  a = 10\n  b = a/= c /i\n  eq a, 5\n\n  a = 10\n  b = a/=c/i\n  eq a, 5\n\n  a = (regex) -> regex.test '=C '\n  b = a /=c /i\n  eq b, true\n\n  a = (regex) -> regex.test '= C '\n  # Use parentheses to disambiguate.\n  b = a(/= c /i)\n  eq b, true\n  b = a(/= c /)\n  eq b, false\n  b = a (/= c /)\n  eq b, false\n  # Escape to disambiguate.\n  b = a /\\= c /i\n  eq b, true\n  b = a /\\= c /\n  eq b, false\n\ntest \"#764: regular expressions should be indexable\", ->\n  eq /0/['source'], ///#{0}///['source']\n\ntest \"#584: slashes are allowed unescaped in character classes\", ->\n  ok /^a\\/[/]b$/.test 'a//b'\n\ntest \"does not allow to escape newlines\", ->\n  throws -> CoffeeScript.compile '/a\\\\\\nb/'\n\n\n# Heregexe(n|s)\n\ntest \"a heregex will ignore whitespace and comments\", ->\n  eq /^I'm\\x20+[a]\\s+Heregex?\\/\\/\\//gim + '', ///\n    ^ I'm \\x20+ [a] \\s+\n    Heregex? / // # or not\n  ///gim + ''\n\ntest \"an empty heregex will compile to an empty, non-capturing group\", ->\n  eq /(?:)/ + '', ///  /// + ''\n  eq /(?:)/ + '', ////// + ''\n\ntest \"heregex starting with slashes\", ->\n  ok /////a/\\////.test ' //a// '\n\ntest '#2388: `///` in heregex interpolations', ->\n  ok ///a#{///b///}c///.test ' /a/b/c/ '\n  ws = ' \\t'\n  scan = (regex) -> regex.exec('\\t  foo')[0]\n  eq '/\\t  /', /// #{scan /// [#{ws}]* ///} /// + ''\n\ntest \"regexes are not callable\", ->\n  throws -> CoffeeScript.compile '/a/()'\n  throws -> CoffeeScript.compile '///a#{b}///()'\n  throws -> CoffeeScript.compile '/a/ 1'\n  throws -> CoffeeScript.compile '///a#{b}/// 1'\n  throws -> CoffeeScript.compile '''\n    /a/\n       k: v\n  '''\n  throws -> CoffeeScript.compile '''\n    ///a#{b}///\n       k: v\n  '''\n\ntest \"backreferences\", ->\n  ok /(a)(b)\\2\\1/.test 'abba'\n\ntest \"#3795: Escape otherwise invalid characters\", ->\n  ok (/ /).test '\\u2028'\n  ok (/ /).test '\\u2029'\n  ok ///\\ ///.test '\\u2028'\n  ok ///\\ ///.test '\\u2029'\n  ok ///a b///.test 'ab' # The space is U+2028.\n  ok ///a b///.test 'ab' # The space is U+2029.\n  ok ///\\0\n      1///.test '\\x001'\n\n  a = 'a'\n  ok ///#{a} b///.test 'ab' # The space is U+2028.\n  ok ///#{a} b///.test 'ab' # The space is U+2029.\n  ok ///#{a}\\ ///.test 'a\\u2028'\n  ok ///#{a}\\ ///.test 'a\\u2029'\n  ok ///#{a}\\0\n      1///.test 'a\\x001'\n\ntest \"#4248: Unicode code point escapes\", ->\n  # Support for the `u` flag in regexes was added in Node 6.\n  return if new RegExp().unicode is undefined\n  ok /a\\u{1ab}c/u.test 'a\\u01abc'\n  ok ///#{ 'a' }\\u{000001ab}c///u.test 'a\\u{1ab}c'\n  ok ///a\\u{000001ab}c///u.test 'a\\u{1ab}c'\n  ok /a\\u{12345}c/u.test 'a\\ud808\\udf45c'\n\n  # and now without u flag\n  ok /a\\u{1ab}c/.test 'a\\u01abc'\n  ok ///#{ 'a' }\\u{000001ab}c///.test 'a\\u{1ab}c'\n  ok ///a\\u{000001ab}c///.test 'a\\u{1ab}c'\n  ok /a\\u{12345}c/.test 'a\\ud808\\udf45c'\n\n  # rewrite code point escapes\n  input = \"\"\"\n    /\\\\u{bcdef}\\\\u{abc}/u\n    \"\"\"\n  output = \"\"\"\n    /\\\\udab3\\\\uddef\\\\u0abc/u;\n  \"\"\"\n  eq toJS(input), output\n\n  input = \"\"\"\n    ///#{ 'a' }\\\\u{bcdef}///\n    \"\"\"\n  output = \"\"\"\n    /a\\\\udab3\\\\uddef/;\n  \"\"\"\n  eq toJS(input), output\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"repl\">\nreturn if global.testingBrowser\n\nos = require 'os'\nfs = require 'fs'\npath = require 'path'\n\n# REPL\n# ----\nStream = require 'stream'\n\nclass MockInputStream extends Stream\n  constructor: ->\n    @readable = true\n\n  resume: ->\n\n  emitLine: (val) ->\n    @emit 'data', new Buffer(\"#{val}\\n\")\n\nclass MockOutputStream extends Stream\n  constructor: ->\n    @writable = true\n    @written = []\n\n  write: (data) ->\n    #console.log 'output write', arguments\n    @written.push data\n\n  lastWrite: (fromEnd = -1) ->\n    @written[@written.length - 1 + fromEnd].replace /\\r?\\n$/, ''\n\n# Create a dummy history file\nhistoryFile = path.join os.tmpdir(), '.coffee_history_test'\nfs.writeFileSync historyFile, '1 + 2\\n'\n\ntestRepl = (desc, fn) ->\n  input = new MockInputStream\n  output = new MockOutputStream\n  repl = Repl.start {input, output, historyFile}\n  test desc, -> fn input, output, repl\n\nctrlV = { ctrl: true, name: 'v'}\n\n\ntestRepl 'reads history file', (input, output, repl) ->\n  input.emitLine repl.rli.history[0]\n  eq '3', output.lastWrite()\n\ntestRepl \"starts with coffee prompt\", (input, output) ->\n  eq 'coffee> ', output.lastWrite(0)\n\ntestRepl \"writes eval to output\", (input, output) ->\n  input.emitLine '1+1'\n  eq '2', output.lastWrite()\n\ntestRepl \"comments are ignored\", (input, output) ->\n  input.emitLine '1 + 1 #foo'\n  eq '2', output.lastWrite()\n\ntestRepl \"output in inspect mode\", (input, output) ->\n  input.emitLine '\"1 + 1\\\\n\"'\n  eq \"'1 + 1\\\\n'\", output.lastWrite()\n\ntestRepl \"variables are saved\", (input, output) ->\n  input.emitLine \"foo = 'foo'\"\n  input.emitLine 'foobar = \"#{foo}bar\"'\n  eq \"'foobar'\", output.lastWrite()\n\ntestRepl \"empty command evaluates to undefined\", (input, output) ->\n  # A regression fixed in Node 5.11.0 broke the handling of pressing enter in\n  # the Node REPL; see https://github.com/nodejs/node/pull/6090 and\n  # https://github.com/jashkenas/coffeescript/issues/4502.\n  # Just skip this test for versions of Node < 6.\n  return if parseInt(process.versions.node.split('.')[0], 10) < 6\n  input.emitLine ''\n  eq 'undefined', output.lastWrite()\n\ntestRepl \"ctrl-v toggles multiline prompt\", (input, output) ->\n  input.emit 'keypress', null, ctrlV\n  eq '------> ', output.lastWrite(0)\n  input.emit 'keypress', null, ctrlV\n  eq 'coffee> ', output.lastWrite(0)\n\ntestRepl \"multiline continuation changes prompt\", (input, output) ->\n  input.emit 'keypress', null, ctrlV\n  input.emitLine ''\n  eq '....... ', output.lastWrite(0)\n\ntestRepl \"evaluates multiline\", (input, output) ->\n  # Stubs. Could assert on their use.\n  output.cursorTo = (pos) ->\n  output.clearLine = ->\n\n  input.emit 'keypress', null, ctrlV\n  input.emitLine 'do ->'\n  input.emitLine '  1 + 1'\n  input.emit 'keypress', null, ctrlV\n  eq '2', output.lastWrite()\n\ntestRepl \"variables in scope are preserved\", (input, output) ->\n  input.emitLine 'a = 1'\n  input.emitLine 'do -> a = 2'\n  input.emitLine 'a'\n  eq '2', output.lastWrite()\n\ntestRepl \"existential assignment of previously declared variable\", (input, output) ->\n  input.emitLine 'a = null'\n  input.emitLine 'a ?= 42'\n  eq '42', output.lastWrite()\n\ntestRepl \"keeps running after runtime error\", (input, output) ->\n  input.emitLine 'a = b'\n  input.emitLine 'a'\n  eq 'undefined', output.lastWrite()\n\nprocess.on 'exit', ->\n  try\n    fs.unlinkSync historyFile\n  catch exception # Already deleted, nothing else to do.\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"scope\">\n# Scope\n# -----\n\n# * Variable Safety\n# * Variable Shadowing\n# * Auto-closure (`do`)\n# * Global Scope Leaks\n\ntest \"reference `arguments` inside of functions\", ->\n  sumOfArgs = ->\n    sum = (a,b) -> a + b\n    sum = 0\n    sum += num for num in arguments\n    sum\n  eq 10, sumOfArgs(0, 1, 2, 3, 4)\n\ntest \"assignment to an Object.prototype-named variable should not leak to outer scope\", ->\n  # FIXME: fails on IE\n  (->\n    constructor = 'word'\n  )()\n  ok constructor isnt 'word'\n\ntest \"siblings of splat parameters shouldn't leak to surrounding scope\", ->\n  x = 10\n  oops = (x, args...) ->\n  oops(20, 1, 2, 3)\n  eq x, 10\n\ntest \"catch statements should introduce their argument to scope\", ->\n  try throw ''\n  catch e\n    do -> e = 5\n    eq 5, e\n\ntest \"loop variable should be accessible after for-of loop\", ->\n  d = (x for x of {1:'a',2:'b'})\n  ok x in ['1','2']\n\ntest \"loop variable should be accessible after for-in loop\", ->\n  d = (x for x in [1,2])\n  eq x, 2\n\ntest \"loop variable should be accessible after for-from loop\", ->\n  d = (x for x from [1,2])\n  eq x, 2\n\nclass Array then slice: fail # needs to be global\nclass Object then hasOwnProperty: fail\ntest \"#1973: redefining Array/Object constructors shouldn't confuse __X helpers\", ->\n  arr = [1..4]\n  arrayEq [3, 4], arr[2..]\n  obj = {arr}\n  for own k of obj\n    eq arr, obj[k]\n\ntest \"#2255: global leak with splatted @-params\", ->\n  ok not x?\n  arrayEq [0], ((@x...) -> @x).call {}, 0\n  ok not x?\n\ntest \"#1183: super + fat arrows\", ->\n  dolater = (cb) -> cb()\n\n  class A\n  \tconstructor: ->\n  \t\t@_i = 0\n  \tfoo : (cb) ->\n  \t\tdolater =>\n  \t\t\t@_i += 1\n  \t\t\tcb()\n\n  class B extends A\n  \tconstructor : ->\n  \t\tsuper\n  \tfoo : (cb) ->\n  \t\tdolater =>\n  \t\t\tdolater =>\n  \t\t\t\t@_i += 2\n  \t\t\t\tsuper cb\n\n  b = new B\n  b.foo => eq b._i, 3\n\ntest \"#1183: super + wrap\", ->\n  class A\n    m : -> 10\n\n  class B extends A\n    constructor : -> super\n\n  B::m = -> r = try super()\n\n  eq (new B).m(), 10\n\ntest \"#1183: super + closures\", ->\n  class A\n    constructor: ->\n      @i = 10\n    foo : -> @i\n\n  class B extends A\n    foo : ->\n      ret = switch 1\n        when 0 then 0\n        when 1 then super()\n      ret\n  eq (new B).foo(), 10\n\ntest \"#2331: bound super regression\", ->\n  class A\n    @value = 'A'\n    method: -> @constructor.value\n\n  class B extends A\n    method: => super\n\n  eq (new B).method(), 'A'\n\ntest \"#3259: leak with @-params within destructured parameters\", ->\n  fn = ({@foo}, [@bar], [{@baz}]) ->\n    foo = bar = baz = false\n\n  fn.call {}, {foo: 'foo'}, ['bar'], [{baz: 'baz'}]\n\n  eq 'undefined', typeof foo\n  eq 'undefined', typeof bar\n  eq 'undefined', typeof baz\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"slicing_and_splicing\">\n# Slicing and Splicing\n# --------------------\n\n# * Slicing\n# * Splicing\n\n# shared array\nshared = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\n# Slicing\n\ntest \"basic slicing\", ->\n  arrayEq [7, 8, 9]   , shared[7..9]\n  arrayEq [2, 3]      , shared[2...4]\n  arrayEq [2, 3, 4, 5], shared[2...6]\n\ntest \"slicing with variables as endpoints\", ->\n  [a, b] = [1, 4]\n  arrayEq [1, 2, 3, 4], shared[a..b]\n  arrayEq [1, 2, 3]   , shared[a...b]\n\ntest \"slicing with expressions as endpoints\", ->\n  [a, b] = [1, 3]\n  arrayEq [2, 3, 4, 5, 6], shared[(a+1)..2*b]\n  arrayEq [2, 3, 4, 5]   , shared[a+1...(2*b)]\n\ntest \"unbounded slicing\", ->\n  arrayEq [7, 8, 9]   , shared[7..]\n  arrayEq [8, 9]      , shared[-2..]\n  arrayEq [9]         , shared[-1...]\n  arrayEq [0, 1, 2]   , shared[...3]\n  arrayEq [0, 1, 2, 3], shared[..-7]\n\n  arrayEq shared      , shared[..-1]\n  arrayEq shared[0..8], shared[...-1]\n\n  for a in [-shared.length..shared.length]\n    arrayEq shared[a..] , shared[a...]\n  for a in [-shared.length+1...shared.length]\n    arrayEq shared[..a][...-1] , shared[...a]\n\n  arrayEq [1, 2, 3], [1, 2, 3][..]\n\ntest \"#930, #835, #831, #746 #624: inclusive slices to -1 should slice to end\", ->\n  arrayEq shared, shared[0..-1]\n  arrayEq shared, shared[..-1]\n  arrayEq shared.slice(1,shared.length), shared[1..-1]\n\ntest \"string slicing\", ->\n  str = \"abcdefghijklmnopqrstuvwxyz\"\n  ok str[1...1] is \"\"\n  ok str[1..1] is \"b\"\n  ok str[1...5] is \"bcde\"\n  ok str[0..4] is \"abcde\"\n  ok str[-5..] is \"vwxyz\"\n\ntest \"#1722: operator precedence in unbounded slice compilation\", ->\n  list = [0..9]\n  n = 2 # some truthy number in `list`\n  arrayEq [0..n], list[..n]\n  arrayEq [0..n], list[..n or 0]\n  arrayEq [0..n], list[..if n then n else 0]\n\ntest \"#2349: inclusive slicing to numeric strings\", ->\n  arrayEq [0, 1], [0..10][..\"1\"]\n\n\n# Splicing\n\ntest \"basic splicing\", ->\n  ary = [0..9]\n  ary[5..9] = [0, 0, 0]\n  arrayEq [0, 1, 2, 3, 4, 0, 0, 0], ary\n\n  ary = [0..9]\n  ary[2...8] = []\n  arrayEq [0, 1, 8, 9], ary\n\ntest \"unbounded splicing\", ->\n  ary = [0..9]\n  ary[3..] = [9, 8, 7]\n  arrayEq [0, 1, 2, 9, 8, 7]. ary\n\n  ary[...3] = [7, 8, 9]\n  arrayEq [7, 8, 9, 9, 8, 7], ary\n\n  ary[..] = [1, 2, 3]\n  arrayEq [1, 2, 3], ary\n\ntest \"splicing with variables as endpoints\", ->\n  [a, b] = [1, 8]\n\n  ary = [0..9]\n  ary[a..b] = [2, 3]\n  arrayEq [0, 2, 3, 9], ary\n\n  ary = [0..9]\n  ary[a...b] = [5]\n  arrayEq [0, 5, 8, 9], ary\n\ntest \"splicing with expressions as endpoints\", ->\n  [a, b] = [1, 3]\n\n  ary = [0..9]\n  ary[ a+1 .. 2*b+1 ] = [4]\n  arrayEq [0, 1, 4, 8, 9], ary\n\n  ary = [0..9]\n  ary[a+1...2*b+1] = [4]\n  arrayEq [0, 1, 4, 7, 8, 9], ary\n\ntest \"splicing to the end, against a one-time function\", ->\n  ary = null\n  fn = ->\n    if ary\n      throw 'err'\n    else\n      ary = [1, 2, 3]\n\n  fn()[0..] = 1\n\n  arrayEq ary, [1]\n\ntest \"the return value of a splice literal should be the RHS\", ->\n  ary = [0, 0, 0]\n  eq (ary[0..1] = 2), 2\n\n  ary = [0, 0, 0]\n  eq (ary[0..] = 3), 3\n\n  arrayEq [ary[0..0] = 0], [0]\n\ntest \"#1723: operator precedence in unbounded splice compilation\", ->\n  n = 4 # some truthy number in `list`\n\n  list = [0..9]\n  list[..n] = n\n  arrayEq [n..9], list\n\n  list = [0..9]\n  list[..n or 0] = n\n  arrayEq [n..9], list\n\n  list = [0..9]\n  list[..if n then n else 0] = n\n  arrayEq [n..9], list\n\ntest \"#2953: methods on endpoints in assignment from array splice literal\", ->\n  list = [0..9]\n\n  Number.prototype.same = -> this\n  list[1.same()...9.same()] = 5\n  delete Number.prototype.same\n\n  arrayEq [0, 5, 9], list\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"soaks\">\n# Soaks\n# -----\n\n# * Soaked Property Access\n# * Soaked Method Invocation\n# * Soaked Function Invocation\n\n\n# Soaked Property Access\n\ntest \"soaked property access\", ->\n  nonce = {}\n  obj = a: b: nonce\n  eq nonce    , obj?.a.b\n  eq nonce    , obj?['a'].b\n  eq nonce    , obj.a?.b\n  eq nonce    , obj?.a?['b']\n  eq undefined, obj?.a?.non?.existent?.property\n\ntest \"soaked property access caches method calls\", ->\n  nonce ={}\n  obj = fn: -> a: nonce\n  eq nonce    , obj.fn()?.a\n  eq undefined, obj.fn()?.b\n\ntest \"soaked property access caching\", ->\n  nonce = {}\n  counter = 0\n  fn = ->\n    counter++\n    'self'\n  obj =\n    self: -> @\n    prop: nonce\n  eq nonce, obj[fn()]()[fn()]()[fn()]()?.prop\n  eq 3, counter\n\ntest \"method calls on soaked methods\", ->\n  nonce = {}\n  obj = null\n  eq undefined, obj?.a().b()\n  obj = a: -> b: -> nonce\n  eq nonce    , obj?.a().b()\n\ntest \"postfix existential operator mixes well with soaked property accesses\", ->\n  eq false, nonexistent?.property?\n\ntest \"function invocation with soaked property access\", ->\n  id = (_) -> _\n  eq undefined, id nonexistent?.method()\n\ntest \"if-to-ternary should safely parenthesize soaked property accesses\", ->\n  ok (if nonexistent?.property then false else true)\n\ntest \"#726: don't check for a property on a conditionally-referenced nonexistent thing\", ->\n  eq undefined, nonexistent?[Date()]\n\ntest \"#756: conditional assignment edge cases\", ->\n  # TODO: improve this test\n  a = null\n  ok isNaN      a?.b.c +  1\n  eq undefined, a?.b.c += 1\n  eq undefined, ++a?.b.c\n  eq undefined, delete a?.b.c\n\ntest \"operations on soaked properties\", ->\n  # TODO: improve this test\n  a = b: {c: 0}\n  eq 1,   a?.b.c +  1\n  eq 1,   a?.b.c += 1\n  eq 2,   ++a?.b.c\n  eq yes, delete a?.b.c\n\n\n# Soaked Method Invocation\n\ntest \"soaked method invocation\", ->\n  nonce = {}\n  counter = 0\n  obj =\n    self: -> @\n    increment: -> counter++; @\n  eq obj      , obj.self?()\n  eq undefined, obj.method?()\n  eq nonce    , obj.self?().property = nonce\n  eq undefined, obj.method?().property = nonce\n  eq obj      , obj.increment().increment().self?()\n  eq 2        , counter\n\ntest \"#733: conditional assignments\", ->\n  a = b: {c: null}\n  eq a.b?.c?(), undefined\n  a.b?.c or= (it) -> it\n  eq a.b?.c?(1), 1\n  eq a.b?.c?([2, 3]...), 2\n\n\n# Soaked Function Invocation\n\ntest \"soaked function invocation\", ->\n  nonce = {}\n  id = (_) -> _\n  eq nonce    , id?(nonce)\n  eq nonce    , (id? nonce)\n  eq undefined, nonexistent?(nonce)\n  eq undefined, (nonexistent? nonce)\n\ntest \"soaked function invocation with generated functions\", ->\n  nonce = {}\n  id = (_) -> _\n  maybe = (fn, arg) -> if typeof fn is 'function' then () -> fn(arg)\n  eq maybe(id, nonce)?(), nonce\n  eq (maybe id, nonce)?(), nonce\n  eq (maybe false, nonce)?(), undefined\n\ntest \"soaked constructor invocation\", ->\n  eq 42       , +new Number? 42\n  eq undefined,  new Other?  42\n\ntest \"soaked constructor invocations with caching and property access\", ->\n  semaphore = 0\n  nonce = {}\n  class C\n    constructor: ->\n      ok false if semaphore\n      semaphore++\n    prop: nonce\n  eq nonce, (new C())?.prop\n  eq 1, semaphore\n\ntest \"soaked function invocation safe on non-functions\", ->\n  eq undefined, (0)?(1)\n  eq undefined, (0)? 1, 2\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"sourcemap\">\nreturn if global.testingBrowser\n\nSourceMap = require '../src/sourcemap'\n\nvlqEncodedValues = [\n    [1, \"C\"],\n    [-1, \"D\"],\n    [2, \"E\"],\n    [-2, \"F\"],\n    [0, \"A\"],\n    [16, \"gB\"],\n    [948, \"o7B\"]\n]\n\ntest \"encodeVlq tests\", ->\n  for pair in vlqEncodedValues\n    eq ((new SourceMap).encodeVlq pair[0]), pair[1]\n\ntest \"SourceMap tests\", ->\n  map = new SourceMap\n  map.add [0, 0], [0, 0]\n  map.add [1, 5], [2, 4]\n  map.add [1, 6], [2, 7]\n  map.add [1, 9], [2, 8]\n  map.add [3, 0], [3, 4]\n\n  testWithFilenames = map.generate {\n    sourceRoot: \"\"\n    sourceFiles: [\"source.coffee\"]\n    generatedFile: \"source.js\"\n  }\n\n  deepEqual testWithFilenames, {\n    version: 3\n    file: \"source.js\"\n    sourceRoot: \"\"\n    sources: [\"source.coffee\"]\n    names: []\n    mappings: \"AAAA;;IACK,GAAC,CAAG;IAET\"\n  }\n\n  deepEqual map.generate(), {\n    version: 3\n    file: \"\"\n    sourceRoot: \"\"\n    sources: [\"\"]\n    names: []\n    mappings: \"AAAA;;IACK,GAAC,CAAG;IAET\"\n  }\n\n  # Look up a generated column - should get back the original source position.\n  arrayEq map.sourceLocation([2,8]), [1,9]\n\n  # Look up a point further along on the same line - should get back the same source position.\n  arrayEq map.sourceLocation([2,10]), [1,9]\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"strict\">\n# Strict Early Errors\n# -------------------\n\n# The following are prohibited under ES5's `strict` mode\n# * `Octal Integer Literals`\n# * `Octal Escape Sequences`\n# * duplicate property definitions in `Object Literal`s\n# * duplicate formal parameter\n# * `delete` operand is a variable\n# * `delete` operand is a parameter\n# * `delete` operand is `undefined`\n# * `Future Reserved Word`s as identifiers: implements, interface, let, package, private, protected, public, static, yield\n# * `eval` or `arguments` as `catch` identifier\n# * `eval` or `arguments` as formal parameter\n# * `eval` or `arguments` as function declaration identifier\n# * `eval` or `arguments` as LHS of assignment\n# * `eval` or `arguments` as the operand of a post/pre-fix inc/dec-rement expression\n\n# helper to assert that code complies with strict prohibitions\nstrict = (code, msg) ->\n  throws (-> CoffeeScript.compile code), null, msg ? code\nstrictOk = (code, msg) ->\n  doesNotThrow (-> CoffeeScript.compile code), msg ? code\n\n\ntest \"octal integer literals prohibited\", ->\n  strict    '01'\n  strict    '07777'\n  # decimals with a leading '0' are also prohibited\n  strict    '09'\n  strict    '079'\n  strictOk  '`01`'\n\ntest \"octal escape sequences prohibited\", ->\n  strict    '\"\\\\1\"'\n  strict    '\"\\\\7\"'\n  strict    '\"\\\\001\"'\n  strict    '\"\\\\777\"'\n  strict    '\"_\\\\1\"'\n  strict    '\"\\\\1_\"'\n  strict    '\"_\\\\1_\"'\n  strict    '\"\\\\\\\\\\\\1\"'\n  strictOk  '\"\\\\0\"'\n  eq \"\\x00\", \"\\0\"\n  strictOk  '\"\\\\08\"'\n  eq \"\\x008\", \"\\08\"\n  strictOk  '\"\\\\0\\\\8\"'\n  eq \"\\x008\", \"\\0\\8\"\n  strictOk  '\"\\\\8\"'\n  eq \"8\", \"\\8\"\n  strictOk  '\"\\\\\\\\1\"'\n  eq \"\\\\\" + \"1\", \"\\\\1\"\n  strictOk  '\"\\\\\\\\\\\\\\\\1\"'\n  eq \"\\\\\\\\\" + \"1\", \"\\\\\\\\1\"\n  strictOk  \"`'\\\\1'`\"\n  eq \"\\\\\" + \"1\", `\"\\\\1\"`\n\n  # Also test other string types.\n  strict           \"'\\\\\\\\\\\\1'\"\n  eq \"\\x008\",      '\\08'\n  eq \"\\\\\\\\\" + \"1\", '\\\\\\\\1'\n  strict           \"'''\\\\\\\\\\\\1'''\"\n  eq \"\\x008\",      '''\\08'''\n  eq \"\\\\\\\\\" + \"1\", '''\\\\\\\\1'''\n  strict           '\"\"\"\\\\\\\\\\\\1\"\"\"'\n  eq \"\\x008\",      \"\"\"\\08\"\"\"\n  eq \"\\\\\\\\\" + \"1\", \"\"\"\\\\\\\\1\"\"\"\n\ntest \"duplicate formal parameters are prohibited\", ->\n  nonce = {}\n  # a Param can be an Identifier, ThisProperty( @-param ), Array, or Object\n  # a Param can also be a splat (...) or an assignment (param=value)\n  # the following function expressions should throw errors\n  strict '(_,_)->',          'param, param'\n  strict '(_,_...)->',       'param, param...'\n  strict '(_,_ = true)->',   'param, param='\n  strict '(@_,@_)->',        'two @params'\n  strict '(@case,@case)->',  'two @reserved'\n  strict '(_,{_})->',        'param, {param}'\n  strict '(_,{_=true})->',   'param, {param=}'\n  strict '({_,_})->',        '{param, param}'\n  strict '({_=true,_})->',   '{param=, param}'\n  strict '(_,[_])->',        'param, [param]'\n  strict '(_,[_=true])->',   'param, [param=]'\n  strict '([_,_])->',        '[param, param]'\n  strict '([_=true,_])->',   '[param=, param]'\n  strict '(_,[_]=true)->',   'param, [param]='\n  strict '(_,[_=true]=true)->', 'param, [param=]='\n  strict '(_,[@_,{_}])->',   'param, [@param, {param}]'\n  strict '(_,[_,{@_}])->',   'param, [param, {@param}]'\n  strict '(_,[_,{@_=true}])->', 'param, [param, {@param=}]'\n  strict '(_,[_,{_}])->',    'param, [param, {param}]'\n  strict '(_,[_,{__}])->',   'param, [param, {param2}]'\n  strict '(_,[__,{_}])->',   'param, [param2, {param}]'\n  strict '(__,[_,{_}])->',   'param, [param2, {param2}]'\n  strict '({0:a,1:a})->',    '{0:param,1:param}'\n  strict '(a=b=true,a)->',   'param=assignment, param'\n  strict '({a=b=true},a)->', '{param=assignment}, param'\n  # the following function expressions should **not** throw errors\n  strictOk '(_,@_)->'\n  strictOk '(@_,_...)->'\n  strictOk '(_,@_ = true)->'\n  strictOk '(@_,{_})->'\n  strictOk '({_,@_})->'\n  strictOk '({_,@_ = true})->'\n  strictOk '([_,@_])->'\n  strictOk '([_,@_ = true])->'\n  strictOk '({},_arg)->'\n  strictOk '({},{})->'\n  strictOk '([]...,_arg)->'\n  strictOk '({}...,_arg)->'\n  strictOk '({}...,[],_arg)->'\n  strictOk '([]...,{},_arg)->'\n  strictOk '(@case,_case)->'\n  strictOk '(@case,_case...)->'\n  strictOk '(@case...,_case)->'\n  strictOk '(_case,@case)->'\n  strictOk '(_case,@case...)->'\n  strictOk '({a:a})->'\n  strictOk '({a:a,a:b})->'\n\ntest \"`delete` operand restrictions\", ->\n  strict 'a = 1; delete a'\n  strictOk 'delete a' #noop\n  strict '(a) -> delete a'\n  strict '(a...) -> delete a'\n  strict '(a = 1) -> delete a'\n  strict '([a]) -> delete a'\n  strict '({a}) -> delete a'\n\ntest \"`Future Reserved Word`s, `eval` and `arguments` restrictions\", ->\n\n  access = (keyword, check = strict) ->\n    check \"#{keyword}.a = 1\"\n    check \"#{keyword}[0] = 1\"\n  assign = (keyword, check = strict) ->\n    check \"#{keyword} = 1\"\n    check \"#{keyword} += 1\"\n    check \"#{keyword} -= 1\"\n    check \"#{keyword} *= 1\"\n    check \"#{keyword} /= 1\"\n    check \"#{keyword} ?= 1\"\n    check \"#{keyword}++\"\n    check \"++#{keyword}\"\n    check \"#{keyword}--\"\n    check \"--#{keyword}\"\n  destruct = (keyword, check = strict) ->\n    check \"{#{keyword}}\"\n    check \"o = {#{keyword}}\"\n  invoke = (keyword, check = strict) ->\n    check \"#{keyword} yes\"\n    check \"do #{keyword}\"\n  fnDecl = (keyword, check = strict) ->\n    check \"class #{keyword}\"\n  param = (keyword, check = strict) ->\n    check \"(#{keyword}) ->\"\n    check \"({#{keyword}}) ->\"\n  prop = (keyword, check = strict) ->\n    check \"a.#{keyword} = 1\"\n  tryCatch = (keyword, check = strict) ->\n    check \"try new Error catch #{keyword}\"\n\n  future = 'implements interface let package private protected public static'.split ' '\n  for keyword in future\n    access   keyword\n    assign   keyword\n    destruct keyword\n    invoke   keyword\n    fnDecl   keyword\n    param    keyword\n    prop     keyword, strictOk\n    tryCatch keyword\n\n  for keyword in ['eval', 'arguments']\n    access   keyword, strictOk\n    assign   keyword\n    destruct keyword, strictOk\n    invoke   keyword, strictOk\n    fnDecl   keyword\n    param    keyword\n    prop     keyword, strictOk\n    tryCatch keyword\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"strings\">\n# String Literals\n# ---------------\n\n# TODO: refactor string literal tests\n# TODO: add indexing and method invocation tests: \"string\"[\"toString\"] is String::toString, \"string\".toString() is \"string\"\n\n# * Strings\n# * Heredocs\n\ntest \"backslash escapes\", ->\n  eq \"\\\\/\\\\\\\\\", /\\/\\\\/.source\n\neq '(((dollars)))', '\\(\\(\\(dollars\\)\\)\\)'\neq 'one two three', \"one\n two\n three\"\neq \"four five\", 'four\n\n five'\n\ntest \"#3229, multiline strings\", ->\n  # Separate lines by default by a single space in literal strings.\n  eq 'one\n      two', 'one two'\n  eq \"one\n      two\", 'one two'\n  eq '\n        a\n        b\n    ', 'a b'\n  eq \"\n        a\n        b\n    \", 'a b'\n  eq 'one\n\n        two', 'one two'\n  eq \"one\n\n        two\", 'one two'\n  eq '\n    indentation\n      doesn\\'t\n  matter', 'indentation doesn\\'t matter'\n  eq 'trailing ws      \n    doesn\\'t matter', 'trailing ws doesn\\'t matter'\n\n  # Use backslashes at the end of a line to specify whitespace between lines.\n  eq 'a \\\n      b\\\n      c  \\\n      d', 'a bc  d'\n  eq \"a \\\n      b\\\n      c  \\\n      d\", 'a bc  d'\n  eq 'ignore  \\  \n      trailing whitespace', 'ignore  trailing whitespace'\n\n  # Backslash at the beginning of a literal string.\n  eq '\\\n      ok', 'ok'\n  eq '  \\\n      ok', '  ok'\n\n  # #1273, empty strings.\n  eq '\\\n     ', ''\n  eq '\n     ', ''\n  eq '\n          ', ''\n  eq '   ', '   '\n\n  # Same behavior in interpolated strings.\n  eq \"interpolation #{1}\n      follows #{2}  \\\n      too #{3}\\\n      !\", 'interpolation 1 follows 2  too 3!'\n  eq \"a #{\n    'string ' + \"inside\n                 interpolation\"\n    }\", \"a string inside interpolation\"\n  eq \"\n      #{1}\n     \", '1'\n\n  # Handle escaped backslashes correctly.\n  eq '\\\\', `'\\\\'`\n  eq 'escaped backslash at EOL\\\\\n      next line', 'escaped backslash at EOL\\\\ next line'\n  eq '\\\\\n      next line', '\\\\ next line'\n  eq '\\\\\n     ', '\\\\'\n  eq '\\\\\\\\\\\\\n     ', '\\\\\\\\\\\\'\n  eq \"#{1}\\\\\n      after interpolation\", '1\\\\ after interpolation'\n  eq 'escaped backslash before slash\\\\  \\\n      next line', 'escaped backslash before slash\\\\  next line'\n  eq 'triple backslash\\\\\\\n      next line', 'triple backslash\\\\next line'\n  eq 'several escaped backslashes\\\\\\\\\\\\\n      ok', 'several escaped backslashes\\\\\\\\\\\\ ok'\n  eq 'several escaped backslashes slash\\\\\\\\\\\\\\\n      ok', 'several escaped backslashes slash\\\\\\\\\\\\ok'\n  eq 'several escaped backslashes with trailing ws \\\\\\\\\\\\   \n      ok', 'several escaped backslashes with trailing ws \\\\\\\\\\\\ ok'\n\n  # Backslashes at beginning of lines.\n  eq 'first line\n      \\   backslash at BOL', 'first line \\   backslash at BOL'\n  eq 'first line\\\n      \\   backslash at BOL', 'first line\\   backslash at BOL'\n\n  # Backslashes at end of strings.\n  eq 'first line \\ ', 'first line  '\n  eq 'first line\n      second line \\\n      ', 'first line second line '\n  eq 'first line\n      second line\n      \\\n      ', 'first line second line'\n  eq 'first line\n      second line\n\n        \\\n\n      ', 'first line second line'\n\n  # Edge case.\n  eq 'lone\n\n        \\\n\n        backslash', 'lone backslash'\n\ntest \"#3249, escape newlines in heredocs with backslashes\", ->\n  # Ignore escaped newlines\n  eq '''\n    Set whitespace      \\\n       <- this is ignored\\  \n           none\n      normal indentation\n    ''', 'Set whitespace      <- this is ignorednone\\n  normal indentation'\n  eq \"\"\"\n    Set whitespace      \\\n       <- this is ignored\\  \n           none\n      normal indentation\n    \"\"\", 'Set whitespace      <- this is ignorednone\\n  normal indentation'\n\n  # Changed from #647, trailing backslash.\n  eq '''\n  Hello, World\\\n\n  ''', 'Hello, World'\n  eq '''\n    \\\\\n  ''', '\\\\'\n\n  # Backslash at the beginning of a literal string.\n  eq '''\\\n      ok''', 'ok'\n  eq '''  \\\n      ok''', '  ok'\n\n  # Same behavior in interpolated strings.\n  eq \"\"\"\n    interpolation #{1}\n      follows #{2}  \\\n        too #{3}\\\n    !\n  \"\"\", 'interpolation 1\\n  follows 2  too 3!'\n  eq \"\"\"\n\n    #{1} #{2}\n\n    \"\"\", '\\n1 2\\n'\n\n  # Handle escaped backslashes correctly.\n  eq '''\n    escaped backslash at EOL\\\\\n      next line\n  ''', 'escaped backslash at EOL\\\\\\n  next line'\n  eq '''\\\\\n\n     ''', '\\\\\\n'\n\n  # Backslashes at beginning of lines.\n  eq '''first line\n      \\   backslash at BOL''', 'first line\\n\\   backslash at BOL'\n  eq \"\"\"first line\\\n      \\   backslash at BOL\"\"\", 'first line\\   backslash at BOL'\n\n  # Backslashes at end of strings.\n  eq '''first line \\ ''', 'first line  '\n  eq '''\n    first line\n    second line \\\n  ''', 'first line\\nsecond line '\n  eq '''\n    first line\n    second line\n    \\\n  ''', 'first line\\nsecond line'\n  eq '''\n    first line\n    second line\n\n      \\\n\n  ''', 'first line\\nsecond line\\n'\n\n  # Edge cases.\n  eq '''lone\n\n          \\\n\n\n\n        backslash''', 'lone\\n\\n  backslash'\n  eq '''\\\n     ''', ''\n\ntest '#2388: `\"\"\"` in heredoc interpolations', ->\n  eq \"\"\"a heredoc #{\n      \"inside \\\n        interpolation\"\n    }\"\"\", \"a heredoc inside interpolation\"\n  eq \"\"\"a#{\"\"\"b\"\"\"}c\"\"\", 'abc'\n  eq \"\"\"#{\"\"\"\"\"\"}\"\"\", ''\n\ntest \"trailing whitespace\", ->\n  testTrailing = (str, expected) ->\n    eq CoffeeScript.eval(str.replace /\\|$/gm, ''), expected\n  testTrailing '''\"   |\n      |\n    a   |\n           |\n  \"''', 'a'\n  testTrailing \"\"\"'''   |\n      |\n    a   |\n           |\n  '''\"\"\", '  \\na   \\n       '\n\n#647\neq \"''Hello, World\\\\''\", '''\n'\\'Hello, World\\\\\\''\n'''\neq '\"\"Hello, World\\\\\"\"', \"\"\"\n\"\\\"Hello, World\\\\\\\"\"\n\"\"\"\n\ntest \"#1273, escaping quotes at the end of heredocs.\", ->\n  # \"\"\"\\\"\"\" no longer compiles\n  eq \"\"\"\\\\\"\"\", '\\\\'\n  eq \"\"\"\\\\\\\"\"\"\", '\\\\\\\"'\n\na = \"\"\"\n    basic heredoc\n    on two lines\n    \"\"\"\nok a is \"basic heredoc\\non two lines\"\n\na = '''\n    a\n      \"b\n    c\n    '''\nok a is \"a\\n  \\\"b\\nc\"\n\na = \"\"\"\na\n b\n  c\n\"\"\"\nok a is \"a\\n b\\n  c\"\n\na = '''one-liner'''\nok a is 'one-liner'\n\na = \"\"\"\n      out\n      here\n\"\"\"\nok a is \"out\\nhere\"\n\na = '''\n       a\n     b\n   c\n    '''\nok a is \"    a\\n  b\\nc\"\n\na = '''\na\n\n\nb c\n'''\nok a is \"a\\n\\n\\nb c\"\n\na = '''more\"than\"one\"quote'''\nok a is 'more\"than\"one\"quote'\n\na = '''here's an apostrophe'''\nok a is \"here's an apostrophe\"\n\na = \"\"\"\"\"surrounded by two quotes\"\\\"\"\"\"\nok a is '\"\"surrounded by two quotes\"\"'\n\na = '''''surrounded by two apostrophes'\\''''\nok a is \"''surrounded by two apostrophes''\"\n\n# The indentation detector ignores blank lines without trailing whitespace\na = \"\"\"\n    one\n    two\n\n    \"\"\"\nok a is \"one\\ntwo\\n\"\n\neq ''' line 0\n  should not be relevant\n    to the indent level\n''', ' line 0\\nshould not be relevant\\n  to the indent level'\n\neq \"\"\"\n  interpolation #{\n \"contents\"\n }\n  should not be relevant\n    to the indent level\n\"\"\", 'interpolation contents\\nshould not be relevant\\n  to the indent level'\n\neq ''' '\\\\\\' ''', \" '\\\\' \"\neq \"\"\" \"\\\\\\\" \"\"\", ' \"\\\\\" '\n\neq '''  <- keep these spaces ->  ''', '  <- keep these spaces ->  '\n\neq '''undefined''', 'undefined'\neq \"\"\"undefined\"\"\", 'undefined'\n\n\ntest \"#1046, empty string interpolations\", ->\n  eq \"#{ }\", ''\n\ntest \"strings are not callable\", ->\n  throws -> CoffeeScript.compile '\"a\"()'\n  throws -> CoffeeScript.compile '\"a#{b}\"()'\n  throws -> CoffeeScript.compile '\"a\" 1'\n  throws -> CoffeeScript.compile '\"a#{b}\" 1'\n  throws -> CoffeeScript.compile '''\n    \"a\"\n       k: v\n  '''\n  throws -> CoffeeScript.compile '''\n    \"a#{b}\"\n       k: v\n  '''\n\ntest \"#3795: Escape otherwise invalid characters\", ->\n  eq ' ', '\\u2028'\n  eq ' ', '\\u2029'\n  eq '\\0\\\n      1', '\\x001'\n  eq \" \", '\\u2028'\n  eq \" \", '\\u2029'\n  eq \"\\0\\\n      1\", '\\x001'\n  eq ''' ''', '\\u2028'\n  eq ''' ''', '\\u2029'\n  eq '''\\0\\\n      1''', '\\x001'\n  eq \"\"\" \"\"\", '\\u2028'\n  eq \"\"\" \"\"\", '\\u2029'\n  eq \"\"\"\\0\\\n      1\"\"\", '\\x001'\n\n  a = 'a'\n  eq \"#{a} \", 'a\\u2028'\n  eq \"#{a} \", 'a\\u2029'\n  eq \"#{a}\\0\\\n      1\", 'a\\0' + '1'\n  eq \"\"\"#{a} \"\"\", 'a\\u2028'\n  eq \"\"\"#{a} \"\"\", 'a\\u2029'\n  eq \"\"\"#{a}\\0\\\n      1\"\"\", 'a\\0' + '1'\n\ntest \"#4314: Whitespace less than or equal to stripped indentation\", ->\n  # The odd indentation is intentional here, to test 1-space indentation.\n  eq ' ', \"\"\"\n #{} #{}\n\"\"\"\n\n  eq '1 2  3   4    5     end\\na 0     b', \"\"\"\n    #{1} #{2}  #{3}   #{4}    #{5}     end\n    a #{0}     b\"\"\"\n\ntest \"#4248: Unicode code point escapes\", ->\n  eq '\\u01ab\\u00cd', '\\u{1ab}\\u{cd}'\n  eq '\\u01ab', '\\u{000001ab}'\n  eq 'a\\u01ab', \"#{ 'a' }\\u{1ab}\"\n  eq '\\u01abc', '''\\u{01ab}c'''\n  eq '\\u01abc', \"\"\"\\u{1ab}#{ 'c' }\"\"\"\n  eq '\\udab3\\uddef', '\\u{bcdef}'\n  eq '\\udab3\\uddef', '\\u{0000bcdef}'\n  eq 'a\\udab3\\uddef', \"#{ 'a' }\\u{bcdef}\"\n  eq '\\udab3\\uddefc', '''\\u{0bcdef}c'''\n  eq '\\udab3\\uddefc', \"\"\"\\u{bcdef}#{ 'c' }\"\"\"\n  eq '\\\\u{123456}', \"#{'\\\\'}#{'u{123456}'}\"\n\n  # rewrite code point escapes\n  input = \"\"\"\n    '\\\\u{bcdef}\\\\u{abc}'\n    \"\"\"\n  output = \"\"\"\n    '\\\\udab3\\\\uddef\\\\u0abc';\n  \"\"\"\n  eq toJS(input), output\n\n  input = \"\"\"\n    \"#{ 'a' }\\\\u{bcdef}\"\n    \"\"\"\n  output = \"\"\"\n    \"a\\\\udab3\\\\uddef\";\n  \"\"\"\n  eq toJS(input), output\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"tagged_template_literals\">\n# Tagged template literals\n# ------------------------\n\n# NOTES:\n# A tagged template literal is a string that is passed to a prefixing function for\n# post-processing. There's a bunch of different angles that need testing:\n# - Prefixing function, which can be any form of function call:\n#   - function: func'Hello'\n#   - object property with dot notation: outerobj.obj.func'Hello'\n#   - object property with bracket notation: outerobj['obj']['func']'Hello'\n# - String form: single quotes, double quotes and block strings\n# - String is single-line or multi-line\n# - String is interpolated or not\n\nfunc = (text, expressions...) ->\n  \"text: [#{text.join '|'}] expressions: [#{expressions.join '|'}]\"\n\nouterobj =\n  obj:\n    func: func\n\n# Example use\ntest \"tagged template literal for html templating\", ->\n  html = (htmlFragments, expressions...) ->\n    htmlFragments.reduce (fullHtml, htmlFragment, i) ->\n      fullHtml + \"#{expressions[i - 1]}#{htmlFragment}\"\n\n  state =\n    name: 'Greg'\n    adjective: 'awesome'\n\n  eq \"\"\"\n      <p>\n        Hi Greg. You're looking awesome!\n      </p>\n    \"\"\",\n    html\"\"\"\n      <p>\n        Hi #{state.name}. You're looking #{state.adjective}!\n      </p>\n    \"\"\"\n\n# Simple, non-interpolated strings\ntest \"tagged template literal with a single-line single-quote string\", ->\n  eq 'text: [single-line single quotes] expressions: []',\n  func'single-line single quotes'\n\ntest \"tagged template literal with a single-line double-quote string\", ->\n  eq 'text: [single-line double quotes] expressions: []',\n  func\"single-line double quotes\"\n\ntest \"tagged template literal with a single-line single-quote block string\", ->\n  eq 'text: [single-line block string] expressions: []',\n  func'''single-line block string'''\n\ntest \"tagged template literal with a single-line double-quote block string\", ->\n  eq 'text: [single-line block string] expressions: []',\n  func\"\"\"single-line block string\"\"\"\n\ntest \"tagged template literal with a multi-line single-quote string\", ->\n  eq 'text: [multi-line single quotes] expressions: []',\n  func'multi-line\n                                                              single quotes'\n\ntest \"tagged template literal with a multi-line double-quote string\", ->\n  eq 'text: [multi-line double quotes] expressions: []',\n  func\"multi-line\n       double quotes\"\n\ntest \"tagged template literal with a multi-line single-quote block string\", ->\n  eq 'text: [multi-line\\nblock string] expressions: []',\n  func'''\n      multi-line\n      block string\n      '''\n\ntest \"tagged template literal with a multi-line double-quote block string\", ->\n  eq 'text: [multi-line\\nblock string] expressions: []',\n  func\"\"\"\n      multi-line\n      block string\n      \"\"\"\n\n# Interpolated strings with expressions\ntest \"tagged template literal with a single-line double-quote interpolated string\", ->\n  eq 'text: [single-line | double quotes | interpolation] expressions: [36|42]',\n  func\"single-line #{6 * 6} double quotes #{6 * 7} interpolation\"\n\ntest \"tagged template literal with a single-line double-quote block interpolated string\", ->\n  eq 'text: [single-line | block string | interpolation] expressions: [incredible|48]',\n  func\"\"\"single-line #{'incredible'} block string #{6 * 8} interpolation\"\"\"\n\ntest \"tagged template literal with a multi-line double-quote interpolated string\", ->\n  eq 'text: [multi-line | double quotes | interpolation] expressions: [2|awesome]',\n  func\"multi-line #{4/2}\n       double quotes #{'awesome'} interpolation\"\n\ntest \"tagged template literal with a multi-line double-quote block interpolated string\", ->\n  eq 'text: [multi-line |\\nblock string |] expressions: [/abc/|32]',\n  func\"\"\"\n      multi-line #{/abc/}\n      block string #{2 * 16}\n      \"\"\"\n\n\n# Tagged template literal must use a callable function\ntest \"tagged template literal dot notation recognized as a callable function\", ->\n  eq 'text: [dot notation] expressions: []',\n  outerobj.obj.func'dot notation'\n\ntest \"tagged template literal bracket notation recognized as a callable function\", ->\n  eq 'text: [bracket notation] expressions: []',\n  outerobj['obj']['func']'bracket notation'\n\ntest \"tagged template literal mixed dot and bracket notation recognized as a callable function\", ->\n  eq 'text: [mixed notation] expressions: []',\n  outerobj['obj'].func'mixed notation'\n\n\n# Edge cases\ntest \"tagged template literal with an empty string\", ->\n  eq 'text: [] expressions: []',\n  func''\n\ntest \"tagged template literal with an empty interpolated string\", ->\n  eq 'text: [] expressions: []',\n  func\"#{}\"\n\ntest \"tagged template literal as single interpolated expression\", ->\n  eq 'text: [|] expressions: [3]',\n  func\"#{3}\"\n\ntest \"tagged template literal with an interpolated string that itself contains an interpolated string\", ->\n  eq 'text: [inner | string] expressions: [interpolated]',\n  func\"inner #{\"#{'inter'}polated\"} string\"\n\ntest \"tagged template literal with an interpolated string that contains a tagged template literal\", ->\n  eq 'text: [inner tagged | literal] expressions: [text: [|] expressions: [template]]',\n  func\"inner tagged #{func\"#{'template'}\"} literal\"\n\ntest \"tagged template literal with backticks\", ->\n  eq 'text: [ES template literals look like this: `foo bar`] expressions: []',\n  func\"ES template literals look like this: `foo bar`\"\n\ntest \"tagged template literal with escaped backticks\", ->\n  eq 'text: [ES template literals look like this: \\\\`foo bar\\\\`] expressions: []',\n  func\"ES template literals look like this: \\\\`foo bar\\\\`\"\n\ntest \"tagged template literal with unnecessarily escaped backticks\", ->\n  eq 'text: [ES template literals look like this: `foo bar`] expressions: []',\n  func\"ES template literals look like this: \\`foo bar\\`\"\n\ntest \"tagged template literal with ES interpolation\", ->\n  eq 'text: [ES template literals also look like this: `3 + 5 = ${3+5}`] expressions: []',\n  func\"ES template literals also look like this: `3 + 5 = ${3+5}`\"\n\ntest \"tagged template literal with both ES and CoffeeScript interpolation\", ->\n  eq \"text: [ES template literals also look like this: `3 + 5 = ${3+5}` which equals |] expressions: [8]\",\n  func\"ES template literals also look like this: `3 + 5 = ${3+5}` which equals #{3+5}\"\n\ntest \"tagged template literal with escaped ES interpolation\", ->\n  eq 'text: [ES template literals also look like this: `3 + 5 = \\\\${3+5}`] expressions: []',\n  func\"ES template literals also look like this: `3 + 5 = \\\\${3+5}`\"\n\ntest \"tagged template literal with unnecessarily escaped ES interpolation\", ->\n  eq 'text: [ES template literals also look like this: `3 + 5 = ${3+5}`] expressions: []',\n  func\"ES template literals also look like this: `3 + 5 = \\${3+5}`\"\n\ntest \"tagged template literal special escaping\", ->\n  eq 'text: [` ` \\\\` \\\\` \\\\\\\\` $ { ${ ${ \\\\${ \\\\${ \\\\\\\\${ | ` ${] expressions: [1]',\n  func\"` \\` \\\\` \\\\\\` \\\\\\\\` $ { ${ \\${ \\\\${ \\\\\\${ \\\\\\\\${ #{1} ` ${\"\n\n</script>\n\n\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/browser.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>browser.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>browser.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              <p>This <strong>Browser</strong> compatibility layer extends core CoffeeScript functions\nto make things work smoothly when compiling code directly in the browser.\nWe add support for loading remote Coffee scripts via <strong>XHR</strong>, and\n<code>text/coffeescript</code> script tags, source maps via data-URLs, and so on.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\nCoffeeScript = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./coffeescript&#x27;</span>\n{ compile } = CoffeeScript</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>Use <code>window.eval</code> to evaluate code, rather than just <code>eval</code>, to run the\nscript in a clean global scope rather than inheriting the scope of the\nCoffeeScript compiler. (So that <code>cake test:browser</code> also works in Node,\nuse either <code>window.eval</code> or <code>global.eval</code> as appropriate).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript.<span class=\"hljs-built_in\">eval</span> = <span class=\"hljs-function\"><span class=\"hljs-params\">(code, options = {})</span> -&gt;</span>\n  options.bare ?= <span class=\"hljs-literal\">on</span>\n  globalRoot = <span class=\"hljs-keyword\">if</span> window? <span class=\"hljs-keyword\">then</span> window <span class=\"hljs-keyword\">else</span> global\n  globalRoot[<span class=\"hljs-string\">&#x27;eval&#x27;</span>] compile code, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <p>Running code does not provide access to this scope.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript.run = <span class=\"hljs-function\"><span class=\"hljs-params\">(code, options = {})</span> -&gt;</span>\n  options.bare      = <span class=\"hljs-literal\">on</span>\n  options.shiftLine = <span class=\"hljs-literal\">on</span>\n  <span class=\"hljs-built_in\">Function</span>(compile code, options)()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              <p>Export this more limited <code>CoffeeScript</code> than what is exported by\n<code>index.coffee</code>, which is intended for a Node environment.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>module.<span class=\"hljs-built_in\">exports</span> = CoffeeScript</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>If we’re not in a browser environment, we’re finished with the public API.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> window?</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>Include source maps where possible. If we’ve got a base64 encoder, a\nJSON serializer, and tools for escaping unicode characters, we’re good to go.\nPorted from <a href=\"https://developer.mozilla.org/en-US/docs/DOM/window.btoa\">https://developer.mozilla.org/en-US/docs/DOM/window.btoa</a></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">if</span> btoa? <span class=\"hljs-keyword\">and</span> <span class=\"hljs-built_in\">JSON</span>?\n<span class=\"hljs-function\">  <span class=\"hljs-title\">compile</span> = <span class=\"hljs-params\">(code, options = {})</span> -&gt;</span>\n    options.inlineMap = <span class=\"hljs-literal\">true</span>\n    CoffeeScript.compile code, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>Load a remote script from the current domain via XHR.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript.load = <span class=\"hljs-function\"><span class=\"hljs-params\">(url, callback, options = {}, hold = <span class=\"hljs-literal\">false</span>)</span> -&gt;</span>\n  options.sourceFiles = [url]\n  xhr = <span class=\"hljs-keyword\">if</span> window.ActiveXObject\n    <span class=\"hljs-keyword\">new</span> window.ActiveXObject(<span class=\"hljs-string\">&#x27;Microsoft.XMLHTTP&#x27;</span>)\n  <span class=\"hljs-keyword\">else</span>\n    <span class=\"hljs-keyword\">new</span> window.XMLHttpRequest()\n  xhr.open <span class=\"hljs-string\">&#x27;GET&#x27;</span>, url, <span class=\"hljs-literal\">true</span>\n  xhr.overrideMimeType <span class=\"hljs-string\">&#x27;text/plain&#x27;</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">&#x27;overrideMimeType&#x27;</span> <span class=\"hljs-keyword\">of</span> xhr\n  xhr.onreadystatechange = <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> xhr.readyState <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">4</span>\n      <span class=\"hljs-keyword\">if</span> xhr.status <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">200</span>]\n        param = [xhr.responseText, options]\n        CoffeeScript.run param... <span class=\"hljs-keyword\">unless</span> hold\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span> <span class=\"hljs-string\">&quot;Could not load <span class=\"hljs-subst\">#{url}</span>&quot;</span>\n      callback param <span class=\"hljs-keyword\">if</span> callback\n  xhr.send <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>Activate CoffeeScript in the browser by having it compile and evaluate\nall script tags with a content-type of <code>text/coffeescript</code>.\nThis happens on page load.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript.runScripts = <span class=\"hljs-function\">-&gt;</span>\n  scripts = window.document.getElementsByTagName <span class=\"hljs-string\">&#x27;script&#x27;</span>\n  coffeetypes = [<span class=\"hljs-string\">&#x27;text/coffeescript&#x27;</span>, <span class=\"hljs-string\">&#x27;text/literate-coffeescript&#x27;</span>]\n  coffees = (s <span class=\"hljs-keyword\">for</span> s <span class=\"hljs-keyword\">in</span> scripts <span class=\"hljs-keyword\">when</span> s.type <span class=\"hljs-keyword\">in</span> coffeetypes)\n  index = <span class=\"hljs-number\">0</span>\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">execute</span> = -&gt;</span>\n    param = coffees[index]\n    <span class=\"hljs-keyword\">if</span> param <span class=\"hljs-keyword\">instanceof</span> <span class=\"hljs-built_in\">Array</span>\n      CoffeeScript.run param...\n      index++\n      execute()\n\n  <span class=\"hljs-keyword\">for</span> script, i <span class=\"hljs-keyword\">in</span> coffees\n    <span class=\"hljs-keyword\">do</span> (script, i) -&gt;\n      options = literate: script.type <span class=\"hljs-keyword\">is</span> coffeetypes[<span class=\"hljs-number\">1</span>]\n      source = script.src <span class=\"hljs-keyword\">or</span> script.getAttribute(<span class=\"hljs-string\">&#x27;data-src&#x27;</span>)\n      <span class=\"hljs-keyword\">if</span> source\n        options.filename = source\n        CoffeeScript.load source,\n          <span class=\"hljs-function\"><span class=\"hljs-params\">(param)</span> -&gt;</span>\n            coffees[i] = param\n            execute()\n          options\n          <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <p><code>options.filename</code> defines the filename the source map appears as\nin Developer Tools. If a script tag has an <code>id</code>, use that as the\nfilename; otherwise use <code>coffeescript</code>, or <code>coffeescript1</code> etc.,\nleaving the first one unnumbered for the common case that there’s\nonly one CoffeeScript script block to parse.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        options.filename = <span class=\"hljs-keyword\">if</span> script.id <span class=\"hljs-keyword\">and</span> script.id <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">then</span> script.id <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&quot;coffeescript<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> i <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>}</span>&quot;</span>\n        options.sourceFiles = [<span class=\"hljs-string\">&#x27;embedded&#x27;</span>]\n        coffees[i] = [script.innerHTML, options]\n\n  execute()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>Listen for window load, both in decent browsers and in IE.\nOnly attach this event handler on startup for the\nnon-ES module version of the browser compiler, to preserve\nbackward compatibility while letting the ES module version\nbe importable without side effects.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">if</span> this <span class=\"hljs-keyword\">is</span> window\n  <span class=\"hljs-keyword\">if</span> window.addEventListener\n    window.addEventListener <span class=\"hljs-string\">&#x27;DOMContentLoaded&#x27;</span>, CoffeeScript.runScripts, <span class=\"hljs-literal\">no</span>\n  <span class=\"hljs-keyword\">else</span>\n    window.attachEvent <span class=\"hljs-string\">&#x27;onload&#x27;</span>, CoffeeScript.runScripts</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/cake.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>cake.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>cake.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              <p><code>cake</code> is a simplified version of <a href=\"http://www.gnu.org/software/make/\">Make</a>\n(<a href=\"http://rake.rubyforge.org/\">Rake</a>, <a href=\"https://github.com/280north/jake\">Jake</a>)\nfor CoffeeScript. You define tasks with names and descriptions in a Cakefile,\nand can call them from the command line, or invoke them from other tasks.</p>\n<p>Running <code>cake</code> with no arguments will print out a list of all the tasks in the\ncurrent directory’s Cakefile.</p>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>External dependencies.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>fs           = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;fs&#x27;</span>\npath         = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;path&#x27;</span>\nhelpers      = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./helpers&#x27;</span>\noptparse     = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./optparse&#x27;</span>\nCoffeeScript = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <p>Register .coffee extension</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript.register()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              <p>Keep track of the list of defined tasks, the accepted options, and so on.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>tasks     = {}\noptions   = {}\nswitches  = []\noparse    = <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>Mixin the top-level Cake functions for Cakefiles to use directly.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>helpers.extend global,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>Define a Cake task with a short name, an optional sentence description,\nand the function to run as the action itself.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  task: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, description, action)</span> -&gt;</span>\n    [action, description] = [description, action] <span class=\"hljs-keyword\">unless</span> action\n    tasks[name] = {name, description, action}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>Define an option that the Cakefile accepts. The parsed options hash,\ncontaining all of the command-line options passed, will be made available\nas the first argument to the action.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  option: <span class=\"hljs-function\"><span class=\"hljs-params\">(letter, flag, description)</span> -&gt;</span>\n    switches.push [letter, flag, description]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>Invoke another task in the current Cakefile.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  invoke: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    missingTask name <span class=\"hljs-keyword\">unless</span> tasks[name]\n    tasks[name].action options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <p>Run <code>cake</code>. Executes all of the tasks you pass, in order. Note that Node’s\nasynchrony may cause tasks to execute in a different order than you’d expect.\nIf no tasks are passed, print the help screen. Keep a reference to the\noriginal directory name, when running Cake tasks from subdirectories.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.run = <span class=\"hljs-function\">-&gt;</span>\n  global.__originalDirname = fs.realpathSync <span class=\"hljs-string\">&#x27;.&#x27;</span>\n  process.chdir cakefileDirectory __originalDirname\n  args = process.argv[<span class=\"hljs-number\">2.</span>.]\n  CoffeeScript.run fs.readFileSync(<span class=\"hljs-string\">&#x27;Cakefile&#x27;</span>).toString(), filename: <span class=\"hljs-string\">&#x27;Cakefile&#x27;</span>\n  oparse = <span class=\"hljs-keyword\">new</span> optparse.OptionParser switches\n  <span class=\"hljs-keyword\">return</span> printTasks() <span class=\"hljs-keyword\">unless</span> args.length\n  <span class=\"hljs-keyword\">try</span>\n    options = oparse.parse(args)\n  <span class=\"hljs-keyword\">catch</span> e\n    <span class=\"hljs-keyword\">return</span> fatalError <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{e}</span>&quot;</span>\n  invoke arg <span class=\"hljs-keyword\">for</span> arg <span class=\"hljs-keyword\">in</span> options.arguments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>Display the list of Cake tasks in a format similar to <code>rake -T</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">printTasks</span> = -&gt;</span>\n  relative = path.relative <span class=\"hljs-keyword\">or</span> path.resolve\n  cakefilePath = path.join relative(__originalDirname, process.cwd()), <span class=\"hljs-string\">&#x27;Cakefile&#x27;</span>\n  console.log <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{cakefilePath}</span> defines the following tasks:\\n&quot;</span>\n  <span class=\"hljs-keyword\">for</span> name, task <span class=\"hljs-keyword\">of</span> tasks\n    spaces = <span class=\"hljs-number\">20</span> - name.length\n    spaces = <span class=\"hljs-keyword\">if</span> spaces &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-built_in\">Array</span>(spaces + <span class=\"hljs-number\">1</span>).join(<span class=\"hljs-string\">&#x27; &#x27;</span>) <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n    desc   = <span class=\"hljs-keyword\">if</span> task.description <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;# <span class=\"hljs-subst\">#{task.description}</span>&quot;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n    console.log <span class=\"hljs-string\">&quot;cake <span class=\"hljs-subst\">#{name}</span><span class=\"hljs-subst\">#{spaces}</span> <span class=\"hljs-subst\">#{desc}</span>&quot;</span>\n  console.log oparse.help() <span class=\"hljs-keyword\">if</span> switches.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-11\">&#x00a7;</a>\n              </div>\n              <p>Print an error and exit when attempting to use an invalid task/option.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">fatalError</span> = <span class=\"hljs-params\">(message)</span> -&gt;</span>\n  console.error message + <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n  console.log <span class=\"hljs-string\">&#x27;To see a list of all tasks/options, run &quot;cake&quot;&#x27;</span>\n  process.exit <span class=\"hljs-number\">1</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">missingTask</span> = <span class=\"hljs-params\">(task)</span> -&gt;</span> fatalError <span class=\"hljs-string\">&quot;No such task: <span class=\"hljs-subst\">#{task}</span>&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-12\">&#x00a7;</a>\n              </div>\n              <p>When <code>cake</code> is invoked, search in the current and all parent directories\nto find the relevant Cakefile.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">cakefileDirectory</span> = <span class=\"hljs-params\">(dir)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> dir <span class=\"hljs-keyword\">if</span> fs.existsSync path.join dir, <span class=\"hljs-string\">&#x27;Cakefile&#x27;</span>\n  parent = path.normalize path.join dir, <span class=\"hljs-string\">&#x27;..&#x27;</span>\n  <span class=\"hljs-keyword\">return</span> cakefileDirectory parent <span class=\"hljs-keyword\">unless</span> parent <span class=\"hljs-keyword\">is</span> dir\n  <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span> <span class=\"hljs-string\">&quot;Cakefile not found in <span class=\"hljs-subst\">#{process.cwd()}</span>&quot;</span></pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/coffeescript.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>coffeescript.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>coffeescript.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              <p>CoffeeScript can be used both on the server, as a command-line compiler based\non Node.js/V8, or to run CoffeeScript directly in the browser. This module\ncontains the main entry functions for tokenizing, parsing, and compiling\nsource CoffeeScript into JavaScript.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n{Lexer}       = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./lexer&#x27;</span>\n{parser}      = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./parser&#x27;</span>\nhelpers       = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./helpers&#x27;</span>\nSourceMap     = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./sourcemap&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>Require <code>package.json</code>, which is two levels above this file, as this file is\nevaluated from <code>lib/coffeescript</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>packageJson   = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;../../package.json&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <p>The current CoffeeScript version number.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.VERSION = packageJson.version\n\n<span class=\"hljs-built_in\">exports</span>.FILE_EXTENSIONS = FILE_EXTENSIONS = [<span class=\"hljs-string\">&#x27;.coffee&#x27;</span>, <span class=\"hljs-string\">&#x27;.litcoffee&#x27;</span>, <span class=\"hljs-string\">&#x27;.coffee.md&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              <p>Expose helpers for testing.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.helpers = helpers\n\n{getSourceMap, registerCompiled} = SourceMap</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>This is exported to enable an external module to implement caching of\nsourcemaps. This is used only when <code>patchStackTrace</code> has been called to adjust\nstack traces for files with cached source maps.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.registerCompiled = registerCompiled</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>Function that allows for btoa in both nodejs and the browser.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">base64encode</span> = <span class=\"hljs-params\">(src)</span> -&gt;</span> <span class=\"hljs-keyword\">switch</span>\n  <span class=\"hljs-keyword\">when</span> <span class=\"hljs-keyword\">typeof</span> Buffer <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;function&#x27;</span>\n    Buffer.<span class=\"hljs-keyword\">from</span>(src).toString(<span class=\"hljs-string\">&#x27;base64&#x27;</span>)\n  <span class=\"hljs-keyword\">when</span> <span class=\"hljs-keyword\">typeof</span> btoa <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;function&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>The contents of a <code>&lt;script&gt;</code> block are encoded via UTF-16, so if any extended\ncharacters are used in the block, btoa will fail as it maxes out at UTF-8.\nSee <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem\">https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem</a>\nfor the gory details, and for the solution implemented here.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    btoa <span class=\"hljs-built_in\">encodeURIComponent</span>(src).replace <span class=\"hljs-regexp\">/%([0-9A-F]{2})/g</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(match, p1)</span> -&gt;</span>\n      <span class=\"hljs-built_in\">String</span>.fromCharCode <span class=\"hljs-string\">&#x27;0x&#x27;</span> + p1\n  <span class=\"hljs-keyword\">else</span>\n    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span>(<span class=\"hljs-string\">&#x27;Unable to base64 encode inline sourcemap.&#x27;</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>Function wrapper to add source file information to SyntaxErrors thrown by the\nlexer/parser/compiler.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">withPrettyErrors</span> = <span class=\"hljs-params\">(fn)</span> -&gt;</span>\n  (code, options = {}) -&gt;\n    <span class=\"hljs-keyword\">try</span>\n      fn.call @, code, options\n    <span class=\"hljs-keyword\">catch</span> err\n      <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">typeof</span> code <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;string&#x27;</span> <span class=\"hljs-comment\"># Support `CoffeeScript.nodes(tokens)`.</span>\n      <span class=\"hljs-keyword\">throw</span> helpers.updateSyntaxError err, code, options.filename</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <p>Compile CoffeeScript code to JavaScript, using the Coffee/Jison compiler.</p>\n<p>If <code>options.sourceMap</code> is specified, then <code>options.filename</code> must also be\nspecified. All options that can be passed to <code>SourceMap#generate</code> may also\nbe passed here.</p>\n<p>This returns a javascript string, unless <code>options.sourceMap</code> is passed,\nin which case this returns a <code>{js, v3SourceMap, sourceMap}</code>\nobject, where sourceMap is a sourcemap.coffee#SourceMap object, handy for\ndoing programmatic lookups.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.compile = compile = withPrettyErrors (code, options = {}) -&gt;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>Clone <code>options</code>, to avoid mutating the <code>options</code> object passed in.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  options = <span class=\"hljs-built_in\">Object</span>.assign {}, options\n\n  generateSourceMap = options.sourceMap <span class=\"hljs-keyword\">or</span> options.inlineMap <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> options.filename?\n  filename = options.filename <span class=\"hljs-keyword\">or</span> helpers.anonymousFileName()\n\n  checkShebangLine filename, code\n\n  map = <span class=\"hljs-keyword\">new</span> SourceMap <span class=\"hljs-keyword\">if</span> generateSourceMap\n\n  tokens = lexer.tokenize code, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-11\">&#x00a7;</a>\n              </div>\n              <p>Pass a list of referenced variables, so that generated variables won’t get\nthe same name.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  options.referencedVars = (\n    token[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">for</span> token <span class=\"hljs-keyword\">in</span> tokens <span class=\"hljs-keyword\">when</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>\n  )</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-12\">&#x00a7;</a>\n              </div>\n              <p>Check for import or export; if found, force bare mode.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">unless</span> options.bare? <span class=\"hljs-keyword\">and</span> options.bare <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-keyword\">for</span> token <span class=\"hljs-keyword\">in</span> tokens\n      <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;IMPORT&#x27;</span>, <span class=\"hljs-string\">&#x27;EXPORT&#x27;</span>]\n        options.bare = <span class=\"hljs-literal\">yes</span>\n        <span class=\"hljs-keyword\">break</span>\n\n  nodes = parser.parse tokens</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-13\">&#x00a7;</a>\n              </div>\n              <p>If all that was requested was a POJO representation of the nodes, e.g.\nthe abstract syntax tree (AST), we can stop now and just return that\n(after fixing the location data for the root/<code>File</code>»<code>Program</code> node,\nwhich might’ve gotten misaligned from the original source due to the\n<code>clean</code> function in the lexer).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">if</span> options.ast\n    nodes.allCommentTokens = helpers.extractAllCommentTokens tokens\n    sourceCodeNumberOfLines = (code.match(<span class=\"hljs-regexp\">/\\r?\\n/g</span>) <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&#x27;&#x27;</span>).length + <span class=\"hljs-number\">1</span>\n    sourceCodeLastLine = <span class=\"hljs-regexp\">/.*$/</span>.exec(code)[<span class=\"hljs-number\">0</span>] <span class=\"hljs-comment\"># `.*` matches all but line break characters.</span>\n    ast = nodes.ast options\n    range = [<span class=\"hljs-number\">0</span>, code.length]\n    ast.start = ast.program.start = range[<span class=\"hljs-number\">0</span>]\n    ast.end = ast.program.end = range[<span class=\"hljs-number\">1</span>]\n    ast.range = ast.program.range = range\n    ast.loc.start = ast.program.loc.start = {line: <span class=\"hljs-number\">1</span>, column: <span class=\"hljs-number\">0</span>}\n    ast.loc.end.line = ast.program.loc.end.line = sourceCodeNumberOfLines\n    ast.loc.end.column = ast.program.loc.end.column = sourceCodeLastLine.length\n    ast.tokens = tokens\n    <span class=\"hljs-keyword\">return</span> ast\n\n  fragments = nodes.compileToFragments options\n\n  currentLine = <span class=\"hljs-number\">0</span>\n  currentLine += <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> options.header\n  currentLine += <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> options.shiftLine\n  currentColumn = <span class=\"hljs-number\">0</span>\n  js = <span class=\"hljs-string\">&quot;&quot;</span>\n  <span class=\"hljs-keyword\">for</span> fragment <span class=\"hljs-keyword\">in</span> fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-14\">&#x00a7;</a>\n              </div>\n              <p>Update the sourcemap with data from each fragment.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> generateSourceMap</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-15\">&#x00a7;</a>\n              </div>\n              <p>Do not include empty, whitespace, or semicolon-only fragments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> fragment.locationData <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> <span class=\"hljs-regexp\">/^[;\\s]*$/</span>.test fragment.code\n        map.add(\n          [fragment.locationData.first_line, fragment.locationData.first_column]\n          [currentLine, currentColumn]\n          {noReplace: <span class=\"hljs-literal\">true</span>})\n      newLines = helpers.count fragment.code, <span class=\"hljs-string\">&quot;\\n&quot;</span>\n      currentLine += newLines\n      <span class=\"hljs-keyword\">if</span> newLines\n        currentColumn = fragment.code.length - (fragment.code.lastIndexOf(<span class=\"hljs-string\">&quot;\\n&quot;</span>) + <span class=\"hljs-number\">1</span>)\n      <span class=\"hljs-keyword\">else</span>\n        currentColumn += fragment.code.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-16\">&#x00a7;</a>\n              </div>\n              <p>Copy the code from each fragment into the final JavaScript.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    js += fragment.code\n\n  <span class=\"hljs-keyword\">if</span> options.header\n    header = <span class=\"hljs-string\">&quot;Generated by CoffeeScript <span class=\"hljs-subst\">#{@VERSION}</span>&quot;</span>\n    js = <span class=\"hljs-string\">&quot;// <span class=\"hljs-subst\">#{header}</span>\\n<span class=\"hljs-subst\">#{js}</span>&quot;</span>\n\n  <span class=\"hljs-keyword\">if</span> generateSourceMap\n    v3SourceMap = map.generate options, code\n\n  <span class=\"hljs-keyword\">if</span> options.transpile\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">typeof</span> options.transpile <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;object&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-17\">&#x00a7;</a>\n              </div>\n              <p>This only happens if run via the Node API and <code>transpile</code> is set to\nsomething other than an object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span> <span class=\"hljs-string\">&#x27;The transpile option must be given an object with options to pass to Babel&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-18\">&#x00a7;</a>\n              </div>\n              <p>Get the reference to Babel that we have been passed if this compiler\nis run via the CLI or Node API.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    transpiler = options.transpile.transpile\n    <span class=\"hljs-keyword\">delete</span> options.transpile.transpile\n\n    transpilerOptions = <span class=\"hljs-built_in\">Object</span>.assign {}, options.transpile</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-19\">&#x00a7;</a>\n              </div>\n              <p>See <a href=\"https://github.com/babel/babel/issues/827#issuecomment-77573107\">https://github.com/babel/babel/issues/827#issuecomment-77573107</a>:\nBabel can take a v3 source map object as input in <code>inputSourceMap</code>\nand it will return an <em>updated</em> v3 source map object in its output.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> v3SourceMap <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> transpilerOptions.inputSourceMap?\n      transpilerOptions.inputSourceMap = v3SourceMap\n    transpilerOutput = transpiler js, transpilerOptions\n    js = transpilerOutput.code\n    <span class=\"hljs-keyword\">if</span> v3SourceMap <span class=\"hljs-keyword\">and</span> transpilerOutput.map\n      v3SourceMap = transpilerOutput.map\n\n  <span class=\"hljs-keyword\">if</span> options.inlineMap\n    encoded = base64encode <span class=\"hljs-built_in\">JSON</span>.stringify v3SourceMap\n    sourceMapDataURI = <span class=\"hljs-string\">&quot;//# sourceMappingURL=data:application/json;base64,<span class=\"hljs-subst\">#{encoded}</span>&quot;</span>\n    sourceURL = <span class=\"hljs-string\">&quot;//# sourceURL=<span class=\"hljs-subst\">#{filename}</span>&quot;</span>\n    js = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{js}</span>\\n<span class=\"hljs-subst\">#{sourceMapDataURI}</span>\\n<span class=\"hljs-subst\">#{sourceURL}</span>&quot;</span>\n\n  registerCompiled filename, code, map\n\n  <span class=\"hljs-keyword\">if</span> options.sourceMap\n    {\n      js\n      sourceMap: map\n      v3SourceMap: <span class=\"hljs-built_in\">JSON</span>.stringify v3SourceMap, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-number\">2</span>\n    }\n  <span class=\"hljs-keyword\">else</span>\n    js</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-20\">&#x00a7;</a>\n              </div>\n              <p>Tokenize a string of CoffeeScript code, and return the array of tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.tokens = withPrettyErrors (code, options) -&gt;\n  lexer.tokenize code, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-21\">&#x00a7;</a>\n              </div>\n              <p>Parse a string of CoffeeScript code or an array of lexed tokens, and\nreturn the AST. You can then compile it by calling <code>.compile()</code> on the root,\nor traverse it by using <code>.traverseChildren()</code> with a callback.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.nodes = withPrettyErrors (source, options) -&gt;\n  source = lexer.tokenize source, options <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">typeof</span> source <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;string&#x27;</span>\n  parser.parse source</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-22\">&#x00a7;</a>\n              </div>\n              <p>This file used to export these methods; leave stubs that throw warnings\ninstead. These methods have been moved into <code>index.coffee</code> to provide\nseparate entrypoints for Node and non-Node environments, so that static\nanalysis tools don’t choke on Node packages when compiling for a non-Node\nenvironment.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.run = <span class=\"hljs-built_in\">exports</span>.<span class=\"hljs-built_in\">eval</span> = <span class=\"hljs-built_in\">exports</span>.register = <span class=\"hljs-function\">-&gt;</span>\n  <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span> <span class=\"hljs-string\">&#x27;require index.coffee, not this file&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-23\">&#x00a7;</a>\n              </div>\n              <p>Instantiate a Lexer for our use here.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>lexer = <span class=\"hljs-keyword\">new</span> Lexer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-24\">&#x00a7;</a>\n              </div>\n              <p>The real Lexer produces a generic stream of tokens. This object provides a\nthin wrapper around it, compatible with the Jison API. We can then pass it\ndirectly as a “Jison lexer.”</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>parser.lexer =\n  yylloc:\n    range: []\n  options:\n    ranges: <span class=\"hljs-literal\">yes</span>\n  lex: <span class=\"hljs-function\">-&gt;</span>\n    token = parser.tokens[@pos++]\n    <span class=\"hljs-keyword\">if</span> token\n      [tag, @yytext, @yylloc] = token\n      parser.errorToken = token.origin <span class=\"hljs-keyword\">or</span> token\n      @yylineno = @yylloc.first_line\n    <span class=\"hljs-keyword\">else</span>\n      tag = <span class=\"hljs-string\">&#x27;&#x27;</span>\n    tag\n  setInput: <span class=\"hljs-function\"><span class=\"hljs-params\">(tokens)</span> -&gt;</span>\n    parser.tokens = tokens\n    @pos = <span class=\"hljs-number\">0</span>\n  upcomingInput: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-25\">&#x00a7;</a>\n              </div>\n              <p>Make all the AST nodes visible to the parser.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>parser.yy = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./nodes&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-26\">&#x00a7;</a>\n              </div>\n              <p>Override Jison’s default error handling function.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>parser.yy.parseError = <span class=\"hljs-function\"><span class=\"hljs-params\">(message, {token})</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-27\">&#x00a7;</a>\n              </div>\n              <p>Disregard Jison’s message, it contains redundant line number information.\nDisregard the token, we take its value directly from the lexer in case\nthe error is caused by a generated token which might refer to its origin.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  {errorToken, tokens} = parser\n  [errorTag, errorText, errorLoc] = errorToken\n\n  errorText = <span class=\"hljs-keyword\">switch</span>\n    <span class=\"hljs-keyword\">when</span> errorToken <span class=\"hljs-keyword\">is</span> tokens[tokens.length - <span class=\"hljs-number\">1</span>]\n      <span class=\"hljs-string\">&#x27;end of input&#x27;</span>\n    <span class=\"hljs-keyword\">when</span> errorTag <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;INDENT&#x27;</span>, <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>]\n      <span class=\"hljs-string\">&#x27;indentation&#x27;</span>\n    <span class=\"hljs-keyword\">when</span> errorTag <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>, <span class=\"hljs-string\">&#x27;NUMBER&#x27;</span>, <span class=\"hljs-string\">&#x27;INFINITY&#x27;</span>, <span class=\"hljs-string\">&#x27;STRING&#x27;</span>, <span class=\"hljs-string\">&#x27;STRING_START&#x27;</span>, <span class=\"hljs-string\">&#x27;REGEX&#x27;</span>, <span class=\"hljs-string\">&#x27;REGEX_START&#x27;</span>]\n      errorTag.replace(<span class=\"hljs-regexp\">/_START$/</span>, <span class=\"hljs-string\">&#x27;&#x27;</span>).toLowerCase()\n    <span class=\"hljs-keyword\">else</span>\n      helpers.nameWhitespaceCharacter errorText</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-28\">&#x00a7;</a>\n              </div>\n              <p>The second argument has a <code>loc</code> property, which should have the location\ndata for this token. Unfortunately, Jison seems to send an outdated <code>loc</code>\n(from the previous token), so we take the location information directly\nfrom the lexer.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  helpers.throwSyntaxError <span class=\"hljs-string\">&quot;unexpected <span class=\"hljs-subst\">#{errorText}</span>&quot;</span>, errorLoc\n\n<span class=\"hljs-built_in\">exports</span>.patchStackTrace = <span class=\"hljs-function\">-&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-29\">&#x00a7;</a>\n              </div>\n              <p>Based on <a href=\"http://v8.googlecode.com/svn/branches/bleeding_edge/src/messages.js\">http://v8.googlecode.com/svn/branches/bleeding_edge/src/messages.js</a>\nModified to handle sourceMap</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">  <span class=\"hljs-title\">formatSourcePosition</span> = <span class=\"hljs-params\">(frame, getSourceMapping)</span> -&gt;</span>\n    filename = <span class=\"hljs-literal\">undefined</span>\n    fileLocation = <span class=\"hljs-string\">&#x27;&#x27;</span>\n\n    <span class=\"hljs-keyword\">if</span> frame.isNative()\n      fileLocation = <span class=\"hljs-string\">&quot;native&quot;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">if</span> frame.isEval()\n        filename = frame.getScriptNameOrSourceURL()\n        fileLocation = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{frame.getEvalOrigin()}</span>, &quot;</span> <span class=\"hljs-keyword\">unless</span> filename\n      <span class=\"hljs-keyword\">else</span>\n        filename = frame.getFileName()\n\n      filename <span class=\"hljs-keyword\">or</span>= <span class=\"hljs-string\">&quot;&lt;anonymous&gt;&quot;</span>\n\n      line = frame.getLineNumber()\n      column = frame.getColumnNumber()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-30\">&#x00a7;</a>\n              </div>\n              <p>Check for a sourceMap position</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      source = getSourceMapping filename, line, column\n      fileLocation =\n        <span class=\"hljs-keyword\">if</span> source\n          <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{filename}</span>:<span class=\"hljs-subst\">#{source[<span class=\"hljs-number\">0</span>]}</span>:<span class=\"hljs-subst\">#{source[<span class=\"hljs-number\">1</span>]}</span>&quot;</span>\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{filename}</span>:<span class=\"hljs-subst\">#{line}</span>:<span class=\"hljs-subst\">#{column}</span>&quot;</span>\n\n    functionName = frame.getFunctionName()\n    isConstructor = frame.isConstructor()\n    isMethodCall = <span class=\"hljs-keyword\">not</span> (frame.isToplevel() <span class=\"hljs-keyword\">or</span> isConstructor)\n\n    <span class=\"hljs-keyword\">if</span> isMethodCall\n      methodName = frame.getMethodName()\n      typeName = frame.getTypeName()\n\n      <span class=\"hljs-keyword\">if</span> functionName\n        tp = <span class=\"hljs-keyword\">as</span> = <span class=\"hljs-string\">&#x27;&#x27;</span>\n        <span class=\"hljs-keyword\">if</span> typeName <span class=\"hljs-keyword\">and</span> functionName.indexOf typeName\n          tp = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{typeName}</span>.&quot;</span>\n        <span class=\"hljs-keyword\">if</span> methodName <span class=\"hljs-keyword\">and</span> functionName.indexOf(<span class=\"hljs-string\">&quot;.<span class=\"hljs-subst\">#{methodName}</span>&quot;</span>) <span class=\"hljs-keyword\">isnt</span> functionName.length - methodName.length - <span class=\"hljs-number\">1</span>\n          <span class=\"hljs-keyword\">as</span> = <span class=\"hljs-string\">&quot; [as <span class=\"hljs-subst\">#{methodName}</span>]&quot;</span>\n\n        <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{tp}</span><span class=\"hljs-subst\">#{functionName}</span><span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">as</span>}</span> (<span class=\"hljs-subst\">#{fileLocation}</span>)&quot;</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{typeName}</span>.<span class=\"hljs-subst\">#{methodName <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&#x27;&lt;anonymous&gt;&#x27;</span>}</span> (<span class=\"hljs-subst\">#{fileLocation}</span>)&quot;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> isConstructor\n      <span class=\"hljs-string\">&quot;new <span class=\"hljs-subst\">#{functionName <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&#x27;&lt;anonymous&gt;&#x27;</span>}</span> (<span class=\"hljs-subst\">#{fileLocation}</span>)&quot;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> functionName\n      <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{functionName}</span> (<span class=\"hljs-subst\">#{fileLocation}</span>)&quot;</span>\n    <span class=\"hljs-keyword\">else</span>\n      fileLocation\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">getSourceMapping</span> = <span class=\"hljs-params\">(filename, line, column)</span> -&gt;</span>\n    sourceMap = getSourceMap filename, line, column\n\n    answer = sourceMap.sourceLocation [line - <span class=\"hljs-number\">1</span>, column - <span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">if</span> sourceMap?\n    <span class=\"hljs-keyword\">if</span> answer? <span class=\"hljs-keyword\">then</span> [answer[<span class=\"hljs-number\">0</span>] + <span class=\"hljs-number\">1</span>, answer[<span class=\"hljs-number\">1</span>] + <span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">else</span> <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-31\">&#x00a7;</a>\n              </div>\n              <p>Based on <a href=\"http://goo.gl/ZTx1p\">michaelficarra/CoffeeScriptRedux</a>\nNodeJS / V8 have no support for transforming positions in stack traces using\nsourceMap, so we must monkey-patch Error to display CoffeeScript source\npositions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-built_in\">Error</span>.prepareStackTrace = <span class=\"hljs-function\"><span class=\"hljs-params\">(err, stack)</span> -&gt;</span>\n    frames = <span class=\"hljs-keyword\">for</span> frame <span class=\"hljs-keyword\">in</span> stack</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-32\">&#x00a7;</a>\n              </div>\n              <p>Don’t display stack frames deeper than <code>CoffeeScript.run</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">if</span> frame.getFunction() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-built_in\">exports</span>.run\n      <span class=\"hljs-string\">&quot;    at <span class=\"hljs-subst\">#{formatSourcePosition frame, getSourceMapping}</span>&quot;</span>\n\n    <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{err.toString()}</span>\\n<span class=\"hljs-subst\">#{frames.join <span class=\"hljs-string\">&#x27;\\n&#x27;</span>}</span>\\n&quot;</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">checkShebangLine</span> = <span class=\"hljs-params\">(file, input)</span> -&gt;</span>\n  firstLine = input.split(<span class=\"hljs-regexp\">/$/m</span>, <span class=\"hljs-number\">1</span>)[<span class=\"hljs-number\">0</span>]\n  rest = firstLine?.match(<span class=\"hljs-regexp\">/^#!\\s*([^\\s]+\\s*)(.*)/</span>)\n  args = rest?[<span class=\"hljs-number\">2</span>]?.split(<span class=\"hljs-regexp\">/\\s/</span>).filter (s) -&gt; s <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n  <span class=\"hljs-keyword\">if</span> args?.length &gt; <span class=\"hljs-number\">1</span>\n    console.error <span class=\"hljs-string\">&#x27;&#x27;&#x27;\n      The script to be run begins with a shebang line with more than one\n      argument. This script will fail on platforms such as Linux which only\n      allow a single argument.\n    &#x27;&#x27;&#x27;</span>\n    console.error <span class=\"hljs-string\">&quot;The shebang line was: &#x27;<span class=\"hljs-subst\">#{firstLine}</span>&#x27; in file &#x27;<span class=\"hljs-subst\">#{file}</span>&#x27;&quot;</span>\n    console.error <span class=\"hljs-string\">&quot;The arguments were: <span class=\"hljs-subst\">#{<span class=\"hljs-built_in\">JSON</span>.stringify args}</span>&quot;</span></pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/command.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>command.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>command.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              <p>The <code>coffee</code> utility. Handles command-line compilation of CoffeeScript\ninto various forms: saved into <code>.js</code> files or printed to stdout\nor recompiled every time the source is saved,\nprinted as a token stream or as the syntax tree, or launch an\ninteractive REPL.</p>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>External dependencies.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>fs             = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;fs&#x27;</span>\npath           = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;path&#x27;</span>\nhelpers        = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./helpers&#x27;</span>\noptparse       = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./optparse&#x27;</span>\nCoffeeScript   = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./&#x27;</span>\n{spawn, exec}  = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;child_process&#x27;</span>\n{EventEmitter} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;events&#x27;</span>\n\nuseWinPathSep  = path.sep <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;\\\\&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <p>Allow CoffeeScript to emit Node.js events.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>helpers.extend CoffeeScript, <span class=\"hljs-keyword\">new</span> EventEmitter\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">printLine</span> = <span class=\"hljs-params\">(line)</span> -&gt;</span> process.stdout.write line + <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">printWarn</span> = <span class=\"hljs-params\">(line)</span> -&gt;</span> process.stderr.write line + <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">hidden</span> = <span class=\"hljs-params\">(file)</span> -&gt;</span> <span class=\"hljs-regexp\">/^\\.|~$/</span>.test file</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              <p>The help banner that is printed in conjunction with <code>-h</code>/<code>--help</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>BANNER = <span class=\"hljs-string\">&#x27;&#x27;&#x27;\n  Usage: coffee [options] path/to/script.coffee [args]\n\n  If called without options, `coffee` will run your script.\n&#x27;&#x27;&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>The list of all the valid option flags that <code>coffee</code> knows how to handle.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>SWITCHES = [\n  [      <span class=\"hljs-string\">&#x27;--ast&#x27;</span>,               <span class=\"hljs-string\">&#x27;generate an abstract syntax tree of nodes&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-b&#x27;</span>, <span class=\"hljs-string\">&#x27;--bare&#x27;</span>,              <span class=\"hljs-string\">&#x27;compile without a top-level function wrapper&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-c&#x27;</span>, <span class=\"hljs-string\">&#x27;--compile&#x27;</span>,           <span class=\"hljs-string\">&#x27;compile to JavaScript and save as .js files&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-e&#x27;</span>, <span class=\"hljs-string\">&#x27;--eval&#x27;</span>,              <span class=\"hljs-string\">&#x27;pass a string from the command line as input&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-h&#x27;</span>, <span class=\"hljs-string\">&#x27;--help&#x27;</span>,              <span class=\"hljs-string\">&#x27;display this help message&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-i&#x27;</span>, <span class=\"hljs-string\">&#x27;--interactive&#x27;</span>,       <span class=\"hljs-string\">&#x27;run an interactive CoffeeScript REPL&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-j&#x27;</span>, <span class=\"hljs-string\">&#x27;--join [FILE]&#x27;</span>,       <span class=\"hljs-string\">&#x27;concatenate the source CoffeeScript before compiling&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-l&#x27;</span>, <span class=\"hljs-string\">&#x27;--literate&#x27;</span>,          <span class=\"hljs-string\">&#x27;treat stdio as literate style coffeescript&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-m&#x27;</span>, <span class=\"hljs-string\">&#x27;--map&#x27;</span>,               <span class=\"hljs-string\">&#x27;generate source map and save as .js.map files&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-M&#x27;</span>, <span class=\"hljs-string\">&#x27;--inline-map&#x27;</span>,        <span class=\"hljs-string\">&#x27;generate source map and include it directly in output&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-n&#x27;</span>, <span class=\"hljs-string\">&#x27;--nodes&#x27;</span>,             <span class=\"hljs-string\">&#x27;print out the parse tree that the parser produces&#x27;</span>]\n  [      <span class=\"hljs-string\">&#x27;--nodejs [ARGS]&#x27;</span>,     <span class=\"hljs-string\">&#x27;pass options directly to the &quot;node&quot; binary&#x27;</span>]\n  [      <span class=\"hljs-string\">&#x27;--no-header&#x27;</span>,         <span class=\"hljs-string\">&#x27;suppress the &quot;Generated by&quot; header&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-o&#x27;</span>, <span class=\"hljs-string\">&#x27;--output [PATH]&#x27;</span>,     <span class=\"hljs-string\">&#x27;set the output path or path/filename for compiled JavaScript&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-p&#x27;</span>, <span class=\"hljs-string\">&#x27;--print&#x27;</span>,             <span class=\"hljs-string\">&#x27;print out the compiled JavaScript&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-r&#x27;</span>, <span class=\"hljs-string\">&#x27;--require [MODULE*]&#x27;</span>, <span class=\"hljs-string\">&#x27;require the given module before eval or REPL&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-s&#x27;</span>, <span class=\"hljs-string\">&#x27;--stdio&#x27;</span>,             <span class=\"hljs-string\">&#x27;listen for and compile scripts over stdio&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-t&#x27;</span>, <span class=\"hljs-string\">&#x27;--transpile&#x27;</span>,         <span class=\"hljs-string\">&#x27;pipe generated JavaScript through Babel&#x27;</span>]\n  [      <span class=\"hljs-string\">&#x27;--tokens&#x27;</span>,            <span class=\"hljs-string\">&#x27;print out the tokens that the lexer/rewriter produce&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-v&#x27;</span>, <span class=\"hljs-string\">&#x27;--version&#x27;</span>,           <span class=\"hljs-string\">&#x27;display the version number&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;-w&#x27;</span>, <span class=\"hljs-string\">&#x27;--watch&#x27;</span>,             <span class=\"hljs-string\">&#x27;watch scripts for changes and rerun commands&#x27;</span>]\n]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>Top-level objects shared by all the functions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>opts         = {}\nsources      = []\nsourceCode   = []\nnotSources   = {}\nwatchedDirs  = {}\noptionParser = <span class=\"hljs-literal\">null</span>\n\n<span class=\"hljs-built_in\">exports</span>.buildCSOptionParser = buildCSOptionParser = <span class=\"hljs-function\">-&gt;</span>\n  <span class=\"hljs-keyword\">new</span> optparse.OptionParser SWITCHES, BANNER</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>Run <code>coffee</code> by parsing passed options and determining what action to take.\nMany flags cause us to divert before compiling anything. Flags passed after\n<code>--</code> will be passed verbatim to your script as arguments in <code>process.argv</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.run = <span class=\"hljs-function\">-&gt;</span>\n  optionParser = buildCSOptionParser()\n  <span class=\"hljs-keyword\">try</span> parseOptions()\n  <span class=\"hljs-keyword\">catch</span> err\n    console.error <span class=\"hljs-string\">&quot;option parsing error: <span class=\"hljs-subst\">#{err.message}</span>&quot;</span>\n    process.exit <span class=\"hljs-number\">1</span>\n\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">not</span> opts.doubleDashed) <span class=\"hljs-keyword\">and</span> (opts.arguments[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;--&#x27;</span>)\n    printWarn <span class=\"hljs-string\">&#x27;&#x27;&#x27;\n      coffee was invoked with &#x27;--&#x27; as the second positional argument, which is\n      now deprecated. To pass &#x27;--&#x27; as an argument to a script to run, put an\n      additional &#x27;--&#x27; before the path to your script.\n\n      &#x27;--&#x27; will be removed from the argument list.\n    &#x27;&#x27;&#x27;</span>\n    printWarn <span class=\"hljs-string\">&quot;The positional arguments were: <span class=\"hljs-subst\">#{<span class=\"hljs-built_in\">JSON</span>.stringify opts.arguments}</span>&quot;</span>\n    opts.arguments = [opts.arguments[<span class=\"hljs-number\">0</span>]].concat opts.arguments[<span class=\"hljs-number\">2.</span>.]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>Make the REPL <em>CLI</em> use the global context so as to (a) be consistent with the\n<code>node</code> REPL CLI and, therefore, (b) make packages that modify native prototypes\n(such as ‘colors’ and ‘sugar’) work as expected.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  replCliOpts = useGlobal: <span class=\"hljs-literal\">yes</span>\n  opts.prelude = makePrelude opts.<span class=\"hljs-built_in\">require</span>       <span class=\"hljs-keyword\">if</span> opts.<span class=\"hljs-built_in\">require</span>\n  replCliOpts.prelude = opts.prelude\n  replCliOpts.transpile = opts.transpile\n  <span class=\"hljs-keyword\">return</span> forkNode()                             <span class=\"hljs-keyword\">if</span> opts.nodejs\n  <span class=\"hljs-keyword\">return</span> usage()                                <span class=\"hljs-keyword\">if</span> opts.help\n  <span class=\"hljs-keyword\">return</span> version()                              <span class=\"hljs-keyword\">if</span> opts.version\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">&#x27;./repl&#x27;</span>).start(replCliOpts)   <span class=\"hljs-keyword\">if</span> opts.interactive\n  <span class=\"hljs-keyword\">return</span> compileStdio()                         <span class=\"hljs-keyword\">if</span> opts.stdio\n  <span class=\"hljs-keyword\">return</span> compileScript <span class=\"hljs-literal\">null</span>, opts.arguments[<span class=\"hljs-number\">0</span>]  <span class=\"hljs-keyword\">if</span> opts.<span class=\"hljs-built_in\">eval</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">&#x27;./repl&#x27;</span>).start(replCliOpts)   <span class=\"hljs-keyword\">unless</span> opts.arguments.length\n  literals = <span class=\"hljs-keyword\">if</span> opts.run <span class=\"hljs-keyword\">then</span> opts.arguments.splice <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> []\n  process.argv = process.argv[<span class=\"hljs-number\">0.</span><span class=\"hljs-number\">.1</span>].concat literals\n  process.argv[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;coffee&#x27;</span>\n\n  <span class=\"hljs-keyword\">if</span> opts.output\n    outputBasename = path.basename opts.output\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">&#x27;.&#x27;</span> <span class=\"hljs-keyword\">in</span> outputBasename <span class=\"hljs-keyword\">and</span>\n       outputBasename <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;.&#x27;</span>, <span class=\"hljs-string\">&#x27;..&#x27;</span>] <span class=\"hljs-keyword\">and</span>\n       <span class=\"hljs-keyword\">not</span> helpers.ends(opts.output, path.sep)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <p>An output filename was specified, e.g. <code>/dist/scripts.js</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      opts.outputFilename = outputBasename\n      opts.outputPath = path.resolve path.dirname opts.output\n    <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>An output path was specified, e.g. <code>/dist</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      opts.outputFilename = <span class=\"hljs-literal\">null</span>\n      opts.outputPath = path.resolve opts.output\n\n  <span class=\"hljs-keyword\">if</span> opts.join\n    opts.join = path.resolve opts.join\n    console.error <span class=\"hljs-string\">&#x27;&#x27;&#x27;\n\n    The --join option is deprecated and will be removed in a future version.\n\n    If for some reason it&#x27;s necessary to share local variables between files,\n    replace...\n\n        $ coffee --compile --join bundle.js -- a.coffee b.coffee c.coffee\n\n    with...\n\n        $ cat a.coffee b.coffee c.coffee | coffee --compile --stdio &gt; bundle.js\n\n    &#x27;&#x27;&#x27;</span>\n  <span class=\"hljs-keyword\">for</span> source <span class=\"hljs-keyword\">in</span> opts.arguments\n    source = path.resolve source\n    compilePath source, <span class=\"hljs-literal\">yes</span>, source\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">makePrelude</span> = <span class=\"hljs-params\">(requires)</span> -&gt;</span>\n  requires.map (module) -&gt;\n    [full, name, module] = match <span class=\"hljs-keyword\">if</span> match = module.match(<span class=\"hljs-regexp\">/^(.*)=(.*)$/</span>)\n    name <span class=\"hljs-keyword\">or</span>= helpers.baseFileName module, <span class=\"hljs-literal\">yes</span>, useWinPathSep\n    <span class=\"hljs-string\">&quot;global[&#x27;<span class=\"hljs-subst\">#{name}</span>&#x27;] = require(&#x27;<span class=\"hljs-subst\">#{module}</span>&#x27;)&quot;</span>\n  .join <span class=\"hljs-string\">&#x27;;&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-11\">&#x00a7;</a>\n              </div>\n              <p>Compile a path, which could be a script or a directory. If a directory\nis passed, recursively compile all ‘.coffee’, ‘.litcoffee’, and ‘.coffee.md’\nextension source files in it and all subdirectories.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">compilePath</span> = <span class=\"hljs-params\">(source, topLevel, base)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> source <span class=\"hljs-keyword\">in</span> sources   <span class=\"hljs-keyword\">or</span>\n            watchedDirs[source] <span class=\"hljs-keyword\">or</span>\n            <span class=\"hljs-keyword\">not</span> topLevel <span class=\"hljs-keyword\">and</span> (notSources[source] <span class=\"hljs-keyword\">or</span> hidden source)\n  <span class=\"hljs-keyword\">try</span>\n    stats = fs.statSync source\n  <span class=\"hljs-keyword\">catch</span> err\n    <span class=\"hljs-keyword\">if</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;ENOENT&#x27;</span>\n      console.error <span class=\"hljs-string\">&quot;File not found: <span class=\"hljs-subst\">#{source}</span>&quot;</span>\n      process.exit <span class=\"hljs-number\">1</span>\n    <span class=\"hljs-keyword\">throw</span> err\n  <span class=\"hljs-keyword\">if</span> stats.isDirectory()\n    <span class=\"hljs-keyword\">if</span> path.basename(source) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;node_modules&#x27;</span>\n      notSources[source] = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">return</span>\n    <span class=\"hljs-keyword\">if</span> opts.run\n      compilePath findDirectoryIndex(source), topLevel, base\n      <span class=\"hljs-keyword\">return</span>\n    watchDir source, base <span class=\"hljs-keyword\">if</span> opts.watch\n    <span class=\"hljs-keyword\">try</span>\n      files = fs.readdirSync source\n    <span class=\"hljs-keyword\">catch</span> err\n      <span class=\"hljs-keyword\">if</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;ENOENT&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">throw</span> err\n    <span class=\"hljs-keyword\">for</span> file <span class=\"hljs-keyword\">in</span> files\n      compilePath (path.join source, file), <span class=\"hljs-literal\">no</span>, base\n  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> topLevel <span class=\"hljs-keyword\">or</span> helpers.isCoffee source\n    sources.push source\n    sourceCode.push <span class=\"hljs-literal\">null</span>\n    <span class=\"hljs-keyword\">delete</span> notSources[source]\n    watch source, base <span class=\"hljs-keyword\">if</span> opts.watch\n    <span class=\"hljs-keyword\">try</span>\n      code = fs.readFileSync source\n    <span class=\"hljs-keyword\">catch</span> err\n      <span class=\"hljs-keyword\">if</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;ENOENT&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">throw</span> err\n    compileScript source, code.toString(), base\n  <span class=\"hljs-keyword\">else</span>\n    notSources[source] = <span class=\"hljs-literal\">yes</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">findDirectoryIndex</span> = <span class=\"hljs-params\">(source)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">for</span> ext <span class=\"hljs-keyword\">in</span> CoffeeScript.FILE_EXTENSIONS\n    index = path.join source, <span class=\"hljs-string\">&quot;index<span class=\"hljs-subst\">#{ext}</span>&quot;</span>\n    <span class=\"hljs-keyword\">try</span>\n      <span class=\"hljs-keyword\">return</span> index <span class=\"hljs-keyword\">if</span> (fs.statSync index).isFile()\n    <span class=\"hljs-keyword\">catch</span> err\n      <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;ENOENT&#x27;</span>\n  console.error <span class=\"hljs-string\">&quot;Missing index.coffee or index.litcoffee in <span class=\"hljs-subst\">#{source}</span>&quot;</span>\n  process.exit <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-12\">&#x00a7;</a>\n              </div>\n              <p>Compile a single source script, containing the given code, according to the\nrequested options. If evaluating the script directly, set <code>__filename</code>,\n<code>__dirname</code> and <code>module.filename</code> to be correct relative to the script’s path.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">compileScript</span> = <span class=\"hljs-params\">(file, input, base = <span class=\"hljs-literal\">null</span>)</span> -&gt;</span>\n  options = compileOptions file, base\n  <span class=\"hljs-keyword\">try</span>\n    task = {file, input, options}\n    CoffeeScript.emit <span class=\"hljs-string\">&#x27;compile&#x27;</span>, task\n    <span class=\"hljs-keyword\">if</span> opts.tokens\n      printTokens CoffeeScript.tokens task.input, task.options\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> opts.nodes\n      printLine CoffeeScript.nodes(task.input, task.options).toString().trim()\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> opts.ast\n      compiled = CoffeeScript.compile task.input, task.options\n      printLine <span class=\"hljs-built_in\">JSON</span>.stringify(compiled, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-number\">2</span>)\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> opts.run\n      CoffeeScript.register()\n      CoffeeScript.<span class=\"hljs-built_in\">eval</span> opts.prelude, task.options <span class=\"hljs-keyword\">if</span> opts.prelude\n      CoffeeScript.run task.input, task.options\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> opts.join <span class=\"hljs-keyword\">and</span> task.file <span class=\"hljs-keyword\">isnt</span> opts.join\n      task.input = helpers.invertLiterate task.input <span class=\"hljs-keyword\">if</span> helpers.isLiterate file\n      sourceCode[sources.indexOf(task.file)] = task.input\n      compileJoin()\n    <span class=\"hljs-keyword\">else</span>\n      compiled = CoffeeScript.compile task.input, task.options\n      task.output = compiled\n      <span class=\"hljs-keyword\">if</span> opts.map\n        task.output = compiled.js\n        task.sourceMap = compiled.v3SourceMap\n\n      CoffeeScript.emit <span class=\"hljs-string\">&#x27;success&#x27;</span>, task\n      <span class=\"hljs-keyword\">if</span> opts.<span class=\"hljs-built_in\">print</span>\n        printLine task.output.trim()\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> opts.compile <span class=\"hljs-keyword\">or</span> opts.map\n        saveTo = <span class=\"hljs-keyword\">if</span> opts.outputFilename <span class=\"hljs-keyword\">and</span> sources.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span>\n          path.join opts.outputPath, opts.outputFilename\n        <span class=\"hljs-keyword\">else</span>\n          options.jsPath\n        writeJs base, task.file, task.output, saveTo, task.sourceMap\n  <span class=\"hljs-keyword\">catch</span> err\n    CoffeeScript.emit <span class=\"hljs-string\">&#x27;failure&#x27;</span>, err, task\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> CoffeeScript.listeners(<span class=\"hljs-string\">&#x27;failure&#x27;</span>).length\n    message = err?.stack <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{err}</span>&quot;</span>\n    <span class=\"hljs-keyword\">if</span> opts.watch\n      printLine message + <span class=\"hljs-string\">&#x27;\\x07&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      printWarn message\n      process.exit <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-13\">&#x00a7;</a>\n              </div>\n              <p>Attach the appropriate listeners to compile scripts incoming over <strong>stdin</strong>,\nand write them back to <strong>stdout</strong>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">compileStdio</span> = -&gt;</span>\n  <span class=\"hljs-keyword\">if</span> opts.map\n    console.error <span class=\"hljs-string\">&#x27;--stdio and --map cannot be used together&#x27;</span>\n    process.exit <span class=\"hljs-number\">1</span>\n  buffers = []\n  stdin = process.openStdin()\n  stdin.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">&#x27;data&#x27;</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(buffer)</span> -&gt;</span>\n    buffers.push buffer <span class=\"hljs-keyword\">if</span> buffer\n  stdin.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">&#x27;end&#x27;</span>, <span class=\"hljs-function\">-&gt;</span>\n    compileScript <span class=\"hljs-literal\">null</span>, Buffer.concat(buffers).toString()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-14\">&#x00a7;</a>\n              </div>\n              <p>If all of the source files are done being read, concatenate and compile\nthem together.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>joinTimeout = <span class=\"hljs-literal\">null</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">compileJoin</span> = -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> opts.join\n  <span class=\"hljs-keyword\">unless</span> sourceCode.some(<span class=\"hljs-function\"><span class=\"hljs-params\">(code)</span> -&gt;</span> code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">null</span>)\n    <span class=\"hljs-built_in\">clearTimeout</span> joinTimeout\n    joinTimeout = wait <span class=\"hljs-number\">100</span>, <span class=\"hljs-function\">-&gt;</span>\n      compileScript opts.join, sourceCode.join(<span class=\"hljs-string\">&#x27;\\n&#x27;</span>), opts.join</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-15\">&#x00a7;</a>\n              </div>\n              <p>Watch a source CoffeeScript file using <code>fs.watch</code>, recompiling it every\ntime the file is updated. May be used in combination with other options,\nsuch as <code>--print</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">watch</span> = <span class=\"hljs-params\">(source, base)</span> -&gt;</span>\n  watcher        = <span class=\"hljs-literal\">null</span>\n  prevStats      = <span class=\"hljs-literal\">null</span>\n  compileTimeout = <span class=\"hljs-literal\">null</span>\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">watchErr</span> = <span class=\"hljs-params\">(err)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;ENOENT&#x27;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> source <span class=\"hljs-keyword\">in</span> sources\n    <span class=\"hljs-keyword\">try</span>\n      rewatch()\n      compile()\n    <span class=\"hljs-keyword\">catch</span>\n      removeSource source, base\n      compileJoin()\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">compile</span> = -&gt;</span>\n    <span class=\"hljs-built_in\">clearTimeout</span> compileTimeout\n    compileTimeout = wait <span class=\"hljs-number\">25</span>, <span class=\"hljs-function\">-&gt;</span>\n      fs.stat source, <span class=\"hljs-function\"><span class=\"hljs-params\">(err, stats)</span> -&gt;</span>\n        <span class=\"hljs-keyword\">return</span> watchErr err <span class=\"hljs-keyword\">if</span> err\n        <span class=\"hljs-keyword\">return</span> rewatch() <span class=\"hljs-keyword\">if</span> prevStats <span class=\"hljs-keyword\">and</span>\n                            stats.size <span class=\"hljs-keyword\">is</span> prevStats.size <span class=\"hljs-keyword\">and</span>\n                            stats.mtime.getTime() <span class=\"hljs-keyword\">is</span> prevStats.mtime.getTime()\n        prevStats = stats\n        fs.readFile source, <span class=\"hljs-function\"><span class=\"hljs-params\">(err, code)</span> -&gt;</span>\n          <span class=\"hljs-keyword\">return</span> watchErr err <span class=\"hljs-keyword\">if</span> err\n          compileScript(source, code.toString(), base)\n          rewatch()\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">startWatcher</span> = -&gt;</span>\n    watcher = fs.watch source\n    .<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">&#x27;change&#x27;</span>, compile\n    .<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">&#x27;error&#x27;</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(err)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;EPERM&#x27;</span>\n      removeSource source, base\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">rewatch</span> = -&gt;</span>\n    watcher?.close()\n    startWatcher()\n\n  <span class=\"hljs-keyword\">try</span>\n    startWatcher()\n  <span class=\"hljs-keyword\">catch</span> err\n    watchErr err</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-16\">&#x00a7;</a>\n              </div>\n              <p>Watch a directory of files for new additions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">watchDir</span> = <span class=\"hljs-params\">(source, base)</span> -&gt;</span>\n  watcher        = <span class=\"hljs-literal\">null</span>\n  readdirTimeout = <span class=\"hljs-literal\">null</span>\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">startWatcher</span> = -&gt;</span>\n    watcher = fs.watch source\n    .<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">&#x27;error&#x27;</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(err)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;EPERM&#x27;</span>\n      stopWatcher()\n    .<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">&#x27;change&#x27;</span>, <span class=\"hljs-function\">-&gt;</span>\n      <span class=\"hljs-built_in\">clearTimeout</span> readdirTimeout\n      readdirTimeout = wait <span class=\"hljs-number\">25</span>, <span class=\"hljs-function\">-&gt;</span>\n        <span class=\"hljs-keyword\">try</span>\n          files = fs.readdirSync source\n        <span class=\"hljs-keyword\">catch</span> err\n          <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;ENOENT&#x27;</span>\n          <span class=\"hljs-keyword\">return</span> stopWatcher()\n        <span class=\"hljs-keyword\">for</span> file <span class=\"hljs-keyword\">in</span> files\n          compilePath (path.join source, file), <span class=\"hljs-literal\">no</span>, base\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">stopWatcher</span> = -&gt;</span>\n    watcher.close()\n    removeSourceDir source, base\n\n  watchedDirs[source] = <span class=\"hljs-literal\">yes</span>\n  <span class=\"hljs-keyword\">try</span>\n    startWatcher()\n  <span class=\"hljs-keyword\">catch</span> err\n    <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;ENOENT&#x27;</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">removeSourceDir</span> = <span class=\"hljs-params\">(source, base)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">delete</span> watchedDirs[source]\n  sourcesChanged = <span class=\"hljs-literal\">no</span>\n  <span class=\"hljs-keyword\">for</span> file <span class=\"hljs-keyword\">in</span> sources <span class=\"hljs-keyword\">when</span> source <span class=\"hljs-keyword\">is</span> path.dirname file\n    removeSource file, base\n    sourcesChanged = <span class=\"hljs-literal\">yes</span>\n  compileJoin() <span class=\"hljs-keyword\">if</span> sourcesChanged</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-17\">&#x00a7;</a>\n              </div>\n              <p>Remove a file from our source list, and source code cache. Optionally remove\nthe compiled JS version as well.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">removeSource</span> = <span class=\"hljs-params\">(source, base)</span> -&gt;</span>\n  index = sources.indexOf source\n  sources.splice index, <span class=\"hljs-number\">1</span>\n  sourceCode.splice index, <span class=\"hljs-number\">1</span>\n  <span class=\"hljs-keyword\">unless</span> opts.join\n    silentUnlink outputPath source, base\n    silentUnlink outputPath source, base, <span class=\"hljs-string\">&#x27;.js.map&#x27;</span>\n    timeLog <span class=\"hljs-string\">&quot;removed <span class=\"hljs-subst\">#{source}</span>&quot;</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">silentUnlink</span> = <span class=\"hljs-params\">(path)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">try</span>\n    fs.unlinkSync path\n  <span class=\"hljs-keyword\">catch</span> err\n    <span class=\"hljs-keyword\">throw</span> err <span class=\"hljs-keyword\">unless</span> err.code <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;ENOENT&#x27;</span>, <span class=\"hljs-string\">&#x27;EPERM&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-18\">&#x00a7;</a>\n              </div>\n              <p>Get the corresponding output JavaScript path for a source file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">outputPath</span> = <span class=\"hljs-params\">(source, base, extension=<span class=\"hljs-string\">&quot;.js&quot;</span>)</span> -&gt;</span>\n  basename  = helpers.baseFileName source, <span class=\"hljs-literal\">yes</span>, useWinPathSep\n  srcDir    = path.dirname source\n  dir = <span class=\"hljs-keyword\">unless</span> opts.outputPath\n    srcDir\n  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> source <span class=\"hljs-keyword\">is</span> base\n    opts.outputPath\n  <span class=\"hljs-keyword\">else</span>\n    path.join opts.outputPath, path.relative base, srcDir\n  path.join dir, basename + extension</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-19\">&#x00a7;</a>\n              </div>\n              <p>Recursively mkdir, like <code>mkdir -p</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">mkdirp</span> = <span class=\"hljs-params\">(dir, fn)</span> -&gt;</span>\n  mode = <span class=\"hljs-number\">0</span>o777 &amp; ~process.umask()\n\n  <span class=\"hljs-keyword\">do</span> mkdirs = <span class=\"hljs-function\"><span class=\"hljs-params\">(p = dir, fn)</span> -&gt;</span>\n    fs.exists p, <span class=\"hljs-function\"><span class=\"hljs-params\">(exists)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">if</span> exists\n        fn()\n      <span class=\"hljs-keyword\">else</span>\n        mkdirs path.dirname(p), <span class=\"hljs-function\">-&gt;</span>\n          fs.mkdir p, mode, <span class=\"hljs-function\"><span class=\"hljs-params\">(err)</span> -&gt;</span>\n            <span class=\"hljs-keyword\">return</span> fn err <span class=\"hljs-keyword\">if</span> err\n            fn()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-20\">&#x00a7;</a>\n              </div>\n              <p>Write out a JavaScript source file with the compiled code. By default, files\nare written out in <code>cwd</code> as <code>.js</code> files with the same name, but the output\ndirectory can be customized with <code>--output</code>.</p>\n<p>If <code>generatedSourceMap</code> is provided, this will write a <code>.js.map</code> file into the\nsame directory as the <code>.js</code> file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">writeJs</span> = <span class=\"hljs-params\">(base, sourcePath, js, jsPath, generatedSourceMap = <span class=\"hljs-literal\">null</span>)</span> -&gt;</span>\n  sourceMapPath = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{jsPath}</span>.map&quot;</span>\n  jsDir  = path.dirname jsPath\n<span class=\"hljs-function\">  <span class=\"hljs-title\">compile</span> = -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> opts.compile\n      js = <span class=\"hljs-string\">&#x27; &#x27;</span> <span class=\"hljs-keyword\">if</span> js.length &lt;= <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">if</span> generatedSourceMap <span class=\"hljs-keyword\">then</span> js = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{js}</span>\\n//# sourceMappingURL=<span class=\"hljs-subst\">#{helpers.baseFileName sourceMapPath, <span class=\"hljs-literal\">no</span>, useWinPathSep}</span>\\n&quot;</span>\n      fs.writeFile jsPath, js, <span class=\"hljs-function\"><span class=\"hljs-params\">(err)</span> -&gt;</span>\n        <span class=\"hljs-keyword\">if</span> err\n          printLine err.message\n          process.exit <span class=\"hljs-number\">1</span>\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> opts.compile <span class=\"hljs-keyword\">and</span> opts.watch\n          timeLog <span class=\"hljs-string\">&quot;compiled <span class=\"hljs-subst\">#{sourcePath}</span>&quot;</span>\n    <span class=\"hljs-keyword\">if</span> generatedSourceMap\n      fs.writeFile sourceMapPath, generatedSourceMap, <span class=\"hljs-function\"><span class=\"hljs-params\">(err)</span> -&gt;</span>\n        <span class=\"hljs-keyword\">if</span> err\n          printLine <span class=\"hljs-string\">&quot;Could not write source map: <span class=\"hljs-subst\">#{err.message}</span>&quot;</span>\n          process.exit <span class=\"hljs-number\">1</span>\n  fs.exists jsDir, <span class=\"hljs-function\"><span class=\"hljs-params\">(itExists)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> itExists <span class=\"hljs-keyword\">then</span> compile() <span class=\"hljs-keyword\">else</span> mkdirp jsDir, compile</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-21\">&#x00a7;</a>\n              </div>\n              <p>Convenience for cleaner setTimeouts.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">wait</span> = <span class=\"hljs-params\">(milliseconds, func)</span> -&gt;</span> <span class=\"hljs-built_in\">setTimeout</span> func, milliseconds</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-22\">&#x00a7;</a>\n              </div>\n              <p>When watching scripts, it’s useful to log changes with the timestamp.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">timeLog</span> = <span class=\"hljs-params\">(message)</span> -&gt;</span>\n  console.log <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{(<span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Date</span>).toLocaleTimeString()}</span> - <span class=\"hljs-subst\">#{message}</span>&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-23\">&#x00a7;</a>\n              </div>\n              <p>Pretty-print a stream of tokens, sans location data.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">printTokens</span> = <span class=\"hljs-params\">(tokens)</span> -&gt;</span>\n  strings = <span class=\"hljs-keyword\">for</span> token <span class=\"hljs-keyword\">in</span> tokens\n    tag = token[<span class=\"hljs-number\">0</span>]\n    value = token[<span class=\"hljs-number\">1</span>].toString().replace(<span class=\"hljs-regexp\">/\\n/</span>, <span class=\"hljs-string\">&#x27;\\\\n&#x27;</span>)\n    <span class=\"hljs-string\">&quot;[<span class=\"hljs-subst\">#{tag}</span> <span class=\"hljs-subst\">#{value}</span>]&quot;</span>\n  printLine strings.join(<span class=\"hljs-string\">&#x27; &#x27;</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-24\">&#x00a7;</a>\n              </div>\n              <p>Use the <a href=\"optparse.html\">OptionParser module</a> to extract all options from\n<code>process.argv</code> that are specified in <code>SWITCHES</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">parseOptions</span> = -&gt;</span>\n  o = opts      = optionParser.parse process.argv[<span class=\"hljs-number\">2.</span>.]\n  o.compile     <span class=\"hljs-keyword\">or</span>=  !!o.output\n  o.run         = <span class=\"hljs-keyword\">not</span> (o.compile <span class=\"hljs-keyword\">or</span> o.<span class=\"hljs-built_in\">print</span> <span class=\"hljs-keyword\">or</span> o.map)\n  o.<span class=\"hljs-built_in\">print</span>       = !!  (o.<span class=\"hljs-built_in\">print</span> <span class=\"hljs-keyword\">or</span> (o.<span class=\"hljs-built_in\">eval</span> <span class=\"hljs-keyword\">or</span> o.stdio <span class=\"hljs-keyword\">and</span> o.compile))</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-25\">&#x00a7;</a>\n              </div>\n              <p>The compile-time options to pass to the CoffeeScript compiler.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">compileOptions</span> = <span class=\"hljs-params\">(filename, base)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">if</span> opts.transpile</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-26\">&#x00a7;</a>\n              </div>\n              <p>The user has requested that the CoffeeScript compiler also transpile\nvia Babel. We don’t include Babel as a dependency because we want to\navoid dependencies in general, and most users probably won’t be relying\non us to transpile for them; we assume most users will probably either\nrun CoffeeScript’s output without transpilation (modern Node or evergreen\nbrowsers) or use a proper build chain like Gulp or Webpack.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">try</span>\n      <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;@babel/core&#x27;</span>\n    <span class=\"hljs-keyword\">catch</span>\n      <span class=\"hljs-keyword\">try</span>\n        <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;babel-core&#x27;</span>\n      <span class=\"hljs-keyword\">catch</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-27\">&#x00a7;</a>\n              </div>\n              <p>Give appropriate instructions depending on whether <code>coffee</code> was run\nlocally or globally.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> <span class=\"hljs-built_in\">require</span>.resolve(<span class=\"hljs-string\">&#x27;.&#x27;</span>).indexOf(process.cwd()) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n          console.error <span class=\"hljs-string\">&#x27;&#x27;&#x27;\n            To use --transpile, you must have @babel/core installed:\n              npm install --save-dev @babel/core\n            And you must save options to configure Babel in one of the places it looks to find its options.\n            See https://coffeescript.org/#transpilation\n          &#x27;&#x27;&#x27;</span>\n        <span class=\"hljs-keyword\">else</span>\n          console.error <span class=\"hljs-string\">&#x27;&#x27;&#x27;\n            To use --transpile with globally-installed CoffeeScript, you must have @babel/core installed globally:\n              npm install --global @babel/core\n            And you must save options to configure Babel in one of the places it looks to find its options, relative to the file being compiled or to the current folder.\n            See https://coffeescript.org/#transpilation\n          &#x27;&#x27;&#x27;</span>\n        process.exit <span class=\"hljs-number\">1</span>\n\n    opts.transpile = {} <span class=\"hljs-keyword\">unless</span> <span class=\"hljs-keyword\">typeof</span> opts.transpile <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-28\">&#x00a7;</a>\n              </div>\n              <p>Pass a reference to Babel into the compiler, so that the transpile option\nis available for the CLI. We need to do this so that tools like Webpack\ncan <code>require(&#39;coffeescript&#39;)</code> and build correctly, without trying to\nrequire Babel.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    opts.transpile.transpile = CoffeeScript.transpile</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-29\">&#x00a7;</a>\n              </div>\n              <p>Babel searches for its options (a <code>.babelrc</code> file, a <code>.babelrc.js</code> file,\na <code>package.json</code> file with a <code>babel</code> key, etc.) relative to the path\ngiven to it in its <code>filename</code> option. Make sure we have a path to pass\nalong.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">unless</span> opts.transpile.filename\n      opts.transpile.filename = filename <span class=\"hljs-keyword\">or</span> path.resolve(base <span class=\"hljs-keyword\">or</span> process.cwd(), <span class=\"hljs-string\">&#x27;&lt;anonymous&gt;&#x27;</span>)\n  <span class=\"hljs-keyword\">else</span>\n    opts.transpile = <span class=\"hljs-literal\">no</span>\n\n  answer =\n    filename: filename\n    literate: opts.literate <span class=\"hljs-keyword\">or</span> helpers.isLiterate(filename)\n    bare: opts.bare\n    header: opts.compile <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> opts[<span class=\"hljs-string\">&#x27;no-header&#x27;</span>]\n    transpile: opts.transpile\n    sourceMap: opts.map\n    inlineMap: opts[<span class=\"hljs-string\">&#x27;inline-map&#x27;</span>]\n    ast: opts.ast\n\n  <span class=\"hljs-keyword\">if</span> filename\n    <span class=\"hljs-keyword\">if</span> base\n      cwd = process.cwd()\n      jsPath = outputPath filename, base\n      jsDir = path.dirname jsPath\n      answer = helpers.merge answer, {\n        jsPath\n        sourceRoot: path.relative(jsDir, cwd) + path.sep\n        sourceFiles: [path.relative cwd, filename]\n        generatedFile: helpers.baseFileName(jsPath, <span class=\"hljs-literal\">no</span>, useWinPathSep)\n      }\n    <span class=\"hljs-keyword\">else</span>\n      answer = helpers.merge answer,\n        sourceRoot: <span class=\"hljs-string\">&quot;&quot;</span>\n        sourceFiles: [helpers.baseFileName filename, <span class=\"hljs-literal\">no</span>, useWinPathSep]\n        generatedFile: helpers.baseFileName(filename, <span class=\"hljs-literal\">yes</span>, useWinPathSep) + <span class=\"hljs-string\">&quot;.js&quot;</span>\n  answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-30\">&#x00a7;</a>\n              </div>\n              <p>Start up a new Node.js instance with the arguments in <code>--nodejs</code> passed to\nthe <code>node</code> binary, preserving the other options.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">forkNode</span> = -&gt;</span>\n  nodeArgs = opts.nodejs.split <span class=\"hljs-regexp\">/\\s+/</span>\n  args     = process.argv[<span class=\"hljs-number\">1.</span>.]\n  args.splice args.indexOf(<span class=\"hljs-string\">&#x27;--nodejs&#x27;</span>), <span class=\"hljs-number\">2</span>\n  p = spawn process.execPath, nodeArgs.concat(args),\n    cwd:        process.cwd()\n    env:        process.env\n    stdio:      [<span class=\"hljs-number\">0</span>, <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">2</span>]\n  <span class=\"hljs-keyword\">for</span> signal <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;SIGINT&#x27;</span>, <span class=\"hljs-string\">&#x27;SIGTERM&#x27;</span>]\n    process.<span class=\"hljs-literal\">on</span> signal, <span class=\"hljs-keyword\">do</span> (signal) -&gt;\n      -&gt; p.kill signal\n  p.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">&#x27;exit&#x27;</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(code)</span> -&gt;</span> process.exit code</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-31\">&#x00a7;</a>\n              </div>\n              <p>Print the <code>--help</code> usage message and exit. Deprecated switches are not\nshown.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">usage</span> = -&gt;</span>\n  printLine optionParser.help()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-32\">&#x00a7;</a>\n              </div>\n              <p>Print the <code>--version</code> message and exit.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">version</span> = -&gt;</span>\n  printLine <span class=\"hljs-string\">&quot;CoffeeScript version <span class=\"hljs-subst\">#{CoffeeScript.VERSION}</span>&quot;</span></pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/docco.css",
    "content": "/*--------------------- Typography ----------------------------*/\n\n@font-face {\n    font-family: 'aller-light';\n    src: url('public/fonts/aller-light.eot');\n    src: url('public/fonts/aller-light.eot?#iefix') format('embedded-opentype'),\n         url('public/fonts/aller-light.woff') format('woff'),\n         url('public/fonts/aller-light.ttf') format('truetype');\n    font-weight: normal;\n    font-style: normal;\n}\n\n@font-face {\n    font-family: 'aller-bold';\n    src: url('public/fonts/aller-bold.eot');\n    src: url('public/fonts/aller-bold.eot?#iefix') format('embedded-opentype'),\n         url('public/fonts/aller-bold.woff') format('woff'),\n         url('public/fonts/aller-bold.ttf') format('truetype');\n    font-weight: normal;\n    font-style: normal;\n}\n\n@font-face {\n    font-family: 'roboto-black';\n    src: url('public/fonts/roboto-black.eot');\n    src: url('public/fonts/roboto-black.eot?#iefix') format('embedded-opentype'),\n         url('public/fonts/roboto-black.woff') format('woff'),\n         url('public/fonts/roboto-black.ttf') format('truetype');\n    font-weight: normal;\n    font-style: normal;\n}\n\n/*--------------------- Layout ----------------------------*/\nhtml { height: 100%; }\nbody {\n  font-family: \"aller-light\";\n  font-size: 14px;\n  line-height: 18px;\n  color: #30404f;\n  margin: 0; padding: 0;\n  height:100%;\n}\n#container { min-height: 100%; }\n\na {\n  color: #000;\n}\n\nb, strong {\n  font-weight: normal;\n  font-family: \"aller-bold\";\n}\n\np {\n  margin: 15px 0 0px;\n}\n  .annotation ul, .annotation ol {\n    margin: 25px 0;\n  }\n    .annotation ul li, .annotation ol li {\n      font-size: 14px;\n      line-height: 18px;\n      margin: 10px 0;\n    }\n\nh1, h2, h3, h4, h5, h6 {\n  color: #112233;\n  line-height: 1em;\n  font-weight: normal;\n  font-family: \"roboto-black\";\n  text-transform: uppercase;\n  margin: 30px 0 15px 0;\n}\n\nh1 {\n  margin-top: 40px;\n}\nh2 {\n  font-size: 1.26em;\n}\n\nhr {\n  border: 0;\n  background: 1px #ddd;\n  height: 1px;\n  margin: 20px 0;\n}\n\npre, tt, code {\n  font-size: 12px; line-height: 16px;\n  font-family: Menlo, Monaco, Consolas, \"Lucida Console\", monospace;\n  margin: 0; padding: 0;\n}\n  .annotation pre {\n    display: block;\n    margin: 0;\n    padding: 7px 10px;\n    background: #fcfcfc;\n    -moz-box-shadow:    inset 0 0 10px rgba(0,0,0,0.1);\n    -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.1);\n    box-shadow:         inset 0 0 10px rgba(0,0,0,0.1);\n    overflow-x: auto;\n  }\n    .annotation pre code {\n      border: 0;\n      padding: 0;\n      background: transparent;\n    }\n\n\nblockquote {\n  border-left: 5px solid #ccc;\n  margin: 0;\n  padding: 1px 0 1px 1em;\n}\n  .sections blockquote p {\n    font-family: Menlo, Consolas, Monaco, monospace;\n    font-size: 12px; line-height: 16px;\n    color: #999;\n    margin: 10px 0 0;\n    white-space: pre-wrap;\n  }\n\nul.sections {\n  list-style: none;\n  padding:0 0 5px 0;;\n  margin:0;\n}\n\n/*\n  Force border-box so that % widths fit the parent\n  container without overlap because of margin/padding.\n\n  More Info : http://www.quirksmode.org/css/box.html\n*/\nul.sections > li > div {\n  -moz-box-sizing: border-box;    /* firefox */\n  -ms-box-sizing: border-box;     /* ie */\n  -webkit-box-sizing: border-box; /* webkit */\n  -khtml-box-sizing: border-box;  /* konqueror */\n  box-sizing: border-box;         /* css3 */\n}\n\n\n/*---------------------- Jump Page -----------------------------*/\n#jump_to, #jump_page {\n  margin: 0;\n  background: white;\n  -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;\n  -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;\n  font: 16px Arial;\n  cursor: pointer;\n  text-align: right;\n  list-style: none;\n}\n\n#jump_to a {\n  text-decoration: none;\n}\n\n#jump_to a.large {\n  display: none;\n}\n#jump_to a.small {\n  font-size: 22px;\n  font-weight: bold;\n  color: #676767;\n}\n\n#jump_to, #jump_wrapper {\n  position: fixed;\n  right: 0; top: 0;\n  padding: 10px 15px;\n  margin:0;\n}\n\n#jump_wrapper {\n  display: none;\n  padding:0;\n}\n\n#jump_to:hover #jump_wrapper {\n  display: block;\n}\n\n#jump_page_wrapper{\n  position: fixed;\n  right: 0;\n  top: 0;\n  bottom: 0;\n}\n\n#jump_page {\n  padding: 5px 0 3px;\n  margin: 0 0 25px 25px;\n  max-height: 100%;\n  overflow: auto;\n}\n\n#jump_page .source {\n  display: block;\n  padding: 15px;\n  text-decoration: none;\n  border-top: 1px solid #eee;\n}\n\n#jump_page .source:hover {\n  background: #f5f5ff;\n}\n\n#jump_page .source:first-child {\n}\n\n/*---------------------- Low resolutions (> 320px) ---------------------*/\n@media only screen and (min-width: 320px) {\n  .sswrap { display: none; }\n\n  ul.sections > li > div {\n    display: block;\n    padding:5px 10px 0 10px;\n  }\n\n  ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol {\n    padding-left: 30px;\n  }\n\n  ul.sections > li > div.content {\n    overflow-x:auto;\n    -webkit-box-shadow: inset 0 0 5px #e5e5ee;\n    box-shadow: inset 0 0 5px #e5e5ee;\n    border: 1px solid #dedede;\n    margin:5px 10px 5px 10px;\n    padding-bottom: 5px;\n  }\n\n  ul.sections > li > div.annotation pre {\n    margin: 7px 0 7px;\n    padding-left: 15px;\n  }\n\n  ul.sections > li > div.annotation p tt, .annotation code {\n    background: #f8f8ff;\n    border: 1px solid #dedede;\n    font-size: 12px;\n    padding: 0 0.2em;\n  }\n}\n\n/*----------------------  (> 481px) ---------------------*/\n@media only screen and (min-width: 481px) {\n  #container {\n    position: relative;\n  }\n  body {\n    background-color: #F5F5FF;\n    font-size: 15px;\n    line-height: 21px;\n  }\n  pre, tt, code {\n    line-height: 18px;\n  }\n  p, ul, ol {\n    margin: 0 0 15px;\n  }\n\n\n  #jump_to {\n    padding: 5px 10px;\n  }\n  #jump_wrapper {\n    padding: 0;\n  }\n  #jump_to, #jump_page {\n    font: 10px Arial;\n    text-transform: uppercase;\n  }\n  #jump_page .source {\n    padding: 5px 10px;\n  }\n  #jump_to a.large {\n    display: inline-block;\n  }\n  #jump_to a.small {\n    display: none;\n  }\n\n\n\n  #background {\n    position: absolute;\n    top: 0; bottom: 0;\n    width: 350px;\n    background: #fff;\n    border-right: 1px solid #e5e5ee;\n    z-index: -1;\n  }\n\n  ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol {\n    padding-left: 40px;\n  }\n\n  ul.sections > li {\n    white-space: nowrap;\n  }\n\n  ul.sections > li > div {\n    display: inline-block;\n  }\n\n  ul.sections > li > div.annotation {\n    max-width: 350px;\n    min-width: 350px;\n    min-height: 5px;\n    padding: 13px;\n    overflow-x: hidden;\n    white-space: normal;\n    vertical-align: top;\n    text-align: left;\n  }\n  ul.sections > li > div.annotation pre {\n    margin: 15px 0 15px;\n    padding-left: 15px;\n  }\n\n  ul.sections > li > div.content {\n    padding: 13px;\n    vertical-align: top;\n    border: none;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n\n  .sswrap {\n    position: relative;\n    display: inline;\n  }\n\n  .ss {\n    font: 12px Arial;\n    text-decoration: none;\n    color: #454545;\n    position: absolute;\n    top: 3px; left: -20px;\n    padding: 1px 2px;\n    opacity: 0;\n    -webkit-transition: opacity 0.2s linear;\n  }\n    .for-h1 .ss {\n      top: 47px;\n    }\n    .for-h2 .ss, .for-h3 .ss, .for-h4 .ss {\n      top: 35px;\n    }\n\n  ul.sections > li > div.annotation:hover .ss {\n    opacity: 1;\n  }\n}\n\n/*---------------------- (> 1025px) ---------------------*/\n@media only screen and (min-width: 1025px) {\n\n  body {\n    font-size: 16px;\n    line-height: 24px;\n  }\n\n  #background {\n    width: 525px;\n  }\n  ul.sections > li > div.annotation {\n    max-width: 525px;\n    min-width: 525px;\n    padding: 10px 25px 1px 50px;\n  }\n  ul.sections > li > div.content {\n    padding: 9px 15px 16px 25px;\n  }\n}\n\n/*---------------------- Syntax Highlighting -----------------------------*/\n\ntd.linenos { background-color: #f0f0f0; padding-right: 10px; }\nspan.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\n/*\n\ngithub.com style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\npre code {\n  display: block; padding: 0.5em;\n  color: #000;\n  background: #f8f8ff\n}\n\npre .hljs-comment,\npre .hljs-template_comment,\npre .hljs-diff .hljs-header,\npre .hljs-javadoc {\n  color: #408080;\n  font-style: italic\n}\n\npre .hljs-keyword,\npre .hljs-assignment,\npre .hljs-literal,\npre .hljs-css .hljs-rule .hljs-keyword,\npre .hljs-winutils,\npre .hljs-javascript .hljs-title,\npre .hljs-lisp .hljs-title,\npre .hljs-subst {\n  color: #954121;\n  /*font-weight: bold*/\n}\n\npre .hljs-number,\npre .hljs-hexcolor {\n  color: #40a070\n}\n\npre .hljs-string,\npre .hljs-tag .hljs-value,\npre .hljs-phpdoc,\npre .hljs-tex .hljs-formula {\n  color: #219161;\n}\n\npre .hljs-title,\npre .hljs-id {\n  color: #19469D;\n}\npre .hljs-params {\n  color: #00F;\n}\n\npre .hljs-javascript .hljs-title,\npre .hljs-lisp .hljs-title,\npre .hljs-subst {\n  font-weight: normal\n}\n\npre .hljs-class .hljs-title,\npre .hljs-haskell .hljs-label,\npre .hljs-tex .hljs-command {\n  color: #458;\n  font-weight: bold\n}\n\npre .hljs-tag,\npre .hljs-tag .hljs-title,\npre .hljs-rules .hljs-property,\npre .hljs-django .hljs-tag .hljs-keyword {\n  color: #000080;\n  font-weight: normal\n}\n\npre .hljs-attribute,\npre .hljs-variable,\npre .hljs-instancevar,\npre .hljs-lisp .hljs-body {\n  color: #008080\n}\n\npre .hljs-regexp {\n  color: #B68\n}\n\npre .hljs-class {\n  color: #458;\n  font-weight: bold\n}\n\npre .hljs-symbol,\npre .hljs-ruby .hljs-symbol .hljs-string,\npre .hljs-ruby .hljs-symbol .hljs-keyword,\npre .hljs-ruby .hljs-symbol .hljs-keymethods,\npre .hljs-lisp .hljs-keyword,\npre .hljs-tex .hljs-special,\npre .hljs-input_number {\n  color: #990073\n}\n\npre .hljs-builtin,\npre .hljs-constructor,\npre .hljs-built_in,\npre .hljs-lisp .hljs-title {\n  color: #0086b3\n}\n\npre .hljs-preprocessor,\npre .hljs-pi,\npre .hljs-doctype,\npre .hljs-shebang,\npre .hljs-cdata {\n  color: #999;\n  font-weight: bold\n}\n\npre .hljs-deletion {\n  background: #fdd\n}\n\npre .hljs-addition {\n  background: #dfd\n}\n\npre .hljs-diff .hljs-change {\n  background: #0086b3\n}\n\npre .hljs-chunk {\n  color: #aaa\n}\n\npre .hljs-tex .hljs-formula {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "docs/v2/annotated-source/grammar.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>grammar.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>grammar.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              <p>The CoffeeScript parser is generated by <a href=\"https://github.com/zaach/jison\">Jison</a>\nfrom this grammar file. Jison is a bottom-up parser generator, similar in\nstyle to <a href=\"http://www.gnu.org/software/bison\">Bison</a>, implemented in JavaScript.\nIt can recognize <a href=\"https://en.wikipedia.org/wiki/LR_grammar\">LALR(1), LR(0), SLR(1), and LR(1)</a>\ntype grammars. To create the Jison parser, we list the pattern to match\non the left-hand side, and the action to take (usually the creation of syntax\ntree nodes) on the right. As the parser runs, it\nshifts tokens from our token stream, from left to right, and\n<a href=\"https://en.wikipedia.org/wiki/Bottom-up_parsing\">attempts to match</a>\nthe token sequence against the rules below. When a match can be made, it\nreduces into the <a href=\"https://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols\">nonterminal</a>\n(the enclosing name at the top), and we proceed from there.</p>\n<p>If you run the <code>cake build:parser</code> command, Jison constructs a parse table\nfrom our rules and saves it into <code>lib/parser.js</code>.</p>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>The only dependency is on the <strong>Jison.Parser</strong>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>{Parser} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;jison&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <h2 id=\"jison-dsl\">Jison DSL</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>Since we’re going to be wrapped in a function by Jison in any case, if our\naction immediately returns a value, we can optimize by removing the function\nwrapper and just returning the value directly.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>unwrap = <span class=\"hljs-regexp\">/^function\\s*\\(\\)\\s*\\{\\s*return\\s*([\\s\\S]*);\\s*\\}/</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>Our handy DSL for Jison grammar generation, thanks to\n<a href=\"https://github.com/creationix\">Tim Caswell</a>. For every rule in the grammar,\nwe pass the pattern-defining string, the action to run, and extra options,\noptionally. If no action is specified, we simply pass the value of the\nprevious nonterminal.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">o</span> = <span class=\"hljs-params\">(patternString, action, options)</span> -&gt;</span>\n  patternString = patternString.replace <span class=\"hljs-regexp\">/\\s{2,}/g</span>, <span class=\"hljs-string\">&#x27; &#x27;</span>\n  patternCount = patternString.split(<span class=\"hljs-string\">&#x27; &#x27;</span>).length\n  <span class=\"hljs-keyword\">if</span> action</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>This code block does string replacements in the generated <code>parser.js</code>\nfile, replacing the calls to the <code>LOC</code> function and other strings as\nlisted below.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    action = <span class=\"hljs-keyword\">if</span> match = unwrap.exec action <span class=\"hljs-keyword\">then</span> match[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&quot;(<span class=\"hljs-subst\">#{action}</span>())&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>All runtime functions we need are defined on <code>yy</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    action = action.replace <span class=\"hljs-regexp\">/\\bnew /g</span>, <span class=\"hljs-string\">&#x27;$&amp;yy.&#x27;</span>\n    action = action.replace <span class=\"hljs-regexp\">/\\b(?:Block\\.wrap|extend)\\b/g</span>, <span class=\"hljs-string\">&#x27;yy.$&amp;&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <p>Returns strings of functions to add to <code>parser.js</code> which add extra data\nthat nodes may have, such as comments or location data. Location data\nis added to the first parameter passed in, and the parameter is returned.\nIf the parameter is not a node, it will just be passed through unaffected.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">    <span class=\"hljs-title\">getAddDataToNodeFunctionString</span> = <span class=\"hljs-params\">(first, last, forceUpdateLocation = <span class=\"hljs-literal\">yes</span>)</span> -&gt;</span>\n      <span class=\"hljs-string\">&quot;yy.addDataToNode(yy, @<span class=\"hljs-subst\">#{first}</span>, <span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> first[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;$&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;$$&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;$&#x27;</span>}</span><span class=\"hljs-subst\">#{first}</span>, <span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> last <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;@<span class=\"hljs-subst\">#{last}</span>, <span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> last[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;$&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;$$&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;$&#x27;</span>}</span><span class=\"hljs-subst\">#{last}</span>&quot;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;null, null&#x27;</span>}</span>, <span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> forceUpdateLocation <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;true&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;false&#x27;</span>}</span>)&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>This code replaces the calls to <code>LOC</code> with the <code>yy.addDataToNode</code> string\ndefined above. The <code>LOC</code> function, when used below in the grammar rules,\nis used to make sure that newly created node class objects get correct\nlocation data assigned to them. By default, the grammar will assign the\nlocation data spanned by <em>all</em> of the tokens on the left (e.g. a string\nsuch as <code>&#39;Body TERMINATOR Line&#39;</code>) to the “top-level” node returned by\nthe grammar rule (the function on the right). But for “inner” node class\nobjects created by grammar rules, they won’t get correct location data\nassigned to them without adding <code>LOC</code>.</p>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-11\">&#x00a7;</a>\n              </div>\n              <p>For example, consider the grammar rule <code>&#39;NEW_TARGET . Property&#39;</code>, which\nis handled by a function that returns\n<code>new MetaProperty LOC(1)(new IdentifierLiteral $1), LOC(3)(new Access $3)</code>.\nThe <code>1</code> in <code>LOC(1)</code> refers to the first token (<code>NEW_TARGET</code>) and the <code>3</code>\nin <code>LOC(3)</code> refers to the third token (<code>Property</code>). In order for the\n<code>new IdentifierLiteral</code> to get assigned the location data corresponding\nto <code>new</code> in the source code, we use\n<code>LOC(1)(new IdentifierLiteral ...)</code> to mean “assign the location data of\nthe <em>first</em> token of this grammar rule (<code>NEW_TARGET</code>) to this\n<code>new IdentifierLiteral</code>”. The <code>LOC(3)</code> means “assign the location data of\nthe <em>third</em> token of this grammar rule (<code>Property</code>) to this\n<code>new Access</code>”.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    returnsLoc = <span class=\"hljs-regexp\">/^LOC/</span>.test action\n    action = action.replace <span class=\"hljs-regexp\">/LOC\\(([0-9]*)\\)/g</span>, getAddDataToNodeFunctionString(<span class=\"hljs-string\">&#x27;$1&#x27;</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-12\">&#x00a7;</a>\n              </div>\n              <p>A call to <code>LOC</code> with two arguments, e.g. <code>LOC(2,4)</code>, sets the location\ndata for the generated node on both of the referenced tokens  (the second\nand fourth in this example).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    action = action.replace <span class=\"hljs-regexp\">/LOC\\(([0-9]*),\\s*([0-9]*)\\)/g</span>, getAddDataToNodeFunctionString(<span class=\"hljs-string\">&#x27;$1&#x27;</span>, <span class=\"hljs-string\">&#x27;$2&#x27;</span>)\n    performActionFunctionString = <span class=\"hljs-string\">&quot;$$ = <span class=\"hljs-subst\">#{getAddDataToNodeFunctionString(<span class=\"hljs-number\">1</span>, patternCount, <span class=\"hljs-keyword\">not</span> returnsLoc)}</span>(<span class=\"hljs-subst\">#{action}</span>);&quot;</span>\n  <span class=\"hljs-keyword\">else</span>\n    performActionFunctionString = <span class=\"hljs-string\">&#x27;$$ = $1;&#x27;</span>\n\n  [patternString, performActionFunctionString, options]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-13\">&#x00a7;</a>\n              </div>\n              <h2 id=\"grammatical-rules\">Grammatical Rules</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-14\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-15\">&#x00a7;</a>\n              </div>\n              <p>In all of the rules that follow, you’ll see the name of the nonterminal as\nthe key to a list of alternative matches. With each match’s action, the\ndollar-sign variables are provided by Jison as references to the value of\ntheir numeric position, so in this rule:</p>\n<pre><code><span class=\"hljs-string\">&#x27;Expression UNLESS Expression&#x27;</span>\n</code></pre>\n<p><code>$1</code> would be the value of the first <code>Expression</code>, <code>$2</code> would be the token\nfor the <code>UNLESS</code> terminal, and <code>$3</code> would be the value of the second\n<code>Expression</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>grammar =</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-16\">&#x00a7;</a>\n              </div>\n              <p>The <strong>Root</strong> is the top-level node in the syntax tree. Since we parse bottom-up,\nall parsing must end here.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Root: [\n    o <span class=\"hljs-string\">&#x27;&#x27;</span>,                                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Root <span class=\"hljs-keyword\">new</span> Block\n    o <span class=\"hljs-string\">&#x27;Body&#x27;</span>,                                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Root $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-17\">&#x00a7;</a>\n              </div>\n              <p>Any list of statements and expressions, separated by line breaks or semicolons.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Body: [\n    o <span class=\"hljs-string\">&#x27;Line&#x27;</span>,                                   <span class=\"hljs-function\">-&gt;</span> Block.wrap [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">&#x27;Body TERMINATOR Line&#x27;</span>,                   <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>push $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;Body TERMINATOR&#x27;</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-18\">&#x00a7;</a>\n              </div>\n              <p>Block and statements, which make up a line in a body. FuncDirective is a\nstatement, but not included in Statement because that results in an ambiguous\ngrammar.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Line: [\n    o <span class=\"hljs-string\">&#x27;Expression&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;ExpressionLine&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Statement&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;FuncDirective&#x27;</span>\n  ]\n\n  FuncDirective: [\n    o <span class=\"hljs-string\">&#x27;YieldReturn&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;AwaitReturn&#x27;</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-19\">&#x00a7;</a>\n              </div>\n              <p>Pure statements which cannot be expressions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Statement: [\n    o <span class=\"hljs-string\">&#x27;Return&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;STATEMENT&#x27;</span>,                              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> StatementLiteral $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;Import&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Export&#x27;</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-20\">&#x00a7;</a>\n              </div>\n              <p>All the different types of expressions in our language. The basic unit of\nCoffeeScript is the <strong>Expression</strong> – everything that can be an expression\nis one. Blocks serve as the building blocks of many other rules, making\nthem somewhat circular.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Expression: [\n    o <span class=\"hljs-string\">&#x27;Value&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Code&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Operation&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Assign&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;If&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Try&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;While&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;For&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Switch&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Class&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Throw&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Yield&#x27;</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-21\">&#x00a7;</a>\n              </div>\n              <p>Expressions which are written in single line and would otherwise require being\nwrapped in braces: E.g <code>a = b if do -&gt; f a is 1</code>, <code>if f (a) -&gt; a*2 then ...</code>,\n<code>for x in do (obj) -&gt; f obj when x &gt; 8 then f x</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ExpressionLine: [\n    o <span class=\"hljs-string\">&#x27;CodeLine&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;IfLine&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;OperationLine&#x27;</span>\n  ]\n\n  Yield: [\n    o <span class=\"hljs-string\">&#x27;YIELD&#x27;</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span>, <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">&#x27;&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;YIELD Expression&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;YIELD INDENT Object OUTDENT&#x27;</span>,            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;YIELD FROM Expression&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1.</span>concat($<span class=\"hljs-number\">2</span>), $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-22\">&#x00a7;</a>\n              </div>\n              <p>An indented block of expressions. Note that the <a href=\"rewriter.html\">Rewriter</a>\nwill convert some postfix forms into blocks for us, by adjusting the\ntoken stream.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Block: [\n    o <span class=\"hljs-string\">&#x27;INDENT OUTDENT&#x27;</span>,                         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Block\n    o <span class=\"hljs-string\">&#x27;INDENT Body OUTDENT&#x27;</span>,                    <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2</span>\n  ]\n\n  Identifier: [\n    o <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> IdentifierLiteral $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;JSX_TAG&#x27;</span>,                                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> JSXTag $<span class=\"hljs-number\">1.</span>toString(),\n                                                     tagNameLocationData:                  $<span class=\"hljs-number\">1.</span>tagNameToken[<span class=\"hljs-number\">2</span>]\n                                                     closingTagOpeningBracketLocationData: $<span class=\"hljs-number\">1.</span>closingTagOpeningBracketToken?[<span class=\"hljs-number\">2</span>]\n                                                     closingTagSlashLocationData:          $<span class=\"hljs-number\">1.</span>closingTagSlashToken?[<span class=\"hljs-number\">2</span>]\n                                                     closingTagNameLocationData:           $<span class=\"hljs-number\">1.</span>closingTagNameToken?[<span class=\"hljs-number\">2</span>]\n                                                     closingTagClosingBracketLocationData: $<span class=\"hljs-number\">1.</span>closingTagClosingBracketToken?[<span class=\"hljs-number\">2</span>]\n  ]\n\n  Property: [\n    o <span class=\"hljs-string\">&#x27;PROPERTY&#x27;</span>,                               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> PropertyName $<span class=\"hljs-number\">1.</span>toString()\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-23\">&#x00a7;</a>\n              </div>\n              <p>Alphanumerics are separated from the other <strong>Literal</strong> matchers because\nthey can also serve as keys in object literals.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  AlphaNumeric: [\n    o <span class=\"hljs-string\">&#x27;NUMBER&#x27;</span>,                                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> NumberLiteral $<span class=\"hljs-number\">1.</span>toString(), parsedValue: $<span class=\"hljs-number\">1.</span>parsedValue\n    o <span class=\"hljs-string\">&#x27;String&#x27;</span>\n  ]\n\n  String: [\n    o <span class=\"hljs-string\">&#x27;STRING&#x27;</span>, <span class=\"hljs-function\">-&gt;</span>\n      <span class=\"hljs-keyword\">new</span> StringLiteral(\n        $<span class=\"hljs-number\">1.</span>slice <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">-1</span> <span class=\"hljs-comment\"># strip artificial quotes and unwrap to primitive string</span>\n        quote:        $<span class=\"hljs-number\">1.</span>quote\n        initialChunk: $<span class=\"hljs-number\">1.</span>initialChunk\n        finalChunk:   $<span class=\"hljs-number\">1.</span>finalChunk\n        indent:       $<span class=\"hljs-number\">1.</span>indent\n        double:       $<span class=\"hljs-number\">1.</span>double\n        heregex:      $<span class=\"hljs-number\">1.</span>heregex\n      )\n    o <span class=\"hljs-string\">&#x27;STRING_START Interpolations STRING_END&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> StringWithInterpolations Block.wrap($<span class=\"hljs-number\">2</span>), quote: $<span class=\"hljs-number\">1.</span>quote, startQuote: LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">1.</span>toString())\n  ]\n\n  Interpolations: [\n    o <span class=\"hljs-string\">&#x27;InterpolationChunk&#x27;</span>,                     <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">&#x27;Interpolations InterpolationChunk&#x27;</span>,      <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">2</span>\n  ]\n\n  InterpolationChunk: [\n    o <span class=\"hljs-string\">&#x27;INTERPOLATION_START Body INTERPOLATION_END&#x27;</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Interpolation $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;INTERPOLATION_START INDENT Body OUTDENT INTERPOLATION_END&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Interpolation $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;INTERPOLATION_START INTERPOLATION_END&#x27;</span>,                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Interpolation\n    o <span class=\"hljs-string\">&#x27;String&#x27;</span>,                                                    <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-24\">&#x00a7;</a>\n              </div>\n              <p>The .toString() calls here and elsewhere are to convert <code>String</code> objects\nback to primitive strings now that we’ve retrieved stowaway extra properties</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Regex: [\n    o <span class=\"hljs-string\">&#x27;REGEX&#x27;</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> RegexLiteral $<span class=\"hljs-number\">1.</span>toString(), delimiter: $<span class=\"hljs-number\">1.</span>delimiter, heregexCommentTokens: $<span class=\"hljs-number\">1.</span>heregexCommentTokens\n    o <span class=\"hljs-string\">&#x27;REGEX_START Invocation REGEX_END&#x27;</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> RegexWithInterpolations $<span class=\"hljs-number\">2</span>, heregexCommentTokens: $<span class=\"hljs-number\">3.</span>heregexCommentTokens\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-25\">&#x00a7;</a>\n              </div>\n              <p>All of our immediate values. Generally these can be passed straight\nthrough and printed to JavaScript.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Literal: [\n    o <span class=\"hljs-string\">&#x27;AlphaNumeric&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;JS&#x27;</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> PassthroughLiteral $<span class=\"hljs-number\">1.</span>toString(), here: $<span class=\"hljs-number\">1.</span>here, generated: $<span class=\"hljs-number\">1.</span>generated\n    o <span class=\"hljs-string\">&#x27;Regex&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;UNDEFINED&#x27;</span>,                              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> UndefinedLiteral $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;NULL&#x27;</span>,                                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> NullLiteral $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;BOOL&#x27;</span>,                                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> BooleanLiteral $<span class=\"hljs-number\">1.</span>toString(), originalValue: $<span class=\"hljs-number\">1.</span>original\n    o <span class=\"hljs-string\">&#x27;INFINITY&#x27;</span>,                               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> InfinityLiteral $<span class=\"hljs-number\">1.</span>toString(), originalValue: $<span class=\"hljs-number\">1.</span>original\n    o <span class=\"hljs-string\">&#x27;NAN&#x27;</span>,                                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> NaNLiteral $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-26\">&#x00a7;</a>\n              </div>\n              <p>Assignment of a variable, property, or index to a value.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Assign: [\n    o <span class=\"hljs-string\">&#x27;Assignable = Expression&#x27;</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;Assignable = TERMINATOR Expression&#x27;</span>,     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;Assignable = INDENT Expression OUTDENT&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">4</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-27\">&#x00a7;</a>\n              </div>\n              <p>Assignment when it happens within an object literal. The difference from\nthe ordinary <strong>Assign</strong> is that these allow numbers and strings as keys.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  AssignObj: [\n    o <span class=\"hljs-string\">&#x27;ObjAssignable&#x27;</span>,                          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;ObjRestValue&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;ObjAssignable : Expression&#x27;</span>,             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>), $<span class=\"hljs-number\">3</span>, <span class=\"hljs-string\">&#x27;object&#x27;</span>,\n                                                              operatorToken: LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">2</span>)\n    o <span class=\"hljs-string\">&#x27;ObjAssignable :\n       INDENT Expression OUTDENT&#x27;</span>,              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>), $<span class=\"hljs-number\">4</span>, <span class=\"hljs-string\">&#x27;object&#x27;</span>,\n                                                              operatorToken: LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">2</span>)\n    o <span class=\"hljs-string\">&#x27;SimpleObjAssignable = Expression&#x27;</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>), $<span class=\"hljs-number\">3</span>, <span class=\"hljs-literal\">null</span>,\n                                                              operatorToken: LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">2</span>)\n    o <span class=\"hljs-string\">&#x27;SimpleObjAssignable =\n       INDENT Expression OUTDENT&#x27;</span>,              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>), $<span class=\"hljs-number\">4</span>, <span class=\"hljs-literal\">null</span>,\n                                                              operatorToken: LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">2</span>)\n  ]\n\n  SimpleObjAssignable: [\n    o <span class=\"hljs-string\">&#x27;Identifier&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Property&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;ThisProperty&#x27;</span>\n  ]\n\n  ObjAssignable: [\n    o <span class=\"hljs-string\">&#x27;SimpleObjAssignable&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;[ Expression ]&#x27;</span>,          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> ComputedPropertyName $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;@ [ Expression ]&#x27;</span>,        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> ThisLiteral $<span class=\"hljs-number\">1</span>), [LOC(<span class=\"hljs-number\">3</span>)(<span class=\"hljs-keyword\">new</span> ComputedPropertyName($<span class=\"hljs-number\">3</span>))], <span class=\"hljs-string\">&#x27;this&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;AlphaNumeric&#x27;</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-28\">&#x00a7;</a>\n              </div>\n              <p>Object literal spread properties.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ObjRestValue: [\n    o <span class=\"hljs-string\">&#x27;SimpleObjAssignable ...&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Splat <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;... SimpleObjAssignable&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Splat <span class=\"hljs-keyword\">new</span> Value($<span class=\"hljs-number\">2</span>), postfix: <span class=\"hljs-literal\">no</span>\n    o <span class=\"hljs-string\">&#x27;ObjSpreadExpr ...&#x27;</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Splat $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;... ObjSpreadExpr&#x27;</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Splat $<span class=\"hljs-number\">2</span>, postfix: <span class=\"hljs-literal\">no</span>\n  ]\n\n  ObjSpreadExpr: [\n    o <span class=\"hljs-string\">&#x27;ObjSpreadIdentifier&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Object&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Parenthetical&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Super&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;This&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;SUPER OptFuncExist Arguments&#x27;</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> SuperCall LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Super), $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">2.</span>soak, $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;DYNAMIC_IMPORT Arguments&#x27;</span>,                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> DynamicImportCall LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> DynamicImport), $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;SimpleObjAssignable OptFuncExist Arguments&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Call (<span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>), $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">2.</span>soak\n    o <span class=\"hljs-string\">&#x27;ObjSpreadExpr OptFuncExist Arguments&#x27;</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Call $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">2.</span>soak\n  ]\n\n  ObjSpreadIdentifier: [\n    o <span class=\"hljs-string\">&#x27;SimpleObjAssignable Accessor&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> (<span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>).add $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;ObjSpreadExpr Accessor&#x27;</span>,       <span class=\"hljs-function\">-&gt;</span> (<span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>).add $<span class=\"hljs-number\">2</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-29\">&#x00a7;</a>\n              </div>\n              <p>A return statement from a function body.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Return: [\n    o <span class=\"hljs-string\">&#x27;RETURN Expression&#x27;</span>,                      <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Return $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;RETURN INDENT Object OUTDENT&#x27;</span>,           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Return <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;RETURN&#x27;</span>,                                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Return\n  ]\n\n  YieldReturn: [\n    o <span class=\"hljs-string\">&#x27;YIELD RETURN Expression&#x27;</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> YieldReturn $<span class=\"hljs-number\">3</span>,   returnKeyword: LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">2</span>)\n    o <span class=\"hljs-string\">&#x27;YIELD RETURN&#x27;</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> YieldReturn <span class=\"hljs-literal\">null</span>, returnKeyword: LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">2</span>)\n  ]\n\n  AwaitReturn: [\n    o <span class=\"hljs-string\">&#x27;AWAIT RETURN Expression&#x27;</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> AwaitReturn $<span class=\"hljs-number\">3</span>,   returnKeyword: LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">2</span>)\n    o <span class=\"hljs-string\">&#x27;AWAIT RETURN&#x27;</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> AwaitReturn <span class=\"hljs-literal\">null</span>, returnKeyword: LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">2</span>)\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-30\">&#x00a7;</a>\n              </div>\n              <p>The <strong>Code</strong> node is the function literal. It’s defined by an indented block\nof <strong>Block</strong> preceded by a function arrow, with an optional parameter list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Code: [\n    o <span class=\"hljs-string\">&#x27;PARAM_START ParamList PARAM_END FuncGlyph Block&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Code $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">5</span>, $<span class=\"hljs-number\">4</span>, LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">1</span>)\n    o <span class=\"hljs-string\">&#x27;FuncGlyph Block&#x27;</span>,                                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Code [], $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-31\">&#x00a7;</a>\n              </div>\n              <p>The Codeline is the <strong>Code</strong> node with <strong>Line</strong> instead of indented <strong>Block</strong>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  CodeLine: [\n    o <span class=\"hljs-string\">&#x27;PARAM_START ParamList PARAM_END FuncGlyph Line&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Code $<span class=\"hljs-number\">2</span>, LOC(<span class=\"hljs-number\">5</span>)(Block.wrap [$<span class=\"hljs-number\">5</span>]), $<span class=\"hljs-number\">4</span>,\n                                                              LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">1</span>)\n    o <span class=\"hljs-string\">&#x27;FuncGlyph Line&#x27;</span>,                                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Code [], LOC(<span class=\"hljs-number\">2</span>)(Block.wrap [$<span class=\"hljs-number\">2</span>]), $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-32\">&#x00a7;</a>\n              </div>\n              <p>CoffeeScript has two different symbols for functions. <code>-&gt;</code> is for ordinary\nfunctions, and <code>=&gt;</code> is for functions bound to the current value of <em>this</em>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  FuncGlyph: [\n    o <span class=\"hljs-string\">&#x27;-&gt;&#x27;</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> FuncGlyph $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;=&gt;&#x27;</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> FuncGlyph $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-33\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-33\">&#x00a7;</a>\n              </div>\n              <p>An optional, trailing comma.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  OptComma: [\n    o <span class=\"hljs-string\">&#x27;&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;,&#x27;</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-34\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-34\">&#x00a7;</a>\n              </div>\n              <p>The list of parameters that a function accepts can be of any length.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ParamList: [\n    o <span class=\"hljs-string\">&#x27;&#x27;</span>,                                       <span class=\"hljs-function\">-&gt;</span> []\n    o <span class=\"hljs-string\">&#x27;Param&#x27;</span>,                                  <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">&#x27;ParamList , Param&#x27;</span>,                      <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;ParamList OptComma TERMINATOR Param&#x27;</span>,    <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;ParamList OptComma INDENT ParamList OptComma OUTDENT&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-35\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-35\">&#x00a7;</a>\n              </div>\n              <p>A single parameter in a function definition can be ordinary, or a splat\nthat hoovers up the remaining arguments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Param: [\n    o <span class=\"hljs-string\">&#x27;ParamVar&#x27;</span>,                               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Param $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;ParamVar ...&#x27;</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Param $<span class=\"hljs-number\">1</span>, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">on</span>\n    o <span class=\"hljs-string\">&#x27;... ParamVar&#x27;</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Param $<span class=\"hljs-number\">2</span>, <span class=\"hljs-literal\">null</span>, postfix: <span class=\"hljs-literal\">no</span>\n    o <span class=\"hljs-string\">&#x27;ParamVar = Expression&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Param $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;...&#x27;</span>,                                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Expansion\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-36\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-36\">&#x00a7;</a>\n              </div>\n              <p>Function Parameters</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ParamVar: [\n    o <span class=\"hljs-string\">&#x27;Identifier&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;ThisProperty&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Array&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Object&#x27;</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-37\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-37\">&#x00a7;</a>\n              </div>\n              <p>A splat that occurs outside of a parameter list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Splat: [\n    o <span class=\"hljs-string\">&#x27;Expression ...&#x27;</span>,                         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Splat $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;... Expression&#x27;</span>,                         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Splat $<span class=\"hljs-number\">2</span>, {postfix: <span class=\"hljs-literal\">no</span>}\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-38\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-38\">&#x00a7;</a>\n              </div>\n              <p>Variables and properties that can be assigned to.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  SimpleAssignable: [\n    o <span class=\"hljs-string\">&#x27;Identifier&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;Value Accessor&#x27;</span>,                         <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>add $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;Code Accessor&#x27;</span>,                          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value($<span class=\"hljs-number\">1</span>).add $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;ThisProperty&#x27;</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-39\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-39\">&#x00a7;</a>\n              </div>\n              <p>Everything that can be assigned to.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Assignable: [\n    o <span class=\"hljs-string\">&#x27;SimpleAssignable&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Array&#x27;</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;Object&#x27;</span>,                                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-40\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-40\">&#x00a7;</a>\n              </div>\n              <p>The types of things that can be treated as values – assigned to, invoked\nas functions, indexed into, named as a class, etc.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Value: [\n    o <span class=\"hljs-string\">&#x27;Assignable&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Literal&#x27;</span>,                                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;Parenthetical&#x27;</span>,                          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;Range&#x27;</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;Invocation&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;DoIife&#x27;</span>,                                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;This&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Super&#x27;</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;MetaProperty&#x27;</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-41\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-41\">&#x00a7;</a>\n              </div>\n              <p>A <code>super</code>-based expression that can be used as a value.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Super: [\n    o <span class=\"hljs-string\">&#x27;SUPER . Property&#x27;</span>,                                      <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Super LOC(<span class=\"hljs-number\">3</span>)(<span class=\"hljs-keyword\">new</span> Access $<span class=\"hljs-number\">3</span>), LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">1</span>)\n    o <span class=\"hljs-string\">&#x27;SUPER INDEX_START Expression INDEX_END&#x27;</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Super LOC(<span class=\"hljs-number\">3</span>)(<span class=\"hljs-keyword\">new</span> Index $<span class=\"hljs-number\">3</span>),  LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">1</span>)\n    o <span class=\"hljs-string\">&#x27;SUPER INDEX_START INDENT Expression OUTDENT INDEX_END&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Super LOC(<span class=\"hljs-number\">4</span>)(<span class=\"hljs-keyword\">new</span> Index $<span class=\"hljs-number\">4</span>),  LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">1</span>)\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-42\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-42\">&#x00a7;</a>\n              </div>\n              <p>A “meta-property” access e.g. <code>new.target</code> or <code>import.meta</code>, where\nsomething that looks like a property is referenced on a keyword.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  MetaProperty: [\n    o <span class=\"hljs-string\">&#x27;NEW_TARGET . Property&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> MetaProperty LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> IdentifierLiteral $<span class=\"hljs-number\">1</span>), LOC(<span class=\"hljs-number\">3</span>)(<span class=\"hljs-keyword\">new</span> Access $<span class=\"hljs-number\">3</span>)\n    o <span class=\"hljs-string\">&#x27;IMPORT_META . Property&#x27;</span>,                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> MetaProperty LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> IdentifierLiteral $<span class=\"hljs-number\">1</span>), LOC(<span class=\"hljs-number\">3</span>)(<span class=\"hljs-keyword\">new</span> Access $<span class=\"hljs-number\">3</span>)\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-43\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-43\">&#x00a7;</a>\n              </div>\n              <p>The general group of accessors into an object, by property, by prototype\nor by array index or slice.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Accessor: [\n    o <span class=\"hljs-string\">&#x27;.  Property&#x27;</span>,                            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Access $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;?. Property&#x27;</span>,                            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Access $<span class=\"hljs-number\">2</span>, soak: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">&#x27;:: Property&#x27;</span>,                            <span class=\"hljs-function\">-&gt;</span> [LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName(<span class=\"hljs-string\">&#x27;prototype&#x27;</span>), shorthand: <span class=\"hljs-literal\">yes</span>), LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Access $<span class=\"hljs-number\">2</span>)]\n    o <span class=\"hljs-string\">&#x27;?:: Property&#x27;</span>,                           <span class=\"hljs-function\">-&gt;</span> [LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName(<span class=\"hljs-string\">&#x27;prototype&#x27;</span>), shorthand: <span class=\"hljs-literal\">yes</span>, soak: <span class=\"hljs-literal\">yes</span>), LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Access $<span class=\"hljs-number\">2</span>)]\n    o <span class=\"hljs-string\">&#x27;::&#x27;</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName(<span class=\"hljs-string\">&#x27;prototype&#x27;</span>), shorthand: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">&#x27;?::&#x27;</span>,                                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName(<span class=\"hljs-string\">&#x27;prototype&#x27;</span>), shorthand: <span class=\"hljs-literal\">yes</span>, soak: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">&#x27;Index&#x27;</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-44\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-44\">&#x00a7;</a>\n              </div>\n              <p>Indexing into an object or array using bracket notation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Index: [\n    o <span class=\"hljs-string\">&#x27;INDEX_START IndexValue INDEX_END&#x27;</span>,                <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;INDEX_START INDENT IndexValue OUTDENT INDEX_END&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;INDEX_SOAK  Index&#x27;</span>,                               <span class=\"hljs-function\">-&gt;</span> extend $<span class=\"hljs-number\">2</span>, soak: <span class=\"hljs-literal\">yes</span>\n  ]\n\n  IndexValue: [\n    o <span class=\"hljs-string\">&#x27;Expression&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Index $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;Slice&#x27;</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Slice $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-45\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-45\">&#x00a7;</a>\n              </div>\n              <p>In CoffeeScript, an object literal is simply a list of assignments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Object: [\n    o <span class=\"hljs-string\">&#x27;{ AssignList OptComma }&#x27;</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Obj $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1.</span>generated\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-46\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-46\">&#x00a7;</a>\n              </div>\n              <p>Assignment of properties within an object literal can be separated by\ncomma, as in JavaScript, or simply by newline.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  AssignList: [\n    o <span class=\"hljs-string\">&#x27;&#x27;</span>,                                                       <span class=\"hljs-function\">-&gt;</span> []\n    o <span class=\"hljs-string\">&#x27;AssignObj&#x27;</span>,                                              <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">&#x27;AssignList , AssignObj&#x27;</span>,                                 <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;AssignList OptComma TERMINATOR AssignObj&#x27;</span>,               <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;AssignList OptComma INDENT AssignList OptComma OUTDENT&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-47\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-47\">&#x00a7;</a>\n              </div>\n              <p>Class definitions have optional bodies of prototype property assignments,\nand optional references to the superclass.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Class: [\n    o <span class=\"hljs-string\">&#x27;CLASS&#x27;</span>,                                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class\n    o <span class=\"hljs-string\">&#x27;CLASS Block&#x27;</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;CLASS EXTENDS Expression&#x27;</span>,                        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;CLASS EXTENDS Expression Block&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;CLASS SimpleAssignable&#x27;</span>,                          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;CLASS SimpleAssignable Block&#x27;</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class $<span class=\"hljs-number\">2</span>, <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;CLASS SimpleAssignable EXTENDS Expression&#x27;</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;CLASS SimpleAssignable EXTENDS Expression Block&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Class $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">5</span>\n  ]\n\n  Import: [\n    o <span class=\"hljs-string\">&#x27;IMPORT String&#x27;</span>,                                                                              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;IMPORT String ASSERT Object&#x27;</span>,                                                                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;IMPORT ImportDefaultSpecifier FROM String&#x27;</span>,                                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause($<span class=\"hljs-number\">2</span>, <span class=\"hljs-literal\">null</span>), $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;IMPORT ImportDefaultSpecifier FROM String ASSERT Object&#x27;</span>,                                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause($<span class=\"hljs-number\">2</span>, <span class=\"hljs-literal\">null</span>), $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;IMPORT ImportNamespaceSpecifier FROM String&#x27;</span>,                                                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause(<span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">2</span>), $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;IMPORT ImportNamespaceSpecifier FROM String ASSERT Object&#x27;</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause(<span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">2</span>), $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;IMPORT { } FROM String&#x27;</span>,                                                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause(<span class=\"hljs-literal\">null</span>, <span class=\"hljs-keyword\">new</span> ImportSpecifierList []), $<span class=\"hljs-number\">5</span>\n    o <span class=\"hljs-string\">&#x27;IMPORT { } FROM String ASSERT Object&#x27;</span>,                                                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause(<span class=\"hljs-literal\">null</span>, <span class=\"hljs-keyword\">new</span> ImportSpecifierList []), $<span class=\"hljs-number\">5</span>, $<span class=\"hljs-number\">7</span>\n    o <span class=\"hljs-string\">&#x27;IMPORT { ImportSpecifierList OptComma } FROM String&#x27;</span>,                                        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause(<span class=\"hljs-literal\">null</span>, <span class=\"hljs-keyword\">new</span> ImportSpecifierList $<span class=\"hljs-number\">3</span>), $<span class=\"hljs-number\">7</span>\n    o <span class=\"hljs-string\">&#x27;IMPORT { ImportSpecifierList OptComma } FROM String ASSERT Object&#x27;</span>,                          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause(<span class=\"hljs-literal\">null</span>, <span class=\"hljs-keyword\">new</span> ImportSpecifierList $<span class=\"hljs-number\">3</span>), $<span class=\"hljs-number\">7</span>, $<span class=\"hljs-number\">9</span>\n    o <span class=\"hljs-string\">&#x27;IMPORT ImportDefaultSpecifier , ImportNamespaceSpecifier FROM String&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause($<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>), $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;IMPORT ImportDefaultSpecifier , ImportNamespaceSpecifier FROM String ASSERT Object&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause($<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>), $<span class=\"hljs-number\">6</span>, $<span class=\"hljs-number\">8</span>\n    o <span class=\"hljs-string\">&#x27;IMPORT ImportDefaultSpecifier , { ImportSpecifierList OptComma } FROM String&#x27;</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause($<span class=\"hljs-number\">2</span>, <span class=\"hljs-keyword\">new</span> ImportSpecifierList $<span class=\"hljs-number\">5</span>), $<span class=\"hljs-number\">9</span>\n    o <span class=\"hljs-string\">&#x27;IMPORT ImportDefaultSpecifier , { ImportSpecifierList OptComma } FROM String ASSERT Object&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDeclaration <span class=\"hljs-keyword\">new</span> ImportClause($<span class=\"hljs-number\">2</span>, <span class=\"hljs-keyword\">new</span> ImportSpecifierList $<span class=\"hljs-number\">5</span>), $<span class=\"hljs-number\">9</span>, $<span class=\"hljs-number\">11</span>\n  ]\n\n  ImportSpecifierList: [\n    o <span class=\"hljs-string\">&#x27;ImportSpecifier&#x27;</span>,                                                          <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">&#x27;ImportSpecifierList , ImportSpecifier&#x27;</span>,                                    <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;ImportSpecifierList OptComma TERMINATOR ImportSpecifier&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;INDENT ImportSpecifierList OptComma OUTDENT&#x27;</span>,                              <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;ImportSpecifierList OptComma INDENT ImportSpecifierList OptComma OUTDENT&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n  ]\n\n  ImportSpecifier: [\n    o <span class=\"hljs-string\">&#x27;Identifier&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportSpecifier $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;Identifier AS Identifier&#x27;</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportSpecifier $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;DEFAULT&#x27;</span>,                                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportSpecifier LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> DefaultLiteral $<span class=\"hljs-number\">1</span>)\n    o <span class=\"hljs-string\">&#x27;DEFAULT AS Identifier&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportSpecifier LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> DefaultLiteral($<span class=\"hljs-number\">1</span>)), $<span class=\"hljs-number\">3</span>\n  ]\n\n  ImportDefaultSpecifier: [\n    o <span class=\"hljs-string\">&#x27;Identifier&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportDefaultSpecifier $<span class=\"hljs-number\">1</span>\n  ]\n\n  ImportNamespaceSpecifier: [\n    o <span class=\"hljs-string\">&#x27;IMPORT_ALL AS Identifier&#x27;</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ImportNamespaceSpecifier <span class=\"hljs-keyword\">new</span> Literal($<span class=\"hljs-number\">1</span>), $<span class=\"hljs-number\">3</span>\n  ]\n\n  Export: [\n    o <span class=\"hljs-string\">&#x27;EXPORT { }&#x27;</span>,                                                        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration <span class=\"hljs-keyword\">new</span> ExportSpecifierList []\n    o <span class=\"hljs-string\">&#x27;EXPORT { ExportSpecifierList OptComma }&#x27;</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration <span class=\"hljs-keyword\">new</span> ExportSpecifierList $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;EXPORT Class&#x27;</span>,                                                      <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;EXPORT Identifier = Expression&#x27;</span>,                                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration LOC(<span class=\"hljs-number\">2</span>,<span class=\"hljs-number\">4</span>)(<span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>, <span class=\"hljs-literal\">null</span>,\n                                                                                                      moduleDeclaration: <span class=\"hljs-string\">&#x27;export&#x27;</span>)\n    o <span class=\"hljs-string\">&#x27;EXPORT Identifier = TERMINATOR Expression&#x27;</span>,                         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration LOC(<span class=\"hljs-number\">2</span>,<span class=\"hljs-number\">5</span>)(<span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">5</span>, <span class=\"hljs-literal\">null</span>,\n                                                                                                      moduleDeclaration: <span class=\"hljs-string\">&#x27;export&#x27;</span>)\n    o <span class=\"hljs-string\">&#x27;EXPORT Identifier = INDENT Expression OUTDENT&#x27;</span>,                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration LOC(<span class=\"hljs-number\">2</span>,<span class=\"hljs-number\">6</span>)(<span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">5</span>, <span class=\"hljs-literal\">null</span>,\n                                                                                                      moduleDeclaration: <span class=\"hljs-string\">&#x27;export&#x27;</span>)\n    o <span class=\"hljs-string\">&#x27;EXPORT DEFAULT Expression&#x27;</span>,                                         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportDefaultDeclaration $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;EXPORT DEFAULT INDENT Object OUTDENT&#x27;</span>,                              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportDefaultDeclaration <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;EXPORT EXPORT_ALL FROM String&#x27;</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportAllDeclaration <span class=\"hljs-keyword\">new</span> Literal($<span class=\"hljs-number\">2</span>), $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;EXPORT EXPORT_ALL FROM String ASSERT Object&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportAllDeclaration <span class=\"hljs-keyword\">new</span> Literal($<span class=\"hljs-number\">2</span>), $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;EXPORT { } FROM String&#x27;</span>,                                            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration <span class=\"hljs-keyword\">new</span> ExportSpecifierList([]), $<span class=\"hljs-number\">5</span>\n    o <span class=\"hljs-string\">&#x27;EXPORT { } FROM String ASSERT Object&#x27;</span>,                              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration <span class=\"hljs-keyword\">new</span> ExportSpecifierList([]), $<span class=\"hljs-number\">5</span>, $<span class=\"hljs-number\">7</span>\n    o <span class=\"hljs-string\">&#x27;EXPORT { ExportSpecifierList OptComma } FROM String&#x27;</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration <span class=\"hljs-keyword\">new</span> ExportSpecifierList($<span class=\"hljs-number\">3</span>), $<span class=\"hljs-number\">7</span>\n    o <span class=\"hljs-string\">&#x27;EXPORT { ExportSpecifierList OptComma } FROM String ASSERT Object&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportNamedDeclaration <span class=\"hljs-keyword\">new</span> ExportSpecifierList($<span class=\"hljs-number\">3</span>), $<span class=\"hljs-number\">7</span>, $<span class=\"hljs-number\">9</span>\n  ]\n\n  ExportSpecifierList: [\n    o <span class=\"hljs-string\">&#x27;ExportSpecifier&#x27;</span>,                                                          <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">&#x27;ExportSpecifierList , ExportSpecifier&#x27;</span>,                                    <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;ExportSpecifierList OptComma TERMINATOR ExportSpecifier&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;INDENT ExportSpecifierList OptComma OUTDENT&#x27;</span>,                              <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;ExportSpecifierList OptComma INDENT ExportSpecifierList OptComma OUTDENT&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n  ]\n\n  ExportSpecifier: [\n    o <span class=\"hljs-string\">&#x27;Identifier&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportSpecifier $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;Identifier AS Identifier&#x27;</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportSpecifier $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;Identifier AS DEFAULT&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportSpecifier $<span class=\"hljs-number\">1</span>, LOC(<span class=\"hljs-number\">3</span>)(<span class=\"hljs-keyword\">new</span> DefaultLiteral $<span class=\"hljs-number\">3</span>)\n    o <span class=\"hljs-string\">&#x27;DEFAULT&#x27;</span>,                                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportSpecifier LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> DefaultLiteral $<span class=\"hljs-number\">1</span>)\n    o <span class=\"hljs-string\">&#x27;DEFAULT AS Identifier&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> ExportSpecifier LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> DefaultLiteral($<span class=\"hljs-number\">1</span>)), $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-48\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-48\">&#x00a7;</a>\n              </div>\n              <p>Ordinary function invocation, or a chained series of calls.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Invocation: [\n    o <span class=\"hljs-string\">&#x27;Value OptFuncExist String&#x27;</span>,              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> TaggedTemplateCall $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">2.</span>soak\n    o <span class=\"hljs-string\">&#x27;Value OptFuncExist Arguments&#x27;</span>,           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Call $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">2.</span>soak\n    o <span class=\"hljs-string\">&#x27;SUPER OptFuncExist Arguments&#x27;</span>,           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> SuperCall LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> Super), $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">2.</span>soak, $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;DYNAMIC_IMPORT Arguments&#x27;</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> DynamicImportCall LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> DynamicImport), $<span class=\"hljs-number\">2</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-49\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-49\">&#x00a7;</a>\n              </div>\n              <p>An optional existence check on a function.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  OptFuncExist: [\n    o <span class=\"hljs-string\">&#x27;&#x27;</span>,                                       <span class=\"hljs-function\">-&gt;</span> soak: <span class=\"hljs-literal\">no</span>\n    o <span class=\"hljs-string\">&#x27;FUNC_EXIST&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> soak: <span class=\"hljs-literal\">yes</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-50\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-50\">&#x00a7;</a>\n              </div>\n              <p>The list of arguments to a function call.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Arguments: [\n    o <span class=\"hljs-string\">&#x27;CALL_START CALL_END&#x27;</span>,                    <span class=\"hljs-function\">-&gt;</span> []\n    o <span class=\"hljs-string\">&#x27;CALL_START ArgList OptComma CALL_END&#x27;</span>,   <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2.</span>implicit = $<span class=\"hljs-number\">1.</span>generated; $<span class=\"hljs-number\">2</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-51\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-51\">&#x00a7;</a>\n              </div>\n              <p>A reference to the <em>this</em> current object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  This: [\n    o <span class=\"hljs-string\">&#x27;THIS&#x27;</span>,                                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> ThisLiteral $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;@&#x27;</span>,                                      <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> ThisLiteral $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-52\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-52\">&#x00a7;</a>\n              </div>\n              <p>A reference to a property on <em>this</em>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ThisProperty: [\n    o <span class=\"hljs-string\">&#x27;@ Property&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> ThisLiteral $<span class=\"hljs-number\">1</span>), [LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Access($<span class=\"hljs-number\">2</span>))], <span class=\"hljs-string\">&#x27;this&#x27;</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-53\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-53\">&#x00a7;</a>\n              </div>\n              <p>The array literal.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Array: [\n    o <span class=\"hljs-string\">&#x27;[ ]&#x27;</span>,                                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Arr []\n    o <span class=\"hljs-string\">&#x27;[ Elisions ]&#x27;</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Arr $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;[ ArgElisionList OptElisions ]&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Arr [].concat $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-54\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-54\">&#x00a7;</a>\n              </div>\n              <p>Inclusive and exclusive range dots.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  RangeDots: [\n    o <span class=\"hljs-string\">&#x27;..&#x27;</span>,                                     <span class=\"hljs-function\">-&gt;</span> exclusive: <span class=\"hljs-literal\">no</span>\n    o <span class=\"hljs-string\">&#x27;...&#x27;</span>,                                    <span class=\"hljs-function\">-&gt;</span> exclusive: <span class=\"hljs-literal\">yes</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-55\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-55\">&#x00a7;</a>\n              </div>\n              <p>The CoffeeScript range literal.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Range: [\n    o <span class=\"hljs-string\">&#x27;[ Expression RangeDots Expression ]&#x27;</span>,      <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Range $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>, <span class=\"hljs-keyword\">if</span> $<span class=\"hljs-number\">3.</span>exclusive <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;exclusive&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;inclusive&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;[ ExpressionLine RangeDots Expression ]&#x27;</span>,  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Range $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>, <span class=\"hljs-keyword\">if</span> $<span class=\"hljs-number\">3.</span>exclusive <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;exclusive&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;inclusive&#x27;</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-56\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-56\">&#x00a7;</a>\n              </div>\n              <p>Array slice literals.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Slice: [\n    o <span class=\"hljs-string\">&#x27;Expression RangeDots Expression&#x27;</span>,        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Range $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, <span class=\"hljs-keyword\">if</span> $<span class=\"hljs-number\">2.</span>exclusive <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;exclusive&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;inclusive&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Expression RangeDots&#x27;</span>,                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Range $<span class=\"hljs-number\">1</span>, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-keyword\">if</span> $<span class=\"hljs-number\">2.</span>exclusive <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;exclusive&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;inclusive&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;ExpressionLine RangeDots Expression&#x27;</span>,    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Range $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, <span class=\"hljs-keyword\">if</span> $<span class=\"hljs-number\">2.</span>exclusive <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;exclusive&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;inclusive&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;ExpressionLine RangeDots&#x27;</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Range $<span class=\"hljs-number\">1</span>, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-keyword\">if</span> $<span class=\"hljs-number\">2.</span>exclusive <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;exclusive&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;inclusive&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;RangeDots Expression&#x27;</span>,                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Range <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">2</span>, <span class=\"hljs-keyword\">if</span> $<span class=\"hljs-number\">1.</span>exclusive <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;exclusive&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;inclusive&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;RangeDots&#x27;</span>,                              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Range <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-keyword\">if</span> $<span class=\"hljs-number\">1.</span>exclusive <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;exclusive&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;inclusive&#x27;</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-57\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-57\">&#x00a7;</a>\n              </div>\n              <p>The <strong>ArgList</strong> is the list of objects passed into a function call\n(i.e. comma-separated expressions). Newlines work as well.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ArgList: [\n    o <span class=\"hljs-string\">&#x27;Arg&#x27;</span>,                                              <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">&#x27;ArgList , Arg&#x27;</span>,                                    <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;ArgList OptComma TERMINATOR Arg&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;INDENT ArgList OptComma OUTDENT&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;ArgList OptComma INDENT ArgList OptComma OUTDENT&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-58\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-58\">&#x00a7;</a>\n              </div>\n              <p>Valid arguments are Blocks or Splats.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Arg: [\n    o <span class=\"hljs-string\">&#x27;Expression&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;ExpressionLine&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Splat&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;...&#x27;</span>,                                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Expansion\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-59\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-59\">&#x00a7;</a>\n              </div>\n              <p>The <strong>ArgElisionList</strong> is the list of objects, contents of an array literal\n(i.e. comma-separated expressions and elisions). Newlines work as well.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ArgElisionList: [\n    o <span class=\"hljs-string\">&#x27;ArgElision&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;ArgElisionList , ArgElision&#x27;</span>,                                          <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;ArgElisionList OptComma TERMINATOR ArgElision&#x27;</span>,                        <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;INDENT ArgElisionList OptElisions OUTDENT&#x27;</span>,                            <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2.</span>concat $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;ArgElisionList OptElisions INDENT ArgElisionList OptElisions OUTDENT&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">5</span>\n  ]\n\n  ArgElision: [\n    o <span class=\"hljs-string\">&#x27;Arg&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">&#x27;Elisions Arg&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">2</span>\n  ]\n\n  OptElisions: [\n    o <span class=\"hljs-string\">&#x27;OptComma&#x27;</span>,             <span class=\"hljs-function\">-&gt;</span> []\n    o <span class=\"hljs-string\">&#x27;, Elisions&#x27;</span>,           <span class=\"hljs-function\">-&gt;</span> [].concat $<span class=\"hljs-number\">2</span>\n  ]\n\n  Elisions: [\n    o <span class=\"hljs-string\">&#x27;Elision&#x27;</span>,              <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">&#x27;Elisions Elision&#x27;</span>,     <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">2</span>\n  ]\n\n  Elision: [\n    o <span class=\"hljs-string\">&#x27;,&#x27;</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Elision\n    o <span class=\"hljs-string\">&#x27;Elision TERMINATOR&#x27;</span>,   <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-60\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-60\">&#x00a7;</a>\n              </div>\n              <p>Just simple, comma-separated, required arguments (no fancy syntax). We need\nthis to be separate from the <strong>ArgList</strong> for use in <strong>Switch</strong> blocks, where\nhaving the newlines wouldn’t make sense.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  SimpleArgs: [\n    o <span class=\"hljs-string\">&#x27;Expression&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;ExpressionLine&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;SimpleArgs , Expression&#x27;</span>,                <span class=\"hljs-function\">-&gt;</span> [].concat $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;SimpleArgs , ExpressionLine&#x27;</span>,            <span class=\"hljs-function\">-&gt;</span> [].concat $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-61\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-61\">&#x00a7;</a>\n              </div>\n              <p>The variants of <em>try/catch/finally</em> exception handling blocks.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Try: [\n    o <span class=\"hljs-string\">&#x27;TRY Block&#x27;</span>,                              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Try $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;TRY Block Catch&#x27;</span>,                        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Try $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;TRY Block FINALLY Block&#x27;</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Try $<span class=\"hljs-number\">2</span>, <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">4</span>, LOC(<span class=\"hljs-number\">3</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">3</span>)\n    o <span class=\"hljs-string\">&#x27;TRY Block Catch FINALLY Block&#x27;</span>,          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Try $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">5</span>, LOC(<span class=\"hljs-number\">4</span>)(<span class=\"hljs-keyword\">new</span> Literal $<span class=\"hljs-number\">4</span>)\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-62\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-62\">&#x00a7;</a>\n              </div>\n              <p>A catch clause names its error and runs a block of code.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Catch: [\n    o <span class=\"hljs-string\">&#x27;CATCH Identifier Block&#x27;</span>,                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Catch $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;CATCH Object Block&#x27;</span>,                     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Catch $<span class=\"hljs-number\">3</span>, LOC(<span class=\"hljs-number\">2</span>)(<span class=\"hljs-keyword\">new</span> Value($<span class=\"hljs-number\">2</span>))\n    o <span class=\"hljs-string\">&#x27;CATCH Block&#x27;</span>,                            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Catch $<span class=\"hljs-number\">2</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-63\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-63\">&#x00a7;</a>\n              </div>\n              <p>Throw an exception object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Throw: [\n    o <span class=\"hljs-string\">&#x27;THROW Expression&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Throw $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;THROW INDENT Object OUTDENT&#x27;</span>,            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Throw <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-64\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-64\">&#x00a7;</a>\n              </div>\n              <p>Parenthetical expressions. Note that the <strong>Parenthetical</strong> is a <strong>Value</strong>,\nnot an <strong>Expression</strong>, so if you need to use an expression in a place\nwhere only values are accepted, wrapping it in parentheses will always do\nthe trick.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Parenthetical: [\n    o <span class=\"hljs-string\">&#x27;( Body )&#x27;</span>,                               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Parens $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;( INDENT Body OUTDENT )&#x27;</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Parens $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-65\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-65\">&#x00a7;</a>\n              </div>\n              <p>The condition portion of a while loop.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  WhileLineSource: [\n    o <span class=\"hljs-string\">&#x27;WHILE ExpressionLine&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;WHILE ExpressionLine WHEN ExpressionLine&#x27;</span>,   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;UNTIL ExpressionLine&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>, invert: <span class=\"hljs-literal\">true</span>\n    o <span class=\"hljs-string\">&#x27;UNTIL ExpressionLine WHEN ExpressionLine&#x27;</span>,   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>, invert: <span class=\"hljs-literal\">true</span>, guard: $<span class=\"hljs-number\">4</span>\n  ]\n\n  WhileSource: [\n    o <span class=\"hljs-string\">&#x27;WHILE Expression&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;WHILE Expression WHEN Expression&#x27;</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;WHILE ExpressionLine WHEN Expression&#x27;</span>,   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;UNTIL Expression&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>, invert: <span class=\"hljs-literal\">true</span>\n    o <span class=\"hljs-string\">&#x27;UNTIL Expression WHEN Expression&#x27;</span>,       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>, invert: <span class=\"hljs-literal\">true</span>, guard: $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;UNTIL ExpressionLine WHEN Expression&#x27;</span>,   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While $<span class=\"hljs-number\">2</span>, invert: <span class=\"hljs-literal\">true</span>, guard: $<span class=\"hljs-number\">4</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-66\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-66\">&#x00a7;</a>\n              </div>\n              <p>The while loop can either be normal, with a block of expressions to execute,\nor postfix, with a single expression. There is no do..while.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  While: [\n    o <span class=\"hljs-string\">&#x27;WhileSource Block&#x27;</span>,                      <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>addBody $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;WhileLineSource Block&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>addBody $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;Statement  WhileSource&#x27;</span>,                 <span class=\"hljs-function\">-&gt;</span> (<span class=\"hljs-built_in\">Object</span>.assign $<span class=\"hljs-number\">2</span>, postfix: <span class=\"hljs-literal\">yes</span>).addBody LOC(<span class=\"hljs-number\">1</span>) Block.wrap([$<span class=\"hljs-number\">1</span>])\n    o <span class=\"hljs-string\">&#x27;Expression WhileSource&#x27;</span>,                 <span class=\"hljs-function\">-&gt;</span> (<span class=\"hljs-built_in\">Object</span>.assign $<span class=\"hljs-number\">2</span>, postfix: <span class=\"hljs-literal\">yes</span>).addBody LOC(<span class=\"hljs-number\">1</span>) Block.wrap([$<span class=\"hljs-number\">1</span>])\n    o <span class=\"hljs-string\">&#x27;Loop&#x27;</span>,                                   <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1</span>\n  ]\n\n  Loop: [\n    o <span class=\"hljs-string\">&#x27;LOOP Block&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While(LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> BooleanLiteral <span class=\"hljs-string\">&#x27;true&#x27;</span>), isLoop: <span class=\"hljs-literal\">yes</span>).addBody $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;LOOP Expression&#x27;</span>,                        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> While(LOC(<span class=\"hljs-number\">1</span>)(<span class=\"hljs-keyword\">new</span> BooleanLiteral <span class=\"hljs-string\">&#x27;true&#x27;</span>), isLoop: <span class=\"hljs-literal\">yes</span>).addBody LOC(<span class=\"hljs-number\">2</span>) Block.wrap [$<span class=\"hljs-number\">2</span>]\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-67\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-67\">&#x00a7;</a>\n              </div>\n              <p>Array, object, and range comprehensions, at the most generic level.\nComprehensions can either be normal, with a block of expressions to execute,\nor postfix, with a single expression.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  For: [\n    o <span class=\"hljs-string\">&#x27;Statement    ForBody&#x27;</span>,  <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2.</span>postfix = <span class=\"hljs-literal\">yes</span>; $<span class=\"hljs-number\">2.</span>addBody $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;Expression   ForBody&#x27;</span>,  <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">2.</span>postfix = <span class=\"hljs-literal\">yes</span>; $<span class=\"hljs-number\">2.</span>addBody $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;ForBody      Block&#x27;</span>,    <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>addBody $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;ForLineBody  Block&#x27;</span>,    <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>addBody $<span class=\"hljs-number\">2</span>\n  ]\n\n  ForBody: [\n    o <span class=\"hljs-string\">&#x27;FOR Range&#x27;</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> For [], source: (LOC(<span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">new</span> Value($<span class=\"hljs-number\">2</span>))\n    o <span class=\"hljs-string\">&#x27;FOR Range BY Expression&#x27;</span>,  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> For [], source: (LOC(<span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">new</span> Value($<span class=\"hljs-number\">2</span>)), step: $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;ForStart ForSource&#x27;</span>,       <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>addSource $<span class=\"hljs-number\">2</span>\n  ]\n\n  ForLineBody: [\n    o <span class=\"hljs-string\">&#x27;FOR Range BY ExpressionLine&#x27;</span>,  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> For [], source: (LOC(<span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">new</span> Value($<span class=\"hljs-number\">2</span>)), step: $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;ForStart ForLineSource&#x27;</span>,       <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>addSource $<span class=\"hljs-number\">2</span>\n  ]\n\n  ForStart: [\n    o <span class=\"hljs-string\">&#x27;FOR ForVariables&#x27;</span>,        <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> For [], name: $<span class=\"hljs-number\">2</span>[<span class=\"hljs-number\">0</span>], index: $<span class=\"hljs-number\">2</span>[<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">&#x27;FOR AWAIT ForVariables&#x27;</span>,  <span class=\"hljs-function\">-&gt;</span>\n        [name, index] = $<span class=\"hljs-number\">3</span>\n        <span class=\"hljs-keyword\">new</span> For [], {name, index, await: <span class=\"hljs-literal\">yes</span>, awaitTag: (LOC(<span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">new</span> Literal($<span class=\"hljs-number\">2</span>))}\n    o <span class=\"hljs-string\">&#x27;FOR OWN ForVariables&#x27;</span>,    <span class=\"hljs-function\">-&gt;</span>\n        [name, index] = $<span class=\"hljs-number\">3</span>\n        <span class=\"hljs-keyword\">new</span> For [], {name, index, own: <span class=\"hljs-literal\">yes</span>, ownTag: (LOC(<span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">new</span> Literal($<span class=\"hljs-number\">2</span>))}\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-68\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-68\">&#x00a7;</a>\n              </div>\n              <p>An array of all accepted values for a variable inside the loop.\nThis enables support for pattern matching.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ForValue: [\n    o <span class=\"hljs-string\">&#x27;Identifier&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;ThisProperty&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;Array&#x27;</span>,                                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;Object&#x27;</span>,                                 <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Value $<span class=\"hljs-number\">1</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-69\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-69\">&#x00a7;</a>\n              </div>\n              <p>An array or range comprehension has variables for the current element\nand (optional) reference to the current index. Or, <em>key, value</em>, in the case\nof object comprehensions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ForVariables: [\n    o <span class=\"hljs-string\">&#x27;ForValue&#x27;</span>,                               <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">&#x27;ForValue , ForValue&#x27;</span>,                    <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>]\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-70\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-70\">&#x00a7;</a>\n              </div>\n              <p>The source of a comprehension is an array or object with an optional guard\nclause. If it’s an array comprehension, you can also choose to step through\nin fixed-size increments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ForSource: [\n    o <span class=\"hljs-string\">&#x27;FORIN Expression&#x27;</span>,                                           <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;FOROF Expression&#x27;</span>,                                           <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, object: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">&#x27;FORIN Expression WHEN Expression&#x27;</span>,                           <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;FORIN ExpressionLine WHEN Expression&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;FOROF Expression WHEN Expression&#x27;</span>,                           <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, object: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">&#x27;FOROF ExpressionLine WHEN Expression&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, object: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">&#x27;FORIN Expression BY Expression&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;FORIN ExpressionLine BY Expression&#x27;</span>,                         <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;FORIN Expression WHEN Expression BY Expression&#x27;</span>,             <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, step: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN ExpressionLine WHEN Expression BY Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, step: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN Expression WHEN ExpressionLine BY Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, step: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN ExpressionLine WHEN ExpressionLine BY Expression&#x27;</span>,     <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, step: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN Expression BY Expression WHEN Expression&#x27;</span>,             <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>, guard: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN ExpressionLine BY Expression WHEN Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>, guard: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN Expression BY ExpressionLine WHEN Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>, guard: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN ExpressionLine BY ExpressionLine WHEN Expression&#x27;</span>,     <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>, guard: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORFROM Expression&#x27;</span>,                                         <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, from: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">&#x27;FORFROM Expression WHEN Expression&#x27;</span>,                         <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, from: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">&#x27;FORFROM ExpressionLine WHEN Expression&#x27;</span>,                     <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, from: <span class=\"hljs-literal\">yes</span>\n  ]\n\n  ForLineSource: [\n    o <span class=\"hljs-string\">&#x27;FORIN ExpressionLine&#x27;</span>,                                       <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;FOROF ExpressionLine&#x27;</span>,                                       <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, object: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">&#x27;FORIN Expression WHEN ExpressionLine&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;FORIN ExpressionLine WHEN ExpressionLine&#x27;</span>,                   <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;FOROF Expression WHEN ExpressionLine&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, object: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">&#x27;FOROF ExpressionLine WHEN ExpressionLine&#x27;</span>,                   <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, object: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">&#x27;FORIN Expression BY ExpressionLine&#x27;</span>,                         <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;FORIN ExpressionLine BY ExpressionLine&#x27;</span>,                     <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;FORIN Expression WHEN Expression BY ExpressionLine&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, step: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN ExpressionLine WHEN Expression BY ExpressionLine&#x27;</span>,     <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, step: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN Expression WHEN ExpressionLine BY ExpressionLine&#x27;</span>,     <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, step: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN ExpressionLine WHEN ExpressionLine BY ExpressionLine&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, step: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN Expression BY Expression WHEN ExpressionLine&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>, guard: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN ExpressionLine BY Expression WHEN ExpressionLine&#x27;</span>,     <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>, guard: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN Expression BY ExpressionLine WHEN ExpressionLine&#x27;</span>,     <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>, guard: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORIN ExpressionLine BY ExpressionLine WHEN ExpressionLine&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, step:  $<span class=\"hljs-number\">4</span>, guard: $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;FORFROM ExpressionLine&#x27;</span>,                                     <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, from: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">&#x27;FORFROM Expression WHEN ExpressionLine&#x27;</span>,                     <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, from: <span class=\"hljs-literal\">yes</span>\n    o <span class=\"hljs-string\">&#x27;FORFROM ExpressionLine WHEN ExpressionLine&#x27;</span>,                 <span class=\"hljs-function\">-&gt;</span> source: $<span class=\"hljs-number\">2</span>, guard: $<span class=\"hljs-number\">4</span>, from: <span class=\"hljs-literal\">yes</span>\n  ]\n\n  Switch: [\n    o <span class=\"hljs-string\">&#x27;SWITCH Expression INDENT Whens OUTDENT&#x27;</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Switch $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;SWITCH ExpressionLine INDENT Whens OUTDENT&#x27;</span>,            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Switch $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>\n    o <span class=\"hljs-string\">&#x27;SWITCH Expression INDENT Whens ELSE Block OUTDENT&#x27;</span>,     <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Switch $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>, LOC(<span class=\"hljs-number\">5</span>,<span class=\"hljs-number\">6</span>) $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;SWITCH ExpressionLine INDENT Whens ELSE Block OUTDENT&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Switch $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">4</span>, LOC(<span class=\"hljs-number\">5</span>,<span class=\"hljs-number\">6</span>) $<span class=\"hljs-number\">6</span>\n    o <span class=\"hljs-string\">&#x27;SWITCH INDENT Whens OUTDENT&#x27;</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Switch <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;SWITCH INDENT Whens ELSE Block OUTDENT&#x27;</span>,                <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Switch <span class=\"hljs-literal\">null</span>, $<span class=\"hljs-number\">3</span>, LOC(<span class=\"hljs-number\">4</span>,<span class=\"hljs-number\">5</span>) $<span class=\"hljs-number\">5</span>\n  ]\n\n  Whens: [\n    o <span class=\"hljs-string\">&#x27;When&#x27;</span>,                                   <span class=\"hljs-function\">-&gt;</span> [$<span class=\"hljs-number\">1</span>]\n    o <span class=\"hljs-string\">&#x27;Whens When&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>concat $<span class=\"hljs-number\">2</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-71\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-71\">&#x00a7;</a>\n              </div>\n              <p>An individual <strong>When</strong> clause, with action.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  When: [\n    o <span class=\"hljs-string\">&#x27;LEADING_WHEN SimpleArgs Block&#x27;</span>,            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> SwitchWhen $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;LEADING_WHEN SimpleArgs Block TERMINATOR&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> LOC(<span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">3</span>) <span class=\"hljs-keyword\">new</span> SwitchWhen $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-72\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-72\">&#x00a7;</a>\n              </div>\n              <p>The most basic form of <em>if</em> is a condition and an action. The following\nif-related rules are broken up along these lines in order to avoid\nambiguity.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  IfBlock: [\n    o <span class=\"hljs-string\">&#x27;IF Expression Block&#x27;</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> If $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">3</span>, type: $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;IfBlock ELSE IF Expression Block&#x27;</span>,       <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>addElse LOC(<span class=\"hljs-number\">3</span>,<span class=\"hljs-number\">5</span>) <span class=\"hljs-keyword\">new</span> If $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">5</span>, type: $<span class=\"hljs-number\">3</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-73\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-73\">&#x00a7;</a>\n              </div>\n              <p>The full complement of <em>if</em> expressions, including postfix one-liner\n<em>if</em> and <em>unless</em>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  If: [\n    o <span class=\"hljs-string\">&#x27;IfBlock&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;IfBlock ELSE Block&#x27;</span>,                     <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>addElse $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;Statement  POST_IF Expression&#x27;</span>,          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> If $<span class=\"hljs-number\">3</span>, LOC(<span class=\"hljs-number\">1</span>)(Block.wrap [$<span class=\"hljs-number\">1</span>]), type: $<span class=\"hljs-number\">2</span>, postfix: <span class=\"hljs-literal\">true</span>\n    o <span class=\"hljs-string\">&#x27;Expression POST_IF Expression&#x27;</span>,          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> If $<span class=\"hljs-number\">3</span>, LOC(<span class=\"hljs-number\">1</span>)(Block.wrap [$<span class=\"hljs-number\">1</span>]), type: $<span class=\"hljs-number\">2</span>, postfix: <span class=\"hljs-literal\">true</span>\n  ]\n\n  IfBlockLine: [\n    o <span class=\"hljs-string\">&#x27;IF ExpressionLine Block&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> If $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">3</span>, type: $<span class=\"hljs-number\">1</span>\n    o <span class=\"hljs-string\">&#x27;IfBlockLine ELSE IF ExpressionLine Block&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>addElse LOC(<span class=\"hljs-number\">3</span>,<span class=\"hljs-number\">5</span>) <span class=\"hljs-keyword\">new</span> If $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">5</span>, type: $<span class=\"hljs-number\">3</span>\n  ]\n\n  IfLine: [\n    o <span class=\"hljs-string\">&#x27;IfBlockLine&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;IfBlockLine ELSE Block&#x27;</span>,               <span class=\"hljs-function\">-&gt;</span> $<span class=\"hljs-number\">1.</span>addElse $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;Statement  POST_IF ExpressionLine&#x27;</span>,    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> If $<span class=\"hljs-number\">3</span>, LOC(<span class=\"hljs-number\">1</span>)(Block.wrap [$<span class=\"hljs-number\">1</span>]), type: $<span class=\"hljs-number\">2</span>, postfix: <span class=\"hljs-literal\">true</span>\n    o <span class=\"hljs-string\">&#x27;Expression POST_IF ExpressionLine&#x27;</span>,    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> If $<span class=\"hljs-number\">3</span>, LOC(<span class=\"hljs-number\">1</span>)(Block.wrap [$<span class=\"hljs-number\">1</span>]), type: $<span class=\"hljs-number\">2</span>, postfix: <span class=\"hljs-literal\">true</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-74\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-74\">&#x00a7;</a>\n              </div>\n              <p>Arithmetic and logical operators, working on one or more operands.\nHere they are grouped by order of precedence. The actual precedence rules\nare defined at the bottom of the page. It would be shorter if we could\ncombine most of these rules into a single generic <em>Operand OpSymbol Operand</em>\n-type rule, but in order to make the precedence binding possible, separate\nrules are necessary.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  OperationLine: [\n    o <span class=\"hljs-string\">&#x27;UNARY ExpressionLine&#x27;</span>,                   <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;DO ExpressionLine&#x27;</span>,                      <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;DO_IIFE CodeLine&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">2</span>\n  ]\n\n  Operation: [\n    o <span class=\"hljs-string\">&#x27;UNARY Expression&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1.</span>toString(), $<span class=\"hljs-number\">2</span>, <span class=\"hljs-literal\">undefined</span>, <span class=\"hljs-literal\">undefined</span>, originalOperator: $<span class=\"hljs-number\">1.</span>original\n    o <span class=\"hljs-string\">&#x27;DO Expression&#x27;</span>,                          <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;UNARY_MATH Expression&#x27;</span>,                  <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;-     Expression&#x27;</span>,                      (<span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;-&#x27;</span>, $<span class=\"hljs-number\">2</span>), prec: <span class=\"hljs-string\">&#x27;UNARY_MATH&#x27;</span>\n    o <span class=\"hljs-string\">&#x27;+     Expression&#x27;</span>,                      (<span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;+&#x27;</span>, $<span class=\"hljs-number\">2</span>), prec: <span class=\"hljs-string\">&#x27;UNARY_MATH&#x27;</span>\n\n    o <span class=\"hljs-string\">&#x27;AWAIT Expression&#x27;</span>,                       <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;AWAIT INDENT Object OUTDENT&#x27;</span>,            <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n\n    o <span class=\"hljs-string\">&#x27;-- SimpleAssignable&#x27;</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;--&#x27;</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;++ SimpleAssignable&#x27;</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;++&#x27;</span>, $<span class=\"hljs-number\">2</span>\n    o <span class=\"hljs-string\">&#x27;SimpleAssignable --&#x27;</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;--&#x27;</span>, $<span class=\"hljs-number\">1</span>, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">true</span>\n    o <span class=\"hljs-string\">&#x27;SimpleAssignable ++&#x27;</span>,                    <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;++&#x27;</span>, $<span class=\"hljs-number\">1</span>, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">true</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-75\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-75\">&#x00a7;</a>\n              </div>\n              <p><a href=\"https://coffeescript.org/#existential-operator\">The existential operator</a>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    o <span class=\"hljs-string\">&#x27;Expression ?&#x27;</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Existence $<span class=\"hljs-number\">1</span>\n\n    o <span class=\"hljs-string\">&#x27;Expression +  Expression&#x27;</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;+&#x27;</span> , $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;Expression -  Expression&#x27;</span>,               <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;-&#x27;</span> , $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n\n    o <span class=\"hljs-string\">&#x27;Expression MATH     Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;Expression **       Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;Expression SHIFT    Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;Expression COMPARE  Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2.</span>toString(), $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, <span class=\"hljs-literal\">undefined</span>, originalOperator: $<span class=\"hljs-number\">2.</span>original\n    o <span class=\"hljs-string\">&#x27;Expression &amp;        Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;Expression ^        Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;Expression |        Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;Expression &amp;&amp;       Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2.</span>toString(), $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, <span class=\"hljs-literal\">undefined</span>, originalOperator: $<span class=\"hljs-number\">2.</span>original\n    o <span class=\"hljs-string\">&#x27;Expression ||       Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2.</span>toString(), $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, <span class=\"hljs-literal\">undefined</span>, originalOperator: $<span class=\"hljs-number\">2.</span>original\n    o <span class=\"hljs-string\">&#x27;Expression BIN?     Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2</span>, $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>\n    o <span class=\"hljs-string\">&#x27;Expression RELATION Expression&#x27;</span>,         <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">2.</span>toString(), $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, <span class=\"hljs-literal\">undefined</span>, invertOperator: $<span class=\"hljs-number\">2.</span>invert?.original ? $<span class=\"hljs-number\">2.</span>invert\n\n    o <span class=\"hljs-string\">&#x27;SimpleAssignable COMPOUND_ASSIGN\n       Expression&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">3</span>, $<span class=\"hljs-number\">2.</span>toString(), originalContext: $<span class=\"hljs-number\">2.</span>original\n    o <span class=\"hljs-string\">&#x27;SimpleAssignable COMPOUND_ASSIGN\n       INDENT Expression OUTDENT&#x27;</span>,              <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">2.</span>toString(), originalContext: $<span class=\"hljs-number\">2.</span>original\n    o <span class=\"hljs-string\">&#x27;SimpleAssignable COMPOUND_ASSIGN TERMINATOR\n       Expression&#x27;</span>,                             <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Assign $<span class=\"hljs-number\">1</span>, $<span class=\"hljs-number\">4</span>, $<span class=\"hljs-number\">2.</span>toString(), originalContext: $<span class=\"hljs-number\">2.</span>original\n  ]\n\n  DoIife: [\n    o <span class=\"hljs-string\">&#x27;DO_IIFE Code&#x27;</span>,                           <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-keyword\">new</span> Op $<span class=\"hljs-number\">1</span> , $<span class=\"hljs-number\">2</span>\n  ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-76\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-76\">&#x00a7;</a>\n              </div>\n              <h2 id=\"precedence\">Precedence</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-77\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-77\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-78\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-78\">&#x00a7;</a>\n              </div>\n              <p>Operators at the top of this list have higher precedence than the ones lower\ndown. Following these rules is what makes <code>2 + 3 * 4</code> parse as:</p>\n<pre><code><span class=\"hljs-number\">2</span> + (<span class=\"hljs-number\">3</span> * <span class=\"hljs-number\">4</span>)\n</code></pre>\n<p>And not:</p>\n<pre><code>(<span class=\"hljs-number\">2</span> + <span class=\"hljs-number\">3</span>) * <span class=\"hljs-number\">4</span>\n</code></pre>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>operators = [\n  [<span class=\"hljs-string\">&#x27;right&#x27;</span>,     <span class=\"hljs-string\">&#x27;DO_IIFE&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;.&#x27;</span>, <span class=\"hljs-string\">&#x27;?.&#x27;</span>, <span class=\"hljs-string\">&#x27;::&#x27;</span>, <span class=\"hljs-string\">&#x27;?::&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;CALL_START&#x27;</span>, <span class=\"hljs-string\">&#x27;CALL_END&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;nonassoc&#x27;</span>,  <span class=\"hljs-string\">&#x27;++&#x27;</span>, <span class=\"hljs-string\">&#x27;--&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;?&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;right&#x27;</span>,     <span class=\"hljs-string\">&#x27;UNARY&#x27;</span>, <span class=\"hljs-string\">&#x27;DO&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;right&#x27;</span>,     <span class=\"hljs-string\">&#x27;AWAIT&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;right&#x27;</span>,     <span class=\"hljs-string\">&#x27;**&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;right&#x27;</span>,     <span class=\"hljs-string\">&#x27;UNARY_MATH&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;MATH&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;+&#x27;</span>, <span class=\"hljs-string\">&#x27;-&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;SHIFT&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;RELATION&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;COMPARE&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;&amp;&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;^&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;|&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;&amp;&amp;&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;||&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;BIN?&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;nonassoc&#x27;</span>,  <span class=\"hljs-string\">&#x27;INDENT&#x27;</span>, <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;right&#x27;</span>,     <span class=\"hljs-string\">&#x27;YIELD&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;right&#x27;</span>,     <span class=\"hljs-string\">&#x27;=&#x27;</span>, <span class=\"hljs-string\">&#x27;:&#x27;</span>, <span class=\"hljs-string\">&#x27;COMPOUND_ASSIGN&#x27;</span>, <span class=\"hljs-string\">&#x27;RETURN&#x27;</span>, <span class=\"hljs-string\">&#x27;THROW&#x27;</span>, <span class=\"hljs-string\">&#x27;EXTENDS&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;right&#x27;</span>,     <span class=\"hljs-string\">&#x27;FORIN&#x27;</span>, <span class=\"hljs-string\">&#x27;FOROF&#x27;</span>, <span class=\"hljs-string\">&#x27;FORFROM&#x27;</span>, <span class=\"hljs-string\">&#x27;BY&#x27;</span>, <span class=\"hljs-string\">&#x27;WHEN&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;right&#x27;</span>,     <span class=\"hljs-string\">&#x27;IF&#x27;</span>, <span class=\"hljs-string\">&#x27;ELSE&#x27;</span>, <span class=\"hljs-string\">&#x27;FOR&#x27;</span>, <span class=\"hljs-string\">&#x27;WHILE&#x27;</span>, <span class=\"hljs-string\">&#x27;UNTIL&#x27;</span>, <span class=\"hljs-string\">&#x27;LOOP&#x27;</span>, <span class=\"hljs-string\">&#x27;SUPER&#x27;</span>, <span class=\"hljs-string\">&#x27;CLASS&#x27;</span>, <span class=\"hljs-string\">&#x27;IMPORT&#x27;</span>, <span class=\"hljs-string\">&#x27;EXPORT&#x27;</span>, <span class=\"hljs-string\">&#x27;DYNAMIC_IMPORT&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;left&#x27;</span>,      <span class=\"hljs-string\">&#x27;POST_IF&#x27;</span>]\n]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-79\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-79\">&#x00a7;</a>\n              </div>\n              <h2 id=\"wrapping-up\">Wrapping Up</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-80\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-80\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-81\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-81\">&#x00a7;</a>\n              </div>\n              <p>Finally, now that we have our <strong>grammar</strong> and our <strong>operators</strong>, we can create\nour <strong>Jison.Parser</strong>. We do this by processing all of our rules, recording all\nterminals (every symbol which does not appear as the name of a rule above)\nas “tokens”.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>tokens = []\n<span class=\"hljs-keyword\">for</span> name, alternatives <span class=\"hljs-keyword\">of</span> grammar\n  grammar[name] = <span class=\"hljs-keyword\">for</span> alt <span class=\"hljs-keyword\">in</span> alternatives\n    <span class=\"hljs-keyword\">for</span> token <span class=\"hljs-keyword\">in</span> alt[<span class=\"hljs-number\">0</span>].split <span class=\"hljs-string\">&#x27; &#x27;</span>\n      tokens.push token <span class=\"hljs-keyword\">unless</span> grammar[token]\n    alt[<span class=\"hljs-number\">1</span>] = <span class=\"hljs-string\">&quot;return <span class=\"hljs-subst\">#{alt[<span class=\"hljs-number\">1</span>]}</span>&quot;</span> <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;Root&#x27;</span>\n    alt</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-82\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-82\">&#x00a7;</a>\n              </div>\n              <p>Initialize the <strong>Parser</strong> with our list of terminal <strong>tokens</strong>, our <strong>grammar</strong>\nrules, and the name of the root. Reverse the operators because Jison orders\nprecedence from low to high, and we have it high to low\n(as in <a href=\"http://dinosaur.compilertools.net/yacc/index.html\">Yacc</a>).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.parser = <span class=\"hljs-keyword\">new</span> Parser\n  tokens      : tokens.join <span class=\"hljs-string\">&#x27; &#x27;</span>\n  bnf         : grammar\n  operators   : operators.reverse()\n  startSymbol : <span class=\"hljs-string\">&#x27;Root&#x27;</span></pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/helpers.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>helpers.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>helpers.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              <p>This file contains the common helper functions that we’d like to share among\nthe <strong>Lexer</strong>, <strong>Rewriter</strong>, and the <strong>Nodes</strong>. Merge objects, flatten\narrays, count characters, that sort of thing.</p>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>Peek at the beginning of a given string to see if it matches a sequence.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.starts = <span class=\"hljs-function\"><span class=\"hljs-params\">(string, literal, start)</span> -&gt;</span>\n  literal <span class=\"hljs-keyword\">is</span> string.substr start, literal.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <p>Peek at the end of a given string to see if it matches a sequence.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.ends = <span class=\"hljs-function\"><span class=\"hljs-params\">(string, literal, back)</span> -&gt;</span>\n  len = literal.length\n  literal <span class=\"hljs-keyword\">is</span> string.substr string.length - len - (back <span class=\"hljs-keyword\">or</span> <span class=\"hljs-number\">0</span>), len</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              <p>Repeat a string <code>n</code> times.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.repeat = repeat = <span class=\"hljs-function\"><span class=\"hljs-params\">(str, n)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>Use clever algorithm to have O(log(n)) string concatenation operations.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  res = <span class=\"hljs-string\">&#x27;&#x27;</span>\n  <span class=\"hljs-keyword\">while</span> n &gt; <span class=\"hljs-number\">0</span>\n    res += str <span class=\"hljs-keyword\">if</span> n &amp; <span class=\"hljs-number\">1</span>\n    n &gt;&gt;&gt;= <span class=\"hljs-number\">1</span>\n    str += str\n  res</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>Trim out all falsy values from an array.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.compact = <span class=\"hljs-function\"><span class=\"hljs-params\">(array)</span> -&gt;</span>\n  item <span class=\"hljs-keyword\">for</span> item <span class=\"hljs-keyword\">in</span> array <span class=\"hljs-keyword\">when</span> item</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>Count the number of occurrences of a string in a string.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.count = <span class=\"hljs-function\"><span class=\"hljs-params\">(string, substr)</span> -&gt;</span>\n  num = pos = <span class=\"hljs-number\">0</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span>/<span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> substr.length\n  num++ <span class=\"hljs-keyword\">while</span> pos = <span class=\"hljs-number\">1</span> + string.indexOf substr, pos\n  num</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>Merge objects, returning a fresh copy with attributes from both sides.\nUsed every time <code>Base#compile</code> is called, to allow properties in the\noptions hash to propagate down the tree without polluting other branches.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.merge = <span class=\"hljs-function\"><span class=\"hljs-params\">(options, overrides)</span> -&gt;</span>\n  extend (extend {}, options), overrides</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <p>Extend a source object with the properties of another object (shallow copy).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>extend = <span class=\"hljs-built_in\">exports</span>.extend = <span class=\"hljs-function\"><span class=\"hljs-params\">(object, properties)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">for</span> key, val <span class=\"hljs-keyword\">of</span> properties\n    object[key] = val\n  object</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>Return a flattened version of an array.\nHandy for getting a list of <code>children</code> from the nodes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.flatten = flatten = <span class=\"hljs-function\"><span class=\"hljs-params\">(array)</span> -&gt;</span>\n  array.flat(<span class=\"hljs-literal\">Infinity</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-11\">&#x00a7;</a>\n              </div>\n              <p>Delete a key from an object, returning the value. Useful when a node is\nlooking for a particular method in an options hash.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.del = <span class=\"hljs-function\"><span class=\"hljs-params\">(obj, key)</span> -&gt;</span>\n  val =  obj[key]\n  <span class=\"hljs-keyword\">delete</span> obj[key]\n  val</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-12\">&#x00a7;</a>\n              </div>\n              <p>Typical Array::some</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.some = Array::some ? (fn) -&gt;\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">for</span> e <span class=\"hljs-keyword\">in</span> this <span class=\"hljs-keyword\">when</span> fn e\n  <span class=\"hljs-literal\">false</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-13\">&#x00a7;</a>\n              </div>\n              <p>Helper function for extracting code from Literate CoffeeScript by stripping\nout all non-code blocks, producing a string of CoffeeScript code that can\nbe compiled “normally.”</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.invertLiterate = <span class=\"hljs-function\"><span class=\"hljs-params\">(code)</span> -&gt;</span>\n  out = []\n  blankLine = <span class=\"hljs-regexp\">/^\\s*$/</span>\n  indented = <span class=\"hljs-regexp\">/^[\\t ]/</span>\n  listItemStart = <span class=\"hljs-regexp\">/// ^\n    (?:\\t?|\\ {0,3})   <span class=\"hljs-comment\"># Up to one tab, or up to three spaces, or neither;</span>\n    (?:\n      [\\*\\-\\+] |      <span class=\"hljs-comment\"># followed by `*`, `-` or `+`;</span>\n      [0-9]{1,9}\\.    <span class=\"hljs-comment\"># or by an integer up to 9 digits long, followed by a period;</span>\n    )\n    [\\ \\t]            <span class=\"hljs-comment\"># followed by a space or a tab.</span>\n  ///</span>\n  insideComment = <span class=\"hljs-literal\">no</span>\n  <span class=\"hljs-keyword\">for</span> line <span class=\"hljs-keyword\">in</span> code.split(<span class=\"hljs-string\">&#x27;\\n&#x27;</span>)\n    <span class=\"hljs-keyword\">if</span> blankLine.test(line)\n      insideComment = <span class=\"hljs-literal\">no</span>\n      out.push line\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> insideComment <span class=\"hljs-keyword\">or</span> listItemStart.test(line)\n      insideComment = <span class=\"hljs-literal\">yes</span>\n      out.push <span class=\"hljs-string\">&quot;# <span class=\"hljs-subst\">#{line}</span>&quot;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> insideComment <span class=\"hljs-keyword\">and</span> indented.test(line)\n      out.push line\n    <span class=\"hljs-keyword\">else</span>\n      insideComment = <span class=\"hljs-literal\">yes</span>\n      out.push <span class=\"hljs-string\">&quot;# <span class=\"hljs-subst\">#{line}</span>&quot;</span>\n  out.join <span class=\"hljs-string\">&#x27;\\n&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-14\">&#x00a7;</a>\n              </div>\n              <p>Merge two jison-style location data objects together.\nIf <code>last</code> is not provided, this will simply return <code>first</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">buildLocationData</span> = <span class=\"hljs-params\">(first, last)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> last\n    first\n  <span class=\"hljs-keyword\">else</span>\n    first_line: first.first_line\n    first_column: first.first_column\n    last_line: last.last_line\n    last_column: last.last_column\n    last_line_exclusive: last.last_line_exclusive\n    last_column_exclusive: last.last_column_exclusive\n    range: [\n      first.range[<span class=\"hljs-number\">0</span>]\n      last.range[<span class=\"hljs-number\">1</span>]\n    ]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-15\">&#x00a7;</a>\n              </div>\n              <p>Build a list of all comments attached to tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.extractAllCommentTokens = <span class=\"hljs-function\"><span class=\"hljs-params\">(tokens)</span> -&gt;</span>\n  allCommentsObj = {}\n  <span class=\"hljs-keyword\">for</span> token <span class=\"hljs-keyword\">in</span> tokens <span class=\"hljs-keyword\">when</span> token.comments\n    <span class=\"hljs-keyword\">for</span> comment <span class=\"hljs-keyword\">in</span> token.comments\n      commentKey = comment.locationData.range[<span class=\"hljs-number\">0</span>]\n      allCommentsObj[commentKey] = comment\n  sortedKeys = <span class=\"hljs-built_in\">Object</span>.keys(allCommentsObj).sort (a, b) -&gt; a - b\n  <span class=\"hljs-keyword\">for</span> key <span class=\"hljs-keyword\">in</span> sortedKeys\n    allCommentsObj[key]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-16\">&#x00a7;</a>\n              </div>\n              <p>Get a lookup hash for a token based on its location data.\nMultiple tokens might have the same location hash, but using exclusive\nlocation data distinguishes e.g. zero-length generated tokens from\nactual source tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">buildLocationHash</span> = <span class=\"hljs-params\">(loc)</span> -&gt;</span>\n  <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{loc.range[<span class=\"hljs-number\">0</span>]}</span>-<span class=\"hljs-subst\">#{loc.range[<span class=\"hljs-number\">1</span>]}</span>&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-17\">&#x00a7;</a>\n              </div>\n              <p>Build a dictionary of extra token properties organized by tokens’ locations\nused as lookup hashes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.buildTokenDataDictionary = buildTokenDataDictionary = <span class=\"hljs-function\"><span class=\"hljs-params\">(tokens)</span> -&gt;</span>\n  tokenData = {}\n  <span class=\"hljs-keyword\">for</span> token <span class=\"hljs-keyword\">in</span> tokens <span class=\"hljs-keyword\">when</span> token.comments\n    tokenHash = buildLocationHash token[<span class=\"hljs-number\">2</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-18\">&#x00a7;</a>\n              </div>\n              <p>Multiple tokens might have the same location hash, such as the generated\n<code>JS</code> tokens added at the start or end of the token stream to hold\ncomments that start or end a file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    tokenData[tokenHash] ?= {}\n    <span class=\"hljs-keyword\">if</span> token.comments <span class=\"hljs-comment\"># `comments` is always an array.</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-19\">&#x00a7;</a>\n              </div>\n              <p>For “overlapping” tokens, that is tokens with the same location data\nand therefore matching <code>tokenHash</code>es, merge the comments from both/all\ntokens together into one array, even if there are duplicate comments;\nthey will get sorted out later.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      (tokenData[tokenHash].comments ?= []).push token.comments...\n  tokenData</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-20\">&#x00a7;</a>\n              </div>\n              <p>This returns a function which takes an object as a parameter, and if that\nobject is an AST node, updates that object’s locationData.\nThe object is returned either way.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.addDataToNode = <span class=\"hljs-function\"><span class=\"hljs-params\">(parserState, firstLocationData, firstValue, lastLocationData, lastValue, forceUpdateLocation = <span class=\"hljs-literal\">yes</span>)</span> -&gt;</span>\n  (obj) -&gt;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-21\">&#x00a7;</a>\n              </div>\n              <p>Add location data.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    locationData = buildLocationData(firstValue?.locationData ? firstLocationData, lastValue?.locationData ? lastLocationData)\n    <span class=\"hljs-keyword\">if</span> obj?.updateLocationDataIfMissing? <span class=\"hljs-keyword\">and</span> firstLocationData?\n      obj.updateLocationDataIfMissing locationData, forceUpdateLocation\n    <span class=\"hljs-keyword\">else</span>\n      obj.locationData = locationData</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-22\">&#x00a7;</a>\n              </div>\n              <p>Add comments, building the dictionary of token data if it hasn’t been\nbuilt yet.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    parserState.tokenData ?= buildTokenDataDictionary parserState.parser.tokens\n    <span class=\"hljs-keyword\">if</span> obj.locationData?\n      objHash = buildLocationHash obj.locationData\n      <span class=\"hljs-keyword\">if</span> parserState.tokenData[objHash]?.comments?\n        attachCommentsToNode parserState.tokenData[objHash].comments, obj\n    obj\n\n<span class=\"hljs-built_in\">exports</span>.attachCommentsToNode = attachCommentsToNode = <span class=\"hljs-function\"><span class=\"hljs-params\">(comments, node)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> comments? <span class=\"hljs-keyword\">or</span> comments.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n  node.comments ?= []\n  node.comments.push comments...</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-23\">&#x00a7;</a>\n              </div>\n              <p>Convert jison location data to a string.\n<code>obj</code> can be a token, or a locationData.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.locationDataToString = <span class=\"hljs-function\"><span class=\"hljs-params\">(obj)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">&quot;2&quot;</span> <span class=\"hljs-keyword\">of</span> obj) <span class=\"hljs-keyword\">and</span> (<span class=\"hljs-string\">&quot;first_line&quot;</span> <span class=\"hljs-keyword\">of</span> obj[<span class=\"hljs-number\">2</span>]) <span class=\"hljs-keyword\">then</span> locationData = obj[<span class=\"hljs-number\">2</span>]\n  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">&quot;first_line&quot;</span> <span class=\"hljs-keyword\">of</span> obj <span class=\"hljs-keyword\">then</span> locationData = obj\n\n  <span class=\"hljs-keyword\">if</span> locationData\n    <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{locationData.first_line + <span class=\"hljs-number\">1</span>}</span>:<span class=\"hljs-subst\">#{locationData.first_column + <span class=\"hljs-number\">1</span>}</span>-&quot;</span> +\n    <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{locationData.last_line + <span class=\"hljs-number\">1</span>}</span>:<span class=\"hljs-subst\">#{locationData.last_column + <span class=\"hljs-number\">1</span>}</span>&quot;</span>\n  <span class=\"hljs-keyword\">else</span>\n    <span class=\"hljs-string\">&quot;No location data&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-24\">&#x00a7;</a>\n              </div>\n              <p>Generate a unique anonymous file name so we can distinguish source map cache\nentries for any number of anonymous scripts.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.anonymousFileName = <span class=\"hljs-keyword\">do</span> -&gt;\n  n = <span class=\"hljs-number\">0</span>\n  -&gt;\n    <span class=\"hljs-string\">&quot;&lt;anonymous-<span class=\"hljs-subst\">#{n++}</span>&gt;&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-25\">&#x00a7;</a>\n              </div>\n              <p>A <code>.coffee.md</code> compatible version of <code>basename</code>, that returns the file sans-extension.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.baseFileName = <span class=\"hljs-function\"><span class=\"hljs-params\">(file, stripExt = <span class=\"hljs-literal\">no</span>, useWinPathSep = <span class=\"hljs-literal\">no</span>)</span> -&gt;</span>\n  pathSep = <span class=\"hljs-keyword\">if</span> useWinPathSep <span class=\"hljs-keyword\">then</span> <span class=\"hljs-regexp\">/\\\\|\\//</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-regexp\">/\\//</span>\n  parts = file.split(pathSep)\n  file = parts[parts.length - <span class=\"hljs-number\">1</span>]\n  <span class=\"hljs-keyword\">return</span> file <span class=\"hljs-keyword\">unless</span> stripExt <span class=\"hljs-keyword\">and</span> file.indexOf(<span class=\"hljs-string\">&#x27;.&#x27;</span>) &gt;= <span class=\"hljs-number\">0</span>\n  parts = file.split(<span class=\"hljs-string\">&#x27;.&#x27;</span>)\n  parts.pop()\n  parts.pop() <span class=\"hljs-keyword\">if</span> parts[parts.length - <span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;coffee&#x27;</span> <span class=\"hljs-keyword\">and</span> parts.length &gt; <span class=\"hljs-number\">1</span>\n  parts.join(<span class=\"hljs-string\">&#x27;.&#x27;</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-26\">&#x00a7;</a>\n              </div>\n              <p>Determine if a filename represents a CoffeeScript file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.isCoffee = <span class=\"hljs-function\"><span class=\"hljs-params\">(file)</span> -&gt;</span> <span class=\"hljs-regexp\">/\\.((lit)?coffee|coffee\\.md)$/</span>.test file</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-27\">&#x00a7;</a>\n              </div>\n              <p>Determine if a filename represents a Literate CoffeeScript file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.isLiterate = <span class=\"hljs-function\"><span class=\"hljs-params\">(file)</span> -&gt;</span> <span class=\"hljs-regexp\">/\\.(litcoffee|coffee\\.md)$/</span>.test file</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-28\">&#x00a7;</a>\n              </div>\n              <p>Throws a SyntaxError from a given location.\nThe error’s <code>toString</code> will return an error message following the “standard”\nformat <code>&lt;filename&gt;:&lt;line&gt;:&lt;col&gt;: &lt;message&gt;</code> plus the line with the error and a\nmarker showing where the error is.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.throwSyntaxError = <span class=\"hljs-function\"><span class=\"hljs-params\">(message, location)</span> -&gt;</span>\n  error = <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">SyntaxError</span> message\n  error.location = location\n  error.toString = syntaxErrorToString</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-29\">&#x00a7;</a>\n              </div>\n              <p>Instead of showing the compiler’s stacktrace, show our custom error message\n(this is useful when the error bubbles up in Node.js applications that\ncompile CoffeeScript for example).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  error.stack = error.toString()\n\n  <span class=\"hljs-keyword\">throw</span> error</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-30\">&#x00a7;</a>\n              </div>\n              <p>Update a compiler SyntaxError with source code information if it didn’t have\nit already.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.updateSyntaxError = <span class=\"hljs-function\"><span class=\"hljs-params\">(error, code, filename)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-31\">&#x00a7;</a>\n              </div>\n              <p>Avoid screwing up the <code>stack</code> property of other errors (i.e. possible bugs).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">if</span> error.toString <span class=\"hljs-keyword\">is</span> syntaxErrorToString\n    error.code <span class=\"hljs-keyword\">or</span>= code\n    error.filename <span class=\"hljs-keyword\">or</span>= filename\n    error.stack = error.toString()\n  error\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">syntaxErrorToString</span> = -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> Error::toString.call @ <span class=\"hljs-keyword\">unless</span> @code <span class=\"hljs-keyword\">and</span> @location\n\n  {first_line, first_column, last_line, last_column} = @location\n  last_line ?= first_line\n  last_column ?= first_column\n\n  <span class=\"hljs-keyword\">if</span> @filename?.startsWith <span class=\"hljs-string\">&#x27;&lt;anonymous&#x27;</span>\n    filename = <span class=\"hljs-string\">&#x27;[stdin]&#x27;</span>\n  <span class=\"hljs-keyword\">else</span>\n    filename = @filename <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&#x27;[stdin]&#x27;</span>\n\n  codeLine = @code.split(<span class=\"hljs-string\">&#x27;\\n&#x27;</span>)[first_line]\n  start    = first_column</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-32\">&#x00a7;</a>\n              </div>\n              <p>Show only the first line on multi-line errors.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  end      = <span class=\"hljs-keyword\">if</span> first_line <span class=\"hljs-keyword\">is</span> last_line <span class=\"hljs-keyword\">then</span> last_column + <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> codeLine.length\n  marker   = codeLine[...start].replace(<span class=\"hljs-regexp\">/[^\\s]/g</span>, <span class=\"hljs-string\">&#x27; &#x27;</span>) + repeat(<span class=\"hljs-string\">&#x27;^&#x27;</span>, end - start)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-33\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-33\">&#x00a7;</a>\n              </div>\n              <p>Check to see if we’re running on a color-enabled TTY.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">if</span> process?\n    colorsEnabled = process.stdout?.isTTY <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> process.env?.NODE_DISABLE_COLORS\n\n  <span class=\"hljs-keyword\">if</span> @colorful ? colorsEnabled\n<span class=\"hljs-function\">    <span class=\"hljs-title\">colorize</span> = <span class=\"hljs-params\">(str)</span> -&gt;</span> <span class=\"hljs-string\">&quot;\\x1B[1;31m<span class=\"hljs-subst\">#{str}</span>\\x1B[0m&quot;</span>\n    codeLine = codeLine[...start] + colorize(codeLine[start...end]) + codeLine[end..]\n    marker   = colorize marker\n\n  <span class=\"hljs-string\">&quot;&quot;&quot;\n    <span class=\"hljs-subst\">#{filename}</span>:<span class=\"hljs-subst\">#{first_line + <span class=\"hljs-number\">1</span>}</span>:<span class=\"hljs-subst\">#{first_column + <span class=\"hljs-number\">1</span>}</span>: error: <span class=\"hljs-subst\">#{@message}</span>\n    <span class=\"hljs-subst\">#{codeLine}</span>\n    <span class=\"hljs-subst\">#{marker}</span>\n  &quot;&quot;&quot;</span>\n\n<span class=\"hljs-built_in\">exports</span>.nameWhitespaceCharacter = <span class=\"hljs-function\"><span class=\"hljs-params\">(string)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">switch</span> string\n    <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27; &#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;space&#x27;</span>\n    <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;newline&#x27;</span>\n    <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;\\r&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;carriage return&#x27;</span>\n    <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;\\t&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;tab&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> string\n\n<span class=\"hljs-built_in\">exports</span>.parseNumber = <span class=\"hljs-function\"><span class=\"hljs-params\">(string)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">NaN</span> <span class=\"hljs-keyword\">unless</span> string?\n\n  base = <span class=\"hljs-keyword\">switch</span> string.charAt <span class=\"hljs-number\">1</span>\n    <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;b&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-number\">2</span>\n    <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;o&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-number\">8</span>\n    <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;x&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-number\">16</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-literal\">null</span>\n\n  <span class=\"hljs-keyword\">if</span> base?\n    <span class=\"hljs-built_in\">parseInt</span> string[<span class=\"hljs-number\">2.</span>.].replace(<span class=\"hljs-regexp\">/_/g</span>, <span class=\"hljs-string\">&#x27;&#x27;</span>), base\n  <span class=\"hljs-keyword\">else</span>\n    <span class=\"hljs-built_in\">parseFloat</span> string.replace(<span class=\"hljs-regexp\">/_/g</span>, <span class=\"hljs-string\">&#x27;&#x27;</span>)\n\n<span class=\"hljs-built_in\">exports</span>.isFunction = <span class=\"hljs-function\"><span class=\"hljs-params\">(obj)</span> -&gt;</span> Object::toString.call(obj) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;[object Function]&#x27;</span>\n<span class=\"hljs-built_in\">exports</span>.isNumber = isNumber = <span class=\"hljs-function\"><span class=\"hljs-params\">(obj)</span> -&gt;</span> Object::toString.call(obj) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;[object Number]&#x27;</span>\n<span class=\"hljs-built_in\">exports</span>.isString = isString = <span class=\"hljs-function\"><span class=\"hljs-params\">(obj)</span> -&gt;</span> Object::toString.call(obj) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;[object String]&#x27;</span>\n<span class=\"hljs-built_in\">exports</span>.isBoolean = isBoolean = <span class=\"hljs-function\"><span class=\"hljs-params\">(obj)</span> -&gt;</span> obj <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">or</span> obj <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">or</span> Object::toString.call(obj) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;[object Boolean]&#x27;</span>\n<span class=\"hljs-built_in\">exports</span>.isPlainObject = <span class=\"hljs-function\"><span class=\"hljs-params\">(obj)</span> -&gt;</span> <span class=\"hljs-keyword\">typeof</span> obj <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span> <span class=\"hljs-keyword\">and</span> !!obj <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> <span class=\"hljs-built_in\">Array</span>.isArray(obj) <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> isNumber(obj) <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> isString(obj) <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> isBoolean(obj)\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">unicodeCodePointToUnicodeEscapes</span> = <span class=\"hljs-params\">(codePoint)</span> -&gt;</span>\n<span class=\"hljs-function\">  <span class=\"hljs-title\">toUnicodeEscape</span> = <span class=\"hljs-params\">(val)</span> -&gt;</span>\n    str = val.toString <span class=\"hljs-number\">16</span>\n    <span class=\"hljs-string\">&quot;\\\\u<span class=\"hljs-subst\">#{repeat <span class=\"hljs-string\">&#x27;0&#x27;</span>, <span class=\"hljs-number\">4</span> - str.length}</span><span class=\"hljs-subst\">#{str}</span>&quot;</span>\n  <span class=\"hljs-keyword\">return</span> toUnicodeEscape(codePoint) <span class=\"hljs-keyword\">if</span> codePoint &lt; <span class=\"hljs-number\">0x10000</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-34\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-34\">&#x00a7;</a>\n              </div>\n              <p>surrogate pair</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  high = <span class=\"hljs-built_in\">Math</span>.floor((codePoint - <span class=\"hljs-number\">0x10000</span>) / <span class=\"hljs-number\">0x400</span>) + <span class=\"hljs-number\">0xD800</span>\n  low = (codePoint - <span class=\"hljs-number\">0x10000</span>) % <span class=\"hljs-number\">0x400</span> + <span class=\"hljs-number\">0xDC00</span>\n  <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{toUnicodeEscape(high)}</span><span class=\"hljs-subst\">#{toUnicodeEscape(low)}</span>&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-35\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-35\">&#x00a7;</a>\n              </div>\n              <p>Replace <code>\\u{...}</code> with <code>\\uxxxx[\\uxxxx]</code> in regexes without <code>u</code> flag</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.replaceUnicodeCodePointEscapes = <span class=\"hljs-function\"><span class=\"hljs-params\">(str, {flags, error, delimiter = <span class=\"hljs-string\">&#x27;&#x27;</span>} = {})</span> -&gt;</span>\n  shouldReplace = flags? <span class=\"hljs-keyword\">and</span> <span class=\"hljs-string\">&#x27;u&#x27;</span> <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> flags\n  str.replace UNICODE_CODE_POINT_ESCAPE, <span class=\"hljs-function\"><span class=\"hljs-params\">(match, escapedBackslash, codePointHex, offset)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> escapedBackslash <span class=\"hljs-keyword\">if</span> escapedBackslash\n\n    codePointDecimal = <span class=\"hljs-built_in\">parseInt</span> codePointHex, <span class=\"hljs-number\">16</span>\n    <span class=\"hljs-keyword\">if</span> codePointDecimal &gt; <span class=\"hljs-number\">0x10ffff</span>\n      error <span class=\"hljs-string\">&quot;unicode code point escapes greater than \\\\u{10ffff} are not allowed&quot;</span>,\n        offset: offset + delimiter.length\n        length: codePointHex.length + <span class=\"hljs-number\">4</span>\n    <span class=\"hljs-keyword\">return</span> match <span class=\"hljs-keyword\">unless</span> shouldReplace\n\n    unicodeCodePointToUnicodeEscapes codePointDecimal\n\nUNICODE_CODE_POINT_ESCAPE = <span class=\"hljs-regexp\">///\n  ( \\\\\\\\ )        <span class=\"hljs-comment\"># Make sure the escape isn’t escaped.</span>\n  |\n  \\\\u\\{ ( [\\da-fA-F]+ ) \\}\n///</span>g</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/index.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>index.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>index.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              <p>Node.js Implementation</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript  = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./coffeescript&#x27;</span>\nfs            = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;fs&#x27;</span>\nvm            = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;vm&#x27;</span>\npath          = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;path&#x27;</span>\n\nhelpers       = CoffeeScript.helpers\n\nCoffeeScript.transpile = <span class=\"hljs-function\"><span class=\"hljs-params\">(js, options)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">try</span>\n    babel = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;@babel/core&#x27;</span>\n  <span class=\"hljs-keyword\">catch</span>\n    <span class=\"hljs-keyword\">try</span>\n      babel = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;babel-core&#x27;</span>\n    <span class=\"hljs-keyword\">catch</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>This error is only for Node, as CLI users will see a different error\nearlier if they don’t have Babel installed.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span> <span class=\"hljs-string\">&#x27;To use the transpile option, you must have the \\&#x27;@babel/core\\&#x27; module installed&#x27;</span>\n  babel.transform js, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <p>The <code>compile</code> method shared by the CLI, Node and browser APIs.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>universalCompile = CoffeeScript.compile</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              <p>The <code>compile</code> method particular to the Node API.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript.compile = <span class=\"hljs-function\"><span class=\"hljs-params\">(code, options)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>Pass a reference to Babel into the compiler, so that the transpile option\nis available in the Node API. We need to do this so that tools like Webpack\ncan <code>require(&#39;coffeescript&#39;)</code> and build correctly, without trying to\nrequire Babel.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">if</span> options?.transpile\n    options.transpile.transpile = CoffeeScript.transpile\n  universalCompile.call CoffeeScript, code, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>Compile and execute a string of CoffeeScript (on the server), correctly\nsetting <code>__filename</code>, <code>__dirname</code>, and relative <code>require()</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript.run = <span class=\"hljs-function\"><span class=\"hljs-params\">(code, options = {})</span> -&gt;</span>\n  mainModule = <span class=\"hljs-built_in\">require</span>.main</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>Set the filename.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  mainModule.filename = process.argv[<span class=\"hljs-number\">1</span>] =\n    <span class=\"hljs-keyword\">if</span> options.filename <span class=\"hljs-keyword\">then</span> fs.realpathSync(options.filename) <span class=\"hljs-keyword\">else</span> helpers.anonymousFileName()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>Clear the module cache.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  mainModule.moduleCache <span class=\"hljs-keyword\">and</span>= {}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <p>Assign paths for node_modules loading</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  dir = <span class=\"hljs-keyword\">if</span> options.filename?\n    path.dirname fs.realpathSync options.filename\n  <span class=\"hljs-keyword\">else</span>\n    fs.realpathSync <span class=\"hljs-string\">&#x27;.&#x27;</span>\n  mainModule.paths = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">&#x27;module&#x27;</span>)._nodeModulePaths dir</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>Save the options for compiling child imports.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  mainModule.options = options\n\n  options.filename = mainModule.filename\n  options.inlineMap = <span class=\"hljs-literal\">true</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-11\">&#x00a7;</a>\n              </div>\n              <p>Compile.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  answer = CoffeeScript.compile code, options\n  code = answer.js ? answer\n\n  mainModule._compile code, mainModule.filename</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-12\">&#x00a7;</a>\n              </div>\n              <p>Compile and evaluate a string of CoffeeScript (in a Node.js-like environment).\nThe CoffeeScript REPL uses this to run the input.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript.<span class=\"hljs-built_in\">eval</span> = <span class=\"hljs-function\"><span class=\"hljs-params\">(code, options = {})</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> code = code.trim()\n  createContext = vm.Script.createContext ? vm.createContext\n\n  isContext = vm.isContext ? (ctx) -&gt;\n    options.sandbox <span class=\"hljs-keyword\">instanceof</span> createContext().constructor\n\n  <span class=\"hljs-keyword\">if</span> createContext\n    <span class=\"hljs-keyword\">if</span> options.sandbox?\n      <span class=\"hljs-keyword\">if</span> isContext options.sandbox\n        sandbox = options.sandbox\n      <span class=\"hljs-keyword\">else</span>\n        sandbox = createContext()\n        sandbox[k] = v <span class=\"hljs-keyword\">for</span> own k, v <span class=\"hljs-keyword\">of</span> options.sandbox\n      sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox\n    <span class=\"hljs-keyword\">else</span>\n      sandbox = global\n    sandbox.__filename = options.filename || <span class=\"hljs-string\">&#x27;eval&#x27;</span>\n    sandbox.__dirname  = path.dirname sandbox.__filename</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-13\">&#x00a7;</a>\n              </div>\n              <p>define module/require only if they chose not to specify their own</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">unless</span> sandbox <span class=\"hljs-keyword\">isnt</span> global <span class=\"hljs-keyword\">or</span> sandbox.module <span class=\"hljs-keyword\">or</span> sandbox.<span class=\"hljs-built_in\">require</span>\n      Module = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;module&#x27;</span>\n      sandbox.module  = _module  = <span class=\"hljs-keyword\">new</span> Module(options.modulename || <span class=\"hljs-string\">&#x27;eval&#x27;</span>)\n      sandbox.<span class=\"hljs-built_in\">require</span> = _require = <span class=\"hljs-function\"><span class=\"hljs-params\">(path)</span> -&gt;</span>  Module._load path, _module, <span class=\"hljs-literal\">true</span>\n      _module.filename = sandbox.__filename\n      <span class=\"hljs-keyword\">for</span> r <span class=\"hljs-keyword\">in</span> <span class=\"hljs-built_in\">Object</span>.getOwnPropertyNames <span class=\"hljs-built_in\">require</span> <span class=\"hljs-keyword\">when</span> r <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;paths&#x27;</span>, <span class=\"hljs-string\">&#x27;arguments&#x27;</span>, <span class=\"hljs-string\">&#x27;caller&#x27;</span>]\n        _require[r] = <span class=\"hljs-built_in\">require</span>[r]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-14\">&#x00a7;</a>\n              </div>\n              <p>use the same hack node currently uses for their own REPL</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      _require.paths = _module.paths = Module._nodeModulePaths process.cwd()\n      _require.resolve = <span class=\"hljs-function\"><span class=\"hljs-params\">(request)</span> -&gt;</span> Module._resolveFilename request, _module\n  o = {}\n  o[k] = v <span class=\"hljs-keyword\">for</span> own k, v <span class=\"hljs-keyword\">of</span> options\n  o.bare = <span class=\"hljs-literal\">on</span> <span class=\"hljs-comment\"># ensure return value</span>\n  js = CoffeeScript.compile code, o\n  <span class=\"hljs-keyword\">if</span> sandbox <span class=\"hljs-keyword\">is</span> global\n    vm.runInThisContext js\n  <span class=\"hljs-keyword\">else</span>\n    vm.runInContext js, sandbox\n\nCoffeeScript.register = <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./register&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-15\">&#x00a7;</a>\n              </div>\n              <p>Throw error with deprecation warning when depending upon implicit <code>require.extensions</code> registration</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">if</span> <span class=\"hljs-built_in\">require</span>.extensions\n  <span class=\"hljs-keyword\">for</span> ext <span class=\"hljs-keyword\">in</span> CoffeeScript.FILE_EXTENSIONS <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">do</span> (ext) -&gt;\n    <span class=\"hljs-built_in\">require</span>.extensions[ext] ?= <span class=\"hljs-function\">-&gt;</span>\n      <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span> <span class=\"hljs-string\">&quot;&quot;&quot;\n      Use CoffeeScript.register() or require the coffeescript/register module to require <span class=\"hljs-subst\">#{ext}</span> files.\n      &quot;&quot;&quot;</span>\n\nCoffeeScript._compileRawFileContent = <span class=\"hljs-function\"><span class=\"hljs-params\">(raw, filename, options = {})</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-16\">&#x00a7;</a>\n              </div>\n              <p>Strip the Unicode byte order mark, if this file begins with one.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  stripped = <span class=\"hljs-keyword\">if</span> raw.charCodeAt(<span class=\"hljs-number\">0</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0xFEFF</span> <span class=\"hljs-keyword\">then</span> raw.substring <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> raw\n\n  options = <span class=\"hljs-built_in\">Object</span>.assign {}, options,\n    filename: filename\n    literate: helpers.isLiterate filename\n    sourceFiles: [filename]\n\n  <span class=\"hljs-keyword\">try</span>\n    answer = CoffeeScript.compile stripped, options\n  <span class=\"hljs-keyword\">catch</span> err</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-17\">&#x00a7;</a>\n              </div>\n              <p>As the filename and code of a dynamically loaded file will be different\nfrom the original file compiled with CoffeeScript.run, add that\ninformation to error so it can be pretty-printed later.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">throw</span> helpers.updateSyntaxError err, stripped, filename\n\n  answer\n\nCoffeeScript._compileFile = <span class=\"hljs-function\"><span class=\"hljs-params\">(filename, options = {})</span> -&gt;</span>\n  raw = fs.readFileSync filename, <span class=\"hljs-string\">&#x27;utf8&#x27;</span>\n\n  CoffeeScript._compileRawFileContent raw, filename, options\n\nmodule.<span class=\"hljs-built_in\">exports</span> = CoffeeScript</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-18\">&#x00a7;</a>\n              </div>\n              <p>Explicitly define all named exports so that Node’s automatic detection of\nnamed exports from CommonJS packages finds all of them. This enables consuming\npackages to write code like <code>import { compile } from &#39;coffeescript&#39;</code>.\nDon’t simplify this into a loop or similar; the <code>module.exports.name</code> part is\nessential for Node’s algorithm to successfully detect the name.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>module.<span class=\"hljs-built_in\">exports</span>.VERSION = CoffeeScript.VERSION\nmodule.<span class=\"hljs-built_in\">exports</span>.FILE_EXTENSIONS = CoffeeScript.FILE_EXTENSIONS\nmodule.<span class=\"hljs-built_in\">exports</span>.helpers = CoffeeScript.helpers\nmodule.<span class=\"hljs-built_in\">exports</span>.registerCompiled = CoffeeScript.registerCompiled\nmodule.<span class=\"hljs-built_in\">exports</span>.compile = CoffeeScript.compile\nmodule.<span class=\"hljs-built_in\">exports</span>.tokens = CoffeeScript.tokens\nmodule.<span class=\"hljs-built_in\">exports</span>.nodes = CoffeeScript.nodes\nmodule.<span class=\"hljs-built_in\">exports</span>.register = CoffeeScript.register\nmodule.<span class=\"hljs-built_in\">exports</span>.<span class=\"hljs-built_in\">eval</span> = CoffeeScript.<span class=\"hljs-built_in\">eval</span>\nmodule.<span class=\"hljs-built_in\">exports</span>.run = CoffeeScript.run\nmodule.<span class=\"hljs-built_in\">exports</span>.transpile = CoffeeScript.transpile\nmodule.<span class=\"hljs-built_in\">exports</span>.patchStackTrace = CoffeeScript.patchStackTrace\nmodule.<span class=\"hljs-built_in\">exports</span>._compileRawFileContent = CoffeeScript._compileRawFileContent\nmodule.<span class=\"hljs-built_in\">exports</span>._compileFile = CoffeeScript._compileFile</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/lexer.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>lexer.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>lexer.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              <p>The CoffeeScript Lexer. Uses a series of token-matching regexes to attempt\nmatches against the beginning of the source code. When a match is found,\na token is produced, we consume the match, and start again. Tokens are in the\nform:</p>\n<pre><code>[tag, value, locationData]\n</code></pre>\n<p>where locationData is {first_line, first_column, last_line, last_column, last_line_exclusive, last_column_exclusive}, which is a\nformat that can be fed directly into <a href=\"https://github.com/zaach/jison\">Jison</a>.  These\nare read by jison in the <code>parser.lexer</code> function defined in coffeescript.coffee.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n{Rewriter, INVERSES, UNFINISHED} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./rewriter&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>Import the helpers we need.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>{count, starts, compact, repeat, invertLiterate, merge,\nattachCommentsToNode, locationDataToString, throwSyntaxError\nreplaceUnicodeCodePointEscapes, flatten, parseNumber} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./helpers&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <h2 id=\"the-lexer-class\">The Lexer Class</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>The Lexer class reads a stream of CoffeeScript and divvies it up into tagged\ntokens. Some potential ambiguity in the grammar has been avoided by\npushing some extra smarts into the Lexer.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Lexer = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Lexer</span></span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p><strong>tokenize</strong> is the Lexer’s main method. Scan by attempting to match tokens\none at a time, using a regular expression anchored at the start of the\nremaining code, or a custom recursive token-matching method\n(for interpolations). When the next token has been recorded, we move forward\nwithin the code past the token, and begin again.</p>\n<p>Each tokenizing method is responsible for returning the number of characters\nit has consumed.</p>\n<p>Before returning the token stream, run it through the <a href=\"rewriter.html\">Rewriter</a>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  tokenize: <span class=\"hljs-function\"><span class=\"hljs-params\">(code, opts = {})</span> -&gt;</span>\n    @literate   = opts.literate  <span class=\"hljs-comment\"># Are we lexing literate CoffeeScript?</span>\n    @indent     = <span class=\"hljs-number\">0</span>              <span class=\"hljs-comment\"># The current indentation level.</span>\n    @baseIndent = <span class=\"hljs-number\">0</span>              <span class=\"hljs-comment\"># The overall minimum indentation level.</span>\n    @continuationLineAdditionalIndent = <span class=\"hljs-number\">0</span> <span class=\"hljs-comment\"># The over-indentation at the current level.</span>\n    @outdebt    = <span class=\"hljs-number\">0</span>              <span class=\"hljs-comment\"># The under-outdentation at the current level.</span>\n    @indents    = []             <span class=\"hljs-comment\"># The stack of all current indentation levels.</span>\n    @indentLiteral = <span class=\"hljs-string\">&#x27;&#x27;</span>          <span class=\"hljs-comment\"># The indentation.</span>\n    @ends       = []             <span class=\"hljs-comment\"># The stack for pairing up tokens.</span>\n    @tokens     = []             <span class=\"hljs-comment\"># Stream of parsed tokens in the form `[&#x27;TYPE&#x27;, value, location data]`.</span>\n    @seenFor    = <span class=\"hljs-literal\">no</span>             <span class=\"hljs-comment\"># Used to recognize `FORIN`, `FOROF` and `FORFROM` tokens.</span>\n    @seenImport = <span class=\"hljs-literal\">no</span>             <span class=\"hljs-comment\"># Used to recognize `IMPORT FROM? AS?` tokens.</span>\n    @seenExport = <span class=\"hljs-literal\">no</span>             <span class=\"hljs-comment\"># Used to recognize `EXPORT FROM? AS?` tokens.</span>\n    @importSpecifierList = <span class=\"hljs-literal\">no</span>    <span class=\"hljs-comment\"># Used to identify when in an `IMPORT {...} FROM? ...`.</span>\n    @exportSpecifierList = <span class=\"hljs-literal\">no</span>    <span class=\"hljs-comment\"># Used to identify when in an `EXPORT {...} FROM? ...`.</span>\n    @jsxDepth = <span class=\"hljs-number\">0</span>                <span class=\"hljs-comment\"># Used to optimize JSX checks, how deep in JSX we are.</span>\n    @jsxObjAttribute = {}        <span class=\"hljs-comment\"># Used to detect if JSX attributes is wrapped in {} (&lt;div {props...} /&gt;).</span>\n\n    @chunkLine =\n      opts.line <span class=\"hljs-keyword\">or</span> <span class=\"hljs-number\">0</span>             <span class=\"hljs-comment\"># The start line for the current @chunk.</span>\n    @chunkColumn =\n      opts.column <span class=\"hljs-keyword\">or</span> <span class=\"hljs-number\">0</span>           <span class=\"hljs-comment\"># The start column of the current @chunk.</span>\n    @chunkOffset =\n      opts.offset <span class=\"hljs-keyword\">or</span> <span class=\"hljs-number\">0</span>           <span class=\"hljs-comment\"># The start offset for the current @chunk.</span>\n    @locationDataCompensations =\n      opts.locationDataCompensations <span class=\"hljs-keyword\">or</span> {} <span class=\"hljs-comment\"># The location data compensations for the current @chunk.</span>\n    code = @clean code           <span class=\"hljs-comment\"># The stripped, cleaned original source code.</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>At every position, run through this list of attempted matches,\nshort-circuiting if any of them succeed. Their order determines precedence:\n<code>@literalToken</code> is the fallback catch-all.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    i = <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">while</span> @chunk = code[i..]\n      consumed = \\\n           @identifierToken() <span class=\"hljs-keyword\">or</span>\n           @commentToken()    <span class=\"hljs-keyword\">or</span>\n           @whitespaceToken() <span class=\"hljs-keyword\">or</span>\n           @lineToken()       <span class=\"hljs-keyword\">or</span>\n           @stringToken()     <span class=\"hljs-keyword\">or</span>\n           @numberToken()     <span class=\"hljs-keyword\">or</span>\n           @jsxToken()        <span class=\"hljs-keyword\">or</span>\n           @regexToken()      <span class=\"hljs-keyword\">or</span>\n           @jsToken()         <span class=\"hljs-keyword\">or</span>\n           @literalToken()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>Update position.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      [@chunkLine, @chunkColumn, @chunkOffset] = @getLineAndColumnFromChunk consumed\n\n      i += consumed\n\n      <span class=\"hljs-keyword\">return</span> {@tokens, index: i} <span class=\"hljs-keyword\">if</span> opts.untilBalanced <span class=\"hljs-keyword\">and</span> @ends.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n\n    @closeIndentation()\n    @error <span class=\"hljs-string\">&quot;missing <span class=\"hljs-subst\">#{end.tag}</span>&quot;</span>, (end.origin ? end)[<span class=\"hljs-number\">2</span>] <span class=\"hljs-keyword\">if</span> end = @ends.pop()\n    <span class=\"hljs-keyword\">return</span> @tokens <span class=\"hljs-keyword\">if</span> opts.rewrite <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">off</span>\n    (<span class=\"hljs-keyword\">new</span> Rewriter).rewrite @tokens</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <p>Preprocess the code to remove leading and trailing whitespace, carriage\nreturns, etc. If we’re lexing literate CoffeeScript, strip external Markdown\nby removing all lines that aren’t indented by at least four spaces or a tab.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  clean: <span class=\"hljs-function\"><span class=\"hljs-params\">(code)</span> -&gt;</span>\n    thusFar = <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">if</span> code.charCodeAt(<span class=\"hljs-number\">0</span>) <span class=\"hljs-keyword\">is</span> BOM\n      code = code.slice <span class=\"hljs-number\">1</span>\n      @locationDataCompensations[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-number\">1</span>\n      thusFar += <span class=\"hljs-number\">1</span>\n    <span class=\"hljs-keyword\">if</span> WHITESPACE.test code\n      code = <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{code}</span>&quot;</span>\n      @chunkLine--\n      @locationDataCompensations[<span class=\"hljs-number\">0</span>] ?= <span class=\"hljs-number\">0</span>\n      @locationDataCompensations[<span class=\"hljs-number\">0</span>] -= <span class=\"hljs-number\">1</span>\n    code = code\n      .replace <span class=\"hljs-regexp\">/\\r/g</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(match, offset)</span> =&gt;</span>\n        @locationDataCompensations[thusFar + offset] = <span class=\"hljs-number\">1</span>\n        <span class=\"hljs-string\">&#x27;&#x27;</span>\n      .replace TRAILING_SPACES, <span class=\"hljs-string\">&#x27;&#x27;</span>\n    code = invertLiterate code <span class=\"hljs-keyword\">if</span> @literate\n    code</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <h2 id=\"tokenizers\">Tokenizers</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-11\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-12\">&#x00a7;</a>\n              </div>\n              <p>Matches identifying literals: variables, keywords, method names, etc.\nCheck to ensure that JavaScript reserved words aren’t being used as\nidentifiers. Because CoffeeScript reserves a handful of keywords that are\nallowed in JavaScript, we’re careful not to tag them as keywords when\nreferenced as property names here, so you can still do <code>jQuery.is()</code> even\nthough <code>is</code> means <code>===</code> otherwise.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  identifierToken: <span class=\"hljs-function\">-&gt;</span>\n    inJSXTag = @atJSXTag()\n    regex = <span class=\"hljs-keyword\">if</span> inJSXTag <span class=\"hljs-keyword\">then</span> JSX_ATTRIBUTE <span class=\"hljs-keyword\">else</span> IDENTIFIER\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> match = regex.exec @chunk\n    [input, id, colon] = match</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-13\">&#x00a7;</a>\n              </div>\n              <p>Preserve length of id for location data</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    idLength = id.length\n    poppedToken = <span class=\"hljs-literal\">undefined</span>\n    <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;own&#x27;</span> <span class=\"hljs-keyword\">and</span> @tag() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;FOR&#x27;</span>\n      @token <span class=\"hljs-string\">&#x27;OWN&#x27;</span>, id\n      <span class=\"hljs-keyword\">return</span> id.length\n    <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;from&#x27;</span> <span class=\"hljs-keyword\">and</span> @tag() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;YIELD&#x27;</span>\n      @token <span class=\"hljs-string\">&#x27;FROM&#x27;</span>, id\n      <span class=\"hljs-keyword\">return</span> id.length\n    <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;as&#x27;</span> <span class=\"hljs-keyword\">and</span> @seenImport\n      <span class=\"hljs-keyword\">if</span> @value() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;*&#x27;</span>\n        @tokens[@tokens.length - <span class=\"hljs-number\">1</span>][<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;IMPORT_ALL&#x27;</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @value(<span class=\"hljs-literal\">yes</span>) <span class=\"hljs-keyword\">in</span> COFFEE_KEYWORDS\n        prev = @prev()\n        [prev[<span class=\"hljs-number\">0</span>], prev[<span class=\"hljs-number\">1</span>]] = [<span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>, @value(<span class=\"hljs-literal\">yes</span>)]\n      <span class=\"hljs-keyword\">if</span> @tag() <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;DEFAULT&#x27;</span>, <span class=\"hljs-string\">&#x27;IMPORT_ALL&#x27;</span>, <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>]\n        @token <span class=\"hljs-string\">&#x27;AS&#x27;</span>, id\n        <span class=\"hljs-keyword\">return</span> id.length\n    <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;as&#x27;</span> <span class=\"hljs-keyword\">and</span> @seenExport\n      <span class=\"hljs-keyword\">if</span> @tag() <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>, <span class=\"hljs-string\">&#x27;DEFAULT&#x27;</span>]\n        @token <span class=\"hljs-string\">&#x27;AS&#x27;</span>, id\n        <span class=\"hljs-keyword\">return</span> id.length\n      <span class=\"hljs-keyword\">if</span> @value(<span class=\"hljs-literal\">yes</span>) <span class=\"hljs-keyword\">in</span> COFFEE_KEYWORDS\n        prev = @prev()\n        [prev[<span class=\"hljs-number\">0</span>], prev[<span class=\"hljs-number\">1</span>]] = [<span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>, @value(<span class=\"hljs-literal\">yes</span>)]\n        @token <span class=\"hljs-string\">&#x27;AS&#x27;</span>, id\n        <span class=\"hljs-keyword\">return</span> id.length\n    <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;default&#x27;</span> <span class=\"hljs-keyword\">and</span> @seenExport <span class=\"hljs-keyword\">and</span> @tag() <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;EXPORT&#x27;</span>, <span class=\"hljs-string\">&#x27;AS&#x27;</span>]\n      @token <span class=\"hljs-string\">&#x27;DEFAULT&#x27;</span>, id\n      <span class=\"hljs-keyword\">return</span> id.length\n    <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;assert&#x27;</span> <span class=\"hljs-keyword\">and</span> (@seenImport <span class=\"hljs-keyword\">or</span> @seenExport) <span class=\"hljs-keyword\">and</span> @tag() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;STRING&#x27;</span>\n      @token <span class=\"hljs-string\">&#x27;ASSERT&#x27;</span>, id\n      <span class=\"hljs-keyword\">return</span> id.length\n    <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;do&#x27;</span> <span class=\"hljs-keyword\">and</span> regExSuper = <span class=\"hljs-regexp\">/^(\\s*super)(?!\\(\\))/</span>.exec @chunk[<span class=\"hljs-number\">3.</span>..]\n      @token <span class=\"hljs-string\">&#x27;SUPER&#x27;</span>, <span class=\"hljs-string\">&#x27;super&#x27;</span>\n      @token <span class=\"hljs-string\">&#x27;CALL_START&#x27;</span>, <span class=\"hljs-string\">&#x27;(&#x27;</span>\n      @token <span class=\"hljs-string\">&#x27;CALL_END&#x27;</span>, <span class=\"hljs-string\">&#x27;)&#x27;</span>\n      [input, sup] = regExSuper\n      <span class=\"hljs-keyword\">return</span> sup.length + <span class=\"hljs-number\">3</span>\n\n    prev = @prev()\n\n    tag =\n      <span class=\"hljs-keyword\">if</span> colon <span class=\"hljs-keyword\">or</span> prev? <span class=\"hljs-keyword\">and</span>\n         (prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;.&#x27;</span>, <span class=\"hljs-string\">&#x27;?.&#x27;</span>, <span class=\"hljs-string\">&#x27;::&#x27;</span>, <span class=\"hljs-string\">&#x27;?::&#x27;</span>] <span class=\"hljs-keyword\">or</span>\n         <span class=\"hljs-keyword\">not</span> prev.spaced <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;@&#x27;</span>)\n        <span class=\"hljs-string\">&#x27;PROPERTY&#x27;</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>\n\n    tokenData = {}\n    <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span> <span class=\"hljs-keyword\">and</span> (id <span class=\"hljs-keyword\">in</span> JS_KEYWORDS <span class=\"hljs-keyword\">or</span> id <span class=\"hljs-keyword\">in</span> COFFEE_KEYWORDS) <span class=\"hljs-keyword\">and</span>\n       <span class=\"hljs-keyword\">not</span> (@exportSpecifierList <span class=\"hljs-keyword\">and</span> id <span class=\"hljs-keyword\">in</span> COFFEE_KEYWORDS)\n      tag = id.toUpperCase()\n      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;WHEN&#x27;</span> <span class=\"hljs-keyword\">and</span> @tag() <span class=\"hljs-keyword\">in</span> LINE_BREAK\n        tag = <span class=\"hljs-string\">&#x27;LEADING_WHEN&#x27;</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;FOR&#x27;</span>\n        @seenFor = {endsLength: @ends.length}\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;UNLESS&#x27;</span>\n        tag = <span class=\"hljs-string\">&#x27;IF&#x27;</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IMPORT&#x27;</span>\n        @seenImport = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;EXPORT&#x27;</span>\n        @seenExport = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> UNARY\n        tag = <span class=\"hljs-string\">&#x27;UNARY&#x27;</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> RELATION\n        <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;INSTANCEOF&#x27;</span> <span class=\"hljs-keyword\">and</span> @seenFor\n          tag = <span class=\"hljs-string\">&#x27;FOR&#x27;</span> + tag\n          @seenFor = <span class=\"hljs-literal\">no</span>\n        <span class=\"hljs-keyword\">else</span>\n          tag = <span class=\"hljs-string\">&#x27;RELATION&#x27;</span>\n          <span class=\"hljs-keyword\">if</span> @value() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;!&#x27;</span>\n            poppedToken = @tokens.pop()\n            tokenData.invert = poppedToken.data?.original ? poppedToken[<span class=\"hljs-number\">1</span>]\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span> <span class=\"hljs-keyword\">and</span> @seenFor <span class=\"hljs-keyword\">and</span> id <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;from&#x27;</span> <span class=\"hljs-keyword\">and</span>\n       isForFrom(prev)\n      tag = <span class=\"hljs-string\">&#x27;FORFROM&#x27;</span>\n      @seenFor = <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-14\">&#x00a7;</a>\n              </div>\n              <p>Throw an error on attempts to use <code>get</code> or <code>set</code> as keywords, or\nwhat CoffeeScript would normally interpret as calls to functions named\n<code>get</code> or <code>set</code>, i.e. <code>get({foo: function () {}})</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;PROPERTY&#x27;</span> <span class=\"hljs-keyword\">and</span> prev\n      <span class=\"hljs-keyword\">if</span> prev.spaced <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> CALLABLE <span class=\"hljs-keyword\">and</span> <span class=\"hljs-regexp\">/^[gs]et$/</span>.test(prev[<span class=\"hljs-number\">1</span>]) <span class=\"hljs-keyword\">and</span>\n         @tokens.length &gt; <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> @tokens[@tokens.length - <span class=\"hljs-number\">2</span>][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;.&#x27;</span>, <span class=\"hljs-string\">&#x27;?.&#x27;</span>, <span class=\"hljs-string\">&#x27;@&#x27;</span>]\n        @error <span class=\"hljs-string\">&quot;&#x27;<span class=\"hljs-subst\">#{prev[<span class=\"hljs-number\">1</span>]}</span>&#x27; cannot be used as a keyword, or as a function call\n        without parentheses&quot;</span>, prev[<span class=\"hljs-number\">2</span>]\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;.&#x27;</span> <span class=\"hljs-keyword\">and</span> @tokens.length &gt; <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> (prevprev = @tokens[@tokens.length - <span class=\"hljs-number\">2</span>])[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;UNARY&#x27;</span> <span class=\"hljs-keyword\">and</span> prevprev[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;new&#x27;</span>\n        prevprev[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;NEW_TARGET&#x27;</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;.&#x27;</span> <span class=\"hljs-keyword\">and</span> @tokens.length &gt; <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> (prevprev = @tokens[@tokens.length - <span class=\"hljs-number\">2</span>])[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IMPORT&#x27;</span> <span class=\"hljs-keyword\">and</span> prevprev[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;import&#x27;</span>\n        @seenImport = <span class=\"hljs-literal\">no</span>\n        prevprev[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;IMPORT_META&#x27;</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @tokens.length &gt; <span class=\"hljs-number\">2</span>\n        prevprev = @tokens[@tokens.length - <span class=\"hljs-number\">2</span>]\n        <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;@&#x27;</span>, <span class=\"hljs-string\">&#x27;THIS&#x27;</span>] <span class=\"hljs-keyword\">and</span> prevprev <span class=\"hljs-keyword\">and</span> prevprev.spaced <span class=\"hljs-keyword\">and</span>\n           <span class=\"hljs-regexp\">/^[gs]et$/</span>.test(prevprev[<span class=\"hljs-number\">1</span>]) <span class=\"hljs-keyword\">and</span>\n           @tokens[@tokens.length - <span class=\"hljs-number\">3</span>][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;.&#x27;</span>, <span class=\"hljs-string\">&#x27;?.&#x27;</span>, <span class=\"hljs-string\">&#x27;@&#x27;</span>]\n          @error <span class=\"hljs-string\">&quot;&#x27;<span class=\"hljs-subst\">#{prevprev[<span class=\"hljs-number\">1</span>]}</span>&#x27; cannot be used as a keyword, or as a\n          function call without parentheses&quot;</span>, prevprev[<span class=\"hljs-number\">2</span>]\n\n    <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span> <span class=\"hljs-keyword\">and</span> id <span class=\"hljs-keyword\">in</span> RESERVED <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> inJSXTag\n      @error <span class=\"hljs-string\">&quot;reserved word &#x27;<span class=\"hljs-subst\">#{id}</span>&#x27;&quot;</span>, length: id.length\n\n    <span class=\"hljs-keyword\">unless</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;PROPERTY&#x27;</span> <span class=\"hljs-keyword\">or</span> @exportSpecifierList <span class=\"hljs-keyword\">or</span> @importSpecifierList\n      <span class=\"hljs-keyword\">if</span> id <span class=\"hljs-keyword\">in</span> COFFEE_ALIASES\n        alias = id\n        id = COFFEE_ALIAS_MAP[id]\n        tokenData.original = alias\n      tag = <span class=\"hljs-keyword\">switch</span> id\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;!&#x27;</span>                 <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;UNARY&#x27;</span>\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;==&#x27;</span>, <span class=\"hljs-string\">&#x27;!=&#x27;</span>          <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;COMPARE&#x27;</span>\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;true&#x27;</span>, <span class=\"hljs-string\">&#x27;false&#x27;</span>     <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;BOOL&#x27;</span>\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;break&#x27;</span>, <span class=\"hljs-string\">&#x27;continue&#x27;</span>, \\\n             <span class=\"hljs-string\">&#x27;debugger&#x27;</span>          <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;STATEMENT&#x27;</span>\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;&amp;&amp;&#x27;</span>, <span class=\"hljs-string\">&#x27;||&#x27;</span>          <span class=\"hljs-keyword\">then</span> id\n        <span class=\"hljs-keyword\">else</span>  tag\n\n    tagToken = @token tag, id, length: idLength, data: tokenData\n    tagToken.origin = [tag, alias, tagToken[<span class=\"hljs-number\">2</span>]] <span class=\"hljs-keyword\">if</span> alias\n    <span class=\"hljs-keyword\">if</span> poppedToken\n      [tagToken[<span class=\"hljs-number\">2</span>].first_line, tagToken[<span class=\"hljs-number\">2</span>].first_column, tagToken[<span class=\"hljs-number\">2</span>].range[<span class=\"hljs-number\">0</span>]] =\n        [poppedToken[<span class=\"hljs-number\">2</span>].first_line, poppedToken[<span class=\"hljs-number\">2</span>].first_column, poppedToken[<span class=\"hljs-number\">2</span>].range[<span class=\"hljs-number\">0</span>]]\n    <span class=\"hljs-keyword\">if</span> colon\n      colonOffset = input.lastIndexOf <span class=\"hljs-keyword\">if</span> inJSXTag <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;=&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;:&#x27;</span>\n      colonToken = @token <span class=\"hljs-string\">&#x27;:&#x27;</span>, <span class=\"hljs-string\">&#x27;:&#x27;</span>, offset: colonOffset\n      colonToken.jsxColon = <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> inJSXTag <span class=\"hljs-comment\"># used by rewriter</span>\n    <span class=\"hljs-keyword\">if</span> inJSXTag <span class=\"hljs-keyword\">and</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span> <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;:&#x27;</span>\n      @token <span class=\"hljs-string\">&#x27;,&#x27;</span>, <span class=\"hljs-string\">&#x27;,&#x27;</span>, length: <span class=\"hljs-number\">0</span>, origin: tagToken, generated: <span class=\"hljs-literal\">yes</span>\n\n    input.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-15\">&#x00a7;</a>\n              </div>\n              <p>Matches numbers, including decimals, hex, and exponential notation.\nBe careful not to interfere with ranges in progress.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  numberToken: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> match = NUMBER.exec @chunk\n\n    number = match[<span class=\"hljs-number\">0</span>]\n    lexedLength = number.length\n\n    <span class=\"hljs-keyword\">switch</span>\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-regexp\">/^0[BOX]/</span>.test number\n        @error <span class=\"hljs-string\">&quot;radix prefix in &#x27;<span class=\"hljs-subst\">#{number}</span>&#x27; must be lowercase&quot;</span>, offset: <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-regexp\">/^0\\d*[89]/</span>.test number\n        @error <span class=\"hljs-string\">&quot;decimal literal &#x27;<span class=\"hljs-subst\">#{number}</span>&#x27; must not be prefixed with &#x27;0&#x27;&quot;</span>, length: lexedLength\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-regexp\">/^0\\d+/</span>.test number\n        @error <span class=\"hljs-string\">&quot;octal literal &#x27;<span class=\"hljs-subst\">#{number}</span>&#x27; must be prefixed with &#x27;0o&#x27;&quot;</span>, length: lexedLength\n\n    parsedValue = parseNumber number\n    tokenData = {parsedValue}\n\n    tag = <span class=\"hljs-keyword\">if</span> parsedValue <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">Infinity</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;INFINITY&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;NUMBER&#x27;</span>\n    <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;INFINITY&#x27;</span>\n      tokenData.original = number\n    @token tag, number,\n      length: lexedLength\n      data: tokenData\n    lexedLength</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-16\">&#x00a7;</a>\n              </div>\n              <p>Matches strings, including multiline strings, as well as heredocs, with or without\ninterpolation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  stringToken: <span class=\"hljs-function\">-&gt;</span>\n    [quote] = STRING_START.exec(@chunk) || []\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> quote</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-17\">&#x00a7;</a>\n              </div>\n              <p>If the preceding token is <code>from</code> and this is an import or export statement,\nproperly tag the <code>from</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    prev = @prev()\n    <span class=\"hljs-keyword\">if</span> prev <span class=\"hljs-keyword\">and</span> @value() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;from&#x27;</span> <span class=\"hljs-keyword\">and</span> (@seenImport <span class=\"hljs-keyword\">or</span> @seenExport)\n      prev[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;FROM&#x27;</span>\n\n    regex = <span class=\"hljs-keyword\">switch</span> quote\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&quot;&#x27;&quot;</span>   <span class=\"hljs-keyword\">then</span> STRING_SINGLE\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;&quot;&#x27;</span>   <span class=\"hljs-keyword\">then</span> STRING_DOUBLE\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&quot;&#x27;&#x27;&#x27;&quot;</span> <span class=\"hljs-keyword\">then</span> HEREDOC_SINGLE\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;&quot;&quot;&quot;&#x27;</span> <span class=\"hljs-keyword\">then</span> HEREDOC_DOUBLE\n\n    {tokens, index: end} = @matchWithInterpolations regex, quote\n\n    heredoc = quote.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">3</span>\n    <span class=\"hljs-keyword\">if</span> heredoc</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-18\">&#x00a7;</a>\n              </div>\n              <p>Find the smallest indentation. It will be removed from all lines later.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      indent = <span class=\"hljs-literal\">null</span>\n      doc = (token[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">for</span> token, i <span class=\"hljs-keyword\">in</span> tokens <span class=\"hljs-keyword\">when</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;NEOSTRING&#x27;</span>).join <span class=\"hljs-string\">&#x27;#{}&#x27;</span>\n      <span class=\"hljs-keyword\">while</span> match = HEREDOC_INDENT.exec doc\n        attempt = match[<span class=\"hljs-number\">1</span>]\n        indent = attempt <span class=\"hljs-keyword\">if</span> indent <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">null</span> <span class=\"hljs-keyword\">or</span> <span class=\"hljs-number\">0</span> &lt; attempt.length &lt; indent.length\n\n    delimiter = quote.charAt(<span class=\"hljs-number\">0</span>)\n    @mergeInterpolationTokens tokens, {quote, indent, endOffset: end}, <span class=\"hljs-function\"><span class=\"hljs-params\">(value)</span> =&gt;</span>\n      @validateUnicodeCodePointEscapes value, delimiter: quote\n\n    <span class=\"hljs-keyword\">if</span> @atJSXTag()\n      @token <span class=\"hljs-string\">&#x27;,&#x27;</span>, <span class=\"hljs-string\">&#x27;,&#x27;</span>, length: <span class=\"hljs-number\">0</span>, origin: @prev, generated: <span class=\"hljs-literal\">yes</span>\n\n    end</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-19\">&#x00a7;</a>\n              </div>\n              <p>Matches and consumes comments. The comments are taken out of the token\nstream and saved for later, to be reinserted into the output after\neverything has been parsed and the JavaScript code generated.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  commentToken: <span class=\"hljs-function\"><span class=\"hljs-params\">(chunk = @chunk, {heregex, returnCommentTokens = <span class=\"hljs-literal\">no</span>, offsetInChunk = <span class=\"hljs-number\">0</span>} = {})</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> match = chunk.match COMMENT\n    [commentWithSurroundingWhitespace, hereLeadingWhitespace, hereComment, hereTrailingWhitespace, lineComment] = match\n    contents = <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-20\">&#x00a7;</a>\n              </div>\n              <p>Does this comment follow code on the same line?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    leadingNewline = <span class=\"hljs-regexp\">/^\\s*\\n+\\s*#/</span>.test commentWithSurroundingWhitespace\n    <span class=\"hljs-keyword\">if</span> hereComment\n      matchIllegal = HERECOMMENT_ILLEGAL.exec hereComment\n      <span class=\"hljs-keyword\">if</span> matchIllegal\n        @error <span class=\"hljs-string\">&quot;block comments cannot contain <span class=\"hljs-subst\">#{matchIllegal[<span class=\"hljs-number\">0</span>]}</span>&quot;</span>,\n          offset: <span class=\"hljs-string\">&#x27;###&#x27;</span>.length + matchIllegal.index, length: matchIllegal[<span class=\"hljs-number\">0</span>].length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-21\">&#x00a7;</a>\n              </div>\n              <p>Parse indentation or outdentation as if this block comment didn’t exist.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      chunk = chunk.replace <span class=\"hljs-string\">&quot;###<span class=\"hljs-subst\">#{hereComment}</span>###&quot;</span>, <span class=\"hljs-string\">&#x27;&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-22\">&#x00a7;</a>\n              </div>\n              <p>Remove leading newlines, like <code>Rewriter::removeLeadingNewlines</code>, to\navoid the creation of unwanted <code>TERMINATOR</code> tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      chunk = chunk.replace <span class=\"hljs-regexp\">/^\\n+/</span>, <span class=\"hljs-string\">&#x27;&#x27;</span>\n      @lineToken {chunk}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-23\">&#x00a7;</a>\n              </div>\n              <p>Pull out the ###-style comment’s content, and format it.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      content = hereComment\n      contents = [{\n        content\n        length: commentWithSurroundingWhitespace.length - hereLeadingWhitespace.length - hereTrailingWhitespace.length\n        leadingWhitespace: hereLeadingWhitespace\n      }]\n    <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-24\">&#x00a7;</a>\n              </div>\n              <p>The <code>COMMENT</code> regex captures successive line comments as one token.\nRemove any leading newlines before the first comment, but preserve\nblank lines between line comments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      leadingNewlines = <span class=\"hljs-string\">&#x27;&#x27;</span>\n      content = lineComment.replace <span class=\"hljs-regexp\">/^(\\n*)/</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(leading)</span> -&gt;</span>\n        leadingNewlines = leading\n        <span class=\"hljs-string\">&#x27;&#x27;</span>\n      precedingNonCommentLines = <span class=\"hljs-string\">&#x27;&#x27;</span>\n      hasSeenFirstCommentLine = <span class=\"hljs-literal\">no</span>\n      contents =\n        content.split <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n        .map (line, index) -&gt;\n          <span class=\"hljs-keyword\">unless</span> line.indexOf(<span class=\"hljs-string\">&#x27;#&#x27;</span>) &gt; <span class=\"hljs-number\">-1</span>\n            precedingNonCommentLines += <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{line}</span>&quot;</span>\n            <span class=\"hljs-keyword\">return</span>\n          leadingWhitespace = <span class=\"hljs-string\">&#x27;&#x27;</span>\n          content = line.replace <span class=\"hljs-regexp\">/^([ |\\t]*)#/</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(_, whitespace)</span> -&gt;</span>\n            leadingWhitespace = whitespace\n            <span class=\"hljs-string\">&#x27;&#x27;</span>\n          comment = {\n            content\n            length: <span class=\"hljs-string\">&#x27;#&#x27;</span>.length + content.length\n            leadingWhitespace: <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">unless</span> hasSeenFirstCommentLine <span class=\"hljs-keyword\">then</span> leadingNewlines <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>}</span><span class=\"hljs-subst\">#{precedingNonCommentLines}</span><span class=\"hljs-subst\">#{leadingWhitespace}</span>&quot;</span>\n            precededByBlankLine: !!precedingNonCommentLines\n          }\n          hasSeenFirstCommentLine = <span class=\"hljs-literal\">yes</span>\n          precedingNonCommentLines = <span class=\"hljs-string\">&#x27;&#x27;</span>\n          comment\n        .filter (comment) -&gt; comment\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">getIndentSize</span> = <span class=\"hljs-params\">({leadingWhitespace, nonInitial})</span> -&gt;</span>\n      lastNewlineIndex = leadingWhitespace.lastIndexOf <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n      <span class=\"hljs-keyword\">if</span> hereComment? <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> nonInitial\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">null</span> <span class=\"hljs-keyword\">unless</span> lastNewlineIndex &gt; <span class=\"hljs-number\">-1</span>\n      <span class=\"hljs-keyword\">else</span>\n        lastNewlineIndex ?= <span class=\"hljs-number\">-1</span>\n      leadingWhitespace.length - <span class=\"hljs-number\">1</span> - lastNewlineIndex\n    commentAttachments = <span class=\"hljs-keyword\">for</span> {content, length, leadingWhitespace, precededByBlankLine}, i <span class=\"hljs-keyword\">in</span> contents\n      nonInitial = i <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n      leadingNewlineOffset = <span class=\"hljs-keyword\">if</span> nonInitial <span class=\"hljs-keyword\">then</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-number\">0</span>\n      offsetInChunk += leadingNewlineOffset + leadingWhitespace.length\n      indentSize = getIndentSize {leadingWhitespace, nonInitial}\n      noIndent = <span class=\"hljs-keyword\">not</span> indentSize? <span class=\"hljs-keyword\">or</span> indentSize <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">-1</span>\n      commentAttachment = {\n        content\n        here: hereComment?\n        newLine: leadingNewline <span class=\"hljs-keyword\">or</span> nonInitial <span class=\"hljs-comment\"># Line comments after the first one start new lines, by definition.</span>\n        locationData: @makeLocationData {offsetInChunk, length}\n        precededByBlankLine\n        indentSize\n        indented:  <span class=\"hljs-keyword\">not</span> noIndent <span class=\"hljs-keyword\">and</span> indentSize &gt; @indent\n        outdented: <span class=\"hljs-keyword\">not</span> noIndent <span class=\"hljs-keyword\">and</span> indentSize &lt; @indent\n      }\n      commentAttachment.heregex = <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> heregex\n      offsetInChunk += length\n      commentAttachment\n\n    prev = @prev()\n    <span class=\"hljs-keyword\">unless</span> prev</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-25\">&#x00a7;</a>\n              </div>\n              <p>If there’s no previous token, create a placeholder token to attach\nthis comment to; and follow with a newline.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      commentAttachments[<span class=\"hljs-number\">0</span>].newLine = <span class=\"hljs-literal\">yes</span>\n      @lineToken chunk: @chunk[commentWithSurroundingWhitespace.length..], offset: commentWithSurroundingWhitespace.length <span class=\"hljs-comment\"># Set the indent.</span>\n      placeholderToken = @makeToken <span class=\"hljs-string\">&#x27;JS&#x27;</span>, <span class=\"hljs-string\">&#x27;&#x27;</span>, offset: commentWithSurroundingWhitespace.length, generated: <span class=\"hljs-literal\">yes</span>\n      placeholderToken.comments = commentAttachments\n      @tokens.push placeholderToken\n      @newlineToken commentWithSurroundingWhitespace.length\n    <span class=\"hljs-keyword\">else</span>\n      attachCommentsToNode commentAttachments, prev\n\n    <span class=\"hljs-keyword\">return</span> commentAttachments <span class=\"hljs-keyword\">if</span> returnCommentTokens\n    commentWithSurroundingWhitespace.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-26\">&#x00a7;</a>\n              </div>\n              <p>Matches JavaScript interpolated directly into the source via backticks.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  jsToken: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> @chunk.charAt(<span class=\"hljs-number\">0</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;`&#x27;</span> <span class=\"hljs-keyword\">and</span>\n      (match = (matchedHere = HERE_JSTOKEN.exec(@chunk)) <span class=\"hljs-keyword\">or</span> JSTOKEN.exec(@chunk))</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-27\">&#x00a7;</a>\n              </div>\n              <p>Convert escaped backticks to backticks, and escaped backslashes\njust before escaped backticks to backslashes</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    script = match[<span class=\"hljs-number\">1</span>]\n    {length} = match[<span class=\"hljs-number\">0</span>]\n    @token <span class=\"hljs-string\">&#x27;JS&#x27;</span>, script, {length, data: {here: !!matchedHere}}\n    length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-28\">&#x00a7;</a>\n              </div>\n              <p>Matches regular expression literals, as well as multiline extended ones.\nLexing regular expressions is difficult to distinguish from division, so we\nborrow some basic heuristics from JavaScript and Ruby.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  regexToken: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">switch</span>\n      <span class=\"hljs-keyword\">when</span> match = REGEX_ILLEGAL.exec @chunk\n        @error <span class=\"hljs-string\">&quot;regular expressions cannot begin with <span class=\"hljs-subst\">#{match[<span class=\"hljs-number\">2</span>]}</span>&quot;</span>,\n          offset: match.index + match[<span class=\"hljs-number\">1</span>].length\n      <span class=\"hljs-keyword\">when</span> match = @matchWithInterpolations HEREGEX, <span class=\"hljs-string\">&#x27;///&#x27;</span>\n        {tokens, index} = match\n        comments = []\n        <span class=\"hljs-keyword\">while</span> matchedComment = HEREGEX_COMMENT.exec @chunk[<span class=\"hljs-number\">0.</span>..index]\n          {index: commentIndex} = matchedComment\n          [fullMatch, leadingWhitespace, comment] = matchedComment\n          comments.push {comment, offsetInChunk: commentIndex + leadingWhitespace.length}\n        commentTokens = flatten(\n          <span class=\"hljs-keyword\">for</span> commentOpts <span class=\"hljs-keyword\">in</span> comments\n            @commentToken commentOpts.comment, <span class=\"hljs-built_in\">Object</span>.assign commentOpts, heregex: <span class=\"hljs-literal\">yes</span>, returnCommentTokens: <span class=\"hljs-literal\">yes</span>\n        )\n      <span class=\"hljs-keyword\">when</span> match = REGEX.exec @chunk\n        [regex, body, closed] = match\n        @validateEscapes body, isRegex: <span class=\"hljs-literal\">yes</span>, offsetInChunk: <span class=\"hljs-number\">1</span>\n        index = regex.length\n        prev = @prev()\n        <span class=\"hljs-keyword\">if</span> prev\n          <span class=\"hljs-keyword\">if</span> prev.spaced <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> CALLABLE\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> closed <span class=\"hljs-keyword\">or</span> POSSIBLY_DIVISION.test regex\n          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> NOT_REGEX\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>\n        @error <span class=\"hljs-string\">&#x27;missing / (unclosed regex)&#x27;</span> <span class=\"hljs-keyword\">unless</span> closed\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>\n\n    [flags] = REGEX_FLAGS.exec @chunk[index..]\n    end = index + flags.length\n    origin = @makeToken <span class=\"hljs-string\">&#x27;REGEX&#x27;</span>, <span class=\"hljs-literal\">null</span>, length: end\n    <span class=\"hljs-keyword\">switch</span>\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-keyword\">not</span> VALID_FLAGS.test flags\n        @error <span class=\"hljs-string\">&quot;invalid regular expression flags <span class=\"hljs-subst\">#{flags}</span>&quot;</span>, offset: index, length: flags.length\n      <span class=\"hljs-keyword\">when</span> regex <span class=\"hljs-keyword\">or</span> tokens.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span>\n        delimiter = <span class=\"hljs-keyword\">if</span> body <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;/&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;///&#x27;</span>\n        body ?= tokens[<span class=\"hljs-number\">0</span>][<span class=\"hljs-number\">1</span>]\n        @validateUnicodeCodePointEscapes body, {delimiter}\n        @token <span class=\"hljs-string\">&#x27;REGEX&#x27;</span>, <span class=\"hljs-string\">&quot;/<span class=\"hljs-subst\">#{body}</span>/<span class=\"hljs-subst\">#{flags}</span>&quot;</span>, {length: end, origin, data: {delimiter}}\n      <span class=\"hljs-keyword\">else</span>\n        @token <span class=\"hljs-string\">&#x27;REGEX_START&#x27;</span>, <span class=\"hljs-string\">&#x27;(&#x27;</span>,    {length: <span class=\"hljs-number\">0</span>, origin, generated: <span class=\"hljs-literal\">yes</span>}\n        @token <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>, <span class=\"hljs-string\">&#x27;RegExp&#x27;</span>, length: <span class=\"hljs-number\">0</span>, generated: <span class=\"hljs-literal\">yes</span>\n        @token <span class=\"hljs-string\">&#x27;CALL_START&#x27;</span>, <span class=\"hljs-string\">&#x27;(&#x27;</span>,      length: <span class=\"hljs-number\">0</span>, generated: <span class=\"hljs-literal\">yes</span>\n        @mergeInterpolationTokens tokens, {double: <span class=\"hljs-literal\">yes</span>, heregex: {flags}, endOffset: end - flags.length, quote: <span class=\"hljs-string\">&#x27;///&#x27;</span>}, <span class=\"hljs-function\"><span class=\"hljs-params\">(str)</span> =&gt;</span>\n          @validateUnicodeCodePointEscapes str, {delimiter}\n        <span class=\"hljs-keyword\">if</span> flags\n          @token <span class=\"hljs-string\">&#x27;,&#x27;</span>, <span class=\"hljs-string\">&#x27;,&#x27;</span>,                    offset: index - <span class=\"hljs-number\">1</span>, length: <span class=\"hljs-number\">0</span>, generated: <span class=\"hljs-literal\">yes</span>\n          @token <span class=\"hljs-string\">&#x27;STRING&#x27;</span>, <span class=\"hljs-string\">&#x27;&quot;&#x27;</span> + flags + <span class=\"hljs-string\">&#x27;&quot;&#x27;</span>, offset: index,     length: flags.length\n        @token <span class=\"hljs-string\">&#x27;)&#x27;</span>, <span class=\"hljs-string\">&#x27;)&#x27;</span>,                      offset: end,       length: <span class=\"hljs-number\">0</span>, generated: <span class=\"hljs-literal\">yes</span>\n        @token <span class=\"hljs-string\">&#x27;REGEX_END&#x27;</span>, <span class=\"hljs-string\">&#x27;)&#x27;</span>,              offset: end,       length: <span class=\"hljs-number\">0</span>, generated: <span class=\"hljs-literal\">yes</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-29\">&#x00a7;</a>\n              </div>\n              <p>Explicitly attach any heregex comments to the REGEX/REGEX_END token.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> commentTokens?.length\n      addTokenData @tokens[@tokens.length - <span class=\"hljs-number\">1</span>],\n        heregexCommentTokens: commentTokens\n\n    end</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-30\">&#x00a7;</a>\n              </div>\n              <p>Matches newlines, indents, and outdents, and determines which is which.\nIf we can detect that the current line is continued onto the next line,\nthen the newline is suppressed:</p>\n<pre><code>elements\n  .each( ... )\n  .map( ... )\n</code></pre>\n<p>Keeps track of the level of indentation, because a single outdent token\ncan close multiple indents, so we need to know how far in we happen to be.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  lineToken: <span class=\"hljs-function\"><span class=\"hljs-params\">({chunk = @chunk, offset = <span class=\"hljs-number\">0</span>} = {})</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> match = MULTI_DENT.exec chunk\n    indent = match[<span class=\"hljs-number\">0</span>]\n\n    prev = @prev()\n    backslash = prev?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;\\\\&#x27;</span>\n    @seenFor = <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> (backslash <span class=\"hljs-keyword\">or</span> @seenFor?.endsLength &lt; @ends.length) <span class=\"hljs-keyword\">and</span> @seenFor\n    @seenImport = <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> (backslash <span class=\"hljs-keyword\">and</span> @seenImport) <span class=\"hljs-keyword\">or</span> @importSpecifierList\n    @seenExport = <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> (backslash <span class=\"hljs-keyword\">and</span> @seenExport) <span class=\"hljs-keyword\">or</span> @exportSpecifierList\n\n    size = indent.length - <span class=\"hljs-number\">1</span> - indent.lastIndexOf <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n    noNewlines = @unfinished()\n\n    newIndentLiteral = <span class=\"hljs-keyword\">if</span> size &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> indent[-size..] <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n    <span class=\"hljs-keyword\">unless</span> <span class=\"hljs-regexp\">/^(.?)\\1*$/</span>.exec newIndentLiteral\n      @error <span class=\"hljs-string\">&#x27;mixed indentation&#x27;</span>, offset: indent.length\n      <span class=\"hljs-keyword\">return</span> indent.length\n\n    minLiteralLength = <span class=\"hljs-built_in\">Math</span>.min newIndentLiteral.length, @indentLiteral.length\n    <span class=\"hljs-keyword\">if</span> newIndentLiteral[...minLiteralLength] <span class=\"hljs-keyword\">isnt</span> @indentLiteral[...minLiteralLength]\n      @error <span class=\"hljs-string\">&#x27;indentation mismatch&#x27;</span>, offset: indent.length\n      <span class=\"hljs-keyword\">return</span> indent.length\n\n    <span class=\"hljs-keyword\">if</span> size - @continuationLineAdditionalIndent <span class=\"hljs-keyword\">is</span> @indent\n      <span class=\"hljs-keyword\">if</span> noNewlines <span class=\"hljs-keyword\">then</span> @suppressNewlines() <span class=\"hljs-keyword\">else</span> @newlineToken offset\n      <span class=\"hljs-keyword\">return</span> indent.length\n\n    <span class=\"hljs-keyword\">if</span> size &gt; @indent\n      <span class=\"hljs-keyword\">if</span> noNewlines\n        @continuationLineAdditionalIndent = size - @indent <span class=\"hljs-keyword\">unless</span> backslash\n        <span class=\"hljs-keyword\">if</span> @continuationLineAdditionalIndent\n          prev.continuationLineIndent = @indent + @continuationLineAdditionalIndent\n        @suppressNewlines()\n        <span class=\"hljs-keyword\">return</span> indent.length\n      <span class=\"hljs-keyword\">unless</span> @tokens.length\n        @baseIndent = @indent = size\n        @indentLiteral = newIndentLiteral\n        <span class=\"hljs-keyword\">return</span> indent.length\n      diff = size - @indent + @outdebt\n      @token <span class=\"hljs-string\">&#x27;INDENT&#x27;</span>, diff, offset: offset + indent.length - size, length: size\n      @indents.push diff\n      @ends.push {tag: <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>}\n      @outdebt = @continuationLineAdditionalIndent = <span class=\"hljs-number\">0</span>\n      @indent = size\n      @indentLiteral = newIndentLiteral\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> size &lt; @baseIndent\n      @error <span class=\"hljs-string\">&#x27;missing indentation&#x27;</span>, offset: offset + indent.length\n    <span class=\"hljs-keyword\">else</span>\n      endsContinuationLineIndentation = @continuationLineAdditionalIndent &gt; <span class=\"hljs-number\">0</span>\n      @continuationLineAdditionalIndent = <span class=\"hljs-number\">0</span>\n      @outdentToken {moveOut: @indent - size, noNewlines, outdentLength: indent.length, offset, indentSize: size, endsContinuationLineIndentation}\n    indent.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-31\">&#x00a7;</a>\n              </div>\n              <p>Record an outdent token or multiple tokens, if we happen to be moving back\ninwards past several recorded indents. Sets new @indent value.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  outdentToken: <span class=\"hljs-function\"><span class=\"hljs-params\">({moveOut, noNewlines, outdentLength = <span class=\"hljs-number\">0</span>, offset = <span class=\"hljs-number\">0</span>, indentSize, endsContinuationLineIndentation})</span> -&gt;</span>\n    decreasedIndent = @indent - moveOut\n    <span class=\"hljs-keyword\">while</span> moveOut &gt; <span class=\"hljs-number\">0</span>\n      lastIndent = @indents[@indents.length - <span class=\"hljs-number\">1</span>]\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> lastIndent\n        @outdebt = moveOut = <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @outdebt <span class=\"hljs-keyword\">and</span> moveOut &lt;= @outdebt\n        @outdebt -= moveOut\n        moveOut   = <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">else</span>\n        dent = @indents.pop() + @outdebt\n        <span class=\"hljs-keyword\">if</span> outdentLength <span class=\"hljs-keyword\">and</span> @chunk[outdentLength] <span class=\"hljs-keyword\">in</span> INDENTABLE_CLOSERS\n          decreasedIndent -= dent - moveOut\n          moveOut = dent\n        @outdebt = <span class=\"hljs-number\">0</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-32\">&#x00a7;</a>\n              </div>\n              <p>pair might call outdentToken, so preserve decreasedIndent</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        @pair <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>\n        @token <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>, moveOut, length: outdentLength, indentSize: indentSize + moveOut - dent\n        moveOut -= dent\n    @outdebt -= moveOut <span class=\"hljs-keyword\">if</span> dent\n    @suppressSemicolons()\n\n    <span class=\"hljs-keyword\">unless</span> @tag() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span> <span class=\"hljs-keyword\">or</span> noNewlines\n      terminatorToken = @token <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>, <span class=\"hljs-string\">&#x27;\\n&#x27;</span>, offset: offset + outdentLength, length: <span class=\"hljs-number\">0</span>\n      terminatorToken.endsContinuationLineIndentation = {preContinuationLineIndent: @indent} <span class=\"hljs-keyword\">if</span> endsContinuationLineIndentation\n    @indent = decreasedIndent\n    @indentLiteral = @indentLiteral[...decreasedIndent]\n    this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-33\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-33\">&#x00a7;</a>\n              </div>\n              <p>Matches and consumes non-meaningful whitespace. Tag the previous token\nas being “spaced”, because there are some cases where it makes a difference.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  whitespaceToken: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> (match = WHITESPACE.exec @chunk) <span class=\"hljs-keyword\">or</span>\n                    (nline = @chunk.charAt(<span class=\"hljs-number\">0</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;\\n&#x27;</span>)\n    prev = @prev()\n    prev[<span class=\"hljs-keyword\">if</span> match <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;spaced&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;newLine&#x27;</span>] = <span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> prev\n    <span class=\"hljs-keyword\">if</span> match <span class=\"hljs-keyword\">then</span> match[<span class=\"hljs-number\">0</span>].length <span class=\"hljs-keyword\">else</span> <span class=\"hljs-number\">0</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-34\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-34\">&#x00a7;</a>\n              </div>\n              <p>Generate a newline token. Consecutive newlines get merged together.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  newlineToken: <span class=\"hljs-function\"><span class=\"hljs-params\">(offset)</span> -&gt;</span>\n    @suppressSemicolons()\n    @token <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>, <span class=\"hljs-string\">&#x27;\\n&#x27;</span>, {offset, length: <span class=\"hljs-number\">0</span>} <span class=\"hljs-keyword\">unless</span> @tag() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>\n    this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-35\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-35\">&#x00a7;</a>\n              </div>\n              <p>Use a <code>\\</code> at a line-ending to suppress the newline.\nThe slash is removed here once its job is done.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  suppressNewlines: <span class=\"hljs-function\">-&gt;</span>\n    prev = @prev()\n    <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;\\\\&#x27;</span>\n      <span class=\"hljs-keyword\">if</span> prev.comments <span class=\"hljs-keyword\">and</span> @tokens.length &gt; <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-36\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-36\">&#x00a7;</a>\n              </div>\n              <p><code>@tokens.length</code> should be at least 2 (some code, then <code>\\</code>).\nIf something puts a <code>\\</code> after nothing, they deserve to lose any\ncomments that trail it.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        attachCommentsToNode prev.comments, @tokens[@tokens.length - <span class=\"hljs-number\">2</span>]\n      @tokens.pop()\n    this\n\n  jsxToken: <span class=\"hljs-function\">-&gt;</span>\n    firstChar = @chunk[<span class=\"hljs-number\">0</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-37\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-37\">&#x00a7;</a>\n              </div>\n              <p>Check the previous token to detect if attribute is spread.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    prevChar = <span class=\"hljs-keyword\">if</span> @tokens.length &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> @tokens[@tokens.length - <span class=\"hljs-number\">1</span>][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n    <span class=\"hljs-keyword\">if</span> firstChar <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;&lt;&#x27;</span>\n      match = JSX_IDENTIFIER.exec(@chunk[<span class=\"hljs-number\">1.</span>..]) <span class=\"hljs-keyword\">or</span> JSX_FRAGMENT_IDENTIFIER.exec(@chunk[<span class=\"hljs-number\">1.</span>..])\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">unless</span> match <span class=\"hljs-keyword\">and</span> (\n        @jsxDepth &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">or</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-38\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-38\">&#x00a7;</a>\n              </div>\n              <p>Not the right hand side of an unspaced comparison (i.e. <code>a&lt;b</code>).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">not</span> (prev = @prev()) <span class=\"hljs-keyword\">or</span>\n        prev.spaced <span class=\"hljs-keyword\">or</span>\n        prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> COMPARABLE_LEFT_SIDE\n      )\n      [input, id] = match\n      fullId = id\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">&#x27;.&#x27;</span> <span class=\"hljs-keyword\">in</span> id\n        [id, properties...] = id.split <span class=\"hljs-string\">&#x27;.&#x27;</span>\n      <span class=\"hljs-keyword\">else</span>\n        properties = []\n      tagToken = @token <span class=\"hljs-string\">&#x27;JSX_TAG&#x27;</span>, id,\n        length: id.length + <span class=\"hljs-number\">1</span>\n        data:\n          openingBracketToken: @makeToken <span class=\"hljs-string\">&#x27;&lt;&#x27;</span>, <span class=\"hljs-string\">&#x27;&lt;&#x27;</span>\n          tagNameToken: @makeToken <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>, id, offset: <span class=\"hljs-number\">1</span>\n      offset = id.length + <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">for</span> property <span class=\"hljs-keyword\">in</span> properties\n        @token <span class=\"hljs-string\">&#x27;.&#x27;</span>, <span class=\"hljs-string\">&#x27;.&#x27;</span>, {offset}\n        offset += <span class=\"hljs-number\">1</span>\n        @token <span class=\"hljs-string\">&#x27;PROPERTY&#x27;</span>, property, {offset}\n        offset += property.length\n      @token <span class=\"hljs-string\">&#x27;CALL_START&#x27;</span>, <span class=\"hljs-string\">&#x27;(&#x27;</span>, generated: <span class=\"hljs-literal\">yes</span>\n      @token <span class=\"hljs-string\">&#x27;[&#x27;</span>, <span class=\"hljs-string\">&#x27;[&#x27;</span>, generated: <span class=\"hljs-literal\">yes</span>\n      @ends.push {tag: <span class=\"hljs-string\">&#x27;/&gt;&#x27;</span>, origin: tagToken, name: id, properties}\n      @jsxDepth++\n      <span class=\"hljs-keyword\">return</span> fullId.length + <span class=\"hljs-number\">1</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> jsxTag = @atJSXTag()\n      <span class=\"hljs-keyword\">if</span> @chunk[..<span class=\"hljs-number\">.2</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;/&gt;&#x27;</span> <span class=\"hljs-comment\"># Self-closing tag.</span>\n        @pair <span class=\"hljs-string\">&#x27;/&gt;&#x27;</span>\n        @token <span class=\"hljs-string\">&#x27;]&#x27;</span>, <span class=\"hljs-string\">&#x27;]&#x27;</span>,\n          length: <span class=\"hljs-number\">2</span>\n          generated: <span class=\"hljs-literal\">yes</span>\n        @token <span class=\"hljs-string\">&#x27;CALL_END&#x27;</span>, <span class=\"hljs-string\">&#x27;)&#x27;</span>,\n          length: <span class=\"hljs-number\">2</span>\n          generated: <span class=\"hljs-literal\">yes</span>\n          data:\n            selfClosingSlashToken: @makeToken <span class=\"hljs-string\">&#x27;/&#x27;</span>, <span class=\"hljs-string\">&#x27;/&#x27;</span>\n            closingBracketToken: @makeToken <span class=\"hljs-string\">&#x27;&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;&gt;&#x27;</span>, offset: <span class=\"hljs-number\">1</span>\n        @jsxDepth--\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">2</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> firstChar <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;{&#x27;</span>\n        <span class=\"hljs-keyword\">if</span> prevChar <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;:&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-39\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-39\">&#x00a7;</a>\n              </div>\n              <p>This token represents the start of a JSX attribute value\nthat’s an expression (e.g. the <code>{b}</code> in <code>&lt;div a={b} /&gt;</code>).\nOur grammar represents the beginnings of expressions as <code>(</code>\ntokens, so make this into a <code>(</code> token that displays as <code>{</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          token = @token <span class=\"hljs-string\">&#x27;(&#x27;</span>, <span class=\"hljs-string\">&#x27;{&#x27;</span>\n          @jsxObjAttribute[@jsxDepth] = <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-40\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-40\">&#x00a7;</a>\n              </div>\n              <p>tag attribute name as JSX</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          addTokenData @tokens[@tokens.length - <span class=\"hljs-number\">3</span>],\n            jsx: <span class=\"hljs-literal\">yes</span>\n        <span class=\"hljs-keyword\">else</span>\n          token = @token <span class=\"hljs-string\">&#x27;{&#x27;</span>, <span class=\"hljs-string\">&#x27;{&#x27;</span>\n          @jsxObjAttribute[@jsxDepth] = <span class=\"hljs-literal\">yes</span>\n        @ends.push {tag: <span class=\"hljs-string\">&#x27;}&#x27;</span>, origin: token}\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> firstChar <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;&gt;&#x27;</span> <span class=\"hljs-comment\"># end of opening tag</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-41\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-41\">&#x00a7;</a>\n              </div>\n              <p>Ignore terminators inside a tag.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        {origin: openingTagToken} = @pair <span class=\"hljs-string\">&#x27;/&gt;&#x27;</span> <span class=\"hljs-comment\"># As if the current tag was self-closing.</span>\n        @token <span class=\"hljs-string\">&#x27;]&#x27;</span>, <span class=\"hljs-string\">&#x27;]&#x27;</span>,\n          generated: <span class=\"hljs-literal\">yes</span>\n          data:\n            closingBracketToken: @makeToken <span class=\"hljs-string\">&#x27;&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;&gt;&#x27;</span>\n        @token <span class=\"hljs-string\">&#x27;,&#x27;</span>, <span class=\"hljs-string\">&#x27;JSX_COMMA&#x27;</span>, generated: <span class=\"hljs-literal\">yes</span>\n        {tokens, index: end} =\n          @matchWithInterpolations INSIDE_JSX, <span class=\"hljs-string\">&#x27;&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;&lt;/&#x27;</span>, JSX_INTERPOLATION\n        @mergeInterpolationTokens tokens, {endOffset: end, jsx: <span class=\"hljs-literal\">yes</span>}, <span class=\"hljs-function\"><span class=\"hljs-params\">(value)</span> =&gt;</span>\n          @validateUnicodeCodePointEscapes value, delimiter: <span class=\"hljs-string\">&#x27;&gt;&#x27;</span>\n        match = JSX_IDENTIFIER.exec(@chunk[end...]) <span class=\"hljs-keyword\">or</span> JSX_FRAGMENT_IDENTIFIER.exec(@chunk[end...])\n        <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> match <span class=\"hljs-keyword\">or</span> match[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{jsxTag.name}</span><span class=\"hljs-subst\">#{(<span class=\"hljs-string\">&quot;.<span class=\"hljs-subst\">#{property}</span>&quot;</span> <span class=\"hljs-keyword\">for</span> property <span class=\"hljs-keyword\">in</span> jsxTag.properties).join <span class=\"hljs-string\">&#x27;&#x27;</span>}</span>&quot;</span>\n          @error <span class=\"hljs-string\">&quot;expected corresponding JSX closing tag for <span class=\"hljs-subst\">#{jsxTag.name}</span>&quot;</span>,\n            jsxTag.origin.data.tagNameToken[<span class=\"hljs-number\">2</span>]\n        [, fullTagName] = match\n        afterTag = end + fullTagName.length\n        <span class=\"hljs-keyword\">if</span> @chunk[afterTag] <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;&gt;&#x27;</span>\n          @error <span class=\"hljs-string\">&quot;missing closing &gt; after tag name&quot;</span>, offset: afterTag, length: <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-42\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-42\">&#x00a7;</a>\n              </div>\n              <p>-2/+2 for the opening <code>&lt;/</code> and +1 for the closing <code>&gt;</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        endToken = @token <span class=\"hljs-string\">&#x27;CALL_END&#x27;</span>, <span class=\"hljs-string\">&#x27;)&#x27;</span>,\n          offset: end - <span class=\"hljs-number\">2</span>\n          length: fullTagName.length + <span class=\"hljs-number\">3</span>\n          generated: <span class=\"hljs-literal\">yes</span>\n          data:\n            closingTagOpeningBracketToken: @makeToken <span class=\"hljs-string\">&#x27;&lt;&#x27;</span>, <span class=\"hljs-string\">&#x27;&lt;&#x27;</span>, offset: end - <span class=\"hljs-number\">2</span>\n            closingTagSlashToken: @makeToken <span class=\"hljs-string\">&#x27;/&#x27;</span>, <span class=\"hljs-string\">&#x27;/&#x27;</span>, offset: end - <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-43\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-43\">&#x00a7;</a>\n              </div>\n              <p>TODO: individual tokens for complex tag name? eg &lt; / A . B &gt;</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>            closingTagNameToken: @makeToken <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>, fullTagName, offset: end\n            closingTagClosingBracketToken: @makeToken <span class=\"hljs-string\">&#x27;&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;&gt;&#x27;</span>, offset: end + fullTagName.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-44\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-44\">&#x00a7;</a>\n              </div>\n              <p>make the closing tag location data more easily accessible to the grammar</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        addTokenData openingTagToken, endToken.data\n        @jsxDepth--\n        <span class=\"hljs-keyword\">return</span> afterTag + <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @atJSXTag <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">if</span> firstChar <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;}&#x27;</span>\n        @pair firstChar\n        <span class=\"hljs-keyword\">if</span> @jsxObjAttribute[@jsxDepth]\n          @token <span class=\"hljs-string\">&#x27;}&#x27;</span>, <span class=\"hljs-string\">&#x27;}&#x27;</span>\n          @jsxObjAttribute[@jsxDepth] = <span class=\"hljs-literal\">no</span>\n        <span class=\"hljs-keyword\">else</span>\n          @token <span class=\"hljs-string\">&#x27;)&#x27;</span>, <span class=\"hljs-string\">&#x27;}&#x27;</span>\n        @token <span class=\"hljs-string\">&#x27;,&#x27;</span>, <span class=\"hljs-string\">&#x27;,&#x27;</span>, generated: <span class=\"hljs-literal\">yes</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>\n\n  atJSXTag: <span class=\"hljs-function\"><span class=\"hljs-params\">(depth = <span class=\"hljs-number\">0</span>)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">if</span> @jsxDepth <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n    i = @ends.length - <span class=\"hljs-number\">1</span>\n    i-- <span class=\"hljs-keyword\">while</span> @ends[i]?.tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span> <span class=\"hljs-keyword\">or</span> depth-- &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-comment\"># Ignore indents.</span>\n    last = @ends[i]\n    last?.tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;/&gt;&#x27;</span> <span class=\"hljs-keyword\">and</span> last</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-45\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-45\">&#x00a7;</a>\n              </div>\n              <p>We treat all other single characters as a token. E.g.: <code>( ) , . !</code>\nMulti-character operators are also literal tokens, so that Jison can assign\nthe proper order of operations. There are some symbols that we tag specially\nhere. <code>;</code> and newlines are both treated as a <code>TERMINATOR</code>, we distinguish\nparentheses that indicate a method call from regular parentheses, and so on.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  literalToken: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> match = OPERATOR.exec @chunk\n      [value] = match\n      @tagParameters() <span class=\"hljs-keyword\">if</span> CODE.test value\n    <span class=\"hljs-keyword\">else</span>\n      value = @chunk.charAt <span class=\"hljs-number\">0</span>\n    tag  = value\n    prev = @prev()\n\n    <span class=\"hljs-keyword\">if</span> prev <span class=\"hljs-keyword\">and</span> value <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;=&#x27;</span>, COMPOUND_ASSIGN...]\n      skipToken = <span class=\"hljs-literal\">false</span>\n      <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;=&#x27;</span> <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;||&#x27;</span>, <span class=\"hljs-string\">&#x27;&amp;&amp;&#x27;</span>] <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> prev.spaced\n        prev[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;COMPOUND_ASSIGN&#x27;</span>\n        prev[<span class=\"hljs-number\">1</span>] += <span class=\"hljs-string\">&#x27;=&#x27;</span>\n        prev.data.original += <span class=\"hljs-string\">&#x27;=&#x27;</span> <span class=\"hljs-keyword\">if</span> prev.data?.original\n        prev[<span class=\"hljs-number\">2</span>].range = [\n          prev[<span class=\"hljs-number\">2</span>].range[<span class=\"hljs-number\">0</span>]\n          prev[<span class=\"hljs-number\">2</span>].range[<span class=\"hljs-number\">1</span>] + <span class=\"hljs-number\">1</span>\n        ]\n        prev[<span class=\"hljs-number\">2</span>].last_column += <span class=\"hljs-number\">1</span>\n        prev[<span class=\"hljs-number\">2</span>].last_column_exclusive += <span class=\"hljs-number\">1</span>\n        prev = @tokens[@tokens.length - <span class=\"hljs-number\">2</span>]\n        skipToken = <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-keyword\">if</span> prev <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;PROPERTY&#x27;</span>\n        origin = prev.origin ? prev\n        message = isUnassignable prev[<span class=\"hljs-number\">1</span>], origin[<span class=\"hljs-number\">1</span>]\n        @error message, origin[<span class=\"hljs-number\">2</span>] <span class=\"hljs-keyword\">if</span> message\n      <span class=\"hljs-keyword\">return</span> value.length <span class=\"hljs-keyword\">if</span> skipToken\n\n    <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;(&#x27;</span> <span class=\"hljs-keyword\">and</span> prev?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IMPORT&#x27;</span>\n      prev[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;DYNAMIC_IMPORT&#x27;</span>\n\n    <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;{&#x27;</span> <span class=\"hljs-keyword\">and</span> @seenImport\n      @importSpecifierList = <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @importSpecifierList <span class=\"hljs-keyword\">and</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;}&#x27;</span>\n      @importSpecifierList = <span class=\"hljs-literal\">no</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;{&#x27;</span> <span class=\"hljs-keyword\">and</span> prev?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;EXPORT&#x27;</span>\n      @exportSpecifierList = <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @exportSpecifierList <span class=\"hljs-keyword\">and</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;}&#x27;</span>\n      @exportSpecifierList = <span class=\"hljs-literal\">no</span>\n\n    <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;;&#x27;</span>\n      @error <span class=\"hljs-string\">&#x27;unexpected ;&#x27;</span> <span class=\"hljs-keyword\">if</span> prev?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;=&#x27;</span>, UNFINISHED...]\n      @seenFor = @seenImport = @seenExport = <span class=\"hljs-literal\">no</span>\n      tag = <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;*&#x27;</span> <span class=\"hljs-keyword\">and</span> prev?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;EXPORT&#x27;</span>\n      tag = <span class=\"hljs-string\">&#x27;EXPORT_ALL&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">in</span> MATH            <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">&#x27;MATH&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">in</span> COMPARE         <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">&#x27;COMPARE&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">in</span> COMPOUND_ASSIGN <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">&#x27;COMPOUND_ASSIGN&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">in</span> UNARY           <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">&#x27;UNARY&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">in</span> UNARY_MATH      <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">&#x27;UNARY_MATH&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">in</span> SHIFT           <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">&#x27;SHIFT&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;?&#x27;</span> <span class=\"hljs-keyword\">and</span> prev?.spaced <span class=\"hljs-keyword\">then</span> tag = <span class=\"hljs-string\">&#x27;BIN?&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prev\n      <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;(&#x27;</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> prev.spaced <span class=\"hljs-keyword\">and</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> CALLABLE\n        prev[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;FUNC_EXIST&#x27;</span> <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;?&#x27;</span>\n        tag = <span class=\"hljs-string\">&#x27;CALL_START&#x27;</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;[&#x27;</span> <span class=\"hljs-keyword\">and</span> ((prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> INDEXABLE <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> prev.spaced) <span class=\"hljs-keyword\">or</span>\n         (prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;::&#x27;</span>)) <span class=\"hljs-comment\"># `.prototype` can’t be a method you can call.</span>\n        tag = <span class=\"hljs-string\">&#x27;INDEX_START&#x27;</span>\n        <span class=\"hljs-keyword\">switch</span> prev[<span class=\"hljs-number\">0</span>]\n          <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;?&#x27;</span>  <span class=\"hljs-keyword\">then</span> prev[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;INDEX_SOAK&#x27;</span>\n    token = @makeToken tag, value\n    <span class=\"hljs-keyword\">switch</span> value\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;(&#x27;</span>, <span class=\"hljs-string\">&#x27;{&#x27;</span>, <span class=\"hljs-string\">&#x27;[&#x27;</span> <span class=\"hljs-keyword\">then</span> @ends.push {tag: INVERSES[value], origin: token}\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;)&#x27;</span>, <span class=\"hljs-string\">&#x27;}&#x27;</span>, <span class=\"hljs-string\">&#x27;]&#x27;</span> <span class=\"hljs-keyword\">then</span> @pair value\n    @tokens.push @makeToken tag, value\n    value.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-46\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-46\">&#x00a7;</a>\n              </div>\n              <h2 id=\"token-manipulators\">Token Manipulators</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-47\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-47\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-48\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-48\">&#x00a7;</a>\n              </div>\n              <p>A source of ambiguity in our grammar used to be parameter lists in function\ndefinitions versus argument lists in function calls. Walk backwards, tagging\nparameters specially in order to make things easier for the parser.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  tagParameters: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> @tagDoIife() <span class=\"hljs-keyword\">if</span> @tag() <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;)&#x27;</span>\n    stack = []\n    {tokens} = this\n    i = tokens.length\n    paramEndToken = tokens[--i]\n    paramEndToken[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;PARAM_END&#x27;</span>\n    <span class=\"hljs-keyword\">while</span> tok = tokens[--i]\n      <span class=\"hljs-keyword\">switch</span> tok[<span class=\"hljs-number\">0</span>]\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;)&#x27;</span>\n          stack.push tok\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;(&#x27;</span>, <span class=\"hljs-string\">&#x27;CALL_START&#x27;</span>\n          <span class=\"hljs-keyword\">if</span> stack.length <span class=\"hljs-keyword\">then</span> stack.pop()\n          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> tok[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;(&#x27;</span>\n            tok[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;PARAM_START&#x27;</span>\n            <span class=\"hljs-keyword\">return</span> @tagDoIife i - <span class=\"hljs-number\">1</span>\n          <span class=\"hljs-keyword\">else</span>\n            paramEndToken[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;CALL_END&#x27;</span>\n            <span class=\"hljs-keyword\">return</span> this\n    this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-49\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-49\">&#x00a7;</a>\n              </div>\n              <p>Tag <code>do</code> followed by a function differently than <code>do</code> followed by eg an\nidentifier to allow for different grammar precedence</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  tagDoIife: <span class=\"hljs-function\"><span class=\"hljs-params\">(tokenIndex)</span> -&gt;</span>\n    tok = @tokens[tokenIndex ? @tokens.length - <span class=\"hljs-number\">1</span>]\n    <span class=\"hljs-keyword\">return</span> this <span class=\"hljs-keyword\">unless</span> tok?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;DO&#x27;</span>\n    tok[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;DO_IIFE&#x27;</span>\n    this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-50\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-50\">&#x00a7;</a>\n              </div>\n              <p>Close up all remaining open blocks at the end of the file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  closeIndentation: <span class=\"hljs-function\">-&gt;</span>\n    @outdentToken moveOut: @indent, indentSize: <span class=\"hljs-number\">0</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-51\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-51\">&#x00a7;</a>\n              </div>\n              <p>Match the contents of a delimited token and expand variables and expressions\ninside it using Ruby-like notation for substitution of arbitrary\nexpressions.</p>\n<pre><code><span class=\"hljs-string\">&quot;Hello <span class=\"hljs-subst\">#{name.capitalize()}</span>.&quot;</span>\n</code></pre>\n<p>If it encounters an interpolation, this method will recursively create a new\nLexer and tokenize until the <code>{</code> of <code>#{</code> is balanced with a <code>}</code>.</p>\n<ul>\n<li><code>regex</code> matches the contents of a token (but not <code>delimiter</code>, and not\n<code>#{</code> if interpolations are desired).</li>\n<li><code>delimiter</code> is the delimiter of the token. Examples are <code>&#39;</code>, <code>&quot;</code>, <code>&#39;&#39;&#39;</code>,\n<code>&quot;&quot;&quot;</code> and <code>///</code>.</li>\n<li><code>closingDelimiter</code> is different from <code>delimiter</code> only in JSX</li>\n<li><code>interpolators</code> matches the start of an interpolation, for JSX it’s both\n<code>{</code> and <code>&lt;</code> (i.e. nested JSX tag)</li>\n</ul>\n<p>This method allows us to have strings within interpolations within strings,\nad infinitum.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  matchWithInterpolations: <span class=\"hljs-function\"><span class=\"hljs-params\">(regex, delimiter, closingDelimiter = delimiter, interpolators = <span class=\"hljs-regexp\">/^#\\{/</span>)</span> -&gt;</span>\n    tokens = []\n    offsetInChunk = delimiter.length\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">null</span> <span class=\"hljs-keyword\">unless</span> @chunk[...offsetInChunk] <span class=\"hljs-keyword\">is</span> delimiter\n    str = @chunk[offsetInChunk..]\n    <span class=\"hljs-keyword\">loop</span>\n      [strPart] = regex.exec str\n\n      @validateEscapes strPart, {isRegex: delimiter.charAt(<span class=\"hljs-number\">0</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;/&#x27;</span>, offsetInChunk}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-52\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-52\">&#x00a7;</a>\n              </div>\n              <p>Push a fake <code>&#39;NEOSTRING&#39;</code> token, which will get turned into a real string later.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      tokens.push @makeToken <span class=\"hljs-string\">&#x27;NEOSTRING&#x27;</span>, strPart, offset: offsetInChunk\n\n      str = str[strPart.length..]\n      offsetInChunk += strPart.length\n\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> match = interpolators.exec str\n      [interpolator] = match</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-53\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-53\">&#x00a7;</a>\n              </div>\n              <p>To remove the <code>#</code> in <code>#{</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      interpolationOffset = interpolator.length - <span class=\"hljs-number\">1</span>\n      [line, column, offset] = @getLineAndColumnFromChunk offsetInChunk + interpolationOffset\n      rest = str[interpolationOffset..]\n      {tokens: nested, index} =\n        <span class=\"hljs-keyword\">new</span> Lexer().tokenize rest, {line, column, offset, untilBalanced: <span class=\"hljs-literal\">on</span>, @locationDataCompensations}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-54\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-54\">&#x00a7;</a>\n              </div>\n              <p>Account for the <code>#</code> in <code>#{</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      index += interpolationOffset\n\n      braceInterpolator = str[index - <span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;}&#x27;</span>\n      <span class=\"hljs-keyword\">if</span> braceInterpolator</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-55\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-55\">&#x00a7;</a>\n              </div>\n              <p>Turn the leading and trailing <code>{</code> and <code>}</code> into parentheses. Unnecessary\nparentheses will be removed later.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        [open, ..., close] = nested\n        open[<span class=\"hljs-number\">0</span>]  = <span class=\"hljs-string\">&#x27;INTERPOLATION_START&#x27;</span>\n        open[<span class=\"hljs-number\">1</span>]  = <span class=\"hljs-string\">&#x27;(&#x27;</span>\n        open[<span class=\"hljs-number\">2</span>].first_column -= interpolationOffset\n        open[<span class=\"hljs-number\">2</span>].range = [\n          open[<span class=\"hljs-number\">2</span>].range[<span class=\"hljs-number\">0</span>] - interpolationOffset\n          open[<span class=\"hljs-number\">2</span>].range[<span class=\"hljs-number\">1</span>]\n        ]\n        close[<span class=\"hljs-number\">0</span>]  = <span class=\"hljs-string\">&#x27;INTERPOLATION_END&#x27;</span>\n        close[<span class=\"hljs-number\">1</span>] = <span class=\"hljs-string\">&#x27;)&#x27;</span>\n        close.origin = [<span class=\"hljs-string\">&#x27;&#x27;</span>, <span class=\"hljs-string\">&#x27;end of interpolation&#x27;</span>, close[<span class=\"hljs-number\">2</span>]]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-56\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-56\">&#x00a7;</a>\n              </div>\n              <p>Remove leading <code>&#39;TERMINATOR&#39;</code> (if any).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      nested.splice <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> nested[<span class=\"hljs-number\">1</span>]?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-57\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-57\">&#x00a7;</a>\n              </div>\n              <p>Remove trailing <code>&#39;INDENT&#39;/&#39;OUTDENT&#39;</code> pair (if any).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      nested.splice <span class=\"hljs-number\">-3</span>, <span class=\"hljs-number\">2</span> <span class=\"hljs-keyword\">if</span> nested[nested.length - <span class=\"hljs-number\">3</span>]?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;INDENT&#x27;</span> <span class=\"hljs-keyword\">and</span> nested[nested.length - <span class=\"hljs-number\">2</span>][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>\n\n      <span class=\"hljs-keyword\">unless</span> braceInterpolator</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-58\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-58\">&#x00a7;</a>\n              </div>\n              <p>We are not using <code>{</code> and <code>}</code>, so wrap the interpolated tokens instead.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        open = @makeToken <span class=\"hljs-string\">&#x27;INTERPOLATION_START&#x27;</span>, <span class=\"hljs-string\">&#x27;(&#x27;</span>, offset: offsetInChunk,         length: <span class=\"hljs-number\">0</span>, generated: <span class=\"hljs-literal\">yes</span>\n        close = @makeToken <span class=\"hljs-string\">&#x27;INTERPOLATION_END&#x27;</span>, <span class=\"hljs-string\">&#x27;)&#x27;</span>,  offset: offsetInChunk + index, length: <span class=\"hljs-number\">0</span>, generated: <span class=\"hljs-literal\">yes</span>\n        nested = [open, nested..., close]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-59\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-59\">&#x00a7;</a>\n              </div>\n              <p>Push a fake <code>&#39;TOKENS&#39;</code> token, which will get turned into real tokens later.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      tokens.push [<span class=\"hljs-string\">&#x27;TOKENS&#x27;</span>, nested]\n\n      str = str[index..]\n      offsetInChunk += index\n\n    <span class=\"hljs-keyword\">unless</span> str[...closingDelimiter.length] <span class=\"hljs-keyword\">is</span> closingDelimiter\n      @error <span class=\"hljs-string\">&quot;missing <span class=\"hljs-subst\">#{closingDelimiter}</span>&quot;</span>, length: delimiter.length\n\n    {tokens, index: offsetInChunk + closingDelimiter.length}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-60\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-60\">&#x00a7;</a>\n              </div>\n              <p>Merge the array <code>tokens</code> of the fake token types <code>&#39;TOKENS&#39;</code> and <code>&#39;NEOSTRING&#39;</code>\n(as returned by <code>matchWithInterpolations</code>) into the token stream. The value\nof <code>&#39;NEOSTRING&#39;</code>s are converted using <code>fn</code> and turned into strings using\n<code>options</code> first.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  mergeInterpolationTokens: <span class=\"hljs-function\"><span class=\"hljs-params\">(tokens, options, fn)</span> -&gt;</span>\n    {quote, indent, double, heregex, endOffset, jsx} = options\n\n    <span class=\"hljs-keyword\">if</span> tokens.length &gt; <span class=\"hljs-number\">1</span>\n      lparen = @token <span class=\"hljs-string\">&#x27;STRING_START&#x27;</span>, <span class=\"hljs-string\">&#x27;(&#x27;</span>, length: quote?.length ? <span class=\"hljs-number\">0</span>, data: {quote}, generated: <span class=\"hljs-keyword\">not</span> quote?.length\n\n    firstIndex = @tokens.length\n    $ = tokens.length - <span class=\"hljs-number\">1</span>\n    <span class=\"hljs-keyword\">for</span> token, i <span class=\"hljs-keyword\">in</span> tokens\n      [tag, value] = token\n      <span class=\"hljs-keyword\">switch</span> tag\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;TOKENS&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-61\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-61\">&#x00a7;</a>\n              </div>\n              <p>There are comments (and nothing else) in this interpolation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">if</span> value.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">2</span> <span class=\"hljs-keyword\">and</span> (value[<span class=\"hljs-number\">0</span>].comments <span class=\"hljs-keyword\">or</span> value[<span class=\"hljs-number\">1</span>].comments)\n            placeholderToken = @makeToken <span class=\"hljs-string\">&#x27;JS&#x27;</span>, <span class=\"hljs-string\">&#x27;&#x27;</span>, generated: <span class=\"hljs-literal\">yes</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-62\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-62\">&#x00a7;</a>\n              </div>\n              <p>Use the same location data as the first parenthesis.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>            placeholderToken[<span class=\"hljs-number\">2</span>] = value[<span class=\"hljs-number\">0</span>][<span class=\"hljs-number\">2</span>]\n            <span class=\"hljs-keyword\">for</span> val <span class=\"hljs-keyword\">in</span> value <span class=\"hljs-keyword\">when</span> val.comments\n              placeholderToken.comments ?= []\n              placeholderToken.comments.push val.comments...\n            value.splice <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">0</span>, placeholderToken</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-63\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-63\">&#x00a7;</a>\n              </div>\n              <p>Push all the tokens in the fake <code>&#39;TOKENS&#39;</code> token. These already have\nsane location data.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          locationToken = value[<span class=\"hljs-number\">0</span>]\n          tokensToPush = value\n        <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;NEOSTRING&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-64\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-64\">&#x00a7;</a>\n              </div>\n              <p>Convert <code>&#39;NEOSTRING&#39;</code> into <code>&#39;STRING&#39;</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          converted = fn.call this, token[<span class=\"hljs-number\">1</span>], i\n          addTokenData token, initialChunk: <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n          addTokenData token, finalChunk: <span class=\"hljs-literal\">yes</span>   <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">is</span> $\n          addTokenData token, {indent, quote, double}\n          addTokenData token, {heregex} <span class=\"hljs-keyword\">if</span> heregex\n          addTokenData token, {jsx} <span class=\"hljs-keyword\">if</span> jsx\n          token[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;STRING&#x27;</span>\n          token[<span class=\"hljs-number\">1</span>] = <span class=\"hljs-string\">&#x27;&quot;&#x27;</span> + converted + <span class=\"hljs-string\">&#x27;&quot;&#x27;</span>\n          <span class=\"hljs-keyword\">if</span> tokens.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> quote?\n            token[<span class=\"hljs-number\">2</span>].first_column -= quote.length\n            <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">1</span>].substr(<span class=\"hljs-number\">-2</span>, <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n              token[<span class=\"hljs-number\">2</span>].last_line += <span class=\"hljs-number\">1</span>\n              token[<span class=\"hljs-number\">2</span>].last_column = quote.length - <span class=\"hljs-number\">1</span>\n            <span class=\"hljs-keyword\">else</span>\n              token[<span class=\"hljs-number\">2</span>].last_column += quote.length\n              token[<span class=\"hljs-number\">2</span>].last_column -= <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">1</span>].length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">2</span>\n            token[<span class=\"hljs-number\">2</span>].last_column_exclusive += quote.length\n            token[<span class=\"hljs-number\">2</span>].range = [\n              token[<span class=\"hljs-number\">2</span>].range[<span class=\"hljs-number\">0</span>] - quote.length\n              token[<span class=\"hljs-number\">2</span>].range[<span class=\"hljs-number\">1</span>] + quote.length\n            ]\n          locationToken = token\n          tokensToPush = [token]\n      @tokens.push tokensToPush...\n\n    <span class=\"hljs-keyword\">if</span> lparen\n      [..., lastToken] = tokens\n      lparen.origin = [<span class=\"hljs-string\">&#x27;STRING&#x27;</span>, <span class=\"hljs-literal\">null</span>,\n        first_line:            lparen[<span class=\"hljs-number\">2</span>].first_line\n        first_column:          lparen[<span class=\"hljs-number\">2</span>].first_column\n        last_line:             lastToken[<span class=\"hljs-number\">2</span>].last_line\n        last_column:           lastToken[<span class=\"hljs-number\">2</span>].last_column\n        last_line_exclusive:   lastToken[<span class=\"hljs-number\">2</span>].last_line_exclusive\n        last_column_exclusive: lastToken[<span class=\"hljs-number\">2</span>].last_column_exclusive\n        range: [\n          lparen[<span class=\"hljs-number\">2</span>].range[<span class=\"hljs-number\">0</span>]\n          lastToken[<span class=\"hljs-number\">2</span>].range[<span class=\"hljs-number\">1</span>]\n        ]\n      ]\n      lparen[<span class=\"hljs-number\">2</span>] = lparen.origin[<span class=\"hljs-number\">2</span>] <span class=\"hljs-keyword\">unless</span> quote?.length\n      rparen = @token <span class=\"hljs-string\">&#x27;STRING_END&#x27;</span>, <span class=\"hljs-string\">&#x27;)&#x27;</span>, offset: endOffset - (quote ? <span class=\"hljs-string\">&#x27;&#x27;</span>).length, length: quote?.length ? <span class=\"hljs-number\">0</span>, generated: <span class=\"hljs-keyword\">not</span> quote?.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-65\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-65\">&#x00a7;</a>\n              </div>\n              <p>Pairs up a closing token, ensuring that all listed pairs of tokens are\ncorrectly balanced throughout the course of the token stream.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  pair: <span class=\"hljs-function\"><span class=\"hljs-params\">(tag)</span> -&gt;</span>\n    [..., prev] = @ends\n    <span class=\"hljs-keyword\">unless</span> tag <span class=\"hljs-keyword\">is</span> wanted = prev?.tag\n      @error <span class=\"hljs-string\">&quot;unmatched <span class=\"hljs-subst\">#{tag}</span>&quot;</span> <span class=\"hljs-keyword\">unless</span> <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span> <span class=\"hljs-keyword\">is</span> wanted</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-66\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-66\">&#x00a7;</a>\n              </div>\n              <p>Auto-close <code>INDENT</code> to support syntax like this:</p>\n<pre><code>el.click(<span class=\"hljs-function\"><span class=\"hljs-params\">(event)</span> -&gt;</span>\n  el.hide())\n</code></pre>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      [..., lastIndent] = @indents\n      @outdentToken moveOut: lastIndent, noNewlines: <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-keyword\">return</span> @pair tag\n    @ends.pop()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-67\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-67\">&#x00a7;</a>\n              </div>\n              <h2 id=\"helpers\">Helpers</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-68\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-68\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-69\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-69\">&#x00a7;</a>\n              </div>\n              <p>Compensate for the things we strip out initially (e.g. carriage returns)\nso that location data stays accurate with respect to the original source file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  getLocationDataCompensation: <span class=\"hljs-function\"><span class=\"hljs-params\">(start, end)</span> -&gt;</span>\n    totalCompensation = <span class=\"hljs-number\">0</span>\n    initialEnd = end\n    current = start\n    <span class=\"hljs-keyword\">while</span> current &lt;= end\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">if</span> current <span class=\"hljs-keyword\">is</span> end <span class=\"hljs-keyword\">and</span> start <span class=\"hljs-keyword\">isnt</span> initialEnd\n      compensation = @locationDataCompensations[current]\n      <span class=\"hljs-keyword\">if</span> compensation?\n        totalCompensation += compensation\n        end += compensation\n      current++\n    <span class=\"hljs-keyword\">return</span> totalCompensation</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-70\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-70\">&#x00a7;</a>\n              </div>\n              <p>Returns the line and column number from an offset into the current chunk.</p>\n<p><code>offset</code> is a number of characters into <code>@chunk</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  getLineAndColumnFromChunk: <span class=\"hljs-function\"><span class=\"hljs-params\">(offset)</span> -&gt;</span>\n    compensation = @getLocationDataCompensation @chunkOffset, @chunkOffset + offset\n\n    <span class=\"hljs-keyword\">if</span> offset <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">return</span> [@chunkLine, @chunkColumn + compensation, @chunkOffset + compensation]\n\n    <span class=\"hljs-keyword\">if</span> offset &gt;= @chunk.length\n      string = @chunk\n    <span class=\"hljs-keyword\">else</span>\n      string = @chunk[..offset<span class=\"hljs-number\">-1</span>]\n\n    lineCount = count string, <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n\n    column = @chunkColumn\n    <span class=\"hljs-keyword\">if</span> lineCount &gt; <span class=\"hljs-number\">0</span>\n      [..., lastLine] = string.split <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n      column = lastLine.length\n      previousLinesCompensation = @getLocationDataCompensation @chunkOffset, @chunkOffset + offset - column</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-71\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-71\">&#x00a7;</a>\n              </div>\n              <p>Don’t recompensate for initially inserted newline.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      previousLinesCompensation = <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">if</span> previousLinesCompensation &lt; <span class=\"hljs-number\">0</span>\n      columnCompensation = @getLocationDataCompensation(\n        @chunkOffset + offset + previousLinesCompensation - column\n        @chunkOffset + offset + previousLinesCompensation\n      )\n    <span class=\"hljs-keyword\">else</span>\n      column += string.length\n      columnCompensation = compensation\n\n    [@chunkLine + lineCount, column + columnCompensation, @chunkOffset + offset + compensation]\n\n  makeLocationData: <span class=\"hljs-function\"><span class=\"hljs-params\">({ offsetInChunk, length })</span> -&gt;</span>\n    locationData = range: []\n    [locationData.first_line, locationData.first_column, locationData.range[<span class=\"hljs-number\">0</span>]] =\n      @getLineAndColumnFromChunk offsetInChunk</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-72\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-72\">&#x00a7;</a>\n              </div>\n              <p>Use length - 1 for the final offset - we’re supplying the last_line and the last_column,\nso if last_column == first_column, then we’re looking at a character of length 1.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    lastCharacter = <span class=\"hljs-keyword\">if</span> length &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> (length - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">else</span> <span class=\"hljs-number\">0</span>\n    [locationData.last_line, locationData.last_column, endOffset] =\n      @getLineAndColumnFromChunk offsetInChunk + lastCharacter\n    [locationData.last_line_exclusive, locationData.last_column_exclusive] =\n      @getLineAndColumnFromChunk offsetInChunk + lastCharacter + (<span class=\"hljs-keyword\">if</span> length &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-number\">0</span>)\n    locationData.range[<span class=\"hljs-number\">1</span>] = <span class=\"hljs-keyword\">if</span> length &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> endOffset + <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> endOffset\n\n    locationData</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-73\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-73\">&#x00a7;</a>\n              </div>\n              <p>Same as <code>token</code>, except this just returns the token without adding it\nto the results.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  makeToken: <span class=\"hljs-function\"><span class=\"hljs-params\">(tag, value, {offset: offsetInChunk = <span class=\"hljs-number\">0</span>, length = value.length, origin, generated, indentSize} = {})</span> -&gt;</span>\n    token = [tag, value, @makeLocationData {offsetInChunk, length}]\n    token.origin = origin <span class=\"hljs-keyword\">if</span> origin\n    token.generated = <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> generated\n    token.indentSize = indentSize <span class=\"hljs-keyword\">if</span> indentSize?\n    token</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-74\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-74\">&#x00a7;</a>\n              </div>\n              <p>Add a token to the results.\n<code>offset</code> is the offset into the current <code>@chunk</code> where the token starts.\n<code>length</code> is the length of the token in the <code>@chunk</code>, after the offset.  If\nnot specified, the length of <code>value</code> will be used.</p>\n<p>Returns the new token.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  token: <span class=\"hljs-function\"><span class=\"hljs-params\">(tag, value, {offset, length, origin, data, generated, indentSize} = {})</span> -&gt;</span>\n    token = @makeToken tag, value, {offset, length, origin, generated, indentSize}\n    addTokenData token, data <span class=\"hljs-keyword\">if</span> data\n    @tokens.push token\n    token</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-75\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-75\">&#x00a7;</a>\n              </div>\n              <p>Peek at the last tag in the token stream.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  tag: <span class=\"hljs-function\">-&gt;</span>\n    [..., token] = @tokens\n    token?[<span class=\"hljs-number\">0</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-76\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-76\">&#x00a7;</a>\n              </div>\n              <p>Peek at the last value in the token stream.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  value: <span class=\"hljs-function\"><span class=\"hljs-params\">(useOrigin = <span class=\"hljs-literal\">no</span>)</span> -&gt;</span>\n    [..., token] = @tokens\n    <span class=\"hljs-keyword\">if</span> useOrigin <span class=\"hljs-keyword\">and</span> token?.origin?\n      token.origin[<span class=\"hljs-number\">1</span>]\n    <span class=\"hljs-keyword\">else</span>\n      token?[<span class=\"hljs-number\">1</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-77\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-77\">&#x00a7;</a>\n              </div>\n              <p>Get the previous token in the token stream.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  prev: <span class=\"hljs-function\">-&gt;</span>\n    @tokens[@tokens.length - <span class=\"hljs-number\">1</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-78\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-78\">&#x00a7;</a>\n              </div>\n              <p>Are we in the midst of an unfinished expression?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unfinished: <span class=\"hljs-function\">-&gt;</span>\n    LINE_CONTINUER.test(@chunk) <span class=\"hljs-keyword\">or</span>\n    @tag() <span class=\"hljs-keyword\">in</span> UNFINISHED\n\n  validateUnicodeCodePointEscapes: <span class=\"hljs-function\"><span class=\"hljs-params\">(str, options)</span> -&gt;</span>\n    replaceUnicodeCodePointEscapes str, merge options, {@error}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-79\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-79\">&#x00a7;</a>\n              </div>\n              <p>Validates escapes in strings and regexes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  validateEscapes: <span class=\"hljs-function\"><span class=\"hljs-params\">(str, options = {})</span> -&gt;</span>\n    invalidEscapeRegex =\n      <span class=\"hljs-keyword\">if</span> options.isRegex\n        REGEX_INVALID_ESCAPE\n      <span class=\"hljs-keyword\">else</span>\n        STRING_INVALID_ESCAPE\n    match = invalidEscapeRegex.exec str\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> match\n    [[], before, octal, hex, unicodeCodePoint, unicode] = match\n    message =\n      <span class=\"hljs-keyword\">if</span> octal\n        <span class=\"hljs-string\">&quot;octal escape sequences are not allowed&quot;</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">&quot;invalid escape sequence&quot;</span>\n    invalidEscape = <span class=\"hljs-string\">&quot;\\\\<span class=\"hljs-subst\">#{octal <span class=\"hljs-keyword\">or</span> hex <span class=\"hljs-keyword\">or</span> unicodeCodePoint <span class=\"hljs-keyword\">or</span> unicode}</span>&quot;</span>\n    @error <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{message}</span> <span class=\"hljs-subst\">#{invalidEscape}</span>&quot;</span>,\n      offset: (options.offsetInChunk ? <span class=\"hljs-number\">0</span>) + match.index + before.length\n      length: invalidEscape.length\n\n  suppressSemicolons: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">while</span> @value() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;;&#x27;</span>\n      @tokens.pop()\n      @error <span class=\"hljs-string\">&#x27;unexpected ;&#x27;</span> <span class=\"hljs-keyword\">if</span> @prev()?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;=&#x27;</span>, UNFINISHED...]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-80\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-80\">&#x00a7;</a>\n              </div>\n              <p>Throws an error at either a given offset from the current chunk or at the\nlocation of a token (<code>token[2]</code>).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  error: <span class=\"hljs-function\"><span class=\"hljs-params\">(message, options = {})</span> =&gt;</span>\n    location =\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">&#x27;first_line&#x27;</span> <span class=\"hljs-keyword\">of</span> options\n        options\n      <span class=\"hljs-keyword\">else</span>\n        [first_line, first_column] = @getLineAndColumnFromChunk options.offset ? <span class=\"hljs-number\">0</span>\n        {first_line, first_column, last_column: first_column + (options.length ? <span class=\"hljs-number\">1</span>) - <span class=\"hljs-number\">1</span>}\n    throwSyntaxError message, location</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-81\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-81\">&#x00a7;</a>\n              </div>\n              <h2 id=\"helper-functions\">Helper functions</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-82\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-82\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">\n<span class=\"hljs-title\">isUnassignable</span> = <span class=\"hljs-params\">(name, displayName = name)</span> -&gt;</span> <span class=\"hljs-keyword\">switch</span>\n  <span class=\"hljs-keyword\">when</span> name <span class=\"hljs-keyword\">in</span> [JS_KEYWORDS..., COFFEE_KEYWORDS...]\n    <span class=\"hljs-string\">&quot;keyword &#x27;<span class=\"hljs-subst\">#{displayName}</span>&#x27; can&#x27;t be assigned&quot;</span>\n  <span class=\"hljs-keyword\">when</span> name <span class=\"hljs-keyword\">in</span> STRICT_PROSCRIBED\n    <span class=\"hljs-string\">&quot;&#x27;<span class=\"hljs-subst\">#{displayName}</span>&#x27; can&#x27;t be assigned&quot;</span>\n  <span class=\"hljs-keyword\">when</span> name <span class=\"hljs-keyword\">in</span> RESERVED\n    <span class=\"hljs-string\">&quot;reserved word &#x27;<span class=\"hljs-subst\">#{displayName}</span>&#x27; can&#x27;t be assigned&quot;</span>\n  <span class=\"hljs-keyword\">else</span>\n    <span class=\"hljs-literal\">false</span>\n\n<span class=\"hljs-built_in\">exports</span>.isUnassignable = isUnassignable</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-83\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-83\">&#x00a7;</a>\n              </div>\n              <p><code>from</code> isn’t a CoffeeScript keyword, but it behaves like one in <code>import</code> and\n<code>export</code> statements (handled above) and in the declaration line of a <code>for</code>\nloop. Try to detect when <code>from</code> is a variable identifier and when it is this\n“sometimes” keyword.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">isForFrom</span> = <span class=\"hljs-params\">(prev)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-84\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-84\">&#x00a7;</a>\n              </div>\n              <p><code>for i from iterable</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>\n    <span class=\"hljs-literal\">yes</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-85\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-85\">&#x00a7;</a>\n              </div>\n              <p><code>for from…</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;FOR&#x27;</span>\n    <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-86\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-86\">&#x00a7;</a>\n              </div>\n              <p><code>for {from}…</code>, <code>for [from]…</code>, <code>for {a, from}…</code>, <code>for {a: from}…</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prev[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;{&#x27;</span>, <span class=\"hljs-string\">&#x27;[&#x27;</span>, <span class=\"hljs-string\">&#x27;,&#x27;</span>, <span class=\"hljs-string\">&#x27;:&#x27;</span>]\n    <span class=\"hljs-literal\">no</span>\n  <span class=\"hljs-keyword\">else</span>\n    <span class=\"hljs-literal\">yes</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">addTokenData</span> = <span class=\"hljs-params\">(token, data)</span> -&gt;</span>\n  <span class=\"hljs-built_in\">Object</span>.assign (token.data ?= {}), data</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-87\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-87\">&#x00a7;</a>\n              </div>\n              <h2 id=\"constants\">Constants</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-88\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-88\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-89\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-89\">&#x00a7;</a>\n              </div>\n              <p>Keywords that CoffeeScript shares in common with JavaScript.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>JS_KEYWORDS = [\n  <span class=\"hljs-string\">&#x27;true&#x27;</span>, <span class=\"hljs-string\">&#x27;false&#x27;</span>, <span class=\"hljs-string\">&#x27;null&#x27;</span>, <span class=\"hljs-string\">&#x27;this&#x27;</span>\n  <span class=\"hljs-string\">&#x27;new&#x27;</span>, <span class=\"hljs-string\">&#x27;delete&#x27;</span>, <span class=\"hljs-string\">&#x27;typeof&#x27;</span>, <span class=\"hljs-string\">&#x27;in&#x27;</span>, <span class=\"hljs-string\">&#x27;instanceof&#x27;</span>\n  <span class=\"hljs-string\">&#x27;return&#x27;</span>, <span class=\"hljs-string\">&#x27;throw&#x27;</span>, <span class=\"hljs-string\">&#x27;break&#x27;</span>, <span class=\"hljs-string\">&#x27;continue&#x27;</span>, <span class=\"hljs-string\">&#x27;debugger&#x27;</span>, <span class=\"hljs-string\">&#x27;yield&#x27;</span>, <span class=\"hljs-string\">&#x27;await&#x27;</span>\n  <span class=\"hljs-string\">&#x27;if&#x27;</span>, <span class=\"hljs-string\">&#x27;else&#x27;</span>, <span class=\"hljs-string\">&#x27;switch&#x27;</span>, <span class=\"hljs-string\">&#x27;for&#x27;</span>, <span class=\"hljs-string\">&#x27;while&#x27;</span>, <span class=\"hljs-string\">&#x27;do&#x27;</span>, <span class=\"hljs-string\">&#x27;try&#x27;</span>, <span class=\"hljs-string\">&#x27;catch&#x27;</span>, <span class=\"hljs-string\">&#x27;finally&#x27;</span>\n  <span class=\"hljs-string\">&#x27;class&#x27;</span>, <span class=\"hljs-string\">&#x27;extends&#x27;</span>, <span class=\"hljs-string\">&#x27;super&#x27;</span>\n  <span class=\"hljs-string\">&#x27;import&#x27;</span>, <span class=\"hljs-string\">&#x27;export&#x27;</span>, <span class=\"hljs-string\">&#x27;default&#x27;</span>\n]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-90\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-90\">&#x00a7;</a>\n              </div>\n              <p>CoffeeScript-only keywords.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>COFFEE_KEYWORDS = [\n  <span class=\"hljs-string\">&#x27;undefined&#x27;</span>, <span class=\"hljs-string\">&#x27;Infinity&#x27;</span>, <span class=\"hljs-string\">&#x27;NaN&#x27;</span>\n  <span class=\"hljs-string\">&#x27;then&#x27;</span>, <span class=\"hljs-string\">&#x27;unless&#x27;</span>, <span class=\"hljs-string\">&#x27;until&#x27;</span>, <span class=\"hljs-string\">&#x27;loop&#x27;</span>, <span class=\"hljs-string\">&#x27;of&#x27;</span>, <span class=\"hljs-string\">&#x27;by&#x27;</span>, <span class=\"hljs-string\">&#x27;when&#x27;</span>\n]\n\nCOFFEE_ALIAS_MAP =\n  <span class=\"hljs-keyword\">and</span>  : <span class=\"hljs-string\">&#x27;&amp;&amp;&#x27;</span>\n  <span class=\"hljs-keyword\">or</span>   : <span class=\"hljs-string\">&#x27;||&#x27;</span>\n  <span class=\"hljs-keyword\">is</span>   : <span class=\"hljs-string\">&#x27;==&#x27;</span>\n  <span class=\"hljs-keyword\">isnt</span> : <span class=\"hljs-string\">&#x27;!=&#x27;</span>\n  <span class=\"hljs-keyword\">not</span>  : <span class=\"hljs-string\">&#x27;!&#x27;</span>\n  <span class=\"hljs-literal\">yes</span>  : <span class=\"hljs-string\">&#x27;true&#x27;</span>\n  <span class=\"hljs-literal\">no</span>   : <span class=\"hljs-string\">&#x27;false&#x27;</span>\n  <span class=\"hljs-literal\">on</span>   : <span class=\"hljs-string\">&#x27;true&#x27;</span>\n  <span class=\"hljs-literal\">off</span>  : <span class=\"hljs-string\">&#x27;false&#x27;</span>\n\nCOFFEE_ALIASES  = (key <span class=\"hljs-keyword\">for</span> key <span class=\"hljs-keyword\">of</span> COFFEE_ALIAS_MAP)\nCOFFEE_KEYWORDS = COFFEE_KEYWORDS.concat COFFEE_ALIASES</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-91\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-91\">&#x00a7;</a>\n              </div>\n              <p>The list of keywords that are reserved by JavaScript, but not used, or are\nused by CoffeeScript internally. We throw an error when these are encountered,\nto avoid having a JavaScript error at runtime.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>RESERVED = [\n  <span class=\"hljs-string\">&#x27;case&#x27;</span>, <span class=\"hljs-string\">&#x27;function&#x27;</span>, <span class=\"hljs-string\">&#x27;var&#x27;</span>, <span class=\"hljs-string\">&#x27;void&#x27;</span>, <span class=\"hljs-string\">&#x27;with&#x27;</span>, <span class=\"hljs-string\">&#x27;const&#x27;</span>, <span class=\"hljs-string\">&#x27;let&#x27;</span>, <span class=\"hljs-string\">&#x27;enum&#x27;</span>\n  <span class=\"hljs-string\">&#x27;native&#x27;</span>, <span class=\"hljs-string\">&#x27;implements&#x27;</span>, <span class=\"hljs-string\">&#x27;interface&#x27;</span>, <span class=\"hljs-string\">&#x27;package&#x27;</span>, <span class=\"hljs-string\">&#x27;private&#x27;</span>\n  <span class=\"hljs-string\">&#x27;protected&#x27;</span>, <span class=\"hljs-string\">&#x27;public&#x27;</span>, <span class=\"hljs-string\">&#x27;static&#x27;</span>\n]\n\nSTRICT_PROSCRIBED = [<span class=\"hljs-string\">&#x27;arguments&#x27;</span>, <span class=\"hljs-string\">&#x27;eval&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-92\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-92\">&#x00a7;</a>\n              </div>\n              <p>The superset of both JavaScript keywords and reserved words, none of which may\nbe used as identifiers or properties.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-93\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-93\">&#x00a7;</a>\n              </div>\n              <p>The character code of the nasty Microsoft madness otherwise known as the BOM.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>BOM = <span class=\"hljs-number\">65279</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-94\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-94\">&#x00a7;</a>\n              </div>\n              <p>Token matching regexes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>IDENTIFIER = <span class=\"hljs-regexp\">/// ^\n  (?!\\d)\n  ( (?: (?!\\s)[$\\w\\x7f-\\uffff] )+ )\n  ( [^\\n\\S]* : (?!:) )?  <span class=\"hljs-comment\"># Is this a property name?</span>\n///</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-95\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-95\">&#x00a7;</a>\n              </div>\n              <p>Like <code>IDENTIFIER</code>, but includes <code>-</code>s</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>JSX_IDENTIFIER_PART = <span class=\"hljs-regexp\">/// (?: (?!\\s)[\\-$\\w\\x7f-\\uffff] )+ ///</span>.source</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-96\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-96\">&#x00a7;</a>\n              </div>\n              <p>In <a href=\"https://facebook.github.io/jsx/\">https://facebook.github.io/jsx/</a> spec, JSXElementName can be\nJSXIdentifier, JSXNamespacedName (JSXIdentifier : JSXIdentifier), or\nJSXMemberExpression (two or more JSXIdentifier connected by <code>.</code>s).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>JSX_IDENTIFIER = <span class=\"hljs-regexp\">/// ^\n  (?![\\d&lt;]) <span class=\"hljs-comment\"># Must not start with `&lt;`.</span>\n  ( <span class=\"hljs-subst\">#{JSX_IDENTIFIER_PART}</span>\n    (?: \\s* : \\s* <span class=\"hljs-subst\">#{JSX_IDENTIFIER_PART}</span>       <span class=\"hljs-comment\"># JSXNamespacedName</span>\n    | (?: \\s* \\. \\s* <span class=\"hljs-subst\">#{JSX_IDENTIFIER_PART}</span> )+ <span class=\"hljs-comment\"># JSXMemberExpression</span>\n    )? )\n///</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-97\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-97\">&#x00a7;</a>\n              </div>\n              <p>Fragment: &lt;&gt;&lt;/&gt;</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>JSX_FRAGMENT_IDENTIFIER = <span class=\"hljs-regexp\">/// ^\n  ()&gt; <span class=\"hljs-comment\"># Ends immediately with `&gt;`.</span>\n///</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-98\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-98\">&#x00a7;</a>\n              </div>\n              <p>In <a href=\"https://facebook.github.io/jsx/\">https://facebook.github.io/jsx/</a> spec, JSXAttributeName can be either\nJSXIdentifier or JSXNamespacedName which is JSXIdentifier : JSXIdentifier</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>JSX_ATTRIBUTE = <span class=\"hljs-regexp\">/// ^\n  (?!\\d)\n  ( <span class=\"hljs-subst\">#{JSX_IDENTIFIER_PART}</span>\n    (?: \\s* : \\s* <span class=\"hljs-subst\">#{JSX_IDENTIFIER_PART}</span>       <span class=\"hljs-comment\"># JSXNamespacedName</span>\n    )? )\n  ( [^\\S]* = (?!=) )?  <span class=\"hljs-comment\"># Is this an attribute with a value?</span>\n///</span>\n\nNUMBER     = <span class=\"hljs-regexp\">///\n  ^ 0b[01](?:_?[01])*n?                         | <span class=\"hljs-comment\"># binary</span>\n  ^ 0o[0-7](?:_?[0-7])*n?                       | <span class=\"hljs-comment\"># octal</span>\n  ^ 0x[\\da-f](?:_?[\\da-f])*n?                   | <span class=\"hljs-comment\"># hex</span>\n  ^ \\d+(?:_\\d+)*n                               | <span class=\"hljs-comment\"># decimal bigint</span>\n  ^ (?:\\d+(?:_\\d+)*)?      \\.? \\d+(?:_\\d+)*       <span class=\"hljs-comment\"># decimal</span>\n                     (?:e[+-]? \\d+(?:_\\d+)* )?\n</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-99\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-99\">&#x00a7;</a>\n              </div>\n              <p>decimal without support for numeric literal separators for reference:\n\\d*.?\\d+ (?:e[+-]?\\d+)?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-regexp\">///i\n\nOPERATOR   = ///</span> ^ (\n  ?: [-=]&gt;             <span class=\"hljs-comment\"># function</span>\n   | [-+*<span class=\"hljs-regexp\">/%&lt;&gt;&amp;|^!?=]=  # compound assign /</span> compare\n   | &gt;&gt;&gt;=?             <span class=\"hljs-comment\"># zero-fill right shift</span>\n   | ([-+:])\\<span class=\"hljs-number\">1</span>         <span class=\"hljs-comment\"># doubles</span>\n   | ([&amp;|&lt;&gt;*<span class=\"hljs-regexp\">/%])\\2=?   # logic /</span> shift / power / floor division / modulo\n   | \\?(\\.|::)         <span class=\"hljs-comment\"># soak access</span>\n   | \\.{<span class=\"hljs-number\">2</span>,<span class=\"hljs-number\">3</span>}           <span class=\"hljs-comment\"># range or splat</span>\n) <span class=\"hljs-regexp\">///\n\nWHITESPACE = /^[^\\n\\S]+/\n\nCOMMENT    = /^(\\s*)<span class=\"hljs-comment\">###([^#][\\s\\S]*?)(?:###([^\\n\\S]*)|###$)|^((?:\\s*#(?!##[^#]).*)+)/</span>\n\nCODE       = /^[-=]&gt;/\n\nMULTI_DENT = /^(?:\\n[^\\n\\S]*)+/\n\nJSTOKEN      = ///</span>^ `<span class=\"language-javascript\">(?!</span>``<span class=\"language-javascript\">) ((?: [^</span>`\\\\] | \\\\[\\s\\S]           )*) `<span class=\"language-javascript\">   <span class=\"hljs-comment\">///</span>\n<span class=\"hljs-variable constant_\">HERE_JSTOKEN</span> = <span class=\"hljs-comment\">///^ </span></span>```     ((?: [^`<span class=\"language-javascript\">\\\\] | \\\\[\\s\\S] | </span>`(?!``) )*) ```<span class=\"language-javascript\"> <span class=\"hljs-comment\">///</span>\n\n</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-100\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-100\">&#x00a7;</a>\n              </div>\n              <p>String-matching-regexes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>STRING_START   = <span class=\"hljs-regexp\">/^(?:&#x27;&#x27;&#x27;|&quot;&quot;&quot;|&#x27;|&quot;)/</span>\n\nSTRING_SINGLE  = <span class=\"hljs-regexp\">/// ^(?: [^\\\\&#x27;]  | \\\\[\\s\\S]                      )* ///</span>\nSTRING_DOUBLE  = <span class=\"hljs-regexp\">/// ^(?: [^\\\\&quot;<span class=\"hljs-comment\">#] | \\\\[\\s\\S] |           \\#(?!\\{) )* ///</span>\nHEREDOC_SINGLE = ///</span> ^(?: [^\\\\<span class=\"hljs-string\">&#x27;]  | \\\\[\\s\\S] | &#x27;</span>(?!<span class=\"hljs-string\">&#x27;&#x27;</span>)            )* <span class=\"hljs-regexp\">///\nHEREDOC_DOUBLE = ///</span> ^(?: [^\\\\<span class=\"hljs-string\">&quot;#] | \\\\[\\s\\S] | &quot;</span>(?!<span class=\"hljs-string\">&quot;&quot;</span>) | \\<span class=\"hljs-comment\">#(?!\\{) )* ///</span>\n\nINSIDE_JSX = <span class=\"hljs-regexp\">/// ^(?:\n    [^\n      \\{ <span class=\"hljs-comment\"># Start of CoffeeScript interpolation.</span>\n      &lt;  <span class=\"hljs-comment\"># Maybe JSX tag (`&lt;` not allowed even if bare).</span>\n    ]\n  )* ///</span> <span class=\"hljs-comment\"># Similar to `HEREDOC_DOUBLE` but there is no escaping.</span>\nJSX_INTERPOLATION = <span class=\"hljs-regexp\">/// ^(?:\n      \\{       <span class=\"hljs-comment\"># CoffeeScript interpolation.</span>\n    | &lt;(?!/)   <span class=\"hljs-comment\"># JSX opening tag.</span>\n  )///</span>\n\nHEREDOC_INDENT     = <span class=\"hljs-regexp\">/\\n+([^\\n\\S]*)(?=\\S)/g</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-101\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-101\">&#x00a7;</a>\n              </div>\n              <p>Regex-matching-regexes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>REGEX = <span class=\"hljs-regexp\">/// ^\n  / (?!/) ((\n  ?: [^ [ / \\n \\\\ ]  <span class=\"hljs-comment\"># Every other thing.</span>\n   | \\\\[^\\n]         <span class=\"hljs-comment\"># Anything but newlines escaped.</span>\n   | \\[              <span class=\"hljs-comment\"># Character class.</span>\n       (?: \\\\[^\\n] | [^ \\] \\n \\\\ ] )*\n     \\]\n  )*) (/)?\n///</span>\n\nREGEX_FLAGS  = <span class=\"hljs-regexp\">/^\\w*/</span>\nVALID_FLAGS  = <span class=\"hljs-regexp\">/^(?!.*(.).*\\1)[gimsuy]*$/</span>\n\nHEREGEX      = <span class=\"hljs-regexp\">/// ^\n  (?:\n</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-102\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-102\">&#x00a7;</a>\n              </div>\n              <p>Match any character, except those that need special handling below.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      [^\\\\/<span class=\"hljs-comment\">#\\s]</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-103\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-103\">&#x00a7;</a>\n              </div>\n              <p>Match <code>\\</code> followed by any character.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    | \\\\[\\s\\S]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-104\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-104\">&#x00a7;</a>\n              </div>\n              <p>Match any <code>/</code> except <code>///</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    | <span class=\"hljs-regexp\">/(?!/</span>/)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-105\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-105\">&#x00a7;</a>\n              </div>\n              <p>Match <code>#</code> which is not part of interpolation, e.g. <code>#{}</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    | \\<span class=\"hljs-comment\">#(?!\\{)</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-106\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-106\">&#x00a7;</a>\n              </div>\n              <p>Comments consume everything until the end of the line, including <code>///</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    | \\s+(?:<span class=\"hljs-comment\">#(?!\\{).*)?</span>\n  )*\n<span class=\"hljs-regexp\">///\n\nHEREGEX_COMMENT = /(\\s+)(<span class=\"hljs-comment\">#(?!{).*)/gm</span>\n\nREGEX_ILLEGAL = ///</span> ^ ( / | <span class=\"hljs-regexp\">/{3}\\s*) (\\*) /</span><span class=\"hljs-regexp\">//</span>\n\nPOSSIBLY_DIVISION   = <span class=\"hljs-regexp\">/// ^ /=?\\s ///</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-107\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-107\">&#x00a7;</a>\n              </div>\n              <p>Other regexes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>HERECOMMENT_ILLEGAL = <span class=\"hljs-regexp\">/\\*\\//</span>\n\nLINE_CONTINUER      = <span class=\"hljs-regexp\">/// ^ \\s* (?: , | \\??\\.(?![.\\d]) | \\??:: ) ///</span>\n\nSTRING_INVALID_ESCAPE = <span class=\"hljs-regexp\">///\n  ( (?:^|[^\\\\]) (?:\\\\\\\\)* )        <span class=\"hljs-comment\"># Make sure the escape isn’t escaped.</span>\n  \\\\ (\n     ?: (0\\d|[1-7])                <span class=\"hljs-comment\"># octal escape</span>\n      | (x(?![\\da-fA-F]{2}).{0,2}) <span class=\"hljs-comment\"># hex escape</span>\n      | (u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?) <span class=\"hljs-comment\"># unicode code point escape</span>\n      | (u(?!\\{|[\\da-fA-F]{4}).{0,4}) <span class=\"hljs-comment\"># unicode escape</span>\n  )\n///</span>\nREGEX_INVALID_ESCAPE = <span class=\"hljs-regexp\">///\n  ( (?:^|[^\\\\]) (?:\\\\\\\\)* )        <span class=\"hljs-comment\"># Make sure the escape isn’t escaped.</span>\n  \\\\ (\n     ?: (0\\d)                      <span class=\"hljs-comment\"># octal escape</span>\n      | (x(?![\\da-fA-F]{2}).{0,2}) <span class=\"hljs-comment\"># hex escape</span>\n      | (u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?) <span class=\"hljs-comment\"># unicode code point escape</span>\n      | (u(?!\\{|[\\da-fA-F]{4}).{0,4}) <span class=\"hljs-comment\"># unicode escape</span>\n  )\n///</span>\n\nTRAILING_SPACES     = <span class=\"hljs-regexp\">/\\s+$/</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-108\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-108\">&#x00a7;</a>\n              </div>\n              <p>Compound assignment tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>COMPOUND_ASSIGN = [\n  <span class=\"hljs-string\">&#x27;-=&#x27;</span>, <span class=\"hljs-string\">&#x27;+=&#x27;</span>, <span class=\"hljs-string\">&#x27;/=&#x27;</span>, <span class=\"hljs-string\">&#x27;*=&#x27;</span>, <span class=\"hljs-string\">&#x27;%=&#x27;</span>, <span class=\"hljs-string\">&#x27;||=&#x27;</span>, <span class=\"hljs-string\">&#x27;&amp;&amp;=&#x27;</span>, <span class=\"hljs-string\">&#x27;?=&#x27;</span>, <span class=\"hljs-string\">&#x27;&lt;&lt;=&#x27;</span>, <span class=\"hljs-string\">&#x27;&gt;&gt;=&#x27;</span>, <span class=\"hljs-string\">&#x27;&gt;&gt;&gt;=&#x27;</span>\n  <span class=\"hljs-string\">&#x27;&amp;=&#x27;</span>, <span class=\"hljs-string\">&#x27;^=&#x27;</span>, <span class=\"hljs-string\">&#x27;|=&#x27;</span>, <span class=\"hljs-string\">&#x27;**=&#x27;</span>, <span class=\"hljs-string\">&#x27;//=&#x27;</span>, <span class=\"hljs-string\">&#x27;%%=&#x27;</span>\n]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-109\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-109\">&#x00a7;</a>\n              </div>\n              <p>Unary tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>UNARY = [<span class=\"hljs-string\">&#x27;NEW&#x27;</span>, <span class=\"hljs-string\">&#x27;TYPEOF&#x27;</span>, <span class=\"hljs-string\">&#x27;DELETE&#x27;</span>]\n\nUNARY_MATH = [<span class=\"hljs-string\">&#x27;!&#x27;</span>, <span class=\"hljs-string\">&#x27;~&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-110\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-110\">&#x00a7;</a>\n              </div>\n              <p>Bit-shifting tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>SHIFT = [<span class=\"hljs-string\">&#x27;&lt;&lt;&#x27;</span>, <span class=\"hljs-string\">&#x27;&gt;&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;&gt;&gt;&gt;&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-111\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-111\">&#x00a7;</a>\n              </div>\n              <p>Comparison tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>COMPARE = [<span class=\"hljs-string\">&#x27;==&#x27;</span>, <span class=\"hljs-string\">&#x27;!=&#x27;</span>, <span class=\"hljs-string\">&#x27;&lt;&#x27;</span>, <span class=\"hljs-string\">&#x27;&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;&lt;=&#x27;</span>, <span class=\"hljs-string\">&#x27;&gt;=&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-112\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-112\">&#x00a7;</a>\n              </div>\n              <p>Mathematical tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>MATH = [<span class=\"hljs-string\">&#x27;*&#x27;</span>, <span class=\"hljs-string\">&#x27;/&#x27;</span>, <span class=\"hljs-string\">&#x27;%&#x27;</span>, <span class=\"hljs-string\">&#x27;//&#x27;</span>, <span class=\"hljs-string\">&#x27;%%&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-113\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-113\">&#x00a7;</a>\n              </div>\n              <p>Relational tokens that are negatable with <code>not</code> prefix.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>RELATION = [<span class=\"hljs-string\">&#x27;IN&#x27;</span>, <span class=\"hljs-string\">&#x27;OF&#x27;</span>, <span class=\"hljs-string\">&#x27;INSTANCEOF&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-114\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-114\">&#x00a7;</a>\n              </div>\n              <p>Boolean tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>BOOL = [<span class=\"hljs-string\">&#x27;TRUE&#x27;</span>, <span class=\"hljs-string\">&#x27;FALSE&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-115\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-115\">&#x00a7;</a>\n              </div>\n              <p>Tokens which could legitimately be invoked or indexed. An opening\nparentheses or bracket following these tokens will be recorded as the start\nof a function invocation or indexing operation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CALLABLE  = [<span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>, <span class=\"hljs-string\">&#x27;PROPERTY&#x27;</span>, <span class=\"hljs-string\">&#x27;)&#x27;</span>, <span class=\"hljs-string\">&#x27;]&#x27;</span>, <span class=\"hljs-string\">&#x27;?&#x27;</span>, <span class=\"hljs-string\">&#x27;@&#x27;</span>, <span class=\"hljs-string\">&#x27;THIS&#x27;</span>, <span class=\"hljs-string\">&#x27;SUPER&#x27;</span>, <span class=\"hljs-string\">&#x27;DYNAMIC_IMPORT&#x27;</span>]\nINDEXABLE = CALLABLE.concat [\n  <span class=\"hljs-string\">&#x27;NUMBER&#x27;</span>, <span class=\"hljs-string\">&#x27;INFINITY&#x27;</span>, <span class=\"hljs-string\">&#x27;NAN&#x27;</span>, <span class=\"hljs-string\">&#x27;STRING&#x27;</span>, <span class=\"hljs-string\">&#x27;STRING_END&#x27;</span>, <span class=\"hljs-string\">&#x27;REGEX&#x27;</span>, <span class=\"hljs-string\">&#x27;REGEX_END&#x27;</span>\n  <span class=\"hljs-string\">&#x27;BOOL&#x27;</span>, <span class=\"hljs-string\">&#x27;NULL&#x27;</span>, <span class=\"hljs-string\">&#x27;UNDEFINED&#x27;</span>, <span class=\"hljs-string\">&#x27;}&#x27;</span>, <span class=\"hljs-string\">&#x27;::&#x27;</span>\n]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-116\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-116\">&#x00a7;</a>\n              </div>\n              <p>Tokens which can be the left-hand side of a less-than comparison, i.e. <code>a&lt;b</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>COMPARABLE_LEFT_SIDE = [<span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>, <span class=\"hljs-string\">&#x27;)&#x27;</span>, <span class=\"hljs-string\">&#x27;]&#x27;</span>, <span class=\"hljs-string\">&#x27;NUMBER&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-117\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-117\">&#x00a7;</a>\n              </div>\n              <p>Tokens which a regular expression will never immediately follow (except spaced\nCALLABLEs in some cases), but which a division operator can.</p>\n<p>See: <a href=\"http://www-archive.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions\">http://www-archive.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions</a></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>NOT_REGEX = INDEXABLE.concat [<span class=\"hljs-string\">&#x27;++&#x27;</span>, <span class=\"hljs-string\">&#x27;--&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-118\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-118\">&#x00a7;</a>\n              </div>\n              <p>Tokens that, when immediately preceding a <code>WHEN</code>, indicate that the <code>WHEN</code>\noccurs at the start of a line. We disambiguate these from trailing whens to\navoid an ambiguity in the grammar.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>LINE_BREAK = [<span class=\"hljs-string\">&#x27;INDENT&#x27;</span>, <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>, <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-119\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-119\">&#x00a7;</a>\n              </div>\n              <p>Additional indent in front of these is ignored.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>INDENTABLE_CLOSERS = [<span class=\"hljs-string\">&#x27;)&#x27;</span>, <span class=\"hljs-string\">&#x27;}&#x27;</span>, <span class=\"hljs-string\">&#x27;]&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/nodes.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>nodes.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>nodes.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              <p><code>nodes.coffee</code> contains all of the node classes for the syntax tree. Most\nnodes are created as the result of actions in the <a href=\"grammar.html\">grammar</a>,\nbut some are created by other nodes as a method of code generation. To convert\nthe syntax tree into a string of JavaScript code, call <code>compile()</code> on the root.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n<span class=\"hljs-built_in\">Error</span>.stackTraceLimit = <span class=\"hljs-literal\">Infinity</span>\n\n{Scope} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./scope&#x27;</span>\n{isUnassignable, JS_FORBIDDEN} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./lexer&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>Import the helpers we plan to use.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>{compact, flatten, extend, merge, del, starts, ends, some,\naddDataToNode, attachCommentsToNode, locationDataToString,\nthrowSyntaxError, replaceUnicodeCodePointEscapes,\nisFunction, isPlainObject, isNumber, parseNumber} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./helpers&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <p>Functions required by parser.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.extend = extend\n<span class=\"hljs-built_in\">exports</span>.addDataToNode = addDataToNode</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              <p>Constant functions for nodes that don’t need customization.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">YES</span>     = -&gt;</span> <span class=\"hljs-literal\">yes</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">NO</span>      = -&gt;</span> <span class=\"hljs-literal\">no</span>\n<span class=\"hljs-function\"><span class=\"hljs-title\">THIS</span>    = -&gt;</span> this\n<span class=\"hljs-function\"><span class=\"hljs-title\">NEGATE</span>  = -&gt;</span> @negated = <span class=\"hljs-keyword\">not</span> @negated; this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <h3 id=\"codefragment\">CodeFragment</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>The various nodes defined below all compile to a collection of <strong>CodeFragment</strong> objects.\nA CodeFragments is a block of generated code, and the location in the source file where the code\ncame from. CodeFragments can be assembled together into working code just by catting together\nall the CodeFragments’ <code>code</code> snippets, in order.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.CodeFragment = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">CodeFragment</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(parent, code)</span> -&gt;</span>\n    @code = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{code}</span>&quot;</span>\n    @type = parent?.constructor?.name <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&#x27;unknown&#x27;</span>\n    @locationData = parent?.locationData\n    @comments = parent?.comments\n\n  toString: <span class=\"hljs-function\">-&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>This is only intended for debugging.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@code}</span><span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @locationData <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;: &quot;</span> + locationDataToString(@locationData) <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>}</span>&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>Convert an array of CodeFragments into a string.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">fragmentsToText</span> = <span class=\"hljs-params\">(fragments)</span> -&gt;</span>\n  (fragment.code <span class=\"hljs-keyword\">for</span> fragment <span class=\"hljs-keyword\">in</span> fragments).join(<span class=\"hljs-string\">&#x27;&#x27;</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <h3 id=\"base\">Base</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>The <strong>Base</strong> is the abstract base class for all nodes in the syntax tree.\nEach subclass implements the <code>compileNode</code> method, which performs the\ncode generation for that node. To compile a node to JavaScript,\ncall <code>compile</code> on it, which wraps <code>compileNode</code> in some generic extra smarts,\nto know when the generated code needs to be wrapped up in a closure.\nAn options hash is passed and cloned throughout, containing information about\nthe environment from higher in the tree (such as if a returned value is\nbeing requested by the surrounding function), information about the current\nscope, and indentation level.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Base = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Base</span></span>\n\n  compile: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, lvl)</span> -&gt;</span>\n    fragmentsToText @compileToFragments o, lvl</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-11\">&#x00a7;</a>\n              </div>\n              <p>Occasionally a node is compiled multiple times, for example to get the name\nof a variable to add to scope tracking. When we know that a “premature”\ncompilation won’t result in comments being output, set those comments aside\nso that they’re preserved for a later <code>compile</code> call that will result in\nthe comments being included in the output.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileWithoutComments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, lvl, method = <span class=\"hljs-string\">&#x27;compile&#x27;</span>)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @comments\n      @ignoreTheseCommentsTemporarily = @comments\n      <span class=\"hljs-keyword\">delete</span> @comments\n    unwrapped = @unwrapAll()\n    <span class=\"hljs-keyword\">if</span> unwrapped.comments\n      unwrapped.ignoreTheseCommentsTemporarily = unwrapped.comments\n      <span class=\"hljs-keyword\">delete</span> unwrapped.comments\n\n    fragments = @[method] o, lvl\n\n    <span class=\"hljs-keyword\">if</span> @ignoreTheseCommentsTemporarily\n      @comments = @ignoreTheseCommentsTemporarily\n      <span class=\"hljs-keyword\">delete</span> @ignoreTheseCommentsTemporarily\n    <span class=\"hljs-keyword\">if</span> unwrapped.ignoreTheseCommentsTemporarily\n      unwrapped.comments = unwrapped.ignoreTheseCommentsTemporarily\n      <span class=\"hljs-keyword\">delete</span> unwrapped.ignoreTheseCommentsTemporarily\n\n    fragments\n\n  compileNodeWithoutComments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, lvl)</span> -&gt;</span>\n    @compileWithoutComments o, lvl, <span class=\"hljs-string\">&#x27;compileNode&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-12\">&#x00a7;</a>\n              </div>\n              <p>Common logic for determining whether to wrap this node in a closure before\ncompiling it, or to compile directly. We need to wrap if this node is a\n<em>statement</em>, and it’s not a <em>pureStatement</em>, and we’re not at\nthe top level of a block (which would be unnecessary), and we haven’t\nalready been asked to return the result (because statements know how to\nreturn results).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, lvl)</span> -&gt;</span>\n    o        = extend {}, o\n    o.level  = lvl <span class=\"hljs-keyword\">if</span> lvl\n    node     = @unfoldSoak(o) <span class=\"hljs-keyword\">or</span> this\n    node.tab = o.indent\n\n    fragments = <span class=\"hljs-keyword\">if</span> o.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> node.isStatement(o)\n      node.compileNode o\n    <span class=\"hljs-keyword\">else</span>\n      node.compileClosure o\n    @compileCommentFragments o, node, fragments\n    fragments\n\n  compileToFragmentsWithoutComments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, lvl)</span> -&gt;</span>\n    @compileWithoutComments o, lvl, <span class=\"hljs-string\">&#x27;compileToFragments&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-13\">&#x00a7;</a>\n              </div>\n              <p>Statements converted into expressions via closure-wrapping share a scope\nobject with their parent closure, to preserve the expected lexical scope.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileClosure: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkForPureStatementInExpression()\n    o.sharedScope = <span class=\"hljs-literal\">yes</span>\n    func = <span class=\"hljs-keyword\">new</span> Code [], Block.wrap [this]\n    args = []\n    <span class=\"hljs-keyword\">if</span> @contains (<span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> -&gt;</span> node <span class=\"hljs-keyword\">instanceof</span> SuperCall)\n      func.bound = <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (argumentsNode = @contains isLiteralArguments) <span class=\"hljs-keyword\">or</span> @contains isLiteralThis\n      args = [<span class=\"hljs-keyword\">new</span> ThisLiteral]\n      <span class=\"hljs-keyword\">if</span> argumentsNode\n        meth = <span class=\"hljs-string\">&#x27;apply&#x27;</span>\n        args.push <span class=\"hljs-keyword\">new</span> IdentifierLiteral <span class=\"hljs-string\">&#x27;arguments&#x27;</span>\n      <span class=\"hljs-keyword\">else</span>\n        meth = <span class=\"hljs-string\">&#x27;call&#x27;</span>\n      func = <span class=\"hljs-keyword\">new</span> Value func, [<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName meth]\n    parts = (<span class=\"hljs-keyword\">new</span> Call func, args).compileNode o\n\n    <span class=\"hljs-keyword\">switch</span>\n      <span class=\"hljs-keyword\">when</span> func.isGenerator <span class=\"hljs-keyword\">or</span> func.base?.isGenerator\n        parts.unshift @makeCode <span class=\"hljs-string\">&quot;(yield* &quot;</span>\n        parts.push    @makeCode <span class=\"hljs-string\">&quot;)&quot;</span>\n      <span class=\"hljs-keyword\">when</span> func.isAsync <span class=\"hljs-keyword\">or</span> func.base?.isAsync\n        parts.unshift @makeCode <span class=\"hljs-string\">&quot;(await &quot;</span>\n        parts.push    @makeCode <span class=\"hljs-string\">&quot;)&quot;</span>\n    parts\n\n  compileCommentFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, node, fragments)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> fragments <span class=\"hljs-keyword\">unless</span> node.comments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-14\">&#x00a7;</a>\n              </div>\n              <p>This is where comments, that are attached to nodes as a <code>comments</code>\nproperty, become <code>CodeFragment</code>s. “Inline block comments,” e.g.\n<code>/* */</code>-delimited comments that are interspersed within code on a line,\nare added to the current <code>fragments</code> stream. All other fragments are\nattached as properties to the nearest preceding or following fragment,\nto remain stowaways until they get properly output in <code>compileComments</code>\nlater on.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">    <span class=\"hljs-title\">unshiftCommentFragment</span> = <span class=\"hljs-params\">(commentFragment)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">if</span> commentFragment.unshift</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-15\">&#x00a7;</a>\n              </div>\n              <p>Find the first non-comment fragment and insert <code>commentFragment</code>\nbefore it.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        unshiftAfterComments fragments, commentFragment\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">if</span> fragments.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n          precedingFragment = fragments[fragments.length - <span class=\"hljs-number\">1</span>]\n          <span class=\"hljs-keyword\">if</span> commentFragment.newLine <span class=\"hljs-keyword\">and</span> precedingFragment.code <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">and</span>\n             <span class=\"hljs-keyword\">not</span> <span class=\"hljs-regexp\">/\\n\\s*$/</span>.test precedingFragment.code\n            commentFragment.code = <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{commentFragment.code}</span>&quot;</span>\n        fragments.push commentFragment\n\n    <span class=\"hljs-keyword\">for</span> comment <span class=\"hljs-keyword\">in</span> node.comments <span class=\"hljs-keyword\">when</span> comment <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> @compiledComments\n      @compiledComments.push comment <span class=\"hljs-comment\"># Don’t output this comment twice.</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-16\">&#x00a7;</a>\n              </div>\n              <p>For block/here comments, denoted by <code>###</code>, that are inline comments\nlike <code>1 + ### comment ### 2</code>, create fragments and insert them into\nthe fragments array.\nOtherwise attach comment fragments to their closest fragment for now,\nso they can be inserted into the output later after all the newlines\nhave been added.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> comment.here <span class=\"hljs-comment\"># Block comment, delimited by `###`.</span>\n        commentFragment = <span class=\"hljs-keyword\">new</span> HereComment(comment).compileNode o\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-comment\"># Line comment, delimited by `#`.</span>\n        commentFragment = <span class=\"hljs-keyword\">new</span> LineComment(comment).compileNode o\n      <span class=\"hljs-keyword\">if</span> (commentFragment.isHereComment <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> commentFragment.newLine) <span class=\"hljs-keyword\">or</span>\n         node.includeCommentFragments()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-17\">&#x00a7;</a>\n              </div>\n              <p>Inline block comments, like <code>1 + /* comment */ 2</code>, or a node whose\n<code>compileToFragments</code> method has logic for outputting comments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        unshiftCommentFragment commentFragment\n      <span class=\"hljs-keyword\">else</span>\n        fragments.push @makeCode <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">if</span> fragments.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n        <span class=\"hljs-keyword\">if</span> commentFragment.unshift\n          fragments[<span class=\"hljs-number\">0</span>].precedingComments ?= []\n          fragments[<span class=\"hljs-number\">0</span>].precedingComments.push commentFragment\n        <span class=\"hljs-keyword\">else</span>\n          fragments[fragments.length - <span class=\"hljs-number\">1</span>].followingComments ?= []\n          fragments[fragments.length - <span class=\"hljs-number\">1</span>].followingComments.push commentFragment\n    fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-18\">&#x00a7;</a>\n              </div>\n              <p>If the code generation wishes to use the result of a complex expression\nin multiple places, ensure that the expression is only ever evaluated once,\nby assigning it to a temporary variable. Pass a level to precompile.</p>\n<p>If <code>level</code> is passed, then returns <code>[val, ref]</code>, where <code>val</code> is the compiled value, and <code>ref</code>\nis the compiled reference. If <code>level</code> is not passed, this returns <code>[val, ref]</code> where\nthe two values are raw nodes which have not been compiled.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  cache: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, level, shouldCache)</span> -&gt;</span>\n    complex = <span class=\"hljs-keyword\">if</span> shouldCache? <span class=\"hljs-keyword\">then</span> shouldCache this <span class=\"hljs-keyword\">else</span> @shouldCache()\n    <span class=\"hljs-keyword\">if</span> complex\n      ref = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">&#x27;ref&#x27;</span>\n      sub = <span class=\"hljs-keyword\">new</span> Assign ref, this\n      <span class=\"hljs-keyword\">if</span> level <span class=\"hljs-keyword\">then</span> [sub.compileToFragments(o, level), [@makeCode(ref.value)]] <span class=\"hljs-keyword\">else</span> [sub, ref]\n    <span class=\"hljs-keyword\">else</span>\n      ref = <span class=\"hljs-keyword\">if</span> level <span class=\"hljs-keyword\">then</span> @compileToFragments o, level <span class=\"hljs-keyword\">else</span> this\n      [ref, ref]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-19\">&#x00a7;</a>\n              </div>\n              <p>Occasionally it may be useful to make an expression behave as if it was ‘hoisted’, whereby the\nresult of the expression is available before its location in the source, but the expression’s\nvariable scope corresponds to the source position. This is used extensively to deal with executable\nclass bodies in classes.</p>\n<p>Calling this method mutates the node, proxying the <code>compileNode</code> and <code>compileToFragments</code>\nmethods to store their result for later replacing the <code>target</code> node, which is returned by the\ncall.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  hoist: <span class=\"hljs-function\">-&gt;</span>\n    @hoisted = <span class=\"hljs-literal\">yes</span>\n    target   = <span class=\"hljs-keyword\">new</span> HoistTarget @\n\n    compileNode        = @compileNode\n    compileToFragments = @compileToFragments\n\n    @compileNode = <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n      target.update compileNode, o\n\n    @compileToFragments = <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n      target.update compileToFragments, o\n\n    target\n\n  cacheToCodeFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(cacheValues)</span> -&gt;</span>\n    [fragmentsToText(cacheValues[<span class=\"hljs-number\">0</span>]), fragmentsToText(cacheValues[<span class=\"hljs-number\">1</span>])]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-20\">&#x00a7;</a>\n              </div>\n              <p>Construct a node that returns the current node’s result.\nNote that this is overridden for smarter behavior for\nmany statement nodes (e.g. <code>If</code>, <code>For</code>).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  makeReturn: <span class=\"hljs-function\"><span class=\"hljs-params\">(results, mark)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> mark</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-21\">&#x00a7;</a>\n              </div>\n              <p>Mark this node as implicitly returned, so that it can be part of the\nnode metadata returned in the AST.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      @canBeReturned = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">return</span>\n    node = @unwrapAll()\n    <span class=\"hljs-keyword\">if</span> results\n      <span class=\"hljs-keyword\">new</span> Call <span class=\"hljs-keyword\">new</span> Literal(<span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{results}</span>.push&quot;</span>), [node]\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">new</span> Return node</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-22\">&#x00a7;</a>\n              </div>\n              <p>Does this node, or any of its children, contain a node of a certain kind?\nRecursively traverses down the <em>children</em> nodes and returns the first one\nthat verifies <code>pred</code>. Otherwise return undefined. <code>contains</code> does not cross\nscope boundaries.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  contains: <span class=\"hljs-function\"><span class=\"hljs-params\">(pred)</span> -&gt;</span>\n    node = <span class=\"hljs-literal\">undefined</span>\n    @traverseChildren <span class=\"hljs-literal\">no</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(n)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">if</span> pred n\n        node = n\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span>\n    node</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-23\">&#x00a7;</a>\n              </div>\n              <p>Pull out the last node of a node list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  lastNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(list)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> list.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-literal\">null</span> <span class=\"hljs-keyword\">else</span> list[list.length - <span class=\"hljs-number\">1</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-24\">&#x00a7;</a>\n              </div>\n              <p>Debugging representation of the node, for inspecting the parse tree.\nThis is what <code>coffee --nodes</code> prints out.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  toString: <span class=\"hljs-function\"><span class=\"hljs-params\">(idt = <span class=\"hljs-string\">&#x27;&#x27;</span>, name = @constructor.name)</span> -&gt;</span>\n    tree = <span class=\"hljs-string\">&#x27;\\n&#x27;</span> + idt + name\n    tree += <span class=\"hljs-string\">&#x27;?&#x27;</span> <span class=\"hljs-keyword\">if</span> @soak\n    @eachChild (node) -&gt; tree += node.toString idt + TAB\n    tree\n\n  checkForPureStatementInExpression: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> jumpNode = @jumps()\n      jumpNode.error <span class=\"hljs-string\">&#x27;cannot use a pure statement in an expression&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-25\">&#x00a7;</a>\n              </div>\n              <p>Plain JavaScript object representation of the node, that can be serialized\nas JSON. This is what the <code>ast</code> option in the Node API returns.\nWe try to follow the <a href=\"https://github.com/babel/babel/blob/master/packages/babel-parser/ast/spec.md\">Babel AST spec</a>\nas closely as possible, for improved interoperability with other tools.\n<strong>WARNING: DO NOT OVERRIDE THIS METHOD IN CHILD CLASSES.</strong>\nOnly override the component <code>ast*</code> methods as needed.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  ast: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, level)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-26\">&#x00a7;</a>\n              </div>\n              <p>Merge <code>level</code> into <code>o</code> and perform other universal checks.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    o = @astInitialize o, level</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-27\">&#x00a7;</a>\n              </div>\n              <p>Create serializable representation of this node.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    astNode = @astNode o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-28\">&#x00a7;</a>\n              </div>\n              <p>Mark AST nodes that correspond to expressions that (implicitly) return.\nWe can’t do this as part of <code>astNode</code> because we need to assemble child\nnodes first before marking the parent being returned.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> @astNode? <span class=\"hljs-keyword\">and</span> @canBeReturned\n      <span class=\"hljs-built_in\">Object</span>.assign astNode, {returns: <span class=\"hljs-literal\">yes</span>}\n    astNode\n\n  astInitialize: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, level)</span> -&gt;</span>\n    o = <span class=\"hljs-built_in\">Object</span>.assign {}, o\n    o.level = level <span class=\"hljs-keyword\">if</span> level?\n    <span class=\"hljs-keyword\">if</span> o.level &gt; LEVEL_TOP\n      @checkForPureStatementInExpression()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-29\">&#x00a7;</a>\n              </div>\n              <p><code>@makeReturn</code> must be called before <code>astProperties</code>, because the latter may call\n<code>.ast()</code> for child nodes and those nodes would need the return logic from <code>makeReturn</code>\nalready executed by then.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @makeReturn <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @isStatement(o) <span class=\"hljs-keyword\">and</span> o.level <span class=\"hljs-keyword\">isnt</span> LEVEL_TOP <span class=\"hljs-keyword\">and</span> o.scope?\n    o\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-30\">&#x00a7;</a>\n              </div>\n              <p>Every abstract syntax tree node object has four categories of properties:</p>\n<ul>\n<li>type, stored in the <code>type</code> field and a string like <code>NumberLiteral</code>.</li>\n<li>location data, stored in the <code>loc</code>, <code>start</code>, <code>end</code> and <code>range</code> fields.</li>\n<li>properties specific to this node, like <code>parsedValue</code>.</li>\n<li>properties that are themselves child nodes, like <code>body</code>.\nThese fields are all intermixed in the Babel spec; <code>type</code> and <code>start</code> and\n<code>parsedValue</code> are all top level fields in the AST node object. We have\nseparate methods for returning each category, that we merge together here.</li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-built_in\">Object</span>.assign {}, {type: @astType(o)}, @astProperties(o), @astLocationData()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-31\">&#x00a7;</a>\n              </div>\n              <p>By default, a node class has no specific properties.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  astProperties: <span class=\"hljs-function\">-&gt;</span> {}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-32\">&#x00a7;</a>\n              </div>\n              <p>By default, a node class’s AST <code>type</code> is its class name.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  astType: <span class=\"hljs-function\">-&gt;</span> @constructor.name</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-33\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-33\">&#x00a7;</a>\n              </div>\n              <p>The AST location data is a rearranged version of our Jison location data,\nmutated into the structure that the Babel spec uses.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  astLocationData: <span class=\"hljs-function\">-&gt;</span>\n    jisonLocationDataToAstLocationData @locationData</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-34\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-34\">&#x00a7;</a>\n              </div>\n              <p>Determines whether an AST node needs an <code>ExpressionStatement</code> wrapper.\nTypically matches our <code>isStatement()</code> logic but this allows overriding.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  isStatementAst: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @isStatement o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-35\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-35\">&#x00a7;</a>\n              </div>\n              <p>Passes each child to a function, breaking when the function returns <code>false</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  eachChild: <span class=\"hljs-function\"><span class=\"hljs-params\">(func)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> this <span class=\"hljs-keyword\">unless</span> @children\n    <span class=\"hljs-keyword\">for</span> attr <span class=\"hljs-keyword\">in</span> @children <span class=\"hljs-keyword\">when</span> @[attr]\n      <span class=\"hljs-keyword\">for</span> child <span class=\"hljs-keyword\">in</span> flatten [@[attr]]\n        <span class=\"hljs-keyword\">return</span> this <span class=\"hljs-keyword\">if</span> func(child) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">false</span>\n    this\n\n  traverseChildren: <span class=\"hljs-function\"><span class=\"hljs-params\">(crossScope, func)</span> -&gt;</span>\n    @eachChild (child) -&gt;\n      recur = func(child)\n      child.traverseChildren(crossScope, func) <span class=\"hljs-keyword\">unless</span> recur <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-36\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-36\">&#x00a7;</a>\n              </div>\n              <p><code>replaceInContext</code> will traverse children looking for a node for which <code>match</code> returns\ntrue. Once found, the matching node will be replaced by the result of calling <code>replacement</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  replaceInContext: <span class=\"hljs-function\"><span class=\"hljs-params\">(match, replacement)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span> <span class=\"hljs-keyword\">unless</span> @children\n    <span class=\"hljs-keyword\">for</span> attr <span class=\"hljs-keyword\">in</span> @children <span class=\"hljs-keyword\">when</span> children = @[attr]\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-built_in\">Array</span>.isArray children\n        <span class=\"hljs-keyword\">for</span> child, i <span class=\"hljs-keyword\">in</span> children\n          <span class=\"hljs-keyword\">if</span> match child\n            children[i..i] = replacement child, @\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>\n          <span class=\"hljs-keyword\">else</span>\n            <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> child.replaceInContext match, replacement\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> match children\n        @[attr] = replacement children, @\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> children.replaceInContext match, replacement\n\n  invert: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;!&#x27;</span>, this\n\n  unwrapAll: <span class=\"hljs-function\">-&gt;</span>\n    node = this\n    <span class=\"hljs-keyword\">continue</span> <span class=\"hljs-keyword\">until</span> node <span class=\"hljs-keyword\">is</span> node = node.unwrap()\n    node</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-37\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-37\">&#x00a7;</a>\n              </div>\n              <p>Default implementations of the common node properties and methods. Nodes\nwill override these with custom logic, if needed.</p>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-38\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-38\">&#x00a7;</a>\n              </div>\n              <p><code>children</code> are the properties to recurse into when tree walking. The\n<code>children</code> list <em>is</em> the structure of the AST. The <code>parent</code> pointer, and\nthe pointer to the <code>children</code> are how you can traverse the tree.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  children: []</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-39\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-39\">&#x00a7;</a>\n              </div>\n              <p><code>isStatement</code> has to do with “everything is an expression”. A few things\ncan’t be expressions, such as <code>break</code>. Things that <code>isStatement</code> returns\n<code>true</code> for are things that can’t be used as expressions. There are some\nerror messages that come from <code>nodes.coffee</code> due to statements ending up\nin expression position.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  isStatement: NO</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-40\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-40\">&#x00a7;</a>\n              </div>\n              <p>Track comments that have been compiled into fragments, to avoid outputting\nthem twice.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compiledComments: []</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-41\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-41\">&#x00a7;</a>\n              </div>\n              <p><code>includeCommentFragments</code> lets <code>compileCommentFragments</code> know whether this node\nhas special awareness of how to handle comments within its output.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  includeCommentFragments: NO</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-42\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-42\">&#x00a7;</a>\n              </div>\n              <p><code>jumps</code> tells you if an expression, or an internal part of an expression,\nhas a flow control construct (like <code>break</code>, <code>continue</code>, or <code>return</code>)\nthat jumps out of the normal flow of control and can’t be used as a value.\n(Note that <code>throw</code> is not considered a flow control construct.)\nThis is important because flow control in the middle of an expression\nmakes no sense; we have to disallow it.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  jumps: NO</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-43\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-43\">&#x00a7;</a>\n              </div>\n              <p>If <code>node.shouldCache() is false</code>, it is safe to use <code>node</code> more than once.\nOtherwise you need to store the value of <code>node</code> in a variable and output\nthat variable several times instead. Kind of like this: <code>5</code> need not be\ncached. <code>returnFive()</code>, however, could have side effects as a result of\nevaluating it more than once, and therefore we need to cache it. The\nparameter is named <code>shouldCache</code> rather than <code>mustCache</code> because there are\nalso cases where we might not need to cache but where we want to, for\nexample a long expression that may well be idempotent but we want to cache\nfor brevity.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  shouldCache: YES\n\n  isChainable: NO\n  isAssignable: NO\n  isNumber: NO\n\n  unwrap: THIS\n  unfoldSoak: NO</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-44\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-44\">&#x00a7;</a>\n              </div>\n              <p>Is this node used to assign a certain variable?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  assigns: NO</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-45\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-45\">&#x00a7;</a>\n              </div>\n              <p>For this node and all descendents, set the location data to <code>locationData</code>\nif the location data is not already set.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  updateLocationDataIfMissing: <span class=\"hljs-function\"><span class=\"hljs-params\">(locationData, force)</span> -&gt;</span>\n    @forceUpdateLocation = <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> force\n    <span class=\"hljs-keyword\">return</span> this <span class=\"hljs-keyword\">if</span> @locationData <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @forceUpdateLocation\n    <span class=\"hljs-keyword\">delete</span> @forceUpdateLocation\n    @locationData = locationData\n\n    @eachChild (child) -&gt;\n      child.updateLocationDataIfMissing locationData</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-46\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-46\">&#x00a7;</a>\n              </div>\n              <p>Add location data from another node</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  withLocationDataFrom: <span class=\"hljs-function\"><span class=\"hljs-params\">({locationData})</span> -&gt;</span>\n    @updateLocationDataIfMissing locationData</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-47\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-47\">&#x00a7;</a>\n              </div>\n              <p>Add location data and comments from another node</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  withLocationDataAndCommentsFrom: <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> -&gt;</span>\n    @withLocationDataFrom node\n    {comments} = node\n    @comments = comments <span class=\"hljs-keyword\">if</span> comments?.length\n    this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-48\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-48\">&#x00a7;</a>\n              </div>\n              <p>Throw a SyntaxError associated with this node’s location.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  error: <span class=\"hljs-function\"><span class=\"hljs-params\">(message)</span> -&gt;</span>\n    throwSyntaxError message, @locationData\n\n  makeCode: <span class=\"hljs-function\"><span class=\"hljs-params\">(code)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">new</span> CodeFragment this, code\n\n  wrapInParentheses: <span class=\"hljs-function\"><span class=\"hljs-params\">(fragments)</span> -&gt;</span>\n    [@makeCode(<span class=\"hljs-string\">&#x27;(&#x27;</span>), fragments..., @makeCode(<span class=\"hljs-string\">&#x27;)&#x27;</span>)]\n\n  wrapInBraces: <span class=\"hljs-function\"><span class=\"hljs-params\">(fragments)</span> -&gt;</span>\n    [@makeCode(<span class=\"hljs-string\">&#x27;{&#x27;</span>), fragments..., @makeCode(<span class=\"hljs-string\">&#x27;}&#x27;</span>)]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-49\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-49\">&#x00a7;</a>\n              </div>\n              <p><code>fragmentsList</code> is an array of arrays of fragments. Each array in fragmentsList will be\nconcatenated together, with <code>joinStr</code> added in between each, to produce a final flat array\nof fragments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  joinFragmentArrays: <span class=\"hljs-function\"><span class=\"hljs-params\">(fragmentsList, joinStr)</span> -&gt;</span>\n    answer = []\n    <span class=\"hljs-keyword\">for</span> fragments, i <span class=\"hljs-keyword\">in</span> fragmentsList\n      <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">then</span> answer.push @makeCode joinStr\n      answer = answer.concat fragments\n    answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-50\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-50\">&#x00a7;</a>\n              </div>\n              <h3 id=\"hoisttarget\">HoistTarget</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-51\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-51\">&#x00a7;</a>\n              </div>\n              <p>A <strong>HoistTargetNode</strong> represents the output location in the node tree for a hoisted node.\nSee Base#hoist.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.HoistTarget = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">HoistTarget</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-52\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-52\">&#x00a7;</a>\n              </div>\n              <p>Expands hoisted fragments in the given array</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  @expand = <span class=\"hljs-function\"><span class=\"hljs-params\">(fragments)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> fragment, i <span class=\"hljs-keyword\">in</span> fragments <span class=\"hljs-keyword\">by</span> <span class=\"hljs-number\">-1</span> <span class=\"hljs-keyword\">when</span> fragment.fragments\n      fragments[i..i] = @expand fragment.fragments\n    fragments\n\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@source)</span> -&gt;</span>\n    super()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-53\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-53\">&#x00a7;</a>\n              </div>\n              <p>Holds presentational options to apply when the source node is compiled.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @options = {}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-54\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-54\">&#x00a7;</a>\n              </div>\n              <p>Placeholder fragments to be replaced by the source node’s compilation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @targetFragments = { fragments: [] }\n\n  isStatement: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @source.isStatement o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-55\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-55\">&#x00a7;</a>\n              </div>\n              <p>Update the target fragments with the result of compiling the source.\nCalls the given compile function with the node and options (overriden with the target\npresentational options).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  update: <span class=\"hljs-function\"><span class=\"hljs-params\">(compile, o)</span> -&gt;</span>\n    @targetFragments.fragments = compile.call @source, merge o, @options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-56\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-56\">&#x00a7;</a>\n              </div>\n              <p>Copies the target indent and level, and returns the placeholder fragments</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, level)</span> -&gt;</span>\n    @options.indent = o.indent\n    @options.level  = level ? o.level\n    [ @targetFragments ]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @compileToFragments o\n\n  compileClosure: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @compileToFragments o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-57\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-57\">&#x00a7;</a>\n              </div>\n              <h3 id=\"root\">Root</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-58\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-58\">&#x00a7;</a>\n              </div>\n              <p>The root node of the node tree</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Root = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Root</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@body)</span> -&gt;</span>\n    super()\n\n    @isAsync = (<span class=\"hljs-keyword\">new</span> Code [], @body).isAsync\n\n  children: [<span class=\"hljs-string\">&#x27;body&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-59\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-59\">&#x00a7;</a>\n              </div>\n              <p>Wrap everything in a safety closure, unless requested not to. It would be\nbetter not to generate them in the first place, but for now, clean up\nobvious double-parentheses.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o.indent    = <span class=\"hljs-keyword\">if</span> o.bare <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">else</span> TAB\n    o.level     = LEVEL_TOP\n    o.compiling = <span class=\"hljs-literal\">yes</span>\n    @initializeScope o\n    fragments = @body.compileRoot o\n    <span class=\"hljs-keyword\">return</span> fragments <span class=\"hljs-keyword\">if</span> o.bare\n    functionKeyword = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @isAsync <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;async &#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>}</span>function&quot;</span>\n    [].concat @makeCode(<span class=\"hljs-string\">&quot;(<span class=\"hljs-subst\">#{functionKeyword}</span>() {\\n&quot;</span>), fragments, @makeCode(<span class=\"hljs-string\">&quot;\\n}).call(this);\\n&quot;</span>)\n\n  initializeScope: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o.scope = <span class=\"hljs-keyword\">new</span> Scope <span class=\"hljs-literal\">null</span>, @body, <span class=\"hljs-literal\">null</span>, o.referencedVars ? []</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-60\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-60\">&#x00a7;</a>\n              </div>\n              <p>Mark given local variables in the root scope as parameters so they don’t\nend up being declared on the root block.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    o.scope.parameter name <span class=\"hljs-keyword\">for</span> name <span class=\"hljs-keyword\">in</span> o.locals <span class=\"hljs-keyword\">or</span> []\n\n  commentsAst: <span class=\"hljs-function\">-&gt;</span>\n    @allComments ?=\n      <span class=\"hljs-keyword\">for</span> commentToken <span class=\"hljs-keyword\">in</span> (@allCommentTokens ? []) <span class=\"hljs-keyword\">when</span> <span class=\"hljs-keyword\">not</span> commentToken.heregex\n        <span class=\"hljs-keyword\">if</span> commentToken.here\n          <span class=\"hljs-keyword\">new</span> HereComment commentToken\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-keyword\">new</span> LineComment commentToken\n    comment.ast() <span class=\"hljs-keyword\">for</span> comment <span class=\"hljs-keyword\">in</span> @allComments\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o.level = LEVEL_TOP\n    @initializeScope o\n    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;File&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @body.isRootBlock = <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-keyword\">return</span>\n      program: <span class=\"hljs-built_in\">Object</span>.assign @body.ast(o), @astLocationData()\n      comments: @commentsAst()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-61\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-61\">&#x00a7;</a>\n              </div>\n              <h3 id=\"block\">Block</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-62\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-62\">&#x00a7;</a>\n              </div>\n              <p>The block is the list of expressions that forms the body of an\nindented block of code – the implementation of a function, a clause in an\n<code>if</code>, <code>switch</code>, or <code>try</code>, and so on…</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Block = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Block</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(nodes)</span> -&gt;</span>\n    super()\n\n    @expressions = compact flatten nodes <span class=\"hljs-keyword\">or</span> []\n\n  children: [<span class=\"hljs-string\">&#x27;expressions&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-63\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-63\">&#x00a7;</a>\n              </div>\n              <p>Tack an expression on to the end of this expression list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  push: <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> -&gt;</span>\n    @expressions.push node\n    this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-64\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-64\">&#x00a7;</a>\n              </div>\n              <p>Remove and return the last expression of this expression list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  pop: <span class=\"hljs-function\">-&gt;</span>\n    @expressions.pop()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-65\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-65\">&#x00a7;</a>\n              </div>\n              <p>Add an expression at the beginning of this expression list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unshift: <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> -&gt;</span>\n    @expressions.unshift node\n    this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-66\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-66\">&#x00a7;</a>\n              </div>\n              <p>If this Block consists of just a single node, unwrap it by pulling\nit back out.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unwrap: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @expressions.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">then</span> @expressions[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">else</span> this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-67\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-67\">&#x00a7;</a>\n              </div>\n              <p>Is this an empty block of code?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  isEmpty: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">not</span> @expressions.length\n\n  isStatement: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> exp <span class=\"hljs-keyword\">in</span> @expressions <span class=\"hljs-keyword\">when</span> exp.isStatement o\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-literal\">no</span>\n\n  jumps: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> exp <span class=\"hljs-keyword\">in</span> @expressions\n      <span class=\"hljs-keyword\">return</span> jumpNode <span class=\"hljs-keyword\">if</span> jumpNode = exp.jumps o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-68\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-68\">&#x00a7;</a>\n              </div>\n              <p>A Block node does not return its entire body, rather it\nensures that the final expression is returned.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  makeReturn: <span class=\"hljs-function\"><span class=\"hljs-params\">(results, mark)</span> -&gt;</span>\n    len = @expressions.length\n    [..., lastExp] = @expressions\n    lastExp = lastExp?.unwrap() <span class=\"hljs-keyword\">or</span> <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-69\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-69\">&#x00a7;</a>\n              </div>\n              <p>We also need to check that we’re not returning a JSX tag if there’s an\nadjacent one at the same level; JSX doesn’t allow that.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> lastExp <span class=\"hljs-keyword\">and</span> lastExp <span class=\"hljs-keyword\">instanceof</span> Parens <span class=\"hljs-keyword\">and</span> lastExp.body.expressions.length &gt; <span class=\"hljs-number\">1</span>\n      {body:{expressions}} = lastExp\n      [..., penult, last] = expressions\n      penult = penult.unwrap()\n      last = last.unwrap()\n      <span class=\"hljs-keyword\">if</span> penult <span class=\"hljs-keyword\">instanceof</span> JSXElement <span class=\"hljs-keyword\">and</span> last <span class=\"hljs-keyword\">instanceof</span> JSXElement\n        expressions[expressions.length - <span class=\"hljs-number\">1</span>].error <span class=\"hljs-string\">&#x27;Adjacent JSX elements must be wrapped in an enclosing tag&#x27;</span>\n    <span class=\"hljs-keyword\">if</span> mark\n      @expressions[len - <span class=\"hljs-number\">1</span>]?.makeReturn results, mark\n      <span class=\"hljs-keyword\">return</span>\n    <span class=\"hljs-keyword\">while</span> len--\n      expr = @expressions[len]\n      @expressions[len] = expr.makeReturn results\n      @expressions.splice(len, <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">if</span> expr <span class=\"hljs-keyword\">instanceof</span> Return <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> expr.expression\n      <span class=\"hljs-keyword\">break</span>\n    this\n\n  compile: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, lvl)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> Root(this).withLocationDataFrom(this).compile o, lvl <span class=\"hljs-keyword\">unless</span> o.scope\n\n    super o, lvl</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-70\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-70\">&#x00a7;</a>\n              </div>\n              <p>Compile all expressions within the <strong>Block</strong> body. If we need to return\nthe result, and it’s an expression, simply return it. If it’s a statement,\nask the statement to do so.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @tab  = o.indent\n    top   = o.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP\n    compiledNodes = []\n\n    <span class=\"hljs-keyword\">for</span> node, index <span class=\"hljs-keyword\">in</span> @expressions\n      <span class=\"hljs-keyword\">if</span> node.hoisted</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-71\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-71\">&#x00a7;</a>\n              </div>\n              <p>This is a hoisted expression.\nWe want to compile this and ignore the result.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        node.compileToFragments o\n        <span class=\"hljs-keyword\">continue</span>\n      node = (node.unfoldSoak(o) <span class=\"hljs-keyword\">or</span> node)\n      <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> Block</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-72\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-72\">&#x00a7;</a>\n              </div>\n              <p>This is a nested block. We don’t do anything special here like\nenclose it in a new scope; we just compile the statements in this\nblock along with our own.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        compiledNodes.push node.compileNode o\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> top\n        node.front = <span class=\"hljs-literal\">yes</span>\n        fragments = node.compileToFragments o\n        <span class=\"hljs-keyword\">unless</span> node.isStatement o\n          fragments = indentInitial fragments, @\n          [..., lastFragment] = fragments\n          <span class=\"hljs-keyword\">unless</span> lastFragment.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">or</span> lastFragment.isComment\n            fragments.push @makeCode <span class=\"hljs-string\">&#x27;;&#x27;</span>\n        compiledNodes.push fragments\n      <span class=\"hljs-keyword\">else</span>\n        compiledNodes.push node.compileToFragments o, LEVEL_LIST\n    <span class=\"hljs-keyword\">if</span> top\n      <span class=\"hljs-keyword\">if</span> @spaced\n        <span class=\"hljs-keyword\">return</span> [].concat @joinFragmentArrays(compiledNodes, <span class=\"hljs-string\">&#x27;\\n\\n&#x27;</span>), @makeCode(<span class=\"hljs-string\">&#x27;\\n&#x27;</span>)\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">return</span> @joinFragmentArrays(compiledNodes, <span class=\"hljs-string\">&#x27;\\n&#x27;</span>)\n    <span class=\"hljs-keyword\">if</span> compiledNodes.length\n      answer = @joinFragmentArrays(compiledNodes, <span class=\"hljs-string\">&#x27;, &#x27;</span>)\n    <span class=\"hljs-keyword\">else</span>\n      answer = [@makeCode <span class=\"hljs-string\">&#x27;void 0&#x27;</span>]\n    <span class=\"hljs-keyword\">if</span> compiledNodes.length &gt; <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> o.level &gt;= LEVEL_LIST <span class=\"hljs-keyword\">then</span> @wrapInParentheses answer <span class=\"hljs-keyword\">else</span> answer\n\n  compileRoot: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @spaced = <span class=\"hljs-literal\">yes</span>\n    fragments = @compileWithDeclarations o\n    HoistTarget.expand fragments\n    @compileComments fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-73\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-73\">&#x00a7;</a>\n              </div>\n              <p>Compile the expressions body for the contents of a function, with\ndeclarations of all inner variables pushed up to the top.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileWithDeclarations: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    fragments = []\n    post = []\n    <span class=\"hljs-keyword\">for</span> exp, i <span class=\"hljs-keyword\">in</span> @expressions\n      exp = exp.unwrap()\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> exp <span class=\"hljs-keyword\">instanceof</span> Literal\n    o = merge(o, level: LEVEL_TOP)\n    <span class=\"hljs-keyword\">if</span> i\n      rest = @expressions.splice i, <span class=\"hljs-number\">9e9</span>\n      [spaced,    @spaced] = [@spaced, <span class=\"hljs-literal\">no</span>]\n      [fragments, @spaced] = [@compileNode(o), spaced]\n      @expressions = rest\n    post = @compileNode o\n    {scope} = o\n    <span class=\"hljs-keyword\">if</span> scope.expressions <span class=\"hljs-keyword\">is</span> this\n      declars = o.scope.hasDeclarations()\n      assigns = scope.hasAssignments\n      <span class=\"hljs-keyword\">if</span> declars <span class=\"hljs-keyword\">or</span> assigns\n        fragments.push @makeCode <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-keyword\">if</span> i\n        fragments.push @makeCode <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@tab}</span>var &quot;</span>\n        <span class=\"hljs-keyword\">if</span> declars\n          declaredVariables = scope.declaredVariables()\n          <span class=\"hljs-keyword\">for</span> declaredVariable, declaredVariablesIndex <span class=\"hljs-keyword\">in</span> declaredVariables\n            fragments.push @makeCode declaredVariable\n            <span class=\"hljs-keyword\">if</span> Object::hasOwnProperty.call o.scope.comments, declaredVariable\n              fragments.push o.scope.comments[declaredVariable]...\n            <span class=\"hljs-keyword\">if</span> declaredVariablesIndex <span class=\"hljs-keyword\">isnt</span> declaredVariables.length - <span class=\"hljs-number\">1</span>\n              fragments.push @makeCode <span class=\"hljs-string\">&#x27;, &#x27;</span>\n        <span class=\"hljs-keyword\">if</span> assigns\n          fragments.push @makeCode <span class=\"hljs-string\">&quot;,\\n<span class=\"hljs-subst\">#{@tab + TAB}</span>&quot;</span> <span class=\"hljs-keyword\">if</span> declars\n          fragments.push @makeCode scope.assignedVariables().join(<span class=\"hljs-string\">&quot;,\\n<span class=\"hljs-subst\">#{@tab + TAB}</span>&quot;</span>)\n        fragments.push @makeCode <span class=\"hljs-string\">&quot;;\\n<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @spaced <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>}</span>&quot;</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> fragments.length <span class=\"hljs-keyword\">and</span> post.length\n        fragments.push @makeCode <span class=\"hljs-string\">&quot;\\n&quot;</span>\n    fragments.concat post\n\n  compileComments: <span class=\"hljs-function\"><span class=\"hljs-params\">(fragments)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> fragment, fragmentIndex <span class=\"hljs-keyword\">in</span> fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-74\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-74\">&#x00a7;</a>\n              </div>\n              <p>Insert comments into the output at the next or previous newline.\nIf there are no newlines at which to place comments, create them.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> fragment.precedingComments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-75\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-75\">&#x00a7;</a>\n              </div>\n              <p>Determine the indentation level of the fragment that we are about\nto insert comments before, and use that indentation level for our\ninserted comments. At this point, the fragments’ <code>code</code> property\nis the generated output JavaScript, and CoffeeScript always\ngenerates output indented by two spaces; so all we need to do is\nsearch for a <code>code</code> property that begins with at least two spaces.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        fragmentIndent = <span class=\"hljs-string\">&#x27;&#x27;</span>\n        <span class=\"hljs-keyword\">for</span> pastFragment <span class=\"hljs-keyword\">in</span> fragments[<span class=\"hljs-number\">0.</span>..(fragmentIndex + <span class=\"hljs-number\">1</span>)] <span class=\"hljs-keyword\">by</span> <span class=\"hljs-number\">-1</span>\n          indent = <span class=\"hljs-regexp\">/^ {2,}/m</span>.exec pastFragment.code\n          <span class=\"hljs-keyword\">if</span> indent\n            fragmentIndent = indent[<span class=\"hljs-number\">0</span>]\n            <span class=\"hljs-keyword\">break</span>\n          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-keyword\">in</span> pastFragment.code\n            <span class=\"hljs-keyword\">break</span>\n        code = <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{fragmentIndent}</span>&quot;</span> + (\n            <span class=\"hljs-keyword\">for</span> commentFragment <span class=\"hljs-keyword\">in</span> fragment.precedingComments\n              <span class=\"hljs-keyword\">if</span> commentFragment.isHereComment <span class=\"hljs-keyword\">and</span> commentFragment.multiline\n                multident commentFragment.code, fragmentIndent, <span class=\"hljs-literal\">no</span>\n              <span class=\"hljs-keyword\">else</span>\n                commentFragment.code\n          ).join(<span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{fragmentIndent}</span>&quot;</span>).replace <span class=\"hljs-regexp\">/^(\\s*)$/gm</span>, <span class=\"hljs-string\">&#x27;&#x27;</span>\n        <span class=\"hljs-keyword\">for</span> pastFragment, pastFragmentIndex <span class=\"hljs-keyword\">in</span> fragments[<span class=\"hljs-number\">0.</span>..(fragmentIndex + <span class=\"hljs-number\">1</span>)] <span class=\"hljs-keyword\">by</span> <span class=\"hljs-number\">-1</span>\n          newLineIndex = pastFragment.code.lastIndexOf <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n          <span class=\"hljs-keyword\">if</span> newLineIndex <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">-1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-76\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-76\">&#x00a7;</a>\n              </div>\n              <p>Keep searching previous fragments until we can’t go back any\nfurther, either because there are no fragments left or we’ve\ndiscovered that we’re in a code block that is interpolated\ninside a string.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>            <span class=\"hljs-keyword\">if</span> pastFragmentIndex <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n              pastFragment.code = <span class=\"hljs-string\">&#x27;\\n&#x27;</span> + pastFragment.code\n              newLineIndex = <span class=\"hljs-number\">0</span>\n            <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> pastFragment.isStringWithInterpolations <span class=\"hljs-keyword\">and</span> pastFragment.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;{&#x27;</span>\n              code = code[<span class=\"hljs-number\">1.</span>.] + <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-comment\"># Move newline to end.</span>\n              newLineIndex = <span class=\"hljs-number\">1</span>\n            <span class=\"hljs-keyword\">else</span>\n              <span class=\"hljs-keyword\">continue</span>\n          <span class=\"hljs-keyword\">delete</span> fragment.precedingComments\n          pastFragment.code = pastFragment.code[<span class=\"hljs-number\">0.</span>..newLineIndex] +\n            code + pastFragment.code[newLineIndex..]\n          <span class=\"hljs-keyword\">break</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-77\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-77\">&#x00a7;</a>\n              </div>\n              <p>Yes, this is awfully similar to the previous <code>if</code> block, but if you\nlook closely you’ll find lots of tiny differences that make this\nconfusing if it were abstracted into a function that both blocks share.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> fragment.followingComments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-78\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-78\">&#x00a7;</a>\n              </div>\n              <p>Does the first trailing comment follow at the end of a line of code,\nlike <code>; // Comment</code>, or does it start a new line after a line of code?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        trail = fragment.followingComments[<span class=\"hljs-number\">0</span>].trail\n        fragmentIndent = <span class=\"hljs-string\">&#x27;&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-79\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-79\">&#x00a7;</a>\n              </div>\n              <p>Find the indent of the next line of code, if we have any non-trailing\ncomments to output. We need to first find the next newline, as these\ncomments will be output after that; and then the indent of the line\nthat follows the next newline.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">unless</span> trail <span class=\"hljs-keyword\">and</span> fragment.followingComments.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span>\n          onNextLine = <span class=\"hljs-literal\">no</span>\n          <span class=\"hljs-keyword\">for</span> upcomingFragment <span class=\"hljs-keyword\">in</span> fragments[fragmentIndex...]\n            <span class=\"hljs-keyword\">unless</span> onNextLine\n              <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-keyword\">in</span> upcomingFragment.code\n                onNextLine = <span class=\"hljs-literal\">yes</span>\n              <span class=\"hljs-keyword\">else</span>\n                <span class=\"hljs-keyword\">continue</span>\n            <span class=\"hljs-keyword\">else</span>\n              indent = <span class=\"hljs-regexp\">/^ {2,}/m</span>.exec upcomingFragment.code\n              <span class=\"hljs-keyword\">if</span> indent\n                fragmentIndent = indent[<span class=\"hljs-number\">0</span>]\n                <span class=\"hljs-keyword\">break</span>\n              <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-keyword\">in</span> upcomingFragment.code\n                <span class=\"hljs-keyword\">break</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-80\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-80\">&#x00a7;</a>\n              </div>\n              <p>Is this comment following the indent inserted by bare mode?\nIf so, there’s no need to indent this further.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        code = <span class=\"hljs-keyword\">if</span> fragmentIndex <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-regexp\">/^\\s+$/</span>.test fragments[<span class=\"hljs-number\">0</span>].code\n          <span class=\"hljs-string\">&#x27;&#x27;</span>\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> trail\n          <span class=\"hljs-string\">&#x27; &#x27;</span>\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{fragmentIndent}</span>&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-81\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-81\">&#x00a7;</a>\n              </div>\n              <p>Assemble properly indented comments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        code += (\n            <span class=\"hljs-keyword\">for</span> commentFragment <span class=\"hljs-keyword\">in</span> fragment.followingComments\n              <span class=\"hljs-keyword\">if</span> commentFragment.isHereComment <span class=\"hljs-keyword\">and</span> commentFragment.multiline\n                multident commentFragment.code, fragmentIndent, <span class=\"hljs-literal\">no</span>\n              <span class=\"hljs-keyword\">else</span>\n                commentFragment.code\n          ).join(<span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{fragmentIndent}</span>&quot;</span>).replace <span class=\"hljs-regexp\">/^(\\s*)$/gm</span>, <span class=\"hljs-string\">&#x27;&#x27;</span>\n        <span class=\"hljs-keyword\">for</span> upcomingFragment, upcomingFragmentIndex <span class=\"hljs-keyword\">in</span> fragments[fragmentIndex...]\n          newLineIndex = upcomingFragment.code.indexOf <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n          <span class=\"hljs-keyword\">if</span> newLineIndex <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">-1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-82\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-82\">&#x00a7;</a>\n              </div>\n              <p>Keep searching upcoming fragments until we can’t go any\nfurther, either because there are no fragments left or we’ve\ndiscovered that we’re in a code block that is interpolated\ninside a string.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>            <span class=\"hljs-keyword\">if</span> upcomingFragmentIndex <span class=\"hljs-keyword\">is</span> fragments.length - <span class=\"hljs-number\">1</span>\n              upcomingFragment.code = upcomingFragment.code + <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n              newLineIndex = upcomingFragment.code.length\n            <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> upcomingFragment.isStringWithInterpolations <span class=\"hljs-keyword\">and</span> upcomingFragment.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;}&#x27;</span>\n              code = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{code}</span>\\n&quot;</span>\n              newLineIndex = <span class=\"hljs-number\">0</span>\n            <span class=\"hljs-keyword\">else</span>\n              <span class=\"hljs-keyword\">continue</span>\n          <span class=\"hljs-keyword\">delete</span> fragment.followingComments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-83\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-83\">&#x00a7;</a>\n              </div>\n              <p>Avoid inserting extra blank lines.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          code = code.replace <span class=\"hljs-regexp\">/^\\n/</span>, <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">if</span> upcomingFragment.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n          upcomingFragment.code = upcomingFragment.code[<span class=\"hljs-number\">0.</span>..newLineIndex] +\n            code + upcomingFragment.code[newLineIndex..]\n          <span class=\"hljs-keyword\">break</span>\n\n    fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-84\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-84\">&#x00a7;</a>\n              </div>\n              <p>Wrap up the given nodes as a <strong>Block</strong>, unless it already happens\nto be one.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  @wrap: <span class=\"hljs-function\"><span class=\"hljs-params\">(nodes)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> nodes[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">if</span> nodes.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> nodes[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">instanceof</span> Block\n    <span class=\"hljs-keyword\">new</span> Block nodes\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> (o.level? <span class=\"hljs-keyword\">and</span> o.level <span class=\"hljs-keyword\">isnt</span> LEVEL_TOP) <span class=\"hljs-keyword\">and</span> @expressions.length\n      <span class=\"hljs-keyword\">return</span> (<span class=\"hljs-keyword\">new</span> Sequence(@expressions).withLocationDataFrom @).ast o\n\n    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isRootBlock\n      <span class=\"hljs-string\">&#x27;Program&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @isClassBody\n      <span class=\"hljs-string\">&#x27;ClassBody&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;BlockStatement&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    checkForDirectives = del o, <span class=\"hljs-string\">&#x27;checkForDirectives&#x27;</span>\n\n    sniffDirectives @expressions, notFinalExpression: checkForDirectives <span class=\"hljs-keyword\">if</span> @isRootBlock <span class=\"hljs-keyword\">or</span> checkForDirectives\n    directives = []\n    body = []\n    <span class=\"hljs-keyword\">for</span> expression <span class=\"hljs-keyword\">in</span> @expressions\n      expressionAst = expression.ast o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-85\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-85\">&#x00a7;</a>\n              </div>\n              <p>Ignore generated PassthroughLiteral</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> expressionAst?\n        <span class=\"hljs-keyword\">continue</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> expression <span class=\"hljs-keyword\">instanceof</span> Directive\n        directives.push expressionAst</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-86\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-86\">&#x00a7;</a>\n              </div>\n              <p>If an expression is a statement, it can be added to the body as is.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> expression.isStatementAst o\n        body.push expressionAst</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-87\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-87\">&#x00a7;</a>\n              </div>\n              <p>Otherwise, we need to wrap it in an <code>ExpressionStatement</code> AST node.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">else</span>\n        body.push <span class=\"hljs-built_in\">Object</span>.assign\n            type: <span class=\"hljs-string\">&#x27;ExpressionStatement&#x27;</span>\n            expression: expressionAst\n          ,\n            expression.astLocationData()\n\n    <span class=\"hljs-keyword\">return</span> {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-88\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-88\">&#x00a7;</a>\n              </div>\n              <p>For now, we’re not including <code>sourceType</code> on the <code>Program</code> AST node.\nIts value could be either <code>&#39;script&#39;</code> or <code>&#39;module&#39;</code>, and there’s no way\nfor CoffeeScript to always know which it should be. The presence of an\n<code>import</code> or <code>export</code> statement in source code would imply that it should\nbe a <code>module</code>, but a project may consist of mostly such files and also\nan outlier file that lacks <code>import</code> or <code>export</code> but is still imported\ninto the project and therefore expects to be treated as a <code>module</code>.\nDetermining the value of <code>sourceType</code> is essentially the same challenge\nposed by determining the parse goal of a JavaScript file, also <code>module</code>\nor <code>script</code>, and so if Node figures out a way to do so for <code>.js</code> files\nthen CoffeeScript can copy Node’s algorithm.</p>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-89\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-89\">&#x00a7;</a>\n              </div>\n              <p>sourceType: ‘module’</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      body, directives\n    }\n\n  astLocationData: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> @isRootBlock <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @locationData?\n    super()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-90\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-90\">&#x00a7;</a>\n              </div>\n              <p>A directive e.g. ‘use strict’.\nCurrently only used during AST generation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Directive = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Directive</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@value)</span> -&gt;</span>\n    super()\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      value: <span class=\"hljs-built_in\">Object</span>.assign {},\n        @value.ast o\n        type: <span class=\"hljs-string\">&#x27;DirectiveLiteral&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-91\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-91\">&#x00a7;</a>\n              </div>\n              <h3 id=\"literal\">Literal</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-92\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-92\">&#x00a7;</a>\n              </div>\n              <p><code>Literal</code> is a base class for static values that can be passed through\ndirectly into JavaScript without translation, such as: strings, numbers,\n<code>true</code>, <code>false</code>, <code>null</code>…</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Literal = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Literal</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@value)</span> -&gt;</span>\n    super()\n\n  shouldCache: NO\n\n  assigns: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    name <span class=\"hljs-keyword\">is</span> @value\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [@makeCode @value]\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      value: @value\n\n  toString: <span class=\"hljs-function\">-&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-93\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-93\">&#x00a7;</a>\n              </div>\n              <p>This is only intended for debugging.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-string\">&quot; <span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @isStatement() <span class=\"hljs-keyword\">then</span> super() <span class=\"hljs-keyword\">else</span> @constructor.name}</span>: <span class=\"hljs-subst\">#{@value}</span>&quot;</span>\n\n<span class=\"hljs-built_in\">exports</span>.NumberLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NumberLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@value, {@parsedValue} = {})</span> -&gt;</span>\n    super()\n    <span class=\"hljs-keyword\">unless</span> @parsedValue?\n      <span class=\"hljs-keyword\">if</span> isNumber @value\n        @parsedValue = @value\n        @value = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@value}</span>&quot;</span>\n      <span class=\"hljs-keyword\">else</span>\n        @parsedValue = parseNumber @value\n\n  isBigInt: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-regexp\">/n$/</span>.test @value\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isBigInt()\n      <span class=\"hljs-string\">&#x27;BigIntLiteral&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;NumericLiteral&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      value:\n        <span class=\"hljs-keyword\">if</span> @isBigInt()\n          @parsedValue.toString()\n        <span class=\"hljs-keyword\">else</span>\n          @parsedValue\n      extra:\n        rawValue:\n          <span class=\"hljs-keyword\">if</span> @isBigInt()\n            @parsedValue.toString()\n          <span class=\"hljs-keyword\">else</span>\n            @parsedValue\n        raw: @value\n\n<span class=\"hljs-built_in\">exports</span>.InfinityLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">InfinityLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">NumberLiteral</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@value, {@originalValue = <span class=\"hljs-string\">&#x27;Infinity&#x27;</span>} = {})</span> -&gt;</span>\n    super()\n\n  compileNode: <span class=\"hljs-function\">-&gt;</span>\n    [@makeCode <span class=\"hljs-string\">&#x27;2e308&#x27;</span>]\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">unless</span> @originalValue <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;Infinity&#x27;</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> NumberLiteral(@value).withLocationDataFrom(@).ast o\n    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;Identifier&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      name: <span class=\"hljs-string\">&#x27;Infinity&#x27;</span>\n      declaration: <span class=\"hljs-literal\">no</span>\n\n<span class=\"hljs-built_in\">exports</span>.NaNLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NaNLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">NumberLiteral</span></span>\n  constructor: <span class=\"hljs-function\">-&gt;</span>\n    super <span class=\"hljs-string\">&#x27;NaN&#x27;</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    code = [@makeCode <span class=\"hljs-string\">&#x27;0/0&#x27;</span>]\n    <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_OP <span class=\"hljs-keyword\">then</span> @wrapInParentheses code <span class=\"hljs-keyword\">else</span> code\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;Identifier&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      name: <span class=\"hljs-string\">&#x27;NaN&#x27;</span>\n      declaration: <span class=\"hljs-literal\">no</span>\n\n<span class=\"hljs-built_in\">exports</span>.StringLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">StringLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@originalValue, {@quote, @initialChunk, @finalChunk, @indent, @double, @heregex} = {})</span> -&gt;</span>\n    super <span class=\"hljs-string\">&#x27;&#x27;</span>\n    @quote = <span class=\"hljs-literal\">null</span> <span class=\"hljs-keyword\">if</span> @quote <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;///&#x27;</span>\n    @fromSourceString = @quote?\n    @quote ?= <span class=\"hljs-string\">&#x27;&quot;&#x27;</span>\n    heredoc = @isFromHeredoc()\n\n    val = @originalValue\n    <span class=\"hljs-keyword\">if</span> @heregex\n      val = val.replace HEREGEX_OMIT, <span class=\"hljs-string\">&#x27;$1$2&#x27;</span>\n      val = replaceUnicodeCodePointEscapes val, flags: @heregex.flags\n    <span class=\"hljs-keyword\">else</span>\n      val = val.replace STRING_OMIT, <span class=\"hljs-string\">&#x27;$1&#x27;</span>\n      val =\n        <span class=\"hljs-keyword\">unless</span> @fromSourceString\n          val\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> heredoc\n          indentRegex = <span class=\"hljs-regexp\">/// \\n<span class=\"hljs-subst\">#{@indent}</span> ///</span>g <span class=\"hljs-keyword\">if</span> @indent\n\n          val = val.replace indentRegex, <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-keyword\">if</span> indentRegex\n          val = val.replace LEADING_BLANK_LINE,  <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">if</span> @initialChunk\n          val = val.replace TRAILING_BLANK_LINE, <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">if</span> @finalChunk\n          val\n        <span class=\"hljs-keyword\">else</span>\n          val.replace SIMPLE_STRING_OMIT, <span class=\"hljs-function\"><span class=\"hljs-params\">(match, offset)</span> =&gt;</span>\n            <span class=\"hljs-keyword\">if</span> (@initialChunk <span class=\"hljs-keyword\">and</span> offset <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>) <span class=\"hljs-keyword\">or</span>\n               (@finalChunk <span class=\"hljs-keyword\">and</span> offset + match.length <span class=\"hljs-keyword\">is</span> val.length)\n              <span class=\"hljs-string\">&#x27;&#x27;</span>\n            <span class=\"hljs-keyword\">else</span>\n              <span class=\"hljs-string\">&#x27; &#x27;</span>\n    @delimiter = @quote.charAt <span class=\"hljs-number\">0</span>\n    @value = makeDelimitedLiteral val, {\n      @delimiter\n      @double\n    }\n\n    @unquotedValueForTemplateLiteral = makeDelimitedLiteral val, {\n      delimiter: <span class=\"hljs-string\">&#x27;`&#x27;</span>\n      @double\n      escapeNewlines: <span class=\"hljs-literal\">no</span>\n      includeDelimiters: <span class=\"hljs-literal\">no</span>\n      convertTrailingNullEscapes: <span class=\"hljs-literal\">yes</span>\n    }\n\n    @unquotedValueForJSX = makeDelimitedLiteral val, {\n      @double\n      escapeNewlines: <span class=\"hljs-literal\">no</span>\n      includeDelimiters: <span class=\"hljs-literal\">no</span>\n      escapeDelimiter: <span class=\"hljs-literal\">no</span>\n    }\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> StringWithInterpolations.fromStringLiteral(@).compileNode o <span class=\"hljs-keyword\">if</span> @shouldGenerateTemplateLiteral()\n    <span class=\"hljs-keyword\">return</span> [@makeCode @unquotedValueForJSX] <span class=\"hljs-keyword\">if</span> @jsx\n    super o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-94\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-94\">&#x00a7;</a>\n              </div>\n              <p><code>StringLiteral</code>s can represent either entire literal strings\nor pieces of text inside of e.g. an interpolated string.\nWhen parsed as the former but needing to be treated as the latter\n(e.g. the string part of a tagged template literal), this will return\na copy of the <code>StringLiteral</code> with the quotes trimmed from its location\ndata (like it would have if parsed as part of an interpolated string).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  withoutQuotesInLocationData: <span class=\"hljs-function\">-&gt;</span>\n    endsWithNewline = @originalValue[<span class=\"hljs-number\">-1.</span>.] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n    locationData = <span class=\"hljs-built_in\">Object</span>.assign {}, @locationData\n    locationData.first_column          += @quote.length\n    <span class=\"hljs-keyword\">if</span> endsWithNewline\n      locationData.last_line -= <span class=\"hljs-number\">1</span>\n      locationData.last_column =\n        <span class=\"hljs-keyword\">if</span> locationData.last_line <span class=\"hljs-keyword\">is</span> locationData.first_line\n          locationData.first_column + @originalValue.length - <span class=\"hljs-string\">&#x27;\\n&#x27;</span>.length\n        <span class=\"hljs-keyword\">else</span>\n          @originalValue[...<span class=\"hljs-number\">-1</span>].length - <span class=\"hljs-string\">&#x27;\\n&#x27;</span>.length - @originalValue[...<span class=\"hljs-number\">-1</span>].lastIndexOf(<span class=\"hljs-string\">&#x27;\\n&#x27;</span>)\n    <span class=\"hljs-keyword\">else</span>\n      locationData.last_column         -= @quote.length\n    locationData.last_column_exclusive -= @quote.length\n    locationData.range = [\n      locationData.range[<span class=\"hljs-number\">0</span>] + @quote.length\n      locationData.range[<span class=\"hljs-number\">1</span>] - @quote.length\n    ]\n    copy = <span class=\"hljs-keyword\">new</span> StringLiteral @originalValue, {@quote, @initialChunk, @finalChunk, @indent, @double, @heregex}\n    copy.locationData = locationData\n    copy\n\n  isFromHeredoc: <span class=\"hljs-function\">-&gt;</span>\n    @quote.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">3</span>\n\n  shouldGenerateTemplateLiteral: <span class=\"hljs-function\">-&gt;</span>\n    @isFromHeredoc()\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> StringWithInterpolations.fromStringLiteral(@).ast o <span class=\"hljs-keyword\">if</span> @shouldGenerateTemplateLiteral()\n    super o\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      value: @originalValue\n      extra:\n        raw: <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@delimiter}</span><span class=\"hljs-subst\">#{@originalValue}</span><span class=\"hljs-subst\">#{@delimiter}</span>&quot;</span>\n\n<span class=\"hljs-built_in\">exports</span>.RegexLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RegexLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(value, {@delimiter = <span class=\"hljs-string\">&#x27;/&#x27;</span>, @heregexCommentTokens = []} = {})</span> -&gt;</span>\n    super <span class=\"hljs-string\">&#x27;&#x27;</span>\n    heregex = @delimiter <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;///&#x27;</span>\n    endDelimiterIndex = value.lastIndexOf <span class=\"hljs-string\">&#x27;/&#x27;</span>\n    @flags = value[endDelimiterIndex + <span class=\"hljs-number\">1.</span>.]\n    val = @originalValue = value[<span class=\"hljs-number\">1.</span>..endDelimiterIndex]\n    val = val.replace HEREGEX_OMIT, <span class=\"hljs-string\">&#x27;$1$2&#x27;</span> <span class=\"hljs-keyword\">if</span> heregex\n    val = replaceUnicodeCodePointEscapes val, {@flags}\n    @value = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{makeDelimitedLiteral val, delimiter: <span class=\"hljs-string\">&#x27;/&#x27;</span>}</span><span class=\"hljs-subst\">#{@flags}</span>&quot;</span>\n\n  REGEX_REGEX: <span class=\"hljs-regexp\">/// ^ / (.*) / \\w* $ ///</span>\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;RegExpLiteral&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [, pattern] = @REGEX_REGEX.exec @value\n    <span class=\"hljs-keyword\">return</span> {\n      value: <span class=\"hljs-literal\">undefined</span>\n      pattern, @flags, @delimiter\n      originalPattern: @originalValue\n      extra:\n        raw: @value\n        originalRaw: <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@delimiter}</span><span class=\"hljs-subst\">#{@originalValue}</span><span class=\"hljs-subst\">#{@delimiter}</span><span class=\"hljs-subst\">#{@flags}</span>&quot;</span>\n        rawValue: <span class=\"hljs-literal\">undefined</span>\n      comments:\n        <span class=\"hljs-keyword\">for</span> heregexCommentToken <span class=\"hljs-keyword\">in</span> @heregexCommentTokens\n          <span class=\"hljs-keyword\">if</span> heregexCommentToken.here\n            <span class=\"hljs-keyword\">new</span> HereComment(heregexCommentToken).ast o\n          <span class=\"hljs-keyword\">else</span>\n            <span class=\"hljs-keyword\">new</span> LineComment(heregexCommentToken).ast o\n    }\n\n<span class=\"hljs-built_in\">exports</span>.PassthroughLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">PassthroughLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@originalValue, {@here, @generated} = {})</span> -&gt;</span>\n    super <span class=\"hljs-string\">&#x27;&#x27;</span>\n    @value = @originalValue.replace <span class=\"hljs-regexp\">/\\\\+(`|$)/g</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(string)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-95\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-95\">&#x00a7;</a>\n              </div>\n              <p><code>string</code> is always a value like ‘`‘, ‘\\`‘, ‘\\\\`‘, etc.\nBy reducing it to its latter half, we turn ‘`‘ to ‘<code>&#39;, &#39;\\\\\\</code>‘ to ‘`‘, etc.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      string[-<span class=\"hljs-built_in\">Math</span>.ceil(string.length / <span class=\"hljs-number\">2</span>)..]\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">null</span> <span class=\"hljs-keyword\">if</span> @generated\n    super o\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> {\n      value: @originalValue\n      here: !!@here\n    }\n\n<span class=\"hljs-built_in\">exports</span>.IdentifierLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">IdentifierLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  isAssignable: YES\n\n  eachName: <span class=\"hljs-function\"><span class=\"hljs-params\">(iterator)</span> -&gt;</span>\n    iterator @\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @jsx\n      <span class=\"hljs-string\">&#x27;JSXIdentifier&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;Identifier&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      name: @value\n      declaration: !!@isDeclaration\n\n<span class=\"hljs-built_in\">exports</span>.PropertyName = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">PropertyName</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  isAssignable: YES\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @jsx\n      <span class=\"hljs-string\">&#x27;JSXIdentifier&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;Identifier&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      name: @value\n      declaration: <span class=\"hljs-literal\">no</span>\n\n<span class=\"hljs-built_in\">exports</span>.ComputedPropertyName = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ComputedPropertyName</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">PropertyName</span></span>\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [@makeCode(<span class=\"hljs-string\">&#x27;[&#x27;</span>), @value.compileToFragments(o, LEVEL_LIST)..., @makeCode(<span class=\"hljs-string\">&#x27;]&#x27;</span>)]\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @value.ast o\n\n<span class=\"hljs-built_in\">exports</span>.StatementLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">StatementLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  isStatement: YES\n\n  makeReturn: THIS\n\n  jumps: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> this <span class=\"hljs-keyword\">if</span> @value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;break&#x27;</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> (o?.<span class=\"hljs-keyword\">loop</span> <span class=\"hljs-keyword\">or</span> o?.block)\n    <span class=\"hljs-keyword\">return</span> this <span class=\"hljs-keyword\">if</span> @value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;continue&#x27;</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> o?.<span class=\"hljs-keyword\">loop</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [@makeCode <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@tab}</span><span class=\"hljs-subst\">#{@value}</span>;&quot;</span>]\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">switch</span> @value\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;continue&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;ContinueStatement&#x27;</span>\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;break&#x27;</span>    <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;BreakStatement&#x27;</span>\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;debugger&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;DebuggerStatement&#x27;</span>\n\n<span class=\"hljs-built_in\">exports</span>.ThisLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ThisLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(value)</span> -&gt;</span>\n    super <span class=\"hljs-string\">&#x27;this&#x27;</span>\n    @shorthand = value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;@&#x27;</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    code = <span class=\"hljs-keyword\">if</span> o.scope.method?.bound <span class=\"hljs-keyword\">then</span> o.scope.method.context <span class=\"hljs-keyword\">else</span> @value\n    [@makeCode code]\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;ThisExpression&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      shorthand: @shorthand\n\n<span class=\"hljs-built_in\">exports</span>.UndefinedLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">UndefinedLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  constructor: <span class=\"hljs-function\">-&gt;</span>\n    super <span class=\"hljs-string\">&#x27;undefined&#x27;</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [@makeCode <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_ACCESS <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;(void 0)&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;void 0&#x27;</span>]\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;Identifier&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      name: @value\n      declaration: <span class=\"hljs-literal\">no</span>\n\n<span class=\"hljs-built_in\">exports</span>.NullLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">NullLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  constructor: <span class=\"hljs-function\">-&gt;</span>\n    super <span class=\"hljs-string\">&#x27;null&#x27;</span>\n\n<span class=\"hljs-built_in\">exports</span>.BooleanLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">BooleanLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(value, {@originalValue} = {})</span> -&gt;</span>\n    super value\n    @originalValue ?= @value\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    value: <span class=\"hljs-keyword\">if</span> @value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;true&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-literal\">no</span>\n    name: @originalValue\n\n<span class=\"hljs-built_in\">exports</span>.DefaultLiteral = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DefaultLiteral</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Literal</span></span>\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;Identifier&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      name: <span class=\"hljs-string\">&#x27;default&#x27;</span>\n      declaration: <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-96\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-96\">&#x00a7;</a>\n              </div>\n              <h3 id=\"return\">Return</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-97\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-97\">&#x00a7;</a>\n              </div>\n              <p>A <code>return</code> is a <em>pureStatement</em>—wrapping it in a closure wouldn’t make sense.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Return = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Return</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@expression, {@belongsToFuncDirectiveReturn} = {})</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;expression&#x27;</span>]\n\n  isStatement:     YES\n  makeReturn:      THIS\n  jumps:           THIS\n\n  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, level)</span> -&gt;</span>\n    expr = @expression?.makeReturn()\n    <span class=\"hljs-keyword\">if</span> expr <span class=\"hljs-keyword\">and</span> expr <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Return <span class=\"hljs-keyword\">then</span> expr.compileToFragments o, level <span class=\"hljs-keyword\">else</span> super o, level\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    answer = []</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-98\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-98\">&#x00a7;</a>\n              </div>\n              <p>TODO: If we call <code>expression.compile()</code> here twice, we’ll sometimes\nget back different results!</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> @expression\n      answer = @expression.compileToFragments o, LEVEL_PAREN\n      unshiftAfterComments answer, @makeCode <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@tab}</span>return &quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-99\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-99\">&#x00a7;</a>\n              </div>\n              <p>Since the <code>return</code> got indented by <code>@tab</code>, preceding comments that are\nmultiline need to be indented.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">for</span> fragment <span class=\"hljs-keyword\">in</span> answer\n        <span class=\"hljs-keyword\">if</span> fragment.isHereComment <span class=\"hljs-keyword\">and</span> <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-keyword\">in</span> fragment.code\n          fragment.code = multident fragment.code, @tab\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> fragment.isLineComment\n          fragment.code = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@tab}</span><span class=\"hljs-subst\">#{fragment.code}</span>&quot;</span>\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-keyword\">break</span>\n    <span class=\"hljs-keyword\">else</span>\n      answer.push @makeCode <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@tab}</span>return&quot;</span>\n    answer.push @makeCode <span class=\"hljs-string\">&#x27;;&#x27;</span>\n    answer\n\n  checkForPureStatementInExpression: <span class=\"hljs-function\">-&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-100\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-100\">&#x00a7;</a>\n              </div>\n              <p>don’t flag <code>return</code> from <code>await return</code>/<code>yield return</code> as invalid.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> @belongsToFuncDirectiveReturn\n    super()\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;ReturnStatement&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    argument: @expression?.ast(o, LEVEL_PAREN) ? <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-101\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-101\">&#x00a7;</a>\n              </div>\n              <p>Parent class for <code>YieldReturn</code>/<code>AwaitReturn</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.FuncDirectiveReturn = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">FuncDirectiveReturn</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Return</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(expression, {@returnKeyword})</span> -&gt;</span>\n    super expression\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkScope o\n    super o\n\n  checkScope: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">unless</span> o.scope.parent?\n      @error <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@keyword}</span> can only occur inside functions&quot;</span>\n\n  isStatementAst: NO\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkScope o\n\n    <span class=\"hljs-keyword\">new</span> Op @keyword,\n      <span class=\"hljs-keyword\">new</span> Return @expression, belongsToFuncDirectiveReturn: <span class=\"hljs-literal\">yes</span>\n      .withLocationDataFrom(\n        <span class=\"hljs-keyword\">if</span> @expression?\n          locationData: mergeLocationData @returnKeyword.locationData, @expression.locationData\n        <span class=\"hljs-keyword\">else</span>\n          @returnKeyword\n      )\n    .withLocationDataFrom @\n    .ast o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-102\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-102\">&#x00a7;</a>\n              </div>\n              <p><code>yield return</code> works exactly like <code>return</code>, except that it turns the function\ninto a generator.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.YieldReturn = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">YieldReturn</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">FuncDirectiveReturn</span></span>\n  keyword: <span class=\"hljs-string\">&#x27;yield&#x27;</span>\n\n<span class=\"hljs-built_in\">exports</span>.AwaitReturn = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">AwaitReturn</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">FuncDirectiveReturn</span></span>\n  keyword: <span class=\"hljs-string\">&#x27;await&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-103\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-103\">&#x00a7;</a>\n              </div>\n              <h3 id=\"value\">Value</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-104\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-104\">&#x00a7;</a>\n              </div>\n              <p>A value, variable or literal or parenthesized, indexed or dotted into,\nor vanilla.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Value = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Value</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(base, props, tag, isDefaultValue = <span class=\"hljs-literal\">no</span>)</span> -&gt;</span>\n    super()\n    <span class=\"hljs-keyword\">return</span> base <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> props <span class=\"hljs-keyword\">and</span> base <span class=\"hljs-keyword\">instanceof</span> Value\n    @base           = base\n    @properties     = props <span class=\"hljs-keyword\">or</span> []\n    @tag            = tag\n    @[tag]          = <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> tag\n    @isDefaultValue = isDefaultValue</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-105\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-105\">&#x00a7;</a>\n              </div>\n              <p>If this is a <code>@foo =</code> assignment, if there are comments on <code>@</code> move them\nto be on <code>foo</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> @base?.comments <span class=\"hljs-keyword\">and</span> @base <span class=\"hljs-keyword\">instanceof</span> ThisLiteral <span class=\"hljs-keyword\">and</span> @properties[<span class=\"hljs-number\">0</span>]?.name?\n      moveComments @base, @properties[<span class=\"hljs-number\">0</span>].name\n\n  children: [<span class=\"hljs-string\">&#x27;base&#x27;</span>, <span class=\"hljs-string\">&#x27;properties&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-106\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-106\">&#x00a7;</a>\n              </div>\n              <p>Add a property (or <em>properties</em> ) <code>Access</code> to the list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  add: <span class=\"hljs-function\"><span class=\"hljs-params\">(props)</span> -&gt;</span>\n    @properties = @properties.concat props\n    @forceUpdateLocation = <span class=\"hljs-literal\">yes</span>\n    this\n\n  hasProperties: <span class=\"hljs-function\">-&gt;</span>\n    @properties.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n\n  bareLiteral: <span class=\"hljs-function\"><span class=\"hljs-params\">(type)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">not</span> @properties.length <span class=\"hljs-keyword\">and</span> @base <span class=\"hljs-keyword\">instanceof</span> type</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-107\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-107\">&#x00a7;</a>\n              </div>\n              <p>Some boolean checks for the benefit of other nodes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  isArray        : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(Arr)\n  isRange        : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(Range)\n  shouldCache    : <span class=\"hljs-function\">-&gt;</span> @hasProperties() <span class=\"hljs-keyword\">or</span> @base.shouldCache()\n  isAssignable   : <span class=\"hljs-function\"><span class=\"hljs-params\">(opts)</span> -&gt;</span> @hasProperties() <span class=\"hljs-keyword\">or</span> @base.isAssignable opts\n  isNumber       : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(NumberLiteral)\n  isString       : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(StringLiteral)\n  isRegex        : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(RegexLiteral)\n  isUndefined    : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(UndefinedLiteral)\n  isNull         : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(NullLiteral)\n  isBoolean      : <span class=\"hljs-function\">-&gt;</span> @bareLiteral(BooleanLiteral)\n  isAtomic       : <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">for</span> node <span class=\"hljs-keyword\">in</span> @properties.concat @base\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">if</span> node.soak <span class=\"hljs-keyword\">or</span> node <span class=\"hljs-keyword\">instanceof</span> Call <span class=\"hljs-keyword\">or</span> node <span class=\"hljs-keyword\">instanceof</span> Op <span class=\"hljs-keyword\">and</span> node.operator <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;do&#x27;</span>\n    <span class=\"hljs-literal\">yes</span>\n\n  isNotCallable  : <span class=\"hljs-function\">-&gt;</span> @isNumber() <span class=\"hljs-keyword\">or</span> @isString() <span class=\"hljs-keyword\">or</span> @isRegex() <span class=\"hljs-keyword\">or</span>\n                      @isArray() <span class=\"hljs-keyword\">or</span> @isRange() <span class=\"hljs-keyword\">or</span> @isSplice() <span class=\"hljs-keyword\">or</span> @isObject() <span class=\"hljs-keyword\">or</span>\n                      @isUndefined() <span class=\"hljs-keyword\">or</span> @isNull() <span class=\"hljs-keyword\">or</span> @isBoolean()\n\n  isStatement : <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span>    -&gt;</span> <span class=\"hljs-keyword\">not</span> @properties.length <span class=\"hljs-keyword\">and</span> @base.isStatement o\n  isJSXTag    : <span class=\"hljs-function\">-&gt;</span> @base <span class=\"hljs-keyword\">instanceof</span> JSXTag\n  assigns     : <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span> <span class=\"hljs-keyword\">not</span> @properties.length <span class=\"hljs-keyword\">and</span> @base.assigns name\n  jumps       : <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span>    -&gt;</span> <span class=\"hljs-keyword\">not</span> @properties.length <span class=\"hljs-keyword\">and</span> @base.jumps o\n\n  isObject: <span class=\"hljs-function\"><span class=\"hljs-params\">(onlyGenerated)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">if</span> @properties.length\n    (@base <span class=\"hljs-keyword\">instanceof</span> Obj) <span class=\"hljs-keyword\">and</span> (<span class=\"hljs-keyword\">not</span> onlyGenerated <span class=\"hljs-keyword\">or</span> @base.generated)\n\n  isElision: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> @base <span class=\"hljs-keyword\">instanceof</span> Arr\n    @base.hasElision()\n\n  isSplice: <span class=\"hljs-function\">-&gt;</span>\n    [..., lastProperty] = @properties\n    lastProperty <span class=\"hljs-keyword\">instanceof</span> Slice\n\n  looksStatic: <span class=\"hljs-function\"><span class=\"hljs-params\">(className)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> ((thisLiteral = @base) <span class=\"hljs-keyword\">instanceof</span> ThisLiteral <span class=\"hljs-keyword\">or</span> (name = @base).value <span class=\"hljs-keyword\">is</span> className) <span class=\"hljs-keyword\">and</span>\n      @properties.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> @properties[<span class=\"hljs-number\">0</span>].name?.value <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;prototype&#x27;</span>\n    <span class=\"hljs-keyword\">return</span>\n      staticClassName: thisLiteral ? name</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-108\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-108\">&#x00a7;</a>\n              </div>\n              <p>The value can be unwrapped as its inner node, if there are no attached\nproperties.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unwrap: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @properties.length <span class=\"hljs-keyword\">then</span> this <span class=\"hljs-keyword\">else</span> @base</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-109\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-109\">&#x00a7;</a>\n              </div>\n              <p>A reference has base part (<code>this</code> value) and name part.\nWe cache them separately for compiling complex expressions.\n<code>a()[b()] ?= c</code> -&gt; <code>(_base = a())[_name = b()] ? _base[_name] = c</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  cacheReference: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [..., name] = @properties\n    <span class=\"hljs-keyword\">if</span> @properties.length &lt; <span class=\"hljs-number\">2</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @base.shouldCache() <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> name?.shouldCache()\n      <span class=\"hljs-keyword\">return</span> [this, this]  <span class=\"hljs-comment\"># `a` `a.b`</span>\n    base = <span class=\"hljs-keyword\">new</span> Value @base, @properties[...<span class=\"hljs-number\">-1</span>]\n    <span class=\"hljs-keyword\">if</span> base.shouldCache()  <span class=\"hljs-comment\"># `a().b`</span>\n      bref = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">&#x27;base&#x27;</span>\n      base = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Parens <span class=\"hljs-keyword\">new</span> Assign bref, base\n    <span class=\"hljs-keyword\">return</span> [base, bref] <span class=\"hljs-keyword\">unless</span> name  <span class=\"hljs-comment\"># `a()`</span>\n    <span class=\"hljs-keyword\">if</span> name.shouldCache()  <span class=\"hljs-comment\"># `a[b()]`</span>\n      nref = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">&#x27;name&#x27;</span>\n      name = <span class=\"hljs-keyword\">new</span> Index <span class=\"hljs-keyword\">new</span> Assign nref, name.index\n      nref = <span class=\"hljs-keyword\">new</span> Index nref\n    [base.add(name), <span class=\"hljs-keyword\">new</span> Value(bref <span class=\"hljs-keyword\">or</span> base.base, [nref <span class=\"hljs-keyword\">or</span> name])]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-110\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-110\">&#x00a7;</a>\n              </div>\n              <p>We compile a value to JavaScript by compiling and joining each property.\nThings get much more interesting if the chain of properties has <em>soak</em>\noperators <code>?.</code> interspersed. Then we have to take care not to accidentally\nevaluate anything twice when building the soak chain.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @base.front = @front\n    props = @properties\n    <span class=\"hljs-keyword\">if</span> props.length <span class=\"hljs-keyword\">and</span> @base.cached?</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-111\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-111\">&#x00a7;</a>\n              </div>\n              <p>Cached fragments enable correct order of the compilation,\nand reuse of variables in the scope.\nExample:\n<code>a(x = 5).b(-&gt; x = 6)</code> should compile in the same order as\n<code>a(x = 5); b(-&gt; x = 6)</code>\n(see issue #4437, <a href=\"https://github.com/jashkenas/coffeescript/issues/4437\">https://github.com/jashkenas/coffeescript/issues/4437</a>)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      fragments = @base.cached\n    <span class=\"hljs-keyword\">else</span>\n      fragments = @base.compileToFragments o, (<span class=\"hljs-keyword\">if</span> props.length <span class=\"hljs-keyword\">then</span> LEVEL_ACCESS <span class=\"hljs-keyword\">else</span> <span class=\"hljs-literal\">null</span>)\n    <span class=\"hljs-keyword\">if</span> props.length <span class=\"hljs-keyword\">and</span> SIMPLENUM.test fragmentsToText fragments\n      fragments.push @makeCode <span class=\"hljs-string\">&#x27;.&#x27;</span>\n    <span class=\"hljs-keyword\">for</span> prop <span class=\"hljs-keyword\">in</span> props\n      fragments.push (prop.compileToFragments o)...\n\n    fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-112\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-112\">&#x00a7;</a>\n              </div>\n              <p>Unfold a soak into an <code>If</code>: <code>a?.b</code> -&gt; <code>a.b if a?</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unfoldSoak: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @unfoldedSoak ?= <span class=\"hljs-keyword\">do</span> =&gt;\n      ifn = @base.unfoldSoak o\n      <span class=\"hljs-keyword\">if</span> ifn\n        ifn.body.properties.push @properties...\n        <span class=\"hljs-keyword\">return</span> ifn\n      <span class=\"hljs-keyword\">for</span> prop, i <span class=\"hljs-keyword\">in</span> @properties <span class=\"hljs-keyword\">when</span> prop.soak\n        prop.soak = <span class=\"hljs-literal\">off</span>\n        fst = <span class=\"hljs-keyword\">new</span> Value @base, @properties[...i]\n        snd = <span class=\"hljs-keyword\">new</span> Value @base, @properties[i..]\n        <span class=\"hljs-keyword\">if</span> fst.shouldCache()\n          ref = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">&#x27;ref&#x27;</span>\n          fst = <span class=\"hljs-keyword\">new</span> Parens <span class=\"hljs-keyword\">new</span> Assign ref, fst\n          snd.base = ref\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> If <span class=\"hljs-keyword\">new</span> Existence(fst), snd, soak: <span class=\"hljs-literal\">on</span>\n      <span class=\"hljs-literal\">no</span>\n\n  eachName: <span class=\"hljs-function\"><span class=\"hljs-params\">(iterator, {checkAssignability = <span class=\"hljs-literal\">yes</span>} = {})</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @hasProperties()\n      iterator @\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> checkAssignability <span class=\"hljs-keyword\">or</span> @base.isAssignable()\n      @base.eachName iterator\n    <span class=\"hljs-keyword\">else</span>\n      @error <span class=\"hljs-string\">&#x27;tried to assign to unassignable value&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-113\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-113\">&#x00a7;</a>\n              </div>\n              <p>For AST generation, we need an <code>object</code> that’s this <code>Value</code> minus its last\nproperty, if it has properties.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  object: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> @ <span class=\"hljs-keyword\">unless</span> @hasProperties()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-114\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-114\">&#x00a7;</a>\n              </div>\n              <p>Get all properties except the last one; for a <code>Value</code> with only one\nproperty, <code>initialProperties</code> is an empty array.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    initialProperties = @properties[<span class=\"hljs-number\">0.</span>..@properties.length - <span class=\"hljs-number\">1</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-115\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-115\">&#x00a7;</a>\n              </div>\n              <p>Create the <code>object</code> that becomes the new “base” for the split-off final\nproperty.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    object = <span class=\"hljs-keyword\">new</span> Value @base, initialProperties, @tag, @isDefaultValue</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-116\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-116\">&#x00a7;</a>\n              </div>\n              <p>Add location data to our new node, so that it has correct location data\nfor source maps or later conversion into AST location data.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    object.locationData =\n      <span class=\"hljs-keyword\">if</span> initialProperties.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-117\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-117\">&#x00a7;</a>\n              </div>\n              <p>This new <code>Value</code> has only one property, so the location data is just\nthat of the parent <code>Value</code>’s base.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        @base.locationData\n      <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-118\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-118\">&#x00a7;</a>\n              </div>\n              <p>This new <code>Value</code> has multiple properties, so the location data spans\nfrom the parent <code>Value</code>’s base to the last property that’s included\nin this new node (a.k.a. the second-to-last property of the parent).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        mergeLocationData @base.locationData, initialProperties[initialProperties.length - <span class=\"hljs-number\">1</span>].locationData\n    object\n\n  containsSoak: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> @hasProperties()\n\n    <span class=\"hljs-keyword\">for</span> property <span class=\"hljs-keyword\">in</span> @properties <span class=\"hljs-keyword\">when</span> property.soak\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span>\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @base <span class=\"hljs-keyword\">instanceof</span> Call <span class=\"hljs-keyword\">and</span> @base.soak\n\n    <span class=\"hljs-literal\">no</span>\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-119\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-119\">&#x00a7;</a>\n              </div>\n              <p>If the <code>Value</code> has no properties, the AST node is just whatever this\nnode’s <code>base</code> is.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">return</span> @base.ast o <span class=\"hljs-keyword\">unless</span> @hasProperties()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-120\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-120\">&#x00a7;</a>\n              </div>\n              <p>Otherwise, call <code>Base::ast</code> which in turn calls the <code>astType</code> and\n<code>astProperties</code> methods below.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isJSXTag()\n      <span class=\"hljs-string\">&#x27;JSXMemberExpression&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @containsSoak()\n      <span class=\"hljs-string\">&#x27;OptionalMemberExpression&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;MemberExpression&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-121\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-121\">&#x00a7;</a>\n              </div>\n              <p>If this <code>Value</code> has properties, the <em>last</em> property (e.g. <code>c</code> in <code>a.b.c</code>)\nbecomes the <code>property</code>, and the preceding properties (e.g. <code>a.b</code>) become\na child <code>Value</code> node assigned to the <code>object</code> property.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [..., property] = @properties\n    property.name.jsx = <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @isJSXTag()\n    computed = property <span class=\"hljs-keyword\">instanceof</span> Index <span class=\"hljs-keyword\">or</span> property.name?.unwrap() <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> PropertyName\n    <span class=\"hljs-keyword\">return</span> {\n      object: @object().ast o, LEVEL_ACCESS\n      property: property.ast o, (LEVEL_PAREN <span class=\"hljs-keyword\">if</span> computed)\n      computed\n      optional: !!property.soak\n      shorthand: !!property.shorthand\n    }\n\n  astLocationData: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> super() <span class=\"hljs-keyword\">unless</span> @isJSXTag()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-122\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-122\">&#x00a7;</a>\n              </div>\n              <p>don’t include leading &lt; of JSX tag in location data</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    mergeAstLocationData(\n      jisonLocationDataToAstLocationData(@base.tagNameLocationData),\n      jisonLocationDataToAstLocationData(@properties[@properties.length - <span class=\"hljs-number\">1</span>].locationData)\n    )\n\n<span class=\"hljs-built_in\">exports</span>.MetaProperty = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">MetaProperty</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@meta, @property)</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;meta&#x27;</span>, <span class=\"hljs-string\">&#x27;property&#x27;</span>]\n\n  checkValid: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @meta.value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;new&#x27;</span>\n      <span class=\"hljs-keyword\">if</span> @property <span class=\"hljs-keyword\">instanceof</span> Access <span class=\"hljs-keyword\">and</span> @property.name.value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;target&#x27;</span>\n        <span class=\"hljs-keyword\">unless</span> o.scope.parent?\n          @error <span class=\"hljs-string\">&quot;new.target can only occur inside functions&quot;</span>\n      <span class=\"hljs-keyword\">else</span>\n        @error <span class=\"hljs-string\">&quot;the only valid meta property for new is new.target&quot;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @meta.value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;import&#x27;</span>\n      <span class=\"hljs-keyword\">unless</span> @property <span class=\"hljs-keyword\">instanceof</span> Access <span class=\"hljs-keyword\">and</span> @property.name.value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;meta&#x27;</span>\n        @error <span class=\"hljs-string\">&quot;the only valid meta property for import is import.meta&quot;</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkValid o\n    fragments = []\n    fragments.push @meta.compileToFragments(o, LEVEL_ACCESS)...\n    fragments.push @property.compileToFragments(o)...\n    fragments\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkValid o\n\n    <span class=\"hljs-keyword\">return</span>\n      meta: @meta.ast o, LEVEL_ACCESS\n      property: @property.ast o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-123\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-123\">&#x00a7;</a>\n              </div>\n              <h3 id=\"herecomment\">HereComment</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-124\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-124\">&#x00a7;</a>\n              </div>\n              <p>Comment delimited by <code>###</code> (becoming <code>/* */</code>).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.HereComment = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">HereComment</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">({ @content, @newLine, @unshift, @locationData })</span> -&gt;</span>\n    super()\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    multiline = <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-keyword\">in</span> @content</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-125\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-125\">&#x00a7;</a>\n              </div>\n              <p>Unindent multiline comments. They will be reindented later.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> multiline\n      indent = <span class=\"hljs-literal\">null</span>\n      <span class=\"hljs-keyword\">for</span> line <span class=\"hljs-keyword\">in</span> @content.split <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n        leadingWhitespace = <span class=\"hljs-regexp\">/^\\s*/</span>.exec(line)[<span class=\"hljs-number\">0</span>]\n        <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> indent <span class=\"hljs-keyword\">or</span> leadingWhitespace.length &lt; indent.length\n          indent = leadingWhitespace\n      @content = @content.replace <span class=\"hljs-regexp\">/// \\n <span class=\"hljs-subst\">#{indent}</span> ///</span>g, <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-keyword\">if</span> indent\n\n    hasLeadingMarks = <span class=\"hljs-regexp\">/\\n\\s*[#|\\*]/</span>.test @content\n    @content = @content.replace <span class=\"hljs-regexp\">/^([ \\t]*)#(?=\\s)/gm</span>, <span class=\"hljs-string\">&#x27; *&#x27;</span> <span class=\"hljs-keyword\">if</span> hasLeadingMarks\n\n    @content = <span class=\"hljs-string\">&quot;/*<span class=\"hljs-subst\">#{@content}</span><span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> hasLeadingMarks <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27; &#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>}</span>*/&quot;</span>\n    fragment = @makeCode @content\n    fragment.newLine = @newLine\n    fragment.unshift = @unshift\n    fragment.multiline = multiline</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-126\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-126\">&#x00a7;</a>\n              </div>\n              <p>Don’t rely on <code>fragment.type</code>, which can break when the compiler is minified.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    fragment.isComment = fragment.isHereComment = <span class=\"hljs-literal\">yes</span>\n    fragment\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;CommentBlock&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      value: @content</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-127\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-127\">&#x00a7;</a>\n              </div>\n              <h3 id=\"linecomment\">LineComment</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-128\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-128\">&#x00a7;</a>\n              </div>\n              <p>Comment running from <code>#</code> to the end of a line (becoming <code>//</code>).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.LineComment = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">LineComment</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">({ @content, @newLine, @unshift, @locationData, @precededByBlankLine })</span> -&gt;</span>\n    super()\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    fragment = @makeCode(<span class=\"hljs-keyword\">if</span> <span class=\"hljs-regexp\">/^\\s*$/</span>.test @content <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @precededByBlankLine <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{o.indent}</span>&quot;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>}</span>//<span class=\"hljs-subst\">#{@content}</span>&quot;</span>)\n    fragment.newLine = @newLine\n    fragment.unshift = @unshift\n    fragment.trail = <span class=\"hljs-keyword\">not</span> @newLine <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @unshift</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-129\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-129\">&#x00a7;</a>\n              </div>\n              <p>Don’t rely on <code>fragment.type</code>, which can break when the compiler is minified.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    fragment.isComment = fragment.isLineComment = <span class=\"hljs-literal\">yes</span>\n    fragment\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;CommentLine&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      value: @content</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-130\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-130\">&#x00a7;</a>\n              </div>\n              <h3 id=\"jsx\">JSX</h3>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n<span class=\"hljs-built_in\">exports</span>.JSXIdentifier = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">JSXIdentifier</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">IdentifierLiteral</span></span>\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;JSXIdentifier&#x27;</span>\n\n<span class=\"hljs-built_in\">exports</span>.JSXTag = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">JSXTag</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">JSXIdentifier</span></span>\n  constructor: (value, {\n    @tagNameLocationData\n    @closingTagOpeningBracketLocationData\n    @closingTagSlashLocationData\n    @closingTagNameLocationData\n    @closingTagClosingBracketLocationData\n  }) -&gt;\n    super value\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      name: @value\n\n<span class=\"hljs-built_in\">exports</span>.JSXExpressionContainer = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">JSXExpressionContainer</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@expression, {locationData} = {})</span> -&gt;</span>\n    super()\n    @expression.jsxAttribute = <span class=\"hljs-literal\">yes</span>\n    @locationData = locationData ? @expression.locationData\n\n  children: [<span class=\"hljs-string\">&#x27;expression&#x27;</span>]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @expression.compileNode(o)\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      expression: astAsBlockIfNeeded @expression, o\n\n<span class=\"hljs-built_in\">exports</span>.JSXEmptyExpression = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">JSXEmptyExpression</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n\n<span class=\"hljs-built_in\">exports</span>.JSXText = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">JSXText</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(stringLiteral)</span> -&gt;</span>\n    super()\n    @value = stringLiteral.unquotedValueForJSX\n    @locationData = stringLiteral.locationData\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> {\n      @value\n      extra:\n        raw: @value\n    }\n\n<span class=\"hljs-built_in\">exports</span>.JSXAttribute = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">JSXAttribute</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">({@name, value})</span> -&gt;</span>\n    super()\n    @value =\n      <span class=\"hljs-keyword\">if</span> value?\n        value = value.base\n        <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">instanceof</span> StringLiteral <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> value.shouldGenerateTemplateLiteral()\n          value\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-keyword\">new</span> JSXExpressionContainer value\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-literal\">null</span>\n    @value?.comments = value.comments\n\n  children: [<span class=\"hljs-string\">&#x27;name&#x27;</span>, <span class=\"hljs-string\">&#x27;value&#x27;</span>]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    compiledName = @name.compileToFragments o, LEVEL_LIST\n    <span class=\"hljs-keyword\">return</span> compiledName <span class=\"hljs-keyword\">unless</span> @value?\n    val = @value.compileToFragments o, LEVEL_LIST\n    compiledName.concat @makeCode(<span class=\"hljs-string\">&#x27;=&#x27;</span>), val\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    name = @name\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">&#x27;:&#x27;</span> <span class=\"hljs-keyword\">in</span> name.value\n      name = <span class=\"hljs-keyword\">new</span> JSXNamespacedName name\n    <span class=\"hljs-keyword\">return</span>\n      name: name.ast o\n      value: @value?.ast(o) ? <span class=\"hljs-literal\">null</span>\n\n<span class=\"hljs-built_in\">exports</span>.JSXAttributes = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">JSXAttributes</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(arr)</span> -&gt;</span>\n    super()\n    @attributes = []\n    <span class=\"hljs-keyword\">for</span> object <span class=\"hljs-keyword\">in</span> arr.objects\n      @checkValidAttribute object\n      {base} = object\n      <span class=\"hljs-keyword\">if</span> base <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-131\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-131\">&#x00a7;</a>\n              </div>\n              <p>attribute with no value eg disabled</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        attribute = <span class=\"hljs-keyword\">new</span> JSXAttribute name: <span class=\"hljs-keyword\">new</span> JSXIdentifier(base.value).withLocationDataAndCommentsFrom base\n        attribute.locationData = base.locationData\n        @attributes.push attribute\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> base.generated</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-132\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-132\">&#x00a7;</a>\n              </div>\n              <p>object spread attribute eg {…props}</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        attribute = base.properties[<span class=\"hljs-number\">0</span>]\n        attribute.jsx = <span class=\"hljs-literal\">yes</span>\n        attribute.locationData = base.locationData\n        @attributes.push attribute\n      <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-133\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-133\">&#x00a7;</a>\n              </div>\n              <p>Obj containing attributes with values eg a=”b” c={d}</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">for</span> property <span class=\"hljs-keyword\">in</span> base.properties\n          {variable, value} = property\n          attribute = <span class=\"hljs-keyword\">new</span> JSXAttribute {\n            name: <span class=\"hljs-keyword\">new</span> JSXIdentifier(variable.base.value).withLocationDataAndCommentsFrom variable.base\n            value\n          }\n          attribute.locationData = property.locationData\n          @attributes.push attribute\n    @locationData = arr.locationData\n\n  children: [<span class=\"hljs-string\">&#x27;attributes&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-134\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-134\">&#x00a7;</a>\n              </div>\n              <p>Catch invalid attributes: &lt;div {a:”b”, props} {props} “value” /&gt;</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  checkValidAttribute: <span class=\"hljs-function\"><span class=\"hljs-params\">(object)</span> -&gt;</span>\n    {base: attribute} = object\n    properties = attribute?.properties <span class=\"hljs-keyword\">or</span> []\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> (attribute <span class=\"hljs-keyword\">instanceof</span> Obj <span class=\"hljs-keyword\">or</span> attribute <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral) <span class=\"hljs-keyword\">or</span> (attribute <span class=\"hljs-keyword\">instanceof</span> Obj <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> attribute.generated <span class=\"hljs-keyword\">and</span> (properties.length &gt; <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> (properties[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">instanceof</span> Splat)))\n      object.error <span class=\"hljs-string\">&quot;&quot;&quot;\n        Unexpected token. Allowed JSX attributes are: id=&quot;val&quot;, src={source}, {props...} or attribute.\n      &quot;&quot;&quot;</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    fragments = []\n    <span class=\"hljs-keyword\">for</span> attribute <span class=\"hljs-keyword\">in</span> @attributes\n      fragments.push @makeCode <span class=\"hljs-string\">&#x27; &#x27;</span>\n      fragments.push attribute.compileToFragments(o, LEVEL_TOP)...\n    fragments\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    attribute.ast(o) <span class=\"hljs-keyword\">for</span> attribute <span class=\"hljs-keyword\">in</span> @attributes\n\n<span class=\"hljs-built_in\">exports</span>.JSXNamespacedName = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">JSXNamespacedName</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(tag)</span> -&gt;</span>\n    super()\n    [namespace, name] = tag.value.split <span class=\"hljs-string\">&#x27;:&#x27;</span>\n    @namespace = <span class=\"hljs-keyword\">new</span> JSXIdentifier(namespace).withLocationDataFrom locationData: extractSameLineLocationDataFirst(namespace.length) tag.locationData\n    @name      = <span class=\"hljs-keyword\">new</span> JSXIdentifier(name     ).withLocationDataFrom locationData: extractSameLineLocationDataLast(name.length      ) tag.locationData\n    @locationData = tag.locationData\n\n  children: [<span class=\"hljs-string\">&#x27;namespace&#x27;</span>, <span class=\"hljs-string\">&#x27;name&#x27;</span>]\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      namespace: @namespace.ast o\n      name: @name.ast o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-135\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-135\">&#x00a7;</a>\n              </div>\n              <p>Node for a JSX element</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.JSXElement = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">JSXElement</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">({@tagName, @attributes, @content})</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;tagName&#x27;</span>, <span class=\"hljs-string\">&#x27;attributes&#x27;</span>, <span class=\"hljs-string\">&#x27;content&#x27;</span>]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @content?.base.jsx = <span class=\"hljs-literal\">yes</span>\n    fragments = [@makeCode(<span class=\"hljs-string\">&#x27;&lt;&#x27;</span>)]\n    fragments.push (tag = @tagName.compileToFragments(o, LEVEL_ACCESS))...\n    fragments.push @attributes.compileToFragments(o)...\n    <span class=\"hljs-keyword\">if</span> @content\n      fragments.push @makeCode(<span class=\"hljs-string\">&#x27;&gt;&#x27;</span>)\n      fragments.push @content.compileNode(o, LEVEL_LIST)...\n      fragments.push [@makeCode(<span class=\"hljs-string\">&#x27;&lt;/&#x27;</span>), tag..., @makeCode(<span class=\"hljs-string\">&#x27;&gt;&#x27;</span>)]...\n    <span class=\"hljs-keyword\">else</span>\n      fragments.push @makeCode(<span class=\"hljs-string\">&#x27; /&gt;&#x27;</span>)\n    fragments\n\n  isFragment: <span class=\"hljs-function\">-&gt;</span>\n    !@tagName.base.value.length\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-136\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-136\">&#x00a7;</a>\n              </div>\n              <p>The location data spanning the opening element &lt; … &gt; is captured by\nthe generated Arr which contains the element’s attributes</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @openingElementLocationData = jisonLocationDataToAstLocationData @attributes.locationData\n\n    tagName = @tagName.base\n    tagName.locationData = tagName.tagNameLocationData\n    <span class=\"hljs-keyword\">if</span> @content?\n      @closingElementLocationData = mergeAstLocationData(\n        jisonLocationDataToAstLocationData tagName.closingTagOpeningBracketLocationData\n        jisonLocationDataToAstLocationData tagName.closingTagClosingBracketLocationData\n      )\n\n    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isFragment()\n      <span class=\"hljs-string\">&#x27;JSXFragment&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;JSXElement&#x27;</span>\n\n  elementAstProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">tagNameAst</span> = =&gt;</span>\n      tag = @tagName.unwrap()\n      <span class=\"hljs-keyword\">if</span> tag?.value <span class=\"hljs-keyword\">and</span> <span class=\"hljs-string\">&#x27;:&#x27;</span> <span class=\"hljs-keyword\">in</span> tag.value\n        tag = <span class=\"hljs-keyword\">new</span> JSXNamespacedName tag\n      tag.ast o\n\n    openingElement = <span class=\"hljs-built_in\">Object</span>.assign {\n      type: <span class=\"hljs-string\">&#x27;JSXOpeningElement&#x27;</span>\n      name: tagNameAst()\n      selfClosing: <span class=\"hljs-keyword\">not</span> @closingElementLocationData?\n      attributes: @attributes.ast o\n    }, @openingElementLocationData\n\n    closingElement = <span class=\"hljs-literal\">null</span>\n    <span class=\"hljs-keyword\">if</span> @closingElementLocationData?\n      closingElement = <span class=\"hljs-built_in\">Object</span>.assign {\n        type: <span class=\"hljs-string\">&#x27;JSXClosingElement&#x27;</span>\n        name: <span class=\"hljs-built_in\">Object</span>.assign(\n          tagNameAst(),\n          jisonLocationDataToAstLocationData @tagName.base.closingTagNameLocationData\n        )\n      }, @closingElementLocationData\n      <span class=\"hljs-keyword\">if</span> closingElement.name.type <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;JSXMemberExpression&#x27;</span>, <span class=\"hljs-string\">&#x27;JSXNamespacedName&#x27;</span>]\n        rangeDiff = closingElement.range[<span class=\"hljs-number\">0</span>] - openingElement.range[<span class=\"hljs-number\">0</span>] + <span class=\"hljs-string\">&#x27;/&#x27;</span>.length\n        columnDiff = closingElement.loc.start.column - openingElement.loc.start.column + <span class=\"hljs-string\">&#x27;/&#x27;</span>.length\n<span class=\"hljs-function\">        <span class=\"hljs-title\">shiftAstLocationData</span> = <span class=\"hljs-params\">(node)</span> =&gt;</span>\n          node.range = [\n            node.range[<span class=\"hljs-number\">0</span>] + rangeDiff\n            node.range[<span class=\"hljs-number\">1</span>] + rangeDiff\n          ]\n          node.start += rangeDiff\n          node.end += rangeDiff\n          node.loc.start =\n            line: @closingElementLocationData.loc.start.line\n            column: node.loc.start.column + columnDiff\n          node.loc.end =\n            line: @closingElementLocationData.loc.start.line\n            column: node.loc.end.column + columnDiff\n        <span class=\"hljs-keyword\">if</span> closingElement.name.type <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;JSXMemberExpression&#x27;</span>\n          currentExpr = closingElement.name\n          <span class=\"hljs-keyword\">while</span> currentExpr.type <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;JSXMemberExpression&#x27;</span>\n            shiftAstLocationData currentExpr <span class=\"hljs-keyword\">unless</span> currentExpr <span class=\"hljs-keyword\">is</span> closingElement.name\n            shiftAstLocationData currentExpr.property\n            currentExpr = currentExpr.object\n          shiftAstLocationData currentExpr\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-comment\"># JSXNamespacedName</span>\n          shiftAstLocationData closingElement.name.namespace\n          shiftAstLocationData closingElement.name.name\n\n    {openingElement, closingElement}\n\n  fragmentAstProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    openingFragment = <span class=\"hljs-built_in\">Object</span>.assign {\n      type: <span class=\"hljs-string\">&#x27;JSXOpeningFragment&#x27;</span>\n    }, @openingElementLocationData\n\n    closingFragment = <span class=\"hljs-built_in\">Object</span>.assign {\n      type: <span class=\"hljs-string\">&#x27;JSXClosingFragment&#x27;</span>\n    }, @closingElementLocationData\n\n    {openingFragment, closingFragment}\n\n  contentAst: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> [] <span class=\"hljs-keyword\">unless</span> @content <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @content.base.isEmpty?()\n\n    content = @content.unwrapAll()\n    children =\n      <span class=\"hljs-keyword\">if</span> content <span class=\"hljs-keyword\">instanceof</span> StringLiteral\n        [<span class=\"hljs-keyword\">new</span> JSXText content]\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-comment\"># StringWithInterpolations</span>\n        <span class=\"hljs-keyword\">for</span> element <span class=\"hljs-keyword\">in</span> @content.unwrapAll().extractElements o, includeInterpolationWrappers: <span class=\"hljs-literal\">yes</span>, isJsx: <span class=\"hljs-literal\">yes</span>\n          <span class=\"hljs-keyword\">if</span> element <span class=\"hljs-keyword\">instanceof</span> StringLiteral\n            <span class=\"hljs-keyword\">new</span> JSXText element\n          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-comment\"># Interpolation</span>\n            {expression} = element\n            <span class=\"hljs-keyword\">unless</span> expression?\n              emptyExpression = <span class=\"hljs-keyword\">new</span> JSXEmptyExpression()\n              emptyExpression.locationData = emptyExpressionLocationData {\n                interpolationNode: element\n                openingBrace: <span class=\"hljs-string\">&#x27;{&#x27;</span>\n                closingBrace: <span class=\"hljs-string\">&#x27;}&#x27;</span>\n              }\n\n              <span class=\"hljs-keyword\">new</span> JSXExpressionContainer emptyExpression, locationData: element.locationData\n            <span class=\"hljs-keyword\">else</span>\n              unwrapped = expression.unwrapAll()\n              <span class=\"hljs-keyword\">if</span> unwrapped <span class=\"hljs-keyword\">instanceof</span> JSXElement <span class=\"hljs-keyword\">and</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-137\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-137\">&#x00a7;</a>\n              </div>\n              <p>distinguish <code>&lt;a&gt;&lt;b /&gt;&lt;/a&gt;</code> from <code>&lt;a&gt;{&lt;b /&gt;}&lt;/a&gt;</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>                  unwrapped.locationData.range[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> element.locationData.range[<span class=\"hljs-number\">0</span>]\n                unwrapped\n              <span class=\"hljs-keyword\">else</span>\n                <span class=\"hljs-keyword\">new</span> JSXExpressionContainer unwrapped, locationData: element.locationData\n\n    child.ast(o) <span class=\"hljs-keyword\">for</span> child <span class=\"hljs-keyword\">in</span> children <span class=\"hljs-keyword\">when</span> <span class=\"hljs-keyword\">not</span> (child <span class=\"hljs-keyword\">instanceof</span> JSXText <span class=\"hljs-keyword\">and</span> child.value.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>)\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-built_in\">Object</span>.assign(\n      <span class=\"hljs-keyword\">if</span> @isFragment()\n        @fragmentAstProperties o\n      <span class=\"hljs-keyword\">else</span>\n        @elementAstProperties o\n    ,\n      children: @contentAst o\n    )\n\n  astLocationData: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @closingElementLocationData?\n      mergeAstLocationData @openingElementLocationData, @closingElementLocationData\n    <span class=\"hljs-keyword\">else</span>\n      @openingElementLocationData</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-138\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-138\">&#x00a7;</a>\n              </div>\n              <h3 id=\"call\">Call</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-139\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-139\">&#x00a7;</a>\n              </div>\n              <p>Node for a function invocation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Call = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Call</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@variable, @args = [], @soak, @token)</span> -&gt;</span>\n    super()\n\n    @implicit = @args.implicit\n    @isNew = <span class=\"hljs-literal\">no</span>\n    <span class=\"hljs-keyword\">if</span> @variable <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> @variable.isNotCallable()\n      @variable.error <span class=\"hljs-string\">&quot;literal is not a function&quot;</span>\n\n    <span class=\"hljs-keyword\">if</span> @variable.base <span class=\"hljs-keyword\">instanceof</span> JSXTag\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> JSXElement(\n        tagName: @variable\n        attributes: <span class=\"hljs-keyword\">new</span> JSXAttributes @args[<span class=\"hljs-number\">0</span>].base\n        content: @args[<span class=\"hljs-number\">1</span>]\n      )</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-140\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-140\">&#x00a7;</a>\n              </div>\n              <p><code>@variable</code> never gets output as a result of this node getting created as\npart of <code>RegexWithInterpolations</code>, so for that case move any comments to\nthe <code>args</code> property that gets passed into <code>RegexWithInterpolations</code> via\nthe grammar.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> @variable.base?.value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;RegExp&#x27;</span> <span class=\"hljs-keyword\">and</span> @args.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n      moveComments @variable, @args[<span class=\"hljs-number\">0</span>]\n\n  children: [<span class=\"hljs-string\">&#x27;variable&#x27;</span>, <span class=\"hljs-string\">&#x27;args&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-141\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-141\">&#x00a7;</a>\n              </div>\n              <p>When setting the location, we sometimes need to update the start location to\naccount for a newly-discovered <code>new</code> operator to the left of us. This\nexpands the range on the left, but not the right.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  updateLocationDataIfMissing: <span class=\"hljs-function\"><span class=\"hljs-params\">(locationData)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @locationData <span class=\"hljs-keyword\">and</span> @needsUpdatedStartLocation\n      @locationData = <span class=\"hljs-built_in\">Object</span>.assign {},\n        @locationData,\n        first_line: locationData.first_line\n        first_column: locationData.first_column\n        range: [\n          locationData.range[<span class=\"hljs-number\">0</span>]\n          @locationData.range[<span class=\"hljs-number\">1</span>]\n        ]\n      base = @variable?.base <span class=\"hljs-keyword\">or</span> @variable\n      <span class=\"hljs-keyword\">if</span> base.needsUpdatedStartLocation\n        @variable.locationData = <span class=\"hljs-built_in\">Object</span>.assign {},\n          @variable.locationData,\n          first_line: locationData.first_line\n          first_column: locationData.first_column\n          range: [\n            locationData.range[<span class=\"hljs-number\">0</span>]\n            @variable.locationData.range[<span class=\"hljs-number\">1</span>]\n          ]\n        base.updateLocationDataIfMissing locationData\n      <span class=\"hljs-keyword\">delete</span> @needsUpdatedStartLocation\n    super locationData</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-142\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-142\">&#x00a7;</a>\n              </div>\n              <p>Tag this invocation as creating a new instance.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  newInstance: <span class=\"hljs-function\">-&gt;</span>\n    base = @variable?.base <span class=\"hljs-keyword\">or</span> @variable\n    <span class=\"hljs-keyword\">if</span> base <span class=\"hljs-keyword\">instanceof</span> Call <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> base.isNew\n      base.newInstance()\n    <span class=\"hljs-keyword\">else</span>\n      @isNew = <span class=\"hljs-literal\">true</span>\n    @needsUpdatedStartLocation = <span class=\"hljs-literal\">true</span>\n    this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-143\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-143\">&#x00a7;</a>\n              </div>\n              <p>Soaked chained invocations unfold into if/else ternary structures.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unfoldSoak: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @soak\n      <span class=\"hljs-keyword\">if</span> @variable <span class=\"hljs-keyword\">instanceof</span> Super\n        left = <span class=\"hljs-keyword\">new</span> Literal @variable.compile o\n        rite = <span class=\"hljs-keyword\">new</span> Value left\n        @variable.error <span class=\"hljs-string\">&quot;Unsupported reference to &#x27;super&#x27;&quot;</span> <span class=\"hljs-keyword\">unless</span> @variable.accessor?\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">return</span> ifn <span class=\"hljs-keyword\">if</span> ifn = unfoldSoak o, this, <span class=\"hljs-string\">&#x27;variable&#x27;</span>\n        [left, rite] = <span class=\"hljs-keyword\">new</span> Value(@variable).cacheReference o\n      rite = <span class=\"hljs-keyword\">new</span> Call rite, @args\n      rite.isNew = @isNew\n      left = <span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">&quot;typeof <span class=\"hljs-subst\">#{ left.compile o }</span> === \\&quot;function\\&quot;&quot;</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> If left, <span class=\"hljs-keyword\">new</span> Value(rite), soak: <span class=\"hljs-literal\">yes</span>\n    call = this\n    list = []\n    <span class=\"hljs-keyword\">loop</span>\n      <span class=\"hljs-keyword\">if</span> call.variable <span class=\"hljs-keyword\">instanceof</span> Call\n        list.push call\n        call = call.variable\n        <span class=\"hljs-keyword\">continue</span>\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> call.variable <span class=\"hljs-keyword\">instanceof</span> Value\n      list.push call\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> (call = call.variable.base) <span class=\"hljs-keyword\">instanceof</span> Call\n    <span class=\"hljs-keyword\">for</span> call <span class=\"hljs-keyword\">in</span> list.reverse()\n      <span class=\"hljs-keyword\">if</span> ifn\n        <span class=\"hljs-keyword\">if</span> call.variable <span class=\"hljs-keyword\">instanceof</span> Call\n          call.variable = ifn\n        <span class=\"hljs-keyword\">else</span>\n          call.variable.base = ifn\n      ifn = unfoldSoak o, call, <span class=\"hljs-string\">&#x27;variable&#x27;</span>\n    ifn</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-144\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-144\">&#x00a7;</a>\n              </div>\n              <p>Compile a vanilla function call.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkForNewSuper()\n    @variable?.front = @front\n    compiledArgs = []</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-145\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-145\">&#x00a7;</a>\n              </div>\n              <p>If variable is <code>Accessor</code> fragments are cached and used later\nin <code>Value::compileNode</code> to ensure correct order of the compilation,\nand reuse of variables in the scope.\nExample:\n<code>a(x = 5).b(-&gt; x = 6)</code> should compile in the same order as\n<code>a(x = 5); b(-&gt; x = 6)</code>\n(see issue #4437, <a href=\"https://github.com/jashkenas/coffeescript/issues/4437\">https://github.com/jashkenas/coffeescript/issues/4437</a>)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    varAccess = @variable?.properties?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">instanceof</span> Access\n    argCode = (arg <span class=\"hljs-keyword\">for</span> arg <span class=\"hljs-keyword\">in</span> (@args || []) <span class=\"hljs-keyword\">when</span> arg <span class=\"hljs-keyword\">instanceof</span> Code)\n    <span class=\"hljs-keyword\">if</span> argCode.length &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> varAccess <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @variable.base.cached\n      [cache] = @variable.base.cache o, LEVEL_ACCESS, <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-literal\">no</span>\n      @variable.base.cached = cache\n\n    <span class=\"hljs-keyword\">for</span> arg, argIndex <span class=\"hljs-keyword\">in</span> @args\n      <span class=\"hljs-keyword\">if</span> argIndex <span class=\"hljs-keyword\">then</span> compiledArgs.push @makeCode <span class=\"hljs-string\">&quot;, &quot;</span>\n      compiledArgs.push (arg.compileToFragments o, LEVEL_LIST)...\n\n    fragments = []\n    <span class=\"hljs-keyword\">if</span> @isNew\n      fragments.push @makeCode <span class=\"hljs-string\">&#x27;new &#x27;</span>\n    fragments.push @variable.compileToFragments(o, LEVEL_ACCESS)...\n    fragments.push @makeCode(<span class=\"hljs-string\">&#x27;(&#x27;</span>), compiledArgs..., @makeCode(<span class=\"hljs-string\">&#x27;)&#x27;</span>)\n    fragments\n\n  checkForNewSuper: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isNew\n      @variable.error <span class=\"hljs-string\">&quot;Unsupported reference to &#x27;super&#x27;&quot;</span> <span class=\"hljs-keyword\">if</span> @variable <span class=\"hljs-keyword\">instanceof</span> Super\n\n  containsSoak: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @soak\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @variable?.containsSoak?()\n    <span class=\"hljs-literal\">no</span>\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @soak <span class=\"hljs-keyword\">and</span> @variable <span class=\"hljs-keyword\">instanceof</span> Super <span class=\"hljs-keyword\">and</span> o.scope.namedMethod()?.ctor\n      @variable.error <span class=\"hljs-string\">&quot;Unsupported reference to &#x27;super&#x27;&quot;</span>\n    @checkForNewSuper()\n    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isNew\n      <span class=\"hljs-string\">&#x27;NewExpression&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @containsSoak()\n      <span class=\"hljs-string\">&#x27;OptionalCallExpression&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;CallExpression&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      callee: @variable.ast o, LEVEL_ACCESS\n      arguments: arg.ast(o, LEVEL_LIST) <span class=\"hljs-keyword\">for</span> arg <span class=\"hljs-keyword\">in</span> @args\n      optional: !!@soak\n      implicit: !!@implicit</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-146\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-146\">&#x00a7;</a>\n              </div>\n              <h3 id=\"super\">Super</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-147\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-147\">&#x00a7;</a>\n              </div>\n              <p>Takes care of converting <code>super()</code> calls into calls against the prototype’s\nfunction of the same name.\nWhen <code>expressions</code> are set the call will be compiled in such a way that the\nexpressions are evaluated without altering the return value of the <code>SuperCall</code>\nexpression.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.SuperCall = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">SuperCall</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Call</span></span>\n  children: Call::children.concat [<span class=\"hljs-string\">&#x27;expressions&#x27;</span>]\n\n  isStatement: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @expressions?.length <span class=\"hljs-keyword\">and</span> o.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> super o <span class=\"hljs-keyword\">unless</span> @expressions?.length\n\n    superCall   = <span class=\"hljs-keyword\">new</span> Literal fragmentsToText super o\n    replacement = <span class=\"hljs-keyword\">new</span> Block @expressions.slice()\n\n    <span class=\"hljs-keyword\">if</span> o.level &gt; LEVEL_TOP</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-148\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-148\">&#x00a7;</a>\n              </div>\n              <p>If we might be in an expression we need to cache and return the result</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      [superCall, ref] = superCall.cache o, <span class=\"hljs-literal\">null</span>, YES\n      replacement.push ref\n\n    replacement.unshift superCall\n    replacement.compileToFragments o, <span class=\"hljs-keyword\">if</span> o.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP <span class=\"hljs-keyword\">then</span> o.level <span class=\"hljs-keyword\">else</span> LEVEL_LIST\n\n<span class=\"hljs-built_in\">exports</span>.Super = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Super</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@accessor, @superLiteral)</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;accessor&#x27;</span>]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkInInstanceMethod o\n\n    method = o.scope.namedMethod()\n    <span class=\"hljs-keyword\">unless</span> method.ctor? <span class=\"hljs-keyword\">or</span> @accessor?\n      {name, variable} = method\n      <span class=\"hljs-keyword\">if</span> name.shouldCache() <span class=\"hljs-keyword\">or</span> (name <span class=\"hljs-keyword\">instanceof</span> Index <span class=\"hljs-keyword\">and</span> name.index.isAssignable())\n        nref = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.parent.freeVariable <span class=\"hljs-string\">&#x27;name&#x27;</span>\n        name.index = <span class=\"hljs-keyword\">new</span> Assign nref, name.index\n      @accessor = <span class=\"hljs-keyword\">if</span> nref? <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">new</span> Index nref <span class=\"hljs-keyword\">else</span> name\n\n    <span class=\"hljs-keyword\">if</span> @accessor?.name?.comments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-149\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-149\">&#x00a7;</a>\n              </div>\n              <p>A <code>super()</code> call gets compiled to e.g. <code>super.method()</code>, which means\nthe <code>method</code> property name gets compiled for the first time here, and\nagain when the <code>method:</code> property of the class gets compiled. Since\nthis compilation happens first, comments attached to <code>method:</code> would\nget incorrectly output near <code>super.method()</code>, when we want them to\nget output on the second pass when <code>method:</code> is output. So set them\naside during this compilation pass, and put them back on the object so\nthat they’re there for the later compilation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      salvagedComments = @accessor.name.comments\n      <span class=\"hljs-keyword\">delete</span> @accessor.name.comments\n    fragments = (<span class=\"hljs-keyword\">new</span> Value (<span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">&#x27;super&#x27;</span>), <span class=\"hljs-keyword\">if</span> @accessor <span class=\"hljs-keyword\">then</span> [ @accessor ] <span class=\"hljs-keyword\">else</span> [])\n    .compileToFragments o\n    attachCommentsToNode salvagedComments, @accessor.name <span class=\"hljs-keyword\">if</span> salvagedComments\n    fragments\n\n  checkInInstanceMethod: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    method = o.scope.namedMethod()\n    @error <span class=\"hljs-string\">&#x27;cannot use super outside of an instance method&#x27;</span> <span class=\"hljs-keyword\">unless</span> method?.isMethod\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkInInstanceMethod o\n\n    <span class=\"hljs-keyword\">if</span> @accessor?\n      <span class=\"hljs-keyword\">return</span> (\n        <span class=\"hljs-keyword\">new</span> Value(\n          <span class=\"hljs-keyword\">new</span> Super().withLocationDataFrom (@superLiteral ? @)\n          [@accessor]\n        ).withLocationDataFrom @\n      ).ast o\n\n    super o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-150\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-150\">&#x00a7;</a>\n              </div>\n              <h3 id=\"regexwithinterpolations\">RegexWithInterpolations</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-151\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-151\">&#x00a7;</a>\n              </div>\n              <p>Regexes with interpolations are in fact just a variation of a <code>Call</code> (a\n<code>RegExp()</code> call to be precise) with a <code>StringWithInterpolations</code> inside.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.RegexWithInterpolations = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">RegexWithInterpolations</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@call, {@heregexCommentTokens = []} = {})</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;call&#x27;</span>]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @call.compileNode o\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;InterpolatedRegExpLiteral&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    interpolatedPattern: @call.args[<span class=\"hljs-number\">0</span>].ast o\n    flags: @call.args[<span class=\"hljs-number\">1</span>]?.unwrap().originalValue ? <span class=\"hljs-string\">&#x27;&#x27;</span>\n    comments:\n      <span class=\"hljs-keyword\">for</span> heregexCommentToken <span class=\"hljs-keyword\">in</span> @heregexCommentTokens\n        <span class=\"hljs-keyword\">if</span> heregexCommentToken.here\n          <span class=\"hljs-keyword\">new</span> HereComment(heregexCommentToken).ast o\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-keyword\">new</span> LineComment(heregexCommentToken).ast o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-152\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-152\">&#x00a7;</a>\n              </div>\n              <h3 id=\"taggedtemplatecall\">TaggedTemplateCall</h3>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n<span class=\"hljs-built_in\">exports</span>.TaggedTemplateCall = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">TaggedTemplateCall</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Call</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(variable, arg, soak)</span> -&gt;</span>\n    arg = StringWithInterpolations.fromStringLiteral arg <span class=\"hljs-keyword\">if</span> arg <span class=\"hljs-keyword\">instanceof</span> StringLiteral\n    super variable, [ arg ], soak\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @variable.compileToFragments(o, LEVEL_ACCESS).concat @args[<span class=\"hljs-number\">0</span>].compileToFragments(o, LEVEL_LIST)\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;TaggedTemplateExpression&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      tag: @variable.ast o, LEVEL_ACCESS\n      quasi: @args[<span class=\"hljs-number\">0</span>].ast o, LEVEL_LIST</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-153\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-153\">&#x00a7;</a>\n              </div>\n              <h3 id=\"extends\">Extends</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-154\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-154\">&#x00a7;</a>\n              </div>\n              <p>Node to extend an object’s prototype with an ancestor object.\nAfter <code>goog.inherits</code> from the\n<a href=\"https://github.com/google/closure-library/blob/master/closure/goog/base.js\">Closure Library</a>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Extends = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Extends</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@child, @parent)</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;child&#x27;</span>, <span class=\"hljs-string\">&#x27;parent&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-155\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-155\">&#x00a7;</a>\n              </div>\n              <p>Hooks one constructor into another’s prototype chain.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">new</span> Call(<span class=\"hljs-keyword\">new</span> Value(<span class=\"hljs-keyword\">new</span> Literal utility <span class=\"hljs-string\">&#x27;extend&#x27;</span>, o), [@child, @parent]).compileToFragments o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-156\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-156\">&#x00a7;</a>\n              </div>\n              <h3 id=\"access\">Access</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-157\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-157\">&#x00a7;</a>\n              </div>\n              <p>A <code>.</code> access into a property of a value, or the <code>::</code> shorthand for\nan access into the object’s prototype.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Access = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Access</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@name, {@soak, @shorthand} = {})</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;name&#x27;</span>]\n\n  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    name = @name.compileToFragments o\n    node = @name.unwrap()\n    <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> PropertyName\n      [@makeCode(<span class=\"hljs-string\">&#x27;.&#x27;</span>), name...]\n    <span class=\"hljs-keyword\">else</span>\n      [@makeCode(<span class=\"hljs-string\">&#x27;[&#x27;</span>), name..., @makeCode(<span class=\"hljs-string\">&#x27;]&#x27;</span>)]\n\n  shouldCache: NO\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-158\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-158\">&#x00a7;</a>\n              </div>\n              <p>Babel doesn’t have an AST node for <code>Access</code>, but rather just includes\nthis Access node’s child <code>name</code> Identifier node as the <code>property</code> of\nthe <code>MemberExpression</code> node.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @name.ast o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-159\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-159\">&#x00a7;</a>\n              </div>\n              <h3 id=\"index\">Index</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-160\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-160\">&#x00a7;</a>\n              </div>\n              <p>A <code>[ ... ]</code> indexed access into an array or object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Index = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Index</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@index)</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;index&#x27;</span>]\n\n  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [].concat @makeCode(<span class=\"hljs-string\">&quot;[&quot;</span>), @index.compileToFragments(o, LEVEL_PAREN), @makeCode(<span class=\"hljs-string\">&quot;]&quot;</span>)\n\n  shouldCache: <span class=\"hljs-function\">-&gt;</span>\n    @index.shouldCache()\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-161\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-161\">&#x00a7;</a>\n              </div>\n              <p>Babel doesn’t have an AST node for <code>Index</code>, but rather just includes\nthis Index node’s child <code>index</code> Identifier node as the <code>property</code> of\nthe <code>MemberExpression</code> node. The fact that the <code>MemberExpression</code>’s\n<code>property</code> is an Index means that <code>computed</code> is <code>true</code> for the\n<code>MemberExpression</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @index.ast o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-162\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-162\">&#x00a7;</a>\n              </div>\n              <h3 id=\"range\">Range</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-163\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-163\">&#x00a7;</a>\n              </div>\n              <p>A range literal. Ranges can be used to extract portions (slices) of arrays,\nto specify a range for comprehensions, or as a value, to be expanded into the\ncorresponding array of integers at runtime.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Range = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Range</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n\n  children: [<span class=\"hljs-string\">&#x27;from&#x27;</span>, <span class=\"hljs-string\">&#x27;to&#x27;</span>]\n\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@from, @to, tag)</span> -&gt;</span>\n    super()\n\n    @exclusive = tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;exclusive&#x27;</span>\n    @equals = <span class=\"hljs-keyword\">if</span> @exclusive <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;=&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-164\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-164\">&#x00a7;</a>\n              </div>\n              <p>Compiles the range’s source variables – where it starts and where it ends.\nBut only if they need to be cached to avoid double evaluation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileVariables: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o = merge o, top: <span class=\"hljs-literal\">true</span>\n    shouldCache = del o, <span class=\"hljs-string\">&#x27;shouldCache&#x27;</span>\n    [@fromC, @fromVar] = @cacheToCodeFragments @from.cache o, LEVEL_LIST, shouldCache\n    [@toC, @toVar]     = @cacheToCodeFragments @to.cache o, LEVEL_LIST, shouldCache\n    [@step, @stepVar]  = @cacheToCodeFragments step.cache o, LEVEL_LIST, shouldCache <span class=\"hljs-keyword\">if</span> step = del o, <span class=\"hljs-string\">&#x27;step&#x27;</span>\n    @fromNum = <span class=\"hljs-keyword\">if</span> @from.isNumber() <span class=\"hljs-keyword\">then</span> parseNumber @fromVar <span class=\"hljs-keyword\">else</span> <span class=\"hljs-literal\">null</span>\n    @toNum   = <span class=\"hljs-keyword\">if</span> @to.isNumber()   <span class=\"hljs-keyword\">then</span> parseNumber @toVar   <span class=\"hljs-keyword\">else</span> <span class=\"hljs-literal\">null</span>\n    @stepNum = <span class=\"hljs-keyword\">if</span> step?.isNumber() <span class=\"hljs-keyword\">then</span> parseNumber @stepVar <span class=\"hljs-keyword\">else</span> <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-165\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-165\">&#x00a7;</a>\n              </div>\n              <p>When compiled normally, the range returns the contents of the <em>for loop</em>\nneeded to iterate over the values in the range. Used by comprehensions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @compileVariables o <span class=\"hljs-keyword\">unless</span> @fromVar\n    <span class=\"hljs-keyword\">return</span> @compileArray(o) <span class=\"hljs-keyword\">unless</span> o.index</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-166\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-166\">&#x00a7;</a>\n              </div>\n              <p>Set up endpoints.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    known    = @fromNum? <span class=\"hljs-keyword\">and</span> @toNum?\n    idx      = del o, <span class=\"hljs-string\">&#x27;index&#x27;</span>\n    idxName  = del o, <span class=\"hljs-string\">&#x27;name&#x27;</span>\n    namedIndex = idxName <span class=\"hljs-keyword\">and</span> idxName <span class=\"hljs-keyword\">isnt</span> idx\n    varPart  =\n      <span class=\"hljs-keyword\">if</span> known <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> namedIndex\n        <span class=\"hljs-string\">&quot;var <span class=\"hljs-subst\">#{idx}</span> = <span class=\"hljs-subst\">#{@fromC}</span>&quot;</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{idx}</span> = <span class=\"hljs-subst\">#{@fromC}</span>&quot;</span>\n    varPart += <span class=\"hljs-string\">&quot;, <span class=\"hljs-subst\">#{@toC}</span>&quot;</span> <span class=\"hljs-keyword\">if</span> @toC <span class=\"hljs-keyword\">isnt</span> @toVar\n    varPart += <span class=\"hljs-string\">&quot;, <span class=\"hljs-subst\">#{@step}</span>&quot;</span> <span class=\"hljs-keyword\">if</span> @step <span class=\"hljs-keyword\">isnt</span> @stepVar\n    [lt, gt] = [<span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{idx}</span> &lt;<span class=\"hljs-subst\">#{@equals}</span>&quot;</span>, <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{idx}</span> &gt;<span class=\"hljs-subst\">#{@equals}</span>&quot;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-167\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-167\">&#x00a7;</a>\n              </div>\n              <p>Generate the condition.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    [<span class=\"hljs-keyword\">from</span>, to] = [@fromNum, @toNum]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-168\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-168\">&#x00a7;</a>\n              </div>\n              <p>Always check if the <code>step</code> isn’t zero to avoid the infinite loop.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    stepNotZero = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{ @stepNum ? @stepVar }</span> !== 0&quot;</span>\n    stepCond = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{ @stepNum ? @stepVar }</span> &gt; 0&quot;</span>\n    lowerBound = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{lt}</span> <span class=\"hljs-subst\">#{ <span class=\"hljs-keyword\">if</span> known <span class=\"hljs-keyword\">then</span> to <span class=\"hljs-keyword\">else</span> @toVar }</span>&quot;</span>\n    upperBound = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{gt}</span> <span class=\"hljs-subst\">#{ <span class=\"hljs-keyword\">if</span> known <span class=\"hljs-keyword\">then</span> to <span class=\"hljs-keyword\">else</span> @toVar }</span>&quot;</span>\n    condPart =\n      <span class=\"hljs-keyword\">if</span> @step?\n        <span class=\"hljs-keyword\">if</span> @stepNum? <span class=\"hljs-keyword\">and</span> @stepNum <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n          <span class=\"hljs-keyword\">if</span> @stepNum &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{lowerBound}</span>&quot;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{upperBound}</span>&quot;</span>\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{stepNotZero}</span> &amp;&amp; (<span class=\"hljs-subst\">#{stepCond}</span> ? <span class=\"hljs-subst\">#{lowerBound}</span> : <span class=\"hljs-subst\">#{upperBound}</span>)&quot;</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">if</span> known\n          <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{ <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">from</span> &lt;= to <span class=\"hljs-keyword\">then</span> lt <span class=\"hljs-keyword\">else</span> gt }</span> <span class=\"hljs-subst\">#{to}</span>&quot;</span>\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-string\">&quot;(<span class=\"hljs-subst\">#{@fromVar}</span> &lt;= <span class=\"hljs-subst\">#{@toVar}</span> ? <span class=\"hljs-subst\">#{lowerBound}</span> : <span class=\"hljs-subst\">#{upperBound}</span>)&quot;</span>\n\n    cond = <span class=\"hljs-keyword\">if</span> @stepVar <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@stepVar}</span> &gt; 0&quot;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@fromVar}</span> &lt;= <span class=\"hljs-subst\">#{@toVar}</span>&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-169\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-169\">&#x00a7;</a>\n              </div>\n              <p>Generate the step.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    stepPart = <span class=\"hljs-keyword\">if</span> @stepVar\n      <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{idx}</span> += <span class=\"hljs-subst\">#{@stepVar}</span>&quot;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> known\n      <span class=\"hljs-keyword\">if</span> namedIndex\n        <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">from</span> &lt;= to <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;++<span class=\"hljs-subst\">#{idx}</span>&quot;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&quot;--<span class=\"hljs-subst\">#{idx}</span>&quot;</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">from</span> &lt;= to <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{idx}</span>++&quot;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{idx}</span>--&quot;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">if</span> namedIndex\n        <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{cond}</span> ? ++<span class=\"hljs-subst\">#{idx}</span> : --<span class=\"hljs-subst\">#{idx}</span>&quot;</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{cond}</span> ? <span class=\"hljs-subst\">#{idx}</span>++ : <span class=\"hljs-subst\">#{idx}</span>--&quot;</span>\n\n    varPart  = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{idxName}</span> = <span class=\"hljs-subst\">#{varPart}</span>&quot;</span> <span class=\"hljs-keyword\">if</span> namedIndex\n    stepPart = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{idxName}</span> = <span class=\"hljs-subst\">#{stepPart}</span>&quot;</span> <span class=\"hljs-keyword\">if</span> namedIndex</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-170\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-170\">&#x00a7;</a>\n              </div>\n              <p>The final loop body.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    [@makeCode <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{varPart}</span>; <span class=\"hljs-subst\">#{condPart}</span>; <span class=\"hljs-subst\">#{stepPart}</span>&quot;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-171\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-171\">&#x00a7;</a>\n              </div>\n              <p>When used as a value, expand the range into the equivalent array.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileArray: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    known = @fromNum? <span class=\"hljs-keyword\">and</span> @toNum?\n    <span class=\"hljs-keyword\">if</span> known <span class=\"hljs-keyword\">and</span> <span class=\"hljs-built_in\">Math</span>.abs(@fromNum - @toNum) &lt;= <span class=\"hljs-number\">20</span>\n      range = [@fromNum..@toNum]\n      range.pop() <span class=\"hljs-keyword\">if</span> @exclusive\n      <span class=\"hljs-keyword\">return</span> [@makeCode <span class=\"hljs-string\">&quot;[<span class=\"hljs-subst\">#{ range.join(<span class=\"hljs-string\">&#x27;, &#x27;</span>) }</span>]&quot;</span>]\n    idt    = @tab + TAB\n    i      = o.scope.freeVariable <span class=\"hljs-string\">&#x27;i&#x27;</span>, single: <span class=\"hljs-literal\">true</span>, reserve: <span class=\"hljs-literal\">no</span>\n    result = o.scope.freeVariable <span class=\"hljs-string\">&#x27;results&#x27;</span>, reserve: <span class=\"hljs-literal\">no</span>\n    pre    = <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{idt}</span>var <span class=\"hljs-subst\">#{result}</span> = [];&quot;</span>\n    <span class=\"hljs-keyword\">if</span> known\n      o.index = i\n      body    = fragmentsToText @compileNode o\n    <span class=\"hljs-keyword\">else</span>\n      vars    = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{i}</span> = <span class=\"hljs-subst\">#{@fromC}</span>&quot;</span> + <span class=\"hljs-keyword\">if</span> @toC <span class=\"hljs-keyword\">isnt</span> @toVar <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;, <span class=\"hljs-subst\">#{@toC}</span>&quot;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n      cond    = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@fromVar}</span> &lt;= <span class=\"hljs-subst\">#{@toVar}</span>&quot;</span>\n      body    = <span class=\"hljs-string\">&quot;var <span class=\"hljs-subst\">#{vars}</span>; <span class=\"hljs-subst\">#{cond}</span> ? <span class=\"hljs-subst\">#{i}</span> &lt;<span class=\"hljs-subst\">#{@equals}</span> <span class=\"hljs-subst\">#{@toVar}</span> : <span class=\"hljs-subst\">#{i}</span> &gt;<span class=\"hljs-subst\">#{@equals}</span> <span class=\"hljs-subst\">#{@toVar}</span>; <span class=\"hljs-subst\">#{cond}</span> ? <span class=\"hljs-subst\">#{i}</span>++ : <span class=\"hljs-subst\">#{i}</span>--&quot;</span>\n    post   = <span class=\"hljs-string\">&quot;{ <span class=\"hljs-subst\">#{result}</span>.push(<span class=\"hljs-subst\">#{i}</span>); }\\n<span class=\"hljs-subst\">#{idt}</span>return <span class=\"hljs-subst\">#{result}</span>;\\n<span class=\"hljs-subst\">#{o.indent}</span>&quot;</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">hasArgs</span> = <span class=\"hljs-params\">(node)</span> -&gt;</span> node?.contains isLiteralArguments\n    args   = <span class=\"hljs-string\">&#x27;, arguments&#x27;</span> <span class=\"hljs-keyword\">if</span> hasArgs(@from) <span class=\"hljs-keyword\">or</span> hasArgs(@to)\n    [@makeCode <span class=\"hljs-string\">&quot;(function() {<span class=\"hljs-subst\">#{pre}</span>\\n<span class=\"hljs-subst\">#{idt}</span>for (<span class=\"hljs-subst\">#{body}</span>)<span class=\"hljs-subst\">#{post}</span>}).apply(this<span class=\"hljs-subst\">#{args ? <span class=\"hljs-string\">&#x27;&#x27;</span>}</span>)&quot;</span>]\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> {\n      from: @from?.ast(o) ? <span class=\"hljs-literal\">null</span>\n      to: @to?.ast(o) ? <span class=\"hljs-literal\">null</span>\n      @exclusive\n    }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-172\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-172\">&#x00a7;</a>\n              </div>\n              <h3 id=\"slice\">Slice</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-173\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-173\">&#x00a7;</a>\n              </div>\n              <p>An array slice literal. Unlike JavaScript’s <code>Array#slice</code>, the second parameter\nspecifies the index of the end of the slice, just as the first parameter\nis the index of the beginning.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Slice = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Slice</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n\n  children: [<span class=\"hljs-string\">&#x27;range&#x27;</span>]\n\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@range)</span> -&gt;</span>\n    super()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-174\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-174\">&#x00a7;</a>\n              </div>\n              <p>We have to be careful when trying to slice through the end of the array,\n<code>9e9</code> is used because not all implementations respect <code>undefined</code> or <code>1/0</code>.\n<code>9e9</code> should be safe because <code>9e9</code> &gt; <code>2**32</code>, the max array length.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    {to, <span class=\"hljs-keyword\">from</span>} = @range</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-175\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-175\">&#x00a7;</a>\n              </div>\n              <p>Handle an expression in the property access, e.g. <code>a[!b in c..]</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">from</span>?.shouldCache()\n      <span class=\"hljs-keyword\">from</span> = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Parens <span class=\"hljs-keyword\">from</span>\n    <span class=\"hljs-keyword\">if</span> to?.shouldCache()\n      to = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Parens to\n    fromCompiled = <span class=\"hljs-keyword\">from</span>?.compileToFragments(o, LEVEL_PAREN) <span class=\"hljs-keyword\">or</span> [@makeCode <span class=\"hljs-string\">&#x27;0&#x27;</span>]\n    <span class=\"hljs-keyword\">if</span> to\n      compiled     = to.compileToFragments o, LEVEL_PAREN\n      compiledText = fragmentsToText compiled\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> (<span class=\"hljs-keyword\">not</span> @range.exclusive <span class=\"hljs-keyword\">and</span> +compiledText <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">-1</span>)\n        toStr = <span class=\"hljs-string\">&#x27;, &#x27;</span> + <span class=\"hljs-keyword\">if</span> @range.exclusive\n          compiledText\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> to.isNumber()\n          <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{+compiledText + <span class=\"hljs-number\">1</span>}</span>&quot;</span>\n        <span class=\"hljs-keyword\">else</span>\n          compiled = to.compileToFragments o, LEVEL_ACCESS\n          <span class=\"hljs-string\">&quot;+<span class=\"hljs-subst\">#{fragmentsToText compiled}</span> + 1 || 9e9&quot;</span>\n    [@makeCode <span class=\"hljs-string\">&quot;.slice(<span class=\"hljs-subst\">#{ fragmentsToText fromCompiled }</span><span class=\"hljs-subst\">#{ toStr <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&#x27;&#x27;</span> }</span>)&quot;</span>]\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @range.ast o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-176\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-176\">&#x00a7;</a>\n              </div>\n              <h3 id=\"obj\">Obj</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-177\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-177\">&#x00a7;</a>\n              </div>\n              <p>An object literal, nothing fancy.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Obj = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Obj</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(props, @generated = <span class=\"hljs-literal\">no</span>)</span> -&gt;</span>\n    super()\n\n    @objects = @properties = props <span class=\"hljs-keyword\">or</span> []\n\n  children: [<span class=\"hljs-string\">&#x27;properties&#x27;</span>]\n\n  isAssignable: <span class=\"hljs-function\"><span class=\"hljs-params\">(opts)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> prop <span class=\"hljs-keyword\">in</span> @properties</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-178\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-178\">&#x00a7;</a>\n              </div>\n              <p>Check for reserved words.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      message = isUnassignable prop.unwrapAll().value\n      prop.error message <span class=\"hljs-keyword\">if</span> message\n\n      prop = prop.value <span class=\"hljs-keyword\">if</span> prop <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span>\n        prop.context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span> <span class=\"hljs-keyword\">and</span>\n        prop.value?.base <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Arr\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> prop.isAssignable opts\n    <span class=\"hljs-literal\">yes</span>\n\n  shouldCache: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">not</span> @isAssignable()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-179\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-179\">&#x00a7;</a>\n              </div>\n              <p>Check if object contains splat.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  hasSplat: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">for</span> prop <span class=\"hljs-keyword\">in</span> @properties <span class=\"hljs-keyword\">when</span> prop <span class=\"hljs-keyword\">instanceof</span> Splat\n    <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-180\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-180\">&#x00a7;</a>\n              </div>\n              <p>Move rest property to the end of the list.\n<code>{a, rest..., b} = obj</code> -&gt; <code>{a, b, rest...} = obj</code>\n<code>foo = ({a, rest..., b}) -&gt;</code> -&gt; <code>foo = {a, b, rest...}) -&gt;</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  reorderProperties: <span class=\"hljs-function\">-&gt;</span>\n    props = @properties\n    splatProps = @getAndCheckSplatProps()\n    splatProp = props.splice splatProps[<span class=\"hljs-number\">0</span>], <span class=\"hljs-number\">1</span>\n    @objects = @properties = [].concat props, splatProp\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @reorderProperties() <span class=\"hljs-keyword\">if</span> @hasSplat() <span class=\"hljs-keyword\">and</span> @lhs\n    props = @properties\n    <span class=\"hljs-keyword\">if</span> @generated\n      <span class=\"hljs-keyword\">for</span> node <span class=\"hljs-keyword\">in</span> props <span class=\"hljs-keyword\">when</span> node <span class=\"hljs-keyword\">instanceof</span> Value\n        node.error <span class=\"hljs-string\">&#x27;cannot have an implicit value in an implicit object&#x27;</span>\n\n    idt      = o.indent += TAB\n    lastNode = @lastNode @properties</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-181\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-181\">&#x00a7;</a>\n              </div>\n              <p>If this object is the left-hand side of an assignment, all its children\nare too.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @propagateLhs()\n\n    isCompact = <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-keyword\">for</span> prop <span class=\"hljs-keyword\">in</span> @properties\n      <span class=\"hljs-keyword\">if</span> prop <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> prop.context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span>\n        isCompact = <span class=\"hljs-literal\">no</span>\n\n    answer = []\n    answer.push @makeCode <span class=\"hljs-keyword\">if</span> isCompact <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n    <span class=\"hljs-keyword\">for</span> prop, i <span class=\"hljs-keyword\">in</span> props\n      join = <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">is</span> props.length - <span class=\"hljs-number\">1</span>\n        <span class=\"hljs-string\">&#x27;&#x27;</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> isCompact\n        <span class=\"hljs-string\">&#x27;, &#x27;</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prop <span class=\"hljs-keyword\">is</span> lastNode\n        <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">&#x27;,\\n&#x27;</span>\n      indent = <span class=\"hljs-keyword\">if</span> isCompact <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">else</span> idt\n\n      key = <span class=\"hljs-keyword\">if</span> prop <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> prop.context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span>\n        prop.variable\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prop <span class=\"hljs-keyword\">instanceof</span> Assign\n        prop.operatorToken.error <span class=\"hljs-string\">&quot;unexpected <span class=\"hljs-subst\">#{prop.operatorToken.value}</span>&quot;</span> <span class=\"hljs-keyword\">unless</span> @lhs\n        prop.variable\n      <span class=\"hljs-keyword\">else</span>\n        prop\n      <span class=\"hljs-keyword\">if</span> key <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> key.hasProperties()\n        key.error <span class=\"hljs-string\">&#x27;invalid object key&#x27;</span> <span class=\"hljs-keyword\">if</span> prop.context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span> <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> key.this\n        key  = key.properties[<span class=\"hljs-number\">0</span>].name\n        prop = <span class=\"hljs-keyword\">new</span> Assign key, prop, <span class=\"hljs-string\">&#x27;object&#x27;</span>\n      <span class=\"hljs-keyword\">if</span> key <span class=\"hljs-keyword\">is</span> prop\n        <span class=\"hljs-keyword\">if</span> prop.shouldCache()\n          [key, value] = prop.base.cache o\n          key  = <span class=\"hljs-keyword\">new</span> PropertyName key.value <span class=\"hljs-keyword\">if</span> key <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral\n          prop = <span class=\"hljs-keyword\">new</span> Assign key, value, <span class=\"hljs-string\">&#x27;object&#x27;</span>\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> key <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> key.base <span class=\"hljs-keyword\">instanceof</span> ComputedPropertyName</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-182\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-182\">&#x00a7;</a>\n              </div>\n              <p><code>{ [foo()] }</code> output as <code>{ [ref = foo()]: ref }</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">if</span> prop.base.value.shouldCache()\n            [key, value] = prop.base.value.cache o\n            key  = <span class=\"hljs-keyword\">new</span> ComputedPropertyName key.value <span class=\"hljs-keyword\">if</span> key <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral\n            prop = <span class=\"hljs-keyword\">new</span> Assign key, value, <span class=\"hljs-string\">&#x27;object&#x27;</span>\n          <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-183\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-183\">&#x00a7;</a>\n              </div>\n              <p><code>{ [expression] }</code> output as <code>{ [expression]: expression }</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>            prop = <span class=\"hljs-keyword\">new</span> Assign key, prop.base.value, <span class=\"hljs-string\">&#x27;object&#x27;</span>\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> prop.bareLiteral?(IdentifierLiteral) <span class=\"hljs-keyword\">and</span> prop <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Splat\n          prop = <span class=\"hljs-keyword\">new</span> Assign prop, prop, <span class=\"hljs-string\">&#x27;object&#x27;</span>\n      <span class=\"hljs-keyword\">if</span> indent <span class=\"hljs-keyword\">then</span> answer.push @makeCode indent\n      answer.push prop.compileToFragments(o, LEVEL_TOP)...\n      <span class=\"hljs-keyword\">if</span> join <span class=\"hljs-keyword\">then</span> answer.push @makeCode join\n    answer.push @makeCode <span class=\"hljs-keyword\">if</span> isCompact <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{@tab}</span>&quot;</span>\n    answer = @wrapInBraces answer\n    <span class=\"hljs-keyword\">if</span> @front <span class=\"hljs-keyword\">then</span> @wrapInParentheses answer <span class=\"hljs-keyword\">else</span> answer\n\n  getAndCheckSplatProps: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> @hasSplat() <span class=\"hljs-keyword\">and</span> @lhs\n    props = @properties\n    splatProps = (i <span class=\"hljs-keyword\">for</span> prop, i <span class=\"hljs-keyword\">in</span> props <span class=\"hljs-keyword\">when</span> prop <span class=\"hljs-keyword\">instanceof</span> Splat)\n    props[splatProps[<span class=\"hljs-number\">1</span>]].error <span class=\"hljs-string\">&quot;multiple spread elements are disallowed&quot;</span> <span class=\"hljs-keyword\">if</span> splatProps?.length &gt; <span class=\"hljs-number\">1</span>\n    splatProps\n\n  assigns: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> prop <span class=\"hljs-keyword\">in</span> @properties <span class=\"hljs-keyword\">when</span> prop.assigns name <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-literal\">no</span>\n\n  eachName: <span class=\"hljs-function\"><span class=\"hljs-params\">(iterator)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> prop <span class=\"hljs-keyword\">in</span> @properties\n      prop = prop.value <span class=\"hljs-keyword\">if</span> prop <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> prop.context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span>\n      prop = prop.unwrapAll()\n      prop.eachName iterator <span class=\"hljs-keyword\">if</span> prop.eachName?</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-184\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-184\">&#x00a7;</a>\n              </div>\n              <p>Convert “bare” properties to <code>ObjectProperty</code>s (or <code>Splat</code>s).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  expandProperty: <span class=\"hljs-function\"><span class=\"hljs-params\">(property)</span> -&gt;</span>\n    {variable, context, operatorToken} = property\n    key = <span class=\"hljs-keyword\">if</span> property <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span>\n      variable\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> property <span class=\"hljs-keyword\">instanceof</span> Assign\n      operatorToken.error <span class=\"hljs-string\">&quot;unexpected <span class=\"hljs-subst\">#{operatorToken.value}</span>&quot;</span> <span class=\"hljs-keyword\">unless</span> @lhs\n      variable\n    <span class=\"hljs-keyword\">else</span>\n      property\n    <span class=\"hljs-keyword\">if</span> key <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> key.hasProperties()\n      key.error <span class=\"hljs-string\">&#x27;invalid object key&#x27;</span> <span class=\"hljs-keyword\">unless</span> context <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;object&#x27;</span> <span class=\"hljs-keyword\">and</span> key.this\n      <span class=\"hljs-keyword\">if</span> property <span class=\"hljs-keyword\">instanceof</span> Assign\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> ObjectProperty fromAssign: property\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> ObjectProperty key: property\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> ObjectProperty(fromAssign: property) <span class=\"hljs-keyword\">unless</span> key <span class=\"hljs-keyword\">is</span> property\n    <span class=\"hljs-keyword\">return</span> property <span class=\"hljs-keyword\">if</span> property <span class=\"hljs-keyword\">instanceof</span> Splat\n\n    <span class=\"hljs-keyword\">new</span> ObjectProperty key: property\n\n  expandProperties: <span class=\"hljs-function\">-&gt;</span>\n    @expandProperty(property) <span class=\"hljs-keyword\">for</span> property <span class=\"hljs-keyword\">in</span> @properties\n\n  propagateLhs: <span class=\"hljs-function\"><span class=\"hljs-params\">(setLhs)</span> -&gt;</span>\n    @lhs = <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> setLhs\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> @lhs\n\n    <span class=\"hljs-keyword\">for</span> property <span class=\"hljs-keyword\">in</span> @properties\n      <span class=\"hljs-keyword\">if</span> property <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> property.context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span>\n        {value} = property\n        unwrappedValue = value.unwrapAll()\n        <span class=\"hljs-keyword\">if</span> unwrappedValue <span class=\"hljs-keyword\">instanceof</span> Arr <span class=\"hljs-keyword\">or</span> unwrappedValue <span class=\"hljs-keyword\">instanceof</span> Obj\n          unwrappedValue.propagateLhs <span class=\"hljs-literal\">yes</span>\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> unwrappedValue <span class=\"hljs-keyword\">instanceof</span> Assign\n          unwrappedValue.nestedLhs = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> property <span class=\"hljs-keyword\">instanceof</span> Assign</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-185\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-185\">&#x00a7;</a>\n              </div>\n              <p>Shorthand property with default, e.g. <code>{a = 1} = b</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        property.nestedLhs = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> property <span class=\"hljs-keyword\">instanceof</span> Splat\n        property.propagateLhs <span class=\"hljs-literal\">yes</span>\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @getAndCheckSplatProps()\n    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @lhs\n      <span class=\"hljs-string\">&#x27;ObjectPattern&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;ObjectExpression&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      implicit: !!@generated\n      properties:\n        property.ast(o) <span class=\"hljs-keyword\">for</span> property <span class=\"hljs-keyword\">in</span> @expandProperties()\n\n<span class=\"hljs-built_in\">exports</span>.ObjectProperty = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ObjectProperty</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">({key, fromAssign})</span> -&gt;</span>\n    super()\n    <span class=\"hljs-keyword\">if</span> fromAssign\n      {variable: @key, value, context} = fromAssign\n      <span class=\"hljs-keyword\">if</span> context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-186\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-186\">&#x00a7;</a>\n              </div>\n              <p>All non-shorthand properties (i.e. includes <code>:</code>).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        @value = value\n      <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-187\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-187\">&#x00a7;</a>\n              </div>\n              <p>Left-hand-side shorthand with default e.g. <code>{a = 1} = b</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        @value = fromAssign\n        @shorthand = <span class=\"hljs-literal\">yes</span>\n      @locationData = fromAssign.locationData\n    <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-188\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-188\">&#x00a7;</a>\n              </div>\n              <p>Shorthand without default e.g. <code>{a}</code> or <code>{@a}</code> or <code>{[a]}</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      @key = key\n      @shorthand = <span class=\"hljs-literal\">yes</span>\n      @locationData = key.locationData\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    isComputedPropertyName = (@key <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> @key.base <span class=\"hljs-keyword\">instanceof</span> ComputedPropertyName) <span class=\"hljs-keyword\">or</span> @key.unwrap() <span class=\"hljs-keyword\">instanceof</span> StringWithInterpolations\n    keyAst = @key.ast o, LEVEL_LIST\n\n    <span class=\"hljs-keyword\">return</span>\n      key:\n        <span class=\"hljs-keyword\">if</span> keyAst?.declaration\n          <span class=\"hljs-built_in\">Object</span>.assign {}, keyAst, declaration: <span class=\"hljs-literal\">no</span>\n        <span class=\"hljs-keyword\">else</span>\n          keyAst\n      value: @value?.ast(o, LEVEL_LIST) ? keyAst\n      shorthand: !!@shorthand\n      computed: !!isComputedPropertyName\n      method: <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-189\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-189\">&#x00a7;</a>\n              </div>\n              <h3 id=\"arr\">Arr</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-190\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-190\">&#x00a7;</a>\n              </div>\n              <p>An array literal.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Arr = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Arr</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(objs, @lhs = <span class=\"hljs-literal\">no</span>)</span> -&gt;</span>\n    super()\n    @objects = objs <span class=\"hljs-keyword\">or</span> []\n    @propagateLhs()\n\n  children: [<span class=\"hljs-string\">&#x27;objects&#x27;</span>]\n\n  hasElision: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">for</span> obj <span class=\"hljs-keyword\">in</span> @objects <span class=\"hljs-keyword\">when</span> obj <span class=\"hljs-keyword\">instanceof</span> Elision\n    <span class=\"hljs-literal\">no</span>\n\n  isAssignable: <span class=\"hljs-function\"><span class=\"hljs-params\">(opts)</span> -&gt;</span>\n    {allowExpansion, allowNontrailingSplat, allowEmptyArray = <span class=\"hljs-literal\">no</span>} = opts ? {}\n    <span class=\"hljs-keyword\">return</span> allowEmptyArray <span class=\"hljs-keyword\">unless</span> @objects.length\n\n    <span class=\"hljs-keyword\">for</span> obj, i <span class=\"hljs-keyword\">in</span> @objects\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> allowNontrailingSplat <span class=\"hljs-keyword\">and</span> obj <span class=\"hljs-keyword\">instanceof</span> Splat <span class=\"hljs-keyword\">and</span> i + <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">isnt</span> @objects.length\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> (allowExpansion <span class=\"hljs-keyword\">and</span> obj <span class=\"hljs-keyword\">instanceof</span> Expansion) <span class=\"hljs-keyword\">or</span> (obj.isAssignable(opts) <span class=\"hljs-keyword\">and</span> (<span class=\"hljs-keyword\">not</span> obj.isAtomic <span class=\"hljs-keyword\">or</span> obj.isAtomic()))\n    <span class=\"hljs-literal\">yes</span>\n\n  shouldCache: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">not</span> @isAssignable()\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> [@makeCode <span class=\"hljs-string\">&#x27;[]&#x27;</span>] <span class=\"hljs-keyword\">unless</span> @objects.length\n    o.indent += TAB\n<span class=\"hljs-function\">    <span class=\"hljs-title\">fragmentIsElision</span> = <span class=\"hljs-params\">([ fragment ])</span> -&gt;</span>\n      fragment.type <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;Elision&#x27;</span> <span class=\"hljs-keyword\">and</span> fragment.code.trim() <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;,&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-191\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-191\">&#x00a7;</a>\n              </div>\n              <p>Detect if <code>Elision</code>s at the beginning of the array are processed (e.g. [, , , a]).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    passedElision = <span class=\"hljs-literal\">no</span>\n\n    answer = []\n    <span class=\"hljs-keyword\">for</span> obj, objIndex <span class=\"hljs-keyword\">in</span> @objects\n      unwrappedObj = obj.unwrapAll()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-192\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-192\">&#x00a7;</a>\n              </div>\n              <p>Let <code>compileCommentFragments</code> know to intersperse block comments\ninto the fragments created when compiling this array.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> unwrappedObj.comments <span class=\"hljs-keyword\">and</span>\n         unwrappedObj.comments.filter(<span class=\"hljs-function\"><span class=\"hljs-params\">(comment)</span> -&gt;</span> <span class=\"hljs-keyword\">not</span> comment.here).length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n        unwrappedObj.includeCommentFragments = YES\n\n    compiledObjs = (obj.compileToFragments o, LEVEL_LIST <span class=\"hljs-keyword\">for</span> obj <span class=\"hljs-keyword\">in</span> @objects)\n    olen = compiledObjs.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-193\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-193\">&#x00a7;</a>\n              </div>\n              <p>If <code>compiledObjs</code> includes newlines, we will output this as a multiline\narray (i.e. with a newline and indentation after the <code>[</code>). If an element\ncontains line comments, that should also trigger multiline output since\nby definition line comments will introduce newlines into our output.\nThe exception is if only the first element has line comments; in that\ncase, output as the compact form if we otherwise would have, so that the\nfirst element’s line comments get output before or after the array.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    includesLineCommentsOnNonFirstElement = <span class=\"hljs-literal\">no</span>\n    <span class=\"hljs-keyword\">for</span> fragments, index <span class=\"hljs-keyword\">in</span> compiledObjs\n      <span class=\"hljs-keyword\">for</span> fragment <span class=\"hljs-keyword\">in</span> fragments\n        <span class=\"hljs-keyword\">if</span> fragment.isHereComment\n          fragment.code = fragment.code.trim()\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> index <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> includesLineCommentsOnNonFirstElement <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">and</span> hasLineComments fragment\n          includesLineCommentsOnNonFirstElement = <span class=\"hljs-literal\">yes</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-194\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-194\">&#x00a7;</a>\n              </div>\n              <p>Add ‘, ‘ if all <code>Elisions</code> from the beginning of the array are processed (e.g. [, , , a]) and\nelement isn’t <code>Elision</code> or last element is <code>Elision</code> (e.g. [a,,b,,])</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> index <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> passedElision <span class=\"hljs-keyword\">and</span> (<span class=\"hljs-keyword\">not</span> fragmentIsElision(fragments) <span class=\"hljs-keyword\">or</span> index <span class=\"hljs-keyword\">is</span> olen - <span class=\"hljs-number\">1</span>)\n        answer.push @makeCode <span class=\"hljs-string\">&#x27;, &#x27;</span>\n      passedElision = passedElision <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> fragmentIsElision fragments\n      answer.push fragments...\n    <span class=\"hljs-keyword\">if</span> includesLineCommentsOnNonFirstElement <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-keyword\">in</span> fragmentsToText(answer)\n      <span class=\"hljs-keyword\">for</span> fragment, fragmentIndex <span class=\"hljs-keyword\">in</span> answer\n        <span class=\"hljs-keyword\">if</span> fragment.isHereComment\n          fragment.code = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{multident(fragment.code, o.indent, <span class=\"hljs-literal\">no</span>)}</span>\\n<span class=\"hljs-subst\">#{o.indent}</span>&quot;</span>\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> fragment.code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;, &#x27;</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> fragment?.isElision <span class=\"hljs-keyword\">and</span> fragment.type <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;StringLiteral&#x27;</span>, <span class=\"hljs-string\">&#x27;StringWithInterpolations&#x27;</span>]\n          fragment.code = <span class=\"hljs-string\">&quot;,\\n<span class=\"hljs-subst\">#{o.indent}</span>&quot;</span>\n      answer.unshift @makeCode <span class=\"hljs-string\">&quot;[\\n<span class=\"hljs-subst\">#{o.indent}</span>&quot;</span>\n      answer.push @makeCode <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{@tab}</span>]&quot;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">for</span> fragment <span class=\"hljs-keyword\">in</span> answer <span class=\"hljs-keyword\">when</span> fragment.isHereComment\n        fragment.code = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{fragment.code}</span> &quot;</span>\n      answer.unshift @makeCode <span class=\"hljs-string\">&#x27;[&#x27;</span>\n      answer.push @makeCode <span class=\"hljs-string\">&#x27;]&#x27;</span>\n    answer\n\n  assigns: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> obj <span class=\"hljs-keyword\">in</span> @objects <span class=\"hljs-keyword\">when</span> obj.assigns name <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-literal\">no</span>\n\n  eachName: <span class=\"hljs-function\"><span class=\"hljs-params\">(iterator)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> obj <span class=\"hljs-keyword\">in</span> @objects\n      obj = obj.unwrapAll()\n      obj.eachName iterator</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-195\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-195\">&#x00a7;</a>\n              </div>\n              <p>If this array is the left-hand side of an assignment, all its children\nare too.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  propagateLhs: <span class=\"hljs-function\"><span class=\"hljs-params\">(setLhs)</span> -&gt;</span>\n    @lhs = <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> setLhs\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> @lhs\n    <span class=\"hljs-keyword\">for</span> object <span class=\"hljs-keyword\">in</span> @objects\n      object.lhs = <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> object <span class=\"hljs-keyword\">instanceof</span> Splat <span class=\"hljs-keyword\">or</span> object <span class=\"hljs-keyword\">instanceof</span> Expansion\n      unwrappedObject = object.unwrapAll()\n      <span class=\"hljs-keyword\">if</span> unwrappedObject <span class=\"hljs-keyword\">instanceof</span> Arr <span class=\"hljs-keyword\">or</span> unwrappedObject <span class=\"hljs-keyword\">instanceof</span> Obj\n        unwrappedObject.propagateLhs <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> unwrappedObject <span class=\"hljs-keyword\">instanceof</span> Assign\n        unwrappedObject.nestedLhs = <span class=\"hljs-literal\">yes</span>\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @lhs\n      <span class=\"hljs-string\">&#x27;ArrayPattern&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;ArrayExpression&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      elements:\n        object.ast(o, LEVEL_LIST) <span class=\"hljs-keyword\">for</span> object <span class=\"hljs-keyword\">in</span> @objects</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-196\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-196\">&#x00a7;</a>\n              </div>\n              <h3 id=\"class\">Class</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-197\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-197\">&#x00a7;</a>\n              </div>\n              <p>The CoffeeScript class definition.\nInitialize a <strong>Class</strong> with its name, an optional superclass, and a body.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n<span class=\"hljs-built_in\">exports</span>.Class = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Class</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  children: [<span class=\"hljs-string\">&#x27;variable&#x27;</span>, <span class=\"hljs-string\">&#x27;parent&#x27;</span>, <span class=\"hljs-string\">&#x27;body&#x27;</span>]\n\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@variable, @parent, @body)</span> -&gt;</span>\n    super()\n    <span class=\"hljs-keyword\">unless</span> @body?\n      @body = <span class=\"hljs-keyword\">new</span> Block\n      @hasGeneratedBody = <span class=\"hljs-literal\">yes</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @name          = @determineName()\n    executableBody = @walkBody o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-198\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-198\">&#x00a7;</a>\n              </div>\n              <p>Special handling to allow <code>class expr.A extends A</code> declarations</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    parentName    = @parent.base.value <span class=\"hljs-keyword\">if</span> @parent <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @parent.hasProperties()\n    @hasNameClash = @name? <span class=\"hljs-keyword\">and</span> @name <span class=\"hljs-keyword\">is</span> parentName\n\n    node = @\n\n    <span class=\"hljs-keyword\">if</span> executableBody <span class=\"hljs-keyword\">or</span> @hasNameClash\n      node = <span class=\"hljs-keyword\">new</span> ExecutableClassBody node, executableBody\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> @name? <span class=\"hljs-keyword\">and</span> o.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-199\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-199\">&#x00a7;</a>\n              </div>\n              <p>Anonymous classes are only valid in expressions</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      node = <span class=\"hljs-keyword\">new</span> Parens node\n\n    <span class=\"hljs-keyword\">if</span> @boundMethods.length <span class=\"hljs-keyword\">and</span> @parent\n      @variable ?= <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">&#x27;_class&#x27;</span>\n      [@variable, @variableRef] = @variable.cache o <span class=\"hljs-keyword\">unless</span> @variableRef?\n\n    <span class=\"hljs-keyword\">if</span> @variable\n      node = <span class=\"hljs-keyword\">new</span> Assign @variable, node, <span class=\"hljs-literal\">null</span>, { @moduleDeclaration }\n\n    @compileNode = @compileClassDeclaration\n    <span class=\"hljs-keyword\">try</span>\n      <span class=\"hljs-keyword\">return</span> node.compileToFragments o\n    <span class=\"hljs-keyword\">finally</span>\n      <span class=\"hljs-keyword\">delete</span> @compileNode\n\n  compileClassDeclaration: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @ctor ?= @makeDefaultConstructor() <span class=\"hljs-keyword\">if</span> @externalCtor <span class=\"hljs-keyword\">or</span> @boundMethods.length\n    @ctor?.noReturn = <span class=\"hljs-literal\">true</span>\n\n    @proxyBoundMethods() <span class=\"hljs-keyword\">if</span> @boundMethods.length\n\n    o.indent += TAB\n\n    result = []\n    result.push @makeCode <span class=\"hljs-string\">&quot;class &quot;</span>\n    result.push @makeCode @name <span class=\"hljs-keyword\">if</span> @name\n    @compileCommentFragments o, @variable, result <span class=\"hljs-keyword\">if</span> @variable?.comments?\n    result.push @makeCode <span class=\"hljs-string\">&#x27; &#x27;</span> <span class=\"hljs-keyword\">if</span> @name\n    result.push @makeCode(<span class=\"hljs-string\">&#x27;extends &#x27;</span>), @parent.compileToFragments(o)..., @makeCode <span class=\"hljs-string\">&#x27; &#x27;</span> <span class=\"hljs-keyword\">if</span> @parent\n\n    result.push @makeCode <span class=\"hljs-string\">&#x27;{&#x27;</span>\n    <span class=\"hljs-keyword\">unless</span> @body.isEmpty()\n      @body.spaced = <span class=\"hljs-literal\">true</span>\n      result.push @makeCode <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n      result.push @body.compileToFragments(o, LEVEL_TOP)...\n      result.push @makeCode <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{@tab}</span>&quot;</span>\n    result.push @makeCode <span class=\"hljs-string\">&#x27;}&#x27;</span>\n\n    result</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-200\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-200\">&#x00a7;</a>\n              </div>\n              <p>Figure out the appropriate name for this class</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  determineName: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">null</span> <span class=\"hljs-keyword\">unless</span> @variable\n    [..., tail] = @variable.properties\n    node = <span class=\"hljs-keyword\">if</span> tail\n      tail <span class=\"hljs-keyword\">instanceof</span> Access <span class=\"hljs-keyword\">and</span> tail.name\n    <span class=\"hljs-keyword\">else</span>\n      @variable.base\n    <span class=\"hljs-keyword\">unless</span> node <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral <span class=\"hljs-keyword\">or</span> node <span class=\"hljs-keyword\">instanceof</span> PropertyName\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">null</span>\n    name = node.value\n    <span class=\"hljs-keyword\">unless</span> tail\n      message = isUnassignable name\n      @variable.error message <span class=\"hljs-keyword\">if</span> message\n    <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">in</span> JS_FORBIDDEN <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;_<span class=\"hljs-subst\">#{name}</span>&quot;</span> <span class=\"hljs-keyword\">else</span> name\n\n  walkBody: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @ctor          = <span class=\"hljs-literal\">null</span>\n    @boundMethods  = []\n    executableBody = <span class=\"hljs-literal\">null</span>\n\n    initializer     = []\n    { expressions } = @body\n\n    i = <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">for</span> expression <span class=\"hljs-keyword\">in</span> expressions.slice()\n      <span class=\"hljs-keyword\">if</span> expression <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> expression.isObject <span class=\"hljs-literal\">true</span>\n        { properties } = expression.base\n        exprs     = []\n        end       = <span class=\"hljs-number\">0</span>\n        start     = <span class=\"hljs-number\">0</span>\n<span class=\"hljs-function\">        <span class=\"hljs-title\">pushSlice</span> = -&gt;</span> exprs.push <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Obj properties[start...end], <span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> end &gt; start\n\n        <span class=\"hljs-keyword\">while</span> assign = properties[end]\n          <span class=\"hljs-keyword\">if</span> initializerExpression = @addInitializerExpression assign, o\n            pushSlice()\n            exprs.push initializerExpression\n            initializer.push initializerExpression\n            start = end + <span class=\"hljs-number\">1</span>\n          end++\n        pushSlice()\n\n        expressions[i..i] = exprs\n        i += exprs.length\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">if</span> initializerExpression = @addInitializerExpression expression, o\n          initializer.push initializerExpression\n          expressions[i] = initializerExpression\n        i += <span class=\"hljs-number\">1</span>\n\n    <span class=\"hljs-keyword\">for</span> method <span class=\"hljs-keyword\">in</span> initializer <span class=\"hljs-keyword\">when</span> method <span class=\"hljs-keyword\">instanceof</span> Code\n      <span class=\"hljs-keyword\">if</span> method.ctor\n        method.error <span class=\"hljs-string\">&#x27;Cannot define more than one constructor in a class&#x27;</span> <span class=\"hljs-keyword\">if</span> @ctor\n        @ctor = method\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> method.isStatic <span class=\"hljs-keyword\">and</span> method.bound\n        method.context = @name\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> method.bound\n        @boundMethods.push method\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> o.compiling\n    <span class=\"hljs-keyword\">if</span> initializer.length <span class=\"hljs-keyword\">isnt</span> expressions.length\n      @body.expressions = (expression.hoist() <span class=\"hljs-keyword\">for</span> expression <span class=\"hljs-keyword\">in</span> initializer)\n      <span class=\"hljs-keyword\">new</span> Block expressions</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-201\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-201\">&#x00a7;</a>\n              </div>\n              <p>Add an expression to the class initializer</p>\n<p>This is the key method for determining whether an expression in a class\nbody should appear in the initializer or the executable body. If the given\n<code>node</code> is valid in a class body the method will return a (new, modified,\nor identical) node for inclusion in the class initializer, otherwise\nnothing will be returned and the node will appear in the executable body.</p>\n<p>At time of writing, only methods (instance and static) are valid in ES\nclass initializers. As new ES class features (such as class fields) reach\nStage 4, this method will need to be updated to support them. We\nadditionally allow <code>PassthroughLiteral</code>s (backticked expressions) in the\ninitializer as an escape hatch for ES features that are not implemented\n(e.g. getters and setters defined via the <code>get</code> and <code>set</code> keywords as\nopposed to the <code>Object.defineProperty</code> method).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addInitializerExpression: <span class=\"hljs-function\"><span class=\"hljs-params\">(node, o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> node.unwrapAll() <span class=\"hljs-keyword\">instanceof</span> PassthroughLiteral\n      node\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @validInitializerMethod node\n      @addInitializerMethod node\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> o.compiling <span class=\"hljs-keyword\">and</span> @validClassProperty node\n      @addClassProperty node\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> o.compiling <span class=\"hljs-keyword\">and</span> @validClassPrototypeProperty node\n      @addClassPrototypeProperty node\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-202\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-202\">&#x00a7;</a>\n              </div>\n              <p>Checks if the given node is a valid ES class initializer method.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  validInitializerMethod: <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> node <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> node.value <span class=\"hljs-keyword\">instanceof</span> Code\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> node.context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> node.variable.hasProperties()\n    <span class=\"hljs-keyword\">return</span> node.variable.looksStatic(@name) <span class=\"hljs-keyword\">and</span> (@name <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> node.value.bound)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-203\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-203\">&#x00a7;</a>\n              </div>\n              <p>Returns a configured class initializer method</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addInitializerMethod: <span class=\"hljs-function\"><span class=\"hljs-params\">(assign)</span> -&gt;</span>\n    { variable, value: method, operatorToken } = assign\n    method.isMethod = <span class=\"hljs-literal\">yes</span>\n    method.isStatic = variable.looksStatic @name\n\n    <span class=\"hljs-keyword\">if</span> method.isStatic\n      method.name = variable.properties[<span class=\"hljs-number\">0</span>]\n    <span class=\"hljs-keyword\">else</span>\n      methodName  = variable.base\n      method.name = <span class=\"hljs-keyword\">new</span> (<span class=\"hljs-keyword\">if</span> methodName.shouldCache() <span class=\"hljs-keyword\">then</span> Index <span class=\"hljs-keyword\">else</span> Access) methodName\n      method.name.updateLocationDataIfMissing methodName.locationData\n      isConstructor =\n        <span class=\"hljs-keyword\">if</span> methodName <span class=\"hljs-keyword\">instanceof</span> StringLiteral\n          methodName.originalValue <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;constructor&#x27;</span>\n        <span class=\"hljs-keyword\">else</span>\n          methodName.value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;constructor&#x27;</span>\n      method.ctor = (<span class=\"hljs-keyword\">if</span> @parent <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;derived&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;base&#x27;</span>) <span class=\"hljs-keyword\">if</span> isConstructor\n      method.error <span class=\"hljs-string\">&#x27;Cannot define a constructor as a bound (fat arrow) function&#x27;</span> <span class=\"hljs-keyword\">if</span> method.bound <span class=\"hljs-keyword\">and</span> method.ctor\n\n    method.operatorToken = operatorToken\n    method\n\n  validClassProperty: <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> node <span class=\"hljs-keyword\">instanceof</span> Assign\n    <span class=\"hljs-keyword\">return</span> node.variable.looksStatic @name\n\n  addClassProperty: <span class=\"hljs-function\"><span class=\"hljs-params\">(assign)</span> -&gt;</span>\n    {variable, value, operatorToken} = assign\n    {staticClassName} = variable.looksStatic @name\n    <span class=\"hljs-keyword\">new</span> ClassProperty({\n      name: variable.properties[<span class=\"hljs-number\">0</span>]\n      isStatic: <span class=\"hljs-literal\">yes</span>\n      staticClassName\n      value\n      operatorToken\n    }).withLocationDataFrom assign\n\n  validClassPrototypeProperty: <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> node <span class=\"hljs-keyword\">instanceof</span> Assign\n    node.context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> node.variable.hasProperties()\n\n  addClassPrototypeProperty: <span class=\"hljs-function\"><span class=\"hljs-params\">(assign)</span> -&gt;</span>\n    {variable, value} = assign\n    <span class=\"hljs-keyword\">new</span> ClassPrototypeProperty({\n      name: variable.base\n      value\n    }).withLocationDataFrom assign\n\n  makeDefaultConstructor: <span class=\"hljs-function\">-&gt;</span>\n    ctor = @addInitializerMethod <span class=\"hljs-keyword\">new</span> Assign (<span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> PropertyName <span class=\"hljs-string\">&#x27;constructor&#x27;</span>), <span class=\"hljs-keyword\">new</span> Code\n    @body.unshift ctor\n\n    <span class=\"hljs-keyword\">if</span> @parent\n      ctor.body.push <span class=\"hljs-keyword\">new</span> SuperCall <span class=\"hljs-keyword\">new</span> Super, [<span class=\"hljs-keyword\">new</span> Splat <span class=\"hljs-keyword\">new</span> IdentifierLiteral <span class=\"hljs-string\">&#x27;arguments&#x27;</span>]\n\n    <span class=\"hljs-keyword\">if</span> @externalCtor\n      applyCtor = <span class=\"hljs-keyword\">new</span> Value @externalCtor, [ <span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName <span class=\"hljs-string\">&#x27;apply&#x27;</span> ]\n      applyArgs = [ <span class=\"hljs-keyword\">new</span> ThisLiteral, <span class=\"hljs-keyword\">new</span> IdentifierLiteral <span class=\"hljs-string\">&#x27;arguments&#x27;</span> ]\n      ctor.body.push <span class=\"hljs-keyword\">new</span> Call applyCtor, applyArgs\n      ctor.body.makeReturn()\n\n    ctor\n\n  proxyBoundMethods: <span class=\"hljs-function\">-&gt;</span>\n    @ctor.thisAssignments = <span class=\"hljs-keyword\">for</span> method <span class=\"hljs-keyword\">in</span> @boundMethods\n      method.classVariable = @variableRef <span class=\"hljs-keyword\">if</span> @parent\n\n      name = <span class=\"hljs-keyword\">new</span> Value(<span class=\"hljs-keyword\">new</span> ThisLiteral, [ method.name ])\n      <span class=\"hljs-keyword\">new</span> Assign name, <span class=\"hljs-keyword\">new</span> Call(<span class=\"hljs-keyword\">new</span> Value(name, [<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName <span class=\"hljs-string\">&#x27;bind&#x27;</span>]), [<span class=\"hljs-keyword\">new</span> ThisLiteral])\n\n    <span class=\"hljs-literal\">null</span>\n\n  declareName: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> (name = @variable?.unwrap()) <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral\n    alreadyDeclared = o.scope.find name.value\n    name.isDeclaration = <span class=\"hljs-keyword\">not</span> alreadyDeclared\n\n  isStatementAst: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-literal\">yes</span>\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> jumpNode = @body.jumps()\n      jumpNode.error <span class=\"hljs-string\">&#x27;Class bodies cannot contain pure statements&#x27;</span>\n    <span class=\"hljs-keyword\">if</span> argumentsNode = @body.contains isLiteralArguments\n      argumentsNode.error <span class=\"hljs-string\">&quot;Class bodies shouldn&#x27;t reference arguments&quot;</span>\n    @declareName o\n    @name = @determineName()\n    @body.isClassBody = <span class=\"hljs-literal\">yes</span>\n    @body.locationData = zeroWidthLocationDataFromEndLocation @locationData <span class=\"hljs-keyword\">if</span> @hasGeneratedBody\n    @walkBody o\n    sniffDirectives @body.expressions\n    @ctor?.noReturn = <span class=\"hljs-literal\">yes</span>\n\n    super o\n\n  astType: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> o.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP\n      <span class=\"hljs-string\">&#x27;ClassDeclaration&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;ClassExpression&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      id: @variable?.ast(o) ? <span class=\"hljs-literal\">null</span>\n      superClass: @parent?.ast(o, LEVEL_PAREN) ? <span class=\"hljs-literal\">null</span>\n      body: @body.ast o, LEVEL_TOP\n\n<span class=\"hljs-built_in\">exports</span>.ExecutableClassBody = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExecutableClassBody</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  children: [ <span class=\"hljs-string\">&#x27;class&#x27;</span>, <span class=\"hljs-string\">&#x27;body&#x27;</span> ]\n\n  defaultClassVariableName: <span class=\"hljs-string\">&#x27;_Class&#x27;</span>\n\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@class, @body = <span class=\"hljs-keyword\">new</span> Block)</span> -&gt;</span>\n    super()\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> jumpNode = @body.jumps()\n      jumpNode.error <span class=\"hljs-string\">&#x27;Class bodies cannot contain pure statements&#x27;</span>\n    <span class=\"hljs-keyword\">if</span> argumentsNode = @body.contains isLiteralArguments\n      argumentsNode.error <span class=\"hljs-string\">&quot;Class bodies shouldn&#x27;t reference arguments&quot;</span>\n\n    params  = []\n    args    = [<span class=\"hljs-keyword\">new</span> ThisLiteral]\n    wrapper = <span class=\"hljs-keyword\">new</span> Code params, @body\n    klass   = <span class=\"hljs-keyword\">new</span> Parens <span class=\"hljs-keyword\">new</span> Call (<span class=\"hljs-keyword\">new</span> Value wrapper, [<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName <span class=\"hljs-string\">&#x27;call&#x27;</span>]), args\n\n    @body.spaced = <span class=\"hljs-literal\">true</span>\n\n    o.classScope = wrapper.makeScope o.scope\n\n    @name      = @class.name ? o.classScope.freeVariable @defaultClassVariableName\n    ident      = <span class=\"hljs-keyword\">new</span> IdentifierLiteral @name\n    directives = @walkBody()\n    @setContext()\n\n    <span class=\"hljs-keyword\">if</span> @class.hasNameClash\n      parent = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.classScope.freeVariable <span class=\"hljs-string\">&#x27;superClass&#x27;</span>\n      wrapper.params.push <span class=\"hljs-keyword\">new</span> Param parent\n      args.push @class.parent\n      @class.parent = parent\n\n    <span class=\"hljs-keyword\">if</span> @externalCtor\n      externalCtor = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.classScope.freeVariable <span class=\"hljs-string\">&#x27;ctor&#x27;</span>, reserve: <span class=\"hljs-literal\">no</span>\n      @class.externalCtor = externalCtor\n      @externalCtor.variable.base = externalCtor\n\n    <span class=\"hljs-keyword\">if</span> @name <span class=\"hljs-keyword\">isnt</span> @class.name\n      @body.expressions.unshift <span class=\"hljs-keyword\">new</span> Assign (<span class=\"hljs-keyword\">new</span> IdentifierLiteral @name), @class\n    <span class=\"hljs-keyword\">else</span>\n      @body.expressions.unshift @class\n    @body.expressions.unshift directives...\n    @body.push ident\n\n    klass.compileToFragments o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-204\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-204\">&#x00a7;</a>\n              </div>\n              <p>Traverse the class’s children and:</p>\n<ul>\n<li>Hoist valid ES properties into <code>@properties</code></li>\n<li>Hoist static assignments into <code>@properties</code></li>\n<li>Convert invalid ES properties into class or prototype assignments</li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  walkBody: <span class=\"hljs-function\">-&gt;</span>\n    directives  = []\n\n    index = <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">while</span> expr = @body.expressions[index]\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> expr <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> expr.isString()\n      <span class=\"hljs-keyword\">if</span> expr.hoisted\n        index++\n      <span class=\"hljs-keyword\">else</span>\n        directives.push @body.expressions.splice(index, <span class=\"hljs-number\">1</span>)...\n\n    @traverseChildren <span class=\"hljs-literal\">false</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(child)</span> =&gt;</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span> <span class=\"hljs-keyword\">if</span> child <span class=\"hljs-keyword\">instanceof</span> Class <span class=\"hljs-keyword\">or</span> child <span class=\"hljs-keyword\">instanceof</span> HoistTarget\n\n      cont = <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-keyword\">if</span> child <span class=\"hljs-keyword\">instanceof</span> Block\n        <span class=\"hljs-keyword\">for</span> node, i <span class=\"hljs-keyword\">in</span> child.expressions\n          <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> node.isObject(<span class=\"hljs-literal\">true</span>)\n            cont = <span class=\"hljs-literal\">false</span>\n            child.expressions[i] = @addProperties node.base.properties\n          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> node.variable.looksStatic @name\n            node.value.isStatic = <span class=\"hljs-literal\">yes</span>\n        child.expressions = flatten child.expressions\n      cont\n\n    directives\n\n  setContext: <span class=\"hljs-function\">-&gt;</span>\n    @body.traverseChildren <span class=\"hljs-literal\">false</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> =&gt;</span>\n      <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> ThisLiteral\n        node.value   = @name\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> Code <span class=\"hljs-keyword\">and</span> node.bound <span class=\"hljs-keyword\">and</span> (node.isStatic <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> node.name)\n        node.context = @name</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-205\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-205\">&#x00a7;</a>\n              </div>\n              <p>Make class/prototype assignments for invalid ES properties</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(assigns)</span> -&gt;</span>\n    result = <span class=\"hljs-keyword\">for</span> assign <span class=\"hljs-keyword\">in</span> assigns\n      variable = assign.variable\n      base     = variable?.base\n      value    = assign.value\n      <span class=\"hljs-keyword\">delete</span> assign.context\n\n      <span class=\"hljs-keyword\">if</span> base.value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;constructor&#x27;</span>\n        <span class=\"hljs-keyword\">if</span> value <span class=\"hljs-keyword\">instanceof</span> Code\n          base.error <span class=\"hljs-string\">&#x27;constructors must be defined at the top level of a class body&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-206\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-206\">&#x00a7;</a>\n              </div>\n              <p>The class scope is not available yet, so return the assignment to update later</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        assign = @externalCtor = <span class=\"hljs-keyword\">new</span> Assign <span class=\"hljs-keyword\">new</span> Value, value\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> assign.variable.this\n        name =\n          <span class=\"hljs-keyword\">if</span> base <span class=\"hljs-keyword\">instanceof</span> ComputedPropertyName\n            <span class=\"hljs-keyword\">new</span> Index base.value\n          <span class=\"hljs-keyword\">else</span>\n            <span class=\"hljs-keyword\">new</span> (<span class=\"hljs-keyword\">if</span> base.shouldCache() <span class=\"hljs-keyword\">then</span> Index <span class=\"hljs-keyword\">else</span> Access) base\n        prototype = <span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName <span class=\"hljs-string\">&#x27;prototype&#x27;</span>\n        variable  = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> ThisLiteral(), [ prototype, name ]\n\n        assign.variable = variable\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> assign.value <span class=\"hljs-keyword\">instanceof</span> Code\n        assign.value.isStatic = <span class=\"hljs-literal\">true</span>\n\n      assign\n    compact result\n\n<span class=\"hljs-built_in\">exports</span>.ClassProperty = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ClassProperty</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">({@name, @isStatic, @staticClassName, @value, @operatorToken})</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;name&#x27;</span>, <span class=\"hljs-string\">&#x27;value&#x27;</span>, <span class=\"hljs-string\">&#x27;staticClassName&#x27;</span>]\n\n  isStatement: YES\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      key: @name.ast o, LEVEL_LIST\n      value: @value.ast o, LEVEL_LIST\n      static: !!@isStatic\n      computed: @name <span class=\"hljs-keyword\">instanceof</span> Index <span class=\"hljs-keyword\">or</span> @name <span class=\"hljs-keyword\">instanceof</span> ComputedPropertyName\n      operator: @operatorToken?.value ? <span class=\"hljs-string\">&#x27;=&#x27;</span>\n      staticClassName: @staticClassName?.ast(o) ? <span class=\"hljs-literal\">null</span>\n\n<span class=\"hljs-built_in\">exports</span>.ClassPrototypeProperty = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ClassPrototypeProperty</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">({@name, @value})</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;name&#x27;</span>, <span class=\"hljs-string\">&#x27;value&#x27;</span>]\n\n  isStatement: YES\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      key: @name.ast o, LEVEL_LIST\n      value: @value.ast o, LEVEL_LIST\n      computed: @name <span class=\"hljs-keyword\">instanceof</span> ComputedPropertyName <span class=\"hljs-keyword\">or</span> @name <span class=\"hljs-keyword\">instanceof</span> StringWithInterpolations</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-207\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-207\">&#x00a7;</a>\n              </div>\n              <h3 id=\"import-and-export\">Import and Export</h3>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n<span class=\"hljs-built_in\">exports</span>.ModuleDeclaration = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ModuleDeclaration</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@clause, @source, @assertions)</span> -&gt;</span>\n    super()\n    @checkSource()\n\n  children: [<span class=\"hljs-string\">&#x27;clause&#x27;</span>, <span class=\"hljs-string\">&#x27;source&#x27;</span>, <span class=\"hljs-string\">&#x27;assertions&#x27;</span>]\n\n  isStatement: YES\n  jumps:       THIS\n  makeReturn:  THIS\n\n  checkSource: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @source? <span class=\"hljs-keyword\">and</span> @source <span class=\"hljs-keyword\">instanceof</span> StringWithInterpolations\n      @source.error <span class=\"hljs-string\">&#x27;the name of the module to be imported from must be an uninterpolated string&#x27;</span>\n\n  checkScope: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, moduleDeclarationType)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-208\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-208\">&#x00a7;</a>\n              </div>\n              <p>TODO: would be appropriate to flag this error during AST generation (as\nwell as when compiling to JS). But <code>o.indent</code> isn’t tracked during AST\ngeneration, and there doesn’t seem to be a current alternative way to track\nwhether we’re at the “program top-level”.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> o.indent.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n      @error <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{moduleDeclarationType}</span> statements must be at top-level scope&quot;</span>\n\n  astAssertions: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @assertions?.properties?\n      @assertions.properties.map (assertion) =&gt;\n        { start, end, loc, left, right } = assertion.ast(o)\n        { type: <span class=\"hljs-string\">&#x27;ImportAttribute&#x27;</span>, start, end, loc, key: left, value: right }\n    <span class=\"hljs-keyword\">else</span>\n      []\n\n<span class=\"hljs-built_in\">exports</span>.ImportDeclaration = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ImportDeclaration</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ModuleDeclaration</span></span>\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkScope o, <span class=\"hljs-string\">&#x27;import&#x27;</span>\n    o.importedSymbols = []\n\n    code = []\n    code.push @makeCode <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@tab}</span>import &quot;</span>\n    code.push @clause.compileNode(o)... <span class=\"hljs-keyword\">if</span> @clause?\n\n    <span class=\"hljs-keyword\">if</span> @source?.value?\n      code.push @makeCode <span class=\"hljs-string\">&#x27; from &#x27;</span> <span class=\"hljs-keyword\">unless</span> @clause <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">null</span>\n      code.push @makeCode @source.value\n      <span class=\"hljs-keyword\">if</span> @assertions?\n        code.push @makeCode <span class=\"hljs-string\">&#x27; assert &#x27;</span>\n        code.push @assertions.compileToFragments(o)...\n\n    code.push @makeCode <span class=\"hljs-string\">&#x27;;&#x27;</span>\n    code\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o.importedSymbols = []\n    super o\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    ret =\n      specifiers: @clause?.ast(o) ? []\n      source: @source.ast o\n      assertions: @astAssertions(o)\n    ret.importKind = <span class=\"hljs-string\">&#x27;value&#x27;</span> <span class=\"hljs-keyword\">if</span> @clause\n    ret\n\n<span class=\"hljs-built_in\">exports</span>.ImportClause = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ImportClause</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@defaultBinding, @namedImports)</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;defaultBinding&#x27;</span>, <span class=\"hljs-string\">&#x27;namedImports&#x27;</span>]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    code = []\n\n    <span class=\"hljs-keyword\">if</span> @defaultBinding?\n      code.push @defaultBinding.compileNode(o)...\n      code.push @makeCode <span class=\"hljs-string\">&#x27;, &#x27;</span> <span class=\"hljs-keyword\">if</span> @namedImports?\n\n    <span class=\"hljs-keyword\">if</span> @namedImports?\n      code.push @namedImports.compileNode(o)...\n\n    code\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-209\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-209\">&#x00a7;</a>\n              </div>\n              <p>The AST for <code>ImportClause</code> is the non-nested list of import specifiers\nthat will be the <code>specifiers</code> property of an <code>ImportDeclaration</code> AST</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    compact flatten [\n      @defaultBinding?.ast o\n      @namedImports?.ast o\n    ]\n\n<span class=\"hljs-built_in\">exports</span>.ExportDeclaration = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExportDeclaration</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ModuleDeclaration</span></span>\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkScope o, <span class=\"hljs-string\">&#x27;export&#x27;</span>\n    @checkForAnonymousClassExport()\n\n    code = []\n    code.push @makeCode <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@tab}</span>export &quot;</span>\n    code.push @makeCode <span class=\"hljs-string\">&#x27;default &#x27;</span> <span class=\"hljs-keyword\">if</span> @ <span class=\"hljs-keyword\">instanceof</span> ExportDefaultDeclaration\n\n    <span class=\"hljs-keyword\">if</span> @ <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> ExportDefaultDeclaration <span class=\"hljs-keyword\">and</span>\n       (@clause <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">or</span> @clause <span class=\"hljs-keyword\">instanceof</span> Class)\n      code.push @makeCode <span class=\"hljs-string\">&#x27;var &#x27;</span>\n      @clause.moduleDeclaration = <span class=\"hljs-string\">&#x27;export&#x27;</span>\n\n    <span class=\"hljs-keyword\">if</span> @clause.body? <span class=\"hljs-keyword\">and</span> @clause.body <span class=\"hljs-keyword\">instanceof</span> Block\n      code = code.concat @clause.compileToFragments o, LEVEL_TOP\n    <span class=\"hljs-keyword\">else</span>\n      code = code.concat @clause.compileNode o\n\n    <span class=\"hljs-keyword\">if</span> @source?.value?\n      code.push @makeCode <span class=\"hljs-string\">&quot; from <span class=\"hljs-subst\">#{@source.value}</span>&quot;</span>\n      <span class=\"hljs-keyword\">if</span> @assertions?\n        code.push @makeCode <span class=\"hljs-string\">&#x27; assert &#x27;</span>\n        code.push @assertions.compileToFragments(o)...\n\n    code.push @makeCode <span class=\"hljs-string\">&#x27;;&#x27;</span>\n    code</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-210\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-210\">&#x00a7;</a>\n              </div>\n              <p>Prevent exporting an anonymous class; all exported members must be named</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  checkForAnonymousClassExport: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @ <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> ExportDefaultDeclaration <span class=\"hljs-keyword\">and</span> @clause <span class=\"hljs-keyword\">instanceof</span> Class <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @clause.variable\n      @clause.error <span class=\"hljs-string\">&#x27;anonymous classes cannot be exported&#x27;</span>\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkForAnonymousClassExport()\n    super o\n\n<span class=\"hljs-built_in\">exports</span>.ExportNamedDeclaration = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExportNamedDeclaration</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ExportDeclaration</span></span>\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    ret =\n      source: @source?.ast(o) ? <span class=\"hljs-literal\">null</span>\n      assertions: @astAssertions(o)\n      exportKind: <span class=\"hljs-string\">&#x27;value&#x27;</span>\n    clauseAst = @clause.ast o\n    <span class=\"hljs-keyword\">if</span> @clause <span class=\"hljs-keyword\">instanceof</span> ExportSpecifierList\n      ret.specifiers = clauseAst\n      ret.declaration = <span class=\"hljs-literal\">null</span>\n    <span class=\"hljs-keyword\">else</span>\n      ret.specifiers = []\n      ret.declaration = clauseAst\n    ret\n\n<span class=\"hljs-built_in\">exports</span>.ExportDefaultDeclaration = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExportDefaultDeclaration</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ExportDeclaration</span></span>\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      declaration: @clause.ast o\n      assertions: @astAssertions(o)\n\n<span class=\"hljs-built_in\">exports</span>.ExportAllDeclaration = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExportAllDeclaration</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ExportDeclaration</span></span>\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      source: @source.ast o\n      assertions: @astAssertions(o)\n      exportKind: <span class=\"hljs-string\">&#x27;value&#x27;</span>\n\n<span class=\"hljs-built_in\">exports</span>.ModuleSpecifierList = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ModuleSpecifierList</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@specifiers)</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;specifiers&#x27;</span>]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    code = []\n    o.indent += TAB\n    compiledList = (specifier.compileToFragments o, LEVEL_LIST <span class=\"hljs-keyword\">for</span> specifier <span class=\"hljs-keyword\">in</span> @specifiers)\n\n    <span class=\"hljs-keyword\">if</span> @specifiers.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n      code.push @makeCode <span class=\"hljs-string\">&quot;{\\n<span class=\"hljs-subst\">#{o.indent}</span>&quot;</span>\n      <span class=\"hljs-keyword\">for</span> fragments, index <span class=\"hljs-keyword\">in</span> compiledList\n        code.push @makeCode(<span class=\"hljs-string\">&quot;,\\n<span class=\"hljs-subst\">#{o.indent}</span>&quot;</span>) <span class=\"hljs-keyword\">if</span> index\n        code.push fragments...\n      code.push @makeCode <span class=\"hljs-string\">&quot;\\n}&quot;</span>\n    <span class=\"hljs-keyword\">else</span>\n      code.push @makeCode <span class=\"hljs-string\">&#x27;{}&#x27;</span>\n    code\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    specifier.ast(o) <span class=\"hljs-keyword\">for</span> specifier <span class=\"hljs-keyword\">in</span> @specifiers\n\n<span class=\"hljs-built_in\">exports</span>.ImportSpecifierList = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ImportSpecifierList</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ModuleSpecifierList</span></span>\n\n<span class=\"hljs-built_in\">exports</span>.ExportSpecifierList = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExportSpecifierList</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ModuleSpecifierList</span></span>\n\n<span class=\"hljs-built_in\">exports</span>.ModuleSpecifier = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ModuleSpecifier</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@original, @alias, @moduleDeclarationType)</span> -&gt;</span>\n    super()\n\n    <span class=\"hljs-keyword\">if</span> @original.comments <span class=\"hljs-keyword\">or</span> @alias?.comments\n      @comments = []\n      @comments.push @original.comments... <span class=\"hljs-keyword\">if</span> @original.comments\n      @comments.push @alias.comments...    <span class=\"hljs-keyword\">if</span> @alias?.comments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-211\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-211\">&#x00a7;</a>\n              </div>\n              <p>The name of the variable entering the local scope</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @identifier = <span class=\"hljs-keyword\">if</span> @alias? <span class=\"hljs-keyword\">then</span> @alias.value <span class=\"hljs-keyword\">else</span> @original.value\n\n  children: [<span class=\"hljs-string\">&#x27;original&#x27;</span>, <span class=\"hljs-string\">&#x27;alias&#x27;</span>]\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @addIdentifierToScope o\n    code = []\n    code.push @makeCode @original.value\n    code.push @makeCode <span class=\"hljs-string\">&quot; as <span class=\"hljs-subst\">#{@alias.value}</span>&quot;</span> <span class=\"hljs-keyword\">if</span> @alias?\n    code\n\n  addIdentifierToScope: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o.scope.find @identifier, @moduleDeclarationType\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @addIdentifierToScope o\n    super o\n\n<span class=\"hljs-built_in\">exports</span>.ImportSpecifier = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ImportSpecifier</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ModuleSpecifier</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(imported, local)</span> -&gt;</span>\n    super imported, local, <span class=\"hljs-string\">&#x27;import&#x27;</span>\n\n  addIdentifierToScope: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-212\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-212\">&#x00a7;</a>\n              </div>\n              <p>Per the spec, symbols can’t be imported multiple times\n(e.g. <code>import { foo, foo } from &#39;lib&#39;</code> is invalid)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> @identifier <span class=\"hljs-keyword\">in</span> o.importedSymbols <span class=\"hljs-keyword\">or</span> o.scope.check(@identifier)\n      @error <span class=\"hljs-string\">&quot;&#x27;<span class=\"hljs-subst\">#{@identifier}</span>&#x27; has already been declared&quot;</span>\n    <span class=\"hljs-keyword\">else</span>\n      o.importedSymbols.push @identifier\n    super o\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    originalAst = @original.ast o\n    <span class=\"hljs-keyword\">return</span>\n      imported: originalAst\n      local: @alias?.ast(o) ? originalAst\n      importKind: <span class=\"hljs-literal\">null</span>\n\n<span class=\"hljs-built_in\">exports</span>.ImportDefaultSpecifier = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ImportDefaultSpecifier</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ImportSpecifier</span></span>\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      local: @original.ast o\n\n<span class=\"hljs-built_in\">exports</span>.ImportNamespaceSpecifier = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ImportNamespaceSpecifier</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ImportSpecifier</span></span>\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      local: @alias.ast o\n\n<span class=\"hljs-built_in\">exports</span>.ExportSpecifier = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">ExportSpecifier</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">ModuleSpecifier</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(local, exported)</span> -&gt;</span>\n    super local, exported, <span class=\"hljs-string\">&#x27;export&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    originalAst = @original.ast o\n    <span class=\"hljs-keyword\">return</span>\n      local: originalAst\n      exported: @alias?.ast(o) ? originalAst\n\n<span class=\"hljs-built_in\">exports</span>.DynamicImport = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DynamicImport</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  compileNode: <span class=\"hljs-function\">-&gt;</span>\n    [@makeCode <span class=\"hljs-string\">&#x27;import&#x27;</span>]\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;Import&#x27;</span>\n\n<span class=\"hljs-built_in\">exports</span>.DynamicImportCall = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">DynamicImportCall</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Call</span></span>\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkArguments()\n    super o\n\n  checkArguments: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">unless</span> <span class=\"hljs-number\">1</span> &lt;= @args.length &lt;= <span class=\"hljs-number\">2</span>\n      @error <span class=\"hljs-string\">&#x27;import() accepts either one or two arguments&#x27;</span>\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkArguments()\n    super o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-213\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-213\">&#x00a7;</a>\n              </div>\n              <h3 id=\"assign\">Assign</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-214\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-214\">&#x00a7;</a>\n              </div>\n              <p>The <strong>Assign</strong> is used to assign a local variable to value, or to set the\nproperty of an object – including within object literals.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Assign = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Assign</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@variable, @value, @context, options = {})</span> -&gt;</span>\n    super()\n    {@param, @subpattern, @operatorToken, @moduleDeclaration, @originalContext = @context} = options\n    @propagateLhs()\n\n  children: [<span class=\"hljs-string\">&#x27;variable&#x27;</span>, <span class=\"hljs-string\">&#x27;value&#x27;</span>]\n\n  isAssignable: YES\n\n  isStatement: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o?.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP <span class=\"hljs-keyword\">and</span> @context? <span class=\"hljs-keyword\">and</span> (@moduleDeclaration <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&quot;?&quot;</span> <span class=\"hljs-keyword\">in</span> @context)\n\n  checkNameAssignability: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, varBase)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> o.scope.type(varBase.value) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;import&#x27;</span>\n      varBase.error <span class=\"hljs-string\">&quot;&#x27;<span class=\"hljs-subst\">#{varBase.value}</span>&#x27; is read-only&quot;</span>\n\n  assigns: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    @[<span class=\"hljs-keyword\">if</span> @context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;value&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;variable&#x27;</span>].assigns name\n\n  unfoldSoak: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    unfoldSoak o, this, <span class=\"hljs-string\">&#x27;variable&#x27;</span>\n\n  addScopeVariables: (o, {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-215\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-215\">&#x00a7;</a>\n              </div>\n              <p>During AST generation, we need to allow assignment to these constructs\nthat are considered “unassignable” during compile-to-JS, while still\nflagging things like <code>[null] = b</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    allowAssignmentToExpansion = <span class=\"hljs-literal\">no</span>,\n    allowAssignmentToNontrailingSplat = <span class=\"hljs-literal\">no</span>,\n    allowAssignmentToEmptyArray = <span class=\"hljs-literal\">no</span>,\n    allowAssignmentToComplexSplat = <span class=\"hljs-literal\">no</span>\n  } = {}) -&gt;\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> <span class=\"hljs-keyword\">not</span> @context <span class=\"hljs-keyword\">or</span> @context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;**=&#x27;</span>\n\n    varBase = @variable.unwrapAll()\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> varBase.isAssignable {\n      allowExpansion: allowAssignmentToExpansion\n      allowNontrailingSplat: allowAssignmentToNontrailingSplat\n      allowEmptyArray: allowAssignmentToEmptyArray\n      allowComplexSplat: allowAssignmentToComplexSplat\n    }\n      @variable.error <span class=\"hljs-string\">&quot;&#x27;<span class=\"hljs-subst\">#{@variable.compile o}</span>&#x27; can&#x27;t be assigned&quot;</span>\n\n    varBase.eachName (name) =&gt;\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> name.hasProperties?()\n\n      message = isUnassignable name.value\n      name.error message <span class=\"hljs-keyword\">if</span> message</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-216\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-216\">&#x00a7;</a>\n              </div>\n              <p><code>moduleDeclaration</code> can be <code>&#39;import&#39;</code> or <code>&#39;export&#39;</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      @checkNameAssignability o, name\n      <span class=\"hljs-keyword\">if</span> @moduleDeclaration\n        o.scope.add name.value, @moduleDeclaration\n        name.isDeclaration = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @param\n        o.scope.add name.value,\n          <span class=\"hljs-keyword\">if</span> @param <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;alwaysDeclare&#x27;</span>\n            <span class=\"hljs-string\">&#x27;var&#x27;</span>\n          <span class=\"hljs-keyword\">else</span>\n            <span class=\"hljs-string\">&#x27;param&#x27;</span>\n      <span class=\"hljs-keyword\">else</span>\n        alreadyDeclared = o.scope.find name.value\n        name.isDeclaration ?= <span class=\"hljs-keyword\">not</span> alreadyDeclared</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-217\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-217\">&#x00a7;</a>\n              </div>\n              <p>If this assignment identifier has one or more herecomments\nattached, output them as part of the declarations line (unless\nother herecomments are already staged there) for compatibility\nwith Flow typing. Don’t do this if this assignment is for a\nclass, e.g. <code>ClassName = class ClassName {</code>, as Flow requires\nthe comment to be between the class name and the <code>{</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> name.comments <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> o.scope.comments[name.value] <span class=\"hljs-keyword\">and</span>\n           @value <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Class <span class=\"hljs-keyword\">and</span>\n           name.comments.every(<span class=\"hljs-function\"><span class=\"hljs-params\">(comment)</span> -&gt;</span> comment.here <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> comment.multiline)\n          commentsNode = <span class=\"hljs-keyword\">new</span> IdentifierLiteral name.value\n          commentsNode.comments = name.comments\n          commentFragments = []\n          @compileCommentFragments o, commentsNode, commentFragments\n          o.scope.comments[name.value] = commentFragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-218\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-218\">&#x00a7;</a>\n              </div>\n              <p>Compile an assignment, delegating to <code>compileDestructuring</code> or\n<code>compileSplice</code> if appropriate. Keep track of the name of the base object\nwe’ve been assigned to, for correct internal references. If the variable\nhas not been seen yet within the current scope, declare it.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    isValue = @variable <span class=\"hljs-keyword\">instanceof</span> Value\n    <span class=\"hljs-keyword\">if</span> isValue</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-219\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-219\">&#x00a7;</a>\n              </div>\n              <p>If <code>@variable</code> is an array or an object, we’re destructuring;\nif it’s also <code>isAssignable()</code>, the destructuring syntax is supported\nin ES and we can output it as is; otherwise we <code>@compileDestructuring</code>\nand convert this ES-unsupported destructuring into acceptable output.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> @variable.isArray() <span class=\"hljs-keyword\">or</span> @variable.isObject()\n        <span class=\"hljs-keyword\">unless</span> @variable.isAssignable()\n          <span class=\"hljs-keyword\">if</span> @variable.isObject() <span class=\"hljs-keyword\">and</span> @variable.base.hasSplat()\n            <span class=\"hljs-keyword\">return</span> @compileObjectDestruct o\n          <span class=\"hljs-keyword\">else</span>\n            <span class=\"hljs-keyword\">return</span> @compileDestructuring o\n\n      <span class=\"hljs-keyword\">return</span> @compileSplice       o <span class=\"hljs-keyword\">if</span> @variable.isSplice()\n      <span class=\"hljs-keyword\">return</span> @compileConditional  o <span class=\"hljs-keyword\">if</span> @isConditional()\n      <span class=\"hljs-keyword\">return</span> @compileSpecialMath  o <span class=\"hljs-keyword\">if</span> @context <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;//=&#x27;</span>, <span class=\"hljs-string\">&#x27;%%=&#x27;</span>]\n\n    @addScopeVariables o\n    <span class=\"hljs-keyword\">if</span> @value <span class=\"hljs-keyword\">instanceof</span> Code\n      <span class=\"hljs-keyword\">if</span> @value.isStatic\n        @value.name = @variable.properties[<span class=\"hljs-number\">0</span>]\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @variable.properties?.length &gt;= <span class=\"hljs-number\">2</span>\n        [properties..., prototype, name] = @variable.properties\n        @value.name = name <span class=\"hljs-keyword\">if</span> prototype.name?.value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;prototype&#x27;</span>\n\n    val = @value.compileToFragments o, LEVEL_LIST\n    compiledName = @variable.compileToFragments o, LEVEL_LIST\n\n    <span class=\"hljs-keyword\">if</span> @context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span>\n      <span class=\"hljs-keyword\">if</span> @variable.shouldCache()\n        compiledName.unshift @makeCode <span class=\"hljs-string\">&#x27;[&#x27;</span>\n        compiledName.push @makeCode <span class=\"hljs-string\">&#x27;]&#x27;</span>\n      <span class=\"hljs-keyword\">return</span> compiledName.concat @makeCode(<span class=\"hljs-string\">&#x27;: &#x27;</span>), val\n\n    answer = compiledName.concat @makeCode(<span class=\"hljs-string\">&quot; <span class=\"hljs-subst\">#{ @context <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&#x27;=&#x27;</span> }</span> &quot;</span>), val</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-220\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-220\">&#x00a7;</a>\n              </div>\n              <p>Per <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Assignment_without_declaration\">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Assignment_without_declaration</a>,\nif we’re destructuring without declaring, the destructuring assignment must be wrapped in parentheses.\nThe assignment is wrapped in parentheses if ‘o.level’ has lower precedence than LEVEL_LIST (3)\n(i.e. LEVEL_COND (4), LEVEL_OP (5) or LEVEL_ACCESS (6)), or if we’re destructuring object, e.g. {a,b} = obj.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> o.level &gt; LEVEL_LIST <span class=\"hljs-keyword\">or</span> isValue <span class=\"hljs-keyword\">and</span> @variable.base <span class=\"hljs-keyword\">instanceof</span> Obj <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @nestedLhs <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> (@param <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">yes</span>)\n      @wrapInParentheses answer\n    <span class=\"hljs-keyword\">else</span>\n      answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-221\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-221\">&#x00a7;</a>\n              </div>\n              <p>Object rest property is not assignable: <code>{{a}...}</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileObjectDestruct: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @variable.base.reorderProperties()\n    {properties: props} = @variable.base\n    [..., splat] = props\n    splatProp = splat.name\n    assigns = []\n    refVal = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">&#x27;ref&#x27;</span>\n    props.splice <span class=\"hljs-number\">-1</span>, <span class=\"hljs-number\">1</span>, <span class=\"hljs-keyword\">new</span> Splat refVal\n    assigns.push <span class=\"hljs-keyword\">new</span> Assign(<span class=\"hljs-keyword\">new</span> Value(<span class=\"hljs-keyword\">new</span> Obj props), @value).compileToFragments o, LEVEL_LIST\n    assigns.push <span class=\"hljs-keyword\">new</span> Assign(<span class=\"hljs-keyword\">new</span> Value(splatProp), refVal).compileToFragments o, LEVEL_LIST\n    @joinFragmentArrays assigns, <span class=\"hljs-string\">&#x27;, &#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-222\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-222\">&#x00a7;</a>\n              </div>\n              <p>Brief implementation of recursive pattern matching, when assigning array or\nobject literals to a value. Peeks at their properties to assign inner names.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileDestructuring: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    top       = o.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP\n    {value}   = this\n    {objects} = @variable.base\n    olen      = objects.length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-223\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-223\">&#x00a7;</a>\n              </div>\n              <p>Special-case for <code>{} = a</code> and <code>[] = a</code> (empty patterns).\nCompile to simply <code>a</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> olen <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n      code = value.compileToFragments o\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_OP <span class=\"hljs-keyword\">then</span> @wrapInParentheses code <span class=\"hljs-keyword\">else</span> code\n    [obj] = objects\n\n    @disallowLoneExpansion()\n    {splats, expans, splatsAndExpans} = @getAndCheckSplatsAndExpansions()\n\n    isSplat = splats?.length &gt; <span class=\"hljs-number\">0</span>\n    isExpans = expans?.length &gt; <span class=\"hljs-number\">0</span>\n\n    vvar     = value.compileToFragments o, LEVEL_LIST\n    vvarText = fragmentsToText vvar\n    assigns  = []\n<span class=\"hljs-function\">    <span class=\"hljs-title\">pushAssign</span> = <span class=\"hljs-params\">(variable, val)</span> =&gt;</span>\n      assigns.push <span class=\"hljs-keyword\">new</span> Assign(variable, val, <span class=\"hljs-literal\">null</span>, param: @param, subpattern: <span class=\"hljs-literal\">yes</span>).compileToFragments o, LEVEL_LIST\n\n    <span class=\"hljs-keyword\">if</span> isSplat\n      splatVar = objects[splats[<span class=\"hljs-number\">0</span>]].name.unwrap()\n      <span class=\"hljs-keyword\">if</span> splatVar <span class=\"hljs-keyword\">instanceof</span> Arr <span class=\"hljs-keyword\">or</span> splatVar <span class=\"hljs-keyword\">instanceof</span> Obj\n        splatVarRef = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">&#x27;ref&#x27;</span>\n        objects[splats[<span class=\"hljs-number\">0</span>]].name = splatVarRef\n<span class=\"hljs-function\">        <span class=\"hljs-title\">splatVarAssign</span> = -&gt;</span> pushAssign <span class=\"hljs-keyword\">new</span> Value(splatVar), splatVarRef</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-224\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-224\">&#x00a7;</a>\n              </div>\n              <p>At this point, there are several things to destructure. So the <code>fn()</code> in\n<code>{a, b} = fn()</code> must be cached, for example. Make vvar into a simple\nvariable if it isn’t already.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> value.unwrap() <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral <span class=\"hljs-keyword\">or</span> @variable.assigns(vvarText)\n      ref = o.scope.freeVariable <span class=\"hljs-string\">&#x27;ref&#x27;</span>\n      assigns.push [@makeCode(ref + <span class=\"hljs-string\">&#x27; = &#x27;</span>), vvar...]\n      vvar = [@makeCode ref]\n      vvarText = ref\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">slicer</span> = <span class=\"hljs-params\">(type)</span> -&gt;</span> (vvar, start, end = <span class=\"hljs-literal\">no</span>) -&gt;\n      vvar = <span class=\"hljs-keyword\">new</span> IdentifierLiteral vvar <span class=\"hljs-keyword\">unless</span> vvar <span class=\"hljs-keyword\">instanceof</span> Value\n      args = [vvar, <span class=\"hljs-keyword\">new</span> NumberLiteral(start)]\n      args.push <span class=\"hljs-keyword\">new</span> NumberLiteral end <span class=\"hljs-keyword\">if</span> end\n      slice = <span class=\"hljs-keyword\">new</span> Value (<span class=\"hljs-keyword\">new</span> IdentifierLiteral utility type, o), [<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName <span class=\"hljs-string\">&#x27;call&#x27;</span>]\n      <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Call slice, args</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-225\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-225\">&#x00a7;</a>\n              </div>\n              <p>Helper which outputs <code>[].slice</code> code.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    compSlice = slicer <span class=\"hljs-string\">&quot;slice&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-226\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-226\">&#x00a7;</a>\n              </div>\n              <p>Helper which outputs <code>[].splice</code> code.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    compSplice = slicer <span class=\"hljs-string\">&quot;splice&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-227\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-227\">&#x00a7;</a>\n              </div>\n              <p>Check if <code>objects</code> array contains any instance of <code>Assign</code>, e.g. {a:1}.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">    <span class=\"hljs-title\">hasObjAssigns</span> = <span class=\"hljs-params\">(objs)</span> -&gt;</span>\n      (i <span class=\"hljs-keyword\">for</span> obj, i <span class=\"hljs-keyword\">in</span> objs <span class=\"hljs-keyword\">when</span> obj <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> obj.context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-228\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-228\">&#x00a7;</a>\n              </div>\n              <p>Check if <code>objects</code> array contains any unassignable object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">    <span class=\"hljs-title\">objIsUnassignable</span> = <span class=\"hljs-params\">(objs)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">for</span> obj <span class=\"hljs-keyword\">in</span> objs <span class=\"hljs-keyword\">when</span> <span class=\"hljs-keyword\">not</span> obj.isAssignable()\n      <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-229\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-229\">&#x00a7;</a>\n              </div>\n              <p><code>objects</code> are complex when there is object assign ({a:1}),\nunassignable object, or just a single node.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">    <span class=\"hljs-title\">complexObjects</span> = <span class=\"hljs-params\">(objs)</span> -&gt;</span>\n      hasObjAssigns(objs).length <span class=\"hljs-keyword\">or</span> objIsUnassignable(objs) <span class=\"hljs-keyword\">or</span> olen <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-230\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-230\">&#x00a7;</a>\n              </div>\n              <p>“Complex” <code>objects</code> are processed in a loop.\nExamples: [a, b, {c, r…}, d], [a, …, {b, r…}, c, d]</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">    <span class=\"hljs-title\">loopObjects</span> = <span class=\"hljs-params\">(objs, vvar, vvarTxt)</span> =&gt;</span>\n      <span class=\"hljs-keyword\">for</span> obj, i <span class=\"hljs-keyword\">in</span> objs</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-231\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-231\">&#x00a7;</a>\n              </div>\n              <p><code>Elision</code> can be skipped.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">continue</span> <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Elision</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-232\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-232\">&#x00a7;</a>\n              </div>\n              <p>If <code>obj</code> is {a: 1}</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> obj.context <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;object&#x27;</span>\n          {variable: {base: idx}, value: vvar} = obj\n          {variable: vvar} = vvar <span class=\"hljs-keyword\">if</span> vvar <span class=\"hljs-keyword\">instanceof</span> Assign\n          idx =\n            <span class=\"hljs-keyword\">if</span> vvar.this\n              vvar.properties[<span class=\"hljs-number\">0</span>].name\n            <span class=\"hljs-keyword\">else</span>\n              <span class=\"hljs-keyword\">new</span> PropertyName vvar.unwrap().value\n          acc = idx.unwrap() <span class=\"hljs-keyword\">instanceof</span> PropertyName\n          vval = <span class=\"hljs-keyword\">new</span> Value value, [<span class=\"hljs-keyword\">new</span> (<span class=\"hljs-keyword\">if</span> acc <span class=\"hljs-keyword\">then</span> Access <span class=\"hljs-keyword\">else</span> Index) idx]\n        <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-233\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-233\">&#x00a7;</a>\n              </div>\n              <p><code>obj</code> is [a…], {a…} or a</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          vvar = <span class=\"hljs-keyword\">switch</span>\n            <span class=\"hljs-keyword\">when</span> obj <span class=\"hljs-keyword\">instanceof</span> Splat <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">new</span> Value obj.name\n            <span class=\"hljs-keyword\">else</span> obj\n          vval = <span class=\"hljs-keyword\">switch</span>\n            <span class=\"hljs-keyword\">when</span> obj <span class=\"hljs-keyword\">instanceof</span> Splat <span class=\"hljs-keyword\">then</span> compSlice(vvarTxt, i)\n            <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Literal(vvarTxt), [<span class=\"hljs-keyword\">new</span> Index <span class=\"hljs-keyword\">new</span> NumberLiteral i]\n        message = isUnassignable vvar.unwrap().value\n        vvar.error message <span class=\"hljs-keyword\">if</span> message\n        pushAssign vvar, vval</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-234\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-234\">&#x00a7;</a>\n              </div>\n              <p>“Simple” <code>objects</code> can be split and compiled to arrays, [a, b, c] = arr, [a, b, c…] = arr</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">    <span class=\"hljs-title\">assignObjects</span> = <span class=\"hljs-params\">(objs, vvar, vvarTxt)</span> =&gt;</span>\n      vvar = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Arr(objs, <span class=\"hljs-literal\">yes</span>)\n      vval = <span class=\"hljs-keyword\">if</span> vvarTxt <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">then</span> vvarTxt <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Literal(vvarTxt)\n      pushAssign vvar, vval\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">processObjects</span> = <span class=\"hljs-params\">(objs, vvar, vvarTxt)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">if</span> complexObjects objs\n        loopObjects objs, vvar, vvarTxt\n      <span class=\"hljs-keyword\">else</span>\n        assignObjects objs, vvar, vvarTxt</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-235\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-235\">&#x00a7;</a>\n              </div>\n              <p>In case there is <code>Splat</code> or <code>Expansion</code> in <code>objects</code>,\nwe can split array in two simple subarrays.\n<code>Splat</code> [a, b, c…, d, e] can be split into  [a, b, c…] and [d, e].\n<code>Expansion</code> [a, b, …, c, d] can be split into [a, b] and [c, d].\nExamples:\na) <code>Splat</code>\n  CS: [a, b, c…, d, e] = arr\n  JS: [a, b, …c] = arr, [d, e] = splice.call(c, -2)\nb) <code>Expansion</code>\n  CS: [a, b, …, d, e] = arr\n  JS: [a, b] = arr, [d, e] = slice.call(arr, -2)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> splatsAndExpans.length\n      expIdx = splatsAndExpans[<span class=\"hljs-number\">0</span>]\n      leftObjs = objects.slice <span class=\"hljs-number\">0</span>, expIdx + (<span class=\"hljs-keyword\">if</span> isSplat <span class=\"hljs-keyword\">then</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-number\">0</span>)\n      rightObjs = objects.slice expIdx + <span class=\"hljs-number\">1</span>\n      processObjects leftObjs, vvar, vvarText <span class=\"hljs-keyword\">if</span> leftObjs.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">if</span> rightObjs.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-236\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-236\">&#x00a7;</a>\n              </div>\n              <p>Slice or splice <code>objects</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        refExp = <span class=\"hljs-keyword\">switch</span>\n          <span class=\"hljs-keyword\">when</span> isSplat <span class=\"hljs-keyword\">then</span> compSplice <span class=\"hljs-keyword\">new</span> Value(objects[expIdx].name), rightObjs.length * <span class=\"hljs-number\">-1</span>\n          <span class=\"hljs-keyword\">when</span> isExpans <span class=\"hljs-keyword\">then</span> compSlice vvarText, rightObjs.length * <span class=\"hljs-number\">-1</span>\n        <span class=\"hljs-keyword\">if</span> complexObjects rightObjs\n          restVar = refExp\n          refExp = o.scope.freeVariable <span class=\"hljs-string\">&#x27;ref&#x27;</span>\n          assigns.push [@makeCode(refExp + <span class=\"hljs-string\">&#x27; = &#x27;</span>), restVar.compileToFragments(o, LEVEL_LIST)...]\n        processObjects rightObjs, vvar, refExp\n    <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-237\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-237\">&#x00a7;</a>\n              </div>\n              <p>There is no <code>Splat</code> or <code>Expansion</code> in <code>objects</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      processObjects objects, vvar, vvarText\n    splatVarAssign?()\n    assigns.push vvar <span class=\"hljs-keyword\">unless</span> top <span class=\"hljs-keyword\">or</span> @subpattern\n    fragments = @joinFragmentArrays assigns, <span class=\"hljs-string\">&#x27;, &#x27;</span>\n    <span class=\"hljs-keyword\">if</span> o.level &lt; LEVEL_LIST <span class=\"hljs-keyword\">then</span> fragments <span class=\"hljs-keyword\">else</span> @wrapInParentheses fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-238\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-238\">&#x00a7;</a>\n              </div>\n              <p>Disallow <code>[...] = a</code> for some reason. (Could be equivalent to <code>[] = a</code>?)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  disallowLoneExpansion: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> @variable.base <span class=\"hljs-keyword\">instanceof</span> Arr\n    {objects} = @variable.base\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> objects?.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span>\n    [loneObject] = objects\n    <span class=\"hljs-keyword\">if</span> loneObject <span class=\"hljs-keyword\">instanceof</span> Expansion\n      loneObject.error <span class=\"hljs-string\">&#x27;Destructuring assignment has no target&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-239\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-239\">&#x00a7;</a>\n              </div>\n              <p>Show error if there is more than one <code>Splat</code>, or <code>Expansion</code>.\nExamples: [a, b, c…, d, e, f…], [a, b, …, c, d, …], [a, b, …, c, d, e…]</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  getAndCheckSplatsAndExpansions: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> {splats: [], expans: [], splatsAndExpans: []} <span class=\"hljs-keyword\">unless</span> @variable.base <span class=\"hljs-keyword\">instanceof</span> Arr\n    {objects} = @variable.base</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-240\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-240\">&#x00a7;</a>\n              </div>\n              <p>Count all <code>Splats</code>: [a, b, c…, d, e]</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    splats = (i <span class=\"hljs-keyword\">for</span> obj, i <span class=\"hljs-keyword\">in</span> objects <span class=\"hljs-keyword\">when</span> obj <span class=\"hljs-keyword\">instanceof</span> Splat)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-241\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-241\">&#x00a7;</a>\n              </div>\n              <p>Count all <code>Expansions</code>: [a, b, …, c, d]</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    expans = (i <span class=\"hljs-keyword\">for</span> obj, i <span class=\"hljs-keyword\">in</span> objects <span class=\"hljs-keyword\">when</span> obj <span class=\"hljs-keyword\">instanceof</span> Expansion)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-242\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-242\">&#x00a7;</a>\n              </div>\n              <p>Combine splats and expansions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    splatsAndExpans = [splats..., expans...]\n    <span class=\"hljs-keyword\">if</span> splatsAndExpans.length &gt; <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-243\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-243\">&#x00a7;</a>\n              </div>\n              <p>Sort ‘splatsAndExpans’ so we can show error at first disallowed token.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      objects[splatsAndExpans.sort()[<span class=\"hljs-number\">1</span>]].error <span class=\"hljs-string\">&quot;multiple splats/expansions are disallowed in an assignment&quot;</span>\n    {splats, expans, splatsAndExpans}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-244\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-244\">&#x00a7;</a>\n              </div>\n              <p>When compiling a conditional assignment, take care to ensure that the\noperands are only evaluated once, even though we have to reference them\nmore than once.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileConditional: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [left, right] = @variable.cacheReference o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-245\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-245\">&#x00a7;</a>\n              </div>\n              <p>Disallow conditional assignment of undefined variables.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> left.properties.length <span class=\"hljs-keyword\">and</span> left.base <span class=\"hljs-keyword\">instanceof</span> Literal <span class=\"hljs-keyword\">and</span>\n           left.base <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> ThisLiteral <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> o.scope.check left.base.value\n      @throwUnassignableConditionalError left.base.value\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">&quot;?&quot;</span> <span class=\"hljs-keyword\">in</span> @context\n      o.isExistentialEquals = <span class=\"hljs-literal\">true</span>\n      <span class=\"hljs-keyword\">new</span> If(<span class=\"hljs-keyword\">new</span> Existence(left), right, type: <span class=\"hljs-string\">&#x27;if&#x27;</span>).addElse(<span class=\"hljs-keyword\">new</span> Assign(right, @value, <span class=\"hljs-string\">&#x27;=&#x27;</span>)).compileToFragments o\n    <span class=\"hljs-keyword\">else</span>\n      fragments = <span class=\"hljs-keyword\">new</span> Op(@context[...<span class=\"hljs-number\">-1</span>], left, <span class=\"hljs-keyword\">new</span> Assign(right, @value, <span class=\"hljs-string\">&#x27;=&#x27;</span>)).compileToFragments o\n      <span class=\"hljs-keyword\">if</span> o.level &lt;= LEVEL_LIST <span class=\"hljs-keyword\">then</span> fragments <span class=\"hljs-keyword\">else</span> @wrapInParentheses fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-246\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-246\">&#x00a7;</a>\n              </div>\n              <p>Convert special math assignment operators like <code>a //= b</code> to the equivalent\nextended form <code>a = a ** b</code> and then compiles that.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileSpecialMath: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [left, right] = @variable.cacheReference o\n    <span class=\"hljs-keyword\">new</span> Assign(left, <span class=\"hljs-keyword\">new</span> Op(@context[...<span class=\"hljs-number\">-1</span>], right, @value)).compileToFragments o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-247\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-247\">&#x00a7;</a>\n              </div>\n              <p>Compile the assignment from an array splice literal, using JavaScript’s\n<code>Array#splice</code> method.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileSplice: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    {range: {<span class=\"hljs-keyword\">from</span>, to, exclusive}} = @variable.properties.pop()\n    unwrappedVar = @variable.unwrapAll()\n    <span class=\"hljs-keyword\">if</span> unwrappedVar.comments\n      moveComments unwrappedVar, @\n      <span class=\"hljs-keyword\">delete</span> @variable.comments\n    name = @variable.compile o\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">from</span>\n      [fromDecl, fromRef] = @cacheToCodeFragments <span class=\"hljs-keyword\">from</span>.cache o, LEVEL_OP\n    <span class=\"hljs-keyword\">else</span>\n      fromDecl = fromRef = <span class=\"hljs-string\">&#x27;0&#x27;</span>\n    <span class=\"hljs-keyword\">if</span> to\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">from</span>?.isNumber() <span class=\"hljs-keyword\">and</span> to.isNumber()\n        to = to.compile(o) - fromRef\n        to += <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">unless</span> exclusive\n      <span class=\"hljs-keyword\">else</span>\n        to = to.compile(o, LEVEL_ACCESS) + <span class=\"hljs-string\">&#x27; - &#x27;</span> + fromRef\n        to += <span class=\"hljs-string\">&#x27; + 1&#x27;</span> <span class=\"hljs-keyword\">unless</span> exclusive\n    <span class=\"hljs-keyword\">else</span>\n      to = <span class=\"hljs-string\">&quot;9e9&quot;</span>\n    [valDef, valRef] = @value.cache o, LEVEL_LIST\n    answer = [].concat @makeCode(<span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{utility <span class=\"hljs-string\">&#x27;splice&#x27;</span>, o}</span>.apply(<span class=\"hljs-subst\">#{name}</span>, [<span class=\"hljs-subst\">#{fromDecl}</span>, <span class=\"hljs-subst\">#{to}</span>].concat(&quot;</span>), valDef, @makeCode(<span class=\"hljs-string\">&quot;)), &quot;</span>), valRef\n    <span class=\"hljs-keyword\">if</span> o.level &gt; LEVEL_TOP <span class=\"hljs-keyword\">then</span> @wrapInParentheses answer <span class=\"hljs-keyword\">else</span> answer\n\n  eachName: <span class=\"hljs-function\"><span class=\"hljs-params\">(iterator)</span> -&gt;</span>\n    @variable.unwrapAll().eachName iterator\n\n  isDefaultAssignment: <span class=\"hljs-function\">-&gt;</span> @param <span class=\"hljs-keyword\">or</span> @nestedLhs\n\n  propagateLhs: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> @variable?.isArray?() <span class=\"hljs-keyword\">or</span> @variable?.isObject?()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-248\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-248\">&#x00a7;</a>\n              </div>\n              <p>This is the left-hand side of an assignment; let <code>Arr</code> and <code>Obj</code>\nknow that, so that those nodes know that they’re assignable as\ndestructured variables.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @variable.base.propagateLhs <span class=\"hljs-literal\">yes</span>\n\n  throwUnassignableConditionalError: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    @variable.error <span class=\"hljs-string\">&quot;the variable \\&quot;<span class=\"hljs-subst\">#{name}</span>\\&quot; can&#x27;t be assigned with <span class=\"hljs-subst\">#{@context}</span> because it has not been declared before&quot;</span>\n\n  isConditional: <span class=\"hljs-function\">-&gt;</span>\n    @context <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;||=&#x27;</span>, <span class=\"hljs-string\">&#x27;&amp;&amp;=&#x27;</span>, <span class=\"hljs-string\">&#x27;?=&#x27;</span>]\n\n  isStatementAst: NO\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @disallowLoneExpansion()\n    @getAndCheckSplatsAndExpansions()\n    <span class=\"hljs-keyword\">if</span> @isConditional()\n      variable = @variable.unwrap()\n      <span class=\"hljs-keyword\">if</span> variable <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> o.scope.check variable.value\n        @throwUnassignableConditionalError variable.value\n    @addScopeVariables o, allowAssignmentToExpansion: <span class=\"hljs-literal\">yes</span>, allowAssignmentToNontrailingSplat: <span class=\"hljs-literal\">yes</span>, allowAssignmentToEmptyArray: <span class=\"hljs-literal\">yes</span>, allowAssignmentToComplexSplat: <span class=\"hljs-literal\">yes</span>\n    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isDefaultAssignment()\n      <span class=\"hljs-string\">&#x27;AssignmentPattern&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;AssignmentExpression&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    ret =\n      right: @value.ast o, LEVEL_LIST\n      left: @variable.ast o, LEVEL_LIST\n\n    <span class=\"hljs-keyword\">unless</span> @isDefaultAssignment()\n      ret.operator = @originalContext ? <span class=\"hljs-string\">&#x27;=&#x27;</span>\n\n    ret</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-249\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-249\">&#x00a7;</a>\n              </div>\n              <h3 id=\"funcglyph\">FuncGlyph</h3>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n<span class=\"hljs-built_in\">exports</span>.FuncGlyph = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">FuncGlyph</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@glyph)</span> -&gt;</span>\n    super()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-250\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-250\">&#x00a7;</a>\n              </div>\n              <h3 id=\"code\">Code</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-251\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-251\">&#x00a7;</a>\n              </div>\n              <p>A function definition. This is the only node that creates a new Scope.\nWhen for the purposes of walking the contents of a function body, the Code\nhas no <em>children</em> – they’re within the inner scope.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Code = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Code</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(params, body, @funcGlyph, @paramStart)</span> -&gt;</span>\n    super()\n\n    @params      = params <span class=\"hljs-keyword\">or</span> []\n    @body        = body <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">new</span> Block\n    @bound       = @funcGlyph?.glyph <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;=&gt;&#x27;</span>\n    @isGenerator = <span class=\"hljs-literal\">no</span>\n    @isAsync     = <span class=\"hljs-literal\">no</span>\n    @isMethod    = <span class=\"hljs-literal\">no</span>\n\n    @body.traverseChildren <span class=\"hljs-literal\">no</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> =&gt;</span>\n      <span class=\"hljs-keyword\">if</span> (node <span class=\"hljs-keyword\">instanceof</span> Op <span class=\"hljs-keyword\">and</span> node.isYield()) <span class=\"hljs-keyword\">or</span> node <span class=\"hljs-keyword\">instanceof</span> YieldReturn\n        @isGenerator = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">if</span> (node <span class=\"hljs-keyword\">instanceof</span> Op <span class=\"hljs-keyword\">and</span> node.isAwait()) <span class=\"hljs-keyword\">or</span> node <span class=\"hljs-keyword\">instanceof</span> AwaitReturn\n        @isAsync = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> For <span class=\"hljs-keyword\">and</span> node.isAwait()\n        @isAsync = <span class=\"hljs-literal\">yes</span>\n\n    @propagateLhs()\n\n  children: [<span class=\"hljs-string\">&#x27;params&#x27;</span>, <span class=\"hljs-string\">&#x27;body&#x27;</span>]\n\n  isStatement: <span class=\"hljs-function\">-&gt;</span> @isMethod\n\n  jumps: NO\n\n  makeScope: <span class=\"hljs-function\"><span class=\"hljs-params\">(parentScope)</span> -&gt;</span> <span class=\"hljs-keyword\">new</span> Scope parentScope, @body, this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-252\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-252\">&#x00a7;</a>\n              </div>\n              <p>Compilation creates a new scope unless explicitly asked to share with the\nouter scope. Handles splat parameters in the parameter list by setting\nsuch parameters to be the final parameter in the function definition, as\nrequired per the ES2015 spec. If the CoffeeScript function definition had\nparameters after the splat, they are declared via expressions in the\nfunction body.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkForAsyncOrGeneratorConstructor()\n\n    <span class=\"hljs-keyword\">if</span> @bound\n      @context = o.scope.method.context <span class=\"hljs-keyword\">if</span> o.scope.method?.bound\n      @context = <span class=\"hljs-string\">&#x27;this&#x27;</span> <span class=\"hljs-keyword\">unless</span> @context\n\n    @updateOptions o\n    params           = []\n    exprs            = []\n    thisAssignments  = @thisAssignments?.slice() ? []\n    paramsAfterSplat = []\n    haveSplatParam   = <span class=\"hljs-literal\">no</span>\n    haveBodyParam    = <span class=\"hljs-literal\">no</span>\n\n    @checkForDuplicateParams()\n    @disallowLoneExpansionAndMultipleSplats()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-253\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-253\">&#x00a7;</a>\n              </div>\n              <p>Separate <code>this</code> assignments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @eachParamName (name, node, param, obj) -&gt;\n      <span class=\"hljs-keyword\">if</span> node.this\n        name   = node.properties[<span class=\"hljs-number\">0</span>].name.value\n        name   = <span class=\"hljs-string\">&quot;_<span class=\"hljs-subst\">#{name}</span>&quot;</span> <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">in</span> JS_FORBIDDEN\n        target = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable name, reserve: <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-254\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-254\">&#x00a7;</a>\n              </div>\n              <p><code>Param</code> is object destructuring with a default value: ({@prop = 1}) -&gt;\nIn a case when the variable name is already reserved, we have to assign\na new variable name to the destructured variable: ({prop:prop1 = 1}) -&gt;</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        replacement =\n            <span class=\"hljs-keyword\">if</span> param.name <span class=\"hljs-keyword\">instanceof</span> Obj <span class=\"hljs-keyword\">and</span> obj <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span>\n                obj.operatorToken.value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;=&#x27;</span>\n              <span class=\"hljs-keyword\">new</span> Assign (<span class=\"hljs-keyword\">new</span> IdentifierLiteral name), target, <span class=\"hljs-string\">&#x27;object&#x27;</span> <span class=\"hljs-comment\">#, operatorToken: new Literal &#x27;:&#x27;</span>\n            <span class=\"hljs-keyword\">else</span>\n              target\n        param.renameParam node, replacement\n        thisAssignments.push <span class=\"hljs-keyword\">new</span> Assign node, target</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-255\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-255\">&#x00a7;</a>\n              </div>\n              <p>Parse the parameters, adding them to the list of parameters to put in the\nfunction definition; and dealing with splats or expansions, including\nadding expressions to the function body to declare all parameter\nvariables that would have been after the splat/expansion parameter.\nIf we encounter a parameter that needs to be declared in the function\nbody for any reason, for example it’s destructured with <code>this</code>, also\ndeclare and assign all subsequent parameters in the function body so that\nany non-idempotent parameters are evaluated in the correct order.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">for</span> param, i <span class=\"hljs-keyword\">in</span> @params</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-256\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-256\">&#x00a7;</a>\n              </div>\n              <p>Was <code>...</code> used with this parameter? Splat/expansion parameters cannot\nhave default values, so we need not worry about that.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> param.splat <span class=\"hljs-keyword\">or</span> param <span class=\"hljs-keyword\">instanceof</span> Expansion\n        haveSplatParam = <span class=\"hljs-literal\">yes</span>\n        <span class=\"hljs-keyword\">if</span> param.splat\n          <span class=\"hljs-keyword\">if</span> param.name <span class=\"hljs-keyword\">instanceof</span> Arr <span class=\"hljs-keyword\">or</span> param.name <span class=\"hljs-keyword\">instanceof</span> Obj</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-257\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-257\">&#x00a7;</a>\n              </div>\n              <p>Splat arrays are treated oddly by ES; deal with them the legacy\nway in the function body. TODO: Should this be handled in the\nfunction parameter list, and if so, how?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>            splatParamName = o.scope.freeVariable <span class=\"hljs-string\">&#x27;arg&#x27;</span>\n            params.push ref = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> IdentifierLiteral splatParamName\n            exprs.push <span class=\"hljs-keyword\">new</span> Assign <span class=\"hljs-keyword\">new</span> Value(param.name), ref\n          <span class=\"hljs-keyword\">else</span>\n            params.push ref = param.asReference o\n            splatParamName = fragmentsToText ref.compileNodeWithoutComments o\n          <span class=\"hljs-keyword\">if</span> param.shouldCache()\n            exprs.push <span class=\"hljs-keyword\">new</span> Assign <span class=\"hljs-keyword\">new</span> Value(param.name), ref\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-comment\"># `param` is an Expansion</span>\n          splatParamName = o.scope.freeVariable <span class=\"hljs-string\">&#x27;args&#x27;</span>\n          params.push <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> IdentifierLiteral splatParamName\n\n        o.scope.parameter splatParamName</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-258\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-258\">&#x00a7;</a>\n              </div>\n              <p>Parse all other parameters; if a splat paramater has not yet been\nencountered, add these other parameters to the list to be output in\nthe function definition.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">if</span> param.shouldCache() <span class=\"hljs-keyword\">or</span> haveBodyParam\n          param.assignedInBody = <span class=\"hljs-literal\">yes</span>\n          haveBodyParam = <span class=\"hljs-literal\">yes</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-259\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-259\">&#x00a7;</a>\n              </div>\n              <p>This parameter cannot be declared or assigned in the parameter\nlist. So put a reference in the parameter list and add a statement\nto the function body assigning it, e.g.\n<code>(arg) =&gt; { var a = arg.a; }</code>, with a default value if it has one.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">if</span> param.value?\n            condition = <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;===&#x27;</span>, param, <span class=\"hljs-keyword\">new</span> UndefinedLiteral\n            ifTrue = <span class=\"hljs-keyword\">new</span> Assign <span class=\"hljs-keyword\">new</span> Value(param.name), param.value\n            exprs.push <span class=\"hljs-keyword\">new</span> If condition, ifTrue\n          <span class=\"hljs-keyword\">else</span>\n            exprs.push <span class=\"hljs-keyword\">new</span> Assign <span class=\"hljs-keyword\">new</span> Value(param.name), param.asReference(o), <span class=\"hljs-literal\">null</span>, param: <span class=\"hljs-string\">&#x27;alwaysDeclare&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-260\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-260\">&#x00a7;</a>\n              </div>\n              <p>If this parameter comes before the splat or expansion, it will go\nin the function definition parameter list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">unless</span> haveSplatParam</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-261\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-261\">&#x00a7;</a>\n              </div>\n              <p>If this parameter has a default value, and it hasn’t already been\nset by the <code>shouldCache()</code> block above, define it as a statement in\nthe function body. This parameter comes after the splat parameter,\nso we can’t define its default value in the parameter list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">if</span> param.shouldCache()\n            ref = param.asReference o\n          <span class=\"hljs-keyword\">else</span>\n            <span class=\"hljs-keyword\">if</span> param.value? <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> param.assignedInBody\n              ref = <span class=\"hljs-keyword\">new</span> Assign <span class=\"hljs-keyword\">new</span> Value(param.name), param.value, <span class=\"hljs-literal\">null</span>, param: <span class=\"hljs-literal\">yes</span>\n            <span class=\"hljs-keyword\">else</span>\n              ref = param</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-262\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-262\">&#x00a7;</a>\n              </div>\n              <p>Add this parameter’s reference(s) to the function scope.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">if</span> param.name <span class=\"hljs-keyword\">instanceof</span> Arr <span class=\"hljs-keyword\">or</span> param.name <span class=\"hljs-keyword\">instanceof</span> Obj</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-263\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-263\">&#x00a7;</a>\n              </div>\n              <p>This parameter is destructured.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>            param.name.lhs = <span class=\"hljs-literal\">yes</span>\n            <span class=\"hljs-keyword\">unless</span> param.shouldCache()\n              param.name.eachName (prop) -&gt;\n                o.scope.parameter prop.value\n          <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-264\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-264\">&#x00a7;</a>\n              </div>\n              <p>This compilation of the parameter is only to get its name to add\nto the scope name tracking; since the compilation output here\nisn’t kept for eventual output, don’t include comments in this\ncompilation, so that they get output the “real” time this param\nis compiled.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>            paramToAddToScope = <span class=\"hljs-keyword\">if</span> param.value? <span class=\"hljs-keyword\">then</span> param <span class=\"hljs-keyword\">else</span> ref\n            o.scope.parameter fragmentsToText paramToAddToScope.compileToFragmentsWithoutComments o\n          params.push ref\n        <span class=\"hljs-keyword\">else</span>\n          paramsAfterSplat.push param</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-265\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-265\">&#x00a7;</a>\n              </div>\n              <p>If this parameter had a default value, since it’s no longer in the\nfunction parameter list we need to assign its default value\n(if necessary) as an expression in the body.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">if</span> param.value? <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> param.shouldCache()\n            condition = <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;===&#x27;</span>, param, <span class=\"hljs-keyword\">new</span> UndefinedLiteral\n            ifTrue = <span class=\"hljs-keyword\">new</span> Assign <span class=\"hljs-keyword\">new</span> Value(param.name), param.value\n            exprs.push <span class=\"hljs-keyword\">new</span> If condition, ifTrue</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-266\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-266\">&#x00a7;</a>\n              </div>\n              <p>Add this parameter to the scope, since it wouldn’t have been added\nyet since it was skipped earlier.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          o.scope.add param.name.value, <span class=\"hljs-string\">&#x27;var&#x27;</span>, <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> param.name?.value?</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-267\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-267\">&#x00a7;</a>\n              </div>\n              <p>If there were parameters after the splat or expansion parameter, those\nparameters need to be assigned in the body of the function.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> paramsAfterSplat.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-268\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-268\">&#x00a7;</a>\n              </div>\n              <p>Create a destructured assignment, e.g. <code>[a, b, c] = [args..., b, c]</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      exprs.unshift <span class=\"hljs-keyword\">new</span> Assign <span class=\"hljs-keyword\">new</span> Value(\n          <span class=\"hljs-keyword\">new</span> Arr [<span class=\"hljs-keyword\">new</span> Splat(<span class=\"hljs-keyword\">new</span> IdentifierLiteral(splatParamName)), (param.asReference o <span class=\"hljs-keyword\">for</span> param <span class=\"hljs-keyword\">in</span> paramsAfterSplat)...]\n        ), <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> IdentifierLiteral splatParamName</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-269\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-269\">&#x00a7;</a>\n              </div>\n              <p>Add new expressions to the function body</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    wasEmpty = @body.isEmpty()\n    @disallowSuperInParamDefaults()\n    @checkSuperCallsInConstructorBody()\n    @body.expressions.unshift thisAssignments... <span class=\"hljs-keyword\">unless</span> @expandCtorSuper thisAssignments\n    @body.expressions.unshift exprs...\n    <span class=\"hljs-keyword\">if</span> @isMethod <span class=\"hljs-keyword\">and</span> @bound <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @isStatic <span class=\"hljs-keyword\">and</span> @classVariable\n      boundMethodCheck = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Literal utility <span class=\"hljs-string\">&#x27;boundMethodCheck&#x27;</span>, o\n      @body.expressions.unshift <span class=\"hljs-keyword\">new</span> Call(boundMethodCheck, [<span class=\"hljs-keyword\">new</span> Value(<span class=\"hljs-keyword\">new</span> ThisLiteral), @classVariable])\n    @body.makeReturn() <span class=\"hljs-keyword\">unless</span> wasEmpty <span class=\"hljs-keyword\">or</span> @noReturn</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-270\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-270\">&#x00a7;</a>\n              </div>\n              <p>JavaScript doesn’t allow bound (<code>=&gt;</code>) functions to also be generators.\nThis is usually caught via <code>Op::compileContinuation</code>, but double-check:</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> @bound <span class=\"hljs-keyword\">and</span> @isGenerator\n      yieldNode = @body.contains (node) -&gt; node <span class=\"hljs-keyword\">instanceof</span> Op <span class=\"hljs-keyword\">and</span> node.operator <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;yield&#x27;</span>\n      (yieldNode <span class=\"hljs-keyword\">or</span> @).error <span class=\"hljs-string\">&#x27;yield cannot occur inside bound (fat arrow) functions&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-271\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-271\">&#x00a7;</a>\n              </div>\n              <p>Assemble the output</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    modifiers = []\n    modifiers.push <span class=\"hljs-string\">&#x27;static&#x27;</span> <span class=\"hljs-keyword\">if</span> @isMethod <span class=\"hljs-keyword\">and</span> @isStatic\n    modifiers.push <span class=\"hljs-string\">&#x27;async&#x27;</span>  <span class=\"hljs-keyword\">if</span> @isAsync\n    <span class=\"hljs-keyword\">unless</span> @isMethod <span class=\"hljs-keyword\">or</span> @bound\n      modifiers.push <span class=\"hljs-string\">&quot;function<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @isGenerator <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;*&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>}</span>&quot;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @isGenerator\n      modifiers.push <span class=\"hljs-string\">&#x27;*&#x27;</span>\n\n    signature = [@makeCode <span class=\"hljs-string\">&#x27;(&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-272\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-272\">&#x00a7;</a>\n              </div>\n              <p>Block comments between a function name and <code>(</code> get output between\n<code>function</code> and <code>(</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> @paramStart?.comments?\n      @compileCommentFragments o, @paramStart, signature\n    <span class=\"hljs-keyword\">for</span> param, i <span class=\"hljs-keyword\">in</span> params\n      signature.push @makeCode <span class=\"hljs-string\">&#x27;, &#x27;</span> <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n      signature.push @makeCode <span class=\"hljs-string\">&#x27;...&#x27;</span> <span class=\"hljs-keyword\">if</span> haveSplatParam <span class=\"hljs-keyword\">and</span> i <span class=\"hljs-keyword\">is</span> params.length - <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-273\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-273\">&#x00a7;</a>\n              </div>\n              <p>Compile this parameter, but if any generated variables get created\n(e.g. <code>ref</code>), shift those into the parent scope since we can’t put a\n<code>var</code> line inside a function parameter list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      scopeVariablesCount = o.scope.variables.length\n      signature.push param.compileToFragments(o, LEVEL_PAREN)...\n      <span class=\"hljs-keyword\">if</span> scopeVariablesCount <span class=\"hljs-keyword\">isnt</span> o.scope.variables.length\n        generatedVariables = o.scope.variables.splice scopeVariablesCount\n        o.scope.parent.variables.push generatedVariables...\n    signature.push @makeCode <span class=\"hljs-string\">&#x27;)&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-274\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-274\">&#x00a7;</a>\n              </div>\n              <p>Block comments between <code>)</code> and <code>-&gt;</code>/<code>=&gt;</code> get output between <code>)</code> and <code>{</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> @funcGlyph?.comments?\n      comment.unshift = <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">for</span> comment <span class=\"hljs-keyword\">in</span> @funcGlyph.comments\n      @compileCommentFragments o, @funcGlyph, signature\n\n    body = @body.compileWithDeclarations o <span class=\"hljs-keyword\">unless</span> @body.isEmpty()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-275\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-275\">&#x00a7;</a>\n              </div>\n              <p>We need to compile the body before method names to ensure <code>super</code>\nreferences are handled.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> @isMethod\n      [methodScope, o.scope] = [o.scope, o.scope.parent]\n      name = @name.compileToFragments o\n      name.shift() <span class=\"hljs-keyword\">if</span> name[<span class=\"hljs-number\">0</span>].code <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;.&#x27;</span>\n      o.scope = methodScope\n\n    answer = @joinFragmentArrays (@makeCode m <span class=\"hljs-keyword\">for</span> m <span class=\"hljs-keyword\">in</span> modifiers), <span class=\"hljs-string\">&#x27; &#x27;</span>\n    answer.push @makeCode <span class=\"hljs-string\">&#x27; &#x27;</span> <span class=\"hljs-keyword\">if</span> modifiers.length <span class=\"hljs-keyword\">and</span> name\n    answer.push name... <span class=\"hljs-keyword\">if</span> name\n    answer.push signature...\n    answer.push @makeCode <span class=\"hljs-string\">&#x27; =&gt;&#x27;</span> <span class=\"hljs-keyword\">if</span> @bound <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @isMethod\n    answer.push @makeCode <span class=\"hljs-string\">&#x27; {&#x27;</span>\n    answer.push @makeCode(<span class=\"hljs-string\">&#x27;\\n&#x27;</span>), body..., @makeCode(<span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{@tab}</span>&quot;</span>) <span class=\"hljs-keyword\">if</span> body?.length\n    answer.push @makeCode <span class=\"hljs-string\">&#x27;}&#x27;</span>\n\n    <span class=\"hljs-keyword\">return</span> indentInitial answer, @ <span class=\"hljs-keyword\">if</span> @isMethod\n    <span class=\"hljs-keyword\">if</span> @front <span class=\"hljs-keyword\">or</span> (o.level &gt;= LEVEL_ACCESS) <span class=\"hljs-keyword\">then</span> @wrapInParentheses answer <span class=\"hljs-keyword\">else</span> answer\n\n  updateOptions: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o.scope         = del(o, <span class=\"hljs-string\">&#x27;classScope&#x27;</span>) <span class=\"hljs-keyword\">or</span> @makeScope o.scope\n    o.scope.shared  = del(o, <span class=\"hljs-string\">&#x27;sharedScope&#x27;</span>)\n    o.indent        += TAB\n    <span class=\"hljs-keyword\">delete</span> o.bare\n    <span class=\"hljs-keyword\">delete</span> o.isExistentialEquals\n\n  checkForDuplicateParams: <span class=\"hljs-function\">-&gt;</span>\n    paramNames = []\n    @eachParamName (name, node, param) -&gt;\n      node.error <span class=\"hljs-string\">&quot;multiple parameters named &#x27;<span class=\"hljs-subst\">#{name}</span>&#x27;&quot;</span> <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">in</span> paramNames\n      paramNames.push name\n\n  eachParamName: <span class=\"hljs-function\"><span class=\"hljs-params\">(iterator)</span> -&gt;</span>\n    param.eachName iterator <span class=\"hljs-keyword\">for</span> param <span class=\"hljs-keyword\">in</span> @params</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-276\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-276\">&#x00a7;</a>\n              </div>\n              <p>Short-circuit <code>traverseChildren</code> method to prevent it from crossing scope\nboundaries unless <code>crossScope</code> is <code>true</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  traverseChildren: <span class=\"hljs-function\"><span class=\"hljs-params\">(crossScope, func)</span> -&gt;</span>\n    super(crossScope, func) <span class=\"hljs-keyword\">if</span> crossScope</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-277\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-277\">&#x00a7;</a>\n              </div>\n              <p>Short-circuit <code>replaceInContext</code> method to prevent it from crossing context boundaries. Bound\nfunctions have the same context.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  replaceInContext: <span class=\"hljs-function\"><span class=\"hljs-params\">(child, replacement)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @bound\n      super child, replacement\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-literal\">false</span>\n\n  disallowSuperInParamDefaults: <span class=\"hljs-function\"><span class=\"hljs-params\">({forAst} = {})</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span> <span class=\"hljs-keyword\">unless</span> @ctor\n\n    @eachSuperCall Block.wrap(@params), <span class=\"hljs-function\"><span class=\"hljs-params\">(superCall)</span> -&gt;</span>\n      superCall.error <span class=\"hljs-string\">&quot;&#x27;super&#x27; is not allowed in constructor parameter defaults&quot;</span>\n    , checkForThisBeforeSuper: <span class=\"hljs-keyword\">not</span> forAst\n\n  checkSuperCallsInConstructorBody: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span> <span class=\"hljs-keyword\">unless</span> @ctor\n\n    seenSuper = @eachSuperCall @body, <span class=\"hljs-function\"><span class=\"hljs-params\">(superCall)</span> =&gt;</span>\n      superCall.error <span class=\"hljs-string\">&quot;&#x27;super&#x27; is only allowed in derived class constructors&quot;</span> <span class=\"hljs-keyword\">if</span> @ctor <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;base&#x27;</span>\n\n    seenSuper\n\n  flagThisParamInDerivedClassConstructorWithoutCallingSuper: <span class=\"hljs-function\"><span class=\"hljs-params\">(param)</span> -&gt;</span>\n    param.error <span class=\"hljs-string\">&quot;Can&#x27;t use @params in derived class constructors without calling super&quot;</span>\n\n  checkForAsyncOrGeneratorConstructor: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @ctor\n      @name.error <span class=\"hljs-string\">&#x27;Class constructor may not be async&#x27;</span>       <span class=\"hljs-keyword\">if</span> @isAsync\n      @name.error <span class=\"hljs-string\">&#x27;Class constructor may not be a generator&#x27;</span> <span class=\"hljs-keyword\">if</span> @isGenerator\n\n  disallowLoneExpansionAndMultipleSplats: <span class=\"hljs-function\">-&gt;</span>\n    seenSplatParam = <span class=\"hljs-literal\">no</span>\n    <span class=\"hljs-keyword\">for</span> param <span class=\"hljs-keyword\">in</span> @params</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-278\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-278\">&#x00a7;</a>\n              </div>\n              <p>Was <code>...</code> used with this parameter? (Only one such parameter is allowed\nper function.)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> param.splat <span class=\"hljs-keyword\">or</span> param <span class=\"hljs-keyword\">instanceof</span> Expansion\n        <span class=\"hljs-keyword\">if</span> seenSplatParam\n          param.error <span class=\"hljs-string\">&#x27;only one splat or expansion parameter is allowed per function definition&#x27;</span>\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> param <span class=\"hljs-keyword\">instanceof</span> Expansion <span class=\"hljs-keyword\">and</span> @params.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span>\n          param.error <span class=\"hljs-string\">&#x27;an expansion parameter cannot be the only parameter in a function definition&#x27;</span>\n        seenSplatParam = <span class=\"hljs-literal\">yes</span>\n\n  expandCtorSuper: <span class=\"hljs-function\"><span class=\"hljs-params\">(thisAssignments)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span> <span class=\"hljs-keyword\">unless</span> @ctor\n\n    seenSuper = @eachSuperCall @body, <span class=\"hljs-function\"><span class=\"hljs-params\">(superCall)</span> =&gt;</span>\n      superCall.expressions = thisAssignments\n\n    haveThisParam = thisAssignments.length <span class=\"hljs-keyword\">and</span> thisAssignments.length <span class=\"hljs-keyword\">isnt</span> @thisAssignments?.length\n    <span class=\"hljs-keyword\">if</span> @ctor <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;derived&#x27;</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> seenSuper <span class=\"hljs-keyword\">and</span> haveThisParam\n      param = thisAssignments[<span class=\"hljs-number\">0</span>].variable\n      @flagThisParamInDerivedClassConstructorWithoutCallingSuper param\n\n    seenSuper</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-279\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-279\">&#x00a7;</a>\n              </div>\n              <p>Find all super calls in the given context node;\nreturns <code>true</code> if <code>iterator</code> is called.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  eachSuperCall: <span class=\"hljs-function\"><span class=\"hljs-params\">(context, iterator, {checkForThisBeforeSuper = <span class=\"hljs-literal\">yes</span>} = {})</span> -&gt;</span>\n    seenSuper = <span class=\"hljs-literal\">no</span>\n\n    context.traverseChildren <span class=\"hljs-literal\">yes</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(child)</span> =&gt;</span>\n      <span class=\"hljs-keyword\">if</span> child <span class=\"hljs-keyword\">instanceof</span> SuperCall</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-280\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-280\">&#x00a7;</a>\n              </div>\n              <p><code>super</code> in a constructor (the only <code>super</code> without an accessor)\ncannot be given an argument with a reference to <code>this</code>, as that would\nbe referencing <code>this</code> before calling <code>super</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">unless</span> child.variable.accessor\n          childArgs = child.args.filter (arg) -&gt;\n            arg <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Class <span class=\"hljs-keyword\">and</span> (arg <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Code <span class=\"hljs-keyword\">or</span> arg.bound)\n          Block.wrap(childArgs).traverseChildren <span class=\"hljs-literal\">yes</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> =&gt;</span>\n            node.error <span class=\"hljs-string\">&quot;Can&#x27;t call super with @params in derived class constructors&quot;</span> <span class=\"hljs-keyword\">if</span> node.this\n        seenSuper = <span class=\"hljs-literal\">yes</span>\n        iterator child\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> checkForThisBeforeSuper <span class=\"hljs-keyword\">and</span> child <span class=\"hljs-keyword\">instanceof</span> ThisLiteral <span class=\"hljs-keyword\">and</span> @ctor <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;derived&#x27;</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> seenSuper\n        child.error <span class=\"hljs-string\">&quot;Can&#x27;t reference &#x27;this&#x27; before calling super in derived class constructors&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-281\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-281\">&#x00a7;</a>\n              </div>\n              <p><code>super</code> has the same target in bound (arrow) functions, so check them too</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      child <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> SuperCall <span class=\"hljs-keyword\">and</span> (child <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Code <span class=\"hljs-keyword\">or</span> child.bound)\n\n    seenSuper\n\n  propagateLhs: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">for</span> param <span class=\"hljs-keyword\">in</span> @params\n      {name} = param\n      <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">instanceof</span> Arr <span class=\"hljs-keyword\">or</span> name <span class=\"hljs-keyword\">instanceof</span> Obj\n        name.propagateLhs <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> param <span class=\"hljs-keyword\">instanceof</span> Expansion\n        param.lhs = <span class=\"hljs-literal\">yes</span>\n\n  astAddParamsToScope: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @eachParamName (name) -&gt;\n      o.scope.add name, <span class=\"hljs-string\">&#x27;param&#x27;</span>\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @updateOptions o\n    @checkForAsyncOrGeneratorConstructor()\n    @checkForDuplicateParams()\n    @disallowSuperInParamDefaults forAst: <span class=\"hljs-literal\">yes</span>\n    @disallowLoneExpansionAndMultipleSplats()\n    seenSuper = @checkSuperCallsInConstructorBody()\n    <span class=\"hljs-keyword\">if</span> @ctor <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;derived&#x27;</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> seenSuper\n      @eachParamName (name, node) =&gt;\n        <span class=\"hljs-keyword\">if</span> node.this\n          @flagThisParamInDerivedClassConstructorWithoutCallingSuper node\n    @astAddParamsToScope o\n    @body.makeReturn <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">unless</span> @body.isEmpty() <span class=\"hljs-keyword\">or</span> @noReturn\n\n    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isMethod\n      <span class=\"hljs-string\">&#x27;ClassMethod&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @bound\n      <span class=\"hljs-string\">&#x27;ArrowFunctionExpression&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;FunctionExpression&#x27;</span>\n\n  paramForAst: <span class=\"hljs-function\"><span class=\"hljs-params\">(param)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> param <span class=\"hljs-keyword\">if</span> param <span class=\"hljs-keyword\">instanceof</span> Expansion\n    {name, value, splat} = param\n    <span class=\"hljs-keyword\">if</span> splat\n      <span class=\"hljs-keyword\">new</span> Splat name, lhs: <span class=\"hljs-literal\">yes</span>, postfix: splat.postfix\n      .withLocationDataFrom param\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> value?\n      <span class=\"hljs-keyword\">new</span> Assign name, value, <span class=\"hljs-literal\">null</span>, param: <span class=\"hljs-literal\">yes</span>\n      .withLocationDataFrom locationData: mergeLocationData name.locationData, value.locationData\n    <span class=\"hljs-keyword\">else</span>\n      name\n\n  methodAstProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">getIsComputed</span> = =&gt;</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @name <span class=\"hljs-keyword\">instanceof</span> Index\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @name <span class=\"hljs-keyword\">instanceof</span> ComputedPropertyName\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @name.name <span class=\"hljs-keyword\">instanceof</span> ComputedPropertyName\n      <span class=\"hljs-literal\">no</span>\n\n    <span class=\"hljs-keyword\">return</span>\n      static: !!@isStatic\n      key: @name.ast o\n      computed: getIsComputed()\n      kind:\n        <span class=\"hljs-keyword\">if</span> @ctor\n          <span class=\"hljs-string\">&#x27;constructor&#x27;</span>\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-string\">&#x27;method&#x27;</span>\n      operator: @operatorToken?.value ? <span class=\"hljs-string\">&#x27;=&#x27;</span>\n      staticClassName: @isStatic.staticClassName?.ast(o) ? <span class=\"hljs-literal\">null</span>\n      bound: !!@bound\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-built_in\">Object</span>.assign\n      params: @paramForAst(param).ast(o) <span class=\"hljs-keyword\">for</span> param <span class=\"hljs-keyword\">in</span> @params\n      body: @body.ast (<span class=\"hljs-built_in\">Object</span>.assign {}, o, checkForDirectives: <span class=\"hljs-literal\">yes</span>), LEVEL_TOP\n      generator: !!@isGenerator\n      async: !!@isAsync</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-282\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-282\">&#x00a7;</a>\n              </div>\n              <p>We never generate named functions, so specify <code>id</code> as <code>null</code>, which\nmatches the Babel AST for anonymous function expressions/arrow functions</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      id: <span class=\"hljs-literal\">null</span>\n      hasIndentedBody: @body.locationData.first_line &gt; @funcGlyph?.locationData.first_line\n    ,\n      <span class=\"hljs-keyword\">if</span> @isMethod <span class=\"hljs-keyword\">then</span> @methodAstProperties o <span class=\"hljs-keyword\">else</span> {}\n\n  astLocationData: <span class=\"hljs-function\">-&gt;</span>\n    functionLocationData = super()\n    <span class=\"hljs-keyword\">return</span> functionLocationData <span class=\"hljs-keyword\">unless</span> @isMethod\n\n    astLocationData = mergeAstLocationData @name.astLocationData(), functionLocationData\n    <span class=\"hljs-keyword\">if</span> @isStatic.staticClassName?\n      astLocationData = mergeAstLocationData @isStatic.staticClassName.astLocationData(), astLocationData\n    astLocationData</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-283\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-283\">&#x00a7;</a>\n              </div>\n              <h3 id=\"param\">Param</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-284\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-284\">&#x00a7;</a>\n              </div>\n              <p>A parameter in a function definition. Beyond a typical JavaScript parameter,\nthese parameters can also attach themselves to the context of the function,\nas well as be a splat, gathering up a group of parameters into an array.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Param = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Param</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@name, @value, @splat)</span> -&gt;</span>\n    super()\n\n    message = isUnassignable @name.unwrapAll().value\n    @name.error message <span class=\"hljs-keyword\">if</span> message\n    <span class=\"hljs-keyword\">if</span> @name <span class=\"hljs-keyword\">instanceof</span> Obj <span class=\"hljs-keyword\">and</span> @name.generated\n      token = @name.objects[<span class=\"hljs-number\">0</span>].operatorToken\n      token.error <span class=\"hljs-string\">&quot;unexpected <span class=\"hljs-subst\">#{token.value}</span>&quot;</span>\n\n  children: [<span class=\"hljs-string\">&#x27;name&#x27;</span>, <span class=\"hljs-string\">&#x27;value&#x27;</span>]\n\n  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @name.compileToFragments o, LEVEL_LIST\n\n  compileToFragmentsWithoutComments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @name.compileToFragmentsWithoutComments o, LEVEL_LIST\n\n  asReference: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> @reference <span class=\"hljs-keyword\">if</span> @reference\n    node = @name\n    <span class=\"hljs-keyword\">if</span> node.this\n      name = node.properties[<span class=\"hljs-number\">0</span>].name.value\n      name = <span class=\"hljs-string\">&quot;_<span class=\"hljs-subst\">#{name}</span>&quot;</span> <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">in</span> JS_FORBIDDEN\n      node = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable name\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> node.shouldCache()\n      node = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">&#x27;arg&#x27;</span>\n    node = <span class=\"hljs-keyword\">new</span> Value node\n    node.updateLocationDataIfMissing @locationData\n    @reference = node\n\n  shouldCache: <span class=\"hljs-function\">-&gt;</span>\n    @name.shouldCache()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-285\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-285\">&#x00a7;</a>\n              </div>\n              <p>Iterates the name or names of a <code>Param</code>.\nIn a sense, a destructured parameter represents multiple JS parameters. This\nmethod allows to iterate them all.\nThe <code>iterator</code> function will be called as <code>iterator(name, node)</code> where\n<code>name</code> is the name of the parameter and <code>node</code> is the AST node corresponding\nto that name.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  eachName: <span class=\"hljs-function\"><span class=\"hljs-params\">(iterator, name = @name)</span> -&gt;</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">checkAssignabilityOfLiteral</span> = <span class=\"hljs-params\">(literal)</span> -&gt;</span>\n      message = isUnassignable literal.value\n      <span class=\"hljs-keyword\">if</span> message\n        literal.error message\n      <span class=\"hljs-keyword\">unless</span> literal.isAssignable()\n        literal.error <span class=\"hljs-string\">&quot;&#x27;<span class=\"hljs-subst\">#{literal.value}</span>&#x27; can&#x27;t be assigned&quot;</span>\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">atParam</span> = <span class=\"hljs-params\">(obj, originalObj = <span class=\"hljs-literal\">null</span>)</span> =&gt;</span> iterator <span class=\"hljs-string\">&quot;@<span class=\"hljs-subst\">#{obj.properties[<span class=\"hljs-number\">0</span>].name.value}</span>&quot;</span>, obj, @, originalObj\n    <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">instanceof</span> Call\n      name.error <span class=\"hljs-string\">&quot;Function invocation can&#x27;t be assigned&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-286\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-286\">&#x00a7;</a>\n              </div>\n              <ul>\n<li>simple literals <code>foo</code></li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">instanceof</span> Literal\n      checkAssignabilityOfLiteral name\n      <span class=\"hljs-keyword\">return</span> iterator name.value, name, @</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-287\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-287\">&#x00a7;</a>\n              </div>\n              <ul>\n<li>at-params <code>@foo</code></li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">return</span> atParam name <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">instanceof</span> Value\n    <span class=\"hljs-keyword\">for</span> obj <span class=\"hljs-keyword\">in</span> name.objects ? []</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-288\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-288\">&#x00a7;</a>\n              </div>\n              <p>Save original obj.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      nObj = obj</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-289\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-289\">&#x00a7;</a>\n              </div>\n              <ul>\n<li>destructured parameter with default value</li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> obj.context?\n        obj = obj.variable</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-290\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-290\">&#x00a7;</a>\n              </div>\n              <ul>\n<li>assignments within destructured parameters <code>{foo:bar}</code></li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Assign</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-291\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-291\">&#x00a7;</a>\n              </div>\n              <p>… possibly with a default value</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> obj.value <span class=\"hljs-keyword\">instanceof</span> Assign\n          obj = obj.value.variable\n        <span class=\"hljs-keyword\">else</span>\n          obj = obj.value\n        @eachName iterator, obj.unwrap()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-292\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-292\">&#x00a7;</a>\n              </div>\n              <ul>\n<li>splats within destructured parameters <code>[xs...]</code></li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Splat\n        node = obj.name.unwrap()\n        iterator node.value, node, @\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Value</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-293\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-293\">&#x00a7;</a>\n              </div>\n              <ul>\n<li>destructured parameters within destructured parameters <code>[{a}]</code></li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> obj.isArray() <span class=\"hljs-keyword\">or</span> obj.isObject()\n          @eachName iterator, obj.base</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-294\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-294\">&#x00a7;</a>\n              </div>\n              <ul>\n<li>at-params within destructured parameters <code>{@foo}</code></li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> obj.this\n          atParam obj, nObj</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-295\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-295\">&#x00a7;</a>\n              </div>\n              <ul>\n<li>simple destructured parameters {foo}</li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">else</span>\n          checkAssignabilityOfLiteral obj.base\n          iterator obj.base.value, obj.base, @\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">instanceof</span> Elision\n        obj\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> obj <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Expansion\n        obj.error <span class=\"hljs-string\">&quot;illegal parameter <span class=\"hljs-subst\">#{obj.compile()}</span>&quot;</span>\n    <span class=\"hljs-keyword\">return</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-296\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-296\">&#x00a7;</a>\n              </div>\n              <p>Rename a param by replacing the given AST node for a name with a new node.\nThis needs to ensure that the the source for object destructuring does not change.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  renameParam: <span class=\"hljs-function\"><span class=\"hljs-params\">(node, newNode)</span> -&gt;</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">isNode</span>      = <span class=\"hljs-params\">(candidate)</span> -&gt;</span> candidate <span class=\"hljs-keyword\">is</span> node\n<span class=\"hljs-function\">    <span class=\"hljs-title\">replacement</span> = <span class=\"hljs-params\">(node, parent)</span> =&gt;</span>\n      <span class=\"hljs-keyword\">if</span> parent <span class=\"hljs-keyword\">instanceof</span> Obj\n        key = node\n        key = node.properties[<span class=\"hljs-number\">0</span>].name <span class=\"hljs-keyword\">if</span> node.this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-297\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-297\">&#x00a7;</a>\n              </div>\n              <p>No need to assign a new variable for the destructured variable if the variable isn’t reserved.\nExamples:\n<code>({@foo}) -&gt;</code>  should compile to <code>({foo}) { this.foo = foo}</code>\n<code>foo = 1; ({@foo}) -&gt;</code> should compile to <code>foo = 1; ({foo:foo1}) { this.foo = foo1 }</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> node.this <span class=\"hljs-keyword\">and</span> key.value <span class=\"hljs-keyword\">is</span> newNode.value\n          <span class=\"hljs-keyword\">new</span> Value newNode\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-keyword\">new</span> Assign <span class=\"hljs-keyword\">new</span> Value(key), newNode, <span class=\"hljs-string\">&#x27;object&#x27;</span>\n      <span class=\"hljs-keyword\">else</span>\n        newNode\n\n    @replaceInContext isNode, replacement</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-298\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-298\">&#x00a7;</a>\n              </div>\n              <h3 id=\"splat\">Splat</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-299\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-299\">&#x00a7;</a>\n              </div>\n              <p>A splat, either as a parameter to a function, an argument to a call,\nor as part of a destructuring assignment.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Splat = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Splat</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, {@lhs, @postfix = <span class=\"hljs-literal\">true</span>} = {})</span> -&gt;</span>\n    super()\n    @name = <span class=\"hljs-keyword\">if</span> name.compile <span class=\"hljs-keyword\">then</span> name <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">new</span> Literal name\n\n  children: [<span class=\"hljs-string\">&#x27;name&#x27;</span>]\n\n  shouldCache: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-literal\">no</span>\n\n  isAssignable: <span class=\"hljs-function\"><span class=\"hljs-params\">({allowComplexSplat = <span class=\"hljs-literal\">no</span>} = {})</span>-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> allowComplexSplat <span class=\"hljs-keyword\">if</span> @name <span class=\"hljs-keyword\">instanceof</span> Obj <span class=\"hljs-keyword\">or</span> @name <span class=\"hljs-keyword\">instanceof</span> Parens\n    @name.isAssignable() <span class=\"hljs-keyword\">and</span> (<span class=\"hljs-keyword\">not</span> @name.isAtomic <span class=\"hljs-keyword\">or</span> @name.isAtomic())\n\n  assigns: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    @name.assigns name\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    compiledSplat = [@makeCode(<span class=\"hljs-string\">&#x27;...&#x27;</span>), @name.compileToFragments(o, LEVEL_OP)...]\n    <span class=\"hljs-keyword\">return</span> compiledSplat <span class=\"hljs-keyword\">unless</span> @jsx\n    <span class=\"hljs-keyword\">return</span> [@makeCode(<span class=\"hljs-string\">&#x27;{&#x27;</span>), compiledSplat..., @makeCode(<span class=\"hljs-string\">&#x27;}&#x27;</span>)]\n\n  unwrap: <span class=\"hljs-function\">-&gt;</span> @name\n\n  propagateLhs: <span class=\"hljs-function\"><span class=\"hljs-params\">(setLhs)</span> -&gt;</span>\n    @lhs = <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> setLhs\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> @lhs\n    @name.propagateLhs? <span class=\"hljs-literal\">yes</span>\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @jsx\n      <span class=\"hljs-string\">&#x27;JSXSpreadAttribute&#x27;</span>\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @lhs\n      <span class=\"hljs-string\">&#x27;RestElement&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;SpreadElement&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span> {\n    argument: @name.ast o, LEVEL_OP\n    @postfix\n  }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-300\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-300\">&#x00a7;</a>\n              </div>\n              <h3 id=\"expansion\">Expansion</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-301\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-301\">&#x00a7;</a>\n              </div>\n              <p>Used to skip values inside an array destructuring (pattern matching) or\nparameter list.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Expansion = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Expansion</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n\n  shouldCache: NO\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @throwLhsError()\n\n  asReference: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    this\n\n  eachName: <span class=\"hljs-function\"><span class=\"hljs-params\">(iterator)</span> -&gt;</span>\n\n  throwLhsError: <span class=\"hljs-function\">-&gt;</span>\n    @error <span class=\"hljs-string\">&#x27;Expansion must be used inside a destructuring assignment or parameter list&#x27;</span>\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">unless</span> @lhs\n      @throwLhsError()\n\n    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;RestElement&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      argument: <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-302\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-302\">&#x00a7;</a>\n              </div>\n              <h3 id=\"elision\">Elision</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-303\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-303\">&#x00a7;</a>\n              </div>\n              <p>Array elision element (for example, [,a, , , b, , c, ,]).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Elision = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Elision</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n\n  isAssignable: YES\n\n  shouldCache: NO\n\n  compileToFragments: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, level)</span> -&gt;</span>\n    fragment = super o, level\n    fragment.isElision = <span class=\"hljs-literal\">yes</span>\n    fragment\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [@makeCode <span class=\"hljs-string\">&#x27;, &#x27;</span>]\n\n  asReference: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    this\n\n  eachName: <span class=\"hljs-function\"><span class=\"hljs-params\">(iterator)</span> -&gt;</span>\n\n  astNode: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-304\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-304\">&#x00a7;</a>\n              </div>\n              <h3 id=\"while\">While</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-305\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-305\">&#x00a7;</a>\n              </div>\n              <p>A while loop, the only sort of low-level loop exposed by CoffeeScript. From\nit, all other loops can be manufactured. Useful in cases where you need more\nflexibility or more speed than a comprehension can provide.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.While = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">While</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@condition, {invert: @inverted, @guard, @isLoop} = {})</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;condition&#x27;</span>, <span class=\"hljs-string\">&#x27;guard&#x27;</span>, <span class=\"hljs-string\">&#x27;body&#x27;</span>]\n\n  isStatement: YES\n\n  makeReturn: <span class=\"hljs-function\"><span class=\"hljs-params\">(results, mark)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> super(results, mark) <span class=\"hljs-keyword\">if</span> results\n    @returns = <span class=\"hljs-keyword\">not</span> @jumps()\n    <span class=\"hljs-keyword\">if</span> mark\n      @body.makeReturn(results, mark) <span class=\"hljs-keyword\">if</span> @returns\n      <span class=\"hljs-keyword\">return</span>\n    this\n\n  addBody: <span class=\"hljs-function\"><span class=\"hljs-params\">(@body)</span> -&gt;</span>\n    this\n\n  jumps: <span class=\"hljs-function\">-&gt;</span>\n    {expressions} = @body\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> expressions.length\n    <span class=\"hljs-keyword\">for</span> node <span class=\"hljs-keyword\">in</span> expressions\n      <span class=\"hljs-keyword\">return</span> jumpNode <span class=\"hljs-keyword\">if</span> jumpNode = node.jumps loop: <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-306\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-306\">&#x00a7;</a>\n              </div>\n              <p>The main difference from a JavaScript <em>while</em> is that the CoffeeScript\n<em>while</em> can be used as a part of a larger expression – while loops may\nreturn an array containing the computed result of each iteration.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o.indent += TAB\n    set      = <span class=\"hljs-string\">&#x27;&#x27;</span>\n    {body}   = this\n    <span class=\"hljs-keyword\">if</span> body.isEmpty()\n      body = @makeCode <span class=\"hljs-string\">&#x27;&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">if</span> @returns\n        body.makeReturn rvar = o.scope.freeVariable <span class=\"hljs-string\">&#x27;results&#x27;</span>\n        set  = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@tab}</span><span class=\"hljs-subst\">#{rvar}</span> = [];\\n&quot;</span>\n      <span class=\"hljs-keyword\">if</span> @guard\n        <span class=\"hljs-keyword\">if</span> body.expressions.length &gt; <span class=\"hljs-number\">1</span>\n          body.expressions.unshift <span class=\"hljs-keyword\">new</span> If (<span class=\"hljs-keyword\">new</span> Parens @guard).invert(), <span class=\"hljs-keyword\">new</span> StatementLiteral <span class=\"hljs-string\">&quot;continue&quot;</span>\n        <span class=\"hljs-keyword\">else</span>\n          body = Block.wrap [<span class=\"hljs-keyword\">new</span> If @guard, body] <span class=\"hljs-keyword\">if</span> @guard\n      body = [].concat @makeCode(<span class=\"hljs-string\">&quot;\\n&quot;</span>), (body.compileToFragments o, LEVEL_TOP), @makeCode(<span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{@tab}</span>&quot;</span>)\n    answer = [].concat @makeCode(set + @tab + <span class=\"hljs-string\">&quot;while (&quot;</span>), @processedCondition().compileToFragments(o, LEVEL_PAREN),\n      @makeCode(<span class=\"hljs-string\">&quot;) {&quot;</span>), body, @makeCode(<span class=\"hljs-string\">&quot;}&quot;</span>)\n    <span class=\"hljs-keyword\">if</span> @returns\n      answer.push @makeCode <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{@tab}</span>return <span class=\"hljs-subst\">#{rvar}</span>;&quot;</span>\n    answer\n\n  processedCondition: <span class=\"hljs-function\">-&gt;</span>\n    @processedConditionCache ?= <span class=\"hljs-keyword\">if</span> @inverted <span class=\"hljs-keyword\">then</span> @condition.invert() <span class=\"hljs-keyword\">else</span> @condition\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;WhileStatement&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      test: @condition.ast o, LEVEL_PAREN\n      body: @body.ast o, LEVEL_TOP\n      guard: @guard?.ast(o) ? <span class=\"hljs-literal\">null</span>\n      inverted: !!@inverted\n      postfix: !!@postfix\n      loop: !!@isLoop</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-307\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-307\">&#x00a7;</a>\n              </div>\n              <h3 id=\"op\">Op</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-308\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-308\">&#x00a7;</a>\n              </div>\n              <p>Simple Arithmetic and logical operations. Performs some conversion from\nCoffeeScript operations into their JavaScript equivalents.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Op = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Op</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(op, first, second, flip, {@invertOperator, @originalOperator = op} = {})</span> -&gt;</span>\n    super()\n\n    <span class=\"hljs-keyword\">if</span> op <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;new&#x27;</span>\n      <span class=\"hljs-keyword\">if</span> ((firstCall = unwrapped = first.unwrap()) <span class=\"hljs-keyword\">instanceof</span> Call <span class=\"hljs-keyword\">or</span> (firstCall = unwrapped.base) <span class=\"hljs-keyword\">instanceof</span> Call) <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> firstCall.<span class=\"hljs-keyword\">do</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> firstCall.isNew\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> Value firstCall.newInstance(), <span class=\"hljs-keyword\">if</span> firstCall <span class=\"hljs-keyword\">is</span> unwrapped <span class=\"hljs-keyword\">then</span> [] <span class=\"hljs-keyword\">else</span> unwrapped.properties\n      first = <span class=\"hljs-keyword\">new</span> Parens first <span class=\"hljs-keyword\">unless</span> first <span class=\"hljs-keyword\">instanceof</span> Parens <span class=\"hljs-keyword\">or</span> first.unwrap() <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral <span class=\"hljs-keyword\">or</span> first.hasProperties?()\n      call = <span class=\"hljs-keyword\">new</span> Call first, []\n      call.locationData = @locationData\n      call.isNew = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">return</span> call\n\n    @operator = CONVERSIONS[op] <span class=\"hljs-keyword\">or</span> op\n    @first    = first\n    @second   = second\n    @flip     = !!flip\n\n    <span class=\"hljs-keyword\">if</span> @operator <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;--&#x27;</span>, <span class=\"hljs-string\">&#x27;++&#x27;</span>]\n      message = isUnassignable @first.unwrapAll().value\n      @first.error message <span class=\"hljs-keyword\">if</span> message\n\n    <span class=\"hljs-keyword\">return</span> this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-309\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-309\">&#x00a7;</a>\n              </div>\n              <p>The map of conversions from CoffeeScript to JavaScript symbols.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  CONVERSIONS =\n    <span class=\"hljs-string\">&#x27;==&#x27;</span>:        <span class=\"hljs-string\">&#x27;===&#x27;</span>\n    <span class=\"hljs-string\">&#x27;!=&#x27;</span>:        <span class=\"hljs-string\">&#x27;!==&#x27;</span>\n    <span class=\"hljs-string\">&#x27;of&#x27;</span>:        <span class=\"hljs-string\">&#x27;in&#x27;</span>\n    <span class=\"hljs-string\">&#x27;yieldfrom&#x27;</span>: <span class=\"hljs-string\">&#x27;yield*&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-310\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-310\">&#x00a7;</a>\n              </div>\n              <p>The map of invertible operators.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  INVERSIONS =\n    <span class=\"hljs-string\">&#x27;!==&#x27;</span>: <span class=\"hljs-string\">&#x27;===&#x27;</span>\n    <span class=\"hljs-string\">&#x27;===&#x27;</span>: <span class=\"hljs-string\">&#x27;!==&#x27;</span>\n\n  children: [<span class=\"hljs-string\">&#x27;first&#x27;</span>, <span class=\"hljs-string\">&#x27;second&#x27;</span>]\n\n  isNumber: <span class=\"hljs-function\">-&gt;</span>\n    @isUnary() <span class=\"hljs-keyword\">and</span> @operator <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;+&#x27;</span>, <span class=\"hljs-string\">&#x27;-&#x27;</span>] <span class=\"hljs-keyword\">and</span>\n      @first <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> @first.isNumber()\n\n  isAwait: <span class=\"hljs-function\">-&gt;</span>\n    @operator <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;await&#x27;</span>\n\n  isYield: <span class=\"hljs-function\">-&gt;</span>\n    @operator <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;yield&#x27;</span>, <span class=\"hljs-string\">&#x27;yield*&#x27;</span>]\n\n  isUnary: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">not</span> @second\n\n  shouldCache: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">not</span> @isNumber()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-311\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-311\">&#x00a7;</a>\n              </div>\n              <p>Am I capable of\n<a href=\"https://docs.python.org/3/reference/expressions.html#not-in\">Python-style comparison chaining</a>?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  isChainable: <span class=\"hljs-function\">-&gt;</span>\n    @operator <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;&lt;&#x27;</span>, <span class=\"hljs-string\">&#x27;&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;&gt;=&#x27;</span>, <span class=\"hljs-string\">&#x27;&lt;=&#x27;</span>, <span class=\"hljs-string\">&#x27;===&#x27;</span>, <span class=\"hljs-string\">&#x27;!==&#x27;</span>]\n\n  isChain: <span class=\"hljs-function\">-&gt;</span>\n    @isChainable() <span class=\"hljs-keyword\">and</span> @first.isChainable()\n\n  invert: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isInOperator()\n      @invertOperator = <span class=\"hljs-string\">&#x27;!&#x27;</span>\n      <span class=\"hljs-keyword\">return</span> @\n    <span class=\"hljs-keyword\">if</span> @isChain()\n      allInvertable = <span class=\"hljs-literal\">yes</span>\n      curr = this\n      <span class=\"hljs-keyword\">while</span> curr <span class=\"hljs-keyword\">and</span> curr.operator\n        allInvertable <span class=\"hljs-keyword\">and</span>= (curr.operator <span class=\"hljs-keyword\">of</span> INVERSIONS)\n        curr = curr.first\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> Parens(this).invert() <span class=\"hljs-keyword\">unless</span> allInvertable\n      curr = this\n      <span class=\"hljs-keyword\">while</span> curr <span class=\"hljs-keyword\">and</span> curr.operator\n        curr.invert = !curr.invert\n        curr.operator = INVERSIONS[curr.operator]\n        curr = curr.first\n      this\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> op = INVERSIONS[@operator]\n      @operator = op\n      <span class=\"hljs-keyword\">if</span> @first.unwrap() <span class=\"hljs-keyword\">instanceof</span> Op\n        @first.invert()\n      this\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @second\n      <span class=\"hljs-keyword\">new</span> Parens(this).invert()\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @operator <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;!&#x27;</span> <span class=\"hljs-keyword\">and</span> (fst = @first.unwrap()) <span class=\"hljs-keyword\">instanceof</span> Op <span class=\"hljs-keyword\">and</span>\n                                  fst.operator <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;!&#x27;</span>, <span class=\"hljs-string\">&#x27;in&#x27;</span>, <span class=\"hljs-string\">&#x27;instanceof&#x27;</span>]\n      fst\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;!&#x27;</span>, this\n\n  unfoldSoak: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @operator <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;++&#x27;</span>, <span class=\"hljs-string\">&#x27;--&#x27;</span>, <span class=\"hljs-string\">&#x27;delete&#x27;</span>] <span class=\"hljs-keyword\">and</span> unfoldSoak o, this, <span class=\"hljs-string\">&#x27;first&#x27;</span>\n\n  generateDo: <span class=\"hljs-function\"><span class=\"hljs-params\">(exp)</span> -&gt;</span>\n    passedParams = []\n    func = <span class=\"hljs-keyword\">if</span> exp <span class=\"hljs-keyword\">instanceof</span> Assign <span class=\"hljs-keyword\">and</span> (ref = exp.value.unwrap()) <span class=\"hljs-keyword\">instanceof</span> Code\n      ref\n    <span class=\"hljs-keyword\">else</span>\n      exp\n    <span class=\"hljs-keyword\">for</span> param <span class=\"hljs-keyword\">in</span> func.params <span class=\"hljs-keyword\">or</span> []\n      <span class=\"hljs-keyword\">if</span> param.value\n        passedParams.push param.value\n        <span class=\"hljs-keyword\">delete</span> param.value\n      <span class=\"hljs-keyword\">else</span>\n        passedParams.push param\n    call = <span class=\"hljs-keyword\">new</span> Call exp, passedParams\n    call.<span class=\"hljs-keyword\">do</span> = <span class=\"hljs-literal\">yes</span>\n    call\n\n  isInOperator: <span class=\"hljs-function\">-&gt;</span>\n    @originalOperator <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;in&#x27;</span>\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isInOperator()\n      inNode = <span class=\"hljs-keyword\">new</span> In @first, @second\n      <span class=\"hljs-keyword\">return</span> (<span class=\"hljs-keyword\">if</span> @invertOperator <span class=\"hljs-keyword\">then</span> inNode.invert() <span class=\"hljs-keyword\">else</span> inNode).compileNode o\n    <span class=\"hljs-keyword\">if</span> @invertOperator\n      @invertOperator = <span class=\"hljs-literal\">null</span>\n      <span class=\"hljs-keyword\">return</span> @invert().compileNode(o)\n    <span class=\"hljs-keyword\">return</span> Op::generateDo(@first).compileNode o <span class=\"hljs-keyword\">if</span> @operator <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;do&#x27;</span>\n    isChain = @isChain()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-312\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-312\">&#x00a7;</a>\n              </div>\n              <p>In chains, there’s no need to wrap bare obj literals in parens,\nas the chained expression is wrapped.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @first.front = @front <span class=\"hljs-keyword\">unless</span> isChain\n    @checkDeleteOperand o\n    <span class=\"hljs-keyword\">return</span> @compileContinuation o <span class=\"hljs-keyword\">if</span> @isYield() <span class=\"hljs-keyword\">or</span> @isAwait()\n    <span class=\"hljs-keyword\">return</span> @compileUnary        o <span class=\"hljs-keyword\">if</span> @isUnary()\n    <span class=\"hljs-keyword\">return</span> @compileChain        o <span class=\"hljs-keyword\">if</span> isChain\n    <span class=\"hljs-keyword\">switch</span> @operator\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;?&#x27;</span>  <span class=\"hljs-keyword\">then</span> @compileExistence o, @second.isDefaultValue\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;//&#x27;</span> <span class=\"hljs-keyword\">then</span> @compileFloorDivision o\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;%%&#x27;</span> <span class=\"hljs-keyword\">then</span> @compileModulo o\n      <span class=\"hljs-keyword\">else</span>\n        lhs = @first.compileToFragments o, LEVEL_OP\n        rhs = @second.compileToFragments o, LEVEL_OP\n        answer = [].concat lhs, @makeCode(<span class=\"hljs-string\">&quot; <span class=\"hljs-subst\">#{@operator}</span> &quot;</span>), rhs\n        <span class=\"hljs-keyword\">if</span> o.level &lt;= LEVEL_OP <span class=\"hljs-keyword\">then</span> answer <span class=\"hljs-keyword\">else</span> @wrapInParentheses answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-313\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-313\">&#x00a7;</a>\n              </div>\n              <p>Mimic Python’s chained comparisons when multiple comparison operators are\nused sequentially. For example:</p>\n<pre><code>bin/coffee -e <span class=\"hljs-string\">&#x27;console.log 50 &lt; 65 &gt; 10&#x27;</span>\n<span class=\"hljs-literal\">true</span>\n</code></pre>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileChain: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [@first.second, shared] = @first.second.cache o\n    fst = @first.compileToFragments o, LEVEL_OP\n    fragments = fst.concat @makeCode(<span class=\"hljs-string\">&quot; <span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @invert <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;&amp;&amp;&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;||&#x27;</span>}</span> &quot;</span>),\n      (shared.compileToFragments o), @makeCode(<span class=\"hljs-string\">&quot; <span class=\"hljs-subst\">#{@operator}</span> &quot;</span>), (@second.compileToFragments o, LEVEL_OP)\n    @wrapInParentheses fragments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-314\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-314\">&#x00a7;</a>\n              </div>\n              <p>Keep reference to the left expression, unless this an existential assignment</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileExistence: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, checkOnlyUndefined)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @first.shouldCache()\n      ref = <span class=\"hljs-keyword\">new</span> IdentifierLiteral o.scope.freeVariable <span class=\"hljs-string\">&#x27;ref&#x27;</span>\n      fst = <span class=\"hljs-keyword\">new</span> Parens <span class=\"hljs-keyword\">new</span> Assign ref, @first\n    <span class=\"hljs-keyword\">else</span>\n      fst = @first\n      ref = fst\n    <span class=\"hljs-keyword\">new</span> If(<span class=\"hljs-keyword\">new</span> Existence(fst, checkOnlyUndefined), ref, type: <span class=\"hljs-string\">&#x27;if&#x27;</span>).addElse(@second).compileToFragments o</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-315\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-315\">&#x00a7;</a>\n              </div>\n              <p>Compile a unary <strong>Op</strong>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileUnary: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    parts = []\n    op = @operator\n    parts.push [@makeCode op]\n    <span class=\"hljs-keyword\">if</span> op <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;!&#x27;</span> <span class=\"hljs-keyword\">and</span> @first <span class=\"hljs-keyword\">instanceof</span> Existence\n      @first.negated = <span class=\"hljs-keyword\">not</span> @first.negated\n      <span class=\"hljs-keyword\">return</span> @first.compileToFragments o\n    <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_ACCESS\n      <span class=\"hljs-keyword\">return</span> (<span class=\"hljs-keyword\">new</span> Parens this).compileToFragments o\n    plusMinus = op <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;+&#x27;</span>, <span class=\"hljs-string\">&#x27;-&#x27;</span>]\n    parts.push [@makeCode(<span class=\"hljs-string\">&#x27; &#x27;</span>)] <span class=\"hljs-keyword\">if</span> op <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;typeof&#x27;</span>, <span class=\"hljs-string\">&#x27;delete&#x27;</span>] <span class=\"hljs-keyword\">or</span>\n                      plusMinus <span class=\"hljs-keyword\">and</span> @first <span class=\"hljs-keyword\">instanceof</span> Op <span class=\"hljs-keyword\">and</span> @first.operator <span class=\"hljs-keyword\">is</span> op\n    <span class=\"hljs-keyword\">if</span> plusMinus <span class=\"hljs-keyword\">and</span> @first <span class=\"hljs-keyword\">instanceof</span> Op\n      @first = <span class=\"hljs-keyword\">new</span> Parens @first\n    parts.push @first.compileToFragments o, LEVEL_OP\n    parts.reverse() <span class=\"hljs-keyword\">if</span> @flip\n    @joinFragmentArrays parts, <span class=\"hljs-string\">&#x27;&#x27;</span>\n\n  compileContinuation: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    parts = []\n    op = @operator\n    @checkContinuation o <span class=\"hljs-keyword\">unless</span> @isAwait()\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-string\">&#x27;expression&#x27;</span> <span class=\"hljs-keyword\">in</span> <span class=\"hljs-built_in\">Object</span>.keys(@first) <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> (@first <span class=\"hljs-keyword\">instanceof</span> Throw)\n      parts.push @first.expression.compileToFragments o, LEVEL_OP <span class=\"hljs-keyword\">if</span> @first.expression?\n    <span class=\"hljs-keyword\">else</span>\n      parts.push [@makeCode <span class=\"hljs-string\">&quot;(&quot;</span>] <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_PAREN\n      parts.push [@makeCode op]\n      parts.push [@makeCode <span class=\"hljs-string\">&quot; &quot;</span>] <span class=\"hljs-keyword\">if</span> @first.base?.value <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n      parts.push @first.compileToFragments o, LEVEL_OP\n      parts.push [@makeCode <span class=\"hljs-string\">&quot;)&quot;</span>] <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_PAREN\n    @joinFragmentArrays parts, <span class=\"hljs-string\">&#x27;&#x27;</span>\n\n  checkContinuation: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">unless</span> o.scope.parent?\n      @error <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@operator}</span> can only occur inside functions&quot;</span>\n    <span class=\"hljs-keyword\">if</span> o.scope.method?.bound <span class=\"hljs-keyword\">and</span> o.scope.method.isGenerator\n      @error <span class=\"hljs-string\">&#x27;yield cannot occur inside bound (fat arrow) functions&#x27;</span>\n\n  compileFloorDivision: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    floor = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> IdentifierLiteral(<span class=\"hljs-string\">&#x27;Math&#x27;</span>), [<span class=\"hljs-keyword\">new</span> Access <span class=\"hljs-keyword\">new</span> PropertyName <span class=\"hljs-string\">&#x27;floor&#x27;</span>]\n    second = <span class=\"hljs-keyword\">if</span> @second.shouldCache() <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">new</span> Parens @second <span class=\"hljs-keyword\">else</span> @second\n    div = <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;/&#x27;</span>, @first, second\n    <span class=\"hljs-keyword\">new</span> Call(floor, [div]).compileToFragments o\n\n  compileModulo: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    mod = <span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Literal utility <span class=\"hljs-string\">&#x27;modulo&#x27;</span>, o\n    <span class=\"hljs-keyword\">new</span> Call(mod, [@first, @second]).compileToFragments o\n\n  toString: <span class=\"hljs-function\"><span class=\"hljs-params\">(idt)</span> -&gt;</span>\n    super idt, @constructor.name + <span class=\"hljs-string\">&#x27; &#x27;</span> + @operator\n\n  checkDeleteOperand: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @operator <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;delete&#x27;</span> <span class=\"hljs-keyword\">and</span> o.scope.check(@first.unwrapAll().value)\n      @error <span class=\"hljs-string\">&#x27;delete operand may not be argument or var&#x27;</span>\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkContinuation o <span class=\"hljs-keyword\">if</span> @isYield()\n    @checkDeleteOperand o\n    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">&#x27;AwaitExpression&#x27;</span> <span class=\"hljs-keyword\">if</span> @isAwait()\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">&#x27;YieldExpression&#x27;</span> <span class=\"hljs-keyword\">if</span> @isYield()\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">&#x27;ChainedComparison&#x27;</span> <span class=\"hljs-keyword\">if</span> @isChain()\n    <span class=\"hljs-keyword\">switch</span> @operator\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;||&#x27;</span>, <span class=\"hljs-string\">&#x27;&amp;&amp;&#x27;</span>, <span class=\"hljs-string\">&#x27;?&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;LogicalExpression&#x27;</span>\n      <span class=\"hljs-keyword\">when</span> <span class=\"hljs-string\">&#x27;++&#x27;</span>, <span class=\"hljs-string\">&#x27;--&#x27;</span>      <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;UpdateExpression&#x27;</span>\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">if</span> @isUnary()      <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;UnaryExpression&#x27;</span>\n        <span class=\"hljs-keyword\">else</span>                    <span class=\"hljs-string\">&#x27;BinaryExpression&#x27;</span>\n\n  operatorAst: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @invertOperator <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@invertOperator}</span> &quot;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>}</span><span class=\"hljs-subst\">#{@originalOperator}</span>&quot;</span>\n\n  chainAstProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    operators = [@operatorAst()]\n    operands = [@second]\n    currentOp = @first\n    <span class=\"hljs-keyword\">loop</span>\n      operators.unshift currentOp.operatorAst()\n      operands.unshift currentOp.second\n      currentOp = currentOp.first\n      <span class=\"hljs-keyword\">unless</span> currentOp.isChainable()\n        operands.unshift currentOp\n        <span class=\"hljs-keyword\">break</span>\n    <span class=\"hljs-keyword\">return</span> {\n      operators\n      operands: (operand.ast(o, LEVEL_OP) <span class=\"hljs-keyword\">for</span> operand <span class=\"hljs-keyword\">in</span> operands)\n    }\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> @chainAstProperties(o) <span class=\"hljs-keyword\">if</span> @isChain()\n\n    firstAst = @first.ast o, LEVEL_OP\n    secondAst = @second?.ast o, LEVEL_OP\n    operatorAst = @operatorAst()\n    <span class=\"hljs-keyword\">switch</span>\n      <span class=\"hljs-keyword\">when</span> @isUnary()\n        argument =\n          <span class=\"hljs-keyword\">if</span> @isYield() <span class=\"hljs-keyword\">and</span> @first.unwrap().value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n            <span class=\"hljs-literal\">null</span>\n          <span class=\"hljs-keyword\">else</span>\n            firstAst\n        <span class=\"hljs-keyword\">return</span> {argument} <span class=\"hljs-keyword\">if</span> @isAwait()\n        <span class=\"hljs-keyword\">return</span> {\n          argument\n          delegate: @operator <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;yield*&#x27;</span>\n        } <span class=\"hljs-keyword\">if</span> @isYield()\n        <span class=\"hljs-keyword\">return</span> {\n          argument\n          operator: operatorAst\n          prefix: !@flip\n        }\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-keyword\">return</span>\n          left: firstAst\n          right: secondAst\n          operator: operatorAst</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-316\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-316\">&#x00a7;</a>\n              </div>\n              <h3 id=\"in\">In</h3>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.In = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">In</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@object, @array)</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;object&#x27;</span>, <span class=\"hljs-string\">&#x27;array&#x27;</span>]\n\n  invert: NEGATE\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @array <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> @array.isArray() <span class=\"hljs-keyword\">and</span> @array.base.objects.length\n      <span class=\"hljs-keyword\">for</span> obj <span class=\"hljs-keyword\">in</span> @array.base.objects <span class=\"hljs-keyword\">when</span> obj <span class=\"hljs-keyword\">instanceof</span> Splat\n        hasSplat = <span class=\"hljs-literal\">yes</span>\n        <span class=\"hljs-keyword\">break</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-317\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-317\">&#x00a7;</a>\n              </div>\n              <p><code>compileOrTest</code> only if we have an array literal with no splats</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">return</span> @compileOrTest o <span class=\"hljs-keyword\">unless</span> hasSplat\n    @compileLoopTest o\n\n  compileOrTest: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [sub, ref] = @object.cache o, LEVEL_OP\n    [cmp, cnj] = <span class=\"hljs-keyword\">if</span> @negated <span class=\"hljs-keyword\">then</span> [<span class=\"hljs-string\">&#x27; !== &#x27;</span>, <span class=\"hljs-string\">&#x27; &amp;&amp; &#x27;</span>] <span class=\"hljs-keyword\">else</span> [<span class=\"hljs-string\">&#x27; === &#x27;</span>, <span class=\"hljs-string\">&#x27; || &#x27;</span>]\n    tests = []\n    <span class=\"hljs-keyword\">for</span> item, i <span class=\"hljs-keyword\">in</span> @array.base.objects\n      <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">then</span> tests.push @makeCode cnj\n      tests = tests.concat (<span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">then</span> ref <span class=\"hljs-keyword\">else</span> sub), @makeCode(cmp), item.compileToFragments(o, LEVEL_ACCESS)\n    <span class=\"hljs-keyword\">if</span> o.level &lt; LEVEL_OP <span class=\"hljs-keyword\">then</span> tests <span class=\"hljs-keyword\">else</span> @wrapInParentheses tests\n\n  compileLoopTest: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    [sub, ref] = @object.cache o, LEVEL_LIST\n    fragments = [].concat @makeCode(utility(<span class=\"hljs-string\">&#x27;indexOf&#x27;</span>, o) + <span class=\"hljs-string\">&quot;.call(&quot;</span>), @array.compileToFragments(o, LEVEL_LIST),\n      @makeCode(<span class=\"hljs-string\">&quot;, &quot;</span>), ref, @makeCode(<span class=\"hljs-string\">&quot;) &quot;</span> + <span class=\"hljs-keyword\">if</span> @negated <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;&lt; 0&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&gt;= 0&#x27;</span>)\n    <span class=\"hljs-keyword\">return</span> fragments <span class=\"hljs-keyword\">if</span> fragmentsToText(sub) <span class=\"hljs-keyword\">is</span> fragmentsToText(ref)\n    fragments = sub.concat @makeCode(<span class=\"hljs-string\">&#x27;, &#x27;</span>), fragments\n    <span class=\"hljs-keyword\">if</span> o.level &lt; LEVEL_LIST <span class=\"hljs-keyword\">then</span> fragments <span class=\"hljs-keyword\">else</span> @wrapInParentheses fragments\n\n  toString: <span class=\"hljs-function\"><span class=\"hljs-params\">(idt)</span> -&gt;</span>\n    super idt, @constructor.name + <span class=\"hljs-keyword\">if</span> @negated <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;!&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-318\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-318\">&#x00a7;</a>\n              </div>\n              <h3 id=\"try\">Try</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-319\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-319\">&#x00a7;</a>\n              </div>\n              <p>A classic <em>try/catch/finally</em> block.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Try = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Try</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@attempt, @catch, @ensure, @finallyTag)</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;attempt&#x27;</span>, <span class=\"hljs-string\">&#x27;catch&#x27;</span>, <span class=\"hljs-string\">&#x27;ensure&#x27;</span>]\n\n  isStatement: YES\n\n  jumps: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span> @attempt.jumps(o) <span class=\"hljs-keyword\">or</span> @catch?.jumps(o)\n\n  makeReturn: <span class=\"hljs-function\"><span class=\"hljs-params\">(results, mark)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> mark\n      @attempt?.makeReturn results, mark\n      @catch?.makeReturn results, mark\n      <span class=\"hljs-keyword\">return</span>\n    @attempt = @attempt.makeReturn results <span class=\"hljs-keyword\">if</span> @attempt\n    @catch   = @catch  .makeReturn results <span class=\"hljs-keyword\">if</span> @catch\n    this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-320\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-320\">&#x00a7;</a>\n              </div>\n              <p>Compilation is more or less as you would expect – the <em>finally</em> clause\nis optional, the <em>catch</em> is not.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    originalIndent = o.indent\n    o.indent  += TAB\n    tryPart   = @attempt.compileToFragments o, LEVEL_TOP\n\n    catchPart = <span class=\"hljs-keyword\">if</span> @catch\n      @catch.compileToFragments merge(o, indent: originalIndent), LEVEL_TOP\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">unless</span> @ensure <span class=\"hljs-keyword\">or</span> @catch\n      generatedErrorVariableName = o.scope.freeVariable <span class=\"hljs-string\">&#x27;error&#x27;</span>, reserve: <span class=\"hljs-literal\">no</span>\n      [@makeCode(<span class=\"hljs-string\">&quot; catch (<span class=\"hljs-subst\">#{generatedErrorVariableName}</span>) {}&quot;</span>)]\n    <span class=\"hljs-keyword\">else</span>\n      []\n\n    ensurePart = <span class=\"hljs-keyword\">if</span> @ensure <span class=\"hljs-keyword\">then</span> ([].concat @makeCode(<span class=\"hljs-string\">&quot; finally {\\n&quot;</span>), @ensure.compileToFragments(o, LEVEL_TOP),\n      @makeCode(<span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{@tab}</span>}&quot;</span>)) <span class=\"hljs-keyword\">else</span> []\n\n    [].concat @makeCode(<span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@tab}</span>try {\\n&quot;</span>),\n      tryPart,\n      @makeCode(<span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{@tab}</span>}&quot;</span>), catchPart, ensurePart\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;TryStatement&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      block: @attempt.ast o, LEVEL_TOP\n      handler: @catch?.ast(o) ? <span class=\"hljs-literal\">null</span>\n      finalizer:\n        <span class=\"hljs-keyword\">if</span> @ensure?\n          <span class=\"hljs-built_in\">Object</span>.assign @ensure.ast(o, LEVEL_TOP),</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-321\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-321\">&#x00a7;</a>\n              </div>\n              <p>Include <code>finally</code> keyword in location data.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>            mergeAstLocationData(\n              jisonLocationDataToAstLocationData(@finallyTag.locationData),\n              @ensure.astLocationData()\n            )\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-literal\">null</span>\n\n<span class=\"hljs-built_in\">exports</span>.Catch = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Catch</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@recovery, @errorVariable)</span> -&gt;</span>\n    super()\n    @errorVariable?.unwrap().propagateLhs? <span class=\"hljs-literal\">yes</span>\n\n  children: [<span class=\"hljs-string\">&#x27;recovery&#x27;</span>, <span class=\"hljs-string\">&#x27;errorVariable&#x27;</span>]\n\n  isStatement: YES\n\n  jumps: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span> @recovery.jumps o\n\n  makeReturn: <span class=\"hljs-function\"><span class=\"hljs-params\">(results, mark)</span> -&gt;</span>\n    ret = @recovery.makeReturn results, mark\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> mark\n    @recovery = ret\n    this\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o.indent  += TAB\n    generatedErrorVariableName = o.scope.freeVariable <span class=\"hljs-string\">&#x27;error&#x27;</span>, reserve: <span class=\"hljs-literal\">no</span>\n    placeholder = <span class=\"hljs-keyword\">new</span> IdentifierLiteral generatedErrorVariableName\n    @checkUnassignable()\n    <span class=\"hljs-keyword\">if</span> @errorVariable\n      @recovery.unshift <span class=\"hljs-keyword\">new</span> Assign @errorVariable, placeholder\n    [].concat @makeCode(<span class=\"hljs-string\">&quot; catch (&quot;</span>), placeholder.compileToFragments(o), @makeCode(<span class=\"hljs-string\">&quot;) {\\n&quot;</span>),\n      @recovery.compileToFragments(o, LEVEL_TOP), @makeCode(<span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{@tab}</span>}&quot;</span>)\n\n  checkUnassignable: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @errorVariable\n      message = isUnassignable @errorVariable.unwrapAll().value\n      @errorVariable.error message <span class=\"hljs-keyword\">if</span> message\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @checkUnassignable()\n    @errorVariable?.eachName (name) -&gt;\n      alreadyDeclared = o.scope.find name.value\n      name.isDeclaration = <span class=\"hljs-keyword\">not</span> alreadyDeclared\n\n    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;CatchClause&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      param: @errorVariable?.ast(o) ? <span class=\"hljs-literal\">null</span>\n      body: @recovery.ast o, LEVEL_TOP</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-322\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-322\">&#x00a7;</a>\n              </div>\n              <h3 id=\"throw\">Throw</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-323\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-323\">&#x00a7;</a>\n              </div>\n              <p>Simple node to throw an exception.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Throw = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Throw</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@expression)</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;expression&#x27;</span>]\n\n  isStatement: YES\n  jumps:       NO</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-324\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-324\">&#x00a7;</a>\n              </div>\n              <p>A <strong>Throw</strong> is already a return, of sorts…</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  makeReturn: THIS\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    fragments = @expression.compileToFragments o, LEVEL_LIST\n    unshiftAfterComments fragments, @makeCode <span class=\"hljs-string\">&#x27;throw &#x27;</span>\n    fragments.unshift @makeCode @tab\n    fragments.push @makeCode <span class=\"hljs-string\">&#x27;;&#x27;</span>\n    fragments\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;ThrowStatement&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      argument: @expression.ast o, LEVEL_LIST</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-325\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-325\">&#x00a7;</a>\n              </div>\n              <h3 id=\"existence\">Existence</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-326\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-326\">&#x00a7;</a>\n              </div>\n              <p>Checks a variable for existence – not <code>null</code> and not <code>undefined</code>. This is\nsimilar to <code>.nil?</code> in Ruby, and avoids having to consult a JavaScript truth\ntable. Optionally only check if a variable is not <code>undefined</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Existence = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Existence</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@expression, onlyNotUndefined = <span class=\"hljs-literal\">no</span>)</span> -&gt;</span>\n    super()\n    @comparisonTarget = <span class=\"hljs-keyword\">if</span> onlyNotUndefined <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;undefined&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;null&#x27;</span>\n    salvagedComments = []\n    @expression.traverseChildren <span class=\"hljs-literal\">yes</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(child)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">if</span> child.comments\n        <span class=\"hljs-keyword\">for</span> comment <span class=\"hljs-keyword\">in</span> child.comments\n          salvagedComments.push comment <span class=\"hljs-keyword\">unless</span> comment <span class=\"hljs-keyword\">in</span> salvagedComments\n        <span class=\"hljs-keyword\">delete</span> child.comments\n    attachCommentsToNode salvagedComments, @\n    moveComments @expression, @\n\n  children: [<span class=\"hljs-string\">&#x27;expression&#x27;</span>]\n\n  invert: NEGATE\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @expression.front = @front\n    code = @expression.compile o, LEVEL_OP\n    <span class=\"hljs-keyword\">if</span> @expression.unwrap() <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> o.scope.check code\n      [cmp, cnj] = <span class=\"hljs-keyword\">if</span> @negated <span class=\"hljs-keyword\">then</span> [<span class=\"hljs-string\">&#x27;===&#x27;</span>, <span class=\"hljs-string\">&#x27;||&#x27;</span>] <span class=\"hljs-keyword\">else</span> [<span class=\"hljs-string\">&#x27;!==&#x27;</span>, <span class=\"hljs-string\">&#x27;&amp;&amp;&#x27;</span>]\n      code = <span class=\"hljs-string\">&quot;typeof <span class=\"hljs-subst\">#{code}</span> <span class=\"hljs-subst\">#{cmp}</span> \\&quot;undefined\\&quot;&quot;</span> + <span class=\"hljs-keyword\">if</span> @comparisonTarget <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;undefined&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot; <span class=\"hljs-subst\">#{cnj}</span> <span class=\"hljs-subst\">#{code}</span> <span class=\"hljs-subst\">#{cmp}</span> <span class=\"hljs-subst\">#{@comparisonTarget}</span>&quot;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n    <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-327\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-327\">&#x00a7;</a>\n              </div>\n              <p>We explicity want to use loose equality (<code>==</code>) when comparing against <code>null</code>,\nso that an existence check roughly corresponds to a check for truthiness.\nDo <em>not</em> change this to <code>===</code> for <code>null</code>, as this will break mountains of\nexisting code. When comparing only against <code>undefined</code>, however, we want to\nuse <code>===</code> because this use case is for parity with ES2015+ default values,\nwhich only get assigned when the variable is <code>undefined</code> (but not <code>null</code>).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      cmp = <span class=\"hljs-keyword\">if</span> @comparisonTarget <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;null&#x27;</span>\n        <span class=\"hljs-keyword\">if</span> @negated <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;==&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;!=&#x27;</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-comment\"># `undefined`</span>\n        <span class=\"hljs-keyword\">if</span> @negated <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;===&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;!==&#x27;</span>\n      code = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{code}</span> <span class=\"hljs-subst\">#{cmp}</span> <span class=\"hljs-subst\">#{@comparisonTarget}</span>&quot;</span>\n    [@makeCode(<span class=\"hljs-keyword\">if</span> o.level &lt;= LEVEL_COND <span class=\"hljs-keyword\">then</span> code <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&quot;(<span class=\"hljs-subst\">#{code}</span>)&quot;</span>)]\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;UnaryExpression&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      argument: @expression.ast o\n      operator: <span class=\"hljs-string\">&#x27;?&#x27;</span>\n      prefix: <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-328\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-328\">&#x00a7;</a>\n              </div>\n              <h3 id=\"parens\">Parens</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-329\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-329\">&#x00a7;</a>\n              </div>\n              <p>An extra set of parentheses, specified explicitly in the source. At one time\nwe tried to clean up the results by detecting and removing redundant\nparentheses, but no longer – you can put in as many as you please.</p>\n<p>Parentheses are a good way to force any statement to become an expression.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Parens = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Parens</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@body)</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;body&#x27;</span>]\n\n  unwrap: <span class=\"hljs-function\">-&gt;</span> @body\n\n  shouldCache: <span class=\"hljs-function\">-&gt;</span> @body.shouldCache()\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    expr = @body.unwrap()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-330\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-330\">&#x00a7;</a>\n              </div>\n              <p>If these parentheses are wrapping an <code>IdentifierLiteral</code> followed by a\nblock comment, output the parentheses (or put another way, don’t optimize\naway these redundant parentheses). This is because Flow requires\nparentheses in certain circumstances to distinguish identifiers followed\nby comment-based type annotations from JavaScript labels.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    shouldWrapComment = expr.comments?.some(\n      <span class=\"hljs-function\"><span class=\"hljs-params\">(comment)</span> -&gt;</span> comment.here <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> comment.unshift <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> comment.newLine)\n    <span class=\"hljs-keyword\">if</span> expr <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> expr.isAtomic() <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @jsxAttribute <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> shouldWrapComment\n      expr.front = @front\n      <span class=\"hljs-keyword\">return</span> expr.compileToFragments o\n    fragments = expr.compileToFragments o, LEVEL_PAREN\n    bare = o.level &lt; LEVEL_OP <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> shouldWrapComment <span class=\"hljs-keyword\">and</span> (\n        expr <span class=\"hljs-keyword\">instanceof</span> Op <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> expr.isInOperator() <span class=\"hljs-keyword\">or</span> expr.unwrap() <span class=\"hljs-keyword\">instanceof</span> Call <span class=\"hljs-keyword\">or</span>\n        (expr <span class=\"hljs-keyword\">instanceof</span> For <span class=\"hljs-keyword\">and</span> expr.returns)\n      ) <span class=\"hljs-keyword\">and</span> (o.level &lt; LEVEL_COND <span class=\"hljs-keyword\">or</span> fragments.length &lt;= <span class=\"hljs-number\">3</span>)\n    <span class=\"hljs-keyword\">return</span> @wrapInBraces fragments <span class=\"hljs-keyword\">if</span> @jsxAttribute\n    <span class=\"hljs-keyword\">if</span> bare <span class=\"hljs-keyword\">then</span> fragments <span class=\"hljs-keyword\">else</span> @wrapInParentheses fragments\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span> @body.unwrap().ast o, LEVEL_PAREN</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-331\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-331\">&#x00a7;</a>\n              </div>\n              <h3 id=\"stringwithinterpolations\">StringWithInterpolations</h3>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n<span class=\"hljs-built_in\">exports</span>.StringWithInterpolations = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">StringWithInterpolations</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@body, {@quote, @startQuote, @jsxAttribute} = {})</span> -&gt;</span>\n    super()\n\n  @fromStringLiteral: <span class=\"hljs-function\"><span class=\"hljs-params\">(stringLiteral)</span> -&gt;</span>\n    updatedString = stringLiteral.withoutQuotesInLocationData()\n    updatedStringValue = <span class=\"hljs-keyword\">new</span> Value(updatedString).withLocationDataFrom updatedString\n    <span class=\"hljs-keyword\">new</span> StringWithInterpolations Block.wrap([updatedStringValue]), quote: stringLiteral.quote, jsxAttribute: stringLiteral.jsxAttribute\n    .withLocationDataFrom stringLiteral\n\n  children: [<span class=\"hljs-string\">&#x27;body&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-332\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-332\">&#x00a7;</a>\n              </div>\n              <p><code>unwrap</code> returns <code>this</code> to stop ancestor nodes reaching in to grab @body,\nand using @body.compileNode. <code>StringWithInterpolations.compileNode</code> is\n<em>the</em> custom logic to output interpolated strings as code.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unwrap: <span class=\"hljs-function\">-&gt;</span> this\n\n  shouldCache: <span class=\"hljs-function\">-&gt;</span> @body.shouldCache()\n\n  extractElements: <span class=\"hljs-function\"><span class=\"hljs-params\">(o, {includeInterpolationWrappers, isJsx} = {})</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-333\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-333\">&#x00a7;</a>\n              </div>\n              <p>Assumes that <code>expr</code> is <code>Block</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    expr = @body.unwrap()\n\n    elements = []\n    salvagedComments = []\n    expr.traverseChildren <span class=\"hljs-literal\">no</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> =&gt;</span>\n      <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> StringLiteral\n        <span class=\"hljs-keyword\">if</span> node.comments\n          salvagedComments.push node.comments...\n          <span class=\"hljs-keyword\">delete</span> node.comments\n        elements.push node\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> Interpolation\n        <span class=\"hljs-keyword\">if</span> salvagedComments.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n          <span class=\"hljs-keyword\">for</span> comment <span class=\"hljs-keyword\">in</span> salvagedComments\n            comment.unshift = <span class=\"hljs-literal\">yes</span>\n            comment.newLine = <span class=\"hljs-literal\">yes</span>\n          attachCommentsToNode salvagedComments, node\n        <span class=\"hljs-keyword\">if</span> (unwrapped = node.expression?.unwrapAll()) <span class=\"hljs-keyword\">instanceof</span> PassthroughLiteral <span class=\"hljs-keyword\">and</span> unwrapped.generated <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> (isJsx <span class=\"hljs-keyword\">and</span> o.compiling)\n          <span class=\"hljs-keyword\">if</span> o.compiling\n            commentPlaceholder = <span class=\"hljs-keyword\">new</span> StringLiteral(<span class=\"hljs-string\">&#x27;&#x27;</span>).withLocationDataFrom node\n            commentPlaceholder.comments = unwrapped.comments\n            (commentPlaceholder.comments ?= []).push node.comments... <span class=\"hljs-keyword\">if</span> node.comments\n            elements.push <span class=\"hljs-keyword\">new</span> Value commentPlaceholder\n          <span class=\"hljs-keyword\">else</span>\n            empty = <span class=\"hljs-keyword\">new</span> Interpolation().withLocationDataFrom node\n            empty.comments = node.comments\n            elements.push empty\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> node.expression <span class=\"hljs-keyword\">or</span> includeInterpolationWrappers\n          (node.expression?.comments ?= []).push node.comments... <span class=\"hljs-keyword\">if</span> node.comments\n          elements.push <span class=\"hljs-keyword\">if</span> includeInterpolationWrappers <span class=\"hljs-keyword\">then</span> node <span class=\"hljs-keyword\">else</span> node.expression\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> node.comments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-334\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-334\">&#x00a7;</a>\n              </div>\n              <p>This node is getting discarded, but salvage its comments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> elements.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> elements[elements.length - <span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> StringLiteral\n          <span class=\"hljs-keyword\">for</span> comment <span class=\"hljs-keyword\">in</span> node.comments\n            comment.unshift = <span class=\"hljs-literal\">no</span>\n            comment.newLine = <span class=\"hljs-literal\">yes</span>\n          attachCommentsToNode node.comments, elements[elements.length - <span class=\"hljs-number\">1</span>]\n        <span class=\"hljs-keyword\">else</span>\n          salvagedComments.push node.comments...\n        <span class=\"hljs-keyword\">delete</span> node.comments\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span>\n\n    elements\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    @comments ?= @startQuote?.comments\n\n    <span class=\"hljs-keyword\">if</span> @jsxAttribute\n      wrapped = <span class=\"hljs-keyword\">new</span> Parens <span class=\"hljs-keyword\">new</span> StringWithInterpolations @body\n      wrapped.jsxAttribute = <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">return</span> wrapped.compileNode o\n\n    elements = @extractElements o, isJsx: @jsx\n\n    fragments = []\n    fragments.push @makeCode <span class=\"hljs-string\">&#x27;`&#x27;</span> <span class=\"hljs-keyword\">unless</span> @jsx\n    <span class=\"hljs-keyword\">for</span> element <span class=\"hljs-keyword\">in</span> elements\n      <span class=\"hljs-keyword\">if</span> element <span class=\"hljs-keyword\">instanceof</span> StringLiteral\n        unquotedElementValue = <span class=\"hljs-keyword\">if</span> @jsx <span class=\"hljs-keyword\">then</span> element.unquotedValueForJSX <span class=\"hljs-keyword\">else</span> element.unquotedValueForTemplateLiteral\n        fragments.push @makeCode unquotedElementValue\n      <span class=\"hljs-keyword\">else</span>\n        fragments.push @makeCode <span class=\"hljs-string\">&#x27;$&#x27;</span> <span class=\"hljs-keyword\">unless</span> @jsx\n        code = element.compileToFragments(o, LEVEL_PAREN)\n        <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> @isNestedTag(element) <span class=\"hljs-keyword\">or</span>\n           code.some(<span class=\"hljs-function\"><span class=\"hljs-params\">(fragment)</span> -&gt;</span> fragment.comments?.some(<span class=\"hljs-function\"><span class=\"hljs-params\">(comment)</span> -&gt;</span> comment.here <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">no</span>))\n          code = @wrapInBraces code</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-335\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-335\">&#x00a7;</a>\n              </div>\n              <p>Flag the <code>{</code> and <code>}</code> fragments as having been generated by this\n<code>StringWithInterpolations</code> node, so that <code>compileComments</code> knows\nto treat them as bounds. But the braces are unnecessary if all of\nthe enclosed comments are <code>/* */</code> comments. Don’t trust\n<code>fragment.type</code>, which can report minified variable names when\nthis compiler is minified.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          code[<span class=\"hljs-number\">0</span>].isStringWithInterpolations = <span class=\"hljs-literal\">yes</span>\n          code[code.length - <span class=\"hljs-number\">1</span>].isStringWithInterpolations = <span class=\"hljs-literal\">yes</span>\n        fragments.push code...\n    fragments.push @makeCode <span class=\"hljs-string\">&#x27;`&#x27;</span> <span class=\"hljs-keyword\">unless</span> @jsx\n    fragments\n\n  isNestedTag: <span class=\"hljs-function\"><span class=\"hljs-params\">(element)</span> -&gt;</span>\n    call = element.unwrapAll?()\n    @jsx <span class=\"hljs-keyword\">and</span> call <span class=\"hljs-keyword\">instanceof</span> JSXElement\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;TemplateLiteral&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    elements = @extractElements o, includeInterpolationWrappers: <span class=\"hljs-literal\">yes</span>\n    [..., last] = elements\n\n    quasis = []\n    expressions = []\n\n    <span class=\"hljs-keyword\">for</span> element, index <span class=\"hljs-keyword\">in</span> elements\n      <span class=\"hljs-keyword\">if</span> element <span class=\"hljs-keyword\">instanceof</span> StringLiteral\n        quasis.push <span class=\"hljs-keyword\">new</span> TemplateElement(\n          element.originalValue\n          tail: element <span class=\"hljs-keyword\">is</span> last\n        ).withLocationDataFrom(element).ast o\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-comment\"># Interpolation</span>\n        {expression} = element\n        node =\n          <span class=\"hljs-keyword\">unless</span> expression?\n            emptyInterpolation = <span class=\"hljs-keyword\">new</span> EmptyInterpolation()\n            emptyInterpolation.locationData = emptyExpressionLocationData {\n              interpolationNode: element\n              openingBrace: <span class=\"hljs-string\">&#x27;#{&#x27;</span>\n              closingBrace: <span class=\"hljs-string\">&#x27;}&#x27;</span>\n            }\n            emptyInterpolation\n          <span class=\"hljs-keyword\">else</span>\n            expression.unwrapAll()\n        expressions.push astAsBlockIfNeeded node, o\n\n    {expressions, quasis, @quote}\n\n<span class=\"hljs-built_in\">exports</span>.TemplateElement = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">TemplateElement</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@value, {@tail} = {})</span> -&gt;</span>\n    super()\n\n  astProperties: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      value:\n        raw: @value\n      tail: !!@tail\n\n<span class=\"hljs-built_in\">exports</span>.Interpolation = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Interpolation</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@expression)</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;expression&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-336\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-336\">&#x00a7;</a>\n              </div>\n              <p>Represents the contents of an empty interpolation (e.g. <code>#{}</code>).\nOnly used during AST generation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.EmptyInterpolation = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">EmptyInterpolation</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\">-&gt;</span>\n    super()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-337\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-337\">&#x00a7;</a>\n              </div>\n              <h3 id=\"for\">For</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-338\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-338\">&#x00a7;</a>\n              </div>\n              <p>CoffeeScript’s replacement for the <em>for</em> loop is our array and object\ncomprehensions, that compile into <em>for</em> loops here. They also act as an\nexpression, able to return the result of each filtered iteration.</p>\n<p>Unlike Python array comprehensions, they can be multi-line, and you can pass\nthe current index of the loop as a second parameter. Unlike Ruby blocks,\nyou can map and filter in a single pass.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.For = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">For</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">While</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(body, source)</span> -&gt;</span>\n    super()\n    @addBody body\n    @addSource source\n\n  children: [<span class=\"hljs-string\">&#x27;body&#x27;</span>, <span class=\"hljs-string\">&#x27;source&#x27;</span>, <span class=\"hljs-string\">&#x27;guard&#x27;</span>, <span class=\"hljs-string\">&#x27;step&#x27;</span>]\n\n  isAwait: <span class=\"hljs-function\">-&gt;</span> @await ? <span class=\"hljs-literal\">no</span>\n\n  addBody: <span class=\"hljs-function\"><span class=\"hljs-params\">(body)</span> -&gt;</span>\n    @body = Block.wrap [body]\n    {expressions} = @body\n    <span class=\"hljs-keyword\">if</span> expressions.length\n      @body.locationData ?= mergeLocationData expressions[<span class=\"hljs-number\">0</span>].locationData, expressions[expressions.length - <span class=\"hljs-number\">1</span>].locationData\n    this\n\n  addSource: <span class=\"hljs-function\"><span class=\"hljs-params\">(source)</span> -&gt;</span>\n    {@source  = <span class=\"hljs-literal\">no</span>} = source\n    attribs   = [<span class=\"hljs-string\">&quot;name&quot;</span>, <span class=\"hljs-string\">&quot;index&quot;</span>, <span class=\"hljs-string\">&quot;guard&quot;</span>, <span class=\"hljs-string\">&quot;step&quot;</span>, <span class=\"hljs-string\">&quot;own&quot;</span>, <span class=\"hljs-string\">&quot;ownTag&quot;</span>, <span class=\"hljs-string\">&quot;await&quot;</span>, <span class=\"hljs-string\">&quot;awaitTag&quot;</span>, <span class=\"hljs-string\">&quot;object&quot;</span>, <span class=\"hljs-string\">&quot;from&quot;</span>]\n    @[attr]   = source[attr] ? @[attr] <span class=\"hljs-keyword\">for</span> attr <span class=\"hljs-keyword\">in</span> attribs\n    <span class=\"hljs-keyword\">return</span> this <span class=\"hljs-keyword\">unless</span> @source\n    @index.error <span class=\"hljs-string\">&#x27;cannot use index with for-from&#x27;</span> <span class=\"hljs-keyword\">if</span> @from <span class=\"hljs-keyword\">and</span> @index\n    @ownTag.error <span class=\"hljs-string\">&quot;cannot use own with for-<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> @from <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;from&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;in&#x27;</span>}</span>&quot;</span> <span class=\"hljs-keyword\">if</span> @own <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @object\n    [@name, @index] = [@index, @name] <span class=\"hljs-keyword\">if</span> @object\n    @index.error <span class=\"hljs-string\">&#x27;index cannot be a pattern matching expression&#x27;</span> <span class=\"hljs-keyword\">if</span> @index?.isArray?() <span class=\"hljs-keyword\">or</span> @index?.isObject?()\n    @awaitTag.error <span class=\"hljs-string\">&#x27;await must be used with for-from&#x27;</span> <span class=\"hljs-keyword\">if</span> @await <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @from\n    @range   = @source <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> @source.base <span class=\"hljs-keyword\">instanceof</span> Range <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @source.properties.length <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @from\n    @pattern = @name <span class=\"hljs-keyword\">instanceof</span> Value\n    @name.unwrap().propagateLhs?(<span class=\"hljs-literal\">yes</span>) <span class=\"hljs-keyword\">if</span> @pattern\n    @index.error <span class=\"hljs-string\">&#x27;indexes do not apply to range loops&#x27;</span> <span class=\"hljs-keyword\">if</span> @range <span class=\"hljs-keyword\">and</span> @index\n    @name.error <span class=\"hljs-string\">&#x27;cannot pattern match over range loops&#x27;</span> <span class=\"hljs-keyword\">if</span> @range <span class=\"hljs-keyword\">and</span> @pattern\n    @returns = <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-339\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-339\">&#x00a7;</a>\n              </div>\n              <p>Move up any comments in the “<code>for</code> line”, i.e. the line of code with <code>for</code>,\nfrom any child nodes of that line up to the <code>for</code> node itself so that these\ncomments get output, and get output above the <code>for</code> loop.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">for</span> attribute <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;source&#x27;</span>, <span class=\"hljs-string\">&#x27;guard&#x27;</span>, <span class=\"hljs-string\">&#x27;step&#x27;</span>, <span class=\"hljs-string\">&#x27;name&#x27;</span>, <span class=\"hljs-string\">&#x27;index&#x27;</span>] <span class=\"hljs-keyword\">when</span> @[attribute]\n      @[attribute].traverseChildren <span class=\"hljs-literal\">yes</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> =&gt;</span>\n        <span class=\"hljs-keyword\">if</span> node.comments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-340\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-340\">&#x00a7;</a>\n              </div>\n              <p>These comments are buried pretty deeply, so if they happen to be\ntrailing comments the line they trail will be unrecognizable when\nwe’re done compiling this <code>for</code> loop; so just shift them up to\noutput above the <code>for</code> line.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          comment.newLine = comment.unshift = <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">for</span> comment <span class=\"hljs-keyword\">in</span> node.comments\n          moveComments node, @[attribute]\n      moveComments @[attribute], @\n    this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-341\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-341\">&#x00a7;</a>\n              </div>\n              <p>Welcome to the hairiest method in all of CoffeeScript. Handles the inner\nloop, filtering, stepping, and result saving for array, object, and range\ncomprehensions. Some of the generated code can be shared in common, and\nsome cannot.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    body        = Block.wrap [@body]\n    [..., last] = body.expressions\n    @returns    = <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">if</span> last?.jumps() <span class=\"hljs-keyword\">instanceof</span> Return\n    source      = <span class=\"hljs-keyword\">if</span> @range <span class=\"hljs-keyword\">then</span> @source.base <span class=\"hljs-keyword\">else</span> @source\n    scope       = o.scope\n    name        = @name  <span class=\"hljs-keyword\">and</span> (@name.compile o, LEVEL_LIST) <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> @pattern\n    index       = @index <span class=\"hljs-keyword\">and</span> (@index.compile o, LEVEL_LIST)\n    scope.find(name)  <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @pattern\n    scope.find(index) <span class=\"hljs-keyword\">if</span> index <span class=\"hljs-keyword\">and</span> @index <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> Value\n    rvar        = scope.freeVariable <span class=\"hljs-string\">&#x27;results&#x27;</span> <span class=\"hljs-keyword\">if</span> @returns\n    <span class=\"hljs-keyword\">if</span> @from\n      ivar = scope.freeVariable <span class=\"hljs-string\">&#x27;x&#x27;</span>, single: <span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> @pattern\n    <span class=\"hljs-keyword\">else</span>\n      ivar = (@object <span class=\"hljs-keyword\">and</span> index) <span class=\"hljs-keyword\">or</span> scope.freeVariable <span class=\"hljs-string\">&#x27;i&#x27;</span>, single: <span class=\"hljs-literal\">true</span>\n    kvar        = ((@range <span class=\"hljs-keyword\">or</span> @from) <span class=\"hljs-keyword\">and</span> name) <span class=\"hljs-keyword\">or</span> index <span class=\"hljs-keyword\">or</span> ivar\n    kvarAssign  = <span class=\"hljs-keyword\">if</span> kvar <span class=\"hljs-keyword\">isnt</span> ivar <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{kvar}</span> = &quot;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&quot;&quot;</span>\n    <span class=\"hljs-keyword\">if</span> @step <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @range\n      [step, stepVar] = @cacheToCodeFragments @step.cache o, LEVEL_LIST, shouldCacheOrIsAssignable\n      stepNum   = parseNumber stepVar <span class=\"hljs-keyword\">if</span> @step.isNumber()\n    name        = ivar <span class=\"hljs-keyword\">if</span> @pattern\n    varPart     = <span class=\"hljs-string\">&#x27;&#x27;</span>\n    guardPart   = <span class=\"hljs-string\">&#x27;&#x27;</span>\n    defPart     = <span class=\"hljs-string\">&#x27;&#x27;</span>\n    idt1        = @tab + TAB\n    <span class=\"hljs-keyword\">if</span> @range\n      forPartFragments = source.compileToFragments merge o,\n        {index: ivar, name, @step, shouldCache: shouldCacheOrIsAssignable}\n    <span class=\"hljs-keyword\">else</span>\n      svar    = @source.compile o, LEVEL_LIST\n      <span class=\"hljs-keyword\">if</span> (name <span class=\"hljs-keyword\">or</span> @own) <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @from <span class=\"hljs-keyword\">and</span> @source.unwrap() <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral\n        defPart    += <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@tab}</span><span class=\"hljs-subst\">#{ref = scope.freeVariable <span class=\"hljs-string\">&#x27;ref&#x27;</span>}</span> = <span class=\"hljs-subst\">#{svar}</span>;\\n&quot;</span>\n        svar       = ref\n      <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @pattern <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @from\n        namePart   = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{name}</span> = <span class=\"hljs-subst\">#{svar}</span>[<span class=\"hljs-subst\">#{kvar}</span>]&quot;</span>\n      <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> @object <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @from\n        defPart += <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@tab}</span><span class=\"hljs-subst\">#{step}</span>;\\n&quot;</span> <span class=\"hljs-keyword\">if</span> step <span class=\"hljs-keyword\">isnt</span> stepVar\n        down = stepNum &lt; <span class=\"hljs-number\">0</span>\n        lvar = scope.freeVariable <span class=\"hljs-string\">&#x27;len&#x27;</span> <span class=\"hljs-keyword\">unless</span> @step <span class=\"hljs-keyword\">and</span> stepNum? <span class=\"hljs-keyword\">and</span> down\n        declare = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{kvarAssign}</span><span class=\"hljs-subst\">#{ivar}</span> = 0, <span class=\"hljs-subst\">#{lvar}</span> = <span class=\"hljs-subst\">#{svar}</span>.length&quot;</span>\n        declareDown = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{kvarAssign}</span><span class=\"hljs-subst\">#{ivar}</span> = <span class=\"hljs-subst\">#{svar}</span>.length - 1&quot;</span>\n        compare = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{ivar}</span> &lt; <span class=\"hljs-subst\">#{lvar}</span>&quot;</span>\n        compareDown = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{ivar}</span> &gt;= 0&quot;</span>\n        <span class=\"hljs-keyword\">if</span> @step\n          <span class=\"hljs-keyword\">if</span> stepNum?\n            <span class=\"hljs-keyword\">if</span> down\n              compare = compareDown\n              declare = declareDown\n          <span class=\"hljs-keyword\">else</span>\n            compare = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{stepVar}</span> &gt; 0 ? <span class=\"hljs-subst\">#{compare}</span> : <span class=\"hljs-subst\">#{compareDown}</span>&quot;</span>\n            declare = <span class=\"hljs-string\">&quot;(<span class=\"hljs-subst\">#{stepVar}</span> &gt; 0 ? (<span class=\"hljs-subst\">#{declare}</span>) : <span class=\"hljs-subst\">#{declareDown}</span>)&quot;</span>\n          increment = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{ivar}</span> += <span class=\"hljs-subst\">#{stepVar}</span>&quot;</span>\n        <span class=\"hljs-keyword\">else</span>\n          increment = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> kvar <span class=\"hljs-keyword\">isnt</span> ivar <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;++<span class=\"hljs-subst\">#{ivar}</span>&quot;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{ivar}</span>++&quot;</span>}</span>&quot;</span>\n        forPartFragments = [@makeCode(<span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{declare}</span>; <span class=\"hljs-subst\">#{compare}</span>; <span class=\"hljs-subst\">#{kvarAssign}</span><span class=\"hljs-subst\">#{increment}</span>&quot;</span>)]\n    <span class=\"hljs-keyword\">if</span> @returns\n      resultPart   = <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@tab}</span><span class=\"hljs-subst\">#{rvar}</span> = [];\\n&quot;</span>\n      returnResult = <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{@tab}</span>return <span class=\"hljs-subst\">#{rvar}</span>;&quot;</span>\n      body.makeReturn rvar\n    <span class=\"hljs-keyword\">if</span> @guard\n      <span class=\"hljs-keyword\">if</span> body.expressions.length &gt; <span class=\"hljs-number\">1</span>\n        body.expressions.unshift <span class=\"hljs-keyword\">new</span> If (<span class=\"hljs-keyword\">new</span> Parens @guard).invert(), <span class=\"hljs-keyword\">new</span> StatementLiteral <span class=\"hljs-string\">&quot;continue&quot;</span>\n      <span class=\"hljs-keyword\">else</span>\n        body = Block.wrap [<span class=\"hljs-keyword\">new</span> If @guard, body] <span class=\"hljs-keyword\">if</span> @guard\n    <span class=\"hljs-keyword\">if</span> @pattern\n      body.expressions.unshift <span class=\"hljs-keyword\">new</span> Assign @name, <span class=\"hljs-keyword\">if</span> @from <span class=\"hljs-keyword\">then</span> <span class=\"hljs-keyword\">new</span> IdentifierLiteral kvar <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{svar}</span>[<span class=\"hljs-subst\">#{kvar}</span>]&quot;</span>\n\n    varPart = <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{idt1}</span><span class=\"hljs-subst\">#{namePart}</span>;&quot;</span> <span class=\"hljs-keyword\">if</span> namePart\n    <span class=\"hljs-keyword\">if</span> @object\n      forPartFragments = [@makeCode(<span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{kvar}</span> in <span class=\"hljs-subst\">#{svar}</span>&quot;</span>)]\n      guardPart = <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{idt1}</span>if (!<span class=\"hljs-subst\">#{utility <span class=\"hljs-string\">&#x27;hasProp&#x27;</span>, o}</span>.call(<span class=\"hljs-subst\">#{svar}</span>, <span class=\"hljs-subst\">#{kvar}</span>)) continue;&quot;</span> <span class=\"hljs-keyword\">if</span> @own\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> @from\n      <span class=\"hljs-keyword\">if</span> @await\n        forPartFragments = <span class=\"hljs-keyword\">new</span> Op <span class=\"hljs-string\">&#x27;await&#x27;</span>, <span class=\"hljs-keyword\">new</span> Parens <span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{kvar}</span> of <span class=\"hljs-subst\">#{svar}</span>&quot;</span>\n        forPartFragments = forPartFragments.compileToFragments o, LEVEL_TOP\n      <span class=\"hljs-keyword\">else</span>\n        forPartFragments = [@makeCode(<span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{kvar}</span> of <span class=\"hljs-subst\">#{svar}</span>&quot;</span>)]\n    bodyFragments = body.compileToFragments merge(o, indent: idt1), LEVEL_TOP\n    <span class=\"hljs-keyword\">if</span> bodyFragments <span class=\"hljs-keyword\">and</span> bodyFragments.length &gt; <span class=\"hljs-number\">0</span>\n      bodyFragments = [].concat @makeCode(<span class=\"hljs-string\">&#x27;\\n&#x27;</span>), bodyFragments, @makeCode(<span class=\"hljs-string\">&#x27;\\n&#x27;</span>)\n\n    fragments = [@makeCode(defPart)]\n    fragments.push @makeCode(resultPart) <span class=\"hljs-keyword\">if</span> resultPart\n    forCode = <span class=\"hljs-keyword\">if</span> @await <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;for &#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;for (&#x27;</span>\n    forClose = <span class=\"hljs-keyword\">if</span> @await <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;)&#x27;</span>\n    fragments = fragments.concat @makeCode(@tab), @makeCode( forCode),\n      forPartFragments, @makeCode(<span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{forClose}</span> {<span class=\"hljs-subst\">#{guardPart}</span><span class=\"hljs-subst\">#{varPart}</span>&quot;</span>), bodyFragments,\n      @makeCode(@tab), @makeCode(<span class=\"hljs-string\">&#x27;}&#x27;</span>)\n    fragments.push @makeCode(returnResult) <span class=\"hljs-keyword\">if</span> returnResult\n    fragments\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">addToScope</span> = <span class=\"hljs-params\">(name)</span> -&gt;</span>\n      alreadyDeclared = o.scope.find name.value\n      name.isDeclaration = <span class=\"hljs-keyword\">not</span> alreadyDeclared\n    @name?.eachName addToScope, checkAssignability: <span class=\"hljs-literal\">no</span>\n    @index?.eachName addToScope, checkAssignability: <span class=\"hljs-literal\">no</span>\n    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;For&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      source: @source?.ast o\n      body: @body.ast o, LEVEL_TOP\n      guard: @guard?.ast(o) ? <span class=\"hljs-literal\">null</span>\n      name: @name?.ast(o) ? <span class=\"hljs-literal\">null</span>\n      index: @index?.ast(o) ? <span class=\"hljs-literal\">null</span>\n      step: @step?.ast(o) ? <span class=\"hljs-literal\">null</span>\n      postfix: !!@postfix\n      own: !!@own\n      await: !!@await\n      style: <span class=\"hljs-keyword\">switch</span>\n        <span class=\"hljs-keyword\">when</span> @from   <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;from&#x27;</span>\n        <span class=\"hljs-keyword\">when</span> @object <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;of&#x27;</span>\n        <span class=\"hljs-keyword\">when</span> @name   <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;in&#x27;</span>\n        <span class=\"hljs-keyword\">else</span>              <span class=\"hljs-string\">&#x27;range&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-342\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-342\">&#x00a7;</a>\n              </div>\n              <h3 id=\"switch\">Switch</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-343\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-343\">&#x00a7;</a>\n              </div>\n              <p>A JavaScript <em>switch</em> statement. Converts into a returnable expression on-demand.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Switch = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Switch</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@subject, @cases, @otherwise)</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;subject&#x27;</span>, <span class=\"hljs-string\">&#x27;cases&#x27;</span>, <span class=\"hljs-string\">&#x27;otherwise&#x27;</span>]\n\n  isStatement: YES\n\n  jumps: <span class=\"hljs-function\"><span class=\"hljs-params\">(o = {block: <span class=\"hljs-literal\">yes</span>})</span> -&gt;</span>\n    <span class=\"hljs-keyword\">for</span> {block} <span class=\"hljs-keyword\">in</span> @cases\n      <span class=\"hljs-keyword\">return</span> jumpNode <span class=\"hljs-keyword\">if</span> jumpNode = block.jumps o\n    @otherwise?.jumps o\n\n  makeReturn: <span class=\"hljs-function\"><span class=\"hljs-params\">(results, mark)</span> -&gt;</span>\n    block.makeReturn(results, mark) <span class=\"hljs-keyword\">for</span> {block} <span class=\"hljs-keyword\">in</span> @cases\n    @otherwise <span class=\"hljs-keyword\">or</span>= <span class=\"hljs-keyword\">new</span> Block [<span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">&#x27;void 0&#x27;</span>] <span class=\"hljs-keyword\">if</span> results\n    @otherwise?.makeReturn results, mark\n    this\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    idt1 = o.indent + TAB\n    idt2 = o.indent = idt1 + TAB\n    fragments = [].concat @makeCode(@tab + <span class=\"hljs-string\">&quot;switch (&quot;</span>),\n      (<span class=\"hljs-keyword\">if</span> @subject <span class=\"hljs-keyword\">then</span> @subject.compileToFragments(o, LEVEL_PAREN) <span class=\"hljs-keyword\">else</span> @makeCode <span class=\"hljs-string\">&quot;false&quot;</span>),\n      @makeCode(<span class=\"hljs-string\">&quot;) {\\n&quot;</span>)\n    <span class=\"hljs-keyword\">for</span> {conditions, block}, i <span class=\"hljs-keyword\">in</span> @cases\n      <span class=\"hljs-keyword\">for</span> cond <span class=\"hljs-keyword\">in</span> flatten [conditions]\n        cond  = cond.invert() <span class=\"hljs-keyword\">unless</span> @subject\n        fragments = fragments.concat @makeCode(idt1 + <span class=\"hljs-string\">&quot;case &quot;</span>), cond.compileToFragments(o, LEVEL_PAREN), @makeCode(<span class=\"hljs-string\">&quot;:\\n&quot;</span>)\n      fragments = fragments.concat body, @makeCode(<span class=\"hljs-string\">&#x27;\\n&#x27;</span>) <span class=\"hljs-keyword\">if</span> (body = block.compileToFragments o, LEVEL_TOP).length &gt; <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">is</span> @cases.length - <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @otherwise\n      expr = @lastNode block.expressions\n      <span class=\"hljs-keyword\">continue</span> <span class=\"hljs-keyword\">if</span> expr <span class=\"hljs-keyword\">instanceof</span> Return <span class=\"hljs-keyword\">or</span> expr <span class=\"hljs-keyword\">instanceof</span> Throw <span class=\"hljs-keyword\">or</span> (expr <span class=\"hljs-keyword\">instanceof</span> Literal <span class=\"hljs-keyword\">and</span> expr.jumps() <span class=\"hljs-keyword\">and</span> expr.value <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;debugger&#x27;</span>)\n      fragments.push cond.makeCode(idt2 + <span class=\"hljs-string\">&#x27;break;\\n&#x27;</span>)\n    <span class=\"hljs-keyword\">if</span> @otherwise <span class=\"hljs-keyword\">and</span> @otherwise.expressions.length\n      fragments.push @makeCode(idt1 + <span class=\"hljs-string\">&quot;default:\\n&quot;</span>), (@otherwise.compileToFragments o, LEVEL_TOP)..., @makeCode(<span class=\"hljs-string\">&quot;\\n&quot;</span>)\n    fragments.push @makeCode @tab + <span class=\"hljs-string\">&#x27;}&#x27;</span>\n    fragments\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;SwitchStatement&#x27;</span>\n\n  casesAst: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    cases = []\n\n    <span class=\"hljs-keyword\">for</span> kase, caseIndex <span class=\"hljs-keyword\">in</span> @cases\n      {conditions: tests, block: consequent} = kase\n      tests = flatten [tests]\n      lastTestIndex = tests.length - <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">for</span> test, testIndex <span class=\"hljs-keyword\">in</span> tests\n        testConsequent =\n          <span class=\"hljs-keyword\">if</span> testIndex <span class=\"hljs-keyword\">is</span> lastTestIndex\n            consequent\n          <span class=\"hljs-keyword\">else</span>\n            <span class=\"hljs-literal\">null</span>\n\n        caseLocationData = test.locationData\n        caseLocationData = mergeLocationData caseLocationData, testConsequent.expressions[testConsequent.expressions.length - <span class=\"hljs-number\">1</span>].locationData <span class=\"hljs-keyword\">if</span> testConsequent?.expressions.length\n        caseLocationData = mergeLocationData caseLocationData, kase.locationData, justLeading: <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> testIndex <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n        caseLocationData = mergeLocationData caseLocationData, kase.locationData, justEnding:  <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> testIndex <span class=\"hljs-keyword\">is</span> lastTestIndex\n\n        cases.push <span class=\"hljs-keyword\">new</span> SwitchCase(test, testConsequent, trailing: testIndex <span class=\"hljs-keyword\">is</span> lastTestIndex).withLocationDataFrom locationData: caseLocationData\n\n    <span class=\"hljs-keyword\">if</span> @otherwise?.expressions.length\n      cases.push <span class=\"hljs-keyword\">new</span> SwitchCase(<span class=\"hljs-literal\">null</span>, @otherwise).withLocationDataFrom @otherwise\n\n    kase.ast(o) <span class=\"hljs-keyword\">for</span> kase <span class=\"hljs-keyword\">in</span> cases\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      discriminant: @subject?.ast(o, LEVEL_PAREN) ? <span class=\"hljs-literal\">null</span>\n      cases: @casesAst o\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">SwitchCase</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@test, @block, {@trailing} = {})</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;test&#x27;</span>, <span class=\"hljs-string\">&#x27;block&#x27;</span>]\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      test: @test?.ast(o, LEVEL_PAREN) ? <span class=\"hljs-literal\">null</span>\n      consequent: @block?.ast(o, LEVEL_TOP).body ? []\n      trailing: !!@trailing\n\n<span class=\"hljs-built_in\">exports</span>.SwitchWhen = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">SwitchWhen</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@conditions, @block)</span> -&gt;</span>\n    super()\n\n  children: [<span class=\"hljs-string\">&#x27;conditions&#x27;</span>, <span class=\"hljs-string\">&#x27;block&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-344\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-344\">&#x00a7;</a>\n              </div>\n              <h3 id=\"if\">If</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-345\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-345\">&#x00a7;</a>\n              </div>\n              <p><em>If/else</em> statements. Acts as an expression by pushing down requested returns\nto the last line of each clause.</p>\n<p>Single-expression <strong>Ifs</strong> are compiled into conditional operators if possible,\nbecause ternaries are already proper expressions, and don’t need conversion.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.If = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">If</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@condition, @body, options = {})</span> -&gt;</span>\n    super()\n    @elseBody  = <span class=\"hljs-literal\">null</span>\n    @isChain   = <span class=\"hljs-literal\">false</span>\n    {@soak, @postfix, @type} = options\n    moveComments @condition, @ <span class=\"hljs-keyword\">if</span> @condition.comments\n\n  children: [<span class=\"hljs-string\">&#x27;condition&#x27;</span>, <span class=\"hljs-string\">&#x27;body&#x27;</span>, <span class=\"hljs-string\">&#x27;elseBody&#x27;</span>]\n\n  bodyNode:     <span class=\"hljs-function\">-&gt;</span> @body?.unwrap()\n  elseBodyNode: <span class=\"hljs-function\">-&gt;</span> @elseBody?.unwrap()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-346\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-346\">&#x00a7;</a>\n              </div>\n              <p>Rewrite a chain of <strong>Ifs</strong> to add a default case as the final <em>else</em>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addElse: <span class=\"hljs-function\"><span class=\"hljs-params\">(elseBody)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isChain\n      @elseBodyNode().addElse elseBody\n      @locationData = mergeLocationData @locationData, @elseBodyNode().locationData\n    <span class=\"hljs-keyword\">else</span>\n      @isChain  = elseBody <span class=\"hljs-keyword\">instanceof</span> If\n      @elseBody = @ensureBlock elseBody\n      @elseBody.updateLocationDataIfMissing elseBody.locationData\n      @locationData = mergeLocationData @locationData, @elseBody.locationData <span class=\"hljs-keyword\">if</span> @locationData? <span class=\"hljs-keyword\">and</span> @elseBody.locationData?\n    this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-347\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-347\">&#x00a7;</a>\n              </div>\n              <p>The <strong>If</strong> only compiles into a statement if either of its bodies needs\nto be a statement. Otherwise a conditional operator is safe.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  isStatement: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o?.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP <span class=\"hljs-keyword\">or</span>\n      @bodyNode().isStatement(o) <span class=\"hljs-keyword\">or</span> @elseBodyNode()?.isStatement(o)\n\n  jumps: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span> @body.jumps(o) <span class=\"hljs-keyword\">or</span> @elseBody?.jumps(o)\n\n  compileNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isStatement o <span class=\"hljs-keyword\">then</span> @compileStatement o <span class=\"hljs-keyword\">else</span> @compileExpression o\n\n  makeReturn: <span class=\"hljs-function\"><span class=\"hljs-params\">(results, mark)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> mark\n      @body?.makeReturn results, mark\n      @elseBody?.makeReturn results, mark\n      <span class=\"hljs-keyword\">return</span>\n    @elseBody  <span class=\"hljs-keyword\">or</span>= <span class=\"hljs-keyword\">new</span> Block [<span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">&#x27;void 0&#x27;</span>] <span class=\"hljs-keyword\">if</span> results\n    @body     <span class=\"hljs-keyword\">and</span>= <span class=\"hljs-keyword\">new</span> Block [@body.makeReturn results]\n    @elseBody <span class=\"hljs-keyword\">and</span>= <span class=\"hljs-keyword\">new</span> Block [@elseBody.makeReturn results]\n    this\n\n  ensureBlock: <span class=\"hljs-function\"><span class=\"hljs-params\">(node)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> node <span class=\"hljs-keyword\">instanceof</span> Block <span class=\"hljs-keyword\">then</span> node <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">new</span> Block [node]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-348\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-348\">&#x00a7;</a>\n              </div>\n              <p>Compile the <code>If</code> as a regular <em>if-else</em> statement. Flattened chains\nforce inner <em>else</em> bodies into statement form.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileStatement: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    child    = del o, <span class=\"hljs-string\">&#x27;chainChild&#x27;</span>\n    exeq     = del o, <span class=\"hljs-string\">&#x27;isExistentialEquals&#x27;</span>\n\n    <span class=\"hljs-keyword\">if</span> exeq\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> If(@processedCondition().invert(), @elseBodyNode(), type: <span class=\"hljs-string\">&#x27;if&#x27;</span>).compileToFragments o\n\n    indent   = o.indent + TAB\n    cond     = @processedCondition().compileToFragments o, LEVEL_PAREN\n    body     = @ensureBlock(@body).compileToFragments merge o, {indent}\n    ifPart   = [].concat @makeCode(<span class=\"hljs-string\">&quot;if (&quot;</span>), cond, @makeCode(<span class=\"hljs-string\">&quot;) {\\n&quot;</span>), body, @makeCode(<span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{@tab}</span>}&quot;</span>)\n    ifPart.unshift @makeCode @tab <span class=\"hljs-keyword\">unless</span> child\n    <span class=\"hljs-keyword\">return</span> ifPart <span class=\"hljs-keyword\">unless</span> @elseBody\n    answer = ifPart.concat @makeCode(<span class=\"hljs-string\">&#x27; else &#x27;</span>)\n    <span class=\"hljs-keyword\">if</span> @isChain\n      o.chainChild = <span class=\"hljs-literal\">yes</span>\n      answer = answer.concat @elseBody.unwrap().compileToFragments o, LEVEL_TOP\n    <span class=\"hljs-keyword\">else</span>\n      answer = answer.concat @makeCode(<span class=\"hljs-string\">&quot;{\\n&quot;</span>), @elseBody.compileToFragments(merge(o, {indent}), LEVEL_TOP), @makeCode(<span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{@tab}</span>}&quot;</span>)\n    answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-349\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-349\">&#x00a7;</a>\n              </div>\n              <p>Compile the <code>If</code> as a conditional operator.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  compileExpression: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    cond = @processedCondition().compileToFragments o, LEVEL_COND\n    body = @bodyNode().compileToFragments o, LEVEL_LIST\n    alt  = <span class=\"hljs-keyword\">if</span> @elseBodyNode() <span class=\"hljs-keyword\">then</span> @elseBodyNode().compileToFragments(o, LEVEL_LIST) <span class=\"hljs-keyword\">else</span> [@makeCode(<span class=\"hljs-string\">&#x27;void 0&#x27;</span>)]\n    fragments = cond.concat @makeCode(<span class=\"hljs-string\">&quot; ? &quot;</span>), body, @makeCode(<span class=\"hljs-string\">&quot; : &quot;</span>), alt\n    <span class=\"hljs-keyword\">if</span> o.level &gt;= LEVEL_COND <span class=\"hljs-keyword\">then</span> @wrapInParentheses fragments <span class=\"hljs-keyword\">else</span> fragments\n\n  unfoldSoak: <span class=\"hljs-function\">-&gt;</span>\n    @soak <span class=\"hljs-keyword\">and</span> this\n\n  processedCondition: <span class=\"hljs-function\">-&gt;</span>\n    @processedConditionCache ?= <span class=\"hljs-keyword\">if</span> @type <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;unless&#x27;</span> <span class=\"hljs-keyword\">then</span> @condition.invert() <span class=\"hljs-keyword\">else</span> @condition\n\n  isStatementAst: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    o.level <span class=\"hljs-keyword\">is</span> LEVEL_TOP\n\n  astType: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> @isStatementAst o\n      <span class=\"hljs-string\">&#x27;IfStatement&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&#x27;ConditionalExpression&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    isStatement = @isStatementAst o\n\n    <span class=\"hljs-keyword\">return</span>\n      test: @condition.ast o, <span class=\"hljs-keyword\">if</span> isStatement <span class=\"hljs-keyword\">then</span> LEVEL_PAREN <span class=\"hljs-keyword\">else</span> LEVEL_COND\n      consequent:\n        <span class=\"hljs-keyword\">if</span> isStatement\n          @body.ast o, LEVEL_TOP\n        <span class=\"hljs-keyword\">else</span>\n          @bodyNode().ast o, LEVEL_TOP\n      alternate:\n        <span class=\"hljs-keyword\">if</span> @isChain\n          @elseBody.unwrap().ast o, <span class=\"hljs-keyword\">if</span> isStatement <span class=\"hljs-keyword\">then</span> LEVEL_TOP <span class=\"hljs-keyword\">else</span> LEVEL_COND\n        <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> isStatement <span class=\"hljs-keyword\">and</span> @elseBody?.expressions?.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span>\n          @elseBody.expressions[<span class=\"hljs-number\">0</span>].ast o, LEVEL_TOP\n        <span class=\"hljs-keyword\">else</span>\n          @elseBody?.ast(o, LEVEL_TOP) ? <span class=\"hljs-literal\">null</span>\n      postfix: !!@postfix\n      inverted: @type <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;unless&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-350\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-350\">&#x00a7;</a>\n              </div>\n              <p>A sequence expression e.g. <code>(a; b)</code>.\nCurrently only used during AST generation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Sequence = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Sequence</span> <span class=\"hljs-keyword\">extends</span> <span class=\"hljs-title\">Base</span></span>\n  children: [<span class=\"hljs-string\">&#x27;expressions&#x27;</span>]\n\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@expressions)</span> -&gt;</span>\n    super()\n\n  astNode: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> @expressions[<span class=\"hljs-number\">0</span>].ast(o) <span class=\"hljs-keyword\">if</span> @expressions.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">1</span>\n    super o\n\n  astType: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;SequenceExpression&#x27;</span>\n\n  astProperties: <span class=\"hljs-function\"><span class=\"hljs-params\">(o)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span>\n      expressions:\n        expression.ast(o) <span class=\"hljs-keyword\">for</span> expression <span class=\"hljs-keyword\">in</span> @expressions</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-351\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-351\">&#x00a7;</a>\n              </div>\n              <h2 id=\"constants\">Constants</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-352\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-352\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\nUTILITIES =\n  modulo: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;function(a, b) { return (+a % (b = +b) + b) % b; }&#x27;</span>\n\n  boundMethodCheck: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&quot;\n    function(instance, Constructor) {\n      if (!(instance instanceof Constructor)) {\n        throw new Error(&#x27;Bound instance method accessed before binding&#x27;);\n      }\n    }\n  &quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-353\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-353\">&#x00a7;</a>\n              </div>\n              <p>Shortcuts to speed up the lookup time for native functions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  hasProp: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;{}.hasOwnProperty&#x27;</span>\n  indexOf: <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;[].indexOf&#x27;</span>\n  slice  : <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;[].slice&#x27;</span>\n  splice : <span class=\"hljs-function\">-&gt;</span> <span class=\"hljs-string\">&#x27;[].splice&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-354\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-354\">&#x00a7;</a>\n              </div>\n              <p>Levels indicate a node’s position in the AST. Useful for knowing if\nparens are necessary or superfluous.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>LEVEL_TOP    = <span class=\"hljs-number\">1</span>  <span class=\"hljs-comment\"># ...;</span>\nLEVEL_PAREN  = <span class=\"hljs-number\">2</span>  <span class=\"hljs-comment\"># (...)</span>\nLEVEL_LIST   = <span class=\"hljs-number\">3</span>  <span class=\"hljs-comment\"># [...]</span>\nLEVEL_COND   = <span class=\"hljs-number\">4</span>  <span class=\"hljs-comment\"># ... ? x : y</span>\nLEVEL_OP     = <span class=\"hljs-number\">5</span>  <span class=\"hljs-comment\"># !...</span>\nLEVEL_ACCESS = <span class=\"hljs-number\">6</span>  <span class=\"hljs-comment\"># ...[0]</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-355\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-355\">&#x00a7;</a>\n              </div>\n              <p>Tabs are two spaces for pretty printing.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>TAB = <span class=\"hljs-string\">&#x27;  &#x27;</span>\n\nSIMPLENUM = <span class=\"hljs-regexp\">/^[+-]?\\d+(?:_\\d+)*$/</span>\nSIMPLE_STRING_OMIT = <span class=\"hljs-regexp\">/\\s*\\n\\s*/g</span>\nLEADING_BLANK_LINE  = <span class=\"hljs-regexp\">/^[^\\n\\S]*\\n/</span>\nTRAILING_BLANK_LINE = <span class=\"hljs-regexp\">/\\n[^\\n\\S]*$/</span>\nSTRING_OMIT    = <span class=\"hljs-regexp\">///\n    ((?:\\\\\\\\)+)      <span class=\"hljs-comment\"># Consume (and preserve) an even number of backslashes.</span>\n  | \\\\[^\\S\\n]*\\n\\s*  <span class=\"hljs-comment\"># Remove escaped newlines.</span>\n///</span>g\nHEREGEX_OMIT = <span class=\"hljs-regexp\">///\n    ((?:\\\\\\\\)+)     <span class=\"hljs-comment\"># Consume (and preserve) an even number of backslashes.</span>\n  | \\\\(\\s)          <span class=\"hljs-comment\"># Preserve escaped whitespace.</span>\n  | \\s+(?:<span class=\"hljs-comment\">#.*)?     # Remove whitespace and comments.</span>\n///</span>g</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-356\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-356\">&#x00a7;</a>\n              </div>\n              <h2 id=\"helper-functions\">Helper Functions</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-357\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-357\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-358\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-358\">&#x00a7;</a>\n              </div>\n              <p>Helper for ensuring that utility functions are assigned at the top level.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">utility</span> = <span class=\"hljs-params\">(name, o)</span> -&gt;</span>\n  {root} = o.scope\n  <span class=\"hljs-keyword\">if</span> name <span class=\"hljs-keyword\">of</span> root.utilities\n    root.utilities[name]\n  <span class=\"hljs-keyword\">else</span>\n    ref = root.freeVariable name\n    root.assign ref, UTILITIES[name] o\n    root.utilities[name] = ref\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">multident</span> = <span class=\"hljs-params\">(code, tab, includingFirstLine = <span class=\"hljs-literal\">yes</span>)</span> -&gt;</span>\n  endsWithNewLine = code[code.length - <span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;\\n&#x27;</span>\n  code = (<span class=\"hljs-keyword\">if</span> includingFirstLine <span class=\"hljs-keyword\">then</span> tab <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>) + code.replace <span class=\"hljs-regexp\">/\\n/g</span>, <span class=\"hljs-string\">&quot;$&amp;<span class=\"hljs-subst\">#{tab}</span>&quot;</span>\n  code = code.replace <span class=\"hljs-regexp\">/\\s+$/</span>, <span class=\"hljs-string\">&#x27;&#x27;</span>\n  code = code + <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-keyword\">if</span> endsWithNewLine\n  code</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-359\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-359\">&#x00a7;</a>\n              </div>\n              <p>Wherever in CoffeeScript 1 we might’ve inserted a <code>makeCode &quot;#{@tab}&quot;</code> to\nindent a line of code, now we must account for the possibility of comments\npreceding that line of code. If there are such comments, indent each line of\nsuch comments, and <em>then</em> indent the first following line of code.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">indentInitial</span> = <span class=\"hljs-params\">(fragments, node)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">for</span> fragment, fragmentIndex <span class=\"hljs-keyword\">in</span> fragments\n    <span class=\"hljs-keyword\">if</span> fragment.isHereComment\n      fragment.code = multident fragment.code, node.tab\n    <span class=\"hljs-keyword\">else</span>\n      fragments.splice fragmentIndex, <span class=\"hljs-number\">0</span>, node.makeCode <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{node.tab}</span>&quot;</span>\n      <span class=\"hljs-keyword\">break</span>\n  fragments\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">hasLineComments</span> = <span class=\"hljs-params\">(node)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> node.comments\n  <span class=\"hljs-keyword\">for</span> comment <span class=\"hljs-keyword\">in</span> node.comments\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> comment.here <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">no</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-360\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-360\">&#x00a7;</a>\n              </div>\n              <p>Move the <code>comments</code> property from one object to another, deleting it from\nthe first object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">moveComments</span> = <span class=\"hljs-params\">(<span class=\"hljs-keyword\">from</span>, to)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> <span class=\"hljs-keyword\">from</span>?.comments\n  attachCommentsToNode <span class=\"hljs-keyword\">from</span>.comments, to\n  <span class=\"hljs-keyword\">delete</span> <span class=\"hljs-keyword\">from</span>.comments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-361\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-361\">&#x00a7;</a>\n              </div>\n              <p>Sometimes when compiling a node, we want to insert a fragment at the start\nof an array of fragments; but if the start has one or more comment fragments,\nwe want to insert this fragment after those but before any non-comments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">unshiftAfterComments</span> = <span class=\"hljs-params\">(fragments, fragmentToInsert)</span> -&gt;</span>\n  inserted = <span class=\"hljs-literal\">no</span>\n  <span class=\"hljs-keyword\">for</span> fragment, fragmentIndex <span class=\"hljs-keyword\">in</span> fragments <span class=\"hljs-keyword\">when</span> <span class=\"hljs-keyword\">not</span> fragment.isComment\n    fragments.splice fragmentIndex, <span class=\"hljs-number\">0</span>, fragmentToInsert\n    inserted = <span class=\"hljs-literal\">yes</span>\n    <span class=\"hljs-keyword\">break</span>\n  fragments.push fragmentToInsert <span class=\"hljs-keyword\">unless</span> inserted\n  fragments\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">isLiteralArguments</span> = <span class=\"hljs-params\">(node)</span> -&gt;</span>\n  node <span class=\"hljs-keyword\">instanceof</span> IdentifierLiteral <span class=\"hljs-keyword\">and</span> node.value <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;arguments&#x27;</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">isLiteralThis</span> = <span class=\"hljs-params\">(node)</span> -&gt;</span>\n  node <span class=\"hljs-keyword\">instanceof</span> ThisLiteral <span class=\"hljs-keyword\">or</span> (node <span class=\"hljs-keyword\">instanceof</span> Code <span class=\"hljs-keyword\">and</span> node.bound)\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">shouldCacheOrIsAssignable</span> = <span class=\"hljs-params\">(node)</span> -&gt;</span> node.shouldCache() <span class=\"hljs-keyword\">or</span> node.isAssignable?()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-362\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-362\">&#x00a7;</a>\n              </div>\n              <p>Unfold a node’s child if soak, then tuck the node under created <code>If</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">unfoldSoak</span> = <span class=\"hljs-params\">(o, parent, name)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> ifn = parent[name].unfoldSoak o\n  parent[name] = ifn.body\n  ifn.body = <span class=\"hljs-keyword\">new</span> Value parent\n  ifn</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-363\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-363\">&#x00a7;</a>\n              </div>\n              <p>Constructs a string or regex by escaping certain characters.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">makeDelimitedLiteral</span> = <span class=\"hljs-params\">(body, {delimiter: delimiterOption, escapeNewlines, double, includeDelimiters = <span class=\"hljs-literal\">yes</span>, escapeDelimiter = <span class=\"hljs-literal\">yes</span>, convertTrailingNullEscapes} = {})</span> -&gt;</span>\n  body = <span class=\"hljs-string\">&#x27;(?:)&#x27;</span> <span class=\"hljs-keyword\">if</span> body <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">and</span> delimiterOption <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;/&#x27;</span>\n  escapeTemplateLiteralCurlies = delimiterOption <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;`&#x27;</span>\n  regex = <span class=\"hljs-regexp\">///\n      (\\\\\\\\)                               <span class=\"hljs-comment\"># Escaped backslash.</span>\n    | (\\\\0(?=\\d))                          <span class=\"hljs-comment\"># Null character mistaken as octal escape.</span>\n    <span class=\"hljs-subst\">#{\n      <span class=\"hljs-keyword\">if</span> convertTrailingNullEscapes\n        <span class=\"hljs-regexp\">/// | (\\\\0) $ ///</span>.source           # Trailing <span class=\"hljs-literal\">null</span> character that could be mistaken <span class=\"hljs-keyword\">as</span> octal <span class=\"hljs-built_in\">escape</span>.\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">&#x27;&#x27;</span>\n    }</span>\n    <span class=\"hljs-subst\">#{\n      <span class=\"hljs-keyword\">if</span> escapeDelimiter\n        <span class=\"hljs-regexp\">/// | \\\\?(<span class=\"hljs-subst\">#{delimiterOption}</span>) ///</span>.source # (Possibly escaped) delimiter.\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">&#x27;&#x27;</span>\n    }</span>\n    <span class=\"hljs-subst\">#{\n      <span class=\"hljs-keyword\">if</span> escapeTemplateLiteralCurlies\n        <span class=\"hljs-regexp\">/// | \\\\?(\\$\\{) ///</span>.source         # `<span class=\"language-javascript\">${</span>` inside template literals must be escaped.\n      <span class=\"hljs-keyword\">else</span>\n        <span class=\"hljs-string\">&#x27;&#x27;</span>\n    }</span>\n    | \\\\?(?:\n        <span class=\"hljs-subst\">#{<span class=\"hljs-keyword\">if</span> escapeNewlines <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;(\\n)|&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>}</span>\n          (\\r)\n        | (\\u2028)\n        | (\\u2029)\n      )                                    <span class=\"hljs-comment\"># (Possibly escaped) newlines.</span>\n    | (\\\\.)                                <span class=\"hljs-comment\"># Other escapes.</span>\n  ///</span>g\n  body = body.replace regex, <span class=\"hljs-function\"><span class=\"hljs-params\">(match, backslash, nul, ...args)</span> -&gt;</span>\n    trailingNullEscape =\n      args.shift() <span class=\"hljs-keyword\">if</span> convertTrailingNullEscapes\n    delimiter =\n      args.shift() <span class=\"hljs-keyword\">if</span> escapeDelimiter\n    templateLiteralCurly =\n      args.shift() <span class=\"hljs-keyword\">if</span> escapeTemplateLiteralCurlies\n    lf =\n      args.shift() <span class=\"hljs-keyword\">if</span> escapeNewlines\n    [cr, ls, ps, other] = args\n    <span class=\"hljs-keyword\">switch</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-364\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-364\">&#x00a7;</a>\n              </div>\n              <p>Ignore escaped backslashes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">when</span> backslash <span class=\"hljs-keyword\">then</span> (<span class=\"hljs-keyword\">if</span> double <span class=\"hljs-keyword\">then</span> backslash + backslash <span class=\"hljs-keyword\">else</span> backslash)\n      <span class=\"hljs-keyword\">when</span> nul                  <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;\\\\x00&#x27;</span>\n      <span class=\"hljs-keyword\">when</span> trailingNullEscape   <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;\\\\x00&quot;</span>\n      <span class=\"hljs-keyword\">when</span> delimiter            <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;\\\\<span class=\"hljs-subst\">#{delimiter}</span>&quot;</span>\n      <span class=\"hljs-keyword\">when</span> templateLiteralCurly <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;\\\\${&quot;</span>\n      <span class=\"hljs-keyword\">when</span> lf                   <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;\\\\n&#x27;</span>\n      <span class=\"hljs-keyword\">when</span> cr                   <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;\\\\r&#x27;</span>\n      <span class=\"hljs-keyword\">when</span> ls                   <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;\\\\u2028&#x27;</span>\n      <span class=\"hljs-keyword\">when</span> ps                   <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;\\\\u2029&#x27;</span>\n      <span class=\"hljs-keyword\">when</span> other                <span class=\"hljs-keyword\">then</span> (<span class=\"hljs-keyword\">if</span> double <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;\\\\<span class=\"hljs-subst\">#{other}</span>&quot;</span> <span class=\"hljs-keyword\">else</span> other)\n  printedDelimiter = <span class=\"hljs-keyword\">if</span> includeDelimiters <span class=\"hljs-keyword\">then</span> delimiterOption <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n  <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{printedDelimiter}</span><span class=\"hljs-subst\">#{body}</span><span class=\"hljs-subst\">#{printedDelimiter}</span>&quot;</span>\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">sniffDirectives</span> = <span class=\"hljs-params\">(expressions, {notFinalExpression} = {})</span> -&gt;</span>\n  index = <span class=\"hljs-number\">0</span>\n  lastIndex = expressions.length - <span class=\"hljs-number\">1</span>\n  <span class=\"hljs-keyword\">while</span> index &lt;= lastIndex\n    <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">if</span> index <span class=\"hljs-keyword\">is</span> lastIndex <span class=\"hljs-keyword\">and</span> notFinalExpression\n    expression = expressions[index]\n    <span class=\"hljs-keyword\">if</span> (unwrapped = expression?.unwrap?()) <span class=\"hljs-keyword\">instanceof</span> PassthroughLiteral <span class=\"hljs-keyword\">and</span> unwrapped.generated\n      index++\n      <span class=\"hljs-keyword\">continue</span>\n    <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> expression <span class=\"hljs-keyword\">instanceof</span> Value <span class=\"hljs-keyword\">and</span> expression.isString() <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> expression.unwrap().shouldGenerateTemplateLiteral()\n    expressions[index] =\n      <span class=\"hljs-keyword\">new</span> Directive expression\n      .withLocationDataFrom expression\n    index++\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">astAsBlockIfNeeded</span> = <span class=\"hljs-params\">(node, o)</span> -&gt;</span>\n  unwrapped = node.unwrap()\n  <span class=\"hljs-keyword\">if</span> unwrapped <span class=\"hljs-keyword\">instanceof</span> Block <span class=\"hljs-keyword\">and</span> unwrapped.expressions.length &gt; <span class=\"hljs-number\">1</span>\n    unwrapped.makeReturn <span class=\"hljs-literal\">null</span>, <span class=\"hljs-literal\">yes</span>\n    unwrapped.ast o, LEVEL_TOP\n  <span class=\"hljs-keyword\">else</span>\n    node.ast o, LEVEL_PAREN</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-365\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-365\">&#x00a7;</a>\n              </div>\n              <p>Helpers for <code>mergeLocationData</code> and <code>mergeAstLocationData</code> below.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">lesser</span>  = <span class=\"hljs-params\">(a, b)</span> -&gt;</span> <span class=\"hljs-keyword\">if</span> a &lt; b <span class=\"hljs-keyword\">then</span> a <span class=\"hljs-keyword\">else</span> b\n<span class=\"hljs-function\"><span class=\"hljs-title\">greater</span> = <span class=\"hljs-params\">(a, b)</span> -&gt;</span> <span class=\"hljs-keyword\">if</span> a &gt; b <span class=\"hljs-keyword\">then</span> a <span class=\"hljs-keyword\">else</span> b\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">isAstLocGreater</span> = <span class=\"hljs-params\">(a, b)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> a.line &gt; b.line\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> a.line <span class=\"hljs-keyword\">is</span> b.line\n  a.column &gt; b.column\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">isLocationDataStartGreater</span> = <span class=\"hljs-params\">(a, b)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> a.first_line &gt; b.first_line\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> a.first_line <span class=\"hljs-keyword\">is</span> b.first_line\n  a.first_column &gt; b.first_column\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">isLocationDataEndGreater</span> = <span class=\"hljs-params\">(a, b)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> a.last_line &gt; b.last_line\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> a.last_line <span class=\"hljs-keyword\">is</span> b.last_line\n  a.last_column &gt; b.last_column</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-366\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-366\">&#x00a7;</a>\n              </div>\n              <p>Take two nodes’ location data and return a new <code>locationData</code> object that\nencompasses the location data of both nodes. So the new <code>first_line</code> value\nwill be the earlier of the two nodes’ <code>first_line</code> values, the new\n<code>last_column</code> the later of the two nodes’ <code>last_column</code> values, etc.</p>\n<p>If you only want to extend the first node’s location data with the start or\nend location data of the second node, pass the <code>justLeading</code> or <code>justEnding</code>\noptions. So e.g. if <code>first</code>’s range is [4, 5] and <code>second</code>’s range is [1, 10],\nyou’d get:</p>\n<pre><code>mergeLocationData(first, second).range                   <span class=\"hljs-comment\"># [1, 10]</span>\nmergeLocationData(first, second, justLeading: <span class=\"hljs-literal\">yes</span>).range <span class=\"hljs-comment\"># [1, 5]</span>\nmergeLocationData(first, second, justEnding:  <span class=\"hljs-literal\">yes</span>).range <span class=\"hljs-comment\"># [4, 10]</span>\n</code></pre>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.mergeLocationData = mergeLocationData = <span class=\"hljs-function\"><span class=\"hljs-params\">(locationDataA, locationDataB, {justLeading, justEnding} = {})</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-built_in\">Object</span>.assign(\n    <span class=\"hljs-keyword\">if</span> justEnding\n      first_line:   locationDataA.first_line\n      first_column: locationDataA.first_column\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">if</span> isLocationDataStartGreater locationDataA, locationDataB\n        first_line:   locationDataB.first_line\n        first_column: locationDataB.first_column\n      <span class=\"hljs-keyword\">else</span>\n        first_line:   locationDataA.first_line\n        first_column: locationDataA.first_column\n  ,\n    <span class=\"hljs-keyword\">if</span> justLeading\n      last_line:             locationDataA.last_line\n      last_column:           locationDataA.last_column\n      last_line_exclusive:   locationDataA.last_line_exclusive\n      last_column_exclusive: locationDataA.last_column_exclusive\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">if</span> isLocationDataEndGreater locationDataA, locationDataB\n        last_line:             locationDataA.last_line\n        last_column:           locationDataA.last_column\n        last_line_exclusive:   locationDataA.last_line_exclusive\n        last_column_exclusive: locationDataA.last_column_exclusive\n      <span class=\"hljs-keyword\">else</span>\n        last_line:             locationDataB.last_line\n        last_column:           locationDataB.last_column\n        last_line_exclusive:   locationDataB.last_line_exclusive\n        last_column_exclusive: locationDataB.last_column_exclusive\n  ,\n    range: [\n      <span class=\"hljs-keyword\">if</span> justEnding\n        locationDataA.range[<span class=\"hljs-number\">0</span>]\n      <span class=\"hljs-keyword\">else</span>\n        lesser locationDataA.range[<span class=\"hljs-number\">0</span>], locationDataB.range[<span class=\"hljs-number\">0</span>]\n    ,\n      <span class=\"hljs-keyword\">if</span> justLeading\n        locationDataA.range[<span class=\"hljs-number\">1</span>]\n      <span class=\"hljs-keyword\">else</span>\n        greater locationDataA.range[<span class=\"hljs-number\">1</span>], locationDataB.range[<span class=\"hljs-number\">1</span>]\n    ]\n  )</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-367\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-367\">&#x00a7;</a>\n              </div>\n              <p>Take two AST nodes, or two AST nodes’ location data objects, and return a new\nlocation data object that encompasses the location data of both nodes. So the\nnew <code>start</code> value will be the earlier of the two nodes’ <code>start</code> values, the\nnew <code>end</code> value will be the later of the two nodes’ <code>end</code> values, etc.</p>\n<p>If you only want to extend the first node’s location data with the start or\nend location data of the second node, pass the <code>justLeading</code> or <code>justEnding</code>\noptions. So e.g. if <code>first</code>’s range is [4, 5] and <code>second</code>’s range is [1, 10],\nyou’d get:</p>\n<pre><code>mergeAstLocationData(first, second).range                   <span class=\"hljs-comment\"># [1, 10]</span>\nmergeAstLocationData(first, second, justLeading: <span class=\"hljs-literal\">yes</span>).range <span class=\"hljs-comment\"># [1, 5]</span>\nmergeAstLocationData(first, second, justEnding:  <span class=\"hljs-literal\">yes</span>).range <span class=\"hljs-comment\"># [4, 10]</span>\n</code></pre>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.mergeAstLocationData = mergeAstLocationData = <span class=\"hljs-function\"><span class=\"hljs-params\">(nodeA, nodeB, {justLeading, justEnding} = {})</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span>\n    loc:\n      start:\n        <span class=\"hljs-keyword\">if</span> justEnding\n          nodeA.loc.start\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-keyword\">if</span> isAstLocGreater nodeA.loc.start, nodeB.loc.start\n            nodeB.loc.start\n          <span class=\"hljs-keyword\">else</span>\n            nodeA.loc.start\n      end:\n        <span class=\"hljs-keyword\">if</span> justLeading\n          nodeA.loc.end\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-keyword\">if</span> isAstLocGreater nodeA.loc.end, nodeB.loc.end\n            nodeA.loc.end\n          <span class=\"hljs-keyword\">else</span>\n            nodeB.loc.end\n    range: [\n      <span class=\"hljs-keyword\">if</span> justEnding\n        nodeA.range[<span class=\"hljs-number\">0</span>]\n      <span class=\"hljs-keyword\">else</span>\n        lesser nodeA.range[<span class=\"hljs-number\">0</span>], nodeB.range[<span class=\"hljs-number\">0</span>]\n    ,\n      <span class=\"hljs-keyword\">if</span> justLeading\n        nodeA.range[<span class=\"hljs-number\">1</span>]\n      <span class=\"hljs-keyword\">else</span>\n        greater nodeA.range[<span class=\"hljs-number\">1</span>], nodeB.range[<span class=\"hljs-number\">1</span>]\n    ]\n    start:\n      <span class=\"hljs-keyword\">if</span> justEnding\n        nodeA.start\n      <span class=\"hljs-keyword\">else</span>\n        lesser nodeA.start, nodeB.start\n    end:\n      <span class=\"hljs-keyword\">if</span> justLeading\n        nodeA.end\n      <span class=\"hljs-keyword\">else</span>\n        greater nodeA.end, nodeB.end</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-368\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-368\">&#x00a7;</a>\n              </div>\n              <p>Convert Jison-style node class location data to Babel-style location data</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.jisonLocationDataToAstLocationData = jisonLocationDataToAstLocationData = <span class=\"hljs-function\"><span class=\"hljs-params\">({first_line, first_column, last_line_exclusive, last_column_exclusive, range})</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span>\n    loc:\n      start:\n        line:   first_line + <span class=\"hljs-number\">1</span>\n        column: first_column\n      end:\n        line:   last_line_exclusive + <span class=\"hljs-number\">1</span>\n        column: last_column_exclusive\n    range: [\n      range[<span class=\"hljs-number\">0</span>]\n      range[<span class=\"hljs-number\">1</span>]\n    ]\n    start: range[<span class=\"hljs-number\">0</span>]\n    end:   range[<span class=\"hljs-number\">1</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-369\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-369\">&#x00a7;</a>\n              </div>\n              <p>Generate a zero-width location data that corresponds to the end of another node’s location.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">zeroWidthLocationDataFromEndLocation</span> = <span class=\"hljs-params\">({range: [, endRange], last_line_exclusive, last_column_exclusive})</span> -&gt;</span> {\n  first_line: last_line_exclusive\n  first_column: last_column_exclusive\n  last_line: last_line_exclusive\n  last_column: last_column_exclusive\n  last_line_exclusive\n  last_column_exclusive\n  range: [endRange, endRange]\n}\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">extractSameLineLocationDataFirst</span> = <span class=\"hljs-params\">(numChars)</span> -&gt;</span> ({range: [startRange], first_line, first_column}) -&gt; {\n  first_line\n  first_column\n  last_line: first_line\n  last_column: first_column + numChars - <span class=\"hljs-number\">1</span>\n  last_line_exclusive: first_line\n  last_column_exclusive: first_column + numChars\n  range: [startRange, startRange + numChars]\n}\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">extractSameLineLocationDataLast</span> = <span class=\"hljs-params\">(numChars)</span> -&gt;</span> ({range: [, endRange], last_line, last_column, last_line_exclusive, last_column_exclusive}) -&gt; {\n  first_line: last_line\n  first_column: last_column - (numChars - <span class=\"hljs-number\">1</span>)\n  last_line: last_line\n  last_column: last_column\n  last_line_exclusive\n  last_column_exclusive\n  range: [endRange - numChars, endRange]\n}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-370\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-370\">&#x00a7;</a>\n              </div>\n              <p>We don’t currently have a token corresponding to the empty space\nbetween interpolation/JSX expression braces, so piece together the location\ndata by trimming the braces from the Interpolation’s location data.\nTechnically the last_line/last_column calculation here could be\nincorrect if the ending brace is preceded by a newline, but\nlast_line/last_column aren’t used for AST generation anyway.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">emptyExpressionLocationData</span> = <span class=\"hljs-params\">({interpolationNode: element, openingBrace, closingBrace})</span> -&gt;</span>\n  first_line:            element.locationData.first_line\n  first_column:          element.locationData.first_column + openingBrace.length\n  last_line:             element.locationData.last_line\n  last_column:           element.locationData.last_column - closingBrace.length\n  last_line_exclusive:   element.locationData.last_line\n  last_column_exclusive: element.locationData.last_column\n  range: [\n    element.locationData.range[<span class=\"hljs-number\">0</span>] + openingBrace.length\n    element.locationData.range[<span class=\"hljs-number\">1</span>] - closingBrace.length\n  ]</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/optparse.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>optparse.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>optparse.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>{repeat} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./helpers&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>A simple <strong>OptionParser</strong> class to parse option flags from the command-line.\nUse it like so:</p>\n<pre><code>parser  = <span class=\"hljs-keyword\">new</span> OptionParser switches, helpBanner\noptions = parser.parse process.argv\n</code></pre>\n<p>The first non-option is considered to be the start of the file (and file\noption) list, and all subsequent arguments are left unparsed.</p>\n<p>The <code>coffee</code> command uses an instance of <strong>OptionParser</strong> to parse its\ncommand-line arguments in <code>src/command.coffee</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.OptionParser = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">OptionParser</span></span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <p>Initialize with a list of valid options, in the form:</p>\n<pre><code>[short-flag, long-flag, description]\n</code></pre>\n<p>Along with an optional banner for the usage help.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(ruleDeclarations, @banner)</span> -&gt;</span>\n    @rules = buildRules ruleDeclarations</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              <p>Parse the list of arguments, populating an <code>options</code> object with all of the\nspecified options, and return it. Options after the first non-option\nargument are treated as arguments. <code>options.arguments</code> will be an array\ncontaining the remaining arguments. This is a simpler API than many option\nparsers that allow you to attach callback actions for every flag. Instead,\nyou’re responsible for interpreting the options object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  parse: <span class=\"hljs-function\"><span class=\"hljs-params\">(args)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>The CoffeeScript option parser is a little odd; options after the first\nnon-option argument are treated as non-option arguments themselves.\nOptional arguments are normalized by expanding merged flags into multiple\nflags. This allows you to have <code>-wl</code> be the same as <code>--watch --lint</code>.\nNote that executable scripts with a shebang (<code>#!</code>) line should use the\nline <code>#!/usr/bin/env coffee</code>, or <code>#!/absolute/path/to/coffee</code>, without a\n<code>--</code> argument after, because that will fail on Linux (see #3946).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    {rules, positional} = normalizeArguments args, @rules.flagDict\n    options = {}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>The <code>argument</code> field is added to the rule instance non-destructively by\n<code>normalizeArguments</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">for</span> {hasArgument, argument, isList, name} <span class=\"hljs-keyword\">in</span> rules\n      <span class=\"hljs-keyword\">if</span> hasArgument\n        <span class=\"hljs-keyword\">if</span> isList\n          options[name] ?= []\n          options[name].push argument\n        <span class=\"hljs-keyword\">else</span>\n          options[name] = argument\n      <span class=\"hljs-keyword\">else</span>\n        options[name] = <span class=\"hljs-literal\">true</span>\n\n    <span class=\"hljs-keyword\">if</span> positional[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;--&#x27;</span>\n      options.doubleDashed = <span class=\"hljs-literal\">yes</span>\n      positional = positional[<span class=\"hljs-number\">1.</span>.]\n\n    options.arguments = positional\n    options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>Return the help text for this <strong>OptionParser</strong>, listing and describing all\nof the valid options, for <code>--help</code> and such.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  help: <span class=\"hljs-function\">-&gt;</span>\n    lines = []\n    lines.unshift <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{@banner}</span>\\n&quot;</span> <span class=\"hljs-keyword\">if</span> @banner\n    <span class=\"hljs-keyword\">for</span> rule <span class=\"hljs-keyword\">in</span> @rules.ruleList\n      spaces  = <span class=\"hljs-number\">15</span> - rule.longFlag.length\n      spaces  = <span class=\"hljs-keyword\">if</span> spaces &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> repeat <span class=\"hljs-string\">&#x27; &#x27;</span>, spaces <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n      letPart = <span class=\"hljs-keyword\">if</span> rule.shortFlag <span class=\"hljs-keyword\">then</span> rule.shortFlag + <span class=\"hljs-string\">&#x27;, &#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;    &#x27;</span>\n      lines.push <span class=\"hljs-string\">&#x27;  &#x27;</span> + letPart + rule.longFlag + spaces + rule.description\n    <span class=\"hljs-string\">&quot;\\n<span class=\"hljs-subst\">#{ lines.join(<span class=\"hljs-string\">&#x27;\\n&#x27;</span>) }</span>\\n&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <h2 id=\"helpers\">Helpers</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>Regex matchers for option flags on the command line and their rules.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>LONG_FLAG  = <span class=\"hljs-regexp\">/^(--\\w[\\w\\-]*)/</span>\nSHORT_FLAG = <span class=\"hljs-regexp\">/^(-\\w)$/</span>\nMULTI_FLAG = <span class=\"hljs-regexp\">/^-(\\w{2,})/</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-11\">&#x00a7;</a>\n              </div>\n              <p>Matches the long flag part of a rule for an option with an argument. Not\napplied to anything in process.argv.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>OPTIONAL   = <span class=\"hljs-regexp\">/\\[(\\w+(\\*?))\\]/</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-12\">&#x00a7;</a>\n              </div>\n              <p>Build and return the list of option rules. If the optional <em>short-flag</em> is\nunspecified, leave it out by padding with <code>null</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">buildRules</span> = <span class=\"hljs-params\">(ruleDeclarations)</span> -&gt;</span>\n  ruleList = <span class=\"hljs-keyword\">for</span> tuple <span class=\"hljs-keyword\">in</span> ruleDeclarations\n    tuple.unshift <span class=\"hljs-literal\">null</span> <span class=\"hljs-keyword\">if</span> tuple.length &lt; <span class=\"hljs-number\">3</span>\n    buildRule tuple...\n  flagDict = {}\n  <span class=\"hljs-keyword\">for</span> rule <span class=\"hljs-keyword\">in</span> ruleList</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-13\">&#x00a7;</a>\n              </div>\n              <p><code>shortFlag</code> is null if not provided in the rule.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">for</span> flag <span class=\"hljs-keyword\">in</span> [rule.shortFlag, rule.longFlag] <span class=\"hljs-keyword\">when</span> flag?\n      <span class=\"hljs-keyword\">if</span> flagDict[flag]?\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span> <span class=\"hljs-string\">&quot;flag <span class=\"hljs-subst\">#{flag}</span> for switch <span class=\"hljs-subst\">#{rule.name}</span>\n          was already declared for switch <span class=\"hljs-subst\">#{flagDict[flag].name}</span>&quot;</span>\n      flagDict[flag] = rule\n\n  {ruleList, flagDict}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-14\">&#x00a7;</a>\n              </div>\n              <p>Build a rule from a <code>-o</code> short flag, a <code>--output [DIR]</code> long flag, and the\ndescription of what the option does.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">buildRule</span> = <span class=\"hljs-params\">(shortFlag, longFlag, description)</span> -&gt;</span>\n  match     = longFlag.match(OPTIONAL)\n  shortFlag = shortFlag?.match(SHORT_FLAG)[<span class=\"hljs-number\">1</span>]\n  longFlag  = longFlag.match(LONG_FLAG)[<span class=\"hljs-number\">1</span>]\n  {\n    name:         longFlag.replace <span class=\"hljs-regexp\">/^--/</span>, <span class=\"hljs-string\">&#x27;&#x27;</span>\n    shortFlag:    shortFlag\n    longFlag:     longFlag\n    description:  description\n    hasArgument:  !!(match <span class=\"hljs-keyword\">and</span> match[<span class=\"hljs-number\">1</span>])\n    isList:       !!(match <span class=\"hljs-keyword\">and</span> match[<span class=\"hljs-number\">2</span>])\n  }\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">normalizeArguments</span> = <span class=\"hljs-params\">(args, flagDict)</span> -&gt;</span>\n  rules = []\n  positional = []\n  needsArgOpt = <span class=\"hljs-literal\">null</span>\n  <span class=\"hljs-keyword\">for</span> arg, argIndex <span class=\"hljs-keyword\">in</span> args</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-15\">&#x00a7;</a>\n              </div>\n              <p>If the previous argument given to the script was an option that uses the\nnext command-line argument as its argument, create copy of the option’s\nrule with an <code>argument</code> field.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> needsArgOpt?\n      withArg = <span class=\"hljs-built_in\">Object</span>.assign {}, needsArgOpt.rule, {argument: arg}\n      rules.push withArg\n      needsArgOpt = <span class=\"hljs-literal\">null</span>\n      <span class=\"hljs-keyword\">continue</span>\n\n    multiFlags = arg.match(MULTI_FLAG)?[<span class=\"hljs-number\">1</span>]\n      .split(<span class=\"hljs-string\">&#x27;&#x27;</span>)\n      .map (flagName) -&gt; <span class=\"hljs-string\">&quot;-<span class=\"hljs-subst\">#{flagName}</span>&quot;</span>\n    <span class=\"hljs-keyword\">if</span> multiFlags?\n      multiOpts = multiFlags.map (flag) -&gt;\n        rule = flagDict[flag]\n        <span class=\"hljs-keyword\">unless</span> rule?\n          <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span> <span class=\"hljs-string\">&quot;unrecognized option <span class=\"hljs-subst\">#{flag}</span> in multi-flag <span class=\"hljs-subst\">#{arg}</span>&quot;</span>\n        {rule, flag}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-16\">&#x00a7;</a>\n              </div>\n              <p>Only the last flag in a multi-flag may have an argument.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      [innerOpts..., lastOpt] = multiOpts\n      <span class=\"hljs-keyword\">for</span> {rule, flag} <span class=\"hljs-keyword\">in</span> innerOpts\n        <span class=\"hljs-keyword\">if</span> rule.hasArgument\n          <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span> <span class=\"hljs-string\">&quot;cannot use option <span class=\"hljs-subst\">#{flag}</span> in multi-flag <span class=\"hljs-subst\">#{arg}</span> except\n          as the last option, because it needs an argument&quot;</span>\n        rules.push rule\n      <span class=\"hljs-keyword\">if</span> lastOpt.rule.hasArgument\n        needsArgOpt = lastOpt\n      <span class=\"hljs-keyword\">else</span>\n        rules.push lastOpt.rule\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> ([LONG_FLAG, SHORT_FLAG].some (pat) -&gt; arg.match(pat)?)\n      singleRule = flagDict[arg]\n      <span class=\"hljs-keyword\">unless</span> singleRule?\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span> <span class=\"hljs-string\">&quot;unrecognized option <span class=\"hljs-subst\">#{arg}</span>&quot;</span>\n      <span class=\"hljs-keyword\">if</span> singleRule.hasArgument\n        needsArgOpt = {rule: singleRule, flag: arg}\n      <span class=\"hljs-keyword\">else</span>\n        rules.push singleRule\n    <span class=\"hljs-keyword\">else</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-17\">&#x00a7;</a>\n              </div>\n              <p>This is a positional argument.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      positional = args[argIndex..]\n      <span class=\"hljs-keyword\">break</span>\n\n  <span class=\"hljs-keyword\">if</span> needsArgOpt?\n    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span> <span class=\"hljs-string\">&quot;value required for <span class=\"hljs-subst\">#{needsArgOpt.flag}</span>, but it was the last\n    argument provided&quot;</span>\n  {rules, positional}</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/public/stylesheets/normalize.css",
    "content": "/*! normalize.css v2.0.1 | MIT License | git.io/normalize */\n\n/* ==========================================================================\n   HTML5 display definitions\n   ========================================================================== */\n\n/*\n * Corrects `block` display not defined in IE 8/9.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection,\nsummary {\n    display: block;\n}\n\n/*\n * Corrects `inline-block` display not defined in IE 8/9.\n */\n\naudio,\ncanvas,\nvideo {\n    display: inline-block;\n}\n\n/*\n * Prevents modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n    display: none;\n    height: 0;\n}\n\n/*\n * Addresses styling for `hidden` attribute not present in IE 8/9.\n */\n\n[hidden] {\n    display: none;\n}\n\n/* ==========================================================================\n   Base\n   ========================================================================== */\n\n/*\n * 1. Sets default font family to sans-serif.\n * 2. Prevents iOS text size adjust after orientation change, without disabling\n *    user zoom.\n */\n\nhtml {\n    font-family: sans-serif; /* 1 */\n    -webkit-text-size-adjust: 100%; /* 2 */\n    -ms-text-size-adjust: 100%; /* 2 */\n}\n\n/*\n * Removes default margin.\n */\n\nbody {\n    margin: 0;\n}\n\n/* ==========================================================================\n   Links\n   ========================================================================== */\n\n/*\n * Addresses `outline` inconsistency between Chrome and other browsers.\n */\n\na:focus {\n    outline: thin dotted;\n}\n\n/*\n * Improves readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n    outline: 0;\n}\n\n/* ==========================================================================\n   Typography\n   ========================================================================== */\n\n/*\n * Addresses `h1` font sizes within `section` and `article` in Firefox 4+,\n * Safari 5, and Chrome.\n */\n\nh1 {\n    font-size: 2em;\n}\n\n/*\n * Addresses styling not present in IE 8/9, Safari 5, and Chrome.\n */\n\nabbr[title] {\n    border-bottom: 1px dotted;\n}\n\n/*\n * Addresses style set to `bolder` in Firefox 4+, Safari 5, and Chrome.\n */\n\nb,\nstrong {\n    font-weight: bold;\n}\n\n/*\n * Addresses styling not present in Safari 5 and Chrome.\n */\n\ndfn {\n    font-style: italic;\n}\n\n/*\n * Addresses styling not present in IE 8/9.\n */\n\nmark {\n    background: #ff0;\n    color: #000;\n}\n\n\n/*\n * Corrects font family set oddly in Safari 5 and Chrome.\n */\n\ncode,\nkbd,\npre,\nsamp {\n    font-family: monospace, serif;\n    font-size: 1em;\n}\n\n/*\n * Improves readability of pre-formatted text in all browsers.\n */\n\npre {\n    white-space: pre;\n    white-space: pre-wrap;\n    word-wrap: break-word;\n}\n\n/*\n * Sets consistent quote types.\n */\n\nq {\n    quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\n/*\n * Addresses inconsistent and variable font size in all browsers.\n */\n\nsmall {\n    font-size: 80%;\n}\n\n/*\n * Prevents `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n    font-size: 75%;\n    line-height: 0;\n    position: relative;\n    vertical-align: baseline;\n}\n\nsup {\n    top: -0.5em;\n}\n\nsub {\n    bottom: -0.25em;\n}\n\n/* ==========================================================================\n   Embedded content\n   ========================================================================== */\n\n/*\n * Removes border when inside `a` element in IE 8/9.\n */\n\nimg {\n    border: 0;\n}\n\n/*\n * Corrects overflow displayed oddly in IE 9.\n */\n\nsvg:not(:root) {\n    overflow: hidden;\n}\n\n/* ==========================================================================\n   Figures\n   ========================================================================== */\n\n/*\n * Addresses margin not present in IE 8/9 and Safari 5.\n */\n\nfigure {\n    margin: 0;\n}\n\n/* ==========================================================================\n   Forms\n   ========================================================================== */\n\n/*\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n    border: 1px solid #c0c0c0;\n    margin: 0 2px;\n    padding: 0.35em 0.625em 0.75em;\n}\n\n/*\n * 1. Corrects color not being inherited in IE 8/9.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n    border: 0; /* 1 */\n    padding: 0; /* 2 */\n}\n\n/*\n * 1. Corrects font family not being inherited in all browsers.\n * 2. Corrects font size not being inherited in all browsers.\n * 3. Addresses margins set differently in Firefox 4+, Safari 5, and Chrome\n */\n\nbutton,\ninput,\nselect,\ntextarea {\n    font-family: inherit; /* 1 */\n    font-size: 100%; /* 2 */\n    margin: 0; /* 3 */\n}\n\n/*\n * Addresses Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\nbutton,\ninput {\n    line-height: normal;\n}\n\n/*\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n *    and `video` controls.\n * 2. Corrects inability to style clickable `input` types in iOS.\n * 3. Improves usability and consistency of cursor style between image-type\n *    `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n    -webkit-appearance: button; /* 2 */\n    cursor: pointer; /* 3 */\n}\n\n/*\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\ninput[disabled] {\n    cursor: default;\n}\n\n/*\n * 1. Addresses box sizing set to `content-box` in IE 8/9.\n * 2. Removes excess padding in IE 8/9.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n    box-sizing: border-box; /* 1 */\n    padding: 0; /* 2 */\n}\n\n/*\n * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome.\n * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome\n *    (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n    -webkit-appearance: textfield; /* 1 */\n    -moz-box-sizing: content-box;\n    -webkit-box-sizing: content-box; /* 2 */\n    box-sizing: content-box;\n}\n\n/*\n * Removes inner padding and search cancel button in Safari 5 and Chrome\n * on OS X.\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n    -webkit-appearance: none;\n}\n\n/*\n * Removes inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n    border: 0;\n    padding: 0;\n}\n\n/*\n * 1. Removes default vertical scrollbar in IE 8/9.\n * 2. Improves readability and alignment in all browsers.\n */\n\ntextarea {\n    overflow: auto; /* 1 */\n    vertical-align: top; /* 2 */\n}\n\n/* ==========================================================================\n   Tables\n   ========================================================================== */\n\n/*\n * Remove most spacing between table cells.\n */\n\ntable {\n    border-collapse: collapse;\n    border-spacing: 0;\n}"
  },
  {
    "path": "docs/v2/annotated-source/register.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>register.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>register.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CoffeeScript  = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./&#x27;</span>\nchild_process = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;child_process&#x27;</span>\nhelpers       = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./helpers&#x27;</span>\npath          = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;path&#x27;</span>\n\n{patchStackTrace} = CoffeeScript</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>Check if Node’s built-in source map stack trace transformations are enabled.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>nodeSourceMapsSupportEnabled = process? <span class=\"hljs-keyword\">and</span> (\n  process.execArgv.includes(<span class=\"hljs-string\">&#x27;--enable-source-maps&#x27;</span>) <span class=\"hljs-keyword\">or</span>\n  process.env.NODE_OPTIONS?.includes(<span class=\"hljs-string\">&#x27;--enable-source-maps&#x27;</span>)\n)\n\n<span class=\"hljs-keyword\">unless</span> <span class=\"hljs-built_in\">Error</span>.prepareStackTrace <span class=\"hljs-keyword\">or</span> nodeSourceMapsSupportEnabled\n  cacheSourceMaps = <span class=\"hljs-literal\">true</span>\n  patchStackTrace()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <p>Load and run a CoffeeScript file for Node, stripping any <code>BOM</code>s.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">loadFile</span> = <span class=\"hljs-params\">(module, filename)</span> -&gt;</span>\n  options = module.options <span class=\"hljs-keyword\">or</span> getRootModule(module).options <span class=\"hljs-keyword\">or</span> {}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              <p>Currently <code>CoffeeScript.compile</code> caches all source maps if present. They\nare available in <code>getSourceMap</code> retrieved by <code>filename</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">if</span> cacheSourceMaps <span class=\"hljs-keyword\">or</span> nodeSourceMapsSupportEnabled\n    options.inlineMap = <span class=\"hljs-literal\">true</span>\n  js = CoffeeScript._compileFile filename, options\n\n  module._compile js, filename</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>If the installed version of Node supports <code>require.extensions</code>, register\nCoffeeScript as an extension.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">if</span> <span class=\"hljs-built_in\">require</span>.extensions\n  <span class=\"hljs-keyword\">for</span> ext <span class=\"hljs-keyword\">in</span> CoffeeScript.FILE_EXTENSIONS\n    <span class=\"hljs-built_in\">require</span>.extensions[ext] = loadFile</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>Patch Node’s module loader to be able to handle multi-dot extensions.\nThis is a horrible thing that should not be required.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  Module = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;module&#x27;</span>\n<span class=\"hljs-function\">\n  <span class=\"hljs-title\">findExtension</span> = <span class=\"hljs-params\">(filename)</span> -&gt;</span>\n    extensions = path.basename(filename).split <span class=\"hljs-string\">&#x27;.&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>Remove the initial dot from dotfiles.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    extensions.shift() <span class=\"hljs-keyword\">if</span> extensions[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>Start with the longest possible extension and work our way shortwards.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">while</span> extensions.shift()\n      curExtension = <span class=\"hljs-string\">&#x27;.&#x27;</span> + extensions.join <span class=\"hljs-string\">&#x27;.&#x27;</span>\n      <span class=\"hljs-keyword\">return</span> curExtension <span class=\"hljs-keyword\">if</span> Module._extensions[curExtension]\n    <span class=\"hljs-string\">&#x27;.js&#x27;</span>\n\n  Module::load = <span class=\"hljs-function\"><span class=\"hljs-params\">(filename)</span> -&gt;</span>\n    @filename = filename\n    @paths = Module._nodeModulePaths path.dirname filename\n    extension = findExtension filename\n    Module._extensions[extension](this, filename)\n    @loaded = <span class=\"hljs-literal\">true</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <p>If we’re on Node, patch <code>child_process.fork</code> so that Coffee scripts are able\nto fork both CoffeeScript files, and JavaScript files, directly.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">if</span> child_process\n  {fork} = child_process\n  binary = <span class=\"hljs-built_in\">require</span>.resolve <span class=\"hljs-string\">&#x27;../../bin/coffee&#x27;</span>\n  child_process.fork = <span class=\"hljs-function\"><span class=\"hljs-params\">(path, args, options)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> helpers.isCoffee path\n      <span class=\"hljs-keyword\">unless</span> <span class=\"hljs-built_in\">Array</span>.isArray args\n        options = args <span class=\"hljs-keyword\">or</span> {}\n        args = []\n      args = [path].concat args\n      path = binary\n    fork path, args, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>Utility function to find the <code>options</code> object attached to the topmost module.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">getRootModule</span> = <span class=\"hljs-params\">(module)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">if</span> module.parent <span class=\"hljs-keyword\">then</span> getRootModule module.parent <span class=\"hljs-keyword\">else</span> module</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/repl.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>repl.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>repl.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>fs = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;fs&#x27;</span>\npath = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;path&#x27;</span>\nvm = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;vm&#x27;</span>\nnodeREPL = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;repl&#x27;</span>\nCoffeeScript = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./&#x27;</span>\n{merge, updateSyntaxError} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./helpers&#x27;</span>\n\nsawSIGINT = <span class=\"hljs-literal\">no</span>\ntranspile = <span class=\"hljs-literal\">no</span>\n\nreplDefaults =\n  prompt: <span class=\"hljs-string\">&#x27;coffee&gt; &#x27;</span>,\n  historyFile: <span class=\"hljs-keyword\">do</span> -&gt;\n    historyPath = process.env.XDG_CACHE_HOME <span class=\"hljs-keyword\">or</span> process.env.HOME\n    path.join historyPath, <span class=\"hljs-string\">&#x27;.coffee_history&#x27;</span> <span class=\"hljs-keyword\">if</span> historyPath\n  historyMaxInputSize: <span class=\"hljs-number\">10240</span>\n  eval: <span class=\"hljs-function\"><span class=\"hljs-params\">(input, context, filename, cb)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>XXX: multiline hack.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    input = input.replace <span class=\"hljs-regexp\">/\\uFF00/g</span>, <span class=\"hljs-string\">&#x27;\\n&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <p>Node’s REPL sends the input ending with a newline and then wrapped in\nparens. Unwrap all that.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    input = input.replace <span class=\"hljs-regexp\">/^\\(([\\s\\S]*)\\n\\)$/m</span>, <span class=\"hljs-string\">&#x27;$1&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              <p>Node’s REPL v6.9.1+ sends the input wrapped in a try/catch statement.\nUnwrap that too.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    input = input.replace <span class=\"hljs-regexp\">/^\\s*try\\s*{([\\s\\S]*)}\\s*catch.*$/m</span>, <span class=\"hljs-string\">&#x27;$1&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>Require AST nodes to do some AST manipulation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    {Block, Assign, Value, Literal, Call, Code, Root} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./nodes&#x27;</span>\n\n    <span class=\"hljs-keyword\">try</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>Tokenize the clean input.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      tokens = CoffeeScript.tokens input</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>Filter out tokens generated just to hold comments.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tokens.length &gt;= <span class=\"hljs-number\">2</span> <span class=\"hljs-keyword\">and</span> tokens[<span class=\"hljs-number\">0</span>].generated <span class=\"hljs-keyword\">and</span>\n         tokens[<span class=\"hljs-number\">0</span>].comments?.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{tokens[<span class=\"hljs-number\">0</span>][<span class=\"hljs-number\">1</span>]}</span>&quot;</span> <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;&#x27;</span> <span class=\"hljs-keyword\">and</span>\n         tokens[<span class=\"hljs-number\">1</span>][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>\n        tokens = tokens[<span class=\"hljs-number\">2.</span>..]\n      <span class=\"hljs-keyword\">if</span> tokens.length &gt;= <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">and</span> tokens[tokens.length - <span class=\"hljs-number\">1</span>].generated <span class=\"hljs-keyword\">and</span>\n         tokens[tokens.length - <span class=\"hljs-number\">1</span>].comments?.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{tokens[tokens.length - <span class=\"hljs-number\">1</span>][<span class=\"hljs-number\">1</span>]}</span>&quot;</span> <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n        tokens.pop()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>Collect referenced variable names just like in <code>CoffeeScript.compile</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      referencedVars = (token[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">for</span> token <span class=\"hljs-keyword\">in</span> tokens <span class=\"hljs-keyword\">when</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <p>Generate the AST of the tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      ast = CoffeeScript.nodes(tokens).body</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>Add assignment to <code>__</code> variable to force the input to be an expression.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      ast = <span class=\"hljs-keyword\">new</span> Block [<span class=\"hljs-keyword\">new</span> Assign (<span class=\"hljs-keyword\">new</span> Value <span class=\"hljs-keyword\">new</span> Literal <span class=\"hljs-string\">&#x27;__&#x27;</span>), ast, <span class=\"hljs-string\">&#x27;=&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-11\">&#x00a7;</a>\n              </div>\n              <p>Wrap the expression in a closure to support top-level <code>await</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      ast     = <span class=\"hljs-keyword\">new</span> Code [], ast\n      isAsync = ast.isAsync</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-12\">&#x00a7;</a>\n              </div>\n              <p>Invoke the wrapping closure.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      ast    = <span class=\"hljs-keyword\">new</span> Root <span class=\"hljs-keyword\">new</span> Block [<span class=\"hljs-keyword\">new</span> Call ast]\n      js     = ast.compile {bare: <span class=\"hljs-literal\">yes</span>, locals: <span class=\"hljs-built_in\">Object</span>.keys(context), referencedVars, sharedScope: <span class=\"hljs-literal\">yes</span>}\n      <span class=\"hljs-keyword\">if</span> transpile\n        js = transpile.transpile(js, transpile.options).code</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-13\">&#x00a7;</a>\n              </div>\n              <p>Strip <code>&quot;use strict&quot;</code>, to avoid an exception on assigning to\nundeclared variable <code>__</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        js = js.replace <span class=\"hljs-regexp\">/^&quot;use strict&quot;|^&#x27;use strict&#x27;/</span>, <span class=\"hljs-string\">&#x27;&#x27;</span>\n      result = runInContext js, context, filename</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-14\">&#x00a7;</a>\n              </div>\n              <p>Await an async result, if necessary.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> isAsync\n        result.<span class=\"hljs-keyword\">then</span> (resolvedResult) -&gt;\n          cb <span class=\"hljs-literal\">null</span>, resolvedResult <span class=\"hljs-keyword\">unless</span> sawSIGINT\n        sawSIGINT = <span class=\"hljs-literal\">no</span>\n      <span class=\"hljs-keyword\">else</span>\n        cb <span class=\"hljs-literal\">null</span>, result\n    <span class=\"hljs-keyword\">catch</span> err</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-15\">&#x00a7;</a>\n              </div>\n              <p>AST’s <code>compile</code> does not add source code information to syntax errors.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      updateSyntaxError err, input\n      cb err\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">runInContext</span> = <span class=\"hljs-params\">(js, context, filename)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">if</span> context <span class=\"hljs-keyword\">is</span> global\n    vm.runInThisContext js, filename\n  <span class=\"hljs-keyword\">else</span>\n    vm.runInContext js, context, filename\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">addMultilineHandler</span> = <span class=\"hljs-params\">(repl)</span> -&gt;</span>\n  {inputStream, outputStream} = repl</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-16\">&#x00a7;</a>\n              </div>\n              <p>Node 0.11.12 changed API, prompt is now _prompt.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  origPrompt = repl._prompt ? repl.prompt\n\n  multiline =\n    enabled: <span class=\"hljs-literal\">off</span>\n    initialPrompt: origPrompt.replace <span class=\"hljs-regexp\">/^[^&gt; ]*/</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(x)</span> -&gt;</span> x.replace <span class=\"hljs-regexp\">/./g</span>, <span class=\"hljs-string\">&#x27;-&#x27;</span>\n    prompt: origPrompt.replace <span class=\"hljs-regexp\">/^[^&gt; ]*&gt;?/</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(x)</span> -&gt;</span> x.replace <span class=\"hljs-regexp\">/./g</span>, <span class=\"hljs-string\">&#x27;.&#x27;</span>\n    buffer: <span class=\"hljs-string\">&#x27;&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-17\">&#x00a7;</a>\n              </div>\n              <p>Proxy node’s line listener</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  nodeLineListener = repl.listeners(<span class=\"hljs-string\">&#x27;line&#x27;</span>)[<span class=\"hljs-number\">0</span>]\n  repl.removeListener <span class=\"hljs-string\">&#x27;line&#x27;</span>, nodeLineListener\n  repl.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">&#x27;line&#x27;</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(cmd)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> multiline.enabled\n      multiline.buffer += <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{cmd}</span>\\n&quot;</span>\n      repl.setPrompt multiline.prompt\n      repl.prompt <span class=\"hljs-literal\">true</span>\n    <span class=\"hljs-keyword\">else</span>\n      repl.setPrompt origPrompt\n      nodeLineListener cmd\n    <span class=\"hljs-keyword\">return</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-18\">&#x00a7;</a>\n              </div>\n              <p>Handle Ctrl-v</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  inputStream.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">&#x27;keypress&#x27;</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(char, key)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> key <span class=\"hljs-keyword\">and</span> key.ctrl <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> key.meta <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> key.shift <span class=\"hljs-keyword\">and</span> key.name <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;v&#x27;</span>\n    <span class=\"hljs-keyword\">if</span> multiline.enabled</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-19\">&#x00a7;</a>\n              </div>\n              <p>allow arbitrarily switching between modes any time before multiple lines are entered</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">unless</span> multiline.buffer.match <span class=\"hljs-regexp\">/\\n/</span>\n        multiline.enabled = <span class=\"hljs-keyword\">not</span> multiline.enabled\n        repl.setPrompt origPrompt\n        repl.prompt <span class=\"hljs-literal\">true</span>\n        <span class=\"hljs-keyword\">return</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-20\">&#x00a7;</a>\n              </div>\n              <p>no-op unless the current line is empty</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> repl.line? <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> repl.line.match <span class=\"hljs-regexp\">/^\\s*$/</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-21\">&#x00a7;</a>\n              </div>\n              <p>eval, print, loop</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      multiline.enabled = <span class=\"hljs-keyword\">not</span> multiline.enabled\n      repl.line = <span class=\"hljs-string\">&#x27;&#x27;</span>\n      repl.cursor = <span class=\"hljs-number\">0</span>\n      repl.output.cursorTo <span class=\"hljs-number\">0</span>\n      repl.output.clearLine <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-22\">&#x00a7;</a>\n              </div>\n              <p>XXX: multiline hack</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      multiline.buffer = multiline.buffer.replace <span class=\"hljs-regexp\">/\\n/g</span>, <span class=\"hljs-string\">&#x27;\\uFF00&#x27;</span>\n      repl.emit <span class=\"hljs-string\">&#x27;line&#x27;</span>, multiline.buffer\n      multiline.buffer = <span class=\"hljs-string\">&#x27;&#x27;</span>\n    <span class=\"hljs-keyword\">else</span>\n      multiline.enabled = <span class=\"hljs-keyword\">not</span> multiline.enabled\n      repl.setPrompt multiline.initialPrompt\n      repl.prompt <span class=\"hljs-literal\">true</span>\n    <span class=\"hljs-keyword\">return</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-23\">&#x00a7;</a>\n              </div>\n              <p>Store and load command history from a file</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">addHistory</span> = <span class=\"hljs-params\">(repl, filename, maxSize)</span> -&gt;</span>\n  lastLine = <span class=\"hljs-literal\">null</span>\n  <span class=\"hljs-keyword\">try</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-24\">&#x00a7;</a>\n              </div>\n              <p>Get file info and at most maxSize of command history</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    stat = fs.statSync filename\n    size = <span class=\"hljs-built_in\">Math</span>.min maxSize, stat.size</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-25\">&#x00a7;</a>\n              </div>\n              <p>Read last <code>size</code> bytes from the file</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    readFd = fs.openSync filename, <span class=\"hljs-string\">&#x27;r&#x27;</span>\n    buffer = Buffer.alloc size\n    fs.readSync readFd, buffer, <span class=\"hljs-number\">0</span>, size, stat.size - size\n    fs.closeSync readFd</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-26\">&#x00a7;</a>\n              </div>\n              <p>Set the history on the interpreter</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    repl.history = buffer.toString().split(<span class=\"hljs-string\">&#x27;\\n&#x27;</span>).reverse()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-27\">&#x00a7;</a>\n              </div>\n              <p>If the history file was truncated we should pop off a potential partial line</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    repl.history.pop() <span class=\"hljs-keyword\">if</span> stat.size &gt; maxSize</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-28\">&#x00a7;</a>\n              </div>\n              <p>Shift off the final blank newline</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    repl.history.shift() <span class=\"hljs-keyword\">if</span> repl.history[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n    repl.historyIndex = <span class=\"hljs-number\">-1</span>\n    lastLine = repl.history[<span class=\"hljs-number\">0</span>]\n\n  fd = fs.openSync filename, <span class=\"hljs-string\">&#x27;a&#x27;</span>\n\n  repl.addListener <span class=\"hljs-string\">&#x27;line&#x27;</span>, <span class=\"hljs-function\"><span class=\"hljs-params\">(code)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> code <span class=\"hljs-keyword\">and</span> code.length <span class=\"hljs-keyword\">and</span> code <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;.history&#x27;</span> <span class=\"hljs-keyword\">and</span> code <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;.exit&#x27;</span> <span class=\"hljs-keyword\">and</span> lastLine <span class=\"hljs-keyword\">isnt</span> code</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-29\">&#x00a7;</a>\n              </div>\n              <p>Save the latest command in the file</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      fs.writeSync fd, <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{code}</span>\\n&quot;</span>\n      lastLine = code</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-30\">&#x00a7;</a>\n              </div>\n              <p>XXX: The SIGINT event from REPLServer is undocumented, so this is a bit fragile</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  repl.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">&#x27;SIGINT&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> sawSIGINT = <span class=\"hljs-literal\">yes</span>\n  repl.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">&#x27;exit&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> fs.closeSync fd</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-31\">&#x00a7;</a>\n              </div>\n              <p>Add a command to show the history stack</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  repl.commands[getCommandId(repl, <span class=\"hljs-string\">&#x27;history&#x27;</span>)] =\n    help: <span class=\"hljs-string\">&#x27;Show command history&#x27;</span>\n    action: <span class=\"hljs-function\">-&gt;</span>\n      repl.outputStream.write <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{repl.history[..].reverse().join <span class=\"hljs-string\">&#x27;\\n&#x27;</span>}</span>\\n&quot;</span>\n      repl.displayPrompt()\n<span class=\"hljs-function\">\n<span class=\"hljs-title\">getCommandId</span> = <span class=\"hljs-params\">(repl, commandName)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-32\">&#x00a7;</a>\n              </div>\n              <p>Node 0.11 changed API, a command such as ‘.help’ is now stored as ‘help’</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  commandsHaveLeadingDot = repl.commands[<span class=\"hljs-string\">&#x27;.help&#x27;</span>]?\n  <span class=\"hljs-keyword\">if</span> commandsHaveLeadingDot <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&quot;.<span class=\"hljs-subst\">#{commandName}</span>&quot;</span> <span class=\"hljs-keyword\">else</span> commandName\n\nmodule.<span class=\"hljs-built_in\">exports</span> =\n  start: <span class=\"hljs-function\"><span class=\"hljs-params\">(opts = {})</span> -&gt;</span>\n    [major, minor, build] = process.versions.node.split(<span class=\"hljs-string\">&#x27;.&#x27;</span>).map (n) -&gt; <span class=\"hljs-built_in\">parseInt</span>(n, <span class=\"hljs-number\">10</span>)\n\n    <span class=\"hljs-keyword\">if</span> major &lt; <span class=\"hljs-number\">6</span>\n      console.warn <span class=\"hljs-string\">&quot;Node 6+ required for CoffeeScript REPL&quot;</span>\n      process.exit <span class=\"hljs-number\">1</span>\n\n    CoffeeScript.register()\n    process.argv = [<span class=\"hljs-string\">&#x27;coffee&#x27;</span>].concat process.argv[<span class=\"hljs-number\">2.</span>.]\n    <span class=\"hljs-keyword\">if</span> opts.transpile\n      transpile = {}\n      <span class=\"hljs-keyword\">try</span>\n        transpile.transpile = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">&#x27;@babel/core&#x27;</span>).transform\n      <span class=\"hljs-keyword\">catch</span>\n        <span class=\"hljs-keyword\">try</span>\n          transpile.transpile = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">&#x27;babel-core&#x27;</span>).transform\n        <span class=\"hljs-keyword\">catch</span>\n          console.error <span class=\"hljs-string\">&#x27;&#x27;&#x27;\n            To use --transpile with an interactive REPL, @babel/core must be installed either in the current folder or globally:\n              npm install --save-dev @babel/core\n            or\n              npm install --global @babel/core\n            And you must save options to configure Babel in one of the places it looks to find its options.\n            See https://coffeescript.org/#transpilation\n          &#x27;&#x27;&#x27;</span>\n          process.exit <span class=\"hljs-number\">1</span>\n      transpile.options =\n        filename: path.resolve process.cwd(), <span class=\"hljs-string\">&#x27;&lt;repl&gt;&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-33\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-33\">&#x00a7;</a>\n              </div>\n              <p>Since the REPL compilation path is unique (in <code>eval</code> above), we need\nanother way to get the <code>options</code> object attached to a module so that\nit knows later on whether it needs to be transpiled. In the case of\nthe REPL, the only applicable option is <code>transpile</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      Module = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;module&#x27;</span>\n      originalModuleLoad = Module::load\n      Module::load = <span class=\"hljs-function\"><span class=\"hljs-params\">(filename)</span> -&gt;</span>\n        @options = transpile: transpile.options\n        originalModuleLoad.call @, filename\n    opts = merge replDefaults, opts\n    repl = nodeREPL.start opts\n    runInContext opts.prelude, repl.context, <span class=\"hljs-string\">&#x27;prelude&#x27;</span> <span class=\"hljs-keyword\">if</span> opts.prelude\n    repl.<span class=\"hljs-literal\">on</span> <span class=\"hljs-string\">&#x27;exit&#x27;</span>, <span class=\"hljs-function\">-&gt;</span> repl.outputStream.write <span class=\"hljs-string\">&#x27;\\n&#x27;</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> repl.closed\n    addMultilineHandler repl\n    addHistory repl, opts.historyFile, opts.historyMaxInputSize <span class=\"hljs-keyword\">if</span> opts.historyFile</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-34\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-34\">&#x00a7;</a>\n              </div>\n              <p>Adapt help inherited from the node REPL</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    repl.commands[getCommandId(repl, <span class=\"hljs-string\">&#x27;load&#x27;</span>)].help = <span class=\"hljs-string\">&#x27;Load code from a file into this REPL session&#x27;</span>\n    repl</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/rewriter.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>rewriter.coffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>rewriter.coffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              <p>The CoffeeScript language has a good deal of optional syntax, implicit syntax,\nand shorthand syntax. This can greatly complicate a grammar and bloat\nthe resulting parse table. Instead of making the parser handle it all, we take\na series of passes over the token stream, using this <strong>Rewriter</strong> to convert\nshorthand into the unambiguous long form, add implicit indentation and\nparentheses, and generally clean things up.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n{throwSyntaxError, extractAllCommentTokens} = <span class=\"hljs-built_in\">require</span> <span class=\"hljs-string\">&#x27;./helpers&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>Move attached comments from one token to another.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">moveComments</span> = <span class=\"hljs-params\">(fromToken, toToken)</span> -&gt;</span>\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">unless</span> fromToken.comments\n  <span class=\"hljs-keyword\">if</span> toToken.comments <span class=\"hljs-keyword\">and</span> toToken.comments.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n    unshiftedComments = []\n    <span class=\"hljs-keyword\">for</span> comment <span class=\"hljs-keyword\">in</span> fromToken.comments\n      <span class=\"hljs-keyword\">if</span> comment.unshift\n        unshiftedComments.push comment\n      <span class=\"hljs-keyword\">else</span>\n        toToken.comments.push comment\n    toToken.comments = unshiftedComments.concat toToken.comments\n  <span class=\"hljs-keyword\">else</span>\n    toToken.comments = fromToken.comments\n  <span class=\"hljs-keyword\">delete</span> fromToken.comments</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <p>Create a generated token: one that exists due to a use of implicit syntax.\nOptionally have this new token take the attached comments from another token.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-title\">generate</span> = <span class=\"hljs-params\">(tag, value, origin, commentsToken)</span> -&gt;</span>\n  token = [tag, value]\n  token.generated = <span class=\"hljs-literal\">yes</span>\n  token.origin = origin <span class=\"hljs-keyword\">if</span> origin\n  moveComments commentsToken, token <span class=\"hljs-keyword\">if</span> commentsToken\n  token</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              <p>The <strong>Rewriter</strong> class is used by the <a href=\"lexer.html\">Lexer</a>, directly against\nits internal array of tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Rewriter = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Rewriter</span></span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>Rewrite the token stream in multiple passes, one logical filter at\na time. This could certainly be changed into a single pass through the\nstream, with a big ol’ efficient switch, but it’s much nicer to work with\nlike this. The order of these passes matters—indentation must be\ncorrected before implicit parentheses can be wrapped around blocks of code.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  rewrite: <span class=\"hljs-function\"><span class=\"hljs-params\">(@tokens)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>Set environment variable <code>DEBUG_TOKEN_STREAM</code> to <code>true</code> to output token\ndebugging info. Also set <code>DEBUG_REWRITTEN_TOKEN_STREAM</code> to <code>true</code> to\noutput the token stream after it has been rewritten by this file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> process?.env?.DEBUG_TOKEN_STREAM\n      console.log <span class=\"hljs-string\">&#x27;Initial token stream:&#x27;</span> <span class=\"hljs-keyword\">if</span> process.env.DEBUG_REWRITTEN_TOKEN_STREAM\n      console.log (t[<span class=\"hljs-number\">0</span>] + <span class=\"hljs-string\">&#x27;/&#x27;</span> + t[<span class=\"hljs-number\">1</span>] + (<span class=\"hljs-keyword\">if</span> t.comments <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;*&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>) <span class=\"hljs-keyword\">for</span> t <span class=\"hljs-keyword\">in</span> @tokens).join <span class=\"hljs-string\">&#x27; &#x27;</span>\n    @removeLeadingNewlines()\n    @closeOpenCalls()\n    @closeOpenIndexes()\n    @normalizeLines()\n    @tagPostfixConditionals()\n    @addImplicitBracesAndParens()\n    @rescueStowawayComments()\n    @addLocationDataToGeneratedTokens()\n    @enforceValidJSXAttributes()\n    @fixIndentationLocationData()\n    @exposeTokenDataToGrammar()\n    <span class=\"hljs-keyword\">if</span> process?.env?.DEBUG_REWRITTEN_TOKEN_STREAM\n      console.log <span class=\"hljs-string\">&#x27;Rewritten token stream:&#x27;</span> <span class=\"hljs-keyword\">if</span> process.env.DEBUG_TOKEN_STREAM\n      console.log (t[<span class=\"hljs-number\">0</span>] + <span class=\"hljs-string\">&#x27;/&#x27;</span> + t[<span class=\"hljs-number\">1</span>] + (<span class=\"hljs-keyword\">if</span> t.comments <span class=\"hljs-keyword\">then</span> <span class=\"hljs-string\">&#x27;*&#x27;</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-string\">&#x27;&#x27;</span>) <span class=\"hljs-keyword\">for</span> t <span class=\"hljs-keyword\">in</span> @tokens).join <span class=\"hljs-string\">&#x27; &#x27;</span>\n    @tokens</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>Rewrite the token stream, looking one token ahead and behind.\nAllow the return value of the block to tell us how many tokens to move\nforwards (or backwards) in the stream, to make sure we don’t miss anything\nas tokens are inserted and removed, and the stream changes length under\nour feet.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  scanTokens: <span class=\"hljs-function\"><span class=\"hljs-params\">(block)</span> -&gt;</span>\n    {tokens} = this\n    i = <span class=\"hljs-number\">0</span>\n    i += block.call this, token, i, tokens <span class=\"hljs-keyword\">while</span> token = tokens[i]\n    <span class=\"hljs-literal\">true</span>\n\n  detectEnd: <span class=\"hljs-function\"><span class=\"hljs-params\">(i, condition, action, opts = {})</span> -&gt;</span>\n    {tokens} = this\n    levels = <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">while</span> token = tokens[i]\n      <span class=\"hljs-keyword\">return</span> action.call this, token, i <span class=\"hljs-keyword\">if</span> levels <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> condition.call this, token, i\n      <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> EXPRESSION_START\n        levels += <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> EXPRESSION_END\n        levels -= <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">if</span> levels &lt; <span class=\"hljs-number\">0</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> opts.returnOnNegativeLevel\n        <span class=\"hljs-keyword\">return</span> action.call this, token, i\n      i += <span class=\"hljs-number\">1</span>\n    i - <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>Leading newlines would introduce an ambiguity in the grammar, so we\ndispatch them here.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  removeLeadingNewlines: <span class=\"hljs-function\">-&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <p>Find the index of the first non-<code>TERMINATOR</code> token.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">for</span> [tag], i <span class=\"hljs-keyword\">in</span> @tokens <span class=\"hljs-keyword\">when</span> tag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> i <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>If there are any comments attached to the tokens we’re about to discard,\nshift them forward to what will become the new first token.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">for</span> leadingNewlineToken <span class=\"hljs-keyword\">in</span> @tokens[<span class=\"hljs-number\">0.</span>..i]\n      moveComments leadingNewlineToken, @tokens[i]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-11\">&#x00a7;</a>\n              </div>\n              <p>Discard all the leading newline tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @tokens.splice <span class=\"hljs-number\">0</span>, i</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-12\">&#x00a7;</a>\n              </div>\n              <p>The lexer has tagged the opening parenthesis of a method call. Match it with\nits paired close.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  closeOpenCalls: <span class=\"hljs-function\">-&gt;</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">condition</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;)&#x27;</span>, <span class=\"hljs-string\">&#x27;CALL_END&#x27;</span>]\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">action</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      token[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;CALL_END&#x27;</span>\n\n    @scanTokens (token, i) -&gt;\n      @detectEnd i + <span class=\"hljs-number\">1</span>, condition, action <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;CALL_START&#x27;</span>\n      <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-13\">&#x00a7;</a>\n              </div>\n              <p>The lexer has tagged the opening bracket of an indexing operation call.\nMatch it with its paired close.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  closeOpenIndexes: <span class=\"hljs-function\">-&gt;</span>\n    startToken = <span class=\"hljs-literal\">null</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">condition</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;]&#x27;</span>, <span class=\"hljs-string\">&#x27;INDEX_END&#x27;</span>]\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">action</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">if</span> @tokens.length &gt;= i <span class=\"hljs-keyword\">and</span> @tokens[i + <span class=\"hljs-number\">1</span>][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;:&#x27;</span>\n        startToken[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;[&#x27;</span>\n        token[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;]&#x27;</span>\n      <span class=\"hljs-keyword\">else</span>\n        token[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;INDEX_END&#x27;</span>\n\n    @scanTokens (token, i) -&gt;\n      <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;INDEX_START&#x27;</span>\n        startToken = token\n        @detectEnd i + <span class=\"hljs-number\">1</span>, condition, action\n      <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-14\">&#x00a7;</a>\n              </div>\n              <p>Match tags in token stream starting at <code>i</code> with <code>pattern</code>.\n<code>pattern</code> may consist of strings (equality), an array of strings (one of)\nor null (wildcard). Returns the index of the match or -1 if no match.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  indexOfTag: <span class=\"hljs-function\"><span class=\"hljs-params\">(i, pattern...)</span> -&gt;</span>\n    fuzz = <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">for</span> j <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-number\">0</span> ... pattern.length]\n      <span class=\"hljs-keyword\">continue</span> <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> pattern[j]?\n      pattern[j] = [pattern[j]] <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">typeof</span> pattern[j] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;string&#x27;</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">-1</span> <span class=\"hljs-keyword\">if</span> @tag(i + j + fuzz) <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> pattern[j]\n    i + j + fuzz - <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-15\">&#x00a7;</a>\n              </div>\n              <p>Returns <code>yes</code> if standing in front of something looking like\n<code>@&lt;x&gt;:</code>, <code>&lt;x&gt;:</code> or <code>&lt;EXPRESSION_START&gt;&lt;x&gt;...&lt;EXPRESSION_END&gt;:</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  looksObjectish: <span class=\"hljs-function\"><span class=\"hljs-params\">(j)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @indexOfTag(j, <span class=\"hljs-string\">&#x27;@&#x27;</span>, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-string\">&#x27;:&#x27;</span>) <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">-1</span> <span class=\"hljs-keyword\">or</span> @indexOfTag(j, <span class=\"hljs-literal\">null</span>, <span class=\"hljs-string\">&#x27;:&#x27;</span>) <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">-1</span>\n    index = @indexOfTag j, EXPRESSION_START\n    <span class=\"hljs-keyword\">if</span> index <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">-1</span>\n      end = <span class=\"hljs-literal\">null</span>\n      @detectEnd index + <span class=\"hljs-number\">1</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">(token)</span> -&gt;</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> EXPRESSION_END), <span class=\"hljs-function\">(<span class=\"hljs-params\">(token, i)</span> -&gt;</span> end = i)\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @tag(end + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;:&#x27;</span>\n    <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-16\">&#x00a7;</a>\n              </div>\n              <p>Returns <code>yes</code> if current line of tokens contain an element of tags on same\nexpression level. Stop searching at <code>LINEBREAKS</code> or explicit start of\ncontaining balanced expression.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  findTagsBackwards: <span class=\"hljs-function\"><span class=\"hljs-params\">(i, tags)</span> -&gt;</span>\n    backStack = []\n    <span class=\"hljs-keyword\">while</span> i &gt;= <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> (backStack.length <span class=\"hljs-keyword\">or</span>\n          @tag(i) <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> tags <span class=\"hljs-keyword\">and</span>\n          (@tag(i) <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> EXPRESSION_START <span class=\"hljs-keyword\">or</span> @tokens[i].generated) <span class=\"hljs-keyword\">and</span>\n          @tag(i) <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> LINEBREAKS)\n      backStack.push @tag(i) <span class=\"hljs-keyword\">if</span> @tag(i) <span class=\"hljs-keyword\">in</span> EXPRESSION_END\n      backStack.pop() <span class=\"hljs-keyword\">if</span> @tag(i) <span class=\"hljs-keyword\">in</span> EXPRESSION_START <span class=\"hljs-keyword\">and</span> backStack.length\n      i -= <span class=\"hljs-number\">1</span>\n    @tag(i) <span class=\"hljs-keyword\">in</span> tags</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-17\">&#x00a7;</a>\n              </div>\n              <p>Look for signs of implicit calls and objects in the token stream and\nadd them.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addImplicitBracesAndParens: <span class=\"hljs-function\">-&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-18\">&#x00a7;</a>\n              </div>\n              <p>Track current balancing depth (both implicit and explicit) on stack.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    stack = []\n    start = <span class=\"hljs-literal\">null</span>\n\n    @scanTokens (token, i, tokens) -&gt;\n      [tag]     = token\n      [prevTag] = prevToken = <span class=\"hljs-keyword\">if</span> i &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> tokens[i - <span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">else</span> []\n      [nextTag] = nextToken = <span class=\"hljs-keyword\">if</span> i &lt; tokens.length - <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">then</span> tokens[i + <span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">else</span> []\n<span class=\"hljs-function\">      <span class=\"hljs-title\">stackTop</span>  = -&gt;</span> stack[stack.length - <span class=\"hljs-number\">1</span>]\n      startIdx  = i</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-19\">&#x00a7;</a>\n              </div>\n              <p>Helper function, used for keeping track of the number of tokens consumed\nand spliced, when returning for getting a new token.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">      <span class=\"hljs-title\">forward</span>   = <span class=\"hljs-params\">(n)</span> -&gt;</span> i - startIdx + n</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-20\">&#x00a7;</a>\n              </div>\n              <p>Helper functions</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">      <span class=\"hljs-title\">isImplicit</span>        = <span class=\"hljs-params\">(stackItem)</span> -&gt;</span> stackItem?[<span class=\"hljs-number\">2</span>]?.ours\n<span class=\"hljs-function\">      <span class=\"hljs-title\">isImplicitObject</span>  = <span class=\"hljs-params\">(stackItem)</span> -&gt;</span> isImplicit(stackItem) <span class=\"hljs-keyword\">and</span> stackItem?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;{&#x27;</span>\n<span class=\"hljs-function\">      <span class=\"hljs-title\">isImplicitCall</span>    = <span class=\"hljs-params\">(stackItem)</span> -&gt;</span> isImplicit(stackItem) <span class=\"hljs-keyword\">and</span> stackItem?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;(&#x27;</span>\n<span class=\"hljs-function\">      <span class=\"hljs-title\">inImplicit</span>        = -&gt;</span> isImplicit stackTop()\n<span class=\"hljs-function\">      <span class=\"hljs-title\">inImplicitCall</span>    = -&gt;</span> isImplicitCall stackTop()\n<span class=\"hljs-function\">      <span class=\"hljs-title\">inImplicitObject</span>  = -&gt;</span> isImplicitObject stackTop()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-21\">&#x00a7;</a>\n              </div>\n              <p>Unclosed control statement inside implicit parens (like\nclass declaration or if-conditionals).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\">      <span class=\"hljs-title\">inImplicitControl</span> = -&gt;</span> inImplicit() <span class=\"hljs-keyword\">and</span> stackTop()?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;CONTROL&#x27;</span>\n<span class=\"hljs-function\">\n      <span class=\"hljs-title\">startImplicitCall</span> = <span class=\"hljs-params\">(idx)</span> -&gt;</span>\n        stack.push [<span class=\"hljs-string\">&#x27;(&#x27;</span>, idx, ours: <span class=\"hljs-literal\">yes</span>]\n        tokens.splice idx, <span class=\"hljs-number\">0</span>, generate <span class=\"hljs-string\">&#x27;CALL_START&#x27;</span>, <span class=\"hljs-string\">&#x27;(&#x27;</span>, [<span class=\"hljs-string\">&#x27;&#x27;</span>, <span class=\"hljs-string\">&#x27;implicit function call&#x27;</span>, token[<span class=\"hljs-number\">2</span>]], prevToken\n<span class=\"hljs-function\">\n      <span class=\"hljs-title\">endImplicitCall</span> = -&gt;</span>\n        stack.pop()\n        tokens.splice i, <span class=\"hljs-number\">0</span>, generate <span class=\"hljs-string\">&#x27;CALL_END&#x27;</span>, <span class=\"hljs-string\">&#x27;)&#x27;</span>, [<span class=\"hljs-string\">&#x27;&#x27;</span>, <span class=\"hljs-string\">&#x27;end of input&#x27;</span>, token[<span class=\"hljs-number\">2</span>]], prevToken\n        i += <span class=\"hljs-number\">1</span>\n<span class=\"hljs-function\">\n      <span class=\"hljs-title\">startImplicitObject</span> = <span class=\"hljs-params\">(idx, {startsLine = <span class=\"hljs-literal\">yes</span>, continuationLineIndent} = {})</span> -&gt;</span>\n        stack.push [<span class=\"hljs-string\">&#x27;{&#x27;</span>, idx, sameLine: <span class=\"hljs-literal\">yes</span>, startsLine: startsLine, ours: <span class=\"hljs-literal\">yes</span>, continuationLineIndent: continuationLineIndent]\n        val = <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">String</span> <span class=\"hljs-string\">&#x27;{&#x27;</span>\n        val.generated = <span class=\"hljs-literal\">yes</span>\n        tokens.splice idx, <span class=\"hljs-number\">0</span>, generate <span class=\"hljs-string\">&#x27;{&#x27;</span>, val, token, prevToken\n<span class=\"hljs-function\">\n      <span class=\"hljs-title\">endImplicitObject</span> = <span class=\"hljs-params\">(j)</span> -&gt;</span>\n        j = j ? i\n        stack.pop()\n        tokens.splice j, <span class=\"hljs-number\">0</span>, generate <span class=\"hljs-string\">&#x27;}&#x27;</span>, <span class=\"hljs-string\">&#x27;}&#x27;</span>, token, prevToken\n        i += <span class=\"hljs-number\">1</span>\n<span class=\"hljs-function\">\n      <span class=\"hljs-title\">implicitObjectContinues</span> = <span class=\"hljs-params\">(j)</span> =&gt;</span>\n        nextTerminatorIdx = <span class=\"hljs-literal\">null</span>\n        @detectEnd j,\n          <span class=\"hljs-function\"><span class=\"hljs-params\">(token)</span> -&gt;</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>\n          (token, i) -&gt; nextTerminatorIdx = i\n          returnOnNegativeLevel: <span class=\"hljs-literal\">yes</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> nextTerminatorIdx?\n        @looksObjectish nextTerminatorIdx + <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-22\">&#x00a7;</a>\n              </div>\n              <p>Don’t end an implicit call/object on next indent if any of these are in an argument/value.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> (\n        (inImplicitCall() <span class=\"hljs-keyword\">or</span> inImplicitObject()) <span class=\"hljs-keyword\">and</span> tag <span class=\"hljs-keyword\">in</span> CONTROL_IN_IMPLICIT <span class=\"hljs-keyword\">or</span>\n        inImplicitObject() <span class=\"hljs-keyword\">and</span> prevTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;:&#x27;</span> <span class=\"hljs-keyword\">and</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;FOR&#x27;</span>\n      )\n        stack.push [<span class=\"hljs-string\">&#x27;CONTROL&#x27;</span>, i, ours: <span class=\"hljs-literal\">yes</span>]\n        <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">1</span>)\n\n      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;INDENT&#x27;</span> <span class=\"hljs-keyword\">and</span> inImplicit()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-23\">&#x00a7;</a>\n              </div>\n              <p>An <code>INDENT</code> closes an implicit call unless</p>\n<ol>\n<li>We have seen a <code>CONTROL</code> argument on the line.</li>\n<li>The last token before the indent is part of the list below.</li>\n</ol>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> prevTag <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;=&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;-&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;[&#x27;</span>, <span class=\"hljs-string\">&#x27;(&#x27;</span>, <span class=\"hljs-string\">&#x27;,&#x27;</span>, <span class=\"hljs-string\">&#x27;{&#x27;</span>, <span class=\"hljs-string\">&#x27;ELSE&#x27;</span>, <span class=\"hljs-string\">&#x27;=&#x27;</span>]\n          <span class=\"hljs-keyword\">while</span> inImplicitCall() <span class=\"hljs-keyword\">or</span> inImplicitObject() <span class=\"hljs-keyword\">and</span> prevTag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;:&#x27;</span>\n            <span class=\"hljs-keyword\">if</span> inImplicitCall()\n              endImplicitCall()\n            <span class=\"hljs-keyword\">else</span>\n              endImplicitObject()\n        stack.pop() <span class=\"hljs-keyword\">if</span> inImplicitControl()\n        stack.push [tag, i]\n        <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">1</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-24\">&#x00a7;</a>\n              </div>\n              <p>Straightforward start of explicit expression.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> EXPRESSION_START\n        stack.push [tag, i]\n        <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">1</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-25\">&#x00a7;</a>\n              </div>\n              <p>Close all implicit expressions inside of explicitly closed expressions.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> EXPRESSION_END\n        <span class=\"hljs-keyword\">while</span> inImplicit()\n          <span class=\"hljs-keyword\">if</span> inImplicitCall()\n            endImplicitCall()\n          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> inImplicitObject()\n            endImplicitObject()\n          <span class=\"hljs-keyword\">else</span>\n            stack.pop()\n        start = stack.pop()\n<span class=\"hljs-function\">\n      <span class=\"hljs-title\">inControlFlow</span> = =&gt;</span>\n        seenFor = @findTagsBackwards(i, [<span class=\"hljs-string\">&#x27;FOR&#x27;</span>]) <span class=\"hljs-keyword\">and</span> @findTagsBackwards(i, [<span class=\"hljs-string\">&#x27;FORIN&#x27;</span>, <span class=\"hljs-string\">&#x27;FOROF&#x27;</span>, <span class=\"hljs-string\">&#x27;FORFROM&#x27;</span>])\n        controlFlow = seenFor <span class=\"hljs-keyword\">or</span> @findTagsBackwards i, [<span class=\"hljs-string\">&#x27;WHILE&#x27;</span>, <span class=\"hljs-string\">&#x27;UNTIL&#x27;</span>, <span class=\"hljs-string\">&#x27;LOOP&#x27;</span>, <span class=\"hljs-string\">&#x27;LEADING_WHEN&#x27;</span>]\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> controlFlow\n        isFunc = <span class=\"hljs-literal\">no</span>\n        tagCurrentLine = token[<span class=\"hljs-number\">2</span>].first_line\n        @detectEnd i,\n          <span class=\"hljs-function\"><span class=\"hljs-params\">(token, i)</span> -&gt;</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> LINEBREAKS\n          (token, i) -&gt;\n            [prevTag, ,{first_line}] = tokens[i - <span class=\"hljs-number\">1</span>] || []\n            isFunc = tagCurrentLine <span class=\"hljs-keyword\">is</span> first_line <span class=\"hljs-keyword\">and</span> prevTag <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;-&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;=&gt;&#x27;</span>]\n          returnOnNegativeLevel: <span class=\"hljs-literal\">yes</span>\n        isFunc</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-26\">&#x00a7;</a>\n              </div>\n              <p>Recognize standard implicit calls like\nf a, f() b, f? c, h[0] d etc.\nAdded support for spread dots on the left side: f …a</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> (tag <span class=\"hljs-keyword\">in</span> IMPLICIT_FUNC <span class=\"hljs-keyword\">and</span> token.spaced <span class=\"hljs-keyword\">or</span>\n          tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;?&#x27;</span> <span class=\"hljs-keyword\">and</span> i &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> tokens[i - <span class=\"hljs-number\">1</span>].spaced) <span class=\"hljs-keyword\">and</span>\n         (nextTag <span class=\"hljs-keyword\">in</span> IMPLICIT_CALL <span class=\"hljs-keyword\">or</span>\n         (nextTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;...&#x27;</span> <span class=\"hljs-keyword\">and</span> @tag(i + <span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">in</span> IMPLICIT_CALL <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @findTagsBackwards(i, [<span class=\"hljs-string\">&#x27;INDEX_START&#x27;</span>, <span class=\"hljs-string\">&#x27;[&#x27;</span>])) <span class=\"hljs-keyword\">or</span>\n          nextTag <span class=\"hljs-keyword\">in</span> IMPLICIT_UNSPACED_CALL <span class=\"hljs-keyword\">and</span>\n          <span class=\"hljs-keyword\">not</span> nextToken.spaced <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> nextToken.newLine) <span class=\"hljs-keyword\">and</span>\n          <span class=\"hljs-keyword\">not</span> inControlFlow()\n        tag = token[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;FUNC_EXIST&#x27;</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;?&#x27;</span>\n        startImplicitCall i + <span class=\"hljs-number\">1</span>\n        <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">2</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-27\">&#x00a7;</a>\n              </div>\n              <p>Implicit call taking an implicit indented object as first argument.</p>\n<pre><code>f\n  a: b\n  c: d\n</code></pre>\n<p>Don’t accept implicit calls of this type, when on the same line\nas the control structures below as that may misinterpret constructs like:</p>\n<pre><code><span class=\"hljs-keyword\">if</span> f\n   a: <span class=\"hljs-number\">1</span>\n</code></pre>\n<p>as</p>\n<pre><code><span class=\"hljs-keyword\">if</span> f(a: <span class=\"hljs-number\">1</span>)\n</code></pre>\n<p>which is probably always unintended.\nFurthermore don’t allow this in the first line of a literal array\nor explicit object, as that creates grammatical ambiguities (#5368).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> IMPLICIT_FUNC <span class=\"hljs-keyword\">and</span>\n         @indexOfTag(i + <span class=\"hljs-number\">1</span>, <span class=\"hljs-string\">&#x27;INDENT&#x27;</span>) &gt; <span class=\"hljs-number\">-1</span> <span class=\"hljs-keyword\">and</span> @looksObjectish(i + <span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">and</span>\n         <span class=\"hljs-keyword\">not</span> @findTagsBackwards(i, [<span class=\"hljs-string\">&#x27;CLASS&#x27;</span>, <span class=\"hljs-string\">&#x27;EXTENDS&#x27;</span>, <span class=\"hljs-string\">&#x27;IF&#x27;</span>, <span class=\"hljs-string\">&#x27;CATCH&#x27;</span>,\n          <span class=\"hljs-string\">&#x27;SWITCH&#x27;</span>, <span class=\"hljs-string\">&#x27;LEADING_WHEN&#x27;</span>, <span class=\"hljs-string\">&#x27;FOR&#x27;</span>, <span class=\"hljs-string\">&#x27;WHILE&#x27;</span>, <span class=\"hljs-string\">&#x27;UNTIL&#x27;</span>]) <span class=\"hljs-keyword\">and</span>\n         <span class=\"hljs-keyword\">not</span> ((s = stackTop()?[<span class=\"hljs-number\">0</span>]) <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;{&#x27;</span>, <span class=\"hljs-string\">&#x27;[&#x27;</span>] <span class=\"hljs-keyword\">and</span>\n              <span class=\"hljs-keyword\">not</span> isImplicit(stackTop()) <span class=\"hljs-keyword\">and</span>\n              @findTagsBackwards(i, s))\n        startImplicitCall i + <span class=\"hljs-number\">1</span>\n        stack.push [<span class=\"hljs-string\">&#x27;INDENT&#x27;</span>, i + <span class=\"hljs-number\">2</span>]\n        <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">3</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-28\">&#x00a7;</a>\n              </div>\n              <p>Implicit objects start here.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;:&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-29\">&#x00a7;</a>\n              </div>\n              <p>Go back to the (implicit) start of the object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        s = <span class=\"hljs-keyword\">switch</span>\n          <span class=\"hljs-keyword\">when</span> @tag(i - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">in</span> EXPRESSION_END\n            [startTag, startIndex] = start\n            <span class=\"hljs-keyword\">if</span> startTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;[&#x27;</span> <span class=\"hljs-keyword\">and</span> startIndex &gt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">and</span> @tag(startIndex - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;@&#x27;</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> tokens[startIndex - <span class=\"hljs-number\">1</span>].spaced\n              startIndex - <span class=\"hljs-number\">1</span>\n            <span class=\"hljs-keyword\">else</span>\n              startIndex\n          <span class=\"hljs-keyword\">when</span> @tag(i - <span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;@&#x27;</span> <span class=\"hljs-keyword\">then</span> i - <span class=\"hljs-number\">2</span>\n          <span class=\"hljs-keyword\">else</span> i - <span class=\"hljs-number\">1</span>\n\n        startsLine = s &lt;= <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">or</span> @tag(s - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">in</span> LINEBREAKS <span class=\"hljs-keyword\">or</span> tokens[s - <span class=\"hljs-number\">1</span>].newLine</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-30\">&#x00a7;</a>\n              </div>\n              <p>Are we just continuing an already declared object?\nIncluding the case where we indent on the line after an explicit ‘{‘.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> stackTop()\n          [stackTag, stackIdx] = stackTop()\n          stackNext = stack[stack.length - <span class=\"hljs-number\">2</span>]\n          <span class=\"hljs-keyword\">if</span> (stackTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;{&#x27;</span> <span class=\"hljs-keyword\">or</span>\n              stackTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;INDENT&#x27;</span> <span class=\"hljs-keyword\">and</span> stackNext?[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;{&#x27;</span> <span class=\"hljs-keyword\">and</span>\n              <span class=\"hljs-keyword\">not</span> isImplicit(stackNext) <span class=\"hljs-keyword\">and</span>\n              @findTagsBackwards(stackIdx<span class=\"hljs-number\">-1</span>, [<span class=\"hljs-string\">&#x27;{&#x27;</span>])) <span class=\"hljs-keyword\">and</span>\n             (startsLine <span class=\"hljs-keyword\">or</span> @tag(s - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;,&#x27;</span> <span class=\"hljs-keyword\">or</span> @tag(s - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;{&#x27;</span>) <span class=\"hljs-keyword\">and</span>\n             @tag(s - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> UNFINISHED\n            <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">1</span>)\n\n        preObjectToken = <span class=\"hljs-keyword\">if</span> i &gt; <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">then</span> tokens[i - <span class=\"hljs-number\">2</span>] <span class=\"hljs-keyword\">else</span> []\n        startImplicitObject(s, {startsLine: !!startsLine, continuationLineIndent: preObjectToken.continuationLineIndent})\n        <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">2</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-31\">&#x00a7;</a>\n              </div>\n              <p>End implicit calls when chaining method calls\nlike e.g.:</p>\n<pre><code>f -&gt;\n  a\n.g b, <span class=\"hljs-function\">-&gt;</span>\n  c\n.h a\n</code></pre>\n<p>and also</p>\n<pre><code>f a\n.g b\n.h a\n</code></pre>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-32\">&#x00a7;</a>\n              </div>\n              <p>Mark all enclosing objects as not sameLine</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> LINEBREAKS\n        <span class=\"hljs-keyword\">for</span> stackItem <span class=\"hljs-keyword\">in</span> stack <span class=\"hljs-keyword\">by</span> <span class=\"hljs-number\">-1</span>\n          <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> isImplicit stackItem\n          stackItem[<span class=\"hljs-number\">2</span>].sameLine = <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">if</span> isImplicitObject stackItem</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-33\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-33\">&#x00a7;</a>\n              </div>\n              <p>End indented-continuation-line implicit objects once that indentation is over.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span> <span class=\"hljs-keyword\">and</span> token.endsContinuationLineIndentation\n        {preContinuationLineIndent} = token.endsContinuationLineIndentation\n        <span class=\"hljs-keyword\">while</span> inImplicitObject() <span class=\"hljs-keyword\">and</span> (implicitObjectIndent = stackTop()[<span class=\"hljs-number\">2</span>].continuationLineIndent)? <span class=\"hljs-keyword\">and</span> implicitObjectIndent &gt; preContinuationLineIndent\n          endImplicitObject()\n\n      newLine = prevTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span> <span class=\"hljs-keyword\">or</span> prevToken.newLine\n      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> IMPLICIT_END <span class=\"hljs-keyword\">or</span>\n          (tag <span class=\"hljs-keyword\">in</span> CALL_CLOSERS <span class=\"hljs-keyword\">and</span> newLine) <span class=\"hljs-keyword\">or</span>\n          (tag <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;..&#x27;</span>, <span class=\"hljs-string\">&#x27;...&#x27;</span>] <span class=\"hljs-keyword\">and</span> @findTagsBackwards(i, [<span class=\"hljs-string\">&quot;INDEX_START&quot;</span>]))\n        <span class=\"hljs-keyword\">while</span> inImplicit()\n          [stackTag, stackIdx, {sameLine, startsLine}] = stackTop()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-34\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-34\">&#x00a7;</a>\n              </div>\n              <p>Close implicit calls when reached end of argument list</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">if</span> inImplicitCall() <span class=\"hljs-keyword\">and</span> prevTag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;,&#x27;</span> <span class=\"hljs-keyword\">or</span>\n              (prevTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;,&#x27;</span> <span class=\"hljs-keyword\">and</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> nextTag?)\n            endImplicitCall()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-35\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-35\">&#x00a7;</a>\n              </div>\n              <p>Close implicit objects such as:\nreturn a: 1, b: 2 unless true</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> inImplicitObject() <span class=\"hljs-keyword\">and</span> sameLine <span class=\"hljs-keyword\">and</span>\n                  tag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span> <span class=\"hljs-keyword\">and</span> prevTag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;:&#x27;</span> <span class=\"hljs-keyword\">and</span>\n                  <span class=\"hljs-keyword\">not</span> (tag <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;POST_IF&#x27;</span>, <span class=\"hljs-string\">&#x27;FOR&#x27;</span>, <span class=\"hljs-string\">&#x27;WHILE&#x27;</span>, <span class=\"hljs-string\">&#x27;UNTIL&#x27;</span>] <span class=\"hljs-keyword\">and</span> startsLine <span class=\"hljs-keyword\">and</span> implicitObjectContinues(i + <span class=\"hljs-number\">1</span>))\n            endImplicitObject()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-36\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-36\">&#x00a7;</a>\n              </div>\n              <p>Close implicit objects when at end of line, line didn’t end with a comma\nand the implicit object didn’t start the line or the next line doesn’t look like\nthe continuation of an object.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> inImplicitObject() <span class=\"hljs-keyword\">and</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span> <span class=\"hljs-keyword\">and</span> prevTag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;,&#x27;</span> <span class=\"hljs-keyword\">and</span>\n                  <span class=\"hljs-keyword\">not</span> (startsLine <span class=\"hljs-keyword\">and</span> @looksObjectish(i + <span class=\"hljs-number\">1</span>))\n            endImplicitObject()\n          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> inImplicitControl() <span class=\"hljs-keyword\">and</span> tokens[stackTop()[<span class=\"hljs-number\">1</span>]][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;CLASS&#x27;</span> <span class=\"hljs-keyword\">and</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>\n            stack.pop()\n          <span class=\"hljs-keyword\">else</span>\n            <span class=\"hljs-keyword\">break</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-37\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-37\">&#x00a7;</a>\n              </div>\n              <p>Close implicit object if comma is the last character\nand what comes after doesn’t look like it belongs.\nThis is used for trailing commas and calls, like:</p>\n<pre><code>x =\n    a: b,\n    c: d,\ne = <span class=\"hljs-number\">2</span>\n</code></pre>\n<p>and</p>\n<pre><code>f a, b: c, d: e, f, g: h: i, j\n</code></pre>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;,&#x27;</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> @looksObjectish(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">and</span> inImplicitObject() <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> (@tag(i + <span class=\"hljs-number\">2</span>) <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;FOROF&#x27;</span>, <span class=\"hljs-string\">&#x27;FORIN&#x27;</span>]) <span class=\"hljs-keyword\">and</span>\n         (nextTag <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span> <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> @looksObjectish(i + <span class=\"hljs-number\">2</span>))</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-38\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-38\">&#x00a7;</a>\n              </div>\n              <p>When nextTag is OUTDENT the comma is insignificant and\nshould just be ignored so embed it in the implicit object.</p>\n<p>When it isn’t the comma go on to play a role in a call or\narray further up the stack, so give it a chance.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        offset = <span class=\"hljs-keyword\">if</span> nextTag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-number\">0</span>\n        <span class=\"hljs-keyword\">while</span> inImplicitObject()\n          endImplicitObject i + offset\n      <span class=\"hljs-keyword\">return</span> forward(<span class=\"hljs-number\">1</span>)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-39\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-39\">&#x00a7;</a>\n              </div>\n              <p>Make sure only strings and wrapped expressions are used in JSX attributes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  enforceValidJSXAttributes: <span class=\"hljs-function\">-&gt;</span>\n    @scanTokens (token, i, tokens) -&gt;\n      <span class=\"hljs-keyword\">if</span> token.jsxColon\n        next = tokens[i + <span class=\"hljs-number\">1</span>]\n        <span class=\"hljs-keyword\">if</span> next[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;STRING_START&#x27;</span>, <span class=\"hljs-string\">&#x27;STRING&#x27;</span>, <span class=\"hljs-string\">&#x27;(&#x27;</span>]\n          throwSyntaxError <span class=\"hljs-string\">&#x27;expected wrapped or quoted JSX attribute&#x27;</span>, next[<span class=\"hljs-number\">2</span>]\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-40\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-40\">&#x00a7;</a>\n              </div>\n              <p>Not all tokens survive processing by the parser. To avoid comments getting\nlost into the ether, find comments attached to doomed tokens and move them\nto a token that will make it to the other side.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  rescueStowawayComments: <span class=\"hljs-function\">-&gt;</span>\n<span class=\"hljs-function\">    <span class=\"hljs-title\">insertPlaceholder</span> = <span class=\"hljs-params\">(token, j, tokens, method)</span> -&gt;</span>\n      tokens[method] generate <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>, <span class=\"hljs-string\">&#x27;\\n&#x27;</span>, tokens[j] <span class=\"hljs-keyword\">unless</span> tokens[j][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>\n      tokens[method] generate <span class=\"hljs-string\">&#x27;JS&#x27;</span>, <span class=\"hljs-string\">&#x27;&#x27;</span>, tokens[j], token\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">dontShiftForward</span> = <span class=\"hljs-params\">(i, tokens)</span> -&gt;</span>\n      j = i + <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">while</span> j <span class=\"hljs-keyword\">isnt</span> tokens.length <span class=\"hljs-keyword\">and</span> tokens[j][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> DISCARDED\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> tokens[j][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;INTERPOLATION_END&#x27;</span>\n        j++\n      <span class=\"hljs-literal\">no</span>\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">shiftCommentsForward</span> = <span class=\"hljs-params\">(token, i, tokens)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-41\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-41\">&#x00a7;</a>\n              </div>\n              <p>Find the next surviving token and attach this token’s comments to it,\nwith a flag that we know to output such comments <em>before</em> that\ntoken’s own compilation. (Otherwise comments are output following\nthe token they’re attached to.)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      j = i\n      j++ <span class=\"hljs-keyword\">while</span> j <span class=\"hljs-keyword\">isnt</span> tokens.length <span class=\"hljs-keyword\">and</span> tokens[j][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> DISCARDED\n      <span class=\"hljs-keyword\">unless</span> j <span class=\"hljs-keyword\">is</span> tokens.length <span class=\"hljs-keyword\">or</span> tokens[j][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> DISCARDED\n        comment.unshift = <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">for</span> comment <span class=\"hljs-keyword\">in</span> token.comments\n        moveComments token, tokens[j]\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-comment\"># All following tokens are doomed!</span>\n        j = tokens.length - <span class=\"hljs-number\">1</span>\n        insertPlaceholder token, j, tokens, <span class=\"hljs-string\">&#x27;push&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-42\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-42\">&#x00a7;</a>\n              </div>\n              <p>The generated tokens were added to the end, not inline, so we don’t skip.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span>\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">shiftCommentsBackward</span> = <span class=\"hljs-params\">(token, i, tokens)</span> -&gt;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-43\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-43\">&#x00a7;</a>\n              </div>\n              <p>Find the last surviving token and attach this token’s comments to it.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      j = i\n      j-- <span class=\"hljs-keyword\">while</span> j <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">-1</span> <span class=\"hljs-keyword\">and</span> tokens[j][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> DISCARDED\n      <span class=\"hljs-keyword\">unless</span> j <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">-1</span> <span class=\"hljs-keyword\">or</span> tokens[j][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> DISCARDED\n        moveComments token, tokens[j]\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-comment\"># All previous tokens are doomed!</span>\n        insertPlaceholder token, <span class=\"hljs-number\">0</span>, tokens, <span class=\"hljs-string\">&#x27;unshift&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-44\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-44\">&#x00a7;</a>\n              </div>\n              <p>We added two tokens, so shift forward to account for the insertion.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">3</span>\n\n    @scanTokens (token, i, tokens) -&gt;\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">unless</span> token.comments\n      ret = <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> DISCARDED</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-45\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-45\">&#x00a7;</a>\n              </div>\n              <p>This token won’t survive passage through the parser, so we need to\nrescue its attached tokens and redistribute them to nearby tokens.\nComments that don’t start a new line can shift backwards to the last\nsafe token, while other tokens should shift forward.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        dummyToken = comments: []\n        j = token.comments.length - <span class=\"hljs-number\">1</span>\n        <span class=\"hljs-keyword\">until</span> j <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">-1</span>\n          <span class=\"hljs-keyword\">if</span> token.comments[j].newLine <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">and</span> token.comments[j].here <span class=\"hljs-keyword\">is</span> <span class=\"hljs-literal\">no</span>\n            dummyToken.comments.unshift token.comments[j]\n            token.comments.splice j, <span class=\"hljs-number\">1</span>\n          j--\n        <span class=\"hljs-keyword\">if</span> dummyToken.comments.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n          ret = shiftCommentsBackward dummyToken, i - <span class=\"hljs-number\">1</span>, tokens\n        <span class=\"hljs-keyword\">if</span> token.comments.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n          shiftCommentsForward token, i, tokens\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">unless</span> dontShiftForward i, tokens</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-46\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-46\">&#x00a7;</a>\n              </div>\n              <p>If any of this token’s comments start a line—there’s only\nwhitespace between the preceding newline and the start of the\ncomment—and this isn’t one of the special <code>JS</code> tokens, then\nshift this comment forward to precede the next valid token.\n<code>Block.compileComments</code> also has logic to make sure that\n“starting new line” comments follow or precede the nearest\nnewline relative to the token that the comment is attached to,\nbut that newline might be inside a <code>}</code> or <code>)</code> or other generated\ntoken that we really want this comment to output after. Therefore\nwe need to shift the comments here, avoiding such generated and\ndiscarded tokens.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        dummyToken = comments: []\n        j = token.comments.length - <span class=\"hljs-number\">1</span>\n        <span class=\"hljs-keyword\">until</span> j <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">-1</span>\n          <span class=\"hljs-keyword\">if</span> token.comments[j].newLine <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> token.comments[j].unshift <span class=\"hljs-keyword\">and</span>\n             <span class=\"hljs-keyword\">not</span> (token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;JS&#x27;</span> <span class=\"hljs-keyword\">and</span> token.generated)\n            dummyToken.comments.unshift token.comments[j]\n            token.comments.splice j, <span class=\"hljs-number\">1</span>\n          j--\n        <span class=\"hljs-keyword\">if</span> dummyToken.comments.length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>\n          ret = shiftCommentsForward dummyToken, i + <span class=\"hljs-number\">1</span>, tokens\n      <span class=\"hljs-keyword\">delete</span> token.comments <span class=\"hljs-keyword\">if</span> token.comments?.length <span class=\"hljs-keyword\">is</span> <span class=\"hljs-number\">0</span>\n      ret</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-47\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-47\">&#x00a7;</a>\n              </div>\n              <p>Add location data to all tokens generated by the rewriter.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addLocationDataToGeneratedTokens: <span class=\"hljs-function\">-&gt;</span>\n    @scanTokens (token, i, tokens) -&gt;\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span>     token[<span class=\"hljs-number\">2</span>]\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">unless</span> token.generated <span class=\"hljs-keyword\">or</span> token.explicit\n      <span class=\"hljs-keyword\">if</span> token.fromThen <span class=\"hljs-keyword\">and</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;INDENT&#x27;</span>\n        token[<span class=\"hljs-number\">2</span>] = token.origin[<span class=\"hljs-number\">2</span>]\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;{&#x27;</span> <span class=\"hljs-keyword\">and</span> nextLocation=tokens[i + <span class=\"hljs-number\">1</span>]?[<span class=\"hljs-number\">2</span>]\n        {first_line: line, first_column: column, range: [rangeIndex]} = nextLocation\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> prevLocation = tokens[i - <span class=\"hljs-number\">1</span>]?[<span class=\"hljs-number\">2</span>]\n        {last_line: line, last_column: column, range: [, rangeIndex]} = prevLocation\n        column += <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">else</span>\n        line = column = <span class=\"hljs-number\">0</span>\n        rangeIndex = <span class=\"hljs-number\">0</span>\n      token[<span class=\"hljs-number\">2</span>] = {\n        first_line:            line\n        first_column:          column\n        last_line:             line\n        last_column:           column\n        last_line_exclusive:   line\n        last_column_exclusive: column\n        range: [rangeIndex, rangeIndex]\n      }\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-48\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-48\">&#x00a7;</a>\n              </div>\n              <p><code>OUTDENT</code> tokens should always be positioned at the last character of the\nprevious token, so that AST nodes ending in an <code>OUTDENT</code> token end up with a\nlocation corresponding to the last “real” token under the node.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  fixIndentationLocationData: <span class=\"hljs-function\">-&gt;</span>\n    @allComments ?= extractAllCommentTokens @tokens\n<span class=\"hljs-function\">    <span class=\"hljs-title\">findPrecedingComment</span> = <span class=\"hljs-params\">(token, {afterPosition, indentSize, first, indented})</span> =&gt;</span>\n      tokenStart = token[<span class=\"hljs-number\">2</span>].range[<span class=\"hljs-number\">0</span>]\n<span class=\"hljs-function\">      <span class=\"hljs-title\">matches</span> = <span class=\"hljs-params\">(comment)</span> -&gt;</span>\n        <span class=\"hljs-keyword\">if</span> comment.outdented\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> indentSize? <span class=\"hljs-keyword\">and</span> comment.indentSize &gt; indentSize\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">if</span> indented <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> comment.indented\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> comment.locationData.range[<span class=\"hljs-number\">0</span>] &lt; tokenStart\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">no</span> <span class=\"hljs-keyword\">unless</span> comment.locationData.range[<span class=\"hljs-number\">0</span>] &gt; afterPosition\n        <span class=\"hljs-literal\">yes</span>\n      <span class=\"hljs-keyword\">if</span> first\n        lastMatching = <span class=\"hljs-literal\">null</span>\n        <span class=\"hljs-keyword\">for</span> comment <span class=\"hljs-keyword\">in</span> @allComments <span class=\"hljs-keyword\">by</span> <span class=\"hljs-number\">-1</span>\n          <span class=\"hljs-keyword\">if</span> matches comment\n            lastMatching = comment\n          <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> lastMatching\n            <span class=\"hljs-keyword\">return</span> lastMatching\n        <span class=\"hljs-keyword\">return</span> lastMatching\n      <span class=\"hljs-keyword\">for</span> comment <span class=\"hljs-keyword\">in</span> @allComments <span class=\"hljs-keyword\">when</span> matches comment <span class=\"hljs-keyword\">by</span> <span class=\"hljs-number\">-1</span>\n        <span class=\"hljs-keyword\">return</span> comment\n      <span class=\"hljs-literal\">null</span>\n\n    @scanTokens (token, i, tokens) -&gt;\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">unless</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;INDENT&#x27;</span>, <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>] <span class=\"hljs-keyword\">or</span>\n        (token.generated <span class=\"hljs-keyword\">and</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;CALL_END&#x27;</span> <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> token.data?.closingTagNameToken) <span class=\"hljs-keyword\">or</span>\n        (token.generated <span class=\"hljs-keyword\">and</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;}&#x27;</span>)\n      isIndent = token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;INDENT&#x27;</span>\n      prevToken = token.prevToken ? tokens[i - <span class=\"hljs-number\">1</span>]\n      prevLocationData = prevToken[<span class=\"hljs-number\">2</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-49\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-49\">&#x00a7;</a>\n              </div>\n              <p>addLocationDataToGeneratedTokens() set the outdent’s location data\nto the preceding token’s, but in order to detect comments inside an\nempty “block” we want to look for comments preceding the next token.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      useNextToken = token.explicit <span class=\"hljs-keyword\">or</span> token.generated\n      <span class=\"hljs-keyword\">if</span> useNextToken\n        nextToken = token\n        nextTokenIndex = i\n        nextToken = tokens[nextTokenIndex++] <span class=\"hljs-keyword\">while</span> (nextToken.explicit <span class=\"hljs-keyword\">or</span> nextToken.generated) <span class=\"hljs-keyword\">and</span> nextTokenIndex <span class=\"hljs-keyword\">isnt</span> tokens.length - <span class=\"hljs-number\">1</span>\n      precedingComment = findPrecedingComment(\n        <span class=\"hljs-keyword\">if</span> useNextToken\n          nextToken\n        <span class=\"hljs-keyword\">else</span>\n          token\n        afterPosition: prevLocationData.range[<span class=\"hljs-number\">0</span>]\n        indentSize: token.indentSize\n        first: isIndent\n        indented: useNextToken\n      )\n      <span class=\"hljs-keyword\">if</span> isIndent\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">unless</span> precedingComment?.newLine</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-50\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-50\">&#x00a7;</a>\n              </div>\n              <p>We don’t want e.g. an implicit call at the end of an <code>if</code> condition to\ninclude a following indented comment.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> token.generated <span class=\"hljs-keyword\">and</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;CALL_END&#x27;</span> <span class=\"hljs-keyword\">and</span> precedingComment?.indented\n      prevLocationData = precedingComment.locationData <span class=\"hljs-keyword\">if</span> precedingComment?\n      token[<span class=\"hljs-number\">2</span>] =\n        first_line:\n          <span class=\"hljs-keyword\">if</span> precedingComment?\n            prevLocationData.first_line\n          <span class=\"hljs-keyword\">else</span>\n            prevLocationData.last_line\n        first_column:\n          <span class=\"hljs-keyword\">if</span> precedingComment?\n            <span class=\"hljs-keyword\">if</span> isIndent\n              <span class=\"hljs-number\">0</span>\n            <span class=\"hljs-keyword\">else</span>\n              prevLocationData.first_column\n          <span class=\"hljs-keyword\">else</span>\n            prevLocationData.last_column\n        last_line:              prevLocationData.last_line\n        last_column:            prevLocationData.last_column\n        last_line_exclusive:    prevLocationData.last_line_exclusive\n        last_column_exclusive:  prevLocationData.last_column_exclusive\n        range:\n          <span class=\"hljs-keyword\">if</span> isIndent <span class=\"hljs-keyword\">and</span> precedingComment?\n            [\n              prevLocationData.range[<span class=\"hljs-number\">0</span>] - precedingComment.indentSize\n              prevLocationData.range[<span class=\"hljs-number\">1</span>]\n            ]\n          <span class=\"hljs-keyword\">else</span>\n            prevLocationData.range\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-51\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-51\">&#x00a7;</a>\n              </div>\n              <p>Because our grammar is LALR(1), it can’t handle some single-line\nexpressions that lack ending delimiters. The <strong>Rewriter</strong> adds the implicit\nblocks, so it doesn’t need to. To keep the grammar clean and tidy, trailing\nnewlines within expressions are removed and the indentation tokens of empty\nblocks are added.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  normalizeLines: <span class=\"hljs-function\">-&gt;</span>\n    starter = indent = outdent = <span class=\"hljs-literal\">null</span>\n    leading_switch_when = <span class=\"hljs-literal\">null</span>\n    leading_if_then = <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-52\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-52\">&#x00a7;</a>\n              </div>\n              <p>Count <code>THEN</code> tags</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    ifThens = []\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">condition</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      token[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;;&#x27;</span> <span class=\"hljs-keyword\">and</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> SINGLE_CLOSERS <span class=\"hljs-keyword\">and</span>\n      <span class=\"hljs-keyword\">not</span> (token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span> <span class=\"hljs-keyword\">and</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">in</span> EXPRESSION_CLOSE) <span class=\"hljs-keyword\">and</span>\n      <span class=\"hljs-keyword\">not</span> (token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;ELSE&#x27;</span> <span class=\"hljs-keyword\">and</span>\n           (starter <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;THEN&#x27;</span> <span class=\"hljs-keyword\">or</span> (leading_if_then <span class=\"hljs-keyword\">or</span> leading_switch_when))) <span class=\"hljs-keyword\">and</span>\n      <span class=\"hljs-keyword\">not</span> (token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;CATCH&#x27;</span>, <span class=\"hljs-string\">&#x27;FINALLY&#x27;</span>] <span class=\"hljs-keyword\">and</span> starter <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;-&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;=&gt;&#x27;</span>]) <span class=\"hljs-keyword\">or</span>\n      token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> CALL_CLOSERS <span class=\"hljs-keyword\">and</span>\n      (@tokens[i - <span class=\"hljs-number\">1</span>].newLine <span class=\"hljs-keyword\">or</span> @tokens[i - <span class=\"hljs-number\">1</span>][<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>)\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">action</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      ifThens.pop() <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;ELSE&#x27;</span> <span class=\"hljs-keyword\">and</span> starter <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;THEN&#x27;</span>\n      @tokens.splice (<span class=\"hljs-keyword\">if</span> @tag(i - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;,&#x27;</span> <span class=\"hljs-keyword\">then</span> i - <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> i), <span class=\"hljs-number\">0</span>, outdent\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">closeElseTag</span> = <span class=\"hljs-params\">(tokens, i)</span> =&gt;</span>\n      tlen = ifThens.length\n      <span class=\"hljs-keyword\">return</span> i <span class=\"hljs-keyword\">unless</span> tlen &gt; <span class=\"hljs-number\">0</span>\n      lastThen = ifThens.pop()\n      [, outdentElse] = @indentation tokens[lastThen]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-53\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-53\">&#x00a7;</a>\n              </div>\n              <p>Insert <code>OUTDENT</code> to close inner <code>IF</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      outdentElse[<span class=\"hljs-number\">1</span>] = tlen*<span class=\"hljs-number\">2</span>\n      tokens.splice(i, <span class=\"hljs-number\">0</span>, outdentElse)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-54\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-54\">&#x00a7;</a>\n              </div>\n              <p>Insert <code>OUTDENT</code> to close outer <code>IF</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      outdentElse[<span class=\"hljs-number\">1</span>] = <span class=\"hljs-number\">2</span>\n      tokens.splice(i + <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">0</span>, outdentElse)</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-55\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-55\">&#x00a7;</a>\n              </div>\n              <p>Remove outdents from the end.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      @detectEnd i + <span class=\"hljs-number\">2</span>,\n        <span class=\"hljs-function\"><span class=\"hljs-params\">(token, i)</span> -&gt;</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>, <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>]\n        (token, i) -&gt;\n            <span class=\"hljs-keyword\">if</span> @tag(i) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span> <span class=\"hljs-keyword\">and</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>\n              tokens.splice i, <span class=\"hljs-number\">2</span>\n      i + <span class=\"hljs-number\">2</span>\n\n    @scanTokens (token, i, tokens) -&gt;\n      [tag] = token\n      conditionTag = tag <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;-&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;=&gt;&#x27;</span>] <span class=\"hljs-keyword\">and</span>\n        @findTagsBackwards(i, [<span class=\"hljs-string\">&#x27;IF&#x27;</span>, <span class=\"hljs-string\">&#x27;WHILE&#x27;</span>, <span class=\"hljs-string\">&#x27;FOR&#x27;</span>, <span class=\"hljs-string\">&#x27;UNTIL&#x27;</span>, <span class=\"hljs-string\">&#x27;SWITCH&#x27;</span>, <span class=\"hljs-string\">&#x27;WHEN&#x27;</span>, <span class=\"hljs-string\">&#x27;LEADING_WHEN&#x27;</span>, <span class=\"hljs-string\">&#x27;[&#x27;</span>, <span class=\"hljs-string\">&#x27;INDEX_START&#x27;</span>]) <span class=\"hljs-keyword\">and</span>\n        <span class=\"hljs-keyword\">not</span> (@findTagsBackwards i, [<span class=\"hljs-string\">&#x27;THEN&#x27;</span>, <span class=\"hljs-string\">&#x27;..&#x27;</span>, <span class=\"hljs-string\">&#x27;...&#x27;</span>])\n\n      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>\n        <span class=\"hljs-keyword\">if</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;ELSE&#x27;</span> <span class=\"hljs-keyword\">and</span> @tag(i - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>\n          tokens.splice i, <span class=\"hljs-number\">1</span>, @indentation()...\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span>\n        <span class=\"hljs-keyword\">if</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">in</span> EXPRESSION_CLOSE\n          <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">1</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;;&#x27;</span> <span class=\"hljs-keyword\">and</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>\n            tokens[i + <span class=\"hljs-number\">1</span>].prevToken = token\n            moveComments token, tokens[i + <span class=\"hljs-number\">1</span>]\n          tokens.splice i, <span class=\"hljs-number\">1</span>\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>\n      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;CATCH&#x27;</span>\n        <span class=\"hljs-keyword\">for</span> j <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-number\">1.</span><span class=\"hljs-number\">.2</span>] <span class=\"hljs-keyword\">when</span> @tag(i + j) <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>, <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>, <span class=\"hljs-string\">&#x27;FINALLY&#x27;</span>]\n          tokens.splice i + j, <span class=\"hljs-number\">0</span>, @indentation()...\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">2</span> + j\n      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;-&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;=&gt;&#x27;</span>] <span class=\"hljs-keyword\">and</span> (@tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">in</span> [<span class=\"hljs-string\">&#x27;,&#x27;</span>, <span class=\"hljs-string\">&#x27;]&#x27;</span>] <span class=\"hljs-keyword\">or</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;.&#x27;</span> <span class=\"hljs-keyword\">and</span> token.newLine)\n        [indent, outdent] = @indentation tokens[i]\n        tokens.splice i + <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">0</span>, indent, outdent\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">in</span> SINGLE_LINERS <span class=\"hljs-keyword\">and</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;INDENT&#x27;</span> <span class=\"hljs-keyword\">and</span>\n         <span class=\"hljs-keyword\">not</span> (tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;ELSE&#x27;</span> <span class=\"hljs-keyword\">and</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IF&#x27;</span>) <span class=\"hljs-keyword\">and</span>\n         <span class=\"hljs-keyword\">not</span> conditionTag\n        starter = tag\n        [indent, outdent] = @indentation tokens[i]\n        indent.fromThen   = <span class=\"hljs-literal\">true</span> <span class=\"hljs-keyword\">if</span> starter <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;THEN&#x27;</span>\n        <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;THEN&#x27;</span>\n          leading_switch_when = @findTagsBackwards(i, [<span class=\"hljs-string\">&#x27;LEADING_WHEN&#x27;</span>]) <span class=\"hljs-keyword\">and</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IF&#x27;</span>\n          leading_if_then = @findTagsBackwards(i, [<span class=\"hljs-string\">&#x27;IF&#x27;</span>]) <span class=\"hljs-keyword\">and</span> @tag(i + <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IF&#x27;</span>\n        ifThens.push i <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;THEN&#x27;</span> <span class=\"hljs-keyword\">and</span> @findTagsBackwards(i, [<span class=\"hljs-string\">&#x27;IF&#x27;</span>])</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-56\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-56\">&#x00a7;</a>\n              </div>\n              <p><code>ELSE</code> tag is not closed.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;ELSE&#x27;</span> <span class=\"hljs-keyword\">and</span> @tag(i - <span class=\"hljs-number\">1</span>) <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>\n          i = closeElseTag tokens, i\n        tokens.splice i + <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">0</span>, indent\n        @detectEnd i + <span class=\"hljs-number\">2</span>, condition, action\n        tokens.splice i, <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">if</span> tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;THEN&#x27;</span>\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-57\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-57\">&#x00a7;</a>\n              </div>\n              <p>Tag postfix conditionals as such, so that we can parse them with a\ndifferent precedence.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  tagPostfixConditionals: <span class=\"hljs-function\">-&gt;</span>\n    original = <span class=\"hljs-literal\">null</span>\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">condition</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      [tag] = token\n      [prevTag] = @tokens[i - <span class=\"hljs-number\">1</span>]\n      tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span> <span class=\"hljs-keyword\">or</span> (tag <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;INDENT&#x27;</span> <span class=\"hljs-keyword\">and</span> prevTag <span class=\"hljs-keyword\">not</span> <span class=\"hljs-keyword\">in</span> SINGLE_LINERS)\n<span class=\"hljs-function\">\n    <span class=\"hljs-title\">action</span> = <span class=\"hljs-params\">(token, i)</span> -&gt;</span>\n      <span class=\"hljs-keyword\">if</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-string\">&#x27;INDENT&#x27;</span> <span class=\"hljs-keyword\">or</span> (token.generated <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> token.fromThen)\n        original[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-string\">&#x27;POST_&#x27;</span> + original[<span class=\"hljs-number\">0</span>]\n\n    @scanTokens (token, i) -&gt;\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">unless</span> token[<span class=\"hljs-number\">0</span>] <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;IF&#x27;</span>\n      original = token\n      @detectEnd i + <span class=\"hljs-number\">1</span>, condition, action\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-58\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-58\">&#x00a7;</a>\n              </div>\n              <p>For tokens with extra data, we want to make that data visible to the grammar\nby wrapping the token value as a String() object and setting the data as\nproperties of that object. The grammar should then be responsible for\ncleaning this up for the node constructor: unwrapping the token value to a\nprimitive string and separately passing any expected token data properties</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  exposeTokenDataToGrammar: <span class=\"hljs-function\">-&gt;</span>\n    @scanTokens (token, i) -&gt;\n      <span class=\"hljs-keyword\">if</span> token.generated <span class=\"hljs-keyword\">or</span> (token.data <span class=\"hljs-keyword\">and</span> <span class=\"hljs-built_in\">Object</span>.keys(token.data).length <span class=\"hljs-keyword\">isnt</span> <span class=\"hljs-number\">0</span>)\n        token[<span class=\"hljs-number\">1</span>] = <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">String</span> token[<span class=\"hljs-number\">1</span>]\n        token[<span class=\"hljs-number\">1</span>][key] = val <span class=\"hljs-keyword\">for</span> own key, val <span class=\"hljs-keyword\">of</span> (token.data ? {})\n        token[<span class=\"hljs-number\">1</span>].generated = <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> token.generated\n      <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-59\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-59\">&#x00a7;</a>\n              </div>\n              <p>Generate the indentation tokens, based on another token on the same line.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  indentation: <span class=\"hljs-function\"><span class=\"hljs-params\">(origin)</span> -&gt;</span>\n    indent  = [<span class=\"hljs-string\">&#x27;INDENT&#x27;</span>, <span class=\"hljs-number\">2</span>]\n    outdent = [<span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>, <span class=\"hljs-number\">2</span>]\n    <span class=\"hljs-keyword\">if</span> origin\n      indent.generated = outdent.generated = <span class=\"hljs-literal\">yes</span>\n      indent.origin = outdent.origin = origin\n    <span class=\"hljs-keyword\">else</span>\n      indent.explicit = outdent.explicit = <span class=\"hljs-literal\">yes</span>\n    [indent, outdent]\n\n  generate: generate</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-60\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-60\">&#x00a7;</a>\n              </div>\n              <p>Look up a tag by token index.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  tag: <span class=\"hljs-function\"><span class=\"hljs-params\">(i)</span> -&gt;</span> @tokens[i]?[<span class=\"hljs-number\">0</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-61\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-61\">&#x00a7;</a>\n              </div>\n              <h2 id=\"constants\">Constants</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-62\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-62\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-63\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-63\">&#x00a7;</a>\n              </div>\n              <p>List of the token pairs that must be balanced.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>BALANCED_PAIRS = [\n  [<span class=\"hljs-string\">&#x27;(&#x27;</span>, <span class=\"hljs-string\">&#x27;)&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;[&#x27;</span>, <span class=\"hljs-string\">&#x27;]&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;{&#x27;</span>, <span class=\"hljs-string\">&#x27;}&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;INDENT&#x27;</span>, <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>],\n  [<span class=\"hljs-string\">&#x27;CALL_START&#x27;</span>, <span class=\"hljs-string\">&#x27;CALL_END&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;PARAM_START&#x27;</span>, <span class=\"hljs-string\">&#x27;PARAM_END&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;INDEX_START&#x27;</span>, <span class=\"hljs-string\">&#x27;INDEX_END&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;STRING_START&#x27;</span>, <span class=\"hljs-string\">&#x27;STRING_END&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;INTERPOLATION_START&#x27;</span>, <span class=\"hljs-string\">&#x27;INTERPOLATION_END&#x27;</span>]\n  [<span class=\"hljs-string\">&#x27;REGEX_START&#x27;</span>, <span class=\"hljs-string\">&#x27;REGEX_END&#x27;</span>]\n]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-64\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-64\">&#x00a7;</a>\n              </div>\n              <p>The inverse mappings of <code>BALANCED_PAIRS</code> we’re trying to fix up, so we can\nlook things up from either end.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.INVERSES = INVERSES = {}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-65\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-65\">&#x00a7;</a>\n              </div>\n              <p>The tokens that signal the start/end of a balanced pair.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>EXPRESSION_START = []\nEXPRESSION_END   = []\n\n<span class=\"hljs-keyword\">for</span> [left, right] <span class=\"hljs-keyword\">in</span> BALANCED_PAIRS\n  EXPRESSION_START.push INVERSES[right] = left\n  EXPRESSION_END  .push INVERSES[left] = right</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-66\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-66\">&#x00a7;</a>\n              </div>\n              <p>Tokens that indicate the close of a clause of an expression.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>EXPRESSION_CLOSE = [<span class=\"hljs-string\">&#x27;CATCH&#x27;</span>, <span class=\"hljs-string\">&#x27;THEN&#x27;</span>, <span class=\"hljs-string\">&#x27;ELSE&#x27;</span>, <span class=\"hljs-string\">&#x27;FINALLY&#x27;</span>].concat EXPRESSION_END</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-67\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-67\">&#x00a7;</a>\n              </div>\n              <p>Tokens that, if followed by an <code>IMPLICIT_CALL</code>, indicate a function invocation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>IMPLICIT_FUNC    = [<span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>, <span class=\"hljs-string\">&#x27;PROPERTY&#x27;</span>, <span class=\"hljs-string\">&#x27;SUPER&#x27;</span>, <span class=\"hljs-string\">&#x27;)&#x27;</span>, <span class=\"hljs-string\">&#x27;CALL_END&#x27;</span>, <span class=\"hljs-string\">&#x27;]&#x27;</span>, <span class=\"hljs-string\">&#x27;INDEX_END&#x27;</span>, <span class=\"hljs-string\">&#x27;@&#x27;</span>, <span class=\"hljs-string\">&#x27;THIS&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-68\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-68\">&#x00a7;</a>\n              </div>\n              <p>If preceded by an <code>IMPLICIT_FUNC</code>, indicates a function invocation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>IMPLICIT_CALL    = [\n  <span class=\"hljs-string\">&#x27;IDENTIFIER&#x27;</span>, <span class=\"hljs-string\">&#x27;JSX_TAG&#x27;</span>, <span class=\"hljs-string\">&#x27;PROPERTY&#x27;</span>, <span class=\"hljs-string\">&#x27;NUMBER&#x27;</span>, <span class=\"hljs-string\">&#x27;INFINITY&#x27;</span>, <span class=\"hljs-string\">&#x27;NAN&#x27;</span>\n  <span class=\"hljs-string\">&#x27;STRING&#x27;</span>, <span class=\"hljs-string\">&#x27;STRING_START&#x27;</span>, <span class=\"hljs-string\">&#x27;REGEX&#x27;</span>, <span class=\"hljs-string\">&#x27;REGEX_START&#x27;</span>, <span class=\"hljs-string\">&#x27;JS&#x27;</span>\n  <span class=\"hljs-string\">&#x27;NEW&#x27;</span>, <span class=\"hljs-string\">&#x27;PARAM_START&#x27;</span>, <span class=\"hljs-string\">&#x27;CLASS&#x27;</span>, <span class=\"hljs-string\">&#x27;IF&#x27;</span>, <span class=\"hljs-string\">&#x27;TRY&#x27;</span>, <span class=\"hljs-string\">&#x27;SWITCH&#x27;</span>, <span class=\"hljs-string\">&#x27;THIS&#x27;</span>\n  <span class=\"hljs-string\">&#x27;DYNAMIC_IMPORT&#x27;</span>, <span class=\"hljs-string\">&#x27;IMPORT_META&#x27;</span>, <span class=\"hljs-string\">&#x27;NEW_TARGET&#x27;</span>\n  <span class=\"hljs-string\">&#x27;UNDEFINED&#x27;</span>, <span class=\"hljs-string\">&#x27;NULL&#x27;</span>, <span class=\"hljs-string\">&#x27;BOOL&#x27;</span>\n  <span class=\"hljs-string\">&#x27;UNARY&#x27;</span>, <span class=\"hljs-string\">&#x27;DO&#x27;</span>, <span class=\"hljs-string\">&#x27;DO_IIFE&#x27;</span>, <span class=\"hljs-string\">&#x27;YIELD&#x27;</span>, <span class=\"hljs-string\">&#x27;AWAIT&#x27;</span>, <span class=\"hljs-string\">&#x27;UNARY_MATH&#x27;</span>, <span class=\"hljs-string\">&#x27;SUPER&#x27;</span>, <span class=\"hljs-string\">&#x27;THROW&#x27;</span>\n  <span class=\"hljs-string\">&#x27;@&#x27;</span>, <span class=\"hljs-string\">&#x27;-&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;=&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;[&#x27;</span>, <span class=\"hljs-string\">&#x27;(&#x27;</span>, <span class=\"hljs-string\">&#x27;{&#x27;</span>, <span class=\"hljs-string\">&#x27;--&#x27;</span>, <span class=\"hljs-string\">&#x27;++&#x27;</span>\n]\n\nIMPLICIT_UNSPACED_CALL = [<span class=\"hljs-string\">&#x27;+&#x27;</span>, <span class=\"hljs-string\">&#x27;-&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-69\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-69\">&#x00a7;</a>\n              </div>\n              <p>Tokens that always mark the end of an implicit call for single-liners.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>IMPLICIT_END     = [<span class=\"hljs-string\">&#x27;POST_IF&#x27;</span>, <span class=\"hljs-string\">&#x27;FOR&#x27;</span>, <span class=\"hljs-string\">&#x27;WHILE&#x27;</span>, <span class=\"hljs-string\">&#x27;UNTIL&#x27;</span>, <span class=\"hljs-string\">&#x27;WHEN&#x27;</span>, <span class=\"hljs-string\">&#x27;BY&#x27;</span>,\n  <span class=\"hljs-string\">&#x27;LOOP&#x27;</span>, <span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-70\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-70\">&#x00a7;</a>\n              </div>\n              <p>Single-line flavors of block expressions that have unclosed endings.\nThe grammar can’t disambiguate them, so we insert the implicit indentation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>SINGLE_LINERS    = [<span class=\"hljs-string\">&#x27;ELSE&#x27;</span>, <span class=\"hljs-string\">&#x27;-&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;=&gt;&#x27;</span>, <span class=\"hljs-string\">&#x27;TRY&#x27;</span>, <span class=\"hljs-string\">&#x27;FINALLY&#x27;</span>, <span class=\"hljs-string\">&#x27;THEN&#x27;</span>]\nSINGLE_CLOSERS   = [<span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>, <span class=\"hljs-string\">&#x27;CATCH&#x27;</span>, <span class=\"hljs-string\">&#x27;FINALLY&#x27;</span>, <span class=\"hljs-string\">&#x27;ELSE&#x27;</span>, <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>, <span class=\"hljs-string\">&#x27;LEADING_WHEN&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-71\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-71\">&#x00a7;</a>\n              </div>\n              <p>Tokens that end a line.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>LINEBREAKS       = [<span class=\"hljs-string\">&#x27;TERMINATOR&#x27;</span>, <span class=\"hljs-string\">&#x27;INDENT&#x27;</span>, <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-72\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-72\">&#x00a7;</a>\n              </div>\n              <p>Tokens that close open calls when they follow a newline.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CALL_CLOSERS     = [<span class=\"hljs-string\">&#x27;.&#x27;</span>, <span class=\"hljs-string\">&#x27;?.&#x27;</span>, <span class=\"hljs-string\">&#x27;::&#x27;</span>, <span class=\"hljs-string\">&#x27;?::&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-73\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-73\">&#x00a7;</a>\n              </div>\n              <p>Tokens that prevent a subsequent indent from ending implicit calls/objects</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>CONTROL_IN_IMPLICIT = [<span class=\"hljs-string\">&#x27;IF&#x27;</span>, <span class=\"hljs-string\">&#x27;TRY&#x27;</span>, <span class=\"hljs-string\">&#x27;FINALLY&#x27;</span>, <span class=\"hljs-string\">&#x27;CATCH&#x27;</span>, <span class=\"hljs-string\">&#x27;CLASS&#x27;</span>, <span class=\"hljs-string\">&#x27;SWITCH&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-74\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-74\">&#x00a7;</a>\n              </div>\n              <p>Tokens that are swallowed up by the parser, never leading to code generation.\nYou can spot these in <code>grammar.coffee</code> because the <code>o</code> function second\nargument doesn’t contain a <code>new</code> call for these tokens.\n<code>STRING_START</code> isn’t on this list because its <code>locationData</code> matches that of\nthe node that becomes <code>StringWithInterpolations</code>, and therefore\n<code>addDataToNode</code> attaches <code>STRING_START</code>’s tokens to that node.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>DISCARDED = [<span class=\"hljs-string\">&#x27;(&#x27;</span>, <span class=\"hljs-string\">&#x27;)&#x27;</span>, <span class=\"hljs-string\">&#x27;[&#x27;</span>, <span class=\"hljs-string\">&#x27;]&#x27;</span>, <span class=\"hljs-string\">&#x27;{&#x27;</span>, <span class=\"hljs-string\">&#x27;}&#x27;</span>, <span class=\"hljs-string\">&#x27;:&#x27;</span>, <span class=\"hljs-string\">&#x27;.&#x27;</span>, <span class=\"hljs-string\">&#x27;..&#x27;</span>, <span class=\"hljs-string\">&#x27;...&#x27;</span>, <span class=\"hljs-string\">&#x27;,&#x27;</span>, <span class=\"hljs-string\">&#x27;=&#x27;</span>, <span class=\"hljs-string\">&#x27;++&#x27;</span>, <span class=\"hljs-string\">&#x27;--&#x27;</span>, <span class=\"hljs-string\">&#x27;?&#x27;</span>,\n  <span class=\"hljs-string\">&#x27;AS&#x27;</span>, <span class=\"hljs-string\">&#x27;AWAIT&#x27;</span>, <span class=\"hljs-string\">&#x27;CALL_START&#x27;</span>, <span class=\"hljs-string\">&#x27;CALL_END&#x27;</span>, <span class=\"hljs-string\">&#x27;DEFAULT&#x27;</span>, <span class=\"hljs-string\">&#x27;DO&#x27;</span>, <span class=\"hljs-string\">&#x27;DO_IIFE&#x27;</span>, <span class=\"hljs-string\">&#x27;ELSE&#x27;</span>,\n  <span class=\"hljs-string\">&#x27;EXTENDS&#x27;</span>, <span class=\"hljs-string\">&#x27;EXPORT&#x27;</span>, <span class=\"hljs-string\">&#x27;FORIN&#x27;</span>, <span class=\"hljs-string\">&#x27;FOROF&#x27;</span>, <span class=\"hljs-string\">&#x27;FORFROM&#x27;</span>, <span class=\"hljs-string\">&#x27;IMPORT&#x27;</span>, <span class=\"hljs-string\">&#x27;INDENT&#x27;</span>, <span class=\"hljs-string\">&#x27;INDEX_SOAK&#x27;</span>,\n  <span class=\"hljs-string\">&#x27;INTERPOLATION_START&#x27;</span>, <span class=\"hljs-string\">&#x27;INTERPOLATION_END&#x27;</span>, <span class=\"hljs-string\">&#x27;LEADING_WHEN&#x27;</span>, <span class=\"hljs-string\">&#x27;OUTDENT&#x27;</span>, <span class=\"hljs-string\">&#x27;PARAM_END&#x27;</span>,\n  <span class=\"hljs-string\">&#x27;REGEX_START&#x27;</span>, <span class=\"hljs-string\">&#x27;REGEX_END&#x27;</span>, <span class=\"hljs-string\">&#x27;RETURN&#x27;</span>, <span class=\"hljs-string\">&#x27;STRING_END&#x27;</span>, <span class=\"hljs-string\">&#x27;THROW&#x27;</span>, <span class=\"hljs-string\">&#x27;UNARY&#x27;</span>, <span class=\"hljs-string\">&#x27;YIELD&#x27;</span>\n].concat IMPLICIT_UNSPACED_CALL.concat IMPLICIT_END.concat CALL_CLOSERS.concat CONTROL_IN_IMPLICIT</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-75\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-75\">&#x00a7;</a>\n              </div>\n              <p>Tokens that, when appearing at the end of a line, suppress a following TERMINATOR/INDENT token</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.UNFINISHED = UNFINISHED = [<span class=\"hljs-string\">&#x27;\\\\&#x27;</span>, <span class=\"hljs-string\">&#x27;.&#x27;</span>, <span class=\"hljs-string\">&#x27;?.&#x27;</span>, <span class=\"hljs-string\">&#x27;?::&#x27;</span>, <span class=\"hljs-string\">&#x27;UNARY&#x27;</span>, <span class=\"hljs-string\">&#x27;DO&#x27;</span>, <span class=\"hljs-string\">&#x27;DO_IIFE&#x27;</span>, <span class=\"hljs-string\">&#x27;MATH&#x27;</span>, <span class=\"hljs-string\">&#x27;UNARY_MATH&#x27;</span>, <span class=\"hljs-string\">&#x27;+&#x27;</span>, <span class=\"hljs-string\">&#x27;-&#x27;</span>,\n           <span class=\"hljs-string\">&#x27;**&#x27;</span>, <span class=\"hljs-string\">&#x27;SHIFT&#x27;</span>, <span class=\"hljs-string\">&#x27;RELATION&#x27;</span>, <span class=\"hljs-string\">&#x27;COMPARE&#x27;</span>, <span class=\"hljs-string\">&#x27;&amp;&#x27;</span>, <span class=\"hljs-string\">&#x27;^&#x27;</span>, <span class=\"hljs-string\">&#x27;|&#x27;</span>, <span class=\"hljs-string\">&#x27;&amp;&amp;&#x27;</span>, <span class=\"hljs-string\">&#x27;||&#x27;</span>,\n           <span class=\"hljs-string\">&#x27;BIN?&#x27;</span>, <span class=\"hljs-string\">&#x27;EXTENDS&#x27;</span>]</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/scope.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>scope.litcoffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>scope.litcoffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              <p>The <strong>Scope</strong> class regulates lexical scoping within CoffeeScript. As you\ngenerate code, you create a tree of scopes in the same shape as the nested\nfunction bodies. Each scope knows about the variables declared within it,\nand has a reference to its parent enclosing scope. In this way, we know which\nvariables are new and need to be declared with <code>var</code>, and which are shared\nwith external scopes.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">exports</span>.Scope = <span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">Scope</span></span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>Initialize a scope with its parent, for lookups up the chain,\nas well as a reference to the <strong>Block</strong> node it belongs to, which is\nwhere it should declare its variables, a reference to the function that\nit belongs to, and a list of variables referenced in the source code\nand therefore should be avoided when generating variables. Also track comments\nthat should be output as part of variable declarations.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@parent, @expressions, @method, @referencedVars)</span> -&gt;</span>\n    @variables = [{name: <span class=\"hljs-string\">&#x27;arguments&#x27;</span>, type: <span class=\"hljs-string\">&#x27;arguments&#x27;</span>}]\n    @comments  = {}\n    @positions = {}\n    @utilities = {} <span class=\"hljs-keyword\">unless</span> @parent</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <p>The <code>@root</code> is the top-level <strong>Scope</strong> object for a given file.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    @root = @parent?.root ? this</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              <p>Adds a new variable or overrides an existing one.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  add: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, type, immediate)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> @parent.add name, type, immediate <span class=\"hljs-keyword\">if</span> @shared <span class=\"hljs-keyword\">and</span> <span class=\"hljs-keyword\">not</span> immediate\n    <span class=\"hljs-keyword\">if</span> Object::hasOwnProperty.call @positions, name\n      @variables[@positions[name]].type = type\n    <span class=\"hljs-keyword\">else</span>\n      @positions[name] = @variables.push({name, type}) - <span class=\"hljs-number\">1</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>When <code>super</code> is called, we need to find the name of the current method we’re\nin, so that we know how to invoke the same method of the parent class. This\ncan get complicated if super is being called from an inner function.\n<code>namedMethod</code> will walk up the scope tree until it either finds the first\nfunction object that has a name filled in, or bottoms out.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  namedMethod: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-keyword\">return</span> @method <span class=\"hljs-keyword\">if</span> @method?.name <span class=\"hljs-keyword\">or</span> !@parent\n    @parent.namedMethod()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>Look up a variable name in lexical scope, and declare it if it does not\nalready exist.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  find: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, type = <span class=\"hljs-string\">&#x27;var&#x27;</span>)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> @check name\n    @add name, type\n    <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <p>Reserve a variable name as originating from a function parameter for this\nscope. No <code>var</code> required for internal references.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  parameter: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> @shared <span class=\"hljs-keyword\">and</span> @parent.check name, <span class=\"hljs-literal\">yes</span>\n    @add name, <span class=\"hljs-string\">&#x27;param&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>Just check to see if a variable has already been declared, without reserving,\nwalks up to the root scope.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  check: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    !!(@type(name) <span class=\"hljs-keyword\">or</span> @parent?.check(name))</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <p>Generate a temporary variable name at the given index.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  temporary: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, index, single=<span class=\"hljs-literal\">false</span>)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">if</span> single\n      startCode = name.charCodeAt(<span class=\"hljs-number\">0</span>)\n      endCode = <span class=\"hljs-string\">&#x27;z&#x27;</span>.charCodeAt(<span class=\"hljs-number\">0</span>)\n      diff = endCode - startCode\n      newCode = startCode + index % (diff + <span class=\"hljs-number\">1</span>)\n      letter = <span class=\"hljs-built_in\">String</span>.fromCharCode(newCode)\n      num = index <span class=\"hljs-regexp\">//</span> (diff + <span class=\"hljs-number\">1</span>)\n      <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{letter}</span><span class=\"hljs-subst\">#{num <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&#x27;&#x27;</span>}</span>&quot;</span>\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{name}</span><span class=\"hljs-subst\">#{index <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&#x27;&#x27;</span>}</span>&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>Gets the type of a variable.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  type: <span class=\"hljs-function\"><span class=\"hljs-params\">(name)</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> v.type <span class=\"hljs-keyword\">for</span> v <span class=\"hljs-keyword\">in</span> @variables <span class=\"hljs-keyword\">when</span> v.name <span class=\"hljs-keyword\">is</span> name\n    <span class=\"hljs-literal\">null</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-11\">&#x00a7;</a>\n              </div>\n              <p>If we need to store an intermediate result, find an available name for a\ncompiler-generated variable. <code>_var</code>, <code>_var2</code>, and so on…</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  freeVariable: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, options={})</span> -&gt;</span>\n    index = <span class=\"hljs-number\">0</span>\n    <span class=\"hljs-keyword\">loop</span>\n      temp = @temporary name, index, options.single\n      <span class=\"hljs-keyword\">break</span> <span class=\"hljs-keyword\">unless</span> @check(temp) <span class=\"hljs-keyword\">or</span> temp <span class=\"hljs-keyword\">in</span> @root.referencedVars\n      index++\n    @add temp, <span class=\"hljs-string\">&#x27;var&#x27;</span>, <span class=\"hljs-literal\">yes</span> <span class=\"hljs-keyword\">if</span> options.reserve ? <span class=\"hljs-literal\">true</span>\n    temp</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-12\">&#x00a7;</a>\n              </div>\n              <p>Ensure that an assignment is made at the top of this scope\n(or at the top-level scope, if requested).</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  assign: <span class=\"hljs-function\"><span class=\"hljs-params\">(name, value)</span> -&gt;</span>\n    @add name, {value, assigned: <span class=\"hljs-literal\">yes</span>}, <span class=\"hljs-literal\">yes</span>\n    @hasAssignments = <span class=\"hljs-literal\">yes</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-13\">&#x00a7;</a>\n              </div>\n              <p>Does this scope have any declared variables?</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  hasDeclarations: <span class=\"hljs-function\">-&gt;</span>\n    !!@declaredVariables().length</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-14\">&#x00a7;</a>\n              </div>\n              <p>Return the list of variables first declared in this scope.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  declaredVariables: <span class=\"hljs-function\">-&gt;</span>\n    (v.name <span class=\"hljs-keyword\">for</span> v <span class=\"hljs-keyword\">in</span> @variables <span class=\"hljs-keyword\">when</span> v.type <span class=\"hljs-keyword\">is</span> <span class=\"hljs-string\">&#x27;var&#x27;</span>).sort()</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-15\">&#x00a7;</a>\n              </div>\n              <p>Return the list of assignments that are supposed to be made at the top\nof this scope.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  assignedVariables: <span class=\"hljs-function\">-&gt;</span>\n    <span class=\"hljs-string\">&quot;<span class=\"hljs-subst\">#{v.name}</span> = <span class=\"hljs-subst\">#{v.type.value}</span>&quot;</span> <span class=\"hljs-keyword\">for</span> v <span class=\"hljs-keyword\">in</span> @variables <span class=\"hljs-keyword\">when</span> v.type.assigned</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/annotated-source/sourcemap.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>sourcemap.litcoffee</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page_wrapper\">\n            <div id=\"jump_page\">\n              \n                \n                <a class=\"source\" href=\"browser.html\">\n                  browser.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"cake.html\">\n                  cake.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"coffeescript.html\">\n                  coffeescript.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"command.html\">\n                  command.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"grammar.html\">\n                  grammar.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"helpers.html\">\n                  helpers.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"index.html\">\n                  index.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"lexer.html\">\n                  lexer.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"nodes.html\">\n                  nodes.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"optparse.html\">\n                  optparse.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"register.html\">\n                  register.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"repl.html\">\n                  repl.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"rewriter.html\">\n                  rewriter.coffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"scope.html\">\n                  scope.litcoffee\n                </a>\n              \n                \n                <a class=\"source\" href=\"sourcemap.html\">\n                  sourcemap.litcoffee\n                </a>\n              \n            </div>\n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>sourcemap.litcoffee</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-1\">&#x00a7;</a>\n              </div>\n              <p>Source maps allow JavaScript runtimes to match running JavaScript back to\nthe original source code that corresponds to it. This can be minified\nJavaScript, but in our case, we’re concerned with mapping pretty-printed\nJavaScript back to CoffeeScript.</p>\n<p>In order to produce maps, we must keep track of positions (line number, column number)\nthat originated every node in the syntax tree, and be able to generate a\n<a href=\"https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit\">map file</a>\n— which is a compact, VLQ-encoded representation of the JSON serialization\nof this information — to write out alongside the generated JavaScript.</p>\n<h2 id=\"linemap\">LineMap</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-2\">&#x00a7;</a>\n              </div>\n              <p>A <strong>LineMap</strong> object keeps track of information about original line and column\npositions for a single line of output JavaScript code.\n<strong>SourceMaps</strong> are implemented in terms of <strong>LineMaps</strong>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">LineMap</span></span>\n  constructor: <span class=\"hljs-function\"><span class=\"hljs-params\">(@line)</span> -&gt;</span>\n    @columns = []\n\n  add: <span class=\"hljs-function\"><span class=\"hljs-params\">(column, [sourceLine, sourceColumn], options={})</span> -&gt;</span>\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">if</span> @columns[column] <span class=\"hljs-keyword\">and</span> options.noReplace\n    @columns[column] = {line: @line, column, sourceLine, sourceColumn}\n\n  sourceLocation: <span class=\"hljs-function\"><span class=\"hljs-params\">(column)</span> -&gt;</span>\n    column-- <span class=\"hljs-keyword\">until</span> (mapping = @columns[column]) <span class=\"hljs-keyword\">or</span> (column &lt;= <span class=\"hljs-number\">0</span>)\n    mapping <span class=\"hljs-keyword\">and</span> [mapping.sourceLine, mapping.sourceColumn]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-3\">&#x00a7;</a>\n              </div>\n              <h2 id=\"sourcemap\">SourceMap</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-4\">&#x00a7;</a>\n              </div>\n              <p>Maps locations in a single generated JavaScript file back to locations in\nthe original CoffeeScript source file.</p>\n<p>This is intentionally agnostic towards how a source map might be represented on\ndisk. Once the compiler is ready to produce a “v3”-style source map, we can walk\nthrough the arrays of line and column buffer to produce it.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-class\"><span class=\"hljs-keyword\">class</span> <span class=\"hljs-title\">SourceMap</span></span>\n  constructor: <span class=\"hljs-function\">-&gt;</span>\n    @lines = []</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-5\">&#x00a7;</a>\n              </div>\n              <p>Adds a mapping to this SourceMap. <code>sourceLocation</code> and <code>generatedLocation</code>\nare both <code>[line, column]</code> arrays. If <code>options.noReplace</code> is true, then if there\nis already a mapping for the specified <code>line</code> and <code>column</code>, this will have no\neffect.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  add: <span class=\"hljs-function\"><span class=\"hljs-params\">(sourceLocation, generatedLocation, options = {})</span> -&gt;</span>\n    [line, column] = generatedLocation\n    lineMap = (@lines[line] <span class=\"hljs-keyword\">or</span>= <span class=\"hljs-keyword\">new</span> LineMap(line))\n    lineMap.add column, sourceLocation, options</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-6\">&#x00a7;</a>\n              </div>\n              <p>Look up the original position of a given <code>line</code> and <code>column</code> in the generated\ncode.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  sourceLocation: <span class=\"hljs-function\"><span class=\"hljs-params\">([line, column])</span> -&gt;</span>\n    line-- <span class=\"hljs-keyword\">until</span> (lineMap = @lines[line]) <span class=\"hljs-keyword\">or</span> (line &lt;= <span class=\"hljs-number\">0</span>)\n    lineMap <span class=\"hljs-keyword\">and</span> lineMap.sourceLocation column</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-7\">&#x00a7;</a>\n              </div>\n              <h2 id=\"caching\">Caching</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-8\">&#x00a7;</a>\n              </div>\n              <p>A static source maps cache <code>filename</code>: <code>map</code>. These are used for transforming\nstack traces and are currently set in <code>CoffeeScript.compile</code> for all files\ncompiled with the source maps option.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  @sourceMaps: <span class=\"hljs-built_in\">Object</span>.create <span class=\"hljs-literal\">null</span>\n\n  @registerCompiled: <span class=\"hljs-function\"><span class=\"hljs-params\">(filename, source, sourcemap)</span> =&gt;</span>\n    <span class=\"hljs-keyword\">if</span> sourcemap?\n      @sourceMaps[filename] = sourcemap\n\n  @getSourceMap: <span class=\"hljs-function\"><span class=\"hljs-params\">(filename)</span> =&gt;</span>\n    @sourceMaps[filename]</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-9\">&#x00a7;</a>\n              </div>\n              <h2 id=\"v3-sourcemap-generation\">V3 SourceMap Generation</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-10\">&#x00a7;</a>\n              </div>\n              <p>Builds up a V3 source map, returning the generated JSON as a string.\n<code>options.sourceRoot</code> may be used to specify the sourceRoot written to the source\nmap.  Also, <code>options.sourceFiles</code> and <code>options.generatedFile</code> may be passed to\nset “sources” and “file”, respectively.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  generate: <span class=\"hljs-function\"><span class=\"hljs-params\">(options = {}, code = <span class=\"hljs-literal\">null</span>)</span> -&gt;</span>\n    writingline       = <span class=\"hljs-number\">0</span>\n    lastColumn        = <span class=\"hljs-number\">0</span>\n    lastSourceLine    = <span class=\"hljs-number\">0</span>\n    lastSourceColumn  = <span class=\"hljs-number\">0</span>\n    needComma         = <span class=\"hljs-literal\">no</span>\n    buffer            = <span class=\"hljs-string\">&quot;&quot;</span>\n\n    <span class=\"hljs-keyword\">for</span> lineMap, lineNumber <span class=\"hljs-keyword\">in</span> @lines <span class=\"hljs-keyword\">when</span> lineMap\n      <span class=\"hljs-keyword\">for</span> mapping <span class=\"hljs-keyword\">in</span> lineMap.columns <span class=\"hljs-keyword\">when</span> mapping\n        <span class=\"hljs-keyword\">while</span> writingline &lt; mapping.line\n          lastColumn = <span class=\"hljs-number\">0</span>\n          needComma = <span class=\"hljs-literal\">no</span>\n          buffer += <span class=\"hljs-string\">&quot;;&quot;</span>\n          writingline++</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-11\">&#x00a7;</a>\n              </div>\n              <p>Write a comma if we’ve already written a segment on this line.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> needComma\n          buffer += <span class=\"hljs-string\">&quot;,&quot;</span>\n          needComma = <span class=\"hljs-literal\">no</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-12\">&#x00a7;</a>\n              </div>\n              <p>Write the next segment. Segments can be 1, 4, or 5 values.  If just one, then it\nis a generated column which doesn’t match anything in the source code.</p>\n<p>The starting column in the generated source, relative to any previous recorded\ncolumn for the current line:</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        buffer += @encodeVlq mapping.column - lastColumn\n        lastColumn = mapping.column</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-13\">&#x00a7;</a>\n              </div>\n              <p>The index into the list of sources:</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        buffer += @encodeVlq <span class=\"hljs-number\">0</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-14\">&#x00a7;</a>\n              </div>\n              <p>The starting line in the original source, relative to the previous source line.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        buffer += @encodeVlq mapping.sourceLine - lastSourceLine\n        lastSourceLine = mapping.sourceLine</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-15\">&#x00a7;</a>\n              </div>\n              <p>The starting column in the original source, relative to the previous column.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        buffer += @encodeVlq mapping.sourceColumn - lastSourceColumn\n        lastSourceColumn = mapping.sourceColumn\n        needComma = <span class=\"hljs-literal\">yes</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-16\">&#x00a7;</a>\n              </div>\n              <p>Produce the canonical JSON object format for a “v3” source map.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    sources = <span class=\"hljs-keyword\">if</span> options.sourceFiles\n      options.sourceFiles\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> options.filename\n      [options.filename]\n    <span class=\"hljs-keyword\">else</span>\n      [<span class=\"hljs-string\">&#x27;&lt;anonymous&gt;&#x27;</span>]\n\n    v3 =\n      version:    <span class=\"hljs-number\">3</span>\n      file:       options.generatedFile <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n      sourceRoot: options.sourceRoot <span class=\"hljs-keyword\">or</span> <span class=\"hljs-string\">&#x27;&#x27;</span>\n      sources:    sources\n      names:      []\n      mappings:   buffer\n\n    v3.sourcesContent = [code] <span class=\"hljs-keyword\">if</span> options.sourceMap <span class=\"hljs-keyword\">or</span> options.inlineMap\n\n    v3</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-17\">&#x00a7;</a>\n              </div>\n              <h2 id=\"base64-vlq-encoding\">Base64 VLQ Encoding</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-18\">&#x00a7;</a>\n              </div>\n              <p>Note that SourceMap VLQ encoding is “backwards”.  MIDI-style VLQ encoding puts\nthe most-significant-bit (MSB) from the original value into the MSB of the VLQ\nencoded value (see <a href=\"https://en.wikipedia.org/wiki/File:Uintvar_coding.svg\">Wikipedia</a>).\nSourceMap VLQ does things the other way around, with the least significat four\nbits of the original value encoded into the first byte of the VLQ encoded value.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  VLQ_SHIFT            = <span class=\"hljs-number\">5</span>\n  VLQ_CONTINUATION_BIT = <span class=\"hljs-number\">1</span> &lt;&lt; VLQ_SHIFT             <span class=\"hljs-comment\"># 0010 0000</span>\n  VLQ_VALUE_MASK       = VLQ_CONTINUATION_BIT - <span class=\"hljs-number\">1</span>   <span class=\"hljs-comment\"># 0001 1111</span>\n\n  encodeVlq: <span class=\"hljs-function\"><span class=\"hljs-params\">(value)</span> -&gt;</span>\n    answer = <span class=\"hljs-string\">&#x27;&#x27;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-19\">&#x00a7;</a>\n              </div>\n              <p>Least significant bit represents the sign.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    signBit = <span class=\"hljs-keyword\">if</span> value &lt; <span class=\"hljs-number\">0</span> <span class=\"hljs-keyword\">then</span> <span class=\"hljs-number\">1</span> <span class=\"hljs-keyword\">else</span> <span class=\"hljs-number\">0</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-20\">&#x00a7;</a>\n              </div>\n              <p>The next bits are the actual value.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    valueToEncode = (<span class=\"hljs-built_in\">Math</span>.abs(value) &lt;&lt; <span class=\"hljs-number\">1</span>) + signBit</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-21\">&#x00a7;</a>\n              </div>\n              <p>Make sure we encode at least one character, even if valueToEncode is 0.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">while</span> valueToEncode <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">not</span> answer\n      nextChunk = valueToEncode &amp; VLQ_VALUE_MASK\n      valueToEncode = valueToEncode &gt;&gt; VLQ_SHIFT\n      nextChunk |= VLQ_CONTINUATION_BIT <span class=\"hljs-keyword\">if</span> valueToEncode\n      answer += @encodeBase64 nextChunk\n\n    answer</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-22\">&#x00a7;</a>\n              </div>\n              <h2 id=\"regular-base64-encoding\">Regular Base64 Encoding</h2>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-23\">&#x00a7;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  BASE64_CHARS = <span class=\"hljs-string\">&#x27;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/&#x27;</span>\n\n  encodeBase64: <span class=\"hljs-function\"><span class=\"hljs-params\">(value)</span> -&gt;</span>\n    BASE64_CHARS[value] <span class=\"hljs-keyword\">or</span> <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span> <span class=\"hljs-string\">&quot;Cannot Base64 encode value: <span class=\"hljs-subst\">#{value}</span>&quot;</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"sswrap \">\n                <a class=\"ss\" href=\"#section-24\">&#x00a7;</a>\n              </div>\n              <p>Our API for source maps is just the <code>SourceMap</code> class.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>module.<span class=\"hljs-built_in\">exports</span> = SourceMap</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/announcing-coffeescript-2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv=\"content-type\" content=\"text/html;charset=UTF-8\" />\n<title>Announcing CoffeeScript 2</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<link rel=\"canonical\" href=\"http://coffeescript.org\" />\n\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/apple-touch-icon.png\">\n<link rel=\"icon\" type=\"image/png\" href=\"/favicon-32x32.png\" sizes=\"32x32\">\n<link rel=\"icon\" type=\"image/png\" href=\"/favicon-16x16.png\" sizes=\"16x16\">\n<link rel=\"manifest\" href=\"/manifest.json\">\n<link rel=\"mask-icon\" href=\"/safari-pinned-tab.svg\" color=\"#5bbad5\">\n<meta name=\"theme-color\" content=\"#ffffff\">\n\n<link href=\"https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M\" crossorigin=\"anonymous\">\n<link href=\"https://fonts.googleapis.com/css?family=Alegreya+Sans:400,800|Galada:400|Lato:300,300i,400,700|Roboto+Mono:400,400i\" rel=\"stylesheet\" crossorigin=\"anonymous\">\n<style>\nbody {\n  /* Push below header bar */\n  margin-top: 3.5rem;\n  background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1 3\"><path opacity=\".02\" fill=\"#000\" d=\"M0 0h1v1H0z\"/><path opacity=\".005\" fill=\"#000\" d=\"M0 1h1v2H0z\"/></svg>');\n  background-size: 1px 3px;\n}\n\nsvg {\n  width: auto;\n  height: 100%;\n}\n\na {\n  color: #1b5e20;\n  transition: 0.1s ease-in-out;\n}\na:focus, a:hover, a:active {\n  color: #388e3c;\n  cursor: pointer;\n  text-decoration: none;\n}\n\nbutton:focus, .navbar-dark .navbar-toggler:focus {\n  outline: none;\n  border: thin solid rgba(248, 243, 240, 0.3);\n}\n\n.bg-dark {\n  background-color: #3e2723 !important;\n}\n\n.bg-ribbed-light {\n  background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1 3\"><path opacity=\".03\" fill=\"#000\" d=\"M0 0h1v1H0z\"/><path opacity=\".005\" fill=\"#000\" d=\"M0 1h1v2H0z\"/></svg>');\n  background-size: 1px 3px;\n}\n.bg-ribbed-dark {\n  background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1 3\"><path opacity=\".2\" fill=\"#000\" d=\"M0 0h1v1H0z\"/><path opacity=\".15\" fill=\"#000\" d=\"M0 1h1v2H0z\"/></svg>');\n  background-size: 1px 3px;\n}\n\n\n/*\n * Header\n */\n.site-navbar {\n  height: 3.5rem;\n  font-family: 'Lato';\n  font-weight: 400;\n  font-size: 1.1em;\n}\n\n.navbar-brand {\n  height: 2.2em;\n  margin-right: 1em;\n}\n\n.navbar-dark path {\n  fill: #fff;\n}\n\n.navbar-nav .nav-item {\n  margin-left: 0.6em;\n  margin-right: 0.6em;\n  border-radius: 0.4em;\n}\n.navbar-nav .nav-item:hover,\n.navbar-nav .nav-item:active,\n.navbar-nav .nav-item.show {\n  background-color: #4e342e;\n}\n\n.navbar-toggler {\n  transition: all 0.1s ease-in-out;\n}\n\n\n/*\n * Main content\n */\n\n.main {\n  padding: 1.3em;\n}\n@media (min-width: 992px) {\n  .main {\n    padding-right: 2em;\n    padding-left: 2em;\n  }\n}\n\nh1 {\n  font: 2.5em Galada;\n  color: #2f2625;\n  text-align: center;\n}\n@media (min-width: 768px) {\n  h1 {\n    font-size: 3em;\n  }\n}\n@media (min-width: 992px) {\n  h1 {\n    font-size: 4em;\n  }\n}\n\n.title-logo {\n  display: inline-block;\n  height: 1em;\n  transform: translateY(0.2em);\n  margin-left: 0.3em;\n  margin-right: 0.25em;\n  fill: #2f2625;\n}\n\n.main p, .main li {\n  font-family: Lato;\n  font-weight: 300;\n  font-size: 1.1em;\n  line-height: 1.6;\n}\n.main blockquote {\n  font-size: 1.1em;\n}\n@media (min-width: 768px) {\n  .main p, .main li {\n    font-size: 1.3em;\n  }\n  .main blockquote {\n    font-size: 1.3em;\n  }\n}\n.main strong {\n  font-weight: 700;\n}\n.main a {\n  border-bottom: 2px solid transparent;\n  font-weight: 400;\n}\n.main a:focus, .main a:hover, .main a:active {\n  border-bottom: 2px solid rgba(56, 142, 60, 0.2);\n}\n.main blockquote pre {\n  background-color: #f8f3f0;\n  color: #2f2625;\n  border-radius: .3em;\n  padding: 0.4em 0.6em;\n}\n\np, blockquote, li {\n  margin-bottom: 1.3rem;\n}\n.credits li {\n  margin-bottom: 0.3em;\n}\n\nh2, h3, h4 {\n  margin-top: 1.3em;\n  margin-bottom: 0.6em;\n  font-family: 'Alegreya Sans';\n}\nh2 {\n  font-weight: 800;\n}\nh3, h4, h2 time {\n  font-weight: 400;\n}\n\n.main h2 {\n  padding-top: 4rem;\n  margin-top: -4rem;\n}\n\ncode {\n  font-family: 'Roboto Mono';\n  font-weight: 400;\n}\ncode, a > code {\n  background-color: #f8f3f0;\n  padding: 0.2rem 0.4rem;\n}\ncode {\n  color: #2f2625;\n}\n\n\n.uneditable-code-block .comment {\n  font-style: italic;\n  color: #837B85;\n}\n.uneditable-code-block .class,\n.uneditable-code-block .function,\n.uneditable-code-block .keyword,\n.uneditable-code-block .reserved,\n.uneditable-code-block .title {\n  color: #534328;\n}\n.uneditable-code-block .string\n.uneditable-code-block .value\n.uneditable-code-block .inheritance\n.uneditable-code-block .header {\n  color: #3A4029;\n}\n.uneditable-code-block .variable,\n.uneditable-code-block .literal,\n.uneditable-code-block .tag,\n.uneditable-code-block .regexp,\n.uneditable-code-block .subst,\n.uneditable-code-block .property {\n  color: #474429;\n}\n.uneditable-code-block .number,\n.uneditable-code-block .preprocessor,\n.uneditable-code-block .built_in,\n.uneditable-code-block .params,\n.uneditable-code-block .constant {\n  color: #474429;\n}\n</style>\n\n</head>\n<body>\n\n<nav class=\"navbar navbar-expand-lg fixed-top navbar-dark bg-dark bg-ribbed-dark site-navbar\">\n  <a class=\"navbar-brand\" href=\"/\" data-close=\"try\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-22 347 566 100\">\n  <title>\n    CoffeeScript Logo\n  </title>\n  <path d=\"M21.7 351.1c.1.6-.2 1.1-1.2 1.6-1.3-.7-4.1-1.1-6.4-.9-2.5.2-4.6 1-4.3 2.7.4 1.7 2.8 2.7 7.1 2.3 10.5-.9 10.4-8 25.8-9.4 12-1.1 18.7 2.6 19.6 7.1.7 3.5-2.2 6.9-10.9 7.6-7.7.7-12.2-1.4-12.6-3.5-.2-1.1.4-2.7 4.1-3.1.4 1.7 2.5 3.5 7.5 3 3.6-.3 6.6-1.6 6.2-3.6-.4-2.1-4.2-3.3-10.2-2.8-12.2 1.1-15.2 7.8-25.6 8.7-7.4.7-13.4-2-14.2-6-.3-1.5-.3-5 7.5-5.7 4-.3 7.2.4 7.6 2zm-39 41.8c-3.4 4.3-4.9 9.3-4.6 14.2.3 4.9 2.7 8.9 6.5 12 4 3.1 8.3 4 13.2 3.1 1.9-.3 4-1.3 5.9-1.9-4 0-7.4-1.3-10.8-4-3.7-2.7-6.2-6.5-6.8-11.1-.9-4.3 0-8.3 2.4-11.8 2.7-3.4 6.2-5.3 10.8-5.9 4.6-.3 8.6.9 12.6 3.7-.9-1.3-2.2-2.2-3.4-3.4-4-2.7-8.3-4-13.6-2.7-4.8 1-8.8 3.5-12.2 7.8zm53.6-23.1c-12.9 0-24.4-1.3-32.7-3.1-8.9-2.2-13.6-4.6-13.6-7.7 0-1.3.6-2.4 2.4-3.7-5.6 2.2-8.6 4-8.6 6.8.3 3.1 5.3 6.2 15.5 8.6 9.6 2.4 21.9 3.7 36.7 3.7 15.1 0 27.1-1.3 36.7-3.7 10.2-2.4 15.1-5.6 15.1-8.6 0-2.2-2.2-4.3-6.2-5.9.9.6 1.6 1.6 1.6 2.7 0 3.1-4.6 5.6-13.9 7.7-8.6 1.9-19.6 3.2-33 3.2zm36.8 8.6c-9.6 2.2-21.9 3.7-36.7 3.7-15.1 0-27.4-1.6-37-3.7-8.6-2.2-13.2-4.6-14.8-7.1 1.6 10.8 5.3 21 10.2 30 3.7 5.6 7.4 10.5 11.1 15.8 1.6 3.1 2.7 6.2 3.4 9.3 2.4 3.4 5.9 5.6 10.2 6.8 5.3 1.9 10.8 2.7 16.4 2.4h.6c5.6.3 11.5-.6 16.9-2.4 4-1.3 7.4-3.4 9.9-6.8h.3c.6-3.1 1.6-6.2 3.1-9.3 3.7-5.3 7.4-10.2 11.1-15.8 4.9-8.9 8.3-19.1 10.2-30-2 2.8-6.6 5.2-14.9 7.1zm106.2 30.1c-4.8 12.1-17.6 16.9-25.9 16.9-13.4 0-19.9-6-19.9-22.3 0-16.5 7.9-47.3 31.7-47.3 8.5 0 15.2 3.3 15.2 12.1 0 4.8-1.8 8.3-6.4 8.3-1.5 0-3.4-.4-5.2-2.4 2.2-1.1 4.2-4.9 4.2-8.3 0-2.9-1.5-5.6-5.6-5.6-10 0-18.9 23.9-18.9 42.4 0 8.3 2.2 14.2 10.9 14.2 7.1 0 13.5-3.4 17.7-9.1l2.2 1.1zm32.9-16.3c.4.2.7.2 1 .2 4.2 0 10.1-2.7 14-5.5l.8 2.4c-3.4 3.7-9.5 6.5-16.1 7.5-1.5 16.8-10.6 27.3-21.7 27.3-8.4 0-14.5-4-14.5-14.4 0-10.5 6.2-32.2 24.9-32.2 7.8.3 11.6 5.3 11.6 14.7zm-7.7 5c-1.9-.5-2.4-2-2.4-3.8 0-2.5 1.2-4.2 2.8-4.9-.2-3.8-1.1-5.3-3.4-5.3-6.5 0-12 16.6-12 25.6 0 6 1.2 7.3 4.6 7.3 4.2.1 8.9-8 10.4-18.9zm-6.6 39.7c0-8.3 7.1-11 15.8-13.6l10.9-51.9c2.7-13 10.6-15.5 16.5-15.5 4.1 0 8 2.2 9.7 5.7 3.6-4.6 8.4-5.7 12.4-5.7 5.6 0 10.8 3.9 10.8 9.8 0 1.5-.1 2.6-.3 3.7h-4.3c.1-.9.2-1.7.2-2.4 0-2.1-1.7-3.1-3.4-3.1-2 0-4.8 1.1-6.2 7.1l-1.7 7.4h9.1l-.8 3.6h-9l-10.3 49.1c-2.7 13-10.6 15.5-16.5 15.5-5.2 0-8.3-2.3-9.8-5.7-3.5 4.6-8.3 5.7-12.3 5.7-5.6.1-10.8-3.8-10.8-9.7zm9.1 1.8c1.9 0 4.2-1.8 5.4-7.1l1.1-5.3c-5.7 2-10.1 4.4-10.1 9.4 0 1.2 1.7 3 3.6 3zm21.7 0c1.9 0 4.2-1.8 5.4-7.1l2.2-10.4-9.4 1.8-1.8 8.3c-.5 2.1-1.1 4-1.8 5.6.9 1.3 3 1.8 5.4 1.8zm-1.4-18l9.4-1.7 7.7-36.8h-9l-8.1 38.5zm16.6-56.7c-2 0-4.8 1.1-6.2 7.1l-1.7 7.4h9l2.1-9.5c.2-.7.2-1.3.2-2 .1-2-1.5-3-3.4-3zm37.9 53c7.1 0 11.6-4 16.1-9.2h3.1c-5.2 8.3-12.9 16.8-25 16.8-8.5 0-14.2-4.2-14.2-14.5 0-10.5 5.9-32.3 24.6-32.3 8.1 0 10 4.2 10 8.7 0 10.5-10 18.5-20.9 19.2-.1 1.3-.2 2.5-.2 3.6 0 6.2 2.2 7.7 6.5 7.7zm5.3-34.4c-4.6 0-9.1 9.7-10.9 18.7 7-.5 13.2-7.4 13.2-15 0-2.2-.5-3.7-2.3-3.7zm28.6 33.4c3.4 0 7.8-2.3 10.8-4.8-2 10.4-8.4 13.4-15.8 13.4-8.4 0-14.1-4.2-14.1-14.5 0-10.5 5.9-32.3 24.6-32.3 8.1 0 10 4.2 10 8.7 0 10.6-10 18.5-20.9 19.2-.1.9-.2 2-.2 2.7 0 5.7 2.5 7.6 5.6 7.6zm6.2-33.4c-4.5 0-9.1 10.1-11 18.7 7.1-.4 13.3-7.3 13.3-15 0-2.2-.6-3.7-2.3-3.7zm51.3-6.7c-1.7 0-3-.6-4.2-1.9 2.4-1.5 4.1-4.8 4.1-7.8 0-3.1-1.8-6.1-6.8-6.1s-8.3 2.8-8.3 8.2c0 13.3 20.5 15.2 20.5 34.8 0 15.3-12.3 22.7-25.6 22.7-10.4 0-19.3-4.5-19.3-15.7 0-9.8 7-14.9 13.3-14.9 3.1 0 7.7 1.3 8 6-4.9 0-10.7 2.3-10.7 8.5 0 4.5 2.9 8.7 8.7 8.7 6.1 0 10.6-4.4 10.6-12 0-15.6-18.6-21.1-18.6-34.5 0-9.5 9.3-16.3 21-16.3 4.3 0 14.6.9 14.6 10.9.1 5.5-2.8 9.4-7.3 9.4zm36.2 10.3c0-2.3-.8-3.7-2.5-3.7-5.7 0-11.7 16.6-11.7 26.7 0 6.2 2.2 7.6 6.6 7.6 7.1 0 11.6-4 16.1-9.2h3.1c-5.2 8.3-12.9 16.8-25 16.8-8.5 0-14.2-4.2-14.2-14.5 0-10.6 6-32.3 24.5-32.3 8.1 0 10.1 4.2 10.1 8.3 0 4.4-2.2 6.7-4.8 6.7-1 0-2.1-.4-3.1-1.1.5-1.9.9-3.6.9-5.3zm27.7-7.6l-1.2 5.7c3.1-2.7 6.7-5.7 11-5.7 4.1 0 6.3 3.3 6.3 6.9 0 3.1-2.1 6.7-6.6 6.7-5.1 0-2.5-6-5.3-6-2.7 0-4.4 1.4-6.7 3.4l-7.2 34.6h-13.1l9.6-45.4 13.2-.2zm34.2 0l-6.6 30.9c-.3 1.2-.4 2.1-.4 2.9 0 2.5 1.2 3.3 3.7 3.3 3.5 0 6.9-3.4 8.1-8h3.8c-5.2 14.8-14.2 16.8-19.1 16.8-5.5 0-9.7-3.2-9.7-10.9 0-1.8.3-3.7.7-5.9l6.2-29.2 13.3.1zm-4.1-19.4c4 0 7.2 3.2 7.2 7.2s-3.2 7.1-7.2 7.1-7.1-3.1-7.1-7.1c-.1-4 3.2-7.2 7.1-7.2zm29.1 16l-1.5 6.9c2.6-2.3 6.1-3.9 10.7-3.9 6.2 0 11.1 3.5 11.1 14.4 0 12.2-4.7 32.1-22.3 32.1-4.5 0-6.8-1.6-7.7-3.2l-4.7 22.1-13.7 3.2 15.2-71.5 12.9-.1zm7.8 17c0-7-2.9-7.5-4.5-7.5-2 0-4.5 1.6-6.3 4.4l-5.4 25.5c.4 1 1.4 2.1 3.4 2.1 9.7 0 12.8-15.9 12.8-24.5zm27.8 17.3c-.3 1.1-.5 2.2-.5 3.1 0 1.9.7 3.2 3.1 3.2.7 0 1.7 0 2.4-.3-2.5 7.8-6.6 8.9-9.6 8.9-6.4 0-9.1-4.4-9.1-10.3 0-1.6.2-3.1.6-4.8l5.8-27.2h-3l.7-3.6h3L528 366l13.4-1.9s-1.4 6.2-3.1 14.4h5.5l-.7 3.6h-5.5l-5.7 27.4z\"/>\n</svg>\n</a>\n  <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"offcanvas\" data-close=\"try\" aria-label=\"Toggle sidebar\">\n    <span class=\"navbar-toggler-icon\"></span>\n  </button>\n\n  <nav class=\"collapse navbar-collapse\">\n    <div class=\"navbar-nav mr-auto d-none d-lg-flex\">\n      <a href=\"../#try\" id=\"try-link\" class=\"nav-item nav-link\" data-toggle=\"try\">Try CoffeeScript</a>\n      <a href=\"../#language\" class=\"nav-item nav-link\" data-close=\"try\">Language Reference</a>\n      <a href=\"../#resources\" class=\"nav-item nav-link\" data-close=\"try\">Resources</a>\n      <a href=\"https://github.com/jashkenas/coffeescript\" class=\"nav-item nav-link\" data-close=\"try\">GitHub\n        </a>\n    </div>\n  </nav>\n</nav>\n\n\n<div class=\"container\" id=\"top\">\n  <div class=\"row\">\n    <main class=\"main\">\n      <header>\n        <h1>Announcing <span class=\"text-nowrap\"><svg class=\"title-logo\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-76 212 458 369\">\n          <title>\n            CoffeeScript Icon\n          </title>\n          <path d=\"M106 228.6c.5 2.3-.9 4.4-5 6.5-5.5-3.1-16.9-4.4-26.7-3.5-10.4.9-19.4 4.2-17.9 11.3 1.5 7.1 11.7 11 29.5 9.5 43.6-3.8 43.4-33.3 107.4-39 49.8-4.4 77.8 11 81.8 29.7 3.1 14.7-9.1 28.6-45.2 31.8-32 2.8-50.7-5.6-52.6-14.6-1-4.5 1.8-11.3 17.2-13.1 1.5 7 10.6 14.4 31.1 12.6 14.8-1.3 27.6-6.6 25.9-14.9-1.8-8.6-17.7-13.7-42.6-11.5-50.7 4.5-63.2 32.5-106.8 36.3-30.8 2.7-55.9-8.5-59.4-25.1-1.3-6.1-1.4-21 31.2-23.9 17.1-1.5 30.7 1.5 32.1 7.9zM-56.4 402.5c-14.3 18-20.4 38.8-19.2 59.2 1.2 20.4 11.4 37.1 26.9 50.2C-32 525-14 528.6 6.4 525c7.8-1.2 16.7-5.3 24.5-7.8-16.7 0-31-5.3-44.9-16.7-15.5-11.4-25.7-26.9-28.2-46.1-3.7-18 0-34.7 10.2-49 11.4-14.3 25.7-22 44.9-24.5 19.2-1.2 35.9 3.7 52.6 15.5-3.7-5.3-9-9-14.3-14.3-16.7-11.4-34.7-16.7-56.7-11.4-19.9 3.6-36.7 13.8-50.9 31.8zm223.6-96.3c-53.9 0-101.6-5.3-136.3-13.1-37.1-9-56.7-19.2-56.7-32.2 0-5.3 2.4-10.2 10.2-15.5-23.3 9-35.9 16.7-35.9 28.2 1.2 13.1 22 25.7 64.5 35.9 40 10.2 91.4 15.5 153 15.5 62.8 0 113-5.3 153-15.5 42.4-10.2 62.8-23.3 62.8-35.9 0-9-9-18-25.7-24.5 3.7 2.4 6.5 6.5 6.5 11.4 0 13.1-19.2 23.3-57.9 32.2-36 8.2-82.1 13.5-137.5 13.5zm153 35.9c-40 9-91.4 15.5-153 15.5-62.8 0-114.2-6.5-154.2-15.5-35.9-9-55.1-19.2-61.6-29.4 6.5 44.9 22 87.3 42.4 124.8 15.5 23.3 31 43.7 46.1 65.7 6.5 13.1 11.4 25.7 14.3 38.8 10.2 14.3 24.5 23.3 42.4 28.2 22 7.8 44.9 11.4 68.1 10.2h2.4c23.3 1.2 47.7-2.4 70.6-10.2 16.7-5.3 31-14.3 41.2-28.2h1.2c2.4-13.1 6.5-25.7 13.1-38.8 15.5-22 31-42.4 46.1-65.7 20.4-37.1 34.7-79.6 42.4-124.8-7.7 11.4-26.9 21.6-61.5 29.4z\"/>\n        </svg> CoffeeScript 2</span></h1>\n      </header>\n      <section>\n<p>We are pleased to announce CoffeeScript 2! This new release of the CoffeeScript language and compiler aims to bring CoffeeScript into the modern JavaScript era, closing gaps in compatibility with JavaScript while preserving the clean syntax that is CoffeeScript’s hallmark. In a nutshell:</p>\n<ul>\n<li>The CoffeeScript 2 compiler now translates CoffeeScript code into modern JavaScript syntax. So a CoffeeScript <code>=&gt;</code> is now output as <code>=&gt;</code>, a CoffeeScript <code>class</code> is now output using the <code>class</code> keyword, and so on. This means you may need to <a href=\"../#transpilation\">transpile the CoffeeScript compiler’s output</a>.</li>\n<li>CoffeeScript 2 adds support for <a href=\"../#async-functions\">async functions</a> syntax, for the future <a href=\"../#destructuring\">object destructuring</a> syntax, and for <a href=\"../#jsx\">JSX</a>. Some features, such as <a href=\"../#modules\">modules</a> (<code>import</code> and <code>export</code> statements), <a href=\"../#generator-iteration\"><code>for…of</code></a>, and <a href=\"../#tagged-template-literals\">tagged template literals</a> were backported into CoffeeScript versions 1.11 and 1.12.</li>\n<li>All of the above was achieved with very few <a href=\"../#breaking-changes\">breaking changes from 1.x</a>. Most current CoffeeScript projects should be able to upgrade with little or no refactoring necessary.</li>\n</ul>\n<p>CoffeeScript 2 was developed with two primary goals: remove any incompatibilities with modern JavaScript that might prevent CoffeeScript from being used on a project; and preserve as much backward compatibility as possible. <a href=\"../#installation\">Install now</a>: <code>npm install -g coffeescript@2</code></p>\n<h2 id=\"modern-javascript-output\">Modern JavaScript Output</h2>\n<p>From the beginning, CoffeeScript has been described as being “just JavaScript.” And today, JavaScript is ES2015 (well, ES2017; also commonly known as ES6). CoffeeScript welcomes the changes in the JavaScript world and we’re happy to stop outputting circa-1999 syntax for modern features.</p>\n<p>Many new JavaScript features, such as <code>=&gt;</code>, were informed by CoffeeScript and are one-to-one compatible, or very nearly so. This has made outputting many of CoffeeScript’s innovations into new JS syntax straightforward: not only does <code>=&gt;</code> become <code>=&gt;</code>, but <code>{ a } = obj</code> becomes <code>{ a } = obj</code>, <code>&quot;a#{b}c&quot;</code> becomes <code>`a${b}c`</code> and so on.</p>\n<p>The following CoffeeScript features were updated in 2.0 to output using modern JavaScript syntax (or added in CoffeeScript 1.11 through 2.0, output using modern syntax):</p>\n<ul>\n<li>Modules: <code>import</code>/<code>export</code></li>\n<li>Classes: <code>class Animal</code></li>\n<li>Async functions: <code>await someFunction()</code></li>\n<li>Bound/arrow functions: <code>=&gt;</code></li>\n<li>Function default parameters: <code>(options = {}) -&gt;</code></li>\n<li>Function splat/rest parameters: <code>(items...) -&gt;</code></li>\n<li>Destructuring, for both arrays and objects: <code>[first, second] = items</code>, <code>{length} = items</code></li>\n<li>Object rest/spread properties: <code>{options..., force: yes}</code>, <code>{force, otherOptions...} = options</code></li>\n<li>Interpolated strings/template literals (JS backticked strings): <code>&quot;Hello, #{user}!&quot;</code></li>\n<li>Tagged template literals: <code>html&quot;&lt;strong&gt;coffee&lt;/strong&gt;&quot;</code></li>\n<li>JavaScript’s <code>for…of</code> is now available as CoffeeScript’s <code>for…from</code> (we already had a <code>for…of</code>): <code>for n from generatorFunction()</code></li>\n</ul>\n<p>Not all CoffeeScript features were adopted into JavaScript in 100% the same way; most notably, <a href=\"../#breaking-changes-default-values\">default values</a> in JavaScript (and also in CoffeeScript 2) are only applied when a variable is <code>undefined</code>, not <code>undefined</code> or <code>null</code> as in CoffeeScript 1; and <a href=\"../#breaking-changes-classes\">classes</a> have their own differences. See the <a href=\"../#breaking-changes\">breaking changes</a> for the fine details.</p>\n<p>In our experience, most breaking changes are edge cases that should affect very few people, like JavaScript’s <a href=\"../#breaking-change-fat-arrow\">lack of an <code>arguments</code> object inside arrow functions</a>. There seem to be two breaking changes that affect a significant number of projects:</p>\n<ul>\n<li>In CoffeeScript 2, “bare” <code>super</code> (calling <code>super</code> without arguments) is now no longer allowed, and one must use <code>super()</code> or <code>super arguments...</code> instead.</li>\n<li>References to <code>this</code>/<code>@</code> cannot occur before a call to <code>super</code>, per the JS spec.</li>\n</ul>\n<p>See the <a href=\"../#breaking-changes-super-extends\">full details</a>. Either the CoffeeScript compiler or your transpiler will throw errors for either of these cases, so updating your code is a matter of fixing each occurrence as the compiler errors on it, until your code compiles successfully.</p>\n<h2 id=\"other-features\">Other Features</h2>\n<p>Besides supporting new JavaScript features and outputting older CoffeeScript features in modern JS syntax, CoffeeScript 2 has added support for the following:</p>\n<ul>\n<li><a href=\"../#jsx\">JSX</a></li>\n<li><a href=\"../#comments\">Line comments</a> are now output (in CoffeeScript 1 they were discarded)</li>\n<li>Block comments are now allowed anywhere, enabling <a href=\"../#type-annotations\">static type annotations</a> using Flow’s comment-based syntax</li>\n</ul>\n<p>There are many smaller improvements as well, such as to the <code>coffee</code> command-line tool. You can read all the details in the <a href=\"../#changelog\">changelog</a> for the 2.0.0 betas.</p>\n<h2 id=\"what-about-…\">“What About …?”</h2>\n<p>A few JavaScript features have been intentionally omitted from CoffeeScript. These include <code>let</code> and <code>const</code> (and <code>var</code>), named functions and the <code>get</code> and <code>set</code> keywords. These get asked about so often that we added a section to the docs called <a href=\"../#unsupported\">Unsupported ECMAScript Features</a>. CoffeeScript’s lack of equivalents for these features does not affect compatibility or interoperability with JavaScript modules or libraries.</p>\n<h2 id=\"future-compatibility\">Future Compatibility</h2>\n<p>Back when CoffeeScript 1 was created, ES2015 JavaScript and transpilers like <a href=\"http://babeljs.io/\">Babel</a>, <a href=\"https://buble.surge.sh/\">Bublé</a> or <a href=\"https://github.com/google/traceur-compiler\">Traceur Compiler</a> were several years away. The CoffeeScript compiler itself had to do what today’s transpilers do, converting modern features like destructuring and arrow functions into equivalent lowest-common-denominator JavaScript.</p>\n<p>But transpilers exist now, and they do their job well. With them around, there’s no need for the CoffeeScript compiler to duplicate this functionality. All the CoffeeScript compiler needs to worry about now is converting the CoffeeScript version of new syntax into the JS version of that syntax, e.g. <code>&quot;Hello, #{name}!&quot;</code> into <code>`Hello, ${name}!`</code>. This makes adding support for new JavaScript features much easier than before.</p>\n<p>Most features added by ECMA in recent years haven’t required any updates at all in CoffeeScript. New global objects, or new methods on global objects, don’t require any updates on CoffeeScript’s part to work. Some proposed future JS features <em>do</em> involve new syntax, like <a href=\"https://github.com/tc39/proposal-class-fields\">class fields</a>. We have adopted a policy of supporting new syntax only when it reaches Stage 4 in ECMA’s process, which means that the syntax is final and will be in the next ES release. On occasion we might support a <em>feature</em> before it has reached Stage 4, but output it using equivalent non-experimental syntax instead of the newly-proposed syntax; that’s what’s happening in 2.0.0 for <a href=\"../#splats\">object destructuring</a>, where our output uses the same polyfill that Babel uses. When the new syntax is finalized, we will update our output to use the final syntax.</p>\n<h2 id=\"credits\">Credits</h2>\n<p>The major features of 2.0.0 would not have been possible without the following people:</p>\n<ul class=\"credits\">\n<li><a href=\"https://github.com/GeoffreyBooth\">@GeoffreyBooth</a>: Organizer of the CoffeeScript 2 effort, developer for modules; arrow functions, function default parameters and function rest parameters output using ES2015 syntax; line comments output and block comments output anywhere; block embedded JavaScript via triple backticks; improved parsing of Literate CoffeeScript; and the new docs website.</li>\n<li><a href=\"https://github.com/connec\">@connec</a>: Classes; destructuring; splats/rest syntax in arrays and function calls; and computed properties all output using ES2015 syntax.</li>\n<li><a href=\"https://github.com/GabrielRatener\">@GabrielRatener</a>: Async functions.</li>\n<li><a href=\"https://github.com/xixixao\">@xixixao</a>: JSX.</li>\n<li><a href=\"https://github.com/zdenko\">@zdenko</a>: Object rest/spread properties (object destructuring).</li>\n<li><a href=\"https://github.com/greghuc\">@greghuc</a>: Tagged template literals, interpolated strings output in ES2015 syntax.</li>\n<li><a href=\"https://github.com/atg\">@atg</a>: ES2015 <code>for…of</code>, supported as CoffeeScript’s <code>for…from</code>.</li>\n<li><a href=\"https://github.com/lydell\">@lydell</a> and <a href=\"https://github.com/jashkenas\">@jashkenas</a>: Guidance, code reviews and feedback.</li>\n</ul>\n<p>See the full <a href=\"https://github.com/jashkenas/coffeescript/wiki/CoffeeScript-2-Honor-Roll\">honor roll</a>.</p>\n<p>Thanks and we hope you enjoy CoffeeScript 2!</p>\n\n      </section>\n    </main>\n  </div>\n</div>\n\n<script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-106156830-1\"></script>\n<script>\n  window.dataLayer = window.dataLayer || [];\n  function gtag(){dataLayer.push(arguments)};\n  gtag('js', new Date());\n  gtag('config', 'UA-106156830-1');\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/browser-compiler-legacy/coffeescript.js",
    "content": "/**\n * CoffeeScript Compiler v2.7.0\n * https://coffeescript.org\n *\n * Copyright 2011-2023, Jeremy Ashkenas\n * Released under the MIT License\n */\nfunction _get(){return _get=\"undefined\"!=typeof Reflect&&Reflect.get?Reflect.get:function(target,property,receiver){var base=_superPropBase(target,property);if(base){var desc=Object.getOwnPropertyDescriptor(base,property);return desc.get?desc.get.call(3>arguments.length?target:receiver):desc.value}},_get.apply(this,arguments)}function _superPropBase(object,property){for(;!Object.prototype.hasOwnProperty.call(object,property)&&(object=_getPrototypeOf(object),null!==object););return object}function _inherits(subClass,superClass){if(\"function\"!=typeof superClass&&null!==superClass)throw new TypeError(\"Super expression must either be null or a function\");subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:!0,configurable:!0}}),Object.defineProperty(subClass,\"prototype\",{writable:!1}),superClass&&_setPrototypeOf(subClass,superClass)}function _setPrototypeOf(o,p){return _setPrototypeOf=Object.setPrototypeOf||function(o,p){return o.__proto__=p,o},_setPrototypeOf(o,p)}function _createSuper(Derived){var hasNativeReflectConstruct=_isNativeReflectConstruct();return function(){var Super=_getPrototypeOf(Derived),result;if(hasNativeReflectConstruct){var NewTarget=_getPrototypeOf(this).constructor;result=Reflect.construct(Super,arguments,NewTarget)}else result=Super.apply(this,arguments);return _possibleConstructorReturn(this,result)}}function _possibleConstructorReturn(self,call){if(call&&(\"object\"===_typeof(call)||\"function\"==typeof call))return call;if(void 0!==call)throw new TypeError(\"Derived constructors may only return object or undefined\");return _assertThisInitialized(self)}function _assertThisInitialized(self){if(void 0===self)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return self}function _isNativeReflectConstruct(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}function _getPrototypeOf(o){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function(o){return o.__proto__||Object.getPrototypeOf(o)},_getPrototypeOf(o)}function _toArray(arr){return _arrayWithHoles(arr)||_iterableToArray(arr)||_unsupportedIterableToArray(arr)||_nonIterableRest()}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_unsupportedIterableToArray(arr,i)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}function _iterableToArrayLimit(arr,i){var _i=null==arr?null:\"undefined\"!=typeof Symbol&&arr[Symbol.iterator]||arr[\"@@iterator\"];if(null!=_i){var _arr=[],_n=!0,_d=!1,_s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!(i&&_arr.length===i));_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i[\"return\"]||_i[\"return\"]()}finally{if(_d)throw _e}}return _arr}}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(target,props){for(var i=0,descriptor;i<props.length;i++)descriptor=props[i],descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,\"value\"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}function _createClass(Constructor,protoProps,staticProps){return protoProps&&_defineProperties(Constructor.prototype,protoProps),staticProps&&_defineProperties(Constructor,staticProps),Object.defineProperty(Constructor,\"prototype\",{writable:!1}),Constructor}function _typeof(obj){\"@babel/helpers - typeof\";return _typeof=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&\"function\"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?\"symbol\":typeof obj},_typeof(obj)}function _toConsumableArray(arr){return _arrayWithoutHoles(arr)||_iterableToArray(arr)||_unsupportedIterableToArray(arr)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}function _unsupportedIterableToArray(o,minLen){if(o){if(\"string\"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);return\"Object\"===n&&o.constructor&&(n=o.constructor.name),\"Map\"===n||\"Set\"===n?Array.from(o):\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(o,minLen):void 0}}function _iterableToArray(iter){if(\"undefined\"!=typeof Symbol&&null!=iter[Symbol.iterator]||null!=iter[\"@@iterator\"])return Array.from(iter)}function _arrayWithoutHoles(arr){if(Array.isArray(arr))return _arrayLikeToArray(arr)}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=Array(len);i<len;i++)arr2[i]=arr[i];return arr2}(function(root){var CoffeeScript=function(){var _Mathabs=Math.abs,_StringfromCharCode=String.fromCharCode,_Mathfloor=Math.floor;function require(path){return require[path]}return require[\"../../package.json\"]=function(){return{name:\"coffeescript\",description:\"Unfancy JavaScript\",keywords:[\"javascript\",\"language\",\"coffeescript\",\"compiler\"],author:\"Jeremy Ashkenas\",version:\"2.7.0\",license:\"MIT\",engines:{node:\">=6\"},directories:{lib:\"./lib/coffeescript\"},main:\"./lib/coffeescript/index\",module:\"./lib/coffeescript-browser-compiler-modern/coffeescript.js\",browser:\"./lib/coffeescript-browser-compiler-legacy/coffeescript.js\",bin:{coffee:\"./bin/coffee\",cake:\"./bin/cake\"},files:[\"bin\",\"lib\",\"register.js\",\"repl.js\"],scripts:{test:\"node ./bin/cake test\",\"test-harmony\":\"node --harmony ./bin/cake test\"},homepage:\"https://coffeescript.org\",bugs:\"https://github.com/jashkenas/coffeescript/issues\",repository:{type:\"git\",url:\"git://github.com/jashkenas/coffeescript.git\"},devDependencies:{\"@babel/core\":\"~7.17.9\",\"@babel/preset-env\":\"~7.16.11\",\"babel-preset-minify\":\"~0.5.1\",codemirror:\"~5.65.3\",docco:\"~0.9.1\",\"highlight.js\":\"~11.5.1\",jison:\"~0.4.18\",\"markdown-it\":\"~13.0.0\",puppeteer:\"~13.6.0\",underscore:\"~1.13.3\",webpack:\"~5.72.0\"}}}(),require[\"./helpers\"]=function(){var exports={};return function(){var indexOf=[].indexOf,UNICODE_CODE_POINT_ESCAPE,attachCommentsToNode,buildLocationData,buildLocationHash,buildTokenDataDictionary,extend,flatten,isBoolean,isNumber,isString,ref,repeat,syntaxErrorToString,unicodeCodePointToUnicodeEscapes;exports.starts=function(string,literal,start){return literal===string.substr(start,literal.length)},exports.ends=function(string,literal,back){var len;return len=literal.length,literal===string.substr(string.length-len-(back||0),len)},exports.repeat=repeat=function(str,n){var res;for(res=\"\";0<n;)1&n&&(res+=str),n>>>=1,str+=str;return res},exports.compact=function(array){var i,item,len1,results;for(results=[],i=0,len1=array.length;i<len1;i++)item=array[i],item&&results.push(item);return results},exports.count=function(string,substr){var num,pos;if(num=pos=0,!substr.length)return 1/0;for(;pos=1+string.indexOf(substr,pos);)num++;return num},exports.merge=function(options,overrides){return extend(extend({},options),overrides)},extend=exports.extend=function(object,properties){var key,val;for(key in properties)val=properties[key],object[key]=val;return object},exports.flatten=flatten=function(array){return array.flat(2e308)},exports.del=function(obj,key){var val;return val=obj[key],delete obj[key],val},exports.some=null==(ref=Array.prototype.some)?function(fn){var e,i,len1,ref1;for(ref1=this,i=0,len1=ref1.length;i<len1;i++)if(e=ref1[i],fn(e))return!0;return!1}:ref,exports.invertLiterate=function(code){var blankLine,i,indented,insideComment,len1,line,listItemStart,out,ref1;for(out=[],blankLine=/^\\s*$/,indented=/^[\\t ]/,listItemStart=/^(?:\\t?| {0,3})(?:[\\*\\-\\+]|[0-9]{1,9}\\.)[ \\t]/,insideComment=!1,ref1=code.split(\"\\n\"),(i=0,len1=ref1.length);i<len1;i++)line=ref1[i],blankLine.test(line)?(insideComment=!1,out.push(line)):insideComment||listItemStart.test(line)?(insideComment=!0,out.push(\"# \".concat(line))):!insideComment&&indented.test(line)?out.push(line):(insideComment=!0,out.push(\"# \".concat(line)));return out.join(\"\\n\")},buildLocationData=function(first,last){return last?{first_line:first.first_line,first_column:first.first_column,last_line:last.last_line,last_column:last.last_column,last_line_exclusive:last.last_line_exclusive,last_column_exclusive:last.last_column_exclusive,range:[first.range[0],last.range[1]]}:first},exports.extractAllCommentTokens=function(tokens){var allCommentsObj,comment,commentKey,i,j,k,key,len1,len2,len3,ref1,results,sortedKeys,token;for(allCommentsObj={},i=0,len1=tokens.length;i<len1;i++)if(token=tokens[i],token.comments)for(ref1=token.comments,j=0,len2=ref1.length;j<len2;j++)comment=ref1[j],commentKey=comment.locationData.range[0],allCommentsObj[commentKey]=comment;for(sortedKeys=Object.keys(allCommentsObj).sort(function(a,b){return a-b}),results=[],(k=0,len3=sortedKeys.length);k<len3;k++)key=sortedKeys[k],results.push(allCommentsObj[key]);return results},buildLocationHash=function(loc){return\"\".concat(loc.range[0],\"-\").concat(loc.range[1])},exports.buildTokenDataDictionary=buildTokenDataDictionary=function(tokens){var base1,i,len1,token,tokenData,tokenHash;for(tokenData={},i=0,len1=tokens.length;i<len1;i++)if((token=tokens[i],!!token.comments)&&(tokenHash=buildLocationHash(token[2]),null==tokenData[tokenHash]&&(tokenData[tokenHash]={}),token.comments)){var _ref;(_ref=null==(base1=tokenData[tokenHash]).comments?base1.comments=[]:base1.comments).push.apply(_ref,_toConsumableArray(token.comments))}return tokenData},exports.addDataToNode=function(parserState,firstLocationData,firstValue,lastLocationData,lastValue){var forceUpdateLocation=!(5<arguments.length&&void 0!==arguments[5])||arguments[5];return function(obj){var locationData,objHash,ref1,ref2,ref3;return locationData=buildLocationData(null==(ref1=null==firstValue?void 0:firstValue.locationData)?firstLocationData:ref1,null==(ref2=null==lastValue?void 0:lastValue.locationData)?lastLocationData:ref2),null!=(null==obj?void 0:obj.updateLocationDataIfMissing)&&null!=firstLocationData?obj.updateLocationDataIfMissing(locationData,forceUpdateLocation):obj.locationData=locationData,null==parserState.tokenData&&(parserState.tokenData=buildTokenDataDictionary(parserState.parser.tokens)),null!=obj.locationData&&(objHash=buildLocationHash(obj.locationData),null!=(null==(ref3=parserState.tokenData[objHash])?void 0:ref3.comments)&&attachCommentsToNode(parserState.tokenData[objHash].comments,obj)),obj}},exports.attachCommentsToNode=attachCommentsToNode=function(comments,node){var _node$comments;if(null!=comments&&0!==comments.length)return null==node.comments&&(node.comments=[]),(_node$comments=node.comments).push.apply(_node$comments,_toConsumableArray(comments))},exports.locationDataToString=function(obj){var locationData;return\"2\"in obj&&\"first_line\"in obj[2]?locationData=obj[2]:\"first_line\"in obj&&(locationData=obj),locationData?\"\".concat(locationData.first_line+1,\":\").concat(locationData.first_column+1,\"-\")+\"\".concat(locationData.last_line+1,\":\").concat(locationData.last_column+1):\"No location data\"},exports.anonymousFileName=function(){var n;return n=0,function(){return\"<anonymous-\".concat(n++,\">\")}}(),exports.baseFileName=function(file){var stripExt=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],useWinPathSep=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],parts,pathSep;return(pathSep=useWinPathSep?/\\\\|\\//:/\\//,parts=file.split(pathSep),file=parts[parts.length-1],!(stripExt&&0<=file.indexOf(\".\")))?file:(parts=file.split(\".\"),parts.pop(),\"coffee\"===parts[parts.length-1]&&1<parts.length&&parts.pop(),parts.join(\".\"))},exports.isCoffee=function(file){return /\\.((lit)?coffee|coffee\\.md)$/.test(file)},exports.isLiterate=function(file){return /\\.(litcoffee|coffee\\.md)$/.test(file)},exports.throwSyntaxError=function(message,location){var error;throw error=new SyntaxError(message),error.location=location,error.toString=syntaxErrorToString,error.stack=error.toString(),error},exports.updateSyntaxError=function(error,code,filename){return error.toString===syntaxErrorToString&&(error.code||(error.code=code),error.filename||(error.filename=filename),error.stack=error.toString()),error},syntaxErrorToString=function(){var codeLine,colorize,colorsEnabled,end,filename,first_column,first_line,last_column,last_line,marker,ref1,ref2,ref3,ref4,start;if(!(this.code&&this.location))return Error.prototype.toString.call(this);var _this$location=this.location;return first_line=_this$location.first_line,first_column=_this$location.first_column,last_line=_this$location.last_line,last_column=_this$location.last_column,null==last_line&&(last_line=first_line),null==last_column&&(last_column=first_column),filename=(null==(ref1=this.filename)?void 0:ref1.startsWith(\"<anonymous\"))?\"[stdin]\":this.filename||\"[stdin]\",codeLine=this.code.split(\"\\n\")[first_line],start=first_column,end=first_line===last_line?last_column+1:codeLine.length,marker=codeLine.slice(0,start).replace(/[^\\s]/g,\" \")+repeat(\"^\",end-start),\"undefined\"!=typeof process&&null!==process&&(colorsEnabled=(null==(ref2=process.stdout)?void 0:ref2.isTTY)&&(null==(ref3=process.env)||!ref3.NODE_DISABLE_COLORS)),(null==(ref4=this.colorful)?colorsEnabled:ref4)&&(colorize=function(str){return\"\\x1B[1;31m\".concat(str,\"\\x1B[0m\")},codeLine=codeLine.slice(0,start)+colorize(codeLine.slice(start,end))+codeLine.slice(end),marker=colorize(marker)),\"\".concat(filename,\":\").concat(first_line+1,\":\").concat(first_column+1,\": error: \").concat(this.message,\"\\n\").concat(codeLine,\"\\n\").concat(marker)},exports.nameWhitespaceCharacter=function(string){return\" \"===string?\"space\":\"\\n\"===string?\"newline\":\"\\r\"===string?\"carriage return\":\"\\t\"===string?\"tab\":string},exports.parseNumber=function(string){var base;return null==string?0/0:(base=function(){switch(string.charAt(1)){case\"b\":return 2;case\"o\":return 8;case\"x\":return 16;default:return null;}}(),null==base?parseFloat(string.replace(/_/g,\"\")):parseInt(string.slice(2).replace(/_/g,\"\"),base))},exports.isFunction=function(obj){return\"[object Function]\"===Object.prototype.toString.call(obj)},exports.isNumber=isNumber=function(obj){return\"[object Number]\"===Object.prototype.toString.call(obj)},exports.isString=isString=function(obj){return\"[object String]\"===Object.prototype.toString.call(obj)},exports.isBoolean=isBoolean=function(obj){return!0===obj||!1===obj||\"[object Boolean]\"===Object.prototype.toString.call(obj)},exports.isPlainObject=function(obj){return\"object\"===_typeof(obj)&&!!obj&&!Array.isArray(obj)&&!isNumber(obj)&&!isString(obj)&&!isBoolean(obj)},unicodeCodePointToUnicodeEscapes=function(codePoint){var high,low,toUnicodeEscape;return(toUnicodeEscape=function(val){var str;return str=val.toString(16),\"\\\\u\".concat(repeat(\"0\",4-str.length)).concat(str)},65536>codePoint)?toUnicodeEscape(codePoint):(high=_Mathfloor((codePoint-65536)/1024)+55296,low=(codePoint-65536)%1024+56320,\"\".concat(toUnicodeEscape(high)).concat(toUnicodeEscape(low)))},exports.replaceUnicodeCodePointEscapes=function(str){var _ref2=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},flags=_ref2.flags,error=_ref2.error,_ref2$delimiter=_ref2.delimiter,delimiter=void 0===_ref2$delimiter?\"\":_ref2$delimiter,shouldReplace;return shouldReplace=null!=flags&&0>indexOf.call(flags,\"u\"),str.replace(UNICODE_CODE_POINT_ESCAPE,function(match,escapedBackslash,codePointHex,offset){var codePointDecimal;return escapedBackslash?escapedBackslash:(codePointDecimal=parseInt(codePointHex,16),1114111<codePointDecimal&&error(\"unicode code point escapes greater than \\\\u{10ffff} are not allowed\",{offset:offset+delimiter.length,length:codePointHex.length+4}),shouldReplace?unicodeCodePointToUnicodeEscapes(codePointDecimal):match)})},UNICODE_CODE_POINT_ESCAPE=/(\\\\\\\\)|\\\\u\\{([\\da-fA-F]+)\\}/g}.call(this),{exports:exports}.exports}(),require[\"./rewriter\"]=function(){var exports={};return function(){var indexOf=[].indexOf,hasProp={}.hasOwnProperty,_require=require(\"./helpers\"),BALANCED_PAIRS,CALL_CLOSERS,CONTROL_IN_IMPLICIT,DISCARDED,EXPRESSION_CLOSE,EXPRESSION_END,EXPRESSION_START,IMPLICIT_CALL,IMPLICIT_END,IMPLICIT_FUNC,IMPLICIT_UNSPACED_CALL,INVERSES,LINEBREAKS,Rewriter,SINGLE_CLOSERS,SINGLE_LINERS,UNFINISHED,extractAllCommentTokens,generate,k,left,len,moveComments,right,throwSyntaxError;for(throwSyntaxError=_require.throwSyntaxError,extractAllCommentTokens=_require.extractAllCommentTokens,moveComments=function(fromToken,toToken){var comment,k,len,ref,unshiftedComments;if(fromToken.comments){if(toToken.comments&&0!==toToken.comments.length){for(unshiftedComments=[],ref=fromToken.comments,(k=0,len=ref.length);k<len;k++)comment=ref[k],comment.unshift?unshiftedComments.push(comment):toToken.comments.push(comment);toToken.comments=unshiftedComments.concat(toToken.comments)}else toToken.comments=fromToken.comments;return delete fromToken.comments}},generate=function(tag,value,origin,commentsToken){var token;return token=[tag,value],token.generated=!0,origin&&(token.origin=origin),commentsToken&&moveComments(commentsToken,token),token},exports.Rewriter=Rewriter=function(){var Rewriter=function(){\"use strict\";function Rewriter(){_classCallCheck(this,Rewriter)}return _createClass(Rewriter,[{key:\"rewrite\",value:function rewrite(tokens1){var ref,ref1,t;return this.tokens=tokens1,(\"undefined\"!=typeof process&&null!==process?null==(ref=process.env)?void 0:ref.DEBUG_TOKEN_STREAM:void 0)&&(process.env.DEBUG_REWRITTEN_TOKEN_STREAM&&console.log(\"Initial token stream:\"),console.log(function(){var k,len,ref1,results;for(ref1=this.tokens,results=[],(k=0,len=ref1.length);k<len;k++)t=ref1[k],results.push(t[0]+\"/\"+t[1]+(t.comments?\"*\":\"\"));return results}.call(this).join(\" \"))),this.removeLeadingNewlines(),this.closeOpenCalls(),this.closeOpenIndexes(),this.normalizeLines(),this.tagPostfixConditionals(),this.addImplicitBracesAndParens(),this.rescueStowawayComments(),this.addLocationDataToGeneratedTokens(),this.enforceValidJSXAttributes(),this.fixIndentationLocationData(),this.exposeTokenDataToGrammar(),(\"undefined\"!=typeof process&&null!==process?null==(ref1=process.env)?void 0:ref1.DEBUG_REWRITTEN_TOKEN_STREAM:void 0)&&(process.env.DEBUG_TOKEN_STREAM&&console.log(\"Rewritten token stream:\"),console.log(function(){var k,len,ref2,results;for(ref2=this.tokens,results=[],(k=0,len=ref2.length);k<len;k++)t=ref2[k],results.push(t[0]+\"/\"+t[1]+(t.comments?\"*\":\"\"));return results}.call(this).join(\" \"))),this.tokens}},{key:\"scanTokens\",value:function scanTokens(block){var i,token,tokens;for(tokens=this.tokens,i=0;token=tokens[i];)i+=block.call(this,token,i,tokens);return!0}},{key:\"detectEnd\",value:function detectEnd(i,condition,action){var opts=3<arguments.length&&void 0!==arguments[3]?arguments[3]:{},levels,ref,ref1,token,tokens;for(tokens=this.tokens,levels=0;token=tokens[i];){if(0===levels&&condition.call(this,token,i))return action.call(this,token,i);if((ref=token[0],0<=indexOf.call(EXPRESSION_START,ref))?levels+=1:(ref1=token[0],0<=indexOf.call(EXPRESSION_END,ref1))&&(levels-=1),0>levels)return opts.returnOnNegativeLevel?void 0:action.call(this,token,i);i+=1}return i-1}},{key:\"removeLeadingNewlines\",value:function removeLeadingNewlines(){var i,k,l,leadingNewlineToken,len,len1,ref,ref1,tag;for(ref=this.tokens,i=k=0,len=ref.length;k<len;i=++k){var _ref$i=_slicedToArray(ref[i],1);if(tag=_ref$i[0],\"TERMINATOR\"!==tag)break}if(0!==i){for(ref1=this.tokens.slice(0,i),l=0,len1=ref1.length;l<len1;l++)leadingNewlineToken=ref1[l],moveComments(leadingNewlineToken,this.tokens[i]);return this.tokens.splice(0,i)}}},{key:\"closeOpenCalls\",value:function closeOpenCalls(){var action,condition;return condition=function(token){var ref;return\")\"===(ref=token[0])||\"CALL_END\"===ref},action=function(token){return token[0]=\"CALL_END\"},this.scanTokens(function(token,i){return\"CALL_START\"===token[0]&&this.detectEnd(i+1,condition,action),1})}},{key:\"closeOpenIndexes\",value:function closeOpenIndexes(){var action,condition,startToken;return startToken=null,condition=function(token){var ref;return\"]\"===(ref=token[0])||\"INDEX_END\"===ref},action=function(token,i){return this.tokens.length>=i&&\":\"===this.tokens[i+1][0]?(startToken[0]=\"[\",token[0]=\"]\"):token[0]=\"INDEX_END\"},this.scanTokens(function(token,i){return\"INDEX_START\"===token[0]&&(startToken=token,this.detectEnd(i+1,condition,action)),1})}},{key:\"indexOfTag\",value:function indexOfTag(i){var fuzz,j,k,ref,ref1;fuzz=0;for(var _len=arguments.length,pattern=Array(1<_len?_len-1:0),_key=1;_key<_len;_key++)pattern[_key-1]=arguments[_key];for(j=k=0,ref=pattern.length;0<=ref?k<ref:k>ref;j=0<=ref?++k:--k)if(null!=pattern[j]&&(\"string\"==typeof pattern[j]&&(pattern[j]=[pattern[j]]),ref1=this.tag(i+j+fuzz),0>indexOf.call(pattern[j],ref1)))return-1;return i+j+fuzz-1}},{key:\"looksObjectish\",value:function looksObjectish(j){var end,index;return-1!==this.indexOfTag(j,\"@\",null,\":\")||-1!==this.indexOfTag(j,null,\":\")||(index=this.indexOfTag(j,EXPRESSION_START),!!(-1!==index&&(end=null,this.detectEnd(index+1,function(token){var ref;return ref=token[0],0<=indexOf.call(EXPRESSION_END,ref)},function(token,i){return end=i}),\":\"===this.tag(end+1))))}},{key:\"findTagsBackwards\",value:function findTagsBackwards(i,tags){var backStack,ref,ref1,ref2,ref3,ref4,ref5;for(backStack=[];0<=i&&(backStack.length||(ref2=this.tag(i),0>indexOf.call(tags,ref2))&&((ref3=this.tag(i),0>indexOf.call(EXPRESSION_START,ref3))||this.tokens[i].generated)&&(ref4=this.tag(i),0>indexOf.call(LINEBREAKS,ref4)));)(ref=this.tag(i),0<=indexOf.call(EXPRESSION_END,ref))&&backStack.push(this.tag(i)),(ref1=this.tag(i),0<=indexOf.call(EXPRESSION_START,ref1))&&backStack.length&&backStack.pop(),i-=1;return ref5=this.tag(i),0<=indexOf.call(tags,ref5)}},{key:\"addImplicitBracesAndParens\",value:function addImplicitBracesAndParens(){var stack,start;return stack=[],start=null,this.scanTokens(function(token,i,tokens){var _this=this,_token=_slicedToArray(token,1),endImplicitCall,endImplicitObject,forward,implicitObjectContinues,implicitObjectIndent,inControlFlow,inImplicit,inImplicitCall,inImplicitControl,inImplicitObject,isImplicit,isImplicitCall,isImplicitObject,k,newLine,nextTag,nextToken,offset,preContinuationLineIndent,preObjectToken,prevTag,prevToken,ref,ref1,ref2,ref3,ref4,ref5,s,sameLine,stackIdx,stackItem,stackNext,stackTag,stackTop,startIdx,startImplicitCall,startImplicitObject,startIndex,startTag,startsLine,tag;tag=_token[0];var _prevToken=prevToken=0<i?tokens[i-1]:[],_prevToken2=_slicedToArray(_prevToken,1);prevTag=_prevToken2[0];var _nextToken=nextToken=i<tokens.length-1?tokens[i+1]:[],_nextToken2=_slicedToArray(_nextToken,1);if(nextTag=_nextToken2[0],stackTop=function(){return stack[stack.length-1]},startIdx=i,forward=function(n){return i-startIdx+n},isImplicit=function(stackItem){var ref;return null==stackItem||null==(ref=stackItem[2])?void 0:ref.ours},isImplicitObject=function(stackItem){return isImplicit(stackItem)&&\"{\"===(null==stackItem?void 0:stackItem[0])},isImplicitCall=function(stackItem){return isImplicit(stackItem)&&\"(\"===(null==stackItem?void 0:stackItem[0])},inImplicit=function(){return isImplicit(stackTop())},inImplicitCall=function(){return isImplicitCall(stackTop())},inImplicitObject=function(){return isImplicitObject(stackTop())},inImplicitControl=function(){var ref;return inImplicit()&&\"CONTROL\"===(null==(ref=stackTop())?void 0:ref[0])},startImplicitCall=function(idx){return stack.push([\"(\",idx,{ours:!0}]),tokens.splice(idx,0,generate(\"CALL_START\",\"(\",[\"\",\"implicit function call\",token[2]],prevToken))},endImplicitCall=function(){return stack.pop(),tokens.splice(i,0,generate(\"CALL_END\",\")\",[\"\",\"end of input\",token[2]],prevToken)),i+=1},startImplicitObject=function(idx){var _ref3=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref3$startsLine=_ref3.startsLine,continuationLineIndent=_ref3.continuationLineIndent,val;return stack.push([\"{\",idx,{sameLine:!0,startsLine:void 0===_ref3$startsLine||_ref3$startsLine,ours:!0,continuationLineIndent:continuationLineIndent}]),val=new String(\"{\"),val.generated=!0,tokens.splice(idx,0,generate(\"{\",val,token,prevToken))},endImplicitObject=function(j){return j=null==j?i:j,stack.pop(),tokens.splice(j,0,generate(\"}\",\"}\",token,prevToken)),i+=1},implicitObjectContinues=function(j){var nextTerminatorIdx;return nextTerminatorIdx=null,_this.detectEnd(j,function(token){return\"TERMINATOR\"===token[0]},function(token,i){return nextTerminatorIdx=i},{returnOnNegativeLevel:!0}),null!=nextTerminatorIdx&&_this.looksObjectish(nextTerminatorIdx+1)},(inImplicitCall()||inImplicitObject())&&0<=indexOf.call(CONTROL_IN_IMPLICIT,tag)||inImplicitObject()&&\":\"===prevTag&&\"FOR\"===tag)return stack.push([\"CONTROL\",i,{ours:!0}]),forward(1);if(\"INDENT\"===tag&&inImplicit()){if(\"=>\"!==prevTag&&\"->\"!==prevTag&&\"[\"!==prevTag&&\"(\"!==prevTag&&\",\"!==prevTag&&\"{\"!==prevTag&&\"ELSE\"!==prevTag&&\"=\"!==prevTag)for(;inImplicitCall()||inImplicitObject()&&\":\"!==prevTag;)inImplicitCall()?endImplicitCall():endImplicitObject();return inImplicitControl()&&stack.pop(),stack.push([tag,i]),forward(1)}if(0<=indexOf.call(EXPRESSION_START,tag))return stack.push([tag,i]),forward(1);if(0<=indexOf.call(EXPRESSION_END,tag)){for(;inImplicit();)inImplicitCall()?endImplicitCall():inImplicitObject()?endImplicitObject():stack.pop();start=stack.pop()}if(inControlFlow=function(){var controlFlow,isFunc,seenFor,tagCurrentLine;return(seenFor=_this.findTagsBackwards(i,[\"FOR\"])&&_this.findTagsBackwards(i,[\"FORIN\",\"FOROF\",\"FORFROM\"]),controlFlow=seenFor||_this.findTagsBackwards(i,[\"WHILE\",\"UNTIL\",\"LOOP\",\"LEADING_WHEN\"]),!!controlFlow)&&(isFunc=!1,tagCurrentLine=token[2].first_line,_this.detectEnd(i,function(token){var ref;return ref=token[0],0<=indexOf.call(LINEBREAKS,ref)},function(token,i){var _ref4=tokens[i-1]||[],_ref5=_slicedToArray(_ref4,3),first_line;return prevTag=_ref5[0],first_line=_ref5[2].first_line,isFunc=tagCurrentLine===first_line&&(\"->\"===prevTag||\"=>\"===prevTag)},{returnOnNegativeLevel:!0}),isFunc)},(0<=indexOf.call(IMPLICIT_FUNC,tag)&&token.spaced||\"?\"===tag&&0<i&&!tokens[i-1].spaced)&&(0<=indexOf.call(IMPLICIT_CALL,nextTag)||\"...\"===nextTag&&(ref=this.tag(i+2),0<=indexOf.call(IMPLICIT_CALL,ref))&&!this.findTagsBackwards(i,[\"INDEX_START\",\"[\"])||0<=indexOf.call(IMPLICIT_UNSPACED_CALL,nextTag)&&!nextToken.spaced&&!nextToken.newLine)&&!inControlFlow())return\"?\"===tag&&(tag=token[0]=\"FUNC_EXIST\"),startImplicitCall(i+1),forward(2);if(0<=indexOf.call(IMPLICIT_FUNC,tag)&&-1<this.indexOfTag(i+1,\"INDENT\")&&this.looksObjectish(i+2)&&!this.findTagsBackwards(i,[\"CLASS\",\"EXTENDS\",\"IF\",\"CATCH\",\"SWITCH\",\"LEADING_WHEN\",\"FOR\",\"WHILE\",\"UNTIL\"])&&(\"{\"!==(ref1=s=null==(ref2=stackTop())?void 0:ref2[0])&&\"[\"!==ref1||isImplicit(stackTop())||!this.findTagsBackwards(i,s)))return startImplicitCall(i+1),stack.push([\"INDENT\",i+2]),forward(3);if(\":\"===tag){if(s=function(){var ref3;switch(!1){case(ref3=this.tag(i-1),0>indexOf.call(EXPRESSION_END,ref3)):var _start=start,_start2=_slicedToArray(_start,2);return startTag=_start2[0],startIndex=_start2[1],\"[\"===startTag&&0<startIndex&&\"@\"===this.tag(startIndex-1)&&!tokens[startIndex-1].spaced?startIndex-1:startIndex;break;case\"@\"!==this.tag(i-2):return i-2;default:return i-1;}}.call(this),startsLine=0>=s||(ref3=this.tag(s-1),0<=indexOf.call(LINEBREAKS,ref3))||tokens[s-1].newLine,stackTop()){var _stackTop=stackTop(),_stackTop2=_slicedToArray(_stackTop,2);if(stackTag=_stackTop2[0],stackIdx=_stackTop2[1],stackNext=stack[stack.length-2],(\"{\"===stackTag||\"INDENT\"===stackTag&&\"{\"===(null==stackNext?void 0:stackNext[0])&&!isImplicit(stackNext)&&this.findTagsBackwards(stackIdx-1,[\"{\"]))&&(startsLine||\",\"===this.tag(s-1)||\"{\"===this.tag(s-1))&&(ref4=this.tag(s-1),0>indexOf.call(UNFINISHED,ref4)))return forward(1)}return preObjectToken=1<i?tokens[i-2]:[],startImplicitObject(s,{startsLine:!!startsLine,continuationLineIndent:preObjectToken.continuationLineIndent}),forward(2)}if(0<=indexOf.call(LINEBREAKS,tag))for(k=stack.length-1;0<=k&&(stackItem=stack[k],!!isImplicit(stackItem));k+=-1)isImplicitObject(stackItem)&&(stackItem[2].sameLine=!1);if(\"TERMINATOR\"===tag&&token.endsContinuationLineIndentation)for(preContinuationLineIndent=token.endsContinuationLineIndentation.preContinuationLineIndent;inImplicitObject()&&null!=(implicitObjectIndent=stackTop()[2].continuationLineIndent)&&implicitObjectIndent>preContinuationLineIndent;)endImplicitObject();if(newLine=\"OUTDENT\"===prevTag||prevToken.newLine,0<=indexOf.call(IMPLICIT_END,tag)||0<=indexOf.call(CALL_CLOSERS,tag)&&newLine||(\"..\"===tag||\"...\"===tag)&&this.findTagsBackwards(i,[\"INDEX_START\"]))for(;inImplicit();){var _stackTop3=stackTop(),_stackTop4=_slicedToArray(_stackTop3,3);stackTag=_stackTop4[0],stackIdx=_stackTop4[1];var _stackTop4$=_stackTop4[2];if(sameLine=_stackTop4$.sameLine,startsLine=_stackTop4$.startsLine,inImplicitCall()&&\",\"!==prevTag||\",\"===prevTag&&\"TERMINATOR\"===tag&&null==nextTag)endImplicitCall();else if(inImplicitObject()&&sameLine&&\"TERMINATOR\"!==tag&&\":\"!==prevTag&&!((\"POST_IF\"===tag||\"FOR\"===tag||\"WHILE\"===tag||\"UNTIL\"===tag)&&startsLine&&implicitObjectContinues(i+1)))endImplicitObject();else if(inImplicitObject()&&\"TERMINATOR\"===tag&&\",\"!==prevTag&&!(startsLine&&this.looksObjectish(i+1)))endImplicitObject();else if(inImplicitControl()&&\"CLASS\"===tokens[stackTop()[1]][0]&&\"TERMINATOR\"===tag)stack.pop();else break}if(\",\"===tag&&!this.looksObjectish(i+1)&&inImplicitObject()&&\"FOROF\"!==(ref5=this.tag(i+2))&&\"FORIN\"!==ref5&&(\"TERMINATOR\"!==nextTag||!this.looksObjectish(i+2)))for(offset=\"OUTDENT\"===nextTag?1:0;inImplicitObject();)endImplicitObject(i+offset);return forward(1)})}},{key:\"enforceValidJSXAttributes\",value:function enforceValidJSXAttributes(){return this.scanTokens(function(token,i,tokens){var next,ref;return token.jsxColon&&(next=tokens[i+1],\"STRING_START\"!==(ref=next[0])&&\"STRING\"!==ref&&\"(\"!==ref&&throwSyntaxError(\"expected wrapped or quoted JSX attribute\",next[2])),1})}},{key:\"rescueStowawayComments\",value:function rescueStowawayComments(){var dontShiftForward,insertPlaceholder,shiftCommentsBackward,shiftCommentsForward;return insertPlaceholder=function(token,j,tokens,method){return\"TERMINATOR\"!==tokens[j][0]&&tokens[method](generate(\"TERMINATOR\",\"\\n\",tokens[j])),tokens[method](generate(\"JS\",\"\",tokens[j],token))},dontShiftForward=function(i,tokens){var j,ref;for(j=i+1;j!==tokens.length&&(ref=tokens[j][0],0<=indexOf.call(DISCARDED,ref));){if(\"INTERPOLATION_END\"===tokens[j][0])return!0;j++}return!1},shiftCommentsForward=function(token,i,tokens){var comment,j,k,len,ref,ref1,ref2;for(j=i;j!==tokens.length&&(ref=tokens[j][0],0<=indexOf.call(DISCARDED,ref));)j++;if(!(j===tokens.length||(ref1=tokens[j][0],0<=indexOf.call(DISCARDED,ref1)))){for(ref2=token.comments,k=0,len=ref2.length;k<len;k++)comment=ref2[k],comment.unshift=!0;return moveComments(token,tokens[j]),1}return j=tokens.length-1,insertPlaceholder(token,j,tokens,\"push\"),1},shiftCommentsBackward=function(token,i,tokens){var j,ref,ref1;for(j=i;-1!==j&&(ref=tokens[j][0],0<=indexOf.call(DISCARDED,ref));)j--;return-1===j||(ref1=tokens[j][0],0<=indexOf.call(DISCARDED,ref1))?(insertPlaceholder(token,0,tokens,\"unshift\"),3):(moveComments(token,tokens[j]),1)},this.scanTokens(function(token,i,tokens){var dummyToken,j,ref,ref1,ret;if(!token.comments)return 1;if(ret=1,ref=token[0],0<=indexOf.call(DISCARDED,ref)){for(dummyToken={comments:[]},j=token.comments.length-1;-1!==j;)!1===token.comments[j].newLine&&!1===token.comments[j].here&&(dummyToken.comments.unshift(token.comments[j]),token.comments.splice(j,1)),j--;0!==dummyToken.comments.length&&(ret=shiftCommentsBackward(dummyToken,i-1,tokens)),0!==token.comments.length&&shiftCommentsForward(token,i,tokens)}else if(!dontShiftForward(i,tokens)){for(dummyToken={comments:[]},j=token.comments.length-1;-1!==j;)!token.comments[j].newLine||token.comments[j].unshift||\"JS\"===token[0]&&token.generated||(dummyToken.comments.unshift(token.comments[j]),token.comments.splice(j,1)),j--;0!==dummyToken.comments.length&&(ret=shiftCommentsForward(dummyToken,i+1,tokens))}return 0===(null==(ref1=token.comments)?void 0:ref1.length)&&delete token.comments,ret})}},{key:\"addLocationDataToGeneratedTokens\",value:function addLocationDataToGeneratedTokens(){return this.scanTokens(function(token,i,tokens){var column,line,nextLocation,prevLocation,rangeIndex,ref,ref1;if(token[2])return 1;if(!(token.generated||token.explicit))return 1;if(token.fromThen&&\"INDENT\"===token[0])return token[2]=token.origin[2],1;if(\"{\"===token[0]&&(nextLocation=null==(ref=tokens[i+1])?void 0:ref[2])){var _nextLocation=nextLocation;line=_nextLocation.first_line,column=_nextLocation.first_column;var _nextLocation$range=_slicedToArray(_nextLocation.range,1);rangeIndex=_nextLocation$range[0]}else if(prevLocation=null==(ref1=tokens[i-1])?void 0:ref1[2]){var _prevLocation=prevLocation;line=_prevLocation.last_line,column=_prevLocation.last_column;var _prevLocation$range=_slicedToArray(_prevLocation.range,2);rangeIndex=_prevLocation$range[1],column+=1}else line=column=0,rangeIndex=0;return token[2]={first_line:line,first_column:column,last_line:line,last_column:column,last_line_exclusive:line,last_column_exclusive:column,range:[rangeIndex,rangeIndex]},1})}},{key:\"fixIndentationLocationData\",value:function fixIndentationLocationData(){var _this2=this,findPrecedingComment;return null==this.allComments&&(this.allComments=extractAllCommentTokens(this.tokens)),findPrecedingComment=function(token,_ref6){var afterPosition=_ref6.afterPosition,indentSize=_ref6.indentSize,first=_ref6.first,indented=_ref6.indented,comment,k,l,lastMatching,matches,ref,ref1,tokenStart;if(tokenStart=token[2].range[0],matches=function(comment){return(!comment.outdented||null!=indentSize&&comment.indentSize>indentSize)&&(!indented||comment.indented)&&!!(comment.locationData.range[0]<tokenStart)&&!!(comment.locationData.range[0]>afterPosition)},first){for(lastMatching=null,ref=_this2.allComments,k=ref.length-1;0<=k;k+=-1)if(comment=ref[k],matches(comment))lastMatching=comment;else if(lastMatching)return lastMatching;return lastMatching}for(ref1=_this2.allComments,l=ref1.length-1;0<=l;l+=-1)if(comment=ref1[l],matches(comment))return comment;return null},this.scanTokens(function(token,i,tokens){var isIndent,nextToken,nextTokenIndex,precedingComment,prevLocationData,prevToken,ref,ref1,ref2,useNextToken;if(\"INDENT\"!==(ref=token[0])&&\"OUTDENT\"!==ref&&(!token.generated||\"CALL_END\"!==token[0]||null!=(ref1=token.data)&&ref1.closingTagNameToken)&&(!token.generated||\"}\"!==token[0]))return 1;if(isIndent=\"INDENT\"===token[0],prevToken=null==(ref2=token.prevToken)?tokens[i-1]:ref2,prevLocationData=prevToken[2],useNextToken=token.explicit||token.generated,useNextToken)for(nextToken=token,nextTokenIndex=i;(nextToken.explicit||nextToken.generated)&&nextTokenIndex!==tokens.length-1;)nextToken=tokens[nextTokenIndex++];return(precedingComment=findPrecedingComment(useNextToken?nextToken:token,{afterPosition:prevLocationData.range[0],indentSize:token.indentSize,first:isIndent,indented:useNextToken}),isIndent&&(null==precedingComment||!precedingComment.newLine))?1:token.generated&&\"CALL_END\"===token[0]&&(null==precedingComment?void 0:precedingComment.indented)?1:(null!=precedingComment&&(prevLocationData=precedingComment.locationData),token[2]={first_line:null==precedingComment?prevLocationData.last_line:prevLocationData.first_line,first_column:null==precedingComment?prevLocationData.last_column:isIndent?0:prevLocationData.first_column,last_line:prevLocationData.last_line,last_column:prevLocationData.last_column,last_line_exclusive:prevLocationData.last_line_exclusive,last_column_exclusive:prevLocationData.last_column_exclusive,range:isIndent&&null!=precedingComment?[prevLocationData.range[0]-precedingComment.indentSize,prevLocationData.range[1]]:prevLocationData.range},1)})}},{key:\"normalizeLines\",value:function normalizeLines(){var _this3=this,action,closeElseTag,condition,ifThens,indent,leading_if_then,leading_switch_when,outdent,starter;return starter=indent=outdent=null,leading_switch_when=null,leading_if_then=null,ifThens=[],condition=function(token,i){var ref,ref1,ref2,ref3;return\";\"!==token[1]&&(ref=token[0],0<=indexOf.call(SINGLE_CLOSERS,ref))&&!(\"TERMINATOR\"===token[0]&&(ref1=this.tag(i+1),0<=indexOf.call(EXPRESSION_CLOSE,ref1)))&&!(\"ELSE\"===token[0]&&(\"THEN\"!==starter||leading_if_then||leading_switch_when))&&(\"CATCH\"!==(ref2=token[0])&&\"FINALLY\"!==ref2||\"->\"!==starter&&\"=>\"!==starter)||(ref3=token[0],0<=indexOf.call(CALL_CLOSERS,ref3))&&(this.tokens[i-1].newLine||\"OUTDENT\"===this.tokens[i-1][0])},action=function(token,i){return\"ELSE\"===token[0]&&\"THEN\"===starter&&ifThens.pop(),this.tokens.splice(\",\"===this.tag(i-1)?i-1:i,0,outdent)},closeElseTag=function(tokens,i){var lastThen,outdentElse,tlen;if(tlen=ifThens.length,!(0<tlen))return i;lastThen=ifThens.pop();var _this3$indentation=_this3.indentation(tokens[lastThen]),_this3$indentation2=_slicedToArray(_this3$indentation,2);return outdentElse=_this3$indentation2[1],outdentElse[1]=2*tlen,tokens.splice(i,0,outdentElse),outdentElse[1]=2,tokens.splice(i+1,0,outdentElse),_this3.detectEnd(i+2,function(token){var ref;return\"OUTDENT\"===(ref=token[0])||\"TERMINATOR\"===ref},function(token,i){if(\"OUTDENT\"===this.tag(i)&&\"OUTDENT\"===this.tag(i+1))return tokens.splice(i,2)}),i+2},this.scanTokens(function(token,i,tokens){var _token2=_slicedToArray(token,1),conditionTag,j,k,ref,ref1,ref2,tag;if(tag=_token2[0],conditionTag=(\"->\"===tag||\"=>\"===tag)&&this.findTagsBackwards(i,[\"IF\",\"WHILE\",\"FOR\",\"UNTIL\",\"SWITCH\",\"WHEN\",\"LEADING_WHEN\",\"[\",\"INDEX_START\"])&&!this.findTagsBackwards(i,[\"THEN\",\"..\",\"...\"]),\"TERMINATOR\"===tag){if(\"ELSE\"===this.tag(i+1)&&\"OUTDENT\"!==this.tag(i-1))return tokens.splice.apply(tokens,[i,1].concat(_toConsumableArray(this.indentation()))),1;if(ref=this.tag(i+1),0<=indexOf.call(EXPRESSION_CLOSE,ref))return\";\"===token[1]&&\"OUTDENT\"===this.tag(i+1)&&(tokens[i+1].prevToken=token,moveComments(token,tokens[i+1])),tokens.splice(i,1),0}if(\"CATCH\"===tag)for(j=k=1;2>=k;j=++k)if(\"OUTDENT\"===(ref1=this.tag(i+j))||\"TERMINATOR\"===ref1||\"FINALLY\"===ref1)return tokens.splice.apply(tokens,[i+j,0].concat(_toConsumableArray(this.indentation()))),2+j;if((\"->\"===tag||\"=>\"===tag)&&(\",\"===(ref2=this.tag(i+1))||\"]\"===ref2||\".\"===this.tag(i+1)&&token.newLine)){var _this$indentation=this.indentation(tokens[i]),_this$indentation2=_slicedToArray(_this$indentation,2);return indent=_this$indentation2[0],outdent=_this$indentation2[1],tokens.splice(i+1,0,indent,outdent),1}if(0<=indexOf.call(SINGLE_LINERS,tag)&&\"INDENT\"!==this.tag(i+1)&&(\"ELSE\"!==tag||\"IF\"!==this.tag(i+1))&&!conditionTag){starter=tag;var _this$indentation3=this.indentation(tokens[i]),_this$indentation4=_slicedToArray(_this$indentation3,2);return indent=_this$indentation4[0],outdent=_this$indentation4[1],\"THEN\"===starter&&(indent.fromThen=!0),\"THEN\"===tag&&(leading_switch_when=this.findTagsBackwards(i,[\"LEADING_WHEN\"])&&\"IF\"===this.tag(i+1),leading_if_then=this.findTagsBackwards(i,[\"IF\"])&&\"IF\"===this.tag(i+1)),\"THEN\"===tag&&this.findTagsBackwards(i,[\"IF\"])&&ifThens.push(i),\"ELSE\"===tag&&\"OUTDENT\"!==this.tag(i-1)&&(i=closeElseTag(tokens,i)),tokens.splice(i+1,0,indent),this.detectEnd(i+2,condition,action),\"THEN\"===tag&&tokens.splice(i,1),1}return 1})}},{key:\"tagPostfixConditionals\",value:function tagPostfixConditionals(){var action,condition,original;return original=null,condition=function(token,i){var _token3=_slicedToArray(token,1),prevTag,tag;tag=_token3[0];var _this$tokens=_slicedToArray(this.tokens[i-1],1);return prevTag=_this$tokens[0],\"TERMINATOR\"===tag||\"INDENT\"===tag&&0>indexOf.call(SINGLE_LINERS,prevTag)},action=function(token){if(\"INDENT\"!==token[0]||token.generated&&!token.fromThen)return original[0]=\"POST_\"+original[0]},this.scanTokens(function(token,i){return\"IF\"===token[0]?(original=token,this.detectEnd(i+1,condition,action),1):1})}},{key:\"exposeTokenDataToGrammar\",value:function exposeTokenDataToGrammar(){return this.scanTokens(function(token){var key,ref,ref1,val;if(token.generated||token.data&&0!==Object.keys(token.data).length){for(key in token[1]=new String(token[1]),ref1=null==(ref=token.data)?{}:ref,ref1)hasProp.call(ref1,key)&&(val=ref1[key],token[1][key]=val);token.generated&&(token[1].generated=!0)}return 1})}},{key:\"indentation\",value:function indentation(origin){var indent,outdent;return indent=[\"INDENT\",2],outdent=[\"OUTDENT\",2],origin?(indent.generated=outdent.generated=!0,indent.origin=outdent.origin=origin):indent.explicit=outdent.explicit=!0,[indent,outdent]}},{key:\"tag\",value:function tag(i){var ref;return null==(ref=this.tokens[i])?void 0:ref[0]}}]),Rewriter}();return Rewriter.prototype.generate=generate,Rewriter}.call(this),BALANCED_PAIRS=[[\"(\",\")\"],[\"[\",\"]\"],[\"{\",\"}\"],[\"INDENT\",\"OUTDENT\"],[\"CALL_START\",\"CALL_END\"],[\"PARAM_START\",\"PARAM_END\"],[\"INDEX_START\",\"INDEX_END\"],[\"STRING_START\",\"STRING_END\"],[\"INTERPOLATION_START\",\"INTERPOLATION_END\"],[\"REGEX_START\",\"REGEX_END\"]],exports.INVERSES=INVERSES={},EXPRESSION_START=[],EXPRESSION_END=[],(k=0,len=BALANCED_PAIRS.length);k<len;k++){var _BALANCED_PAIRS$k=_slicedToArray(BALANCED_PAIRS[k],2);left=_BALANCED_PAIRS$k[0],right=_BALANCED_PAIRS$k[1],EXPRESSION_START.push(INVERSES[right]=left),EXPRESSION_END.push(INVERSES[left]=right)}EXPRESSION_CLOSE=[\"CATCH\",\"THEN\",\"ELSE\",\"FINALLY\"].concat(EXPRESSION_END),IMPLICIT_FUNC=[\"IDENTIFIER\",\"PROPERTY\",\"SUPER\",\")\",\"CALL_END\",\"]\",\"INDEX_END\",\"@\",\"THIS\"],IMPLICIT_CALL=[\"IDENTIFIER\",\"JSX_TAG\",\"PROPERTY\",\"NUMBER\",\"INFINITY\",\"NAN\",\"STRING\",\"STRING_START\",\"REGEX\",\"REGEX_START\",\"JS\",\"NEW\",\"PARAM_START\",\"CLASS\",\"IF\",\"TRY\",\"SWITCH\",\"THIS\",\"DYNAMIC_IMPORT\",\"IMPORT_META\",\"NEW_TARGET\",\"UNDEFINED\",\"NULL\",\"BOOL\",\"UNARY\",\"DO\",\"DO_IIFE\",\"YIELD\",\"AWAIT\",\"UNARY_MATH\",\"SUPER\",\"THROW\",\"@\",\"->\",\"=>\",\"[\",\"(\",\"{\",\"--\",\"++\"],IMPLICIT_UNSPACED_CALL=[\"+\",\"-\"],IMPLICIT_END=[\"POST_IF\",\"FOR\",\"WHILE\",\"UNTIL\",\"WHEN\",\"BY\",\"LOOP\",\"TERMINATOR\"],SINGLE_LINERS=[\"ELSE\",\"->\",\"=>\",\"TRY\",\"FINALLY\",\"THEN\"],SINGLE_CLOSERS=[\"TERMINATOR\",\"CATCH\",\"FINALLY\",\"ELSE\",\"OUTDENT\",\"LEADING_WHEN\"],LINEBREAKS=[\"TERMINATOR\",\"INDENT\",\"OUTDENT\"],CALL_CLOSERS=[\".\",\"?.\",\"::\",\"?::\"],CONTROL_IN_IMPLICIT=[\"IF\",\"TRY\",\"FINALLY\",\"CATCH\",\"CLASS\",\"SWITCH\"],DISCARDED=[\"(\",\")\",\"[\",\"]\",\"{\",\"}\",\":\",\".\",\"..\",\"...\",\",\",\"=\",\"++\",\"--\",\"?\",\"AS\",\"AWAIT\",\"CALL_START\",\"CALL_END\",\"DEFAULT\",\"DO\",\"DO_IIFE\",\"ELSE\",\"EXTENDS\",\"EXPORT\",\"FORIN\",\"FOROF\",\"FORFROM\",\"IMPORT\",\"INDENT\",\"INDEX_SOAK\",\"INTERPOLATION_START\",\"INTERPOLATION_END\",\"LEADING_WHEN\",\"OUTDENT\",\"PARAM_END\",\"REGEX_START\",\"REGEX_END\",\"RETURN\",\"STRING_END\",\"THROW\",\"UNARY\",\"YIELD\"].concat(IMPLICIT_UNSPACED_CALL.concat(IMPLICIT_END.concat(CALL_CLOSERS.concat(CONTROL_IN_IMPLICIT)))),exports.UNFINISHED=UNFINISHED=[\"\\\\\",\".\",\"?.\",\"?::\",\"UNARY\",\"DO\",\"DO_IIFE\",\"MATH\",\"UNARY_MATH\",\"+\",\"-\",\"**\",\"SHIFT\",\"RELATION\",\"COMPARE\",\"&\",\"^\",\"|\",\"&&\",\"||\",\"BIN?\",\"EXTENDS\"]}.call(this),{exports:exports}.exports}(),require[\"./lexer\"]=function(){var exports={};return function(){var indexOf=[].indexOf,slice=[].slice,_require2=require(\"./rewriter\"),BOM,BOOL,CALLABLE,CODE,COFFEE_ALIASES,COFFEE_ALIAS_MAP,COFFEE_KEYWORDS,COMMENT,COMPARABLE_LEFT_SIDE,COMPARE,COMPOUND_ASSIGN,HERECOMMENT_ILLEGAL,HEREDOC_DOUBLE,HEREDOC_INDENT,HEREDOC_SINGLE,HEREGEX,HEREGEX_COMMENT,HERE_JSTOKEN,IDENTIFIER,INDENTABLE_CLOSERS,INDEXABLE,INSIDE_JSX,INVERSES,JSTOKEN,JSX_ATTRIBUTE,JSX_FRAGMENT_IDENTIFIER,JSX_IDENTIFIER,JSX_IDENTIFIER_PART,JSX_INTERPOLATION,JS_KEYWORDS,LINE_BREAK,LINE_CONTINUER,Lexer,MATH,MULTI_DENT,NOT_REGEX,NUMBER,OPERATOR,POSSIBLY_DIVISION,REGEX,REGEX_FLAGS,REGEX_ILLEGAL,REGEX_INVALID_ESCAPE,RELATION,RESERVED,Rewriter,SHIFT,STRICT_PROSCRIBED,STRING_DOUBLE,STRING_INVALID_ESCAPE,STRING_SINGLE,STRING_START,TRAILING_SPACES,UNARY,UNARY_MATH,UNFINISHED,VALID_FLAGS,WHITESPACE,addTokenData,attachCommentsToNode,compact,count,flatten,invertLiterate,isForFrom,isUnassignable,key,locationDataToString,merge,parseNumber,repeat,replaceUnicodeCodePointEscapes,starts,throwSyntaxError;Rewriter=_require2.Rewriter,INVERSES=_require2.INVERSES,UNFINISHED=_require2.UNFINISHED;var _require3=require(\"./helpers\");count=_require3.count,starts=_require3.starts,compact=_require3.compact,repeat=_require3.repeat,invertLiterate=_require3.invertLiterate,merge=_require3.merge,attachCommentsToNode=_require3.attachCommentsToNode,locationDataToString=_require3.locationDataToString,throwSyntaxError=_require3.throwSyntaxError,replaceUnicodeCodePointEscapes=_require3.replaceUnicodeCodePointEscapes,flatten=_require3.flatten,parseNumber=_require3.parseNumber,exports.Lexer=Lexer=function(){\"use strict\";function Lexer(){_classCallCheck(this,Lexer),this.error=this.error.bind(this)}return _createClass(Lexer,[{key:\"tokenize\",value:function tokenize(code){var opts=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},consumed,end,i,ref;for(this.literate=opts.literate,this.indent=0,this.baseIndent=0,this.continuationLineAdditionalIndent=0,this.outdebt=0,this.indents=[],this.indentLiteral=\"\",this.ends=[],this.tokens=[],this.seenFor=!1,this.seenImport=!1,this.seenExport=!1,this.importSpecifierList=!1,this.exportSpecifierList=!1,this.jsxDepth=0,this.jsxObjAttribute={},this.chunkLine=opts.line||0,this.chunkColumn=opts.column||0,this.chunkOffset=opts.offset||0,this.locationDataCompensations=opts.locationDataCompensations||{},code=this.clean(code),i=0;this.chunk=code.slice(i);){consumed=this.identifierToken()||this.commentToken()||this.whitespaceToken()||this.lineToken()||this.stringToken()||this.numberToken()||this.jsxToken()||this.regexToken()||this.jsToken()||this.literalToken();var _this$getLineAndColum=this.getLineAndColumnFromChunk(consumed),_this$getLineAndColum2=_slicedToArray(_this$getLineAndColum,3);if(this.chunkLine=_this$getLineAndColum2[0],this.chunkColumn=_this$getLineAndColum2[1],this.chunkOffset=_this$getLineAndColum2[2],i+=consumed,opts.untilBalanced&&0===this.ends.length)return{tokens:this.tokens,index:i}}return this.closeIndentation(),(end=this.ends.pop())&&this.error(\"missing \".concat(end.tag),(null==(ref=end.origin)?end:ref)[2]),!1===opts.rewrite?this.tokens:new Rewriter().rewrite(this.tokens)}},{key:\"clean\",value:function clean(code){var _this4=this,base,thusFar;return thusFar=0,code.charCodeAt(0)===BOM&&(code=code.slice(1),this.locationDataCompensations[0]=1,thusFar+=1),WHITESPACE.test(code)&&(code=\"\\n\".concat(code),this.chunkLine--,null==(base=this.locationDataCompensations)[0]&&(base[0]=0),this.locationDataCompensations[0]-=1),code=code.replace(/\\r/g,function(match,offset){return _this4.locationDataCompensations[thusFar+offset]=1,\"\"}).replace(TRAILING_SPACES,\"\"),this.literate&&(code=invertLiterate(code)),code}},{key:\"identifierToken\",value:function identifierToken(){var alias,colon,colonOffset,colonToken,id,idLength,inJSXTag,input,match,poppedToken,prev,prevprev,ref,ref1,ref10,ref11,ref12,ref2,ref3,ref4,ref5,ref6,ref7,ref8,ref9,regExSuper,regex,sup,tag,tagToken,tokenData;if(inJSXTag=this.atJSXTag(),regex=inJSXTag?JSX_ATTRIBUTE:IDENTIFIER,!(match=regex.exec(this.chunk)))return 0;var _match=match,_match2=_slicedToArray(_match,3);if(input=_match2[0],id=_match2[1],colon=_match2[2],idLength=id.length,poppedToken=void 0,\"own\"===id&&\"FOR\"===this.tag())return this.token(\"OWN\",id),id.length;if(\"from\"===id&&\"YIELD\"===this.tag())return this.token(\"FROM\",id),id.length;if(\"as\"===id&&this.seenImport){if(\"*\"===this.value())this.tokens[this.tokens.length-1][0]=\"IMPORT_ALL\";else if(ref=this.value(!0),0<=indexOf.call(COFFEE_KEYWORDS,ref)){prev=this.prev();var _ref7=[\"IDENTIFIER\",this.value(!0)];prev[0]=_ref7[0],prev[1]=_ref7[1]}if(\"DEFAULT\"===(ref1=this.tag())||\"IMPORT_ALL\"===ref1||\"IDENTIFIER\"===ref1)return this.token(\"AS\",id),id.length}if(\"as\"===id&&this.seenExport){if(\"IDENTIFIER\"===(ref2=this.tag())||\"DEFAULT\"===ref2)return this.token(\"AS\",id),id.length;if(ref3=this.value(!0),0<=indexOf.call(COFFEE_KEYWORDS,ref3)){prev=this.prev();var _ref8=[\"IDENTIFIER\",this.value(!0)];return prev[0]=_ref8[0],prev[1]=_ref8[1],this.token(\"AS\",id),id.length}}if(\"default\"===id&&this.seenExport&&(\"EXPORT\"===(ref4=this.tag())||\"AS\"===ref4))return this.token(\"DEFAULT\",id),id.length;if(\"assert\"===id&&(this.seenImport||this.seenExport)&&\"STRING\"===this.tag())return this.token(\"ASSERT\",id),id.length;if(\"do\"===id&&(regExSuper=/^(\\s*super)(?!\\(\\))/.exec(this.chunk.slice(3)))){this.token(\"SUPER\",\"super\"),this.token(\"CALL_START\",\"(\"),this.token(\"CALL_END\",\")\");var _regExSuper=regExSuper,_regExSuper2=_slicedToArray(_regExSuper,2);return input=_regExSuper2[0],sup=_regExSuper2[1],sup.length+3}if(prev=this.prev(),tag=colon||null!=prev&&(\".\"===(ref5=prev[0])||\"?.\"===ref5||\"::\"===ref5||\"?::\"===ref5||!prev.spaced&&\"@\"===prev[0])?\"PROPERTY\":\"IDENTIFIER\",tokenData={},\"IDENTIFIER\"===tag&&(0<=indexOf.call(JS_KEYWORDS,id)||0<=indexOf.call(COFFEE_KEYWORDS,id))&&!(this.exportSpecifierList&&0<=indexOf.call(COFFEE_KEYWORDS,id))?(tag=id.toUpperCase(),\"WHEN\"===tag&&(ref6=this.tag(),0<=indexOf.call(LINE_BREAK,ref6))?tag=\"LEADING_WHEN\":\"FOR\"===tag?this.seenFor={endsLength:this.ends.length}:\"UNLESS\"===tag?tag=\"IF\":\"IMPORT\"===tag?this.seenImport=!0:\"EXPORT\"===tag?this.seenExport=!0:0<=indexOf.call(UNARY,tag)?tag=\"UNARY\":0<=indexOf.call(RELATION,tag)&&(\"INSTANCEOF\"!==tag&&this.seenFor?(tag=\"FOR\"+tag,this.seenFor=!1):(tag=\"RELATION\",\"!\"===this.value()&&(poppedToken=this.tokens.pop(),tokenData.invert=null==(ref7=null==(ref8=poppedToken.data)?void 0:ref8.original)?poppedToken[1]:ref7)))):\"IDENTIFIER\"===tag&&this.seenFor&&\"from\"===id&&isForFrom(prev)?(tag=\"FORFROM\",this.seenFor=!1):\"PROPERTY\"===tag&&prev&&(prev.spaced&&(ref9=prev[0],0<=indexOf.call(CALLABLE,ref9))&&/^[gs]et$/.test(prev[1])&&1<this.tokens.length&&\".\"!==(ref10=this.tokens[this.tokens.length-2][0])&&\"?.\"!==ref10&&\"@\"!==ref10?this.error(\"'\".concat(prev[1],\"' cannot be used as a keyword, or as a function call without parentheses\"),prev[2]):\".\"===prev[0]&&1<this.tokens.length&&\"UNARY\"===(prevprev=this.tokens[this.tokens.length-2])[0]&&\"new\"===prevprev[1]?prevprev[0]=\"NEW_TARGET\":\".\"===prev[0]&&1<this.tokens.length&&\"IMPORT\"===(prevprev=this.tokens[this.tokens.length-2])[0]&&\"import\"===prevprev[1]?(this.seenImport=!1,prevprev[0]=\"IMPORT_META\"):2<this.tokens.length&&(prevprev=this.tokens[this.tokens.length-2],(\"@\"===(ref11=prev[0])||\"THIS\"===ref11)&&prevprev&&prevprev.spaced&&/^[gs]et$/.test(prevprev[1])&&\".\"!==(ref12=this.tokens[this.tokens.length-3][0])&&\"?.\"!==ref12&&\"@\"!==ref12&&this.error(\"'\".concat(prevprev[1],\"' cannot be used as a keyword, or as a function call without parentheses\"),prevprev[2]))),\"IDENTIFIER\"===tag&&0<=indexOf.call(RESERVED,id)&&!inJSXTag&&this.error(\"reserved word '\".concat(id,\"'\"),{length:id.length}),\"PROPERTY\"===tag||this.exportSpecifierList||this.importSpecifierList||(0<=indexOf.call(COFFEE_ALIASES,id)&&(alias=id,id=COFFEE_ALIAS_MAP[id],tokenData.original=alias),tag=function(){return\"!\"===id?\"UNARY\":\"==\"===id||\"!=\"===id?\"COMPARE\":\"true\"===id||\"false\"===id?\"BOOL\":\"break\"===id||\"continue\"===id||\"debugger\"===id?\"STATEMENT\":\"&&\"===id||\"||\"===id?id:tag}()),tagToken=this.token(tag,id,{length:idLength,data:tokenData}),alias&&(tagToken.origin=[tag,alias,tagToken[2]]),poppedToken){var _ref9=[poppedToken[2].first_line,poppedToken[2].first_column,poppedToken[2].range[0]];tagToken[2].first_line=_ref9[0],tagToken[2].first_column=_ref9[1],tagToken[2].range[0]=_ref9[2]}return colon&&(colonOffset=input.lastIndexOf(inJSXTag?\"=\":\":\"),colonToken=this.token(\":\",\":\",{offset:colonOffset}),inJSXTag&&(colonToken.jsxColon=!0)),inJSXTag&&\"IDENTIFIER\"===tag&&\":\"!==prev[0]&&this.token(\",\",\",\",{length:0,origin:tagToken,generated:!0}),input.length}},{key:\"numberToken\",value:function numberToken(){var lexedLength,match,number,parsedValue,tag,tokenData;if(!(match=NUMBER.exec(this.chunk)))return 0;switch(number=match[0],lexedLength=number.length,!1){case!/^0[BOX]/.test(number):this.error(\"radix prefix in '\".concat(number,\"' must be lowercase\"),{offset:1});break;case!/^0\\d*[89]/.test(number):this.error(\"decimal literal '\".concat(number,\"' must not be prefixed with '0'\"),{length:lexedLength});break;case!/^0\\d+/.test(number):this.error(\"octal literal '\".concat(number,\"' must be prefixed with '0o'\"),{length:lexedLength});}return parsedValue=parseNumber(number),tokenData={parsedValue:parsedValue},tag=2e308===parsedValue?\"INFINITY\":\"NUMBER\",\"INFINITY\"===tag&&(tokenData.original=number),this.token(tag,number,{length:lexedLength,data:tokenData}),lexedLength}},{key:\"stringToken\",value:function stringToken(){var _this5=this,_ref10=STRING_START.exec(this.chunk)||[],_ref11=_slicedToArray(_ref10,1),attempt,delimiter,doc,end,heredoc,i,indent,match,prev,quote,ref,regex,token,tokens;if(quote=_ref11[0],!quote)return 0;prev=this.prev(),prev&&\"from\"===this.value()&&(this.seenImport||this.seenExport)&&(prev[0]=\"FROM\"),regex=function(){return\"'\"===quote?STRING_SINGLE:\"\\\"\"===quote?STRING_DOUBLE:\"'''\"===quote?HEREDOC_SINGLE:\"\\\"\\\"\\\"\"===quote?HEREDOC_DOUBLE:void 0}();var _this$matchWithInterp=this.matchWithInterpolations(regex,quote);if(tokens=_this$matchWithInterp.tokens,end=_this$matchWithInterp.index,heredoc=3===quote.length,heredoc)for(indent=null,doc=function(){var j,len,results;for(results=[],i=j=0,len=tokens.length;j<len;i=++j)token=tokens[i],\"NEOSTRING\"===token[0]&&results.push(token[1]);return results}().join(\"#{}\");match=HEREDOC_INDENT.exec(doc);)attempt=match[1],(null===indent||0<(ref=attempt.length)&&ref<indent.length)&&(indent=attempt);return delimiter=quote.charAt(0),this.mergeInterpolationTokens(tokens,{quote:quote,indent:indent,endOffset:end},function(value){return _this5.validateUnicodeCodePointEscapes(value,{delimiter:quote})}),this.atJSXTag()&&this.token(\",\",\",\",{length:0,origin:this.prev,generated:!0}),end}},{key:\"commentToken\",value:function commentToken(){var chunk=0<arguments.length&&void 0!==arguments[0]?arguments[0]:this.chunk,_ref12=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},heregex=_ref12.heregex,_ref12$returnCommentT=_ref12.returnCommentTokens,_ref12$offsetInChunk=_ref12.offsetInChunk,offsetInChunk=void 0===_ref12$offsetInChunk?0:_ref12$offsetInChunk,commentAttachment,commentAttachments,commentWithSurroundingWhitespace,content,contents,getIndentSize,hasSeenFirstCommentLine,hereComment,hereLeadingWhitespace,hereTrailingWhitespace,i,indentSize,leadingNewline,leadingNewlineOffset,leadingNewlines,leadingWhitespace,length,lineComment,match,matchIllegal,noIndent,nonInitial,placeholderToken,precededByBlankLine,precedingNonCommentLines,prev;if(!(match=chunk.match(COMMENT)))return 0;var _match3=match,_match4=_slicedToArray(_match3,5);return commentWithSurroundingWhitespace=_match4[0],hereLeadingWhitespace=_match4[1],hereComment=_match4[2],hereTrailingWhitespace=_match4[3],lineComment=_match4[4],contents=null,leadingNewline=/^\\s*\\n+\\s*#/.test(commentWithSurroundingWhitespace),hereComment?(matchIllegal=HERECOMMENT_ILLEGAL.exec(hereComment),matchIllegal&&this.error(\"block comments cannot contain \".concat(matchIllegal[0]),{offset:\"###\".length+matchIllegal.index,length:matchIllegal[0].length}),chunk=chunk.replace(\"###\".concat(hereComment,\"###\"),\"\"),chunk=chunk.replace(/^\\n+/,\"\"),this.lineToken({chunk:chunk}),content=hereComment,contents=[{content:content,length:commentWithSurroundingWhitespace.length-hereLeadingWhitespace.length-hereTrailingWhitespace.length,leadingWhitespace:hereLeadingWhitespace}]):(leadingNewlines=\"\",content=lineComment.replace(/^(\\n*)/,function(leading){return leadingNewlines=leading,\"\"}),precedingNonCommentLines=\"\",hasSeenFirstCommentLine=!1,contents=content.split(\"\\n\").map(function(line){var comment,leadingWhitespace;return-1<line.indexOf(\"#\")?(leadingWhitespace=\"\",content=line.replace(/^([ |\\t]*)#/,function(_,whitespace){return leadingWhitespace=whitespace,\"\"}),comment={content:content,length:\"#\".length+content.length,leadingWhitespace:\"\".concat(hasSeenFirstCommentLine?\"\":leadingNewlines).concat(precedingNonCommentLines).concat(leadingWhitespace),precededByBlankLine:!!precedingNonCommentLines},hasSeenFirstCommentLine=!0,precedingNonCommentLines=\"\",comment):void(precedingNonCommentLines+=\"\\n\".concat(line))}).filter(function(comment){return comment})),getIndentSize=function(_ref13){var leadingWhitespace=_ref13.leadingWhitespace,nonInitial=_ref13.nonInitial,lastNewlineIndex;if(lastNewlineIndex=leadingWhitespace.lastIndexOf(\"\\n\"),null==hereComment&&nonInitial)null==lastNewlineIndex&&(lastNewlineIndex=-1);else if(!(-1<lastNewlineIndex))return null;return leadingWhitespace.length-1-lastNewlineIndex},commentAttachments=function(){var j,len,results;for(results=[],i=j=0,len=contents.length;j<len;i=++j){var _contents$i=contents[i];content=_contents$i.content,length=_contents$i.length,leadingWhitespace=_contents$i.leadingWhitespace,precededByBlankLine=_contents$i.precededByBlankLine,nonInitial=0!==i,leadingNewlineOffset=nonInitial?1:0,offsetInChunk+=leadingNewlineOffset+leadingWhitespace.length,indentSize=getIndentSize({leadingWhitespace:leadingWhitespace,nonInitial:nonInitial}),noIndent=null==indentSize||-1===indentSize,commentAttachment={content:content,here:null!=hereComment,newLine:leadingNewline||nonInitial,locationData:this.makeLocationData({offsetInChunk:offsetInChunk,length:length}),precededByBlankLine:precededByBlankLine,indentSize:indentSize,indented:!noIndent&&indentSize>this.indent,outdented:!noIndent&&indentSize<this.indent},heregex&&(commentAttachment.heregex=!0),offsetInChunk+=length,results.push(commentAttachment)}return results}.call(this),prev=this.prev(),prev?attachCommentsToNode(commentAttachments,prev):(commentAttachments[0].newLine=!0,this.lineToken({chunk:this.chunk.slice(commentWithSurroundingWhitespace.length),offset:commentWithSurroundingWhitespace.length}),placeholderToken=this.makeToken(\"JS\",\"\",{offset:commentWithSurroundingWhitespace.length,generated:!0}),placeholderToken.comments=commentAttachments,this.tokens.push(placeholderToken),this.newlineToken(commentWithSurroundingWhitespace.length)),void 0!==_ref12$returnCommentT&&_ref12$returnCommentT?commentAttachments:commentWithSurroundingWhitespace.length}},{key:\"jsToken\",value:function jsToken(){var length,match,matchedHere,script;return\"`\"===this.chunk.charAt(0)&&(match=(matchedHere=HERE_JSTOKEN.exec(this.chunk))||JSTOKEN.exec(this.chunk))?(script=match[1],length=match[0].length,this.token(\"JS\",script,{length:length,data:{here:!!matchedHere}}),length):0}},{key:\"regexToken\",value:function regexToken(){var _this6=this,body,closed,comment,commentIndex,commentOpts,commentTokens,comments,delimiter,end,flags,fullMatch,index,leadingWhitespace,match,matchedComment,origin,prev,ref,ref1,regex,tokens;switch(!1){case!(match=REGEX_ILLEGAL.exec(this.chunk)):this.error(\"regular expressions cannot begin with \".concat(match[2]),{offset:match.index+match[1].length});break;case!(match=this.matchWithInterpolations(HEREGEX,\"///\")):var _match5=match;for(tokens=_match5.tokens,index=_match5.index,comments=[];matchedComment=HEREGEX_COMMENT.exec(this.chunk.slice(0,index));){var _matchedComment=matchedComment;commentIndex=_matchedComment.index;var _matchedComment2=matchedComment,_matchedComment3=_slicedToArray(_matchedComment2,3);fullMatch=_matchedComment3[0],leadingWhitespace=_matchedComment3[1],comment=_matchedComment3[2],comments.push({comment:comment,offsetInChunk:commentIndex+leadingWhitespace.length})}commentTokens=flatten(function(){var j,len,results;for(results=[],j=0,len=comments.length;j<len;j++)commentOpts=comments[j],results.push(this.commentToken(commentOpts.comment,Object.assign(commentOpts,{heregex:!0,returnCommentTokens:!0})));return results}.call(this));break;case!(match=REGEX.exec(this.chunk)):var _match6=match,_match7=_slicedToArray(_match6,3);if(regex=_match7[0],body=_match7[1],closed=_match7[2],this.validateEscapes(body,{isRegex:!0,offsetInChunk:1}),index=regex.length,prev=this.prev(),prev)if(prev.spaced&&(ref=prev[0],0<=indexOf.call(CALLABLE,ref))){if(!closed||POSSIBLY_DIVISION.test(regex))return 0;}else if(ref1=prev[0],0<=indexOf.call(NOT_REGEX,ref1))return 0;closed||this.error(\"missing / (unclosed regex)\");break;default:return 0;}var _REGEX_FLAGS$exec=REGEX_FLAGS.exec(this.chunk.slice(index)),_REGEX_FLAGS$exec2=_slicedToArray(_REGEX_FLAGS$exec,1);switch(flags=_REGEX_FLAGS$exec2[0],end=index+flags.length,origin=this.makeToken(\"REGEX\",null,{length:end}),!1){case!!VALID_FLAGS.test(flags):this.error(\"invalid regular expression flags \".concat(flags),{offset:index,length:flags.length});break;case!(regex||1===tokens.length):delimiter=body?\"/\":\"///\",null==body&&(body=tokens[0][1]),this.validateUnicodeCodePointEscapes(body,{delimiter:delimiter}),this.token(\"REGEX\",\"/\".concat(body,\"/\").concat(flags),{length:end,origin:origin,data:{delimiter:delimiter}});break;default:this.token(\"REGEX_START\",\"(\",{length:0,origin:origin,generated:!0}),this.token(\"IDENTIFIER\",\"RegExp\",{length:0,generated:!0}),this.token(\"CALL_START\",\"(\",{length:0,generated:!0}),this.mergeInterpolationTokens(tokens,{double:!0,heregex:{flags:flags},endOffset:end-flags.length,quote:\"///\"},function(str){return _this6.validateUnicodeCodePointEscapes(str,{delimiter:delimiter})}),flags&&(this.token(\",\",\",\",{offset:index-1,length:0,generated:!0}),this.token(\"STRING\",\"\\\"\"+flags+\"\\\"\",{offset:index,length:flags.length})),this.token(\")\",\")\",{offset:end,length:0,generated:!0}),this.token(\"REGEX_END\",\")\",{offset:end,length:0,generated:!0});}return(null==commentTokens?void 0:commentTokens.length)&&addTokenData(this.tokens[this.tokens.length-1],{heregexCommentTokens:commentTokens}),end}},{key:\"lineToken\",value:function lineToken(){var _Mathmin=Math.min,_ref14=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},_ref14$chunk=_ref14.chunk,chunk=void 0===_ref14$chunk?this.chunk:_ref14$chunk,_ref14$offset=_ref14.offset,offset=void 0===_ref14$offset?0:_ref14$offset,backslash,diff,endsContinuationLineIndentation,indent,match,minLiteralLength,newIndentLiteral,noNewlines,prev,ref,size;if(!(match=MULTI_DENT.exec(chunk)))return 0;if(indent=match[0],prev=this.prev(),backslash=\"\\\\\"===(null==prev?void 0:prev[0]),(backslash||(null==(ref=this.seenFor)?void 0:ref.endsLength)<this.ends.length)&&this.seenFor||(this.seenFor=!1),backslash&&this.seenImport||this.importSpecifierList||(this.seenImport=!1),backslash&&this.seenExport||this.exportSpecifierList||(this.seenExport=!1),size=indent.length-1-indent.lastIndexOf(\"\\n\"),noNewlines=this.unfinished(),newIndentLiteral=0<size?indent.slice(-size):\"\",!/^(.?)\\1*$/.exec(newIndentLiteral))return this.error(\"mixed indentation\",{offset:indent.length}),indent.length;if(minLiteralLength=_Mathmin(newIndentLiteral.length,this.indentLiteral.length),newIndentLiteral.slice(0,minLiteralLength)!==this.indentLiteral.slice(0,minLiteralLength))return this.error(\"indentation mismatch\",{offset:indent.length}),indent.length;if(size-this.continuationLineAdditionalIndent===this.indent)return noNewlines?this.suppressNewlines():this.newlineToken(offset),indent.length;if(size>this.indent){if(noNewlines)return backslash||(this.continuationLineAdditionalIndent=size-this.indent),this.continuationLineAdditionalIndent&&(prev.continuationLineIndent=this.indent+this.continuationLineAdditionalIndent),this.suppressNewlines(),indent.length;if(!this.tokens.length)return this.baseIndent=this.indent=size,this.indentLiteral=newIndentLiteral,indent.length;diff=size-this.indent+this.outdebt,this.token(\"INDENT\",diff,{offset:offset+indent.length-size,length:size}),this.indents.push(diff),this.ends.push({tag:\"OUTDENT\"}),this.outdebt=this.continuationLineAdditionalIndent=0,this.indent=size,this.indentLiteral=newIndentLiteral}else size<this.baseIndent?this.error(\"missing indentation\",{offset:offset+indent.length}):(endsContinuationLineIndentation=0<this.continuationLineAdditionalIndent,this.continuationLineAdditionalIndent=0,this.outdentToken({moveOut:this.indent-size,noNewlines:noNewlines,outdentLength:indent.length,offset:offset,indentSize:size,endsContinuationLineIndentation:endsContinuationLineIndentation}));return indent.length}},{key:\"outdentToken\",value:function outdentToken(_ref15){var moveOut=_ref15.moveOut,noNewlines=_ref15.noNewlines,_ref15$outdentLength=_ref15.outdentLength,outdentLength=void 0===_ref15$outdentLength?0:_ref15$outdentLength,_ref15$offset=_ref15.offset,offset=void 0===_ref15$offset?0:_ref15$offset,indentSize=_ref15.indentSize,endsContinuationLineIndentation=_ref15.endsContinuationLineIndentation,decreasedIndent,dent,lastIndent,ref,terminatorToken;for(decreasedIndent=this.indent-moveOut;0<moveOut;)lastIndent=this.indents[this.indents.length-1],lastIndent?this.outdebt&&moveOut<=this.outdebt?(this.outdebt-=moveOut,moveOut=0):(dent=this.indents.pop()+this.outdebt,outdentLength&&(ref=this.chunk[outdentLength],0<=indexOf.call(INDENTABLE_CLOSERS,ref))&&(decreasedIndent-=dent-moveOut,moveOut=dent),this.outdebt=0,this.pair(\"OUTDENT\"),this.token(\"OUTDENT\",moveOut,{length:outdentLength,indentSize:indentSize+moveOut-dent}),moveOut-=dent):this.outdebt=moveOut=0;return dent&&(this.outdebt-=moveOut),this.suppressSemicolons(),\"TERMINATOR\"===this.tag()||noNewlines||(terminatorToken=this.token(\"TERMINATOR\",\"\\n\",{offset:offset+outdentLength,length:0}),endsContinuationLineIndentation&&(terminatorToken.endsContinuationLineIndentation={preContinuationLineIndent:this.indent})),this.indent=decreasedIndent,this.indentLiteral=this.indentLiteral.slice(0,decreasedIndent),this}},{key:\"whitespaceToken\",value:function whitespaceToken(){var match,nline,prev;return(match=WHITESPACE.exec(this.chunk))||(nline=\"\\n\"===this.chunk.charAt(0))?(prev=this.prev(),prev&&(prev[match?\"spaced\":\"newLine\"]=!0),match?match[0].length:0):0}},{key:\"newlineToken\",value:function newlineToken(offset){return this.suppressSemicolons(),\"TERMINATOR\"!==this.tag()&&this.token(\"TERMINATOR\",\"\\n\",{offset:offset,length:0}),this}},{key:\"suppressNewlines\",value:function suppressNewlines(){var prev;return prev=this.prev(),\"\\\\\"===prev[1]&&(prev.comments&&1<this.tokens.length&&attachCommentsToNode(prev.comments,this.tokens[this.tokens.length-2]),this.tokens.pop()),this}},{key:\"jsxToken\",value:function jsxToken(){var _this7=this,afterTag,end,endToken,firstChar,fullId,fullTagName,id,input,j,jsxTag,len,match,offset,openingTagToken,prev,prevChar,properties,property,ref,tagToken,token,tokens;if(firstChar=this.chunk[0],prevChar=0<this.tokens.length?this.tokens[this.tokens.length-1][0]:\"\",\"<\"===firstChar){if(match=JSX_IDENTIFIER.exec(this.chunk.slice(1))||JSX_FRAGMENT_IDENTIFIER.exec(this.chunk.slice(1)),!(match&&(0<this.jsxDepth||!(prev=this.prev())||prev.spaced||(ref=prev[0],0>indexOf.call(COMPARABLE_LEFT_SIDE,ref)))))return 0;var _match8=match,_match9=_slicedToArray(_match8,2);if(input=_match9[0],id=_match9[1],fullId=id,0<=indexOf.call(id,\".\")){var _id$split=id.split(\".\"),_id$split2=_toArray(_id$split);id=_id$split2[0],properties=_id$split2.slice(1)}else properties=[];for(tagToken=this.token(\"JSX_TAG\",id,{length:id.length+1,data:{openingBracketToken:this.makeToken(\"<\",\"<\"),tagNameToken:this.makeToken(\"IDENTIFIER\",id,{offset:1})}}),offset=id.length+1,(j=0,len=properties.length);j<len;j++)property=properties[j],this.token(\".\",\".\",{offset:offset}),offset+=1,this.token(\"PROPERTY\",property,{offset:offset}),offset+=property.length;return this.token(\"CALL_START\",\"(\",{generated:!0}),this.token(\"[\",\"[\",{generated:!0}),this.ends.push({tag:\"/>\",origin:tagToken,name:id,properties:properties}),this.jsxDepth++,fullId.length+1}if(jsxTag=this.atJSXTag()){if(\"/>\"===this.chunk.slice(0,2))return this.pair(\"/>\"),this.token(\"]\",\"]\",{length:2,generated:!0}),this.token(\"CALL_END\",\")\",{length:2,generated:!0,data:{selfClosingSlashToken:this.makeToken(\"/\",\"/\"),closingBracketToken:this.makeToken(\">\",\">\",{offset:1})}}),this.jsxDepth--,2;if(\"{\"===firstChar)return\":\"===prevChar?(token=this.token(\"(\",\"{\"),this.jsxObjAttribute[this.jsxDepth]=!1,addTokenData(this.tokens[this.tokens.length-3],{jsx:!0})):(token=this.token(\"{\",\"{\"),this.jsxObjAttribute[this.jsxDepth]=!0),this.ends.push({tag:\"}\",origin:token}),1;if(\">\"===firstChar){var _this$pair=this.pair(\"/>\");openingTagToken=_this$pair.origin,this.token(\"]\",\"]\",{generated:!0,data:{closingBracketToken:this.makeToken(\">\",\">\")}}),this.token(\",\",\"JSX_COMMA\",{generated:!0});var _this$matchWithInterp2=this.matchWithInterpolations(INSIDE_JSX,\">\",\"</\",JSX_INTERPOLATION);tokens=_this$matchWithInterp2.tokens,end=_this$matchWithInterp2.index,this.mergeInterpolationTokens(tokens,{endOffset:end,jsx:!0},function(value){return _this7.validateUnicodeCodePointEscapes(value,{delimiter:\">\"})}),match=JSX_IDENTIFIER.exec(this.chunk.slice(end))||JSX_FRAGMENT_IDENTIFIER.exec(this.chunk.slice(end)),match&&match[1]===\"\".concat(jsxTag.name).concat(function(){var k,len1,ref1,results;for(ref1=jsxTag.properties,results=[],(k=0,len1=ref1.length);k<len1;k++)property=ref1[k],results.push(\".\".concat(property));return results}().join(\"\"))||this.error(\"expected corresponding JSX closing tag for \".concat(jsxTag.name),jsxTag.origin.data.tagNameToken[2]);var _match10=match,_match11=_slicedToArray(_match10,2);return fullTagName=_match11[1],afterTag=end+fullTagName.length,\">\"!==this.chunk[afterTag]&&this.error(\"missing closing > after tag name\",{offset:afterTag,length:1}),endToken=this.token(\"CALL_END\",\")\",{offset:end-2,length:fullTagName.length+3,generated:!0,data:{closingTagOpeningBracketToken:this.makeToken(\"<\",\"<\",{offset:end-2}),closingTagSlashToken:this.makeToken(\"/\",\"/\",{offset:end-1}),closingTagNameToken:this.makeToken(\"IDENTIFIER\",fullTagName,{offset:end}),closingTagClosingBracketToken:this.makeToken(\">\",\">\",{offset:end+fullTagName.length})}}),addTokenData(openingTagToken,endToken.data),this.jsxDepth--,afterTag+1}return 0}return this.atJSXTag(1)?\"}\"===firstChar?(this.pair(firstChar),this.jsxObjAttribute[this.jsxDepth]?(this.token(\"}\",\"}\"),this.jsxObjAttribute[this.jsxDepth]=!1):this.token(\")\",\"}\"),this.token(\",\",\",\",{generated:!0}),1):0:0}},{key:\"atJSXTag\",value:function atJSXTag(){var depth=0<arguments.length&&void 0!==arguments[0]?arguments[0]:0,i,last,ref;if(0===this.jsxDepth)return!1;for(i=this.ends.length-1;\"OUTDENT\"===(null==(ref=this.ends[i])?void 0:ref.tag)||0<depth--;)i--;return last=this.ends[i],\"/>\"===(null==last?void 0:last.tag)&&last}},{key:\"literalToken\",value:function literalToken(){var match,message,origin,prev,ref,ref1,ref2,ref3,ref4,ref5,skipToken,tag,token,value;if(match=OPERATOR.exec(this.chunk)){var _match12=match,_match13=_slicedToArray(_match12,1);value=_match13[0],CODE.test(value)&&this.tagParameters()}else value=this.chunk.charAt(0);if(tag=value,prev=this.prev(),prev&&0<=indexOf.call([\"=\"].concat(_toConsumableArray(COMPOUND_ASSIGN)),value)&&(skipToken=!1,\"=\"!==value||\"||\"!==(ref=prev[1])&&\"&&\"!==ref||prev.spaced||(prev[0]=\"COMPOUND_ASSIGN\",prev[1]+=\"=\",(null==(ref1=prev.data)?void 0:ref1.original)&&(prev.data.original+=\"=\"),prev[2].range=[prev[2].range[0],prev[2].range[1]+1],prev[2].last_column+=1,prev[2].last_column_exclusive+=1,prev=this.tokens[this.tokens.length-2],skipToken=!0),prev&&\"PROPERTY\"!==prev[0]&&(origin=null==(ref2=prev.origin)?prev:ref2,message=isUnassignable(prev[1],origin[1]),message&&this.error(message,origin[2])),skipToken))return value.length;if(\"(\"===value&&\"IMPORT\"===(null==prev?void 0:prev[0])&&(prev[0]=\"DYNAMIC_IMPORT\"),\"{\"===value&&this.seenImport?this.importSpecifierList=!0:this.importSpecifierList&&\"}\"===value?this.importSpecifierList=!1:\"{\"===value&&\"EXPORT\"===(null==prev?void 0:prev[0])?this.exportSpecifierList=!0:this.exportSpecifierList&&\"}\"===value&&(this.exportSpecifierList=!1),\";\"===value)(ref3=null==prev?void 0:prev[0],0<=indexOf.call([\"=\"].concat(_toConsumableArray(UNFINISHED)),ref3))&&this.error(\"unexpected ;\"),this.seenFor=this.seenImport=this.seenExport=!1,tag=\"TERMINATOR\";else if(\"*\"===value&&\"EXPORT\"===(null==prev?void 0:prev[0]))tag=\"EXPORT_ALL\";else if(0<=indexOf.call(MATH,value))tag=\"MATH\";else if(0<=indexOf.call(COMPARE,value))tag=\"COMPARE\";else if(0<=indexOf.call(COMPOUND_ASSIGN,value))tag=\"COMPOUND_ASSIGN\";else if(0<=indexOf.call(UNARY,value))tag=\"UNARY\";else if(0<=indexOf.call(UNARY_MATH,value))tag=\"UNARY_MATH\";else if(0<=indexOf.call(SHIFT,value))tag=\"SHIFT\";else if(\"?\"===value&&(null==prev?void 0:prev.spaced))tag=\"BIN?\";else if(prev)if(\"(\"===value&&!prev.spaced&&(ref4=prev[0],0<=indexOf.call(CALLABLE,ref4)))\"?\"===prev[0]&&(prev[0]=\"FUNC_EXIST\"),tag=\"CALL_START\";else if(\"[\"===value&&((ref5=prev[0],0<=indexOf.call(INDEXABLE,ref5))&&!prev.spaced||\"::\"===prev[0]))switch(tag=\"INDEX_START\",prev[0]){case\"?\":prev[0]=\"INDEX_SOAK\";}return token=this.makeToken(tag,value),\"(\"===value||\"{\"===value||\"[\"===value?this.ends.push({tag:INVERSES[value],origin:token}):\")\"===value||\"}\"===value||\"]\"===value?this.pair(value):void 0,(this.tokens.push(this.makeToken(tag,value)),value.length)}},{key:\"tagParameters\",value:function tagParameters(){var i,paramEndToken,stack,tok,tokens;if(\")\"!==this.tag())return this.tagDoIife();for(stack=[],tokens=this.tokens,i=tokens.length,paramEndToken=tokens[--i],paramEndToken[0]=\"PARAM_END\";tok=tokens[--i];)switch(tok[0]){case\")\":stack.push(tok);break;case\"(\":case\"CALL_START\":if(stack.length)stack.pop();else return\"(\"===tok[0]?(tok[0]=\"PARAM_START\",this.tagDoIife(i-1)):(paramEndToken[0]=\"CALL_END\",this);}return this}},{key:\"tagDoIife\",value:function tagDoIife(tokenIndex){var tok;return(tok=this.tokens[null==tokenIndex?this.tokens.length-1:tokenIndex],\"DO\"!==(null==tok?void 0:tok[0]))?this:(tok[0]=\"DO_IIFE\",this)}},{key:\"closeIndentation\",value:function closeIndentation(){return this.outdentToken({moveOut:this.indent,indentSize:0})}},{key:\"matchWithInterpolations\",value:function matchWithInterpolations(regex,delimiter){var closingDelimiter=2<arguments.length&&void 0!==arguments[2]?arguments[2]:delimiter,interpolators=3<arguments.length&&void 0!==arguments[3]?arguments[3]:/^#\\{/,braceInterpolator,close,column,index,interpolationOffset,interpolator,line,match,nested,offset,offsetInChunk,open,ref,ref1,rest,str,strPart,tokens;if(tokens=[],offsetInChunk=delimiter.length,this.chunk.slice(0,offsetInChunk)!==delimiter)return null;for(str=this.chunk.slice(offsetInChunk);;){var _regex$exec=regex.exec(str),_regex$exec2=_slicedToArray(_regex$exec,1);if(strPart=_regex$exec2[0],this.validateEscapes(strPart,{isRegex:\"/\"===delimiter.charAt(0),offsetInChunk:offsetInChunk}),tokens.push(this.makeToken(\"NEOSTRING\",strPart,{offset:offsetInChunk})),str=str.slice(strPart.length),offsetInChunk+=strPart.length,!(match=interpolators.exec(str)))break;var _match14=match,_match15=_slicedToArray(_match14,1);interpolator=_match15[0],interpolationOffset=interpolator.length-1;var _this$getLineAndColum3=this.getLineAndColumnFromChunk(offsetInChunk+interpolationOffset),_this$getLineAndColum4=_slicedToArray(_this$getLineAndColum3,3);line=_this$getLineAndColum4[0],column=_this$getLineAndColum4[1],offset=_this$getLineAndColum4[2],rest=str.slice(interpolationOffset);var _Lexer$tokenize=new Lexer().tokenize(rest,{line:line,column:column,offset:offset,untilBalanced:!0,locationDataCompensations:this.locationDataCompensations});if(nested=_Lexer$tokenize.tokens,index=_Lexer$tokenize.index,index+=interpolationOffset,braceInterpolator=\"}\"===str[index-1],braceInterpolator){var _nested,_nested2,_slice$call,_slice$call2;_nested=nested,_nested2=_slicedToArray(_nested,1),open=_nested2[0],_nested,_slice$call=slice.call(nested,-1),_slice$call2=_slicedToArray(_slice$call,1),close=_slice$call2[0],_slice$call,open[0]=\"INTERPOLATION_START\",open[1]=\"(\",open[2].first_column-=interpolationOffset,open[2].range=[open[2].range[0]-interpolationOffset,open[2].range[1]],close[0]=\"INTERPOLATION_END\",close[1]=\")\",close.origin=[\"\",\"end of interpolation\",close[2]]}\"TERMINATOR\"===(null==(ref=nested[1])?void 0:ref[0])&&nested.splice(1,1),\"INDENT\"===(null==(ref1=nested[nested.length-3])?void 0:ref1[0])&&\"OUTDENT\"===nested[nested.length-2][0]&&nested.splice(-3,2),braceInterpolator||(open=this.makeToken(\"INTERPOLATION_START\",\"(\",{offset:offsetInChunk,length:0,generated:!0}),close=this.makeToken(\"INTERPOLATION_END\",\")\",{offset:offsetInChunk+index,length:0,generated:!0}),nested=[open].concat(_toConsumableArray(nested),[close])),tokens.push([\"TOKENS\",nested]),str=str.slice(index),offsetInChunk+=index}return str.slice(0,closingDelimiter.length)!==closingDelimiter&&this.error(\"missing \".concat(closingDelimiter),{length:delimiter.length}),{tokens:tokens,index:offsetInChunk+closingDelimiter.length}}},{key:\"mergeInterpolationTokens\",value:function mergeInterpolationTokens(tokens,options,fn){var $,converted,_double,endOffset,firstIndex,heregex,i,indent,j,jsx,k,lastToken,len,len1,locationToken,lparen,placeholderToken,quote,ref,ref1,rparen,tag,token,tokensToPush,val,value;for(quote=options.quote,indent=options.indent,_double=options.double,heregex=options.heregex,endOffset=options.endOffset,jsx=options.jsx,1<tokens.length&&(lparen=this.token(\"STRING_START\",\"(\",{length:null==(ref=null==quote?void 0:quote.length)?0:ref,data:{quote:quote},generated:null==quote||!quote.length})),firstIndex=this.tokens.length,$=tokens.length-1,(i=j=0,len=tokens.length);j<len;i=++j){var _this$tokens2;token=tokens[i];var _token4=token,_token5=_slicedToArray(_token4,2);switch(tag=_token5[0],value=_token5[1],tag){case\"TOKENS\":if(2===value.length&&(value[0].comments||value[1].comments)){for(placeholderToken=this.makeToken(\"JS\",\"\",{generated:!0}),placeholderToken[2]=value[0][2],(k=0,len1=value.length);k<len1;k++){var _placeholderToken$com;(val=value[k],!!val.comments)&&(null==placeholderToken.comments&&(placeholderToken.comments=[]),(_placeholderToken$com=placeholderToken.comments).push.apply(_placeholderToken$com,_toConsumableArray(val.comments)))}value.splice(1,0,placeholderToken)}locationToken=value[0],tokensToPush=value;break;case\"NEOSTRING\":converted=fn.call(this,token[1],i),0===i&&addTokenData(token,{initialChunk:!0}),i===$&&addTokenData(token,{finalChunk:!0}),addTokenData(token,{indent:indent,quote:quote,double:_double}),heregex&&addTokenData(token,{heregex:heregex}),jsx&&addTokenData(token,{jsx:jsx}),token[0]=\"STRING\",token[1]=\"\\\"\"+converted+\"\\\"\",1===tokens.length&&null!=quote&&(token[2].first_column-=quote.length,\"\\n\"===token[1].substr(-2,1)?(token[2].last_line+=1,token[2].last_column=quote.length-1):(token[2].last_column+=quote.length,2===token[1].length&&(token[2].last_column-=1)),token[2].last_column_exclusive+=quote.length,token[2].range=[token[2].range[0]-quote.length,token[2].range[1]+quote.length]),locationToken=token,tokensToPush=[token];}(_this$tokens2=this.tokens).push.apply(_this$tokens2,_toConsumableArray(tokensToPush))}if(lparen){var _slice$call3=slice.call(tokens,-1),_slice$call4=_slicedToArray(_slice$call3,1);return lastToken=_slice$call4[0],lparen.origin=[\"STRING\",null,{first_line:lparen[2].first_line,first_column:lparen[2].first_column,last_line:lastToken[2].last_line,last_column:lastToken[2].last_column,last_line_exclusive:lastToken[2].last_line_exclusive,last_column_exclusive:lastToken[2].last_column_exclusive,range:[lparen[2].range[0],lastToken[2].range[1]]}],(null==quote?void 0:quote.length)||(lparen[2]=lparen.origin[2]),rparen=this.token(\"STRING_END\",\")\",{offset:endOffset-(null==quote?\"\":quote).length,length:null==(ref1=null==quote?void 0:quote.length)?0:ref1,generated:null==quote||!quote.length})}}},{key:\"pair\",value:function pair(tag){var _slice$call5,_slice$call6,lastIndent,prev,ref,ref1,wanted;if(ref=this.ends,_slice$call5=slice.call(ref,-1),_slice$call6=_slicedToArray(_slice$call5,1),prev=_slice$call6[0],_slice$call5,tag!==(wanted=null==prev?void 0:prev.tag)){var _slice$call7,_slice$call8;return\"OUTDENT\"!==wanted&&this.error(\"unmatched \".concat(tag)),ref1=this.indents,_slice$call7=slice.call(ref1,-1),_slice$call8=_slicedToArray(_slice$call7,1),lastIndent=_slice$call8[0],_slice$call7,this.outdentToken({moveOut:lastIndent,noNewlines:!0}),this.pair(tag)}return this.ends.pop()}},{key:\"getLocationDataCompensation\",value:function getLocationDataCompensation(start,end){var compensation,current,initialEnd,totalCompensation;for(totalCompensation=0,initialEnd=end,current=start;current<=end&&(current!==end||start===initialEnd);)compensation=this.locationDataCompensations[current],null!=compensation&&(totalCompensation+=compensation,end+=compensation),current++;return totalCompensation}},{key:\"getLineAndColumnFromChunk\",value:function getLineAndColumnFromChunk(offset){var column,columnCompensation,compensation,lastLine,lineCount,previousLinesCompensation,ref,string;if(compensation=this.getLocationDataCompensation(this.chunkOffset,this.chunkOffset+offset),0===offset)return[this.chunkLine,this.chunkColumn+compensation,this.chunkOffset+compensation];if(string=offset>=this.chunk.length?this.chunk:this.chunk.slice(0,+(offset-1)+1||9e9),lineCount=count(string,\"\\n\"),column=this.chunkColumn,0<lineCount){var _slice$call9,_slice$call10;ref=string.split(\"\\n\"),_slice$call9=slice.call(ref,-1),_slice$call10=_slicedToArray(_slice$call9,1),lastLine=_slice$call10[0],_slice$call9,column=lastLine.length,previousLinesCompensation=this.getLocationDataCompensation(this.chunkOffset,this.chunkOffset+offset-column),0>previousLinesCompensation&&(previousLinesCompensation=0),columnCompensation=this.getLocationDataCompensation(this.chunkOffset+offset+previousLinesCompensation-column,this.chunkOffset+offset+previousLinesCompensation)}else column+=string.length,columnCompensation=compensation;return[this.chunkLine+lineCount,column+columnCompensation,this.chunkOffset+offset+compensation]}},{key:\"makeLocationData\",value:function makeLocationData(_ref16){var offsetInChunk=_ref16.offsetInChunk,length=_ref16.length,endOffset,lastCharacter,locationData;locationData={range:[]};var _this$getLineAndColum5=this.getLineAndColumnFromChunk(offsetInChunk),_this$getLineAndColum6=_slicedToArray(_this$getLineAndColum5,3);locationData.first_line=_this$getLineAndColum6[0],locationData.first_column=_this$getLineAndColum6[1],locationData.range[0]=_this$getLineAndColum6[2],lastCharacter=0<length?length-1:0;var _this$getLineAndColum7=this.getLineAndColumnFromChunk(offsetInChunk+lastCharacter),_this$getLineAndColum8=_slicedToArray(_this$getLineAndColum7,3);locationData.last_line=_this$getLineAndColum8[0],locationData.last_column=_this$getLineAndColum8[1],endOffset=_this$getLineAndColum8[2];var _this$getLineAndColum9=this.getLineAndColumnFromChunk(offsetInChunk+lastCharacter+(0<length?1:0)),_this$getLineAndColum10=_slicedToArray(_this$getLineAndColum9,2);return locationData.last_line_exclusive=_this$getLineAndColum10[0],locationData.last_column_exclusive=_this$getLineAndColum10[1],locationData.range[1]=0<length?endOffset+1:endOffset,locationData}},{key:\"makeToken\",value:function makeToken(tag,value){var _ref17=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_ref17$offset=_ref17.offset,offsetInChunk=void 0===_ref17$offset?0:_ref17$offset,_ref17$length=_ref17.length,length=void 0===_ref17$length?value.length:_ref17$length,origin=_ref17.origin,generated=_ref17.generated,indentSize=_ref17.indentSize,token;return token=[tag,value,this.makeLocationData({offsetInChunk:offsetInChunk,length:length})],origin&&(token.origin=origin),generated&&(token.generated=!0),null!=indentSize&&(token.indentSize=indentSize),token}},{key:\"token\",value:function(tag,value){var _ref18=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},offset=_ref18.offset,length=_ref18.length,origin=_ref18.origin,data=_ref18.data,generated=_ref18.generated,indentSize=_ref18.indentSize,token;return token=this.makeToken(tag,value,{offset:offset,length:length,origin:origin,generated:generated,indentSize:indentSize}),data&&addTokenData(token,data),this.tokens.push(token),token}},{key:\"tag\",value:function tag(){var _slice$call11,_slice$call12,ref,token;return ref=this.tokens,_slice$call11=slice.call(ref,-1),_slice$call12=_slicedToArray(_slice$call11,1),token=_slice$call12[0],_slice$call11,null==token?void 0:token[0]}},{key:\"value\",value:function value(){var useOrigin=!!(0<arguments.length&&void 0!==arguments[0])&&arguments[0],_slice$call13,_slice$call14,ref,token;return ref=this.tokens,_slice$call13=slice.call(ref,-1),_slice$call14=_slicedToArray(_slice$call13,1),token=_slice$call14[0],_slice$call13,useOrigin&&null!=(null==token?void 0:token.origin)?token.origin[1]:null==token?void 0:token[1]}},{key:\"prev\",value:function prev(){return this.tokens[this.tokens.length-1]}},{key:\"unfinished\",value:function unfinished(){var ref;return LINE_CONTINUER.test(this.chunk)||(ref=this.tag(),0<=indexOf.call(UNFINISHED,ref))}},{key:\"validateUnicodeCodePointEscapes\",value:function validateUnicodeCodePointEscapes(str,options){return replaceUnicodeCodePointEscapes(str,merge(options,{error:this.error}))}},{key:\"validateEscapes\",value:function validateEscapes(str){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},before,hex,invalidEscape,invalidEscapeRegex,match,message,octal,ref,unicode,unicodeCodePoint;if(invalidEscapeRegex=options.isRegex?REGEX_INVALID_ESCAPE:STRING_INVALID_ESCAPE,match=invalidEscapeRegex.exec(str),!!match)return match[0],before=match[1],octal=match[2],hex=match[3],unicodeCodePoint=match[4],unicode=match[5],message=octal?\"octal escape sequences are not allowed\":\"invalid escape sequence\",invalidEscape=\"\\\\\".concat(octal||hex||unicodeCodePoint||unicode),this.error(\"\".concat(message,\" \").concat(invalidEscape),{offset:(null==(ref=options.offsetInChunk)?0:ref)+match.index+before.length,length:invalidEscape.length})}},{key:\"suppressSemicolons\",value:function suppressSemicolons(){var ref,ref1,results;for(results=[];\";\"===this.value();)this.tokens.pop(),(ref=null==(ref1=this.prev())?void 0:ref1[0],0<=indexOf.call([\"=\"].concat(_toConsumableArray(UNFINISHED)),ref))?results.push(this.error(\"unexpected ;\")):results.push(void 0);return results}},{key:\"error\",value:function error(message){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_this$getLineAndColum11,_this$getLineAndColum12,first_column,first_line,location,ref,ref1;return location=\"first_line\"in options?options:(_this$getLineAndColum11=this.getLineAndColumnFromChunk(null==(ref=options.offset)?0:ref),_this$getLineAndColum12=_slicedToArray(_this$getLineAndColum11,2),first_line=_this$getLineAndColum12[0],first_column=_this$getLineAndColum12[1],_this$getLineAndColum11,{first_line:first_line,first_column:first_column,last_column:first_column+(null==(ref1=options.length)?1:ref1)-1}),throwSyntaxError(message,location)}}]),Lexer}(),isUnassignable=function(name){var displayName=1<arguments.length&&void 0!==arguments[1]?arguments[1]:name;switch(!1){case 0>indexOf.call([].concat(_toConsumableArray(JS_KEYWORDS),_toConsumableArray(COFFEE_KEYWORDS)),name):return\"keyword '\".concat(displayName,\"' can't be assigned\");case 0>indexOf.call(STRICT_PROSCRIBED,name):return\"'\".concat(displayName,\"' can't be assigned\");case 0>indexOf.call(RESERVED,name):return\"reserved word '\".concat(displayName,\"' can't be assigned\");default:return!1;}},exports.isUnassignable=isUnassignable,isForFrom=function(prev){var ref;return\"IDENTIFIER\"===prev[0]||\"FOR\"!==prev[0]&&\"{\"!==(ref=prev[1])&&\"[\"!==ref&&\",\"!==ref&&\":\"!==ref},addTokenData=function(token,data){return Object.assign(null==token.data?token.data={}:token.data,data)},JS_KEYWORDS=[\"true\",\"false\",\"null\",\"this\",\"new\",\"delete\",\"typeof\",\"in\",\"instanceof\",\"return\",\"throw\",\"break\",\"continue\",\"debugger\",\"yield\",\"await\",\"if\",\"else\",\"switch\",\"for\",\"while\",\"do\",\"try\",\"catch\",\"finally\",\"class\",\"extends\",\"super\",\"import\",\"export\",\"default\"],COFFEE_KEYWORDS=[\"undefined\",\"Infinity\",\"NaN\",\"then\",\"unless\",\"until\",\"loop\",\"of\",\"by\",\"when\"],COFFEE_ALIAS_MAP={and:\"&&\",or:\"||\",is:\"==\",isnt:\"!=\",not:\"!\",yes:\"true\",no:\"false\",on:\"true\",off:\"false\"},COFFEE_ALIASES=function(){var results;for(key in results=[],COFFEE_ALIAS_MAP)results.push(key);return results}(),COFFEE_KEYWORDS=COFFEE_KEYWORDS.concat(COFFEE_ALIASES),RESERVED=[\"case\",\"function\",\"var\",\"void\",\"with\",\"const\",\"let\",\"enum\",\"native\",\"implements\",\"interface\",\"package\",\"private\",\"protected\",\"public\",\"static\"],STRICT_PROSCRIBED=[\"arguments\",\"eval\"],exports.JS_FORBIDDEN=JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED),BOM=65279,IDENTIFIER=/^(?!\\d)((?:(?!\\s)[$\\w\\x7f-\\uffff])+)([^\\n\\S]*:(?!:))?/,JSX_IDENTIFIER_PART=/(?:(?!\\s)[\\-$\\w\\x7f-\\uffff])+/.source,JSX_IDENTIFIER=RegExp(\"^(?![\\\\d<])(\".concat(JSX_IDENTIFIER_PART,\"(?:\\\\s*:\\\\s*\").concat(JSX_IDENTIFIER_PART,\"|(?:\\\\s*\\\\.\\\\s*\").concat(JSX_IDENTIFIER_PART,\")+)?)\")),JSX_FRAGMENT_IDENTIFIER=/^()>/,JSX_ATTRIBUTE=RegExp(\"^(?!\\\\d)(\".concat(JSX_IDENTIFIER_PART,\"(?:\\\\s*:\\\\s*\").concat(JSX_IDENTIFIER_PART,\")?)([^\\\\S]*=(?!=))?\")),NUMBER=/^0b[01](?:_?[01])*n?|^0o[0-7](?:_?[0-7])*n?|^0x[\\da-f](?:_?[\\da-f])*n?|^\\d+(?:_\\d+)*n|^(?:\\d+(?:_\\d+)*)?\\.?\\d+(?:_\\d+)*(?:e[+-]?\\d+(?:_\\d+)*)?/i,OPERATOR=/^(?:[-=]>|[-+*\\/%<>&|^!?=]=|>>>=?|([-+:])\\1|([&|<>*\\/%])\\2=?|\\?(\\.|::)|\\.{2,3})/,WHITESPACE=/^[^\\n\\S]+/,COMMENT=/^(\\s*)###([^#][\\s\\S]*?)(?:###([^\\n\\S]*)|###$)|^((?:\\s*#(?!##[^#]).*)+)/,CODE=/^[-=]>/,MULTI_DENT=/^(?:\\n[^\\n\\S]*)+/,JSTOKEN=/^`(?!``)((?:[^`\\\\]|\\\\[\\s\\S])*)`/,HERE_JSTOKEN=/^```((?:[^`\\\\]|\\\\[\\s\\S]|`(?!``))*)```/,STRING_START=/^(?:'''|\"\"\"|'|\")/,STRING_SINGLE=/^(?:[^\\\\']|\\\\[\\s\\S])*/,STRING_DOUBLE=/^(?:[^\\\\\"#]|\\\\[\\s\\S]|\\#(?!\\{))*/,HEREDOC_SINGLE=/^(?:[^\\\\']|\\\\[\\s\\S]|'(?!''))*/,HEREDOC_DOUBLE=/^(?:[^\\\\\"#]|\\\\[\\s\\S]|\"(?!\"\")|\\#(?!\\{))*/,INSIDE_JSX=/^(?:[^\\{<])*/,JSX_INTERPOLATION=/^(?:\\{|<(?!\\/))/,HEREDOC_INDENT=/\\n+([^\\n\\S]*)(?=\\S)/g,REGEX=/^\\/(?!\\/)((?:[^[\\/\\n\\\\]|\\\\[^\\n]|\\[(?:\\\\[^\\n]|[^\\]\\n\\\\])*\\])*)(\\/)?/,REGEX_FLAGS=/^\\w*/,VALID_FLAGS=/^(?!.*(.).*\\1)[gimsuy]*$/,HEREGEX=/^(?:[^\\\\\\/#\\s]|\\\\[\\s\\S]|\\/(?!\\/\\/)|\\#(?!\\{)|\\s+(?:#(?!\\{).*)?)*/,HEREGEX_COMMENT=/(\\s+)(#(?!{).*)/gm,REGEX_ILLEGAL=/^(\\/|\\/{3}\\s*)(\\*)/,POSSIBLY_DIVISION=/^\\/=?\\s/,HERECOMMENT_ILLEGAL=/\\*\\//,LINE_CONTINUER=/^\\s*(?:,|\\??\\.(?![.\\d])|\\??::)/,STRING_INVALID_ESCAPE=/((?:^|[^\\\\])(?:\\\\\\\\)*)\\\\(?:(0\\d|[1-7])|(x(?![\\da-fA-F]{2}).{0,2})|(u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?)|(u(?!\\{|[\\da-fA-F]{4}).{0,4}))/,REGEX_INVALID_ESCAPE=/((?:^|[^\\\\])(?:\\\\\\\\)*)\\\\(?:(0\\d)|(x(?![\\da-fA-F]{2}).{0,2})|(u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?)|(u(?!\\{|[\\da-fA-F]{4}).{0,4}))/,TRAILING_SPACES=/\\s+$/,COMPOUND_ASSIGN=[\"-=\",\"+=\",\"/=\",\"*=\",\"%=\",\"||=\",\"&&=\",\"?=\",\"<<=\",\">>=\",\">>>=\",\"&=\",\"^=\",\"|=\",\"**=\",\"//=\",\"%%=\"],UNARY=[\"NEW\",\"TYPEOF\",\"DELETE\"],UNARY_MATH=[\"!\",\"~\"],SHIFT=[\"<<\",\">>\",\">>>\"],COMPARE=[\"==\",\"!=\",\"<\",\">\",\"<=\",\">=\"],MATH=[\"*\",\"/\",\"%\",\"//\",\"%%\"],RELATION=[\"IN\",\"OF\",\"INSTANCEOF\"],BOOL=[\"TRUE\",\"FALSE\"],CALLABLE=[\"IDENTIFIER\",\"PROPERTY\",\")\",\"]\",\"?\",\"@\",\"THIS\",\"SUPER\",\"DYNAMIC_IMPORT\"],INDEXABLE=CALLABLE.concat([\"NUMBER\",\"INFINITY\",\"NAN\",\"STRING\",\"STRING_END\",\"REGEX\",\"REGEX_END\",\"BOOL\",\"NULL\",\"UNDEFINED\",\"}\",\"::\"]),COMPARABLE_LEFT_SIDE=[\"IDENTIFIER\",\")\",\"]\",\"NUMBER\"],NOT_REGEX=INDEXABLE.concat([\"++\",\"--\"]),LINE_BREAK=[\"INDENT\",\"OUTDENT\",\"TERMINATOR\"],INDENTABLE_CLOSERS=[\")\",\"}\",\"]\"]}.call(this),{exports:exports}.exports}(),require[\"./parser\"]=function(){var exports={},module={exports:exports},parser=function(){function Parser(){this.yy={}}var o=function(k,v,_o,l){for(_o=_o||{},l=k.length;l--;_o[k[l]]=v);return _o},$V0=[1,24],$V1=[1,59],$V2=[1,98],$V3=[1,99],$V4=[1,94],$V5=[1,100],$V6=[1,101],$V7=[1,96],$V8=[1,97],$V9=[1,68],$Va=[1,70],$Vb=[1,71],$Vc=[1,72],$Vd=[1,73],$Ve=[1,74],$Vf=[1,76],$Vg=[1,80],$Vh=[1,77],$Vi=[1,78],$Vj=[1,62],$Vk=[1,45],$Vl=[1,38],$Vm=[1,83],$Vn=[1,84],$Vo=[1,81],$Vp=[1,82],$Vq=[1,93],$Vr=[1,57],$Vs=[1,63],$Vt=[1,64],$Vu=[1,79],$Vv=[1,50],$Vw=[1,58],$Vx=[1,75],$Vy=[1,88],$Vz=[1,89],$VA=[1,90],$VB=[1,91],$VC=[1,56],$VD=[1,87],$VE=[1,40],$VF=[1,41],$VG=[1,61],$VH=[1,42],$VI=[1,43],$VJ=[1,44],$VK=[1,46],$VL=[1,47],$VM=[1,102],$VN=[1,6,35,52,155],$VO=[1,6,33,35,52,74,76,96,137,144,155,158,166],$VP=[1,120],$VQ=[1,121],$VR=[1,122],$VS=[1,117],$VT=[1,105],$VU=[1,104],$VV=[1,103],$VW=[1,106],$VX=[1,107],$VY=[1,108],$VZ=[1,109],$V_=[1,110],$V$=[1,111],$V01=[1,112],$V11=[1,113],$V21=[1,114],$V31=[1,115],$V41=[1,116],$V51=[1,124],$V61=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V71=[2,222],$V81=[1,130],$V91=[1,135],$Va1=[1,131],$Vb1=[1,132],$Vc1=[1,133],$Vd1=[1,136],$Ve1=[1,129],$Vf1=[1,6,33,35,52,74,76,96,137,144,155,157,158,159,165,166,183],$Vg1=[1,6,33,35,46,47,52,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vh1=[2,129],$Vi1=[2,133],$Vj1=[6,33,91,96],$Vk1=[2,106],$Vl1=[1,148],$Vm1=[1,147],$Vn1=[1,142],$Vo1=[1,151],$Vp1=[1,156],$Vq1=[1,154],$Vr1=[1,160],$Vs1=[1,166],$Vt1=[1,162],$Vu1=[1,163],$Vv1=[1,165],$Vw1=[1,170],$Vx1=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vy1=[2,126],$Vz1=[1,6,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VA1=[2,31],$VB1=[1,195],$VC1=[1,196],$VD1=[2,93],$VE1=[1,202],$VF1=[1,208],$VG1=[1,223],$VH1=[1,218],$VI1=[1,227],$VJ1=[1,224],$VK1=[1,229],$VL1=[1,230],$VM1=[1,232],$VN1=[2,227],$VO1=[1,234],$VP1=[14,32,33,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VQ1=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,121,135,136,137,144,155,157,158,159,165,166,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$VR1=[1,247],$VS1=[1,248],$VT1=[2,156],$VU1=[1,264],$VV1=[1,265],$VW1=[1,267],$VX1=[1,277],$VY1=[1,278],$VZ1=[1,6,33,35,46,47,52,70,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V_1=[1,6,33,35,36,46,47,52,66,70,74,76,91,96,105,106,107,110,111,112,115,119,121,128,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$V$1=[1,6,33,35,46,47,49,51,52,57,70,74,76,91,96,105,106,107,110,111,112,115,119,123,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V02=[1,283],$V12=[46,47,136],$V22=[1,322],$V32=[1,321],$V42=[6,33],$V52=[2,104],$V62=[1,328],$V72=[6,33,35,91,96],$V82=[6,33,35,66,76,91,96],$V92=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,194,195,196,197,198,199,200,201,202,203,204],$Va2=[2,377],$Vb2=[2,378],$Vc2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,194,196,197,198,199,200,201,202,203,204],$Vd2=[46,47,105,106,110,111,112,115,135,136],$Ve2=[1,357],$Vf2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183],$Vg2=[2,91],$Vh2=[1,375],$Vi2=[1,377],$Vj2=[1,382],$Vk2=[1,384],$Vl2=[6,33,74,96],$Vm2=[2,247],$Vn2=[2,248],$Vo2=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vp2=[1,398],$Vq2=[14,32,33,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,74,75,76,82,85,87,88,89,93,94,96,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$Vr2=[1,400],$Vs2=[6,33,35,74,96],$Vt2=[6,14,32,33,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,74,75,76,82,85,87,88,89,93,94,96,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$Vu2=[6,33,35,74,96,137],$Vv2=[1,6,33,35,46,47,52,57,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vw2=[1,411],$Vx2=[1,6,33,35,46,47,52,66,70,74,76,91,96,105,106,107,110,111,112,115,119,121,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$Vy2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,166,183],$Vz2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,158,166,183],$VA2=[2,300],$VB2=[173,174,175],$VC2=[96,173,174,175],$VD2=[6,33,119],$VE2=[1,431],$VF2=[6,33,35,96,119],$VG2=[6,33,35,70,96,119],$VH2=[6,33,35,66,70,76,96,105,106,110,111,112,115,119,135,136],$VI2=[6,33,35,76,96,105,106,110,111,112,115,119,135,136],$VJ2=[46,47,49,51],$VK2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,196,197,198,199,200,201,202,203,204],$VL2=[2,367],$VM2=[2,366],$VN2=[35,107],$VO2=[14,32,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,107,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VP2=[2,233],$VQ2=[6,33,35],$VR2=[2,105],$VS2=[1,470],$VT2=[1,471],$VU2=[1,6,33,35,46,47,52,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,151,152,155,157,158,159,165,166,178,180,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VV2=[1,337],$VW2=[35,178,180],$VX2=[1,6,35,52,74,76,91,96,107,119,137,144,155,158,166,183],$VY2=[1,509],$VZ2=[1,516],$V_2=[1,6,33,35,52,74,76,96,137,144,155,158,166,183],$V$2=[2,120],$V03=[1,529],$V13=[33,35,74],$V23=[1,537],$V33=[6,33,35,96,137],$V43=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,178,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V53=[1,6,33,35,52,74,76,96,137,144,155,158,166,178],$V63=[2,314],$V73=[2,315],$V83=[2,330],$V93=[1,557],$Va3=[1,558],$Vb3=[6,33,35,119],$Vc3=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,159,165,166,183],$Vd3=[6,33,35,96],$Ve3=[1,6,33,35,52,74,76,91,96,107,119,137,144,151,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vf3=[33,96],$Vg3=[1,611],$Vh3=[1,612],$Vi3=[1,619],$Vj3=[1,620],$Vk3=[1,638],$Vl3=[1,639],$Vm3=[2,285],$Vn3=[2,288],$Vo3=[2,301],$Vp3=[2,316],$Vq3=[2,320],$Vr3=[2,317],$Vs3=[2,321],$Vt3=[2,318],$Vu3=[2,319],$Vv3=[2,331],$Vw3=[2,332],$Vx3=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,183],$Vy3=[2,322],$Vz3=[2,324],$VA3=[2,326],$VB3=[2,328],$VC3=[2,323],$VD3=[2,325],$VE3=[2,327],$VF3=[2,329],parser={trace:function(){},yy:{},symbols_:{error:2,Root:3,Body:4,Line:5,TERMINATOR:6,Expression:7,ExpressionLine:8,Statement:9,FuncDirective:10,YieldReturn:11,AwaitReturn:12,Return:13,STATEMENT:14,Import:15,Export:16,Value:17,Code:18,Operation:19,Assign:20,If:21,Try:22,While:23,For:24,Switch:25,Class:26,Throw:27,Yield:28,CodeLine:29,IfLine:30,OperationLine:31,YIELD:32,INDENT:33,Object:34,OUTDENT:35,FROM:36,Block:37,Identifier:38,IDENTIFIER:39,JSX_TAG:40,Property:41,PROPERTY:42,AlphaNumeric:43,NUMBER:44,String:45,STRING:46,STRING_START:47,Interpolations:48,STRING_END:49,InterpolationChunk:50,INTERPOLATION_START:51,INTERPOLATION_END:52,Regex:53,REGEX:54,REGEX_START:55,Invocation:56,REGEX_END:57,Literal:58,JS:59,UNDEFINED:60,NULL:61,BOOL:62,INFINITY:63,NAN:64,Assignable:65,\"=\":66,AssignObj:67,ObjAssignable:68,ObjRestValue:69,\":\":70,SimpleObjAssignable:71,ThisProperty:72,\"[\":73,\"]\":74,\"@\":75,\"...\":76,ObjSpreadExpr:77,ObjSpreadIdentifier:78,Parenthetical:79,Super:80,This:81,SUPER:82,OptFuncExist:83,Arguments:84,DYNAMIC_IMPORT:85,Accessor:86,RETURN:87,AWAIT:88,PARAM_START:89,ParamList:90,PARAM_END:91,FuncGlyph:92,\"->\":93,\"=>\":94,OptComma:95,\",\":96,Param:97,ParamVar:98,Array:99,Splat:100,SimpleAssignable:101,Range:102,DoIife:103,MetaProperty:104,\".\":105,INDEX_START:106,INDEX_END:107,NEW_TARGET:108,IMPORT_META:109,\"?.\":110,\"::\":111,\"?::\":112,Index:113,IndexValue:114,INDEX_SOAK:115,Slice:116,\"{\":117,AssignList:118,\"}\":119,CLASS:120,EXTENDS:121,IMPORT:122,ASSERT:123,ImportDefaultSpecifier:124,ImportNamespaceSpecifier:125,ImportSpecifierList:126,ImportSpecifier:127,AS:128,DEFAULT:129,IMPORT_ALL:130,EXPORT:131,ExportSpecifierList:132,EXPORT_ALL:133,ExportSpecifier:134,FUNC_EXIST:135,CALL_START:136,CALL_END:137,ArgList:138,THIS:139,Elisions:140,ArgElisionList:141,OptElisions:142,RangeDots:143,\"..\":144,Arg:145,ArgElision:146,Elision:147,SimpleArgs:148,TRY:149,Catch:150,FINALLY:151,CATCH:152,THROW:153,\"(\":154,\")\":155,WhileLineSource:156,WHILE:157,WHEN:158,UNTIL:159,WhileSource:160,Loop:161,LOOP:162,ForBody:163,ForLineBody:164,FOR:165,BY:166,ForStart:167,ForSource:168,ForLineSource:169,ForVariables:170,OWN:171,ForValue:172,FORIN:173,FOROF:174,FORFROM:175,SWITCH:176,Whens:177,ELSE:178,When:179,LEADING_WHEN:180,IfBlock:181,IF:182,POST_IF:183,IfBlockLine:184,UNARY:185,DO:186,DO_IIFE:187,UNARY_MATH:188,\"-\":189,\"+\":190,\"--\":191,\"++\":192,\"?\":193,MATH:194,\"**\":195,SHIFT:196,COMPARE:197,\"&\":198,\"^\":199,\"|\":200,\"&&\":201,\"||\":202,\"BIN?\":203,RELATION:204,COMPOUND_ASSIGN:205,$accept:0,$end:1},terminals_:{2:\"error\",6:\"TERMINATOR\",14:\"STATEMENT\",32:\"YIELD\",33:\"INDENT\",35:\"OUTDENT\",36:\"FROM\",39:\"IDENTIFIER\",40:\"JSX_TAG\",42:\"PROPERTY\",44:\"NUMBER\",46:\"STRING\",47:\"STRING_START\",49:\"STRING_END\",51:\"INTERPOLATION_START\",52:\"INTERPOLATION_END\",54:\"REGEX\",55:\"REGEX_START\",57:\"REGEX_END\",59:\"JS\",60:\"UNDEFINED\",61:\"NULL\",62:\"BOOL\",63:\"INFINITY\",64:\"NAN\",66:\"=\",70:\":\",73:\"[\",74:\"]\",75:\"@\",76:\"...\",82:\"SUPER\",85:\"DYNAMIC_IMPORT\",87:\"RETURN\",88:\"AWAIT\",89:\"PARAM_START\",91:\"PARAM_END\",93:\"->\",94:\"=>\",96:\",\",105:\".\",106:\"INDEX_START\",107:\"INDEX_END\",108:\"NEW_TARGET\",109:\"IMPORT_META\",110:\"?.\",111:\"::\",112:\"?::\",115:\"INDEX_SOAK\",117:\"{\",119:\"}\",120:\"CLASS\",121:\"EXTENDS\",122:\"IMPORT\",123:\"ASSERT\",128:\"AS\",129:\"DEFAULT\",130:\"IMPORT_ALL\",131:\"EXPORT\",133:\"EXPORT_ALL\",135:\"FUNC_EXIST\",136:\"CALL_START\",137:\"CALL_END\",139:\"THIS\",144:\"..\",149:\"TRY\",151:\"FINALLY\",152:\"CATCH\",153:\"THROW\",154:\"(\",155:\")\",157:\"WHILE\",158:\"WHEN\",159:\"UNTIL\",162:\"LOOP\",165:\"FOR\",166:\"BY\",171:\"OWN\",173:\"FORIN\",174:\"FOROF\",175:\"FORFROM\",176:\"SWITCH\",178:\"ELSE\",180:\"LEADING_WHEN\",182:\"IF\",183:\"POST_IF\",185:\"UNARY\",186:\"DO\",187:\"DO_IIFE\",188:\"UNARY_MATH\",189:\"-\",190:\"+\",191:\"--\",192:\"++\",193:\"?\",194:\"MATH\",195:\"**\",196:\"SHIFT\",197:\"COMPARE\",198:\"&\",199:\"^\",200:\"|\",201:\"&&\",202:\"||\",203:\"BIN?\",204:\"RELATION\",205:\"COMPOUND_ASSIGN\"},productions_:[0,[3,0],[3,1],[4,1],[4,3],[4,2],[5,1],[5,1],[5,1],[5,1],[10,1],[10,1],[9,1],[9,1],[9,1],[9,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[8,1],[8,1],[8,1],[28,1],[28,2],[28,4],[28,3],[37,2],[37,3],[38,1],[38,1],[41,1],[43,1],[43,1],[45,1],[45,3],[48,1],[48,2],[50,3],[50,5],[50,2],[50,1],[53,1],[53,3],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[20,3],[20,4],[20,5],[67,1],[67,1],[67,3],[67,5],[67,3],[67,5],[71,1],[71,1],[71,1],[68,1],[68,3],[68,4],[68,1],[69,2],[69,2],[69,2],[69,2],[77,1],[77,1],[77,1],[77,1],[77,1],[77,3],[77,2],[77,3],[77,3],[78,2],[78,2],[13,2],[13,4],[13,1],[11,3],[11,2],[12,3],[12,2],[18,5],[18,2],[29,5],[29,2],[92,1],[92,1],[95,0],[95,1],[90,0],[90,1],[90,3],[90,4],[90,6],[97,1],[97,2],[97,2],[97,3],[97,1],[98,1],[98,1],[98,1],[98,1],[100,2],[100,2],[101,1],[101,2],[101,2],[101,1],[65,1],[65,1],[65,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[80,3],[80,4],[80,6],[104,3],[104,3],[86,2],[86,2],[86,2],[86,2],[86,1],[86,1],[86,1],[113,3],[113,5],[113,2],[114,1],[114,1],[34,4],[118,0],[118,1],[118,3],[118,4],[118,6],[26,1],[26,2],[26,3],[26,4],[26,2],[26,3],[26,4],[26,5],[15,2],[15,4],[15,4],[15,6],[15,4],[15,6],[15,5],[15,7],[15,7],[15,9],[15,6],[15,8],[15,9],[15,11],[126,1],[126,3],[126,4],[126,4],[126,6],[127,1],[127,3],[127,1],[127,3],[124,1],[125,3],[16,3],[16,5],[16,2],[16,4],[16,5],[16,6],[16,3],[16,5],[16,4],[16,6],[16,5],[16,7],[16,7],[16,9],[132,1],[132,3],[132,4],[132,4],[132,6],[134,1],[134,3],[134,3],[134,1],[134,3],[56,3],[56,3],[56,3],[56,2],[83,0],[83,1],[84,2],[84,4],[81,1],[81,1],[72,2],[99,2],[99,3],[99,4],[143,1],[143,1],[102,5],[102,5],[116,3],[116,2],[116,3],[116,2],[116,2],[116,1],[138,1],[138,3],[138,4],[138,4],[138,6],[145,1],[145,1],[145,1],[145,1],[141,1],[141,3],[141,4],[141,4],[141,6],[146,1],[146,2],[142,1],[142,2],[140,1],[140,2],[147,1],[147,2],[148,1],[148,1],[148,3],[148,3],[22,2],[22,3],[22,4],[22,5],[150,3],[150,3],[150,2],[27,2],[27,4],[79,3],[79,5],[156,2],[156,4],[156,2],[156,4],[160,2],[160,4],[160,4],[160,2],[160,4],[160,4],[23,2],[23,2],[23,2],[23,2],[23,1],[161,2],[161,2],[24,2],[24,2],[24,2],[24,2],[163,2],[163,4],[163,2],[164,4],[164,2],[167,2],[167,3],[167,3],[172,1],[172,1],[172,1],[172,1],[170,1],[170,3],[168,2],[168,2],[168,4],[168,4],[168,4],[168,4],[168,4],[168,4],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,2],[168,4],[168,4],[169,2],[169,2],[169,4],[169,4],[169,4],[169,4],[169,4],[169,4],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,2],[169,4],[169,4],[25,5],[25,5],[25,7],[25,7],[25,4],[25,6],[177,1],[177,2],[179,3],[179,4],[181,3],[181,5],[21,1],[21,3],[21,3],[21,3],[184,3],[184,5],[30,1],[30,3],[30,3],[30,3],[31,2],[31,2],[31,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,4],[19,2],[19,2],[19,2],[19,2],[19,2],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,5],[19,4],[103,2]],performAction:function(yytext,yyleng,yylineno,yy,yystate,$$,_$){var $0=$$.length-1;switch(yystate){case 1:return this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Root(new yy.Block()));break;case 2:return this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Root($$[$0]));break;case 3:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(yy.Block.wrap([$$[$0]]));break;case 4:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-2].push($$[$0]));break;case 5:this.$=$$[$0-1];break;case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 41:case 52:case 54:case 64:case 69:case 70:case 71:case 72:case 75:case 80:case 81:case 82:case 83:case 84:case 104:case 105:case 116:case 117:case 118:case 119:case 125:case 126:case 129:case 135:case 149:case 247:case 248:case 249:case 251:case 264:case 265:case 308:case 309:case 364:case 370:this.$=$$[$0];break;case 13:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.StatementLiteral($$[$0]));break;case 31:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Op($$[$0],new yy.Value(new yy.Literal(\"\"))));break;case 32:case 374:case 375:case 376:case 378:case 379:case 382:case 405:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1],$$[$0]));break;case 33:case 383:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Op($$[$0-3],$$[$0-1]));break;case 34:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op($$[$0-2].concat($$[$0-1]),$$[$0]));break;case 35:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Block);break;case 36:case 150:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-1]);break;case 37:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.IdentifierLiteral($$[$0]));break;case 38:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(function(){var ref,ref1,ref2,ref3;return new yy.JSXTag($$[$0].toString(),{tagNameLocationData:$$[$0].tagNameToken[2],closingTagOpeningBracketLocationData:null==(ref=$$[$0].closingTagOpeningBracketToken)?void 0:ref[2],closingTagSlashLocationData:null==(ref1=$$[$0].closingTagSlashToken)?void 0:ref1[2],closingTagNameLocationData:null==(ref2=$$[$0].closingTagNameToken)?void 0:ref2[2],closingTagClosingBracketLocationData:null==(ref3=$$[$0].closingTagClosingBracketToken)?void 0:ref3[2]})}());break;case 39:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.PropertyName($$[$0].toString()));break;case 40:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.NumberLiteral($$[$0].toString(),{parsedValue:$$[$0].parsedValue}));break;case 42:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.StringLiteral($$[$0].slice(1,-1),{quote:$$[$0].quote,initialChunk:$$[$0].initialChunk,finalChunk:$$[$0].finalChunk,indent:$$[$0].indent,double:$$[$0].double,heregex:$$[$0].heregex}));break;case 43:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.StringWithInterpolations(yy.Block.wrap($$[$0-1]),{quote:$$[$0-2].quote,startQuote:yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Literal($$[$0-2].toString()))}));break;case 44:case 107:case 157:case 183:case 208:case 242:case 256:case 260:case 312:case 358:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)([$$[$0]]);break;case 45:case 257:case 261:case 359:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].concat($$[$0]));break;case 46:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Interpolation($$[$0-1]));break;case 47:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Interpolation($$[$0-2]));break;case 48:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Interpolation);break;case 49:case 293:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)($$[$0]);break;case 50:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.RegexLiteral($$[$0].toString(),{delimiter:$$[$0].delimiter,heregexCommentTokens:$$[$0].heregexCommentTokens}));break;case 51:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.RegexWithInterpolations($$[$0-1],{heregexCommentTokens:$$[$0].heregexCommentTokens}));break;case 53:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.PassthroughLiteral($$[$0].toString(),{here:$$[$0].here,generated:$$[$0].generated}));break;case 55:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.UndefinedLiteral($$[$0]));break;case 56:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.NullLiteral($$[$0]));break;case 57:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.BooleanLiteral($$[$0].toString(),{originalValue:$$[$0].original}));break;case 58:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.InfinityLiteral($$[$0].toString(),{originalValue:$$[$0].original}));break;case 59:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.NaNLiteral($$[$0]));break;case 60:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-2],$$[$0]));break;case 61:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-3],$$[$0]));break;case 62:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-4],$$[$0-1]));break;case 63:case 122:case 127:case 128:case 130:case 131:case 132:case 133:case 134:case 136:case 137:case 310:case 311:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Value($$[$0]));break;case 65:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Value($$[$0-2])),$$[$0],\"object\",{operatorToken:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 66:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Value($$[$0-4])),$$[$0-1],\"object\",{operatorToken:yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.Literal($$[$0-3]))}));break;case 67:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Value($$[$0-2])),$$[$0],null,{operatorToken:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 68:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Value($$[$0-4])),$$[$0-1],null,{operatorToken:yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.Literal($$[$0-3]))}));break;case 73:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Value(new yy.ComputedPropertyName($$[$0-1])));break;case 74:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Value(yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.ThisLiteral($$[$0-3])),[yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.ComputedPropertyName($$[$0-1]))],\"this\"));break;case 76:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat(new yy.Value($$[$0-1])));break;case 77:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat(new yy.Value($$[$0]),{postfix:!1}));break;case 78:case 120:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat($$[$0-1]));break;case 79:case 121:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat($$[$0],{postfix:!1}));break;case 85:case 220:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.SuperCall(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Super),$$[$0],$$[$0-1].soak,$$[$0-2]));break;case 86:case 221:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.DynamicImportCall(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.DynamicImport),$$[$0]));break;case 87:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Call(new yy.Value($$[$0-2]),$$[$0],$$[$0-1].soak));break;case 88:case 219:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Call($$[$0-2],$$[$0],$$[$0-1].soak));break;case 89:case 90:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Value($$[$0-1]).add($$[$0]));break;case 91:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Return($$[$0]));break;case 92:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Return(new yy.Value($$[$0-1])));break;case 93:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Return);break;case 94:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.YieldReturn($$[$0],{returnKeyword:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 95:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.YieldReturn(null,{returnKeyword:yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Literal($$[$0]))}));break;case 96:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.AwaitReturn($$[$0],{returnKeyword:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 97:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.AwaitReturn(null,{returnKeyword:yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Literal($$[$0]))}));break;case 98:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Code($$[$0-3],$$[$0],$$[$0-1],yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Literal($$[$0-4]))));break;case 99:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Code([],$$[$0],$$[$0-1]));break;case 100:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Code($$[$0-3],yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(yy.Block.wrap([$$[$0]])),$$[$0-1],yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Literal($$[$0-4]))));break;case 101:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Code([],yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(yy.Block.wrap([$$[$0]])),$$[$0-1]));break;case 102:case 103:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.FuncGlyph($$[$0]));break;case 106:case 156:case 258:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)([]);break;case 108:case 158:case 184:case 209:case 243:case 252:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-2].concat($$[$0]));break;case 109:case 159:case 185:case 210:case 244:case 253:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)($$[$0-3].concat($$[$0]));break;case 110:case 160:case 187:case 212:case 246:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)($$[$0-5].concat($$[$0-2]));break;case 111:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Param($$[$0]));break;case 112:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Param($$[$0-1],null,!0));break;case 113:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Param($$[$0],null,{postfix:!1}));break;case 114:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Param($$[$0-2],$$[$0]));break;case 115:case 250:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Expansion);break;case 123:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].add($$[$0]));break;case 124:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Value($$[$0-1]).add($$[$0]));break;case 138:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Super(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0])),yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Literal($$[$0-2]))));break;case 139:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Super(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Index($$[$0-1])),yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.Literal($$[$0-3]))));break;case 140:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.Super(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Index($$[$0-2])),yy.addDataToNode(yy,_$[$0-5],$$[$0-5],null,null,!0)(new yy.Literal($$[$0-5]))));break;case 141:case 142:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.MetaProperty(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.IdentifierLiteral($$[$0-2])),yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))));break;case 143:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Access($$[$0]));break;case 144:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Access($$[$0],{soak:!0}));break;case 145:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0})),yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))]);break;case 146:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0,soak:!0})),yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))]);break;case 147:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0}));break;case 148:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0,soak:!0}));break;case 151:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)($$[$0-2]);break;case 152:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(yy.extend($$[$0],{soak:!0}));break;case 153:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Index($$[$0]));break;case 154:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Slice($$[$0]));break;case 155:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Obj($$[$0-2],$$[$0-3].generated));break;case 161:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Class);break;case 162:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Class(null,null,$$[$0]));break;case 163:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Class(null,$$[$0]));break;case 164:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Class(null,$$[$0-1],$$[$0]));break;case 165:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Class($$[$0]));break;case 166:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Class($$[$0-1],null,$$[$0]));break;case 167:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Class($$[$0-2],$$[$0]));break;case 168:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Class($$[$0-3],$$[$0-1],$$[$0]));break;case 169:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(null,$$[$0]));break;case 170:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(null,$$[$0-2],$$[$0]));break;case 171:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-2],null),$$[$0]));break;case 172:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-4],null),$$[$0-2],$$[$0]));break;case 173:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,$$[$0-2]),$$[$0]));break;case 174:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,$$[$0-4]),$$[$0-2],$$[$0]));break;case 175:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList([])),$$[$0]));break;case 176:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList([])),$$[$0-2],$$[$0]));break;case 177:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList($$[$0-4])),$$[$0]));break;case 178:this.$=yy.addDataToNode(yy,_$[$0-8],$$[$0-8],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList($$[$0-6])),$$[$0-2],$$[$0]));break;case 179:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-4],$$[$0-2]),$$[$0]));break;case 180:this.$=yy.addDataToNode(yy,_$[$0-7],$$[$0-7],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-6],$$[$0-4]),$$[$0-2],$$[$0]));break;case 181:this.$=yy.addDataToNode(yy,_$[$0-8],$$[$0-8],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-7],new yy.ImportSpecifierList($$[$0-4])),$$[$0]));break;case 182:this.$=yy.addDataToNode(yy,_$[$0-10],$$[$0-10],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-9],new yy.ImportSpecifierList($$[$0-6])),$$[$0-2],$$[$0]));break;case 186:case 211:case 245:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)($$[$0-2]);break;case 188:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ImportSpecifier($$[$0]));break;case 189:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ImportSpecifier($$[$0-2],$$[$0]));break;case 190:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ImportSpecifier(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.DefaultLiteral($$[$0]))));break;case 191:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ImportSpecifier(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.DefaultLiteral($$[$0-2])),$$[$0]));break;case 192:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ImportDefaultSpecifier($$[$0]));break;case 193:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ImportNamespaceSpecifier(new yy.Literal($$[$0-2]),$$[$0]));break;case 194:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([])));break;case 195:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-2])));break;case 196:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration($$[$0]));break;case 197:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-2],$$[$0],null,{moduleDeclaration:\"export\"}))));break;case 198:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-3],$$[$0],null,{moduleDeclaration:\"export\"}))));break;case 199:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-4],$$[$0-1],null,{moduleDeclaration:\"export\"}))));break;case 200:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportDefaultDeclaration($$[$0]));break;case 201:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportDefaultDeclaration(new yy.Value($$[$0-1])));break;case 202:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ExportAllDeclaration(new yy.Literal($$[$0-2]),$$[$0]));break;case 203:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ExportAllDeclaration(new yy.Literal($$[$0-4]),$$[$0-2],$$[$0]));break;case 204:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([]),$$[$0]));break;case 205:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([]),$$[$0-2],$$[$0]));break;case 206:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-4]),$$[$0]));break;case 207:this.$=yy.addDataToNode(yy,_$[$0-8],$$[$0-8],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-6]),$$[$0-2],$$[$0]));break;case 213:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ExportSpecifier($$[$0]));break;case 214:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportSpecifier($$[$0-2],$$[$0]));break;case 215:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportSpecifier($$[$0-2],yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.DefaultLiteral($$[$0]))));break;case 216:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ExportSpecifier(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.DefaultLiteral($$[$0]))));break;case 217:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportSpecifier(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.DefaultLiteral($$[$0-2])),$$[$0]));break;case 218:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.TaggedTemplateCall($$[$0-2],$$[$0],$$[$0-1].soak));break;case 222:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({soak:!1});break;case 223:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({soak:!0});break;case 224:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([]);break;case 225:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(function(){return $$[$0-2].implicit=$$[$0-3].generated,$$[$0-2]}());break;case 226:case 227:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Value(new yy.ThisLiteral($$[$0])));break;case 228:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Value(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.ThisLiteral($$[$0-1])),[yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))],\"this\"));break;case 229:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Arr([]));break;case 230:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Arr($$[$0-1]));break;case 231:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Arr([].concat($$[$0-2],$$[$0-1])));break;case 232:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({exclusive:!1});break;case 233:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({exclusive:!0});break;case 234:case 235:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Range($$[$0-3],$$[$0-1],$$[$0-2].exclusive?\"exclusive\":\"inclusive\"));break;case 236:case 238:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Range($$[$0-2],$$[$0],$$[$0-1].exclusive?\"exclusive\":\"inclusive\"));break;case 237:case 239:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Range($$[$0-1],null,$$[$0].exclusive?\"exclusive\":\"inclusive\"));break;case 240:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Range(null,$$[$0],$$[$0-1].exclusive?\"exclusive\":\"inclusive\"));break;case 241:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Range(null,null,$$[$0].exclusive?\"exclusive\":\"inclusive\"));break;case 254:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)($$[$0-2].concat($$[$0-1]));break;case 255:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)($$[$0-5].concat($$[$0-4],$$[$0-2],$$[$0-1]));break;case 259:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([].concat($$[$0]));break;case 262:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Elision);break;case 263:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1]);break;case 266:case 267:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)([].concat($$[$0-2],$$[$0]));break;case 268:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Try($$[$0]));break;case 269:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Try($$[$0-1],$$[$0]));break;case 270:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Try($$[$0-2],null,$$[$0],yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))));break;case 271:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Try($$[$0-3],$$[$0-2],$$[$0],yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))));break;case 272:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Catch($$[$0],$$[$0-1]));break;case 273:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Catch($$[$0],yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Value($$[$0-1]))));break;case 274:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Catch($$[$0]));break;case 275:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Throw($$[$0]));break;case 276:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Throw(new yy.Value($$[$0-1])));break;case 277:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Parens($$[$0-1]));break;case 278:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Parens($$[$0-2]));break;case 279:case 283:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While($$[$0]));break;case 280:case 284:case 285:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.While($$[$0-2],{guard:$$[$0]}));break;case 281:case 286:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While($$[$0],{invert:!0}));break;case 282:case 287:case 288:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.While($$[$0-2],{invert:!0,guard:$$[$0]}));break;case 289:case 290:case 298:case 299:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].addBody($$[$0]));break;case 291:case 292:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(Object.assign($$[$0],{postfix:!0}).addBody(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(yy.Block.wrap([$$[$0-1]]))));break;case 294:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.BooleanLiteral(\"true\")),{isLoop:!0}).addBody($$[$0]));break;case 295:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.BooleanLiteral(\"true\")),{isLoop:!0}).addBody(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(yy.Block.wrap([$$[$0]]))));break;case 296:case 297:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(function(){return $$[$0].postfix=!0,$$[$0].addBody($$[$0-1])}());break;case 300:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.For([],{source:yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Value($$[$0]))}));break;case 301:case 303:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.For([],{source:yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Value($$[$0-2])),step:$$[$0]}));break;case 302:case 304:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].addSource($$[$0]));break;case 305:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.For([],{name:$$[$0][0],index:$$[$0][1]}));break;case 306:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(function(){var _$$$$=_slicedToArray($$[$0],2),index,name;return name=_$$$$[0],index=_$$$$[1],new yy.For([],{name:name,index:index,await:!0,awaitTag:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))})}());break;case 307:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(function(){var _$$$$2=_slicedToArray($$[$0],2),index,name;return name=_$$$$2[0],index=_$$$$2[1],new yy.For([],{name:name,index:index,own:!0,ownTag:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))})}());break;case 313:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)([$$[$0-2],$$[$0]]);break;case 314:case 333:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)({source:$$[$0]});break;case 315:case 334:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)({source:$$[$0],object:!0});break;case 316:case 317:case 335:case 336:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],guard:$$[$0]});break;case 318:case 319:case 337:case 338:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],guard:$$[$0],object:!0});break;case 320:case 321:case 339:case 340:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],step:$$[$0]});break;case 322:case 323:case 324:case 325:case 341:case 342:case 343:case 344:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)({source:$$[$0-4],guard:$$[$0-2],step:$$[$0]});break;case 326:case 327:case 328:case 329:case 345:case 346:case 347:case 348:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)({source:$$[$0-4],step:$$[$0-2],guard:$$[$0]});break;case 330:case 349:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)({source:$$[$0],from:!0});break;case 331:case 332:case 350:case 351:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],guard:$$[$0],from:!0});break;case 352:case 353:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Switch($$[$0-3],$$[$0-1]));break;case 354:case 355:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.Switch($$[$0-5],$$[$0-3],yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0-1],$$[$0-1],!0)($$[$0-1])));break;case 356:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Switch(null,$$[$0-1]));break;case 357:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.Switch(null,$$[$0-3],yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0-1],$$[$0-1],!0)($$[$0-1])));break;case 360:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.SwitchWhen($$[$0-1],$$[$0]));break;case 361:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!1)(yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0-1],$$[$0-1],!0)(new yy.SwitchWhen($$[$0-2],$$[$0-1])));break;case 362:case 368:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.If($$[$0-1],$$[$0],{type:$$[$0-2]}));break;case 363:case 369:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)($$[$0-4].addElse(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.If($$[$0-1],$$[$0],{type:$$[$0-2]}))));break;case 365:case 371:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-2].addElse($$[$0]));break;case 366:case 367:case 372:case 373:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.If($$[$0],yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(yy.Block.wrap([$$[$0-2]])),{type:$$[$0-1],postfix:!0}));break;case 377:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1].toString(),$$[$0],void 0,void 0,{originalOperator:$$[$0-1].original}));break;case 380:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"-\",$$[$0]));break;case 381:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"+\",$$[$0]));break;case 384:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"--\",$$[$0]));break;case 385:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"++\",$$[$0]));break;case 386:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"--\",$$[$0-1],null,!0));break;case 387:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"++\",$$[$0-1],null,!0));break;case 388:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Existence($$[$0-1]));break;case 389:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op(\"+\",$$[$0-2],$$[$0]));break;case 390:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op(\"-\",$$[$0-2],$$[$0]));break;case 391:case 392:case 393:case 395:case 396:case 397:case 400:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1],$$[$0-2],$$[$0]));break;case 394:case 398:case 399:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1].toString(),$$[$0-2],$$[$0],void 0,{originalOperator:$$[$0-1].original}));break;case 401:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(function(){var ref,ref1;return new yy.Op($$[$0-1].toString(),$$[$0-2],$$[$0],void 0,{invertOperator:null==(ref=null==(ref1=$$[$0-1].invert)?void 0:ref1.original)?$$[$0-1].invert:ref})}());break;case 402:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-2],$$[$0],$$[$0-1].toString(),{originalContext:$$[$0-1].original}));break;case 403:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-4],$$[$0-1],$$[$0-3].toString(),{originalContext:$$[$0-3].original}));break;case 404:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-3],$$[$0],$$[$0-2].toString(),{originalContext:$$[$0-2].original}));}},table:[{1:[2,1],3:1,4:2,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{1:[3]},{1:[2,2],6:$VM},o($VN,[2,3]),o($VO,[2,6],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,7]),o($VO,[2,8],{167:123,160:125,163:126,157:$VP,159:$VQ,165:$VR,183:$V51}),o($VO,[2,9]),o($V61,[2,16],{83:127,86:128,113:134,46:$V71,47:$V71,136:$V71,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1}),o($V61,[2,17],{113:134,86:137,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1}),o($V61,[2,18]),o($V61,[2,19]),o($V61,[2,20]),o($V61,[2,21]),o($V61,[2,22]),o($V61,[2,23]),o($V61,[2,24]),o($V61,[2,25]),o($V61,[2,26]),o($V61,[2,27]),o($VO,[2,28]),o($VO,[2,29]),o($VO,[2,30]),o($Vf1,[2,12]),o($Vf1,[2,13]),o($Vf1,[2,14]),o($Vf1,[2,15]),o($VO,[2,10]),o($VO,[2,11]),o($Vg1,$Vh1,{66:[1,138]}),o($Vg1,[2,130]),o($Vg1,[2,131]),o($Vg1,[2,132]),o($Vg1,$Vi1),o($Vg1,[2,134]),o($Vg1,[2,135]),o($Vg1,[2,136]),o($Vg1,[2,137]),o($Vj1,$Vk1,{90:139,97:140,98:141,38:143,72:144,99:145,34:146,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{5:150,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:$Vo1,34:66,37:149,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:152,8:153,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:157,8:158,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:159,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:167,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:168,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:169,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vw1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:[1,171],88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:172,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:176,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},o($Vx1,$Vy1,{191:[1,177],192:[1,178],205:[1,179]}),o($V61,[2,364],{178:[1,180]}),{33:$Vo1,37:181},{33:$Vo1,37:182},{33:$Vo1,37:183},o($V61,[2,293]),{33:$Vo1,37:184},{33:$Vo1,37:185},{7:186,8:187,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:[1,188],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz1,[2,161],{58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,99:65,34:66,43:67,53:69,38:85,72:86,45:95,92:161,17:173,18:174,65:175,37:189,101:191,33:$Vo1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,121:[1,190],139:$Vu,154:$Vx,187:$Vv1}),{7:192,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,193],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,35,52,74,76,96,137,144,155,157,158,159,165,166,183,193,194,195,196,197,198,199,200,201,202,203,204],$VA1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:194,14:$V0,32:$Vp1,33:$VB1,36:$VC1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:[1,197],88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VO,[2,370],{178:[1,198]}),{18:200,29:199,89:$Vl,92:39,93:$Vm,94:$Vn},o([1,6,35,52,74,76,96,137,144,155,157,158,159,165,166,183],$VD1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:201,14:$V0,32:$Vp1,33:$VE1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{38:207,39:$V2,40:$V3,45:203,46:$V5,47:$V6,117:[1,206],124:204,125:205,130:$VF1},{26:210,38:211,39:$V2,40:$V3,117:[1,209],120:$Vr,129:[1,212],133:[1,213]},o($Vx1,[2,127]),o($Vx1,[2,128]),o($Vg1,[2,52]),o($Vg1,[2,53]),o($Vg1,[2,54]),o($Vg1,[2,55]),o($Vg1,[2,56]),o($Vg1,[2,57]),o($Vg1,[2,58]),o($Vg1,[2,59]),{4:214,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:[1,215],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:216,8:217,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:$VH1,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:219,141:220,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{83:228,105:$VK1,106:$VL1,135:$Ve1,136:$V71},{84:231,136:$VM1},o($Vg1,[2,226]),o($Vg1,$VN1,{41:233,42:$VO1}),{105:[1,235]},{105:[1,236]},o($VP1,[2,102]),o($VP1,[2,103]),o($VQ1,[2,122]),o($VQ1,[2,125]),{7:237,8:238,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:239,8:240,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:241,8:242,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:244,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vo1,34:66,37:243,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vf,75:$Vm1,88:$VR1,99:252,102:245,117:$Vq,170:246,171:$VS1,172:249},{168:254,169:255,173:[1,256],174:[1,257],175:[1,258]},o([6,33,96,119],$VT1,{45:95,118:259,67:260,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),o($VZ1,[2,40]),o($VZ1,[2,41]),o($Vg1,[2,50]),{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:279,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:280,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},o($V_1,[2,37]),o($V_1,[2,38]),o($V$1,[2,42]),{45:284,46:$V5,47:$V6,48:281,50:282,51:$V02},o($VN,[2,5],{7:4,8:5,9:6,10:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,11:27,12:28,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,5:285,14:$V0,32:$V1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V61,[2,388]),{7:286,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:287,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:288,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:289,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:290,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:291,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:292,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:293,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:294,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:295,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:296,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:297,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:298,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:299,8:300,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,292]),o($V61,[2,297]),{7:239,8:301,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:241,8:302,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vf,75:$Vm1,88:$VR1,99:252,102:303,117:$Vq,170:246,171:$VS1,172:249},{168:254,173:[1,304],174:[1,305],175:[1,306]},{7:307,8:308,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,291]),o($V61,[2,296]),{45:309,46:$V5,47:$V6,84:310,136:$VM1},o($VQ1,[2,123]),o($V12,[2,223]),{41:311,42:$VO1},{41:312,42:$VO1},o($VQ1,[2,147],{41:313,42:$VO1}),o($VQ1,[2,148],{41:314,42:$VO1}),o($VQ1,[2,149]),{7:317,8:319,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:[1,316],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$V22,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,114:315,116:318,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,143:320,144:$V32,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{106:$V91,113:323,115:$Vd1},o($VQ1,[2,124]),{6:[1,325],7:324,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,326],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V42,$V52,{95:329,91:[1,327],96:$V62}),o($V72,[2,107]),o($V72,[2,111],{66:[1,331],76:[1,330]}),o($V72,[2,115],{38:143,72:144,99:145,34:146,98:332,39:$V2,40:$V3,73:$Vl1,75:$Vm1,117:$Vq}),o($V82,[2,116]),o($V82,[2,117]),o($V82,[2,118]),o($V82,[2,119]),{41:233,42:$VO1},{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:$VH1,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:219,141:220,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vg1,[2,99]),o($VO,[2,101]),{4:336,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,35:[1,335],38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V92,$Va2,{160:118,163:119,167:123,193:$VV}),o($VO,[2,374]),{7:169,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vw1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{157:$VP,159:$VQ,160:125,163:126,165:$VR,167:123,183:$V51},o([1,6,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,193,194,195,196,197,198,199,200,201,202,203,204],$VA1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:194,14:$V0,32:$Vp1,33:$VB1,36:$VC1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V92,$Vb2,{160:118,163:119,167:123,193:$VV}),o($VO,[2,375]),o($Vc2,[2,379],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vj1,$Vk1,{97:140,98:141,38:143,72:144,99:145,34:146,90:338,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{33:$Vo1,37:149},{7:339,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:340,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{157:$VP,159:$VQ,160:125,163:126,165:$VR,167:123,183:[1,341]},{18:200,89:$Vr1,92:161,93:$Vm,94:$Vn},{7:342,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vc2,[2,380],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vc2,[2,381],{160:118,163:119,167:123,193:$VV,195:$VX}),o($V92,[2,382],{160:118,163:119,167:123,193:$VV}),{34:343,117:$Vq},o($VO,[2,97],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:344,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$VD1,159:$VD1,165:$VD1,183:$VD1,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V61,[2,384],{46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1}),o($V12,$V71,{83:127,86:128,113:134,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1}),{86:137,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,113:134,115:$Vd1},o($Vd2,$Vh1),o($V61,[2,385],{46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1}),o($V61,[2,386]),o($V61,[2,387]),{6:[1,347],7:345,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,346],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$Vo1,37:348,182:[1,349]},o($V61,[2,268],{150:350,151:[1,351],152:[1,352]}),o($V61,[2,289]),o($V61,[2,290]),o($V61,[2,298]),o($V61,[2,299]),{33:[1,353],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[1,354]},{177:355,179:356,180:$Ve2},o($V61,[2,162]),{7:358,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz1,[2,165],{37:359,33:$Vo1,46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1,121:[1,360]}),o($Vf2,[2,275],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:361,117:$Vq},o($Vf2,[2,32],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:362,117:$Vq},{7:363,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,35,52,74,76,96,137,144,155,158,166],[2,95],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:364,14:$V0,32:$Vp1,33:$VE1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$VD1,159:$VD1,165:$VD1,183:$VD1,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{33:$Vo1,37:365,182:[1,366]},o($VO,[2,376]),o($Vg1,[2,405]),o($Vf1,$Vg2,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:367,117:$Vq},o($Vf1,[2,169],{123:[1,368]}),{36:[1,369],96:[1,370]},{36:[1,371]},{33:$Vh2,38:376,39:$V2,40:$V3,119:[1,372],126:373,127:374,129:$Vi2},o([36,96],[2,192]),{128:[1,378]},{33:$Vj2,38:383,39:$V2,40:$V3,119:[1,379],129:$Vk2,132:380,134:381},o($Vf1,[2,196]),{66:[1,385]},{7:386,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,387],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{36:[1,388]},{6:$VM,155:[1,389]},{4:390,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vl2,$Vm2,{160:118,163:119,167:123,143:391,76:[1,392],144:$V32,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vl2,$Vn2,{143:393,76:$V22,144:$V32}),o($Vo2,[2,229]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:[1,394],75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:396,147:395,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([6,33,74],$V52,{142:397,95:399,96:$Vp2}),o($Vq2,[2,260],{6:$Vr2}),o($Vs2,[2,251]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,141:401,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vt2,[2,262]),o($Vs2,[2,256]),o($Vu2,[2,249]),o($Vu2,[2,250],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:403,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{84:404,136:$VM1},{41:405,42:$VO1},{7:406,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,407],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vv2,[2,221]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,137:[1,408],138:409,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vx2,[2,228]),o($Vx2,[2,39]),{41:412,42:$VO1},{41:413,42:$VO1},{33:$Vo1,37:414,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:$Vo1,37:415},o($Vy2,[2,283],{160:118,163:119,167:123,157:$VP,158:[1,416],159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:[2,279],158:[1,417]},o($Vy2,[2,286],{160:118,163:119,167:123,157:$VP,158:[1,418],159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:[2,281],158:[1,419]},o($V61,[2,294]),o($Vz2,[2,295],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$VA2,166:[1,420]},o($VB2,[2,305]),{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,170:421,172:249},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,170:422,172:249},o($VB2,[2,312],{96:[1,423]}),o($VC2,[2,308]),o($VC2,[2,309]),o($VC2,[2,310]),o($VC2,[2,311]),o($V61,[2,302]),{33:[2,304]},{7:424,8:425,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:426,8:427,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:428,8:429,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VD2,$V52,{95:430,96:$VE2}),o($VF2,[2,157]),o($VF2,[2,63],{70:[1,432]}),o($VF2,[2,64]),o($VG2,[2,72],{113:134,83:435,86:436,66:[1,433],76:[1,434],105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),{7:437,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([76,105,106,110,111,112,115,135,136],$VN1,{41:233,42:$VO1,73:[1,438]}),o($VG2,[2,75]),{34:273,38:269,39:$V2,40:$V3,41:270,42:$VO1,71:439,72:271,75:$Vg,77:440,78:272,79:274,80:275,81:276,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx},{76:[1,441],83:442,86:443,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,113:134,115:$Vd1,135:$Ve1,136:$V71},o($VH2,[2,69]),o($VH2,[2,70]),o($VH2,[2,71]),o($VI2,[2,80]),o($VI2,[2,81]),o($VI2,[2,82]),o($VI2,[2,83]),o($VI2,[2,84]),{83:444,105:$VK1,106:$VL1,135:$Ve1,136:$V71},{84:445,136:$VM1},o($Vd2,$Vi1,{57:[1,446]}),o($Vd2,$Vy1),{45:284,46:$V5,47:$V6,49:[1,447],50:448,51:$V02},o($VJ2,[2,44]),{4:449,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:[1,450],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,52:[1,451],53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VJ2,[2,49]),o($VN,[2,4]),o($VK2,[2,389],{160:118,163:119,167:123,193:$VV,194:$VW,195:$VX}),o($VK2,[2,390],{160:118,163:119,167:123,193:$VV,194:$VW,195:$VX}),o($Vc2,[2,391],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vc2,[2,392],{160:118,163:119,167:123,193:$VV,195:$VX}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,196,197,198,199,200,201,202,203,204],[2,393],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,197,198,199,200,201,202,203],[2,394],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,198,199,200,201,202,203],[2,395],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,199,200,201,202,203],[2,396],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,200,201,202,203],[2,397],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,201,202,203],[2,398],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,202,203],[2,399],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,203],[2,400],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,197,198,199,200,201,202,203,204],[2,401],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY}),o($Vz2,$VL2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,373]),{158:[1,452]},{158:[1,453]},o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VA2,{166:[1,454]}),{7:455,8:456,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:457,8:458,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:459,8:460,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz2,$VM2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,372]),o($Vv2,[2,218]),o($Vv2,[2,219]),o($VQ1,[2,143]),o($VQ1,[2,144]),o($VQ1,[2,145]),o($VQ1,[2,146]),{107:[1,461]},{7:317,8:319,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$V22,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,114:462,116:318,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,143:320,144:$V32,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VN2,[2,153],{160:118,163:119,167:123,143:463,76:$V22,144:$V32,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VN2,[2,154]),{76:$V22,143:464,144:$V32},o($VN2,[2,241],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:465,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VO2,[2,232]),o($VO2,$VP2),o($VQ1,[2,152]),o($Vf2,[2,60],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:466,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:467,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{92:468,93:$Vm,94:$Vn},o($VQ2,$VR2,{98:141,38:143,72:144,99:145,34:146,97:469,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{6:$VS2,33:$VT2},o($V72,[2,112]),{7:472,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,113]),o($Vu2,$Vm2,{160:118,163:119,167:123,76:[1,473],157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vu2,$Vn2),o($VU2,[2,35]),{6:$VM,35:[1,474]},{7:475,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V42,$V52,{95:329,91:[1,476],96:$V62}),o($V92,$Va2,{160:118,163:119,167:123,193:$VV}),o($V92,$Vb2,{160:118,163:119,167:123,193:$VV}),{7:477,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$Vo1,37:414,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{35:[1,478]},o($VO,[2,96],{160:118,163:119,167:123,157:$Vg2,159:$Vg2,165:$Vg2,183:$Vg2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,[2,402],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:479,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:480,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,365]),{7:481,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,269],{151:[1,482]}),{33:$Vo1,37:483},{33:$Vo1,34:485,37:486,38:484,39:$V2,40:$V3,117:$Vq},{177:487,179:356,180:$Ve2},{177:488,179:356,180:$Ve2},{35:[1,489],178:[1,490],179:491,180:$Ve2},o($VW2,[2,358]),{7:493,8:494,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,148:492,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VX2,[2,163],{160:118,163:119,167:123,37:495,33:$Vo1,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,166]),{7:496,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,497]},{35:[1,498]},o($Vf2,[2,34],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,94],{160:118,163:119,167:123,157:$Vg2,159:$Vg2,165:$Vg2,183:$Vg2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,371]),{7:500,8:499,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,501]},{34:502,117:$Vq},{45:503,46:$V5,47:$V6},{117:[1,505],125:504,130:$VF1},{45:506,46:$V5,47:$V6},{36:[1,507]},o($VD2,$V52,{95:508,96:$VY2}),o($VF2,[2,183]),{33:$Vh2,38:376,39:$V2,40:$V3,126:510,127:374,129:$Vi2},o($VF2,[2,188],{128:[1,511]}),o($VF2,[2,190],{128:[1,512]}),{38:513,39:$V2,40:$V3},o($Vf1,[2,194],{36:[1,514]}),o($VD2,$V52,{95:515,96:$VZ2}),o($VF2,[2,208]),{33:$Vj2,38:383,39:$V2,40:$V3,129:$Vk2,132:517,134:381},o($VF2,[2,213],{128:[1,518]}),o($VF2,[2,216],{128:[1,519]}),{6:[1,521],7:520,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,522],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V_2,[2,200],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:523,117:$Vq},{45:524,46:$V5,47:$V6},o($Vg1,[2,277]),{6:$VM,35:[1,525]},{7:526,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([14,32,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VP2,{6:$V$2,33:$V$2,74:$V$2,96:$V$2}),{7:527,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vo2,[2,230]),o($Vq2,[2,261],{6:$Vr2}),o($Vs2,[2,257]),{33:$V03,74:[1,528]},o([6,33,35,74],$VR2,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,147:221,145:225,100:226,7:333,8:334,146:530,140:531,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,96:$VJ1,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V13,[2,258],{6:[1,532]}),o($Vt2,[2,263]),o($VQ2,$V52,{95:399,142:533,96:$Vp2}),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:396,147:395,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vu2,[2,121],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vv2,[2,220]),o($Vg1,[2,138]),{107:[1,534],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{7:535,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vv2,[2,224]),o([6,33,137],$V52,{95:536,96:$V23}),o($V33,[2,242]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,138:538,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vg1,[2,141]),o($Vg1,[2,142]),o($V43,[2,362]),o($V53,[2,368]),{7:539,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:540,8:541,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:542,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:543,8:544,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:545,8:546,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VB2,[2,306]),o($VB2,[2,307]),{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,172:547},{33:$V63,157:$VP,158:[1,548],159:$VQ,160:118,163:119,165:$VR,166:[1,549],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,333],158:[1,550],166:[1,551]},{33:$V73,157:$VP,158:[1,552],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,334],158:[1,553]},{33:$V83,157:$VP,158:[1,554],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,349],158:[1,555]},{6:$V93,33:$Va3,119:[1,556]},o($Vb3,$VR2,{45:95,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,67:559,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),{7:560,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,561],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:562,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,563],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,76]),{84:564,136:$VM1},o($VI2,[2,89]),{74:[1,565],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{7:566,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,77],{113:134,83:435,86:436,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),o($VF2,[2,79],{113:134,83:442,86:443,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),o($VF2,[2,78]),{84:567,136:$VM1},o($VI2,[2,90]),{84:568,136:$VM1},o($VI2,[2,86]),o($Vg1,[2,51]),o($V$1,[2,43]),o($VJ2,[2,45]),{6:$VM,52:[1,569]},{4:570,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VJ2,[2,48]),{7:571,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:572,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:573,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,159,165,183],$V63,{160:118,163:119,167:123,158:[1,574],166:[1,575],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,576],166:[1,577]},o($Vc3,$V73,{160:118,163:119,167:123,158:[1,578],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,579]},o($Vc3,$V83,{160:118,163:119,167:123,158:[1,580],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,581]},o($VQ1,[2,150]),{35:[1,582]},o($VN2,[2,237],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:583,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VN2,[2,239],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:584,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VN2,[2,240],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,[2,61],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{35:[1,585],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{5:587,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:$Vo1,34:66,37:586,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,108]),{34:146,38:143,39:$V2,40:$V3,72:144,73:$Vl1,75:$Vm1,76:$Vn1,97:588,98:141,99:145,117:$Vq},o($Vd3,$Vk1,{97:140,98:141,38:143,72:144,99:145,34:146,90:589,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),o($V72,[2,114],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vu2,$V$2),o($VU2,[2,36]),o($Vz2,$VL2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{92:590,93:$Vm,94:$Vn},o($Vz2,$VM2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,383]),{35:[1,591],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf2,[2,404],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vo1,37:592,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:$Vo1,37:593},o($V61,[2,270]),{33:$Vo1,37:594},{33:$Vo1,37:595},o($Ve3,[2,274]),{35:[1,596],178:[1,597],179:491,180:$Ve2},{35:[1,598],178:[1,599],179:491,180:$Ve2},o($V61,[2,356]),{33:$Vo1,37:600},o($VW2,[2,359]),{33:$Vo1,37:601,96:[1,602]},o($Vf3,[2,264],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf3,[2,265]),o($V61,[2,164]),o($VX2,[2,167],{160:118,163:119,167:123,37:603,33:$Vo1,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,276]),o($V61,[2,33]),{33:$Vo1,37:604},{157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf1,[2,92]),o($Vf1,[2,170]),o($Vf1,[2,171],{123:[1,605]}),{36:[1,606]},{33:$Vh2,38:376,39:$V2,40:$V3,126:607,127:374,129:$Vi2},o($Vf1,[2,173],{123:[1,608]}),{45:609,46:$V5,47:$V6},{6:$Vg3,33:$Vh3,119:[1,610]},o($Vb3,$VR2,{38:376,127:613,39:$V2,40:$V3,129:$Vi2}),o($VQ2,$V52,{95:614,96:$VY2}),{38:615,39:$V2,40:$V3},{38:616,39:$V2,40:$V3},{36:[2,193]},{45:617,46:$V5,47:$V6},{6:$Vi3,33:$Vj3,119:[1,618]},o($Vb3,$VR2,{38:383,134:621,39:$V2,40:$V3,129:$Vk2}),o($VQ2,$V52,{95:622,96:$VZ2}),{38:623,39:$V2,40:$V3,129:[1,624]},{38:625,39:$V2,40:$V3},o($V_2,[2,197],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:626,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:627,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,628]},o($Vf1,[2,202],{123:[1,629]}),{155:[1,630]},{74:[1,631],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{74:[1,632],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vo2,[2,231]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,141:633,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vs2,[2,252]),o($V13,[2,259],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,100:226,7:333,8:334,147:395,145:396,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,96:$VJ1,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,145:225,146:634,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$V03,35:[1,635]},o($Vg1,[2,139]),{35:[1,636],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{6:$Vk3,33:$Vl3,137:[1,637]},o([6,33,35,137],$VR2,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,100:226,7:333,8:334,145:640,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VQ2,$V52,{95:641,96:$V23}),o($Vz2,[2,284],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vm3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,280]},o($Vz2,[2,287],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vn3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,282]},{33:$Vo3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,303]},o($VB2,[2,313]),{7:642,8:643,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:644,8:645,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:646,8:647,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:648,8:649,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:650,8:651,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:652,8:653,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:654,8:655,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:656,8:657,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vo2,[2,155]),{34:273,38:269,39:$V2,40:$V3,41:270,42:$VO1,43:266,44:$V4,45:95,46:$V5,47:$V6,67:658,68:261,69:262,71:263,72:271,73:$VU1,75:$VV1,76:$VW1,77:268,78:272,79:274,80:275,81:276,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx},o($Vd3,$VT1,{45:95,67:260,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,118:659,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),o($VF2,[2,158]),o($VF2,[2,65],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:660,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,67],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:661,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VI2,[2,87]),o($VG2,[2,73]),{74:[1,662],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($VI2,[2,88]),o($VI2,[2,85]),o($VJ2,[2,46]),{6:$VM,35:[1,663]},o($Vz2,$Vm3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vz2,$Vn3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vz2,$Vo3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:664,8:665,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:666,8:667,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:668,8:669,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:670,8:671,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:672,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:673,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:674,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:675,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{107:[1,676]},o($VN2,[2,236],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VN2,[2,238],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,62]),o($Vg1,[2,98]),o($VO,[2,100]),o($V72,[2,109]),o($VQ2,$V52,{95:677,96:$V62}),{33:$Vo1,37:586},o($V61,[2,403]),o($V43,[2,363]),o($V61,[2,271]),o($Ve3,[2,272]),o($Ve3,[2,273]),o($V61,[2,352]),{33:$Vo1,37:678},o($V61,[2,353]),{33:$Vo1,37:679},{35:[1,680]},o($VW2,[2,360],{6:[1,681]}),{7:682,8:683,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,168]),o($V53,[2,369]),{34:684,117:$Vq},{45:685,46:$V5,47:$V6},o($VD2,$V52,{95:686,96:$VY2}),{34:687,117:$Vq},o($Vf1,[2,175],{123:[1,688]}),{36:[1,689]},{38:376,39:$V2,40:$V3,127:690,129:$Vi2},{33:$Vh2,38:376,39:$V2,40:$V3,126:691,127:374,129:$Vi2},o($VF2,[2,184]),{6:$Vg3,33:$Vh3,35:[1,692]},o($VF2,[2,189]),o($VF2,[2,191]),o($Vf1,[2,204],{123:[1,693]}),o($Vf1,[2,195],{36:[1,694]}),{38:383,39:$V2,40:$V3,129:$Vk2,134:695},{33:$Vj2,38:383,39:$V2,40:$V3,129:$Vk2,132:696,134:381},o($VF2,[2,209]),{6:$Vi3,33:$Vj3,35:[1,697]},o($VF2,[2,214]),o($VF2,[2,215]),o($VF2,[2,217]),o($V_2,[2,198],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{35:[1,698],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf1,[2,201]),{34:699,117:$Vq},o($Vg1,[2,278]),o($Vg1,[2,234]),o($Vg1,[2,235]),o($VQ2,$V52,{95:399,142:700,96:$Vp2}),o($Vs2,[2,253]),o($Vs2,[2,254]),{107:[1,701]},o($Vv2,[2,225]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:702,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,138:703,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V33,[2,243]),{6:$Vk3,33:$Vl3,35:[1,704]},{33:$Vp3,157:$VP,159:$VQ,160:118,163:119,165:$VR,166:[1,705],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,335],166:[1,706]},{33:$Vq3,157:$VP,158:[1,707],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,339],158:[1,708]},{33:$Vr3,157:$VP,159:$VQ,160:118,163:119,165:$VR,166:[1,709],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,336],166:[1,710]},{33:$Vs3,157:$VP,158:[1,711],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,340],158:[1,712]},{33:$Vt3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,337]},{33:$Vu3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,338]},{33:$Vv3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,350]},{33:$Vw3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,351]},o($VF2,[2,159]),o($VQ2,$V52,{95:713,96:$VE2}),{35:[1,714],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{35:[1,715],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($VG2,[2,74]),{52:[1,716]},o($Vx3,$Vp3,{160:118,163:119,167:123,166:[1,717],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{166:[1,718]},o($Vc3,$Vq3,{160:118,163:119,167:123,158:[1,719],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,720]},o($Vx3,$Vr3,{160:118,163:119,167:123,166:[1,721],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{166:[1,722]},o($Vc3,$Vs3,{160:118,163:119,167:123,158:[1,723],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,724]},o($Vf2,$Vt3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vu3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vv3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vw3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VQ1,[2,151]),{6:$VS2,33:$VT2,35:[1,725]},{35:[1,726]},{35:[1,727]},o($V61,[2,357]),o($VW2,[2,361]),o($Vf3,[2,266],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf3,[2,267]),o($Vf1,[2,172]),o($Vf1,[2,179],{123:[1,728]}),{6:$Vg3,33:$Vh3,119:[1,729]},o($Vf1,[2,174]),{34:730,117:$Vq},{45:731,46:$V5,47:$V6},o($VF2,[2,185]),o($VQ2,$V52,{95:732,96:$VY2}),o($VF2,[2,186]),{34:733,117:$Vq},{45:734,46:$V5,47:$V6},o($VF2,[2,210]),o($VQ2,$V52,{95:735,96:$VZ2}),o($VF2,[2,211]),o($Vf1,[2,199]),o($Vf1,[2,203]),{33:$V03,35:[1,736]},o($Vg1,[2,140]),o($V33,[2,244]),o($VQ2,$V52,{95:737,96:$V23}),o($V33,[2,245]),{7:738,8:739,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:740,8:741,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:742,8:743,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:744,8:745,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:746,8:747,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:748,8:749,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:750,8:751,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:752,8:753,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{6:$V93,33:$Va3,35:[1,754]},o($VF2,[2,66]),o($VF2,[2,68]),o($VJ2,[2,47]),{7:755,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:756,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:757,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:758,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:759,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:760,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:761,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:762,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,110]),o($V61,[2,354]),o($V61,[2,355]),{34:763,117:$Vq},{36:[1,764]},o($Vf1,[2,176]),o($Vf1,[2,177],{123:[1,765]}),{6:$Vg3,33:$Vh3,35:[1,766]},o($Vf1,[2,205]),o($Vf1,[2,206],{123:[1,767]}),{6:$Vi3,33:$Vj3,35:[1,768]},o($Vs2,[2,255]),{6:$Vk3,33:$Vl3,35:[1,769]},{33:$Vy3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,341]},{33:$Vz3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,343]},{33:$VA3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,345]},{33:$VB3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,347]},{33:$VC3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,342]},{33:$VD3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,344]},{33:$VE3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,346]},{33:$VF3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,348]},o($VF2,[2,160]),o($Vf2,$Vy3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vz3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VA3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VB3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VC3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VD3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VE3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VF3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf1,[2,180]),{45:770,46:$V5,47:$V6},{34:771,117:$Vq},o($VF2,[2,187]),{34:772,117:$Vq},o($VF2,[2,212]),o($V33,[2,246]),o($Vf1,[2,181],{123:[1,773]}),o($Vf1,[2,178]),o($Vf1,[2,207]),{34:774,117:$Vq},o($Vf1,[2,182])],defaultActions:{255:[2,304],513:[2,193],541:[2,280],544:[2,282],546:[2,303],651:[2,337],653:[2,338],655:[2,350],657:[2,351],739:[2,341],741:[2,343],743:[2,345],745:[2,347],747:[2,342],749:[2,344],751:[2,346],753:[2,348]},parseError:function(str,hash){if(hash.recoverable)this.trace(str);else{var error=new Error(str);throw error.hash=hash,error}},parse:function(input){var self=this,stack=[0],vstack=[null],lstack=[],table=this.table,yytext=\"\",yylineno=0,yyleng=0,recovering=0,EOF=1,args=lstack.slice.call(arguments,1),lexer=Object.create(this.lexer),sharedState={yy:{}};for(var k in this.yy)Object.prototype.hasOwnProperty.call(this.yy,k)&&(sharedState.yy[k]=this.yy[k]);lexer.setInput(input,sharedState.yy),sharedState.yy.lexer=lexer,sharedState.yy.parser=this,\"undefined\"==typeof lexer.yylloc&&(lexer.yylloc={});var yyloc=lexer.yylloc;lstack.push(yyloc);var ranges=lexer.options&&lexer.options.ranges;this.parseError=\"function\"==typeof sharedState.yy.parseError?sharedState.yy.parseError:Object.getPrototypeOf(this).parseError;_token_stack:var lex=function(){var token;return token=lexer.lex()||EOF,\"number\"!=typeof token&&(token=self.symbols_[token]||token),token};for(var yyval={},symbol,preErrorSymbol,state,action,r,p,len,newState,expected;;){if(state=stack[stack.length-1],this.defaultActions[state]?action=this.defaultActions[state]:((null===symbol||\"undefined\"==typeof symbol)&&(symbol=lex()),action=table[state]&&table[state][symbol]),\"undefined\"==typeof action||!action.length||!action[0]){var errStr=\"\";for(p in expected=[],table[state])this.terminals_[p]&&p>2&&expected.push(\"'\"+this.terminals_[p]+\"'\");errStr=lexer.showPosition?\"Parse error on line \"+(yylineno+1)+\":\\n\"+lexer.showPosition()+\"\\nExpecting \"+expected.join(\", \")+\", got '\"+(this.terminals_[symbol]||symbol)+\"'\":\"Parse error on line \"+(yylineno+1)+\": Unexpected \"+(symbol==EOF?\"end of input\":\"'\"+(this.terminals_[symbol]||symbol)+\"'\"),this.parseError(errStr,{text:lexer.match,token:this.terminals_[symbol]||symbol,line:lexer.yylineno,loc:yyloc,expected:expected})}if(action[0]instanceof Array&&1<action.length)throw new Error(\"Parse Error: multiple actions possible at state: \"+state+\", token: \"+symbol);switch(action[0]){case 1:stack.push(symbol),vstack.push(lexer.yytext),lstack.push(lexer.yylloc),stack.push(action[1]),symbol=null,preErrorSymbol?(symbol=preErrorSymbol,preErrorSymbol=null):(yyleng=lexer.yyleng,yytext=lexer.yytext,yylineno=lexer.yylineno,yyloc=lexer.yylloc,0<recovering&&recovering--);break;case 2:if(len=this.productions_[action[1]][1],yyval.$=vstack[vstack.length-len],yyval._$={first_line:lstack[lstack.length-(len||1)].first_line,last_line:lstack[lstack.length-1].last_line,first_column:lstack[lstack.length-(len||1)].first_column,last_column:lstack[lstack.length-1].last_column},ranges&&(yyval._$.range=[lstack[lstack.length-(len||1)].range[0],lstack[lstack.length-1].range[1]]),r=this.performAction.apply(yyval,[yytext,yyleng,yylineno,sharedState.yy,action[1],vstack,lstack].concat(args)),\"undefined\"!=typeof r)return r;len&&(stack=stack.slice(0,2*(-1*len)),vstack=vstack.slice(0,-1*len),lstack=lstack.slice(0,-1*len)),stack.push(this.productions_[action[1]][0]),vstack.push(yyval.$),lstack.push(yyval._$),newState=table[stack[stack.length-2]][stack[stack.length-1]],stack.push(newState);break;case 3:return!0;}}return!0}};return Parser.prototype=parser,parser.Parser=Parser,new Parser}();return\"undefined\"!=typeof require&&\"undefined\"!=typeof exports&&(exports.parser=parser,exports.Parser=parser.Parser,exports.parse=function(){return parser.parse.apply(parser,arguments)},exports.main=function(){},require.main===module&&exports.main(process.argv.slice(1))),module.exports}(),require[\"./scope\"]=function(){var exports={};return function(){var indexOf=[].indexOf,Scope;exports.Scope=Scope=function(){\"use strict\";function Scope(parent,expressions,method,referencedVars){_classCallCheck(this,Scope);var ref,ref1;this.parent=parent,this.expressions=expressions,this.method=method,this.referencedVars=referencedVars,this.variables=[{name:\"arguments\",type:\"arguments\"}],this.comments={},this.positions={},this.parent||(this.utilities={}),this.root=null==(ref=null==(ref1=this.parent)?void 0:ref1.root)?this:ref}return _createClass(Scope,[{key:\"add\",value:function add(name,type,immediate){return this.shared&&!immediate?this.parent.add(name,type,immediate):Object.prototype.hasOwnProperty.call(this.positions,name)?this.variables[this.positions[name]].type=type:this.positions[name]=this.variables.push({name:name,type:type})-1}},{key:\"namedMethod\",value:function namedMethod(){var ref;return(null==(ref=this.method)?void 0:ref.name)||!this.parent?this.method:this.parent.namedMethod()}},{key:\"find\",value:function find(name){var type=1<arguments.length&&void 0!==arguments[1]?arguments[1]:\"var\";return!!this.check(name)||(this.add(name,type),!1)}},{key:\"parameter\",value:function parameter(name){return this.shared&&this.parent.check(name,!0)?void 0:this.add(name,\"param\")}},{key:\"check\",value:function check(name){var ref;return!!(this.type(name)||(null==(ref=this.parent)?void 0:ref.check(name)))}},{key:\"temporary\",value:function temporary(name,index){var single=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],diff,endCode,letter,newCode,num,startCode;return single?(startCode=name.charCodeAt(0),endCode=\"z\".charCodeAt(0),diff=endCode-startCode,newCode=startCode+index%(diff+1),letter=_StringfromCharCode(newCode),num=_Mathfloor(index/(diff+1)),\"\".concat(letter).concat(num||\"\")):\"\".concat(name).concat(index||\"\")}},{key:\"type\",value:function type(name){var i,len,ref,v;for(ref=this.variables,i=0,len=ref.length;i<len;i++)if(v=ref[i],v.name===name)return v.type;return null}},{key:\"freeVariable\",value:function freeVariable(name){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},index,ref,temp;for(index=0;temp=this.temporary(name,index,options.single),!!(this.check(temp)||0<=indexOf.call(this.root.referencedVars,temp));)index++;return(null==(ref=options.reserve)||ref)&&this.add(temp,\"var\",!0),temp}},{key:\"assign\",value:function assign(name,value){return this.add(name,{value:value,assigned:!0},!0),this.hasAssignments=!0}},{key:\"hasDeclarations\",value:function hasDeclarations(){return!!this.declaredVariables().length}},{key:\"declaredVariables\",value:function declaredVariables(){var v;return function(){var i,len,ref,results;for(ref=this.variables,results=[],(i=0,len=ref.length);i<len;i++)v=ref[i],\"var\"===v.type&&results.push(v.name);return results}.call(this).sort()}},{key:\"assignedVariables\",value:function assignedVariables(){var i,len,ref,results,v;for(ref=this.variables,results=[],(i=0,len=ref.length);i<len;i++)v=ref[i],v.type.assigned&&results.push(\"\".concat(v.name,\" = \").concat(v.type.value));return results}}]),Scope}()}.call(this),{exports:exports}.exports}(),require[\"./nodes\"]=function(){var exports={};return function(){var indexOf=[].indexOf,splice=[].splice,slice1=[].slice,Access,Arr,Assign,AwaitReturn,Base,Block,BooleanLiteral,Call,Catch,Class,ClassProperty,ClassPrototypeProperty,Code,CodeFragment,ComputedPropertyName,DefaultLiteral,Directive,DynamicImport,DynamicImportCall,Elision,EmptyInterpolation,ExecutableClassBody,Existence,Expansion,ExportAllDeclaration,ExportDeclaration,ExportDefaultDeclaration,ExportNamedDeclaration,ExportSpecifier,ExportSpecifierList,Extends,For,FuncDirectiveReturn,FuncGlyph,HEREGEX_OMIT,HereComment,HoistTarget,IdentifierLiteral,If,ImportClause,ImportDeclaration,ImportDefaultSpecifier,ImportNamespaceSpecifier,ImportSpecifier,ImportSpecifierList,In,Index,InfinityLiteral,Interpolation,JSXAttribute,JSXAttributes,JSXElement,JSXEmptyExpression,JSXExpressionContainer,JSXIdentifier,JSXNamespacedName,JSXTag,JSXText,JS_FORBIDDEN,LEADING_BLANK_LINE,LEVEL_ACCESS,LEVEL_COND,LEVEL_LIST,LEVEL_OP,LEVEL_PAREN,LEVEL_TOP,LineComment,Literal,MetaProperty,ModuleDeclaration,ModuleSpecifier,ModuleSpecifierList,NEGATE,NO,NaNLiteral,NullLiteral,NumberLiteral,Obj,ObjectProperty,Op,Param,Parens,PassthroughLiteral,PropertyName,Range,RegexLiteral,RegexWithInterpolations,Return,Root,SIMPLENUM,SIMPLE_STRING_OMIT,STRING_OMIT,Scope,Sequence,Slice,Splat,StatementLiteral,StringLiteral,StringWithInterpolations,Super,SuperCall,Switch,SwitchCase,SwitchWhen,TAB,THIS,TRAILING_BLANK_LINE,TaggedTemplateCall,TemplateElement,ThisLiteral,Throw,Try,UTILITIES,UndefinedLiteral,Value,While,YES,YieldReturn,addDataToNode,astAsBlockIfNeeded,attachCommentsToNode,compact,del,emptyExpressionLocationData,ends,extend,extractSameLineLocationDataFirst,extractSameLineLocationDataLast,flatten,fragmentsToText,greater,hasLineComments,indentInitial,isAstLocGreater,isFunction,isLiteralArguments,isLiteralThis,isLocationDataEndGreater,isLocationDataStartGreater,isNumber,isPlainObject,isUnassignable,jisonLocationDataToAstLocationData,lesser,locationDataToString,makeDelimitedLiteral,merge,mergeAstLocationData,mergeLocationData,moveComments,multident,parseNumber,replaceUnicodeCodePointEscapes,shouldCacheOrIsAssignable,sniffDirectives,some,starts,throwSyntaxError,_unfoldSoak,unshiftAfterComments,utility,zeroWidthLocationDataFromEndLocation;Error.stackTraceLimit=2e308;var _require4=require(\"./scope\");Scope=_require4.Scope;var _require5=require(\"./lexer\");isUnassignable=_require5.isUnassignable,JS_FORBIDDEN=_require5.JS_FORBIDDEN;var _require6=require(\"./helpers\");compact=_require6.compact,flatten=_require6.flatten,extend=_require6.extend,merge=_require6.merge,del=_require6.del,starts=_require6.starts,ends=_require6.ends,some=_require6.some,addDataToNode=_require6.addDataToNode,attachCommentsToNode=_require6.attachCommentsToNode,locationDataToString=_require6.locationDataToString,throwSyntaxError=_require6.throwSyntaxError,replaceUnicodeCodePointEscapes=_require6.replaceUnicodeCodePointEscapes,isFunction=_require6.isFunction,isPlainObject=_require6.isPlainObject,isNumber=_require6.isNumber,parseNumber=_require6.parseNumber,exports.extend=extend,exports.addDataToNode=addDataToNode,YES=function(){return!0},NO=function(){return!1},THIS=function(){return this},NEGATE=function(){return this.negated=!this.negated,this},exports.CodeFragment=CodeFragment=function(){\"use strict\";function CodeFragment(parent,code){_classCallCheck(this,CodeFragment);var ref1;this.code=\"\".concat(code),this.type=(null==parent||null==(ref1=parent.constructor)?void 0:ref1.name)||\"unknown\",this.locationData=null==parent?void 0:parent.locationData,this.comments=null==parent?void 0:parent.comments}return _createClass(CodeFragment,[{key:\"toString\",value:function toString(){return\"\".concat(this.code).concat(this.locationData?\": \"+locationDataToString(this.locationData):\"\")}}]),CodeFragment}(),fragmentsToText=function(fragments){var fragment;return function(){var j,len1,results1;for(results1=[],j=0,len1=fragments.length;j<len1;j++)fragment=fragments[j],results1.push(fragment.code);return results1}().join(\"\")},exports.Base=Base=function(){var Base=function(){\"use strict\";function Base(){_classCallCheck(this,Base)}return _createClass(Base,[{key:\"compile\",value:function compile(o,lvl){return fragmentsToText(this.compileToFragments(o,lvl))}},{key:\"compileWithoutComments\",value:function compileWithoutComments(o,lvl){var method=2<arguments.length&&void 0!==arguments[2]?arguments[2]:\"compile\",fragments,unwrapped;return this.comments&&(this.ignoreTheseCommentsTemporarily=this.comments,delete this.comments),unwrapped=this.unwrapAll(),unwrapped.comments&&(unwrapped.ignoreTheseCommentsTemporarily=unwrapped.comments,delete unwrapped.comments),fragments=this[method](o,lvl),this.ignoreTheseCommentsTemporarily&&(this.comments=this.ignoreTheseCommentsTemporarily,delete this.ignoreTheseCommentsTemporarily),unwrapped.ignoreTheseCommentsTemporarily&&(unwrapped.comments=unwrapped.ignoreTheseCommentsTemporarily,delete unwrapped.ignoreTheseCommentsTemporarily),fragments}},{key:\"compileNodeWithoutComments\",value:function compileNodeWithoutComments(o,lvl){return this.compileWithoutComments(o,lvl,\"compileNode\")}},{key:\"compileToFragments\",value:function compileToFragments(o,lvl){var fragments,node;return o=extend({},o),lvl&&(o.level=lvl),node=this.unfoldSoak(o)||this,node.tab=o.indent,fragments=o.level!==LEVEL_TOP&&node.isStatement(o)?node.compileClosure(o):node.compileNode(o),this.compileCommentFragments(o,node,fragments),fragments}},{key:\"compileToFragmentsWithoutComments\",value:function compileToFragmentsWithoutComments(o,lvl){return this.compileWithoutComments(o,lvl,\"compileToFragments\")}},{key:\"compileClosure\",value:function compileClosure(o){var args,argumentsNode,func,meth,parts,ref1,ref2;switch(this.checkForPureStatementInExpression(),o.sharedScope=!0,func=new Code([],Block.wrap([this])),args=[],this.contains(function(node){return node instanceof SuperCall})?func.bound=!0:((argumentsNode=this.contains(isLiteralArguments))||this.contains(isLiteralThis))&&(args=[new ThisLiteral],argumentsNode?(meth=\"apply\",args.push(new IdentifierLiteral(\"arguments\"))):meth=\"call\",func=new Value(func,[new Access(new PropertyName(meth))])),parts=new Call(func,args).compileNode(o),!1){case!(func.isGenerator||(null==(ref1=func.base)?void 0:ref1.isGenerator)):parts.unshift(this.makeCode(\"(yield* \")),parts.push(this.makeCode(\")\"));break;case!(func.isAsync||(null==(ref2=func.base)?void 0:ref2.isAsync)):parts.unshift(this.makeCode(\"(await \")),parts.push(this.makeCode(\")\"));}return parts}},{key:\"compileCommentFragments\",value:function compileCommentFragments(o,node,fragments){var base1,base2,comment,commentFragment,j,len1,ref1,unshiftCommentFragment;if(!node.comments)return fragments;for(unshiftCommentFragment=function(commentFragment){var precedingFragment;return commentFragment.unshift?unshiftAfterComments(fragments,commentFragment):(0!==fragments.length&&(precedingFragment=fragments[fragments.length-1],commentFragment.newLine&&\"\"!==precedingFragment.code&&!/\\n\\s*$/.test(precedingFragment.code)&&(commentFragment.code=\"\\n\".concat(commentFragment.code))),fragments.push(commentFragment))},ref1=node.comments,(j=0,len1=ref1.length);j<len1;j++)(comment=ref1[j],!!(0>indexOf.call(this.compiledComments,comment)))&&(this.compiledComments.push(comment),commentFragment=comment.here?new HereComment(comment).compileNode(o):new LineComment(comment).compileNode(o),commentFragment.isHereComment&&!commentFragment.newLine||node.includeCommentFragments()?unshiftCommentFragment(commentFragment):(0===fragments.length&&fragments.push(this.makeCode(\"\")),commentFragment.unshift?(null==(base1=fragments[0]).precedingComments&&(base1.precedingComments=[]),fragments[0].precedingComments.push(commentFragment)):(null==(base2=fragments[fragments.length-1]).followingComments&&(base2.followingComments=[]),fragments[fragments.length-1].followingComments.push(commentFragment))));return fragments}},{key:\"cache\",value:function cache(o,level,shouldCache){var complex,ref,sub;return complex=null==shouldCache?this.shouldCache():shouldCache(this),complex?(ref=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),sub=new Assign(ref,this),level?[sub.compileToFragments(o,level),[this.makeCode(ref.value)]]:[sub,ref]):(ref=level?this.compileToFragments(o,level):this,[ref,ref])}},{key:\"hoist\",value:function hoist(){var compileNode,compileToFragments,target;return this.hoisted=!0,target=new HoistTarget(this),compileNode=this.compileNode,compileToFragments=this.compileToFragments,this.compileNode=function(o){return target.update(compileNode,o)},this.compileToFragments=function(o){return target.update(compileToFragments,o)},target}},{key:\"cacheToCodeFragments\",value:function cacheToCodeFragments(cacheValues){return[fragmentsToText(cacheValues[0]),fragmentsToText(cacheValues[1])]}},{key:\"makeReturn\",value:function makeReturn(results,mark){var node;return mark?void(this.canBeReturned=!0):(node=this.unwrapAll(),results?new Call(new Literal(\"\".concat(results,\".push\")),[node]):new Return(node))}},{key:\"contains\",value:function contains(pred){var node;return node=void 0,this.traverseChildren(!1,function(n){if(pred(n))return node=n,!1}),node}},{key:\"lastNode\",value:function lastNode(list){return 0===list.length?null:list[list.length-1]}},{key:\"toString\",value:function toString(){var idt=0<arguments.length&&void 0!==arguments[0]?arguments[0]:\"\",name=1<arguments.length&&void 0!==arguments[1]?arguments[1]:this.constructor.name,tree;return tree=\"\\n\"+idt+name,this.soak&&(tree+=\"?\"),this.eachChild(function(node){return tree+=node.toString(idt+TAB)}),tree}},{key:\"checkForPureStatementInExpression\",value:function checkForPureStatementInExpression(){var jumpNode;if(jumpNode=this.jumps())return jumpNode.error(\"cannot use a pure statement in an expression\")}},{key:\"ast\",value:function ast(o,level){var astNode;return o=this.astInitialize(o,level),astNode=this.astNode(o),null!=this.astNode&&this.canBeReturned&&Object.assign(astNode,{returns:!0}),astNode}},{key:\"astInitialize\",value:function astInitialize(o,level){return o=Object.assign({},o),null!=level&&(o.level=level),o.level>LEVEL_TOP&&this.checkForPureStatementInExpression(),this.isStatement(o)&&o.level!==LEVEL_TOP&&null!=o.scope&&this.makeReturn(null,!0),o}},{key:\"astNode\",value:function astNode(o){return Object.assign({},{type:this.astType(o)},this.astProperties(o),this.astLocationData())}},{key:\"astProperties\",value:function astProperties(){return{}}},{key:\"astType\",value:function astType(){return this.constructor.name}},{key:\"astLocationData\",value:function astLocationData(){return jisonLocationDataToAstLocationData(this.locationData)}},{key:\"isStatementAst\",value:function isStatementAst(o){return this.isStatement(o)}},{key:\"eachChild\",value:function eachChild(func){var attr,child,j,k,len1,len2,ref1,ref2;if(!this.children)return this;for(ref1=this.children,j=0,len1=ref1.length;j<len1;j++)if(attr=ref1[j],this[attr])for(ref2=flatten([this[attr]]),k=0,len2=ref2.length;k<len2;k++)if(child=ref2[k],!1===func(child))return this;return this}},{key:\"traverseChildren\",value:function traverseChildren(crossScope,func){return this.eachChild(function(child){var recur;if(recur=func(child),!1!==recur)return child.traverseChildren(crossScope,func)})}},{key:\"replaceInContext\",value:function replaceInContext(match,replacement){var attr,child,children,i,j,k,len1,len2,ref1,ref2;if(!this.children)return!1;for(ref1=this.children,j=0,len1=ref1.length;j<len1;j++)if(attr=ref1[j],children=this[attr])if(Array.isArray(children))for(i=k=0,len2=children.length;k<len2;i=++k){if(child=children[i],match(child))return splice.apply(children,[i,i-i+1].concat(ref2=replacement(child,this))),ref2,!0;if(child.replaceInContext(match,replacement))return!0}else{if(match(children))return this[attr]=replacement(children,this),!0;if(children.replaceInContext(match,replacement))return!0}}},{key:\"invert\",value:function invert(){return new Op(\"!\",this)}},{key:\"unwrapAll\",value:function unwrapAll(){var node;for(node=this;node!==(node=node.unwrap());)continue;return node}},{key:\"updateLocationDataIfMissing\",value:function updateLocationDataIfMissing(locationData,force){return(force&&(this.forceUpdateLocation=!0),this.locationData&&!this.forceUpdateLocation)?this:(delete this.forceUpdateLocation,this.locationData=locationData,this.eachChild(function(child){return child.updateLocationDataIfMissing(locationData)}))}},{key:\"withLocationDataFrom\",value:function withLocationDataFrom(_ref19){var locationData=_ref19.locationData;return this.updateLocationDataIfMissing(locationData)}},{key:\"withLocationDataAndCommentsFrom\",value:function withLocationDataAndCommentsFrom(node){var comments;return this.withLocationDataFrom(node),comments=node.comments,(null==comments?void 0:comments.length)&&(this.comments=comments),this}},{key:\"error\",value:function error(message){return throwSyntaxError(message,this.locationData)}},{key:\"makeCode\",value:function makeCode(code){return new CodeFragment(this,code)}},{key:\"wrapInParentheses\",value:function wrapInParentheses(fragments){return[this.makeCode(\"(\")].concat(_toConsumableArray(fragments),[this.makeCode(\")\")])}},{key:\"wrapInBraces\",value:function wrapInBraces(fragments){return[this.makeCode(\"{\")].concat(_toConsumableArray(fragments),[this.makeCode(\"}\")])}},{key:\"joinFragmentArrays\",value:function joinFragmentArrays(fragmentsList,joinStr){var answer,fragments,i,j,len1;for(answer=[],i=j=0,len1=fragmentsList.length;j<len1;i=++j)fragments=fragmentsList[i],i&&answer.push(this.makeCode(joinStr)),answer=answer.concat(fragments);return answer}}]),Base}();return Base.prototype.children=[],Base.prototype.isStatement=NO,Base.prototype.compiledComments=[],Base.prototype.includeCommentFragments=NO,Base.prototype.jumps=NO,Base.prototype.shouldCache=YES,Base.prototype.isChainable=NO,Base.prototype.isAssignable=NO,Base.prototype.isNumber=NO,Base.prototype.unwrap=THIS,Base.prototype.unfoldSoak=NO,Base.prototype.assigns=NO,Base}.call(this),exports.HoistTarget=HoistTarget=function(_Base){\"use strict\";function HoistTarget(source1){var _this8;return _classCallCheck(this,HoistTarget),_this8=_super.call(this),_this8.source=source1,_this8.options={},_this8.targetFragments={fragments:[]},_this8}_inherits(HoistTarget,_Base);var _super=_createSuper(HoistTarget);return _createClass(HoistTarget,[{key:\"isStatement\",value:function isStatement(o){return this.source.isStatement(o)}},{key:\"update\",value:function update(compile,o){return this.targetFragments.fragments=compile.call(this.source,merge(o,this.options))}},{key:\"compileToFragments\",value:function compileToFragments(o,level){return this.options.indent=o.indent,this.options.level=null==level?o.level:level,[this.targetFragments]}},{key:\"compileNode\",value:function compileNode(o){return this.compileToFragments(o)}},{key:\"compileClosure\",value:function compileClosure(o){return this.compileToFragments(o)}}],[{key:\"expand\",value:function expand(fragments){var fragment,i,j,ref1;for(i=j=fragments.length-1;0<=j;i=j+=-1)fragment=fragments[i],fragment.fragments&&(splice.apply(fragments,[i,i-i+1].concat(ref1=this.expand(fragment.fragments))),ref1);return fragments}}]),HoistTarget}(Base),exports.Root=Root=function(){var Root=function(_Base2){\"use strict\";function Root(body1){var _this9;return _classCallCheck(this,Root),_this9=_super2.call(this),_this9.body=body1,_this9.isAsync=new Code([],_this9.body).isAsync,_this9}_inherits(Root,_Base2);var _super2=_createSuper(Root);return _createClass(Root,[{key:\"compileNode\",value:function compileNode(o){var fragments,functionKeyword;return(o.indent=o.bare?\"\":TAB,o.level=LEVEL_TOP,o.compiling=!0,this.initializeScope(o),fragments=this.body.compileRoot(o),o.bare)?fragments:(functionKeyword=\"\".concat(this.isAsync?\"async \":\"\",\"function\"),[].concat(this.makeCode(\"(\".concat(functionKeyword,\"() {\\n\")),fragments,this.makeCode(\"\\n}).call(this);\\n\")))}},{key:\"initializeScope\",value:function initializeScope(o){var j,len1,name,ref1,ref2,results1;for(o.scope=new Scope(null,this.body,null,null==(ref1=o.referencedVars)?[]:ref1),ref2=o.locals||[],results1=[],(j=0,len1=ref2.length);j<len1;j++)name=ref2[j],results1.push(o.scope.parameter(name));return results1}},{key:\"commentsAst\",value:function commentsAst(){var comment,commentToken,j,len1,ref1,results1;for(null==this.allComments&&(this.allComments=function(){var j,len1,ref1,ref2,results1;for(ref2=null==(ref1=this.allCommentTokens)?[]:ref1,results1=[],(j=0,len1=ref2.length);j<len1;j++)commentToken=ref2[j],commentToken.heregex||(commentToken.here?results1.push(new HereComment(commentToken)):results1.push(new LineComment(commentToken)));return results1}.call(this)),ref1=this.allComments,results1=[],(j=0,len1=ref1.length);j<len1;j++)comment=ref1[j],results1.push(comment.ast());return results1}},{key:\"astNode\",value:function astNode(o){return o.level=LEVEL_TOP,this.initializeScope(o),_get(_getPrototypeOf(Root.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"File\"}},{key:\"astProperties\",value:function astProperties(o){return this.body.isRootBlock=!0,{program:Object.assign(this.body.ast(o),this.astLocationData()),comments:this.commentsAst()}}}]),Root}(Base);return Root.prototype.children=[\"body\"],Root}.call(this),exports.Block=Block=function(){var Block=function(_Base3){\"use strict\";function Block(nodes){var _this10;return _classCallCheck(this,Block),_this10=_super3.call(this),_this10.expressions=compact(flatten(nodes||[])),_this10}_inherits(Block,_Base3);var _super3=_createSuper(Block);return _createClass(Block,[{key:\"push\",value:function push(node){return this.expressions.push(node),this}},{key:\"pop\",value:function pop(){return this.expressions.pop()}},{key:\"unshift\",value:function unshift(node){return this.expressions.unshift(node),this}},{key:\"unwrap\",value:function unwrap(){return 1===this.expressions.length?this.expressions[0]:this}},{key:\"isEmpty\",value:function isEmpty(){return!this.expressions.length}},{key:\"isStatement\",value:function isStatement(o){var exp,j,len1,ref1;for(ref1=this.expressions,j=0,len1=ref1.length;j<len1;j++)if(exp=ref1[j],exp.isStatement(o))return!0;return!1}},{key:\"jumps\",value:function jumps(o){var exp,j,jumpNode,len1,ref1;for(ref1=this.expressions,j=0,len1=ref1.length;j<len1;j++)if(exp=ref1[j],jumpNode=exp.jumps(o))return jumpNode}},{key:\"makeReturn\",value:function makeReturn(results,mark){var _slice1$call,_slice1$call2,expr,expressions,last,lastExp,len,penult,ref1,ref2;if(len=this.expressions.length,ref1=this.expressions,_slice1$call=slice1.call(ref1,-1),_slice1$call2=_slicedToArray(_slice1$call,1),lastExp=_slice1$call2[0],_slice1$call,lastExp=(null==lastExp?void 0:lastExp.unwrap())||!1,lastExp&&lastExp instanceof Parens&&1<lastExp.body.expressions.length){var _lastExp=lastExp;expressions=_lastExp.body.expressions;var _slice1$call3=slice1.call(expressions,-2),_slice1$call4=_slicedToArray(_slice1$call3,2);penult=_slice1$call4[0],last=_slice1$call4[1],penult=penult.unwrap(),last=last.unwrap(),penult instanceof JSXElement&&last instanceof JSXElement&&expressions[expressions.length-1].error(\"Adjacent JSX elements must be wrapped in an enclosing tag\")}if(mark)return void(null!=(ref2=this.expressions[len-1])&&ref2.makeReturn(results,mark));for(;len--;){expr=this.expressions[len],this.expressions[len]=expr.makeReturn(results),expr instanceof Return&&!expr.expression&&this.expressions.splice(len,1);break}return this}},{key:\"compile\",value:function compile(o,lvl){return o.scope?_get(_getPrototypeOf(Block.prototype),\"compile\",this).call(this,o,lvl):new Root(this).withLocationDataFrom(this).compile(o,lvl)}},{key:\"compileNode\",value:function compileNode(o){var answer,compiledNodes,fragments,index,j,lastFragment,len1,node,ref1,top;for(this.tab=o.indent,top=o.level===LEVEL_TOP,compiledNodes=[],ref1=this.expressions,(index=j=0,len1=ref1.length);j<len1;index=++j){if(node=ref1[index],node.hoisted){node.compileToFragments(o);continue}if(node=node.unfoldSoak(o)||node,node instanceof Block)compiledNodes.push(node.compileNode(o));else if(top){if(node.front=!0,fragments=node.compileToFragments(o),!node.isStatement(o)){fragments=indentInitial(fragments,this);var _slice1$call5=slice1.call(fragments,-1),_slice1$call6=_slicedToArray(_slice1$call5,1);lastFragment=_slice1$call6[0],\"\"===lastFragment.code||lastFragment.isComment||fragments.push(this.makeCode(\";\"))}compiledNodes.push(fragments)}else compiledNodes.push(node.compileToFragments(o,LEVEL_LIST))}return top?this.spaced?[].concat(this.joinFragmentArrays(compiledNodes,\"\\n\\n\"),this.makeCode(\"\\n\")):this.joinFragmentArrays(compiledNodes,\"\\n\"):(answer=compiledNodes.length?this.joinFragmentArrays(compiledNodes,\", \"):[this.makeCode(\"void 0\")],1<compiledNodes.length&&o.level>=LEVEL_LIST?this.wrapInParentheses(answer):answer)}},{key:\"compileRoot\",value:function compileRoot(o){var fragments;return this.spaced=!0,fragments=this.compileWithDeclarations(o),HoistTarget.expand(fragments),this.compileComments(fragments)}},{key:\"compileWithDeclarations\",value:function compileWithDeclarations(o){var assigns,declaredVariable,declaredVariables,declaredVariablesIndex,declars,exp,fragments,i,j,k,len1,len2,post,ref1,rest,scope,spaced;for(fragments=[],post=[],ref1=this.expressions,(i=j=0,len1=ref1.length);j<len1&&(exp=ref1[i],exp=exp.unwrap(),!!(exp instanceof Literal));i=++j);if(o=merge(o,{level:LEVEL_TOP}),i){rest=this.expressions.splice(i,9e9);var _ref20=[this.spaced,!1];spaced=_ref20[0],this.spaced=_ref20[1];var _ref21=[this.compileNode(o),spaced];fragments=_ref21[0],this.spaced=_ref21[1],this.expressions=rest}post=this.compileNode(o);var _o2=o;if(scope=_o2.scope,scope.expressions===this)if(declars=o.scope.hasDeclarations(),assigns=scope.hasAssignments,declars||assigns){if(i&&fragments.push(this.makeCode(\"\\n\")),fragments.push(this.makeCode(\"\".concat(this.tab,\"var \"))),declars)for(declaredVariables=scope.declaredVariables(),declaredVariablesIndex=k=0,len2=declaredVariables.length;k<len2;declaredVariablesIndex=++k){if(declaredVariable=declaredVariables[declaredVariablesIndex],fragments.push(this.makeCode(declaredVariable)),Object.prototype.hasOwnProperty.call(o.scope.comments,declaredVariable)){var _fragments;(_fragments=fragments).push.apply(_fragments,_toConsumableArray(o.scope.comments[declaredVariable]))}declaredVariablesIndex!==declaredVariables.length-1&&fragments.push(this.makeCode(\", \"))}assigns&&(declars&&fragments.push(this.makeCode(\",\\n\".concat(this.tab+TAB))),fragments.push(this.makeCode(scope.assignedVariables().join(\",\\n\".concat(this.tab+TAB))))),fragments.push(this.makeCode(\";\\n\".concat(this.spaced?\"\\n\":\"\")))}else fragments.length&&post.length&&fragments.push(this.makeCode(\"\\n\"));return fragments.concat(post)}},{key:\"compileComments\",value:function compileComments(fragments){var code,commentFragment,fragment,fragmentIndent,fragmentIndex,indent,j,k,l,len1,len2,len3,newLineIndex,onNextLine,p,pastFragment,pastFragmentIndex,q,ref1,ref2,ref3,ref4,trail,upcomingFragment,upcomingFragmentIndex;for(fragmentIndex=j=0,len1=fragments.length;j<len1;fragmentIndex=++j){if(fragment=fragments[fragmentIndex],fragment.precedingComments){for(fragmentIndent=\"\",ref1=fragments.slice(0,fragmentIndex+1),k=ref1.length-1;0<=k;k+=-1)if(pastFragment=ref1[k],indent=/^ {2,}/m.exec(pastFragment.code),indent){fragmentIndent=indent[0];break}else if(0<=indexOf.call(pastFragment.code,\"\\n\"))break;for(code=\"\\n\".concat(fragmentIndent)+function(){var l,len2,ref2,results1;for(ref2=fragment.precedingComments,results1=[],(l=0,len2=ref2.length);l<len2;l++)commentFragment=ref2[l],commentFragment.isHereComment&&commentFragment.multiline?results1.push(multident(commentFragment.code,fragmentIndent,!1)):results1.push(commentFragment.code);return results1}().join(\"\\n\".concat(fragmentIndent)).replace(/^(\\s*)$/gm,\"\"),ref2=fragments.slice(0,fragmentIndex+1),pastFragmentIndex=l=ref2.length-1;0<=l;pastFragmentIndex=l+=-1){if(pastFragment=ref2[pastFragmentIndex],newLineIndex=pastFragment.code.lastIndexOf(\"\\n\"),-1===newLineIndex)if(0===pastFragmentIndex)pastFragment.code=\"\\n\"+pastFragment.code,newLineIndex=0;else if(pastFragment.isStringWithInterpolations&&\"{\"===pastFragment.code)code=code.slice(1)+\"\\n\",newLineIndex=1;else continue;delete fragment.precedingComments,pastFragment.code=pastFragment.code.slice(0,newLineIndex)+code+pastFragment.code.slice(newLineIndex);break}}if(fragment.followingComments){if(trail=fragment.followingComments[0].trail,fragmentIndent=\"\",!(trail&&1===fragment.followingComments.length))for(onNextLine=!1,ref3=fragments.slice(fragmentIndex),(p=0,len2=ref3.length);p<len2;p++)if(upcomingFragment=ref3[p],!onNextLine){if(0<=indexOf.call(upcomingFragment.code,\"\\n\"))onNextLine=!0;else continue;}else if(indent=/^ {2,}/m.exec(upcomingFragment.code),indent){fragmentIndent=indent[0];break}else if(0<=indexOf.call(upcomingFragment.code,\"\\n\"))break;for(code=1===fragmentIndex&&/^\\s+$/.test(fragments[0].code)?\"\":trail?\" \":\"\\n\".concat(fragmentIndent),code+=function(){var len3,q,ref4,results1;for(ref4=fragment.followingComments,results1=[],(q=0,len3=ref4.length);q<len3;q++)commentFragment=ref4[q],commentFragment.isHereComment&&commentFragment.multiline?results1.push(multident(commentFragment.code,fragmentIndent,!1)):results1.push(commentFragment.code);return results1}().join(\"\\n\".concat(fragmentIndent)).replace(/^(\\s*)$/gm,\"\"),ref4=fragments.slice(fragmentIndex),(upcomingFragmentIndex=q=0,len3=ref4.length);q<len3;upcomingFragmentIndex=++q){if(upcomingFragment=ref4[upcomingFragmentIndex],newLineIndex=upcomingFragment.code.indexOf(\"\\n\"),-1===newLineIndex)if(upcomingFragmentIndex===fragments.length-1)upcomingFragment.code+=\"\\n\",newLineIndex=upcomingFragment.code.length;else if(upcomingFragment.isStringWithInterpolations&&\"}\"===upcomingFragment.code)code=\"\".concat(code,\"\\n\"),newLineIndex=0;else continue;delete fragment.followingComments,\"\\n\"===upcomingFragment.code&&(code=code.replace(/^\\n/,\"\")),upcomingFragment.code=upcomingFragment.code.slice(0,newLineIndex)+code+upcomingFragment.code.slice(newLineIndex);break}}}return fragments}},{key:\"astNode\",value:function astNode(o){return null!=o.level&&o.level!==LEVEL_TOP&&this.expressions.length?new Sequence(this.expressions).withLocationDataFrom(this).ast(o):_get(_getPrototypeOf(Block.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isRootBlock?\"Program\":this.isClassBody?\"ClassBody\":\"BlockStatement\"}},{key:\"astProperties\",value:function astProperties(o){var body,checkForDirectives,directives,expression,expressionAst,j,len1,ref1;for(checkForDirectives=del(o,\"checkForDirectives\"),(this.isRootBlock||checkForDirectives)&&sniffDirectives(this.expressions,{notFinalExpression:checkForDirectives}),directives=[],body=[],ref1=this.expressions,(j=0,len1=ref1.length);j<len1;j++)if(expression=ref1[j],expressionAst=expression.ast(o),null==expressionAst)continue;else expression instanceof Directive?directives.push(expressionAst):expression.isStatementAst(o)?body.push(expressionAst):body.push(Object.assign({type:\"ExpressionStatement\",expression:expressionAst},expression.astLocationData()));return{body:body,directives:directives}}},{key:\"astLocationData\",value:function astLocationData(){return this.isRootBlock&&null==this.locationData?void 0:_get(_getPrototypeOf(Block.prototype),\"astLocationData\",this).call(this)}}],[{key:\"wrap\",value:function wrap(nodes){return 1===nodes.length&&nodes[0]instanceof Block?nodes[0]:new Block(nodes)}}]),Block}(Base);return Block.prototype.children=[\"expressions\"],Block}.call(this),exports.Directive=Directive=function(_Base4){\"use strict\";function Directive(value1){var _this11;return _classCallCheck(this,Directive),_this11=_super4.call(this),_this11.value=value1,_this11}_inherits(Directive,_Base4);var _super4=_createSuper(Directive);return _createClass(Directive,[{key:\"astProperties\",value:function astProperties(o){return{value:Object.assign({},this.value.ast(o),{type:\"DirectiveLiteral\"})}}}]),Directive}(Base),exports.Literal=Literal=function(){var Literal=function(_Base5){\"use strict\";function Literal(value1){var _this12;return _classCallCheck(this,Literal),_this12=_super5.call(this),_this12.value=value1,_this12}_inherits(Literal,_Base5);var _super5=_createSuper(Literal);return _createClass(Literal,[{key:\"assigns\",value:function assigns(name){return name===this.value}},{key:\"compileNode\",value:function compileNode(){return[this.makeCode(this.value)]}},{key:\"astProperties\",value:function astProperties(){return{value:this.value}}},{key:\"toString\",value:function toString(){return\" \".concat(this.isStatement()?_get(_getPrototypeOf(Literal.prototype),\"toString\",this).call(this):this.constructor.name,\": \").concat(this.value)}}]),Literal}(Base);return Literal.prototype.shouldCache=NO,Literal}.call(this),exports.NumberLiteral=NumberLiteral=function(_Literal){\"use strict\";function NumberLiteral(value1){var _ref22=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},parsedValue=_ref22.parsedValue,_this13;return _classCallCheck(this,NumberLiteral),_this13=_super6.call(this),_this13.value=value1,_this13.parsedValue=parsedValue,null==_this13.parsedValue&&(isNumber(_this13.value)?(_this13.parsedValue=_this13.value,_this13.value=\"\".concat(_this13.value)):_this13.parsedValue=parseNumber(_this13.value)),_this13}_inherits(NumberLiteral,_Literal);var _super6=_createSuper(NumberLiteral);return _createClass(NumberLiteral,[{key:\"isBigInt\",value:function isBigInt(){return /n$/.test(this.value)}},{key:\"astType\",value:function astType(){return this.isBigInt()?\"BigIntLiteral\":\"NumericLiteral\"}},{key:\"astProperties\",value:function astProperties(){return{value:this.isBigInt()?this.parsedValue.toString():this.parsedValue,extra:{rawValue:this.isBigInt()?this.parsedValue.toString():this.parsedValue,raw:this.value}}}}]),NumberLiteral}(Literal),exports.InfinityLiteral=InfinityLiteral=function(_NumberLiteral){\"use strict\";function InfinityLiteral(value1){var _ref23=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref23$originalValue=_ref23.originalValue,originalValue=void 0===_ref23$originalValue?\"Infinity\":_ref23$originalValue,_this14;return _classCallCheck(this,InfinityLiteral),_this14=_super7.call(this),_this14.value=value1,_this14.originalValue=originalValue,_this14}_inherits(InfinityLiteral,_NumberLiteral);var _super7=_createSuper(InfinityLiteral);return _createClass(InfinityLiteral,[{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\"2e308\")]}},{key:\"astNode\",value:function astNode(o){return\"Infinity\"===this.originalValue?_get(_getPrototypeOf(InfinityLiteral.prototype),\"astNode\",this).call(this,o):new NumberLiteral(this.value).withLocationDataFrom(this).ast(o)}},{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:\"Infinity\",declaration:!1}}}]),InfinityLiteral}(NumberLiteral),exports.NaNLiteral=NaNLiteral=function(_NumberLiteral2){\"use strict\";function NaNLiteral(){return _classCallCheck(this,NaNLiteral),_super8.call(this,\"NaN\")}_inherits(NaNLiteral,_NumberLiteral2);var _super8=_createSuper(NaNLiteral);return _createClass(NaNLiteral,[{key:\"compileNode\",value:function compileNode(o){var code;return code=[this.makeCode(\"0/0\")],o.level>=LEVEL_OP?this.wrapInParentheses(code):code}},{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:\"NaN\",declaration:!1}}}]),NaNLiteral}(NumberLiteral),exports.StringLiteral=StringLiteral=function(_Literal2){\"use strict\";function StringLiteral(originalValue){var _ref24=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},quote=_ref24.quote,initialChunk=_ref24.initialChunk,finalChunk=_ref24.finalChunk,indent1=_ref24.indent,double1=_ref24.double,heregex1=_ref24.heregex,_this15;_classCallCheck(this,StringLiteral);var heredoc,indentRegex,val;return _this15=_super9.call(this,\"\"),_this15.originalValue=originalValue,_this15.quote=quote,_this15.initialChunk=initialChunk,_this15.finalChunk=finalChunk,_this15.indent=indent1,_this15.double=double1,_this15.heregex=heregex1,\"///\"===_this15.quote&&(_this15.quote=null),_this15.fromSourceString=null!=_this15.quote,null==_this15.quote&&(_this15.quote=\"\\\"\"),heredoc=_this15.isFromHeredoc(),val=_this15.originalValue,_this15.heregex?(val=val.replace(HEREGEX_OMIT,\"$1$2\"),val=replaceUnicodeCodePointEscapes(val,{flags:_this15.heregex.flags})):(val=val.replace(STRING_OMIT,\"$1\"),val=_this15.fromSourceString?heredoc?(_this15.indent?indentRegex=RegExp(\"\\\\n\".concat(_this15.indent),\"g\"):void 0,indentRegex?val=val.replace(indentRegex,\"\\n\"):void 0,_this15.initialChunk?val=val.replace(LEADING_BLANK_LINE,\"\"):void 0,_this15.finalChunk?val=val.replace(TRAILING_BLANK_LINE,\"\"):void 0,val):val.replace(SIMPLE_STRING_OMIT,function(match,offset){return _this15.initialChunk&&0===offset||_this15.finalChunk&&offset+match.length===val.length?\"\":\" \"}):val),_this15.delimiter=_this15.quote.charAt(0),_this15.value=makeDelimitedLiteral(val,{delimiter:_this15.delimiter,double:_this15.double}),_this15.unquotedValueForTemplateLiteral=makeDelimitedLiteral(val,{delimiter:\"`\",double:_this15.double,escapeNewlines:!1,includeDelimiters:!1,convertTrailingNullEscapes:!0}),_this15.unquotedValueForJSX=makeDelimitedLiteral(val,{double:_this15.double,escapeNewlines:!1,includeDelimiters:!1,escapeDelimiter:!1}),_this15}_inherits(StringLiteral,_Literal2);var _super9=_createSuper(StringLiteral);return _createClass(StringLiteral,[{key:\"compileNode\",value:function compileNode(o){return this.shouldGenerateTemplateLiteral()?StringWithInterpolations.fromStringLiteral(this).compileNode(o):this.jsx?[this.makeCode(this.unquotedValueForJSX)]:_get(_getPrototypeOf(StringLiteral.prototype),\"compileNode\",this).call(this,o)}},{key:\"withoutQuotesInLocationData\",value:function withoutQuotesInLocationData(){var copy,endsWithNewline,locationData;return endsWithNewline=\"\\n\"===this.originalValue.slice(-1),locationData=Object.assign({},this.locationData),locationData.first_column+=this.quote.length,endsWithNewline?(locationData.last_line-=1,locationData.last_column=locationData.last_line===locationData.first_line?locationData.first_column+this.originalValue.length-\"\\n\".length:this.originalValue.slice(0,-1).length-\"\\n\".length-this.originalValue.slice(0,-1).lastIndexOf(\"\\n\")):locationData.last_column-=this.quote.length,locationData.last_column_exclusive-=this.quote.length,locationData.range=[locationData.range[0]+this.quote.length,locationData.range[1]-this.quote.length],copy=new StringLiteral(this.originalValue,{quote:this.quote,initialChunk:this.initialChunk,finalChunk:this.finalChunk,indent:this.indent,double:this.double,heregex:this.heregex}),copy.locationData=locationData,copy}},{key:\"isFromHeredoc\",value:function isFromHeredoc(){return 3===this.quote.length}},{key:\"shouldGenerateTemplateLiteral\",value:function shouldGenerateTemplateLiteral(){return this.isFromHeredoc()}},{key:\"astNode\",value:function astNode(o){return this.shouldGenerateTemplateLiteral()?StringWithInterpolations.fromStringLiteral(this).ast(o):_get(_getPrototypeOf(StringLiteral.prototype),\"astNode\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(){return{value:this.originalValue,extra:{raw:\"\".concat(this.delimiter).concat(this.originalValue).concat(this.delimiter)}}}}]),StringLiteral}(Literal),exports.RegexLiteral=RegexLiteral=function(){var RegexLiteral=function(_Literal3){\"use strict\";function RegexLiteral(value){var _ref25=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref25$delimiter=_ref25.delimiter,delimiter1=void 0===_ref25$delimiter?\"/\":_ref25$delimiter,_ref25$heregexComment=_ref25.heregexCommentTokens,heregexCommentTokens=void 0===_ref25$heregexComment?[]:_ref25$heregexComment,_this16;_classCallCheck(this,RegexLiteral);var endDelimiterIndex,heregex,val;return _this16=_super10.call(this,\"\"),_this16.delimiter=delimiter1,_this16.heregexCommentTokens=heregexCommentTokens,heregex=\"///\"===_this16.delimiter,endDelimiterIndex=value.lastIndexOf(\"/\"),_this16.flags=value.slice(endDelimiterIndex+1),val=_this16.originalValue=value.slice(1,endDelimiterIndex),heregex&&(val=val.replace(HEREGEX_OMIT,\"$1$2\")),val=replaceUnicodeCodePointEscapes(val,{flags:_this16.flags}),_this16.value=\"\".concat(makeDelimitedLiteral(val,{delimiter:\"/\"})).concat(_this16.flags),_this16}_inherits(RegexLiteral,_Literal3);var _super10=_createSuper(RegexLiteral);return _createClass(RegexLiteral,[{key:\"astType\",value:function astType(){return\"RegExpLiteral\"}},{key:\"astProperties\",value:function astProperties(o){var _this$REGEX_REGEX$exe=this.REGEX_REGEX.exec(this.value),_this$REGEX_REGEX$exe2=_slicedToArray(_this$REGEX_REGEX$exe,2),heregexCommentToken,pattern;return pattern=_this$REGEX_REGEX$exe2[1],{value:void 0,pattern:pattern,flags:this.flags,delimiter:this.delimiter,originalPattern:this.originalValue,extra:{raw:this.value,originalRaw:\"\".concat(this.delimiter).concat(this.originalValue).concat(this.delimiter).concat(this.flags),rawValue:void 0},comments:function(){var j,len1,ref1,results1;for(ref1=this.heregexCommentTokens,results1=[],(j=0,len1=ref1.length);j<len1;j++)heregexCommentToken=ref1[j],heregexCommentToken.here?results1.push(new HereComment(heregexCommentToken).ast(o)):results1.push(new LineComment(heregexCommentToken).ast(o));return results1}.call(this)}}}]),RegexLiteral}(Literal);return RegexLiteral.prototype.REGEX_REGEX=/^\\/(.*)\\/\\w*$/,RegexLiteral}.call(this),exports.PassthroughLiteral=PassthroughLiteral=function(_Literal4){\"use strict\";function PassthroughLiteral(originalValue){var _ref26=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},here=_ref26.here,generated=_ref26.generated,_this17;return _classCallCheck(this,PassthroughLiteral),_this17=_super11.call(this,\"\"),_this17.originalValue=originalValue,_this17.here=here,_this17.generated=generated,_this17.value=_this17.originalValue.replace(/\\\\+(`|$)/g,function(string){var _Mathceil=Math.ceil;return string.slice(-_Mathceil(string.length/2))}),_this17}_inherits(PassthroughLiteral,_Literal4);var _super11=_createSuper(PassthroughLiteral);return _createClass(PassthroughLiteral,[{key:\"astNode\",value:function astNode(o){return this.generated?null:_get(_getPrototypeOf(PassthroughLiteral.prototype),\"astNode\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(){return{value:this.originalValue,here:!!this.here}}}]),PassthroughLiteral}(Literal),exports.IdentifierLiteral=IdentifierLiteral=function(){var IdentifierLiteral=function(_Literal5){\"use strict\";function IdentifierLiteral(){return _classCallCheck(this,IdentifierLiteral),_super12.apply(this,arguments)}_inherits(IdentifierLiteral,_Literal5);var _super12=_createSuper(IdentifierLiteral);return _createClass(IdentifierLiteral,[{key:\"eachName\",value:function eachName(iterator){return iterator(this)}},{key:\"astType\",value:function astType(){return this.jsx?\"JSXIdentifier\":\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:this.value,declaration:!!this.isDeclaration}}}]),IdentifierLiteral}(Literal);return IdentifierLiteral.prototype.isAssignable=YES,IdentifierLiteral}.call(this),exports.PropertyName=PropertyName=function(){var PropertyName=function(_Literal6){\"use strict\";function PropertyName(){return _classCallCheck(this,PropertyName),_super13.apply(this,arguments)}_inherits(PropertyName,_Literal6);var _super13=_createSuper(PropertyName);return _createClass(PropertyName,[{key:\"astType\",value:function astType(){return this.jsx?\"JSXIdentifier\":\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:this.value,declaration:!1}}}]),PropertyName}(Literal);return PropertyName.prototype.isAssignable=YES,PropertyName}.call(this),exports.ComputedPropertyName=ComputedPropertyName=function(_PropertyName){\"use strict\";function ComputedPropertyName(){return _classCallCheck(this,ComputedPropertyName),_super14.apply(this,arguments)}_inherits(ComputedPropertyName,_PropertyName);var _super14=_createSuper(ComputedPropertyName);return _createClass(ComputedPropertyName,[{key:\"compileNode\",value:function compileNode(o){return[this.makeCode(\"[\")].concat(_toConsumableArray(this.value.compileToFragments(o,LEVEL_LIST)),[this.makeCode(\"]\")])}},{key:\"astNode\",value:function astNode(o){return this.value.ast(o)}}]),ComputedPropertyName}(PropertyName),exports.StatementLiteral=StatementLiteral=function(){var StatementLiteral=function(_Literal7){\"use strict\";function StatementLiteral(){return _classCallCheck(this,StatementLiteral),_super15.apply(this,arguments)}_inherits(StatementLiteral,_Literal7);var _super15=_createSuper(StatementLiteral);return _createClass(StatementLiteral,[{key:\"jumps\",value:function jumps(o){return\"break\"!==this.value||(null==o?void 0:o.loop)||(null==o?void 0:o.block)?\"continue\"!==this.value||null!=o&&o.loop?void 0:this:this}},{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\"\".concat(this.tab).concat(this.value,\";\"))]}},{key:\"astType\",value:function astType(){switch(this.value){case\"continue\":return\"ContinueStatement\";case\"break\":return\"BreakStatement\";case\"debugger\":return\"DebuggerStatement\";}}}]),StatementLiteral}(Literal);return StatementLiteral.prototype.isStatement=YES,StatementLiteral.prototype.makeReturn=THIS,StatementLiteral}.call(this),exports.ThisLiteral=ThisLiteral=function(_Literal8){\"use strict\";function ThisLiteral(value){var _this18;return _classCallCheck(this,ThisLiteral),_this18=_super16.call(this,\"this\"),_this18.shorthand=\"@\"===value,_this18}_inherits(ThisLiteral,_Literal8);var _super16=_createSuper(ThisLiteral);return _createClass(ThisLiteral,[{key:\"compileNode\",value:function compileNode(o){var code,ref1;return code=(null==(ref1=o.scope.method)?void 0:ref1.bound)?o.scope.method.context:this.value,[this.makeCode(code)]}},{key:\"astType\",value:function astType(){return\"ThisExpression\"}},{key:\"astProperties\",value:function astProperties(){return{shorthand:this.shorthand}}}]),ThisLiteral}(Literal),exports.UndefinedLiteral=UndefinedLiteral=function(_Literal9){\"use strict\";function UndefinedLiteral(){return _classCallCheck(this,UndefinedLiteral),_super17.call(this,\"undefined\")}_inherits(UndefinedLiteral,_Literal9);var _super17=_createSuper(UndefinedLiteral);return _createClass(UndefinedLiteral,[{key:\"compileNode\",value:function compileNode(o){return[this.makeCode(o.level>=LEVEL_ACCESS?\"(void 0)\":\"void 0\")]}},{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:this.value,declaration:!1}}}]),UndefinedLiteral}(Literal),exports.NullLiteral=NullLiteral=function(_Literal10){\"use strict\";function NullLiteral(){return _classCallCheck(this,NullLiteral),_super18.call(this,\"null\")}_inherits(NullLiteral,_Literal10);var _super18=_createSuper(NullLiteral);return _createClass(NullLiteral)}(Literal),exports.BooleanLiteral=BooleanLiteral=function(_Literal11){\"use strict\";function BooleanLiteral(value){var _ref27=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},originalValue=_ref27.originalValue,_this19;return _classCallCheck(this,BooleanLiteral),_this19=_super19.call(this,value),_this19.originalValue=originalValue,null==_this19.originalValue&&(_this19.originalValue=_this19.value),_this19}_inherits(BooleanLiteral,_Literal11);var _super19=_createSuper(BooleanLiteral);return _createClass(BooleanLiteral,[{key:\"astProperties\",value:function astProperties(){return{value:\"true\"===this.value,name:this.originalValue}}}]),BooleanLiteral}(Literal),exports.DefaultLiteral=DefaultLiteral=function(_Literal12){\"use strict\";function DefaultLiteral(){return _classCallCheck(this,DefaultLiteral),_super20.apply(this,arguments)}_inherits(DefaultLiteral,_Literal12);var _super20=_createSuper(DefaultLiteral);return _createClass(DefaultLiteral,[{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:\"default\",declaration:!1}}}]),DefaultLiteral}(Literal),exports.Return=Return=function(){var Return=function(_Base6){\"use strict\";function Return(expression1){var _ref28=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},belongsToFuncDirectiveReturn=_ref28.belongsToFuncDirectiveReturn,_this20;return _classCallCheck(this,Return),_this20=_super21.call(this),_this20.expression=expression1,_this20.belongsToFuncDirectiveReturn=belongsToFuncDirectiveReturn,_this20}_inherits(Return,_Base6);var _super21=_createSuper(Return);return _createClass(Return,[{key:\"compileToFragments\",value:function compileToFragments(o,level){var expr,ref1;return expr=null==(ref1=this.expression)?void 0:ref1.makeReturn(),expr&&!(expr instanceof Return)?expr.compileToFragments(o,level):_get(_getPrototypeOf(Return.prototype),\"compileToFragments\",this).call(this,o,level)}},{key:\"compileNode\",value:function compileNode(o){var answer,fragment,j,len1;if(answer=[],this.expression){for(answer=this.expression.compileToFragments(o,LEVEL_PAREN),unshiftAfterComments(answer,this.makeCode(\"\".concat(this.tab,\"return \"))),(j=0,len1=answer.length);j<len1;j++)if(fragment=answer[j],fragment.isHereComment&&0<=indexOf.call(fragment.code,\"\\n\"))fragment.code=multident(fragment.code,this.tab);else if(fragment.isLineComment)fragment.code=\"\".concat(this.tab).concat(fragment.code);else break;}else answer.push(this.makeCode(\"\".concat(this.tab,\"return\")));return answer.push(this.makeCode(\";\")),answer}},{key:\"checkForPureStatementInExpression\",value:function checkForPureStatementInExpression(){return this.belongsToFuncDirectiveReturn?void 0:_get(_getPrototypeOf(Return.prototype),\"checkForPureStatementInExpression\",this).call(this)}},{key:\"astType\",value:function astType(){return\"ReturnStatement\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{argument:null==(ref1=null==(ref2=this.expression)?void 0:ref2.ast(o,LEVEL_PAREN))?null:ref1}}}]),Return}(Base);return Return.prototype.children=[\"expression\"],Return.prototype.isStatement=YES,Return.prototype.makeReturn=THIS,Return.prototype.jumps=THIS,Return}.call(this),exports.FuncDirectiveReturn=FuncDirectiveReturn=function(){var FuncDirectiveReturn=function(_Return){\"use strict\";function FuncDirectiveReturn(expression,_ref29){var returnKeyword=_ref29.returnKeyword,_this21;return _classCallCheck(this,FuncDirectiveReturn),_this21=_super22.call(this,expression),_this21.returnKeyword=returnKeyword,_this21}_inherits(FuncDirectiveReturn,_Return);var _super22=_createSuper(FuncDirectiveReturn);return _createClass(FuncDirectiveReturn,[{key:\"compileNode\",value:function compileNode(o){return this.checkScope(o),_get(_getPrototypeOf(FuncDirectiveReturn.prototype),\"compileNode\",this).call(this,o)}},{key:\"checkScope\",value:function checkScope(o){if(null==o.scope.parent)return this.error(\"\".concat(this.keyword,\" can only occur inside functions\"))}},{key:\"astNode\",value:function astNode(o){return this.checkScope(o),new Op(this.keyword,new Return(this.expression,{belongsToFuncDirectiveReturn:!0}).withLocationDataFrom(null==this.expression?this.returnKeyword:{locationData:mergeLocationData(this.returnKeyword.locationData,this.expression.locationData)})).withLocationDataFrom(this).ast(o)}}]),FuncDirectiveReturn}(Return);return FuncDirectiveReturn.prototype.isStatementAst=NO,FuncDirectiveReturn}.call(this),exports.YieldReturn=YieldReturn=function(){var YieldReturn=function(_FuncDirectiveReturn){\"use strict\";function YieldReturn(){return _classCallCheck(this,YieldReturn),_super23.apply(this,arguments)}_inherits(YieldReturn,_FuncDirectiveReturn);var _super23=_createSuper(YieldReturn);return _createClass(YieldReturn)}(FuncDirectiveReturn);return YieldReturn.prototype.keyword=\"yield\",YieldReturn}.call(this),exports.AwaitReturn=AwaitReturn=function(){var AwaitReturn=function(_FuncDirectiveReturn2){\"use strict\";function AwaitReturn(){return _classCallCheck(this,AwaitReturn),_super24.apply(this,arguments)}_inherits(AwaitReturn,_FuncDirectiveReturn2);var _super24=_createSuper(AwaitReturn);return _createClass(AwaitReturn)}(FuncDirectiveReturn);return AwaitReturn.prototype.keyword=\"await\",AwaitReturn}.call(this),exports.Value=Value=function(){var Value=function(_Base7){\"use strict\";function Value(base,props,tag){var isDefaultValue=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3],_this22;_classCallCheck(this,Value);var ref1,ref2;return(_this22=_super25.call(this),!props&&base instanceof Value)?_possibleConstructorReturn(_this22,base):(_this22.base=base,_this22.properties=props||[],_this22.tag=tag,tag&&(_this22[tag]=!0),_this22.isDefaultValue=isDefaultValue,(null==(ref1=_this22.base)?void 0:ref1.comments)&&_this22.base instanceof ThisLiteral&&null!=(null==(ref2=_this22.properties[0])?void 0:ref2.name)&&moveComments(_this22.base,_this22.properties[0].name),_this22)}_inherits(Value,_Base7);var _super25=_createSuper(Value);return _createClass(Value,[{key:\"add\",value:function add(props){return this.properties=this.properties.concat(props),this.forceUpdateLocation=!0,this}},{key:\"hasProperties\",value:function hasProperties(){return 0!==this.properties.length}},{key:\"bareLiteral\",value:function bareLiteral(type){return!this.properties.length&&this.base instanceof type}},{key:\"isArray\",value:function isArray(){return this.bareLiteral(Arr)}},{key:\"isRange\",value:function isRange(){return this.bareLiteral(Range)}},{key:\"shouldCache\",value:function shouldCache(){return this.hasProperties()||this.base.shouldCache()}},{key:\"isAssignable\",value:function isAssignable(opts){return this.hasProperties()||this.base.isAssignable(opts)}},{key:\"isNumber\",value:function(){return this.bareLiteral(NumberLiteral)}},{key:\"isString\",value:function isString(){return this.bareLiteral(StringLiteral)}},{key:\"isRegex\",value:function isRegex(){return this.bareLiteral(RegexLiteral)}},{key:\"isUndefined\",value:function isUndefined(){return this.bareLiteral(UndefinedLiteral)}},{key:\"isNull\",value:function isNull(){return this.bareLiteral(NullLiteral)}},{key:\"isBoolean\",value:function isBoolean(){return this.bareLiteral(BooleanLiteral)}},{key:\"isAtomic\",value:function isAtomic(){var j,len1,node,ref1;for(ref1=this.properties.concat(this.base),j=0,len1=ref1.length;j<len1;j++)if(node=ref1[j],node.soak||node instanceof Call||node instanceof Op&&\"do\"===node.operator)return!1;return!0}},{key:\"isNotCallable\",value:function isNotCallable(){return this.isNumber()||this.isString()||this.isRegex()||this.isArray()||this.isRange()||this.isSplice()||this.isObject()||this.isUndefined()||this.isNull()||this.isBoolean()}},{key:\"isStatement\",value:function isStatement(o){return!this.properties.length&&this.base.isStatement(o)}},{key:\"isJSXTag\",value:function isJSXTag(){return this.base instanceof JSXTag}},{key:\"assigns\",value:function assigns(name){return!this.properties.length&&this.base.assigns(name)}},{key:\"jumps\",value:function jumps(o){return!this.properties.length&&this.base.jumps(o)}},{key:\"isObject\",value:function isObject(onlyGenerated){return!this.properties.length&&this.base instanceof Obj&&(!onlyGenerated||this.base.generated)}},{key:\"isElision\",value:function isElision(){return!!(this.base instanceof Arr)&&this.base.hasElision()}},{key:\"isSplice\",value:function isSplice(){var _slice1$call7,_slice1$call8,lastProperty,ref1;return ref1=this.properties,_slice1$call7=slice1.call(ref1,-1),_slice1$call8=_slicedToArray(_slice1$call7,1),lastProperty=_slice1$call8[0],_slice1$call7,lastProperty instanceof Slice}},{key:\"looksStatic\",value:function looksStatic(className){var name,ref1,thisLiteral;return!!(((thisLiteral=this.base)instanceof ThisLiteral||(name=this.base).value===className)&&1===this.properties.length&&\"prototype\"!==(null==(ref1=this.properties[0].name)?void 0:ref1.value))&&{staticClassName:null==thisLiteral?name:thisLiteral}}},{key:\"unwrap\",value:function unwrap(){return this.properties.length?this:this.base}},{key:\"cacheReference\",value:function cacheReference(o){var _slice1$call9,_slice1$call10,base,bref,name,nref,ref1;return(ref1=this.properties,_slice1$call9=slice1.call(ref1,-1),_slice1$call10=_slicedToArray(_slice1$call9,1),name=_slice1$call10[0],_slice1$call9,2>this.properties.length&&!this.base.shouldCache()&&(null==name||!name.shouldCache()))?[this,this]:(base=new Value(this.base,this.properties.slice(0,-1)),base.shouldCache()&&(bref=new IdentifierLiteral(o.scope.freeVariable(\"base\")),base=new Value(new Parens(new Assign(bref,base)))),!name)?[base,bref]:(name.shouldCache()&&(nref=new IdentifierLiteral(o.scope.freeVariable(\"name\")),name=new Index(new Assign(nref,name.index)),nref=new Index(nref)),[base.add(name),new Value(bref||base.base,[nref||name])])}},{key:\"compileNode\",value:function compileNode(o){var fragments,j,len1,prop,props;for(this.base.front=this.front,props=this.properties,fragments=props.length&&null!=this.base.cached?this.base.cached:this.base.compileToFragments(o,props.length?LEVEL_ACCESS:null),props.length&&SIMPLENUM.test(fragmentsToText(fragments))&&fragments.push(this.makeCode(\".\")),(j=0,len1=props.length);j<len1;j++){var _fragments2;prop=props[j],(_fragments2=fragments).push.apply(_fragments2,_toConsumableArray(prop.compileToFragments(o)))}return fragments}},{key:\"unfoldSoak\",value:function unfoldSoak(o){var _this23=this;return null==this.unfoldedSoak?this.unfoldedSoak=function(){var fst,i,ifn,j,len1,prop,ref,ref1,snd;if(ifn=_this23.base.unfoldSoak(o),ifn){var _ifn$body$properties;return(_ifn$body$properties=ifn.body.properties).push.apply(_ifn$body$properties,_toConsumableArray(_this23.properties)),ifn}for(ref1=_this23.properties,i=j=0,len1=ref1.length;j<len1;i=++j)if(prop=ref1[i],!!prop.soak)return prop.soak=!1,fst=new Value(_this23.base,_this23.properties.slice(0,i)),snd=new Value(_this23.base,_this23.properties.slice(i)),fst.shouldCache()&&(ref=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),fst=new Parens(new Assign(ref,fst)),snd.base=ref),new If(new Existence(fst),snd,{soak:!0});return!1}():this.unfoldedSoak}},{key:\"eachName\",value:function eachName(iterator){var _ref30=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref30$checkAssignabi=_ref30.checkAssignability;return this.hasProperties()?iterator(this):!(void 0===_ref30$checkAssignabi||_ref30$checkAssignabi)||this.base.isAssignable()?this.base.eachName(iterator):this.error(\"tried to assign to unassignable value\")}},{key:\"object\",value:function(){var initialProperties,object;return this.hasProperties()?(initialProperties=this.properties.slice(0,this.properties.length-1),object=new Value(this.base,initialProperties,this.tag,this.isDefaultValue),object.locationData=0===initialProperties.length?this.base.locationData:mergeLocationData(this.base.locationData,initialProperties[initialProperties.length-1].locationData),object):this}},{key:\"containsSoak\",value:function containsSoak(){var j,len1,property,ref1;if(!this.hasProperties())return!1;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(property=ref1[j],property.soak)return!0;return!!(this.base instanceof Call&&this.base.soak)}},{key:\"astNode\",value:function astNode(o){return this.hasProperties()?_get(_getPrototypeOf(Value.prototype),\"astNode\",this).call(this,o):this.base.ast(o)}},{key:\"astType\",value:function astType(){return this.isJSXTag()?\"JSXMemberExpression\":this.containsSoak()?\"OptionalMemberExpression\":\"MemberExpression\"}},{key:\"astProperties\",value:function astProperties(o){var _slice1$call11,_slice1$call12,computed,property,ref1,ref2;return ref1=this.properties,_slice1$call11=slice1.call(ref1,-1),_slice1$call12=_slicedToArray(_slice1$call11,1),property=_slice1$call12[0],_slice1$call11,this.isJSXTag()&&(property.name.jsx=!0),computed=property instanceof Index||!((null==(ref2=property.name)?void 0:ref2.unwrap())instanceof PropertyName),{object:this.object().ast(o,LEVEL_ACCESS),property:property.ast(o,computed?LEVEL_PAREN:void 0),computed:computed,optional:!!property.soak,shorthand:!!property.shorthand}}},{key:\"astLocationData\",value:function astLocationData(){return this.isJSXTag()?mergeAstLocationData(jisonLocationDataToAstLocationData(this.base.tagNameLocationData),jisonLocationDataToAstLocationData(this.properties[this.properties.length-1].locationData)):_get(_getPrototypeOf(Value.prototype),\"astLocationData\",this).call(this)}}]),Value}(Base);return Value.prototype.children=[\"base\",\"properties\"],Value}.call(this),exports.MetaProperty=MetaProperty=function(){var MetaProperty=function(_Base8){\"use strict\";function MetaProperty(meta,property1){var _this24;return _classCallCheck(this,MetaProperty),_this24=_super26.call(this),_this24.meta=meta,_this24.property=property1,_this24}_inherits(MetaProperty,_Base8);var _super26=_createSuper(MetaProperty);return _createClass(MetaProperty,[{key:\"checkValid\",value:function checkValid(o){if(\"new\"===this.meta.value){if(!(this.property instanceof Access&&\"target\"===this.property.name.value))return this.error(\"the only valid meta property for new is new.target\");if(null==o.scope.parent)return this.error(\"new.target can only occur inside functions\")}else if(\"import\"===this.meta.value&&!(this.property instanceof Access&&\"meta\"===this.property.name.value))return this.error(\"the only valid meta property for import is import.meta\")}},{key:\"compileNode\",value:function compileNode(o){var _fragments3,_fragments4,fragments;return this.checkValid(o),fragments=[],(_fragments3=fragments).push.apply(_fragments3,_toConsumableArray(this.meta.compileToFragments(o,LEVEL_ACCESS))),(_fragments4=fragments).push.apply(_fragments4,_toConsumableArray(this.property.compileToFragments(o))),fragments}},{key:\"astProperties\",value:function astProperties(o){return this.checkValid(o),{meta:this.meta.ast(o,LEVEL_ACCESS),property:this.property.ast(o)}}}]),MetaProperty}(Base);return MetaProperty.prototype.children=[\"meta\",\"property\"],MetaProperty}.call(this),exports.HereComment=HereComment=function(_Base9){\"use strict\";function HereComment(_ref31){var content1=_ref31.content,newLine=_ref31.newLine,unshift=_ref31.unshift,locationData1=_ref31.locationData,_this25;return _classCallCheck(this,HereComment),_this25=_super27.call(this),_this25.content=content1,_this25.newLine=newLine,_this25.unshift=unshift,_this25.locationData=locationData1,_this25}_inherits(HereComment,_Base9);var _super27=_createSuper(HereComment);return _createClass(HereComment,[{key:\"compileNode\",value:function compileNode(){var fragment,hasLeadingMarks,indent,j,leadingWhitespace,len1,line,multiline,ref1;if(multiline=0<=indexOf.call(this.content,\"\\n\"),multiline){for(indent=null,ref1=this.content.split(\"\\n\"),(j=0,len1=ref1.length);j<len1;j++)line=ref1[j],leadingWhitespace=/^\\s*/.exec(line)[0],(!indent||leadingWhitespace.length<indent.length)&&(indent=leadingWhitespace);indent&&(this.content=this.content.replace(RegExp(\"\\\\n\".concat(indent),\"g\"),\"\\n\"))}return hasLeadingMarks=/\\n\\s*[#|\\*]/.test(this.content),hasLeadingMarks&&(this.content=this.content.replace(/^([ \\t]*)#(?=\\s)/gm,\" *\")),this.content=\"/*\".concat(this.content).concat(hasLeadingMarks?\" \":\"\",\"*/\"),fragment=this.makeCode(this.content),fragment.newLine=this.newLine,fragment.unshift=this.unshift,fragment.multiline=multiline,fragment.isComment=fragment.isHereComment=!0,fragment}},{key:\"astType\",value:function astType(){return\"CommentBlock\"}},{key:\"astProperties\",value:function astProperties(){return{value:this.content}}}]),HereComment}(Base),exports.LineComment=LineComment=function(_Base10){\"use strict\";function LineComment(_ref32){var content1=_ref32.content,newLine=_ref32.newLine,unshift=_ref32.unshift,locationData1=_ref32.locationData,precededByBlankLine=_ref32.precededByBlankLine,_this26;return _classCallCheck(this,LineComment),_this26=_super28.call(this),_this26.content=content1,_this26.newLine=newLine,_this26.unshift=unshift,_this26.locationData=locationData1,_this26.precededByBlankLine=precededByBlankLine,_this26}_inherits(LineComment,_Base10);var _super28=_createSuper(LineComment);return _createClass(LineComment,[{key:\"compileNode\",value:function compileNode(o){var fragment;return fragment=this.makeCode(/^\\s*$/.test(this.content)?\"\":\"\".concat(this.precededByBlankLine?\"\\n\".concat(o.indent):\"\",\"//\").concat(this.content)),fragment.newLine=this.newLine,fragment.unshift=this.unshift,fragment.trail=!this.newLine&&!this.unshift,fragment.isComment=fragment.isLineComment=!0,fragment}},{key:\"astType\",value:function astType(){return\"CommentLine\"}},{key:\"astProperties\",value:function astProperties(){return{value:this.content}}}]),LineComment}(Base),exports.JSXIdentifier=JSXIdentifier=function(_IdentifierLiteral){\"use strict\";function JSXIdentifier(){return _classCallCheck(this,JSXIdentifier),_super29.apply(this,arguments)}_inherits(JSXIdentifier,_IdentifierLiteral);var _super29=_createSuper(JSXIdentifier);return _createClass(JSXIdentifier,[{key:\"astType\",value:function astType(){return\"JSXIdentifier\"}}]),JSXIdentifier}(IdentifierLiteral),exports.JSXTag=JSXTag=function(_JSXIdentifier){\"use strict\";function JSXTag(value,_ref33){var tagNameLocationData=_ref33.tagNameLocationData,closingTagOpeningBracketLocationData=_ref33.closingTagOpeningBracketLocationData,closingTagSlashLocationData=_ref33.closingTagSlashLocationData,closingTagNameLocationData=_ref33.closingTagNameLocationData,closingTagClosingBracketLocationData=_ref33.closingTagClosingBracketLocationData,_this27;return _classCallCheck(this,JSXTag),_this27=_super30.call(this,value),_this27.tagNameLocationData=tagNameLocationData,_this27.closingTagOpeningBracketLocationData=closingTagOpeningBracketLocationData,_this27.closingTagSlashLocationData=closingTagSlashLocationData,_this27.closingTagNameLocationData=closingTagNameLocationData,_this27.closingTagClosingBracketLocationData=closingTagClosingBracketLocationData,_this27}_inherits(JSXTag,_JSXIdentifier);var _super30=_createSuper(JSXTag);return _createClass(JSXTag,[{key:\"astProperties\",value:function astProperties(){return{name:this.value}}}]),JSXTag}(JSXIdentifier),exports.JSXExpressionContainer=JSXExpressionContainer=function(){var JSXExpressionContainer=function(_Base11){\"use strict\";function JSXExpressionContainer(expression1){var _ref34=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},locationData=_ref34.locationData,_this28;return _classCallCheck(this,JSXExpressionContainer),_this28=_super31.call(this),_this28.expression=expression1,_this28.expression.jsxAttribute=!0,_this28.locationData=null==locationData?_this28.expression.locationData:locationData,_this28}_inherits(JSXExpressionContainer,_Base11);var _super31=_createSuper(JSXExpressionContainer);return _createClass(JSXExpressionContainer,[{key:\"compileNode\",value:function compileNode(o){return this.expression.compileNode(o)}},{key:\"astProperties\",value:function astProperties(o){return{expression:astAsBlockIfNeeded(this.expression,o)}}}]),JSXExpressionContainer}(Base);return JSXExpressionContainer.prototype.children=[\"expression\"],JSXExpressionContainer}.call(this),exports.JSXEmptyExpression=JSXEmptyExpression=function(_Base12){\"use strict\";function JSXEmptyExpression(){return _classCallCheck(this,JSXEmptyExpression),_super32.apply(this,arguments)}_inherits(JSXEmptyExpression,_Base12);var _super32=_createSuper(JSXEmptyExpression);return _createClass(JSXEmptyExpression)}(Base),exports.JSXText=JSXText=function(_Base13){\"use strict\";function JSXText(stringLiteral){var _this29;return _classCallCheck(this,JSXText),_this29=_super33.call(this),_this29.value=stringLiteral.unquotedValueForJSX,_this29.locationData=stringLiteral.locationData,_this29}_inherits(JSXText,_Base13);var _super33=_createSuper(JSXText);return _createClass(JSXText,[{key:\"astProperties\",value:function astProperties(){return{value:this.value,extra:{raw:this.value}}}}]),JSXText}(Base),exports.JSXAttribute=JSXAttribute=function(){var JSXAttribute=function(_Base14){\"use strict\";function JSXAttribute(_ref35){var name1=_ref35.name,value=_ref35.value,_this30;_classCallCheck(this,JSXAttribute);var ref1;return _this30=_super34.call(this),_this30.name=name1,_this30.value=null==value?null:(value=value.base,value instanceof StringLiteral&&!value.shouldGenerateTemplateLiteral()?value:new JSXExpressionContainer(value)),null!=(ref1=_this30.value)&&(ref1.comments=value.comments),_this30}_inherits(JSXAttribute,_Base14);var _super34=_createSuper(JSXAttribute);return _createClass(JSXAttribute,[{key:\"compileNode\",value:function compileNode(o){var compiledName,val;return(compiledName=this.name.compileToFragments(o,LEVEL_LIST),null==this.value)?compiledName:(val=this.value.compileToFragments(o,LEVEL_LIST),compiledName.concat(this.makeCode(\"=\"),val))}},{key:\"astProperties\",value:function astProperties(o){var name,ref1,ref2;return name=this.name,0<=indexOf.call(name.value,\":\")&&(name=new JSXNamespacedName(name)),{name:name.ast(o),value:null==(ref1=null==(ref2=this.value)?void 0:ref2.ast(o))?null:ref1}}}]),JSXAttribute}(Base);return JSXAttribute.prototype.children=[\"name\",\"value\"],JSXAttribute}.call(this),exports.JSXAttributes=JSXAttributes=function(){var JSXAttributes=function(_Base15){\"use strict\";function JSXAttributes(arr){var _this31;_classCallCheck(this,JSXAttributes);var attribute,base,j,k,len1,len2,object,property,ref1,ref2,value,variable;for(_this31=_super35.call(this),_this31.attributes=[],ref1=arr.objects,(j=0,len1=ref1.length);j<len1;j++){object=ref1[j],_this31.checkValidAttribute(object);var _object=object;if(base=_object.base,base instanceof IdentifierLiteral)attribute=new JSXAttribute({name:new JSXIdentifier(base.value).withLocationDataAndCommentsFrom(base)}),attribute.locationData=base.locationData,_this31.attributes.push(attribute);else if(!base.generated)attribute=base.properties[0],attribute.jsx=!0,attribute.locationData=base.locationData,_this31.attributes.push(attribute);else for(ref2=base.properties,k=0,len2=ref2.length;k<len2;k++){property=ref2[k];var _property=property;variable=_property.variable,value=_property.value,attribute=new JSXAttribute({name:new JSXIdentifier(variable.base.value).withLocationDataAndCommentsFrom(variable.base),value:value}),attribute.locationData=property.locationData,_this31.attributes.push(attribute)}}return _this31.locationData=arr.locationData,_this31}_inherits(JSXAttributes,_Base15);var _super35=_createSuper(JSXAttributes);return _createClass(JSXAttributes,[{key:\"checkValidAttribute\",value:function checkValidAttribute(object){var attribute,properties;if(attribute=object.base,properties=(null==attribute?void 0:attribute.properties)||[],!(attribute instanceof Obj||attribute instanceof IdentifierLiteral)||attribute instanceof Obj&&!attribute.generated&&(1<properties.length||!(properties[0]instanceof Splat)))return object.error(\"Unexpected token. Allowed JSX attributes are: id=\\\"val\\\", src={source}, {props...} or attribute.\")}},{key:\"compileNode\",value:function compileNode(o){var attribute,fragments,j,len1,ref1;for(fragments=[],ref1=this.attributes,(j=0,len1=ref1.length);j<len1;j++){var _fragments5;attribute=ref1[j],fragments.push(this.makeCode(\" \")),(_fragments5=fragments).push.apply(_fragments5,_toConsumableArray(attribute.compileToFragments(o,LEVEL_TOP)))}return fragments}},{key:\"astNode\",value:function astNode(o){var attribute,j,len1,ref1,results1;for(ref1=this.attributes,results1=[],(j=0,len1=ref1.length);j<len1;j++)attribute=ref1[j],results1.push(attribute.ast(o));return results1}}]),JSXAttributes}(Base);return JSXAttributes.prototype.children=[\"attributes\"],JSXAttributes}.call(this),exports.JSXNamespacedName=JSXNamespacedName=function(){var JSXNamespacedName=function(_Base16){\"use strict\";function JSXNamespacedName(tag){var _this32;_classCallCheck(this,JSXNamespacedName);var name,namespace;_this32=_super36.call(this);var _tag$value$split=tag.value.split(\":\"),_tag$value$split2=_slicedToArray(_tag$value$split,2);return namespace=_tag$value$split2[0],name=_tag$value$split2[1],_this32.namespace=new JSXIdentifier(namespace).withLocationDataFrom({locationData:extractSameLineLocationDataFirst(namespace.length)(tag.locationData)}),_this32.name=new JSXIdentifier(name).withLocationDataFrom({locationData:extractSameLineLocationDataLast(name.length)(tag.locationData)}),_this32.locationData=tag.locationData,_this32}_inherits(JSXNamespacedName,_Base16);var _super36=_createSuper(JSXNamespacedName);return _createClass(JSXNamespacedName,[{key:\"astProperties\",value:function astProperties(o){return{namespace:this.namespace.ast(o),name:this.name.ast(o)}}}]),JSXNamespacedName}(Base);return JSXNamespacedName.prototype.children=[\"namespace\",\"name\"],JSXNamespacedName}.call(this),exports.JSXElement=JSXElement=function(){var JSXElement=function(_Base17){\"use strict\";function JSXElement(_ref36){var tagName1=_ref36.tagName,attributes=_ref36.attributes,content1=_ref36.content,_this33;return _classCallCheck(this,JSXElement),_this33=_super37.call(this),_this33.tagName=tagName1,_this33.attributes=attributes,_this33.content=content1,_this33}_inherits(JSXElement,_Base17);var _super37=_createSuper(JSXElement);return _createClass(JSXElement,[{key:\"compileNode\",value:function compileNode(o){var _fragments6,_fragments7,fragments,ref1,tag;if(null!=(ref1=this.content)&&(ref1.base.jsx=!0),fragments=[this.makeCode(\"<\")],(_fragments6=fragments).push.apply(_fragments6,_toConsumableArray(tag=this.tagName.compileToFragments(o,LEVEL_ACCESS))),(_fragments7=fragments).push.apply(_fragments7,_toConsumableArray(this.attributes.compileToFragments(o))),this.content){var _fragments8,_fragments9;fragments.push(this.makeCode(\">\")),(_fragments8=fragments).push.apply(_fragments8,_toConsumableArray(this.content.compileNode(o,LEVEL_LIST))),(_fragments9=fragments).push.apply(_fragments9,[this.makeCode(\"</\")].concat(_toConsumableArray(tag),[this.makeCode(\">\")]))}else fragments.push(this.makeCode(\" />\"));return fragments}},{key:\"isFragment\",value:function isFragment(){return!this.tagName.base.value.length}},{key:\"astNode\",value:function astNode(o){var tagName;return this.openingElementLocationData=jisonLocationDataToAstLocationData(this.attributes.locationData),tagName=this.tagName.base,tagName.locationData=tagName.tagNameLocationData,null!=this.content&&(this.closingElementLocationData=mergeAstLocationData(jisonLocationDataToAstLocationData(tagName.closingTagOpeningBracketLocationData),jisonLocationDataToAstLocationData(tagName.closingTagClosingBracketLocationData))),_get(_getPrototypeOf(JSXElement.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isFragment()?\"JSXFragment\":\"JSXElement\"}},{key:\"elementAstProperties\",value:function elementAstProperties(o){var _this34=this,closingElement,columnDiff,currentExpr,openingElement,rangeDiff,ref1,shiftAstLocationData,tagNameAst;if(tagNameAst=function(){var tag;return tag=_this34.tagName.unwrap(),(null==tag?void 0:tag.value)&&0<=indexOf.call(tag.value,\":\")&&(tag=new JSXNamespacedName(tag)),tag.ast(o)},openingElement=Object.assign({type:\"JSXOpeningElement\",name:tagNameAst(),selfClosing:null==this.closingElementLocationData,attributes:this.attributes.ast(o)},this.openingElementLocationData),closingElement=null,null!=this.closingElementLocationData&&(closingElement=Object.assign({type:\"JSXClosingElement\",name:Object.assign(tagNameAst(),jisonLocationDataToAstLocationData(this.tagName.base.closingTagNameLocationData))},this.closingElementLocationData),\"JSXMemberExpression\"===(ref1=closingElement.name.type)||\"JSXNamespacedName\"===ref1))if(rangeDiff=closingElement.range[0]-openingElement.range[0]+\"/\".length,columnDiff=closingElement.loc.start.column-openingElement.loc.start.column+\"/\".length,shiftAstLocationData=function(node){return node.range=[node.range[0]+rangeDiff,node.range[1]+rangeDiff],node.start+=rangeDiff,node.end+=rangeDiff,node.loc.start={line:_this34.closingElementLocationData.loc.start.line,column:node.loc.start.column+columnDiff},node.loc.end={line:_this34.closingElementLocationData.loc.start.line,column:node.loc.end.column+columnDiff}},\"JSXMemberExpression\"===closingElement.name.type){for(currentExpr=closingElement.name;\"JSXMemberExpression\"===currentExpr.type;)currentExpr!==closingElement.name&&shiftAstLocationData(currentExpr),shiftAstLocationData(currentExpr.property),currentExpr=currentExpr.object;shiftAstLocationData(currentExpr)}else shiftAstLocationData(closingElement.name.namespace),shiftAstLocationData(closingElement.name.name);return{openingElement:openingElement,closingElement:closingElement}}},{key:\"fragmentAstProperties\",value:function fragmentAstProperties(){var closingFragment,openingFragment;return openingFragment=Object.assign({type:\"JSXOpeningFragment\"},this.openingElementLocationData),closingFragment=Object.assign({type:\"JSXClosingFragment\"},this.closingElementLocationData),{openingFragment:openingFragment,closingFragment:closingFragment}}},{key:\"contentAst\",value:function contentAst(o){var base1,child,children,content,element,emptyExpression,expression,j,len1,results1,unwrapped;if(!this.content||(\"function\"==typeof(base1=this.content.base).isEmpty?base1.isEmpty():void 0))return[];for(content=this.content.unwrapAll(),children=function(){var j,len1,ref1,results1;if(content instanceof StringLiteral)return[new JSXText(content)];for(ref1=this.content.unwrapAll().extractElements(o,{includeInterpolationWrappers:!0,isJsx:!0}),results1=[],(j=0,len1=ref1.length);j<len1;j++)if(element=ref1[j],element instanceof StringLiteral)results1.push(new JSXText(element));else{var _element=element;expression=_element.expression,null==expression?(emptyExpression=new JSXEmptyExpression,emptyExpression.locationData=emptyExpressionLocationData({interpolationNode:element,openingBrace:\"{\",closingBrace:\"}\"}),results1.push(new JSXExpressionContainer(emptyExpression,{locationData:element.locationData}))):(unwrapped=expression.unwrapAll(),unwrapped instanceof JSXElement&&unwrapped.locationData.range[0]===element.locationData.range[0]?results1.push(unwrapped):results1.push(new JSXExpressionContainer(unwrapped,{locationData:element.locationData})))}return results1}.call(this),results1=[],(j=0,len1=children.length);j<len1;j++)child=children[j],child instanceof JSXText&&0===child.value.length||results1.push(child.ast(o));return results1}},{key:\"astProperties\",value:function astProperties(o){return Object.assign(this.isFragment()?this.fragmentAstProperties(o):this.elementAstProperties(o),{children:this.contentAst(o)})}},{key:\"astLocationData\",value:function astLocationData(){return null==this.closingElementLocationData?this.openingElementLocationData:mergeAstLocationData(this.openingElementLocationData,this.closingElementLocationData)}}]),JSXElement}(Base);return JSXElement.prototype.children=[\"tagName\",\"attributes\",\"content\"],JSXElement}.call(this),exports.Call=Call=function(){var Call=function(_Base18){\"use strict\";function Call(variable1){var args1=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[],soak1=2<arguments.length?arguments[2]:void 0,token1=3<arguments.length?arguments[3]:void 0,_this35;_classCallCheck(this,Call);var ref1;return(_this35=_super38.call(this),_this35.variable=variable1,_this35.args=args1,_this35.soak=soak1,_this35.token=token1,_this35.implicit=_this35.args.implicit,_this35.isNew=!1,_this35.variable instanceof Value&&_this35.variable.isNotCallable()&&_this35.variable.error(\"literal is not a function\"),_this35.variable.base instanceof JSXTag)?_possibleConstructorReturn(_this35,new JSXElement({tagName:_this35.variable,attributes:new JSXAttributes(_this35.args[0].base),content:_this35.args[1]})):(\"RegExp\"===(null==(ref1=_this35.variable.base)?void 0:ref1.value)&&0!==_this35.args.length&&moveComments(_this35.variable,_this35.args[0]),_this35)}_inherits(Call,_Base18);var _super38=_createSuper(Call);return _createClass(Call,[{key:\"updateLocationDataIfMissing\",value:function updateLocationDataIfMissing(locationData){var base,ref1;return this.locationData&&this.needsUpdatedStartLocation&&(this.locationData=Object.assign({},this.locationData,{first_line:locationData.first_line,first_column:locationData.first_column,range:[locationData.range[0],this.locationData.range[1]]}),base=(null==(ref1=this.variable)?void 0:ref1.base)||this.variable,base.needsUpdatedStartLocation&&(this.variable.locationData=Object.assign({},this.variable.locationData,{first_line:locationData.first_line,first_column:locationData.first_column,range:[locationData.range[0],this.variable.locationData.range[1]]}),base.updateLocationDataIfMissing(locationData)),delete this.needsUpdatedStartLocation),_get(_getPrototypeOf(Call.prototype),\"updateLocationDataIfMissing\",this).call(this,locationData)}},{key:\"newInstance\",value:function newInstance(){var base,ref1;return base=(null==(ref1=this.variable)?void 0:ref1.base)||this.variable,base instanceof Call&&!base.isNew?base.newInstance():this.isNew=!0,this.needsUpdatedStartLocation=!0,this}},{key:\"unfoldSoak\",value:function unfoldSoak(o){var call,ifn,j,left,len1,list,ref1,rite;if(this.soak){if(this.variable instanceof Super)left=new Literal(this.variable.compile(o)),rite=new Value(left),null==this.variable.accessor&&this.variable.error(\"Unsupported reference to 'super'\");else{if(ifn=_unfoldSoak(o,this,\"variable\"))return ifn;var _Value$cacheReference=new Value(this.variable).cacheReference(o),_Value$cacheReference2=_slicedToArray(_Value$cacheReference,2);left=_Value$cacheReference2[0],rite=_Value$cacheReference2[1]}return rite=new Call(rite,this.args),rite.isNew=this.isNew,left=new Literal(\"typeof \".concat(left.compile(o),\" === \\\"function\\\"\")),new If(left,new Value(rite),{soak:!0})}for(call=this,list=[];;){if(call.variable instanceof Call){list.push(call),call=call.variable;continue}if(!(call.variable instanceof Value))break;if(list.push(call),!((call=call.variable.base)instanceof Call))break}for(ref1=list.reverse(),j=0,len1=ref1.length;j<len1;j++)call=ref1[j],ifn&&(call.variable instanceof Call?call.variable=ifn:call.variable.base=ifn),ifn=_unfoldSoak(o,call,\"variable\");return ifn}},{key:\"compileNode\",value:function compileNode(o){var _fragments10,_fragments11,arg,argCode,argIndex,cache,compiledArgs,fragments,j,len1,ref1,ref2,ref3,ref4,varAccess;if(this.checkForNewSuper(),null!=(ref1=this.variable)&&(ref1.front=this.front),compiledArgs=[],varAccess=(null==(ref2=this.variable)||null==(ref3=ref2.properties)?void 0:ref3[0])instanceof Access,argCode=function(){var j,len1,ref4,results1;for(ref4=this.args||[],results1=[],(j=0,len1=ref4.length);j<len1;j++)arg=ref4[j],arg instanceof Code&&results1.push(arg);return results1}.call(this),0<argCode.length&&varAccess&&!this.variable.base.cached){var _this$variable$base$c=this.variable.base.cache(o,LEVEL_ACCESS,function(){return!1}),_this$variable$base$c2=_slicedToArray(_this$variable$base$c,1);cache=_this$variable$base$c2[0],this.variable.base.cached=cache}for(ref4=this.args,argIndex=j=0,len1=ref4.length;j<len1;argIndex=++j){var _compiledArgs;arg=ref4[argIndex],argIndex&&compiledArgs.push(this.makeCode(\", \")),(_compiledArgs=compiledArgs).push.apply(_compiledArgs,_toConsumableArray(arg.compileToFragments(o,LEVEL_LIST)))}return fragments=[],this.isNew&&fragments.push(this.makeCode(\"new \")),(_fragments10=fragments).push.apply(_fragments10,_toConsumableArray(this.variable.compileToFragments(o,LEVEL_ACCESS))),(_fragments11=fragments).push.apply(_fragments11,[this.makeCode(\"(\")].concat(_toConsumableArray(compiledArgs),[this.makeCode(\")\")])),fragments}},{key:\"checkForNewSuper\",value:function checkForNewSuper(){if(this.isNew&&this.variable instanceof Super)return this.variable.error(\"Unsupported reference to 'super'\")}},{key:\"containsSoak\",value:function containsSoak(){var ref1;return!!this.soak||null!=(ref1=this.variable)&&\"function\"==typeof ref1.containsSoak&&ref1.containsSoak()}},{key:\"astNode\",value:function astNode(o){var ref1;return this.soak&&this.variable instanceof Super&&(null==(ref1=o.scope.namedMethod())?void 0:ref1.ctor)&&this.variable.error(\"Unsupported reference to 'super'\"),this.checkForNewSuper(),_get(_getPrototypeOf(Call.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isNew?\"NewExpression\":this.containsSoak()?\"OptionalCallExpression\":\"CallExpression\"}},{key:\"astProperties\",value:function astProperties(o){var arg;return{callee:this.variable.ast(o,LEVEL_ACCESS),arguments:function(){var j,len1,ref1,results1;for(ref1=this.args,results1=[],(j=0,len1=ref1.length);j<len1;j++)arg=ref1[j],results1.push(arg.ast(o,LEVEL_LIST));return results1}.call(this),optional:!!this.soak,implicit:!!this.implicit}}}]),Call}(Base);return Call.prototype.children=[\"variable\",\"args\"],Call}.call(this),exports.SuperCall=SuperCall=function(){var SuperCall=function(_Call){\"use strict\";function SuperCall(){return _classCallCheck(this,SuperCall),_super39.apply(this,arguments)}_inherits(SuperCall,_Call);var _super39=_createSuper(SuperCall);return _createClass(SuperCall,[{key:\"isStatement\",value:function isStatement(o){var ref1;return(null==(ref1=this.expressions)?void 0:ref1.length)&&o.level===LEVEL_TOP}},{key:\"compileNode\",value:function compileNode(o){var ref,ref1,replacement,superCall;if(null==(ref1=this.expressions)||!ref1.length)return _get(_getPrototypeOf(SuperCall.prototype),\"compileNode\",this).call(this,o);if(superCall=new Literal(fragmentsToText(_get(_getPrototypeOf(SuperCall.prototype),\"compileNode\",this).call(this,o))),replacement=new Block(this.expressions.slice()),o.level>LEVEL_TOP){var _superCall$cache=superCall.cache(o,null,YES),_superCall$cache2=_slicedToArray(_superCall$cache,2);superCall=_superCall$cache2[0],ref=_superCall$cache2[1],replacement.push(ref)}return replacement.unshift(superCall),replacement.compileToFragments(o,o.level===LEVEL_TOP?o.level:LEVEL_LIST)}}]),SuperCall}(Call);return SuperCall.prototype.children=Call.prototype.children.concat([\"expressions\"]),SuperCall}.call(this),exports.Super=Super=function(){var Super=function(_Base19){\"use strict\";function Super(accessor,superLiteral){var _this36;return _classCallCheck(this,Super),_this36=_super40.call(this),_this36.accessor=accessor,_this36.superLiteral=superLiteral,_this36}_inherits(Super,_Base19);var _super40=_createSuper(Super);return _createClass(Super,[{key:\"compileNode\",value:function compileNode(o){var fragments,method,name,nref,ref1,ref2,salvagedComments,variable;if(this.checkInInstanceMethod(o),method=o.scope.namedMethod(),null==method.ctor&&null==this.accessor){var _method=method;name=_method.name,variable=_method.variable,(name.shouldCache()||name instanceof Index&&name.index.isAssignable())&&(nref=new IdentifierLiteral(o.scope.parent.freeVariable(\"name\")),name.index=new Assign(nref,name.index)),this.accessor=null==nref?name:new Index(nref)}return(null==(ref1=this.accessor)||null==(ref2=ref1.name)?void 0:ref2.comments)&&(salvagedComments=this.accessor.name.comments,delete this.accessor.name.comments),fragments=new Value(new Literal(\"super\"),this.accessor?[this.accessor]:[]).compileToFragments(o),salvagedComments&&attachCommentsToNode(salvagedComments,this.accessor.name),fragments}},{key:\"checkInInstanceMethod\",value:function checkInInstanceMethod(o){var method;if(method=o.scope.namedMethod(),null==method||!method.isMethod)return this.error(\"cannot use super outside of an instance method\")}},{key:\"astNode\",value:function astNode(o){var ref1;return this.checkInInstanceMethod(o),null==this.accessor?_get(_getPrototypeOf(Super.prototype),\"astNode\",this).call(this,o):new Value(new Super().withLocationDataFrom(null==(ref1=this.superLiteral)?this:ref1),[this.accessor]).withLocationDataFrom(this).ast(o)}}]),Super}(Base);return Super.prototype.children=[\"accessor\"],Super}.call(this),exports.RegexWithInterpolations=RegexWithInterpolations=function(){var RegexWithInterpolations=function(_Base20){\"use strict\";function RegexWithInterpolations(call1){var _ref37=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref37$heregexComment=_ref37.heregexCommentTokens,heregexCommentTokens=void 0===_ref37$heregexComment?[]:_ref37$heregexComment,_this37;return _classCallCheck(this,RegexWithInterpolations),_this37=_super41.call(this),_this37.call=call1,_this37.heregexCommentTokens=heregexCommentTokens,_this37}_inherits(RegexWithInterpolations,_Base20);var _super41=_createSuper(RegexWithInterpolations);return _createClass(RegexWithInterpolations,[{key:\"compileNode\",value:function compileNode(o){return this.call.compileNode(o)}},{key:\"astType\",value:function astType(){return\"InterpolatedRegExpLiteral\"}},{key:\"astProperties\",value:function astProperties(o){var heregexCommentToken,ref1,ref2;return{interpolatedPattern:this.call.args[0].ast(o),flags:null==(ref1=null==(ref2=this.call.args[1])?void 0:ref2.unwrap().originalValue)?\"\":ref1,comments:function(){var j,len1,ref3,results1;for(ref3=this.heregexCommentTokens,results1=[],(j=0,len1=ref3.length);j<len1;j++)heregexCommentToken=ref3[j],heregexCommentToken.here?results1.push(new HereComment(heregexCommentToken).ast(o)):results1.push(new LineComment(heregexCommentToken).ast(o));return results1}.call(this)}}}]),RegexWithInterpolations}(Base);return RegexWithInterpolations.prototype.children=[\"call\"],RegexWithInterpolations}.call(this),exports.TaggedTemplateCall=TaggedTemplateCall=function(_Call2){\"use strict\";function TaggedTemplateCall(variable,arg,soak){return _classCallCheck(this,TaggedTemplateCall),arg instanceof StringLiteral&&(arg=StringWithInterpolations.fromStringLiteral(arg)),_super42.call(this,variable,[arg],soak)}_inherits(TaggedTemplateCall,_Call2);var _super42=_createSuper(TaggedTemplateCall);return _createClass(TaggedTemplateCall,[{key:\"compileNode\",value:function compileNode(o){return this.variable.compileToFragments(o,LEVEL_ACCESS).concat(this.args[0].compileToFragments(o,LEVEL_LIST))}},{key:\"astType\",value:function astType(){return\"TaggedTemplateExpression\"}},{key:\"astProperties\",value:function astProperties(o){return{tag:this.variable.ast(o,LEVEL_ACCESS),quasi:this.args[0].ast(o,LEVEL_LIST)}}}]),TaggedTemplateCall}(Call),exports.Extends=Extends=function(){var Extends=function(_Base21){\"use strict\";function Extends(child1,parent1){var _this38;return _classCallCheck(this,Extends),_this38=_super43.call(this),_this38.child=child1,_this38.parent=parent1,_this38}_inherits(Extends,_Base21);var _super43=_createSuper(Extends);return _createClass(Extends,[{key:\"compileToFragments\",value:function compileToFragments(o){return new Call(new Value(new Literal(utility(\"extend\",o))),[this.child,this.parent]).compileToFragments(o)}}]),Extends}(Base);return Extends.prototype.children=[\"child\",\"parent\"],Extends}.call(this),exports.Access=Access=function(){var Access=function(_Base22){\"use strict\";function Access(name1){var _ref38=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},soak1=_ref38.soak,shorthand=_ref38.shorthand,_this39;return _classCallCheck(this,Access),_this39=_super44.call(this),_this39.name=name1,_this39.soak=soak1,_this39.shorthand=shorthand,_this39}_inherits(Access,_Base22);var _super44=_createSuper(Access);return _createClass(Access,[{key:\"compileToFragments\",value:function compileToFragments(o){var name,node;return name=this.name.compileToFragments(o),node=this.name.unwrap(),node instanceof PropertyName?[this.makeCode(\".\")].concat(_toConsumableArray(name)):[this.makeCode(\"[\")].concat(_toConsumableArray(name),[this.makeCode(\"]\")])}},{key:\"astNode\",value:function astNode(o){return this.name.ast(o)}}]),Access}(Base);return Access.prototype.children=[\"name\"],Access.prototype.shouldCache=NO,Access}.call(this),exports.Index=Index=function(){var Index=function(_Base23){\"use strict\";function Index(index1){var _this40;return _classCallCheck(this,Index),_this40=_super45.call(this),_this40.index=index1,_this40}_inherits(Index,_Base23);var _super45=_createSuper(Index);return _createClass(Index,[{key:\"compileToFragments\",value:function compileToFragments(o){return[].concat(this.makeCode(\"[\"),this.index.compileToFragments(o,LEVEL_PAREN),this.makeCode(\"]\"))}},{key:\"shouldCache\",value:function shouldCache(){return this.index.shouldCache()}},{key:\"astNode\",value:function astNode(o){return this.index.ast(o)}}]),Index}(Base);return Index.prototype.children=[\"index\"],Index}.call(this),exports.Range=Range=function(){var Range=function(_Base24){\"use strict\";function Range(from1,to1,tag){var _this41;return _classCallCheck(this,Range),_this41=_super46.call(this),_this41.from=from1,_this41.to=to1,_this41.exclusive=\"exclusive\"===tag,_this41.equals=_this41.exclusive?\"\":\"=\",_this41}_inherits(Range,_Base24);var _super46=_createSuper(Range);return _createClass(Range,[{key:\"compileVariables\",value:function compileVariables(o){var shouldCache,step;o=merge(o,{top:!0}),shouldCache=del(o,\"shouldCache\");var _this$cacheToCodeFrag=this.cacheToCodeFragments(this.from.cache(o,LEVEL_LIST,shouldCache)),_this$cacheToCodeFrag2=_slicedToArray(_this$cacheToCodeFrag,2);this.fromC=_this$cacheToCodeFrag2[0],this.fromVar=_this$cacheToCodeFrag2[1];var _this$cacheToCodeFrag3=this.cacheToCodeFragments(this.to.cache(o,LEVEL_LIST,shouldCache)),_this$cacheToCodeFrag4=_slicedToArray(_this$cacheToCodeFrag3,2);if(this.toC=_this$cacheToCodeFrag4[0],this.toVar=_this$cacheToCodeFrag4[1],step=del(o,\"step\")){var _this$cacheToCodeFrag5=this.cacheToCodeFragments(step.cache(o,LEVEL_LIST,shouldCache)),_this$cacheToCodeFrag6=_slicedToArray(_this$cacheToCodeFrag5,2);this.step=_this$cacheToCodeFrag6[0],this.stepVar=_this$cacheToCodeFrag6[1]}return this.fromNum=this.from.isNumber()?parseNumber(this.fromVar):null,this.toNum=this.to.isNumber()?parseNumber(this.toVar):null,this.stepNum=(null==step?void 0:step.isNumber())?parseNumber(this.stepVar):null}},{key:\"compileNode\",value:function compileNode(o){var cond,condPart,from,gt,idx,idxName,known,lowerBound,lt,namedIndex,ref1,ref2,stepCond,stepNotZero,stepPart,to,upperBound,varPart;if(this.fromVar||this.compileVariables(o),!o.index)return this.compileArray(o);known=null!=this.fromNum&&null!=this.toNum,idx=del(o,\"index\"),idxName=del(o,\"name\"),namedIndex=idxName&&idxName!==idx,varPart=known&&!namedIndex?\"var \".concat(idx,\" = \").concat(this.fromC):\"\".concat(idx,\" = \").concat(this.fromC),this.toC!==this.toVar&&(varPart+=\", \".concat(this.toC)),this.step!==this.stepVar&&(varPart+=\", \".concat(this.step)),lt=\"\".concat(idx,\" <\").concat(this.equals),gt=\"\".concat(idx,\" >\").concat(this.equals);var _ref39=[this.fromNum,this.toNum];return from=_ref39[0],to=_ref39[1],stepNotZero=\"\".concat(null==(ref1=this.stepNum)?this.stepVar:ref1,\" !== 0\"),stepCond=\"\".concat(null==(ref2=this.stepNum)?this.stepVar:ref2,\" > 0\"),lowerBound=\"\".concat(lt,\" \").concat(known?to:this.toVar),upperBound=\"\".concat(gt,\" \").concat(known?to:this.toVar),condPart=null==this.step?known?\"\".concat(from<=to?lt:gt,\" \").concat(to):\"(\".concat(this.fromVar,\" <= \").concat(this.toVar,\" ? \").concat(lowerBound,\" : \").concat(upperBound,\")\"):null!=this.stepNum&&0!==this.stepNum?0<this.stepNum?\"\".concat(lowerBound):\"\".concat(upperBound):\"\".concat(stepNotZero,\" && (\").concat(stepCond,\" ? \").concat(lowerBound,\" : \").concat(upperBound,\")\"),cond=this.stepVar?\"\".concat(this.stepVar,\" > 0\"):\"\".concat(this.fromVar,\" <= \").concat(this.toVar),stepPart=this.stepVar?\"\".concat(idx,\" += \").concat(this.stepVar):known?namedIndex?from<=to?\"++\".concat(idx):\"--\".concat(idx):from<=to?\"\".concat(idx,\"++\"):\"\".concat(idx,\"--\"):namedIndex?\"\".concat(cond,\" ? ++\").concat(idx,\" : --\").concat(idx):\"\".concat(cond,\" ? \").concat(idx,\"++ : \").concat(idx,\"--\"),namedIndex&&(varPart=\"\".concat(idxName,\" = \").concat(varPart)),namedIndex&&(stepPart=\"\".concat(idxName,\" = \").concat(stepPart)),[this.makeCode(\"\".concat(varPart,\"; \").concat(condPart,\"; \").concat(stepPart))]}},{key:\"compileArray\",value:function compileArray(o){var args,body,cond,hasArgs,i,idt,known,post,pre,range,ref1,result,vars;return(known=null!=this.fromNum&&null!=this.toNum,known&&20>=_Mathabs(this.fromNum-this.toNum))?(range=function(){for(var results1=[],j=ref1=this.fromNum,ref2=this.toNum;ref1<=ref2?j<=ref2:j>=ref2;ref1<=ref2?j++:j--)results1.push(j);return results1}.apply(this),this.exclusive&&range.pop(),[this.makeCode(\"[\".concat(range.join(\", \"),\"]\"))]):(idt=this.tab+TAB,i=o.scope.freeVariable(\"i\",{single:!0,reserve:!1}),result=o.scope.freeVariable(\"results\",{reserve:!1}),pre=\"\\n\".concat(idt,\"var \").concat(result,\" = [];\"),known?(o.index=i,body=fragmentsToText(this.compileNode(o))):(vars=\"\".concat(i,\" = \").concat(this.fromC)+(this.toC===this.toVar?\"\":\", \".concat(this.toC)),cond=\"\".concat(this.fromVar,\" <= \").concat(this.toVar),body=\"var \".concat(vars,\"; \").concat(cond,\" ? \").concat(i,\" <\").concat(this.equals,\" \").concat(this.toVar,\" : \").concat(i,\" >\").concat(this.equals,\" \").concat(this.toVar,\"; \").concat(cond,\" ? \").concat(i,\"++ : \").concat(i,\"--\")),post=\"{ \".concat(result,\".push(\").concat(i,\"); }\\n\").concat(idt,\"return \").concat(result,\";\\n\").concat(o.indent),hasArgs=function(node){return null==node?void 0:node.contains(isLiteralArguments)},(hasArgs(this.from)||hasArgs(this.to))&&(args=\", arguments\"),[this.makeCode(\"(function() {\".concat(pre,\"\\n\").concat(idt,\"for (\").concat(body,\")\").concat(post,\"}).apply(this\").concat(null==args?\"\":args,\")\"))])}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{from:null==(ref1=null==(ref2=this.from)?void 0:ref2.ast(o))?null:ref1,to:null==(ref3=null==(ref4=this.to)?void 0:ref4.ast(o))?null:ref3,exclusive:this.exclusive}}}]),Range}(Base);return Range.prototype.children=[\"from\",\"to\"],Range}.call(this),exports.Slice=Slice=function(){var Slice=function(_Base25){\"use strict\";function Slice(range1){var _this42;return _classCallCheck(this,Slice),_this42=_super47.call(this),_this42.range=range1,_this42}_inherits(Slice,_Base25);var _super47=_createSuper(Slice);return _createClass(Slice,[{key:\"compileNode\",value:function compileNode(o){var _this$range=this.range,compiled,compiledText,from,fromCompiled,to,toStr;return to=_this$range.to,from=_this$range.from,(null==from?void 0:from.shouldCache())&&(from=new Value(new Parens(from))),(null==to?void 0:to.shouldCache())&&(to=new Value(new Parens(to))),fromCompiled=(null==from?void 0:from.compileToFragments(o,LEVEL_PAREN))||[this.makeCode(\"0\")],to&&(compiled=to.compileToFragments(o,LEVEL_PAREN),compiledText=fragmentsToText(compiled),(this.range.exclusive||-1!=+compiledText)&&(toStr=\", \"+(this.range.exclusive?compiledText:to.isNumber()?\"\".concat(+compiledText+1):(compiled=to.compileToFragments(o,LEVEL_ACCESS),\"+\".concat(fragmentsToText(compiled),\" + 1 || 9e9\"))))),[this.makeCode(\".slice(\".concat(fragmentsToText(fromCompiled)).concat(toStr||\"\",\")\"))]}},{key:\"astNode\",value:function astNode(o){return this.range.ast(o)}}]),Slice}(Base);return Slice.prototype.children=[\"range\"],Slice}.call(this),exports.Obj=Obj=function(){var Obj=function(_Base26){\"use strict\";function Obj(props){var generated=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],_this43;return _classCallCheck(this,Obj),_this43=_super48.call(this),_this43.generated=generated,_this43.objects=_this43.properties=props||[],_this43}_inherits(Obj,_Base26);var _super48=_createSuper(Obj);return _createClass(Obj,[{key:\"isAssignable\",value:function isAssignable(opts){var j,len1,message,prop,ref1,ref2;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(prop=ref1[j],message=isUnassignable(prop.unwrapAll().value),message&&prop.error(message),prop instanceof Assign&&\"object\"===prop.context&&!((null==(ref2=prop.value)?void 0:ref2.base)instanceof Arr)&&(prop=prop.value),!prop.isAssignable(opts))return!1;return!0}},{key:\"shouldCache\",value:function shouldCache(){return!this.isAssignable()}},{key:\"hasSplat\",value:function hasSplat(){var j,len1,prop,ref1;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(prop=ref1[j],prop instanceof Splat)return!0;return!1}},{key:\"reorderProperties\",value:function reorderProperties(){var props,splatProp,splatProps;return props=this.properties,splatProps=this.getAndCheckSplatProps(),splatProp=props.splice(splatProps[0],1),this.objects=this.properties=[].concat(props,splatProp)}},{key:\"compileNode\",value:function compileNode(o){var answer,i,idt,indent,isCompact,j,join,k,key,l,lastNode,len1,len2,len3,node,prop,props,ref1,value;if(this.hasSplat()&&this.lhs&&this.reorderProperties(),props=this.properties,this.generated)for(j=0,len1=props.length;j<len1;j++)node=props[j],node instanceof Value&&node.error(\"cannot have an implicit value in an implicit object\");for(idt=o.indent+=TAB,lastNode=this.lastNode(this.properties),this.propagateLhs(),isCompact=!0,ref1=this.properties,(k=0,len2=ref1.length);k<len2;k++)prop=ref1[k],prop instanceof Assign&&\"object\"===prop.context&&(isCompact=!1);for(answer=[],answer.push(this.makeCode(isCompact?\"\":\"\\n\")),(i=l=0,len3=props.length);l<len3;i=++l){var _answer;if(prop=props[i],join=i===props.length-1?\"\":isCompact?\", \":prop===lastNode?\"\\n\":\",\\n\",indent=isCompact?\"\":idt,key=prop instanceof Assign&&\"object\"===prop.context?prop.variable:prop instanceof Assign?(this.lhs?void 0:prop.operatorToken.error(\"unexpected \".concat(prop.operatorToken.value)),prop.variable):prop,key instanceof Value&&key.hasProperties()&&((\"object\"===prop.context||!key[\"this\"])&&key.error(\"invalid object key\"),key=key.properties[0].name,prop=new Assign(key,prop,\"object\")),key===prop)if(prop.shouldCache()){var _prop$base$cache=prop.base.cache(o),_prop$base$cache2=_slicedToArray(_prop$base$cache,2);key=_prop$base$cache2[0],value=_prop$base$cache2[1],key instanceof IdentifierLiteral&&(key=new PropertyName(key.value)),prop=new Assign(key,value,\"object\")}else if(!(key instanceof Value&&key.base instanceof ComputedPropertyName))\"function\"==typeof prop.bareLiteral&&prop.bareLiteral(IdentifierLiteral)||prop instanceof Splat||(prop=new Assign(prop,prop,\"object\"));else if(prop.base.value.shouldCache()){var _prop$base$value$cach=prop.base.value.cache(o),_prop$base$value$cach2=_slicedToArray(_prop$base$value$cach,2);key=_prop$base$value$cach2[0],value=_prop$base$value$cach2[1],key instanceof IdentifierLiteral&&(key=new ComputedPropertyName(key.value)),prop=new Assign(key,value,\"object\")}else prop=new Assign(key,prop.base.value,\"object\");indent&&answer.push(this.makeCode(indent)),(_answer=answer).push.apply(_answer,_toConsumableArray(prop.compileToFragments(o,LEVEL_TOP))),join&&answer.push(this.makeCode(join))}return answer.push(this.makeCode(isCompact?\"\":\"\\n\".concat(this.tab))),answer=this.wrapInBraces(answer),this.front?this.wrapInParentheses(answer):answer}},{key:\"getAndCheckSplatProps\",value:function getAndCheckSplatProps(){var i,prop,props,splatProps;if(this.hasSplat()&&this.lhs)return props=this.properties,splatProps=function(){var j,len1,results1;for(results1=[],i=j=0,len1=props.length;j<len1;i=++j)prop=props[i],prop instanceof Splat&&results1.push(i);return results1}(),1<(null==splatProps?void 0:splatProps.length)&&props[splatProps[1]].error(\"multiple spread elements are disallowed\"),splatProps}},{key:\"assigns\",value:function assigns(name){var j,len1,prop,ref1;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(prop=ref1[j],prop.assigns(name))return!0;return!1}},{key:\"eachName\",value:function eachName(iterator){var j,len1,prop,ref1,results1;for(ref1=this.properties,results1=[],(j=0,len1=ref1.length);j<len1;j++)prop=ref1[j],prop instanceof Assign&&\"object\"===prop.context&&(prop=prop.value),prop=prop.unwrapAll(),null==prop.eachName?results1.push(void 0):results1.push(prop.eachName(iterator));return results1}},{key:\"expandProperty\",value:function expandProperty(property){var context,key,operatorToken,variable;return variable=property.variable,context=property.context,operatorToken=property.operatorToken,key=property instanceof Assign&&\"object\"===context?variable:property instanceof Assign?(this.lhs?void 0:operatorToken.error(\"unexpected \".concat(operatorToken.value)),variable):property,key instanceof Value&&key.hasProperties()?(\"object\"!==context&&key[\"this\"]||key.error(\"invalid object key\"),property instanceof Assign?new ObjectProperty({fromAssign:property}):new ObjectProperty({key:property})):key===property?property instanceof Splat?property:new ObjectProperty({key:property}):new ObjectProperty({fromAssign:property})}},{key:\"expandProperties\",value:function expandProperties(){var j,len1,property,ref1,results1;for(ref1=this.properties,results1=[],(j=0,len1=ref1.length);j<len1;j++)property=ref1[j],results1.push(this.expandProperty(property));return results1}},{key:\"propagateLhs\",value:function propagateLhs(setLhs){var j,len1,property,ref1,results1,unwrappedValue,value;if(setLhs&&(this.lhs=!0),!!this.lhs){for(ref1=this.properties,results1=[],(j=0,len1=ref1.length);j<len1;j++)if(property=ref1[j],property instanceof Assign&&\"object\"===property.context){var _property2=property;value=_property2.value,unwrappedValue=value.unwrapAll(),unwrappedValue instanceof Arr||unwrappedValue instanceof Obj?results1.push(unwrappedValue.propagateLhs(!0)):unwrappedValue instanceof Assign?results1.push(unwrappedValue.nestedLhs=!0):results1.push(void 0)}else property instanceof Assign?results1.push(property.nestedLhs=!0):property instanceof Splat?results1.push(property.propagateLhs(!0)):results1.push(void 0);return results1}}},{key:\"astNode\",value:function astNode(o){return this.getAndCheckSplatProps(),_get(_getPrototypeOf(Obj.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.lhs?\"ObjectPattern\":\"ObjectExpression\"}},{key:\"astProperties\",value:function astProperties(o){var property;return{implicit:!!this.generated,properties:function(){var j,len1,ref1,results1;for(ref1=this.expandProperties(),results1=[],(j=0,len1=ref1.length);j<len1;j++)property=ref1[j],results1.push(property.ast(o));return results1}.call(this)}}}]),Obj}(Base);return Obj.prototype.children=[\"properties\"],Obj}.call(this),exports.ObjectProperty=ObjectProperty=function(_Base27){\"use strict\";function ObjectProperty(_ref40){var key=_ref40.key,fromAssign=_ref40.fromAssign,_this44;_classCallCheck(this,ObjectProperty);var context,value;return _this44=_super49.call(this),fromAssign?(_this44.key=fromAssign.variable,value=fromAssign.value,context=fromAssign.context,\"object\"===context?_this44.value=value:(_this44.value=fromAssign,_this44.shorthand=!0),_this44.locationData=fromAssign.locationData):(_this44.key=key,_this44.shorthand=!0,_this44.locationData=key.locationData),_this44}_inherits(ObjectProperty,_Base27);var _super49=_createSuper(ObjectProperty);return _createClass(ObjectProperty,[{key:\"astProperties\",value:function astProperties(o){var isComputedPropertyName,keyAst,ref1,ref2;return isComputedPropertyName=this.key instanceof Value&&this.key.base instanceof ComputedPropertyName||this.key.unwrap()instanceof StringWithInterpolations,keyAst=this.key.ast(o,LEVEL_LIST),{key:(null==keyAst?void 0:keyAst.declaration)?Object.assign({},keyAst,{declaration:!1}):keyAst,value:null==(ref1=null==(ref2=this.value)?void 0:ref2.ast(o,LEVEL_LIST))?keyAst:ref1,shorthand:!!this.shorthand,computed:!!isComputedPropertyName,method:!1}}}]),ObjectProperty}(Base),exports.Arr=Arr=function(){var Arr=function(_Base28){\"use strict\";function Arr(objs){var lhs1=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],_this45;return _classCallCheck(this,Arr),_this45=_super50.call(this),_this45.lhs=lhs1,_this45.objects=objs||[],_this45.propagateLhs(),_this45}_inherits(Arr,_Base28);var _super50=_createSuper(Arr);return _createClass(Arr,[{key:\"hasElision\",value:function hasElision(){var j,len1,obj,ref1;for(ref1=this.objects,j=0,len1=ref1.length;j<len1;j++)if(obj=ref1[j],obj instanceof Elision)return!0;return!1}},{key:\"isAssignable\",value:function isAssignable(opts){var _ref41=null==opts?{}:opts,allowEmptyArray,allowExpansion,allowNontrailingSplat,i,j,len1,obj,ref1;allowExpansion=_ref41.allowExpansion,allowNontrailingSplat=_ref41.allowNontrailingSplat;var _ref41$allowEmptyArra=_ref41.allowEmptyArray;if(allowEmptyArray=void 0!==_ref41$allowEmptyArra&&_ref41$allowEmptyArra,!this.objects.length)return allowEmptyArray;for(ref1=this.objects,i=j=0,len1=ref1.length;j<len1;i=++j){if(obj=ref1[i],!allowNontrailingSplat&&obj instanceof Splat&&i+1!==this.objects.length)return!1;if(!(allowExpansion&&obj instanceof Expansion||obj.isAssignable(opts)&&(!obj.isAtomic||obj.isAtomic())))return!1}return!0}},{key:\"shouldCache\",value:function shouldCache(){return!this.isAssignable()}},{key:\"compileNode\",value:function compileNode(o){var answer,compiledObjs,fragment,fragmentIndex,fragmentIsElision,fragments,includesLineCommentsOnNonFirstElement,index,j,k,l,len1,len2,len3,len4,len5,obj,objIndex,olen,p,passedElision,q,ref1,ref2,unwrappedObj;if(!this.objects.length)return[this.makeCode(\"[]\")];for(o.indent+=TAB,fragmentIsElision=function(_ref42){var _ref43=_slicedToArray(_ref42,1),fragment=_ref43[0];return\"Elision\"===fragment.type&&\",\"===fragment.code.trim()},passedElision=!1,answer=[],ref1=this.objects,(objIndex=j=0,len1=ref1.length);j<len1;objIndex=++j)obj=ref1[objIndex],unwrappedObj=obj.unwrapAll(),unwrappedObj.comments&&0===unwrappedObj.comments.filter(function(comment){return!comment.here}).length&&(unwrappedObj.includeCommentFragments=YES);for(compiledObjs=function(){var k,len2,ref2,results1;for(ref2=this.objects,results1=[],(k=0,len2=ref2.length);k<len2;k++)obj=ref2[k],results1.push(obj.compileToFragments(o,LEVEL_LIST));return results1}.call(this),olen=compiledObjs.length,includesLineCommentsOnNonFirstElement=!1,(index=k=0,len2=compiledObjs.length);k<len2;index=++k){var _answer2;for(fragments=compiledObjs[index],l=0,len3=fragments.length;l<len3;l++)fragment=fragments[l],fragment.isHereComment?fragment.code=fragment.code.trim():0!==index&&!1===includesLineCommentsOnNonFirstElement&&hasLineComments(fragment)&&(includesLineCommentsOnNonFirstElement=!0);0!==index&&passedElision&&(!fragmentIsElision(fragments)||index===olen-1)&&answer.push(this.makeCode(\", \")),passedElision=passedElision||!fragmentIsElision(fragments),(_answer2=answer).push.apply(_answer2,_toConsumableArray(fragments))}if(includesLineCommentsOnNonFirstElement||0<=indexOf.call(fragmentsToText(answer),\"\\n\")){for(fragmentIndex=p=0,len4=answer.length;p<len4;fragmentIndex=++p)fragment=answer[fragmentIndex],fragment.isHereComment?fragment.code=\"\".concat(multident(fragment.code,o.indent,!1),\"\\n\").concat(o.indent):\", \"===fragment.code&&(null==fragment||!fragment.isElision)&&\"StringLiteral\"!==(ref2=fragment.type)&&\"StringWithInterpolations\"!==ref2&&(fragment.code=\",\\n\".concat(o.indent));answer.unshift(this.makeCode(\"[\\n\".concat(o.indent))),answer.push(this.makeCode(\"\\n\".concat(this.tab,\"]\")))}else{for(q=0,len5=answer.length;q<len5;q++)fragment=answer[q],fragment.isHereComment&&(fragment.code=\"\".concat(fragment.code,\" \"));answer.unshift(this.makeCode(\"[\")),answer.push(this.makeCode(\"]\"))}return answer}},{key:\"assigns\",value:function assigns(name){var j,len1,obj,ref1;for(ref1=this.objects,j=0,len1=ref1.length;j<len1;j++)if(obj=ref1[j],obj.assigns(name))return!0;return!1}},{key:\"eachName\",value:function eachName(iterator){var j,len1,obj,ref1,results1;for(ref1=this.objects,results1=[],(j=0,len1=ref1.length);j<len1;j++)obj=ref1[j],obj=obj.unwrapAll(),results1.push(obj.eachName(iterator));return results1}},{key:\"propagateLhs\",value:function propagateLhs(setLhs){var j,len1,object,ref1,results1,unwrappedObject;if(setLhs&&(this.lhs=!0),!!this.lhs){for(ref1=this.objects,results1=[],(j=0,len1=ref1.length);j<len1;j++)object=ref1[j],(object instanceof Splat||object instanceof Expansion)&&(object.lhs=!0),unwrappedObject=object.unwrapAll(),unwrappedObject instanceof Arr||unwrappedObject instanceof Obj?results1.push(unwrappedObject.propagateLhs(!0)):unwrappedObject instanceof Assign?results1.push(unwrappedObject.nestedLhs=!0):results1.push(void 0);return results1}}},{key:\"astType\",value:function astType(){return this.lhs?\"ArrayPattern\":\"ArrayExpression\"}},{key:\"astProperties\",value:function astProperties(o){var object;return{elements:function(){var j,len1,ref1,results1;for(ref1=this.objects,results1=[],(j=0,len1=ref1.length);j<len1;j++)object=ref1[j],results1.push(object.ast(o,LEVEL_LIST));return results1}.call(this)}}}]),Arr}(Base);return Arr.prototype.children=[\"objects\"],Arr}.call(this),exports.Class=Class=function(){var Class=function(_Base29){\"use strict\";function Class(variable1,parent1,body1){var _this46;return _classCallCheck(this,Class),_this46=_super51.call(this),_this46.variable=variable1,_this46.parent=parent1,_this46.body=body1,null==_this46.body&&(_this46.body=new Block,_this46.hasGeneratedBody=!0),_this46}_inherits(Class,_Base29);var _super51=_createSuper(Class);return _createClass(Class,[{key:\"compileNode\",value:function compileNode(o){var executableBody,node,parentName;if(this.name=this.determineName(),executableBody=this.walkBody(o),this.parent instanceof Value&&!this.parent.hasProperties()&&(parentName=this.parent.base.value),this.hasNameClash=null!=this.name&&this.name===parentName,node=this,executableBody||this.hasNameClash?node=new ExecutableClassBody(node,executableBody):null==this.name&&o.level===LEVEL_TOP&&(node=new Parens(node)),this.boundMethods.length&&this.parent&&(null==this.variable&&(this.variable=new IdentifierLiteral(o.scope.freeVariable(\"_class\"))),null==this.variableRef)){var _this$variable$cache=this.variable.cache(o),_this$variable$cache2=_slicedToArray(_this$variable$cache,2);this.variable=_this$variable$cache2[0],this.variableRef=_this$variable$cache2[1]}this.variable&&(node=new Assign(this.variable,node,null,{moduleDeclaration:this.moduleDeclaration})),this.compileNode=this.compileClassDeclaration;try{return node.compileToFragments(o)}finally{delete this.compileNode}}},{key:\"compileClassDeclaration\",value:function compileClassDeclaration(o){var ref1,ref2,result;if((this.externalCtor||this.boundMethods.length)&&null==this.ctor&&(this.ctor=this.makeDefaultConstructor()),null!=(ref1=this.ctor)&&(ref1.noReturn=!0),this.boundMethods.length&&this.proxyBoundMethods(),o.indent+=TAB,result=[],result.push(this.makeCode(\"class \")),this.name&&result.push(this.makeCode(this.name)),null!=(null==(ref2=this.variable)?void 0:ref2.comments)&&this.compileCommentFragments(o,this.variable,result),this.name&&result.push(this.makeCode(\" \")),this.parent){var _result;(_result=result).push.apply(_result,[this.makeCode(\"extends \")].concat(_toConsumableArray(this.parent.compileToFragments(o)),[this.makeCode(\" \")]))}if(result.push(this.makeCode(\"{\")),!this.body.isEmpty()){var _result2;this.body.spaced=!0,result.push(this.makeCode(\"\\n\")),(_result2=result).push.apply(_result2,_toConsumableArray(this.body.compileToFragments(o,LEVEL_TOP))),result.push(this.makeCode(\"\\n\".concat(this.tab)))}return result.push(this.makeCode(\"}\")),result}},{key:\"determineName\",value:function determineName(){var _slice1$call13,_slice1$call14,message,name,node,ref1,tail;return this.variable?(ref1=this.variable.properties,_slice1$call13=slice1.call(ref1,-1),_slice1$call14=_slicedToArray(_slice1$call13,1),tail=_slice1$call14[0],_slice1$call13,node=tail?tail instanceof Access&&tail.name:this.variable.base,!(node instanceof IdentifierLiteral||node instanceof PropertyName))?null:(name=node.value,tail||(message=isUnassignable(name),message&&this.variable.error(message)),0<=indexOf.call(JS_FORBIDDEN,name)?\"_\".concat(name):name):null}},{key:\"walkBody\",value:function walkBody(o){var assign,end,executableBody,expression,expressions,exprs,i,initializer,initializerExpression,j,k,len1,len2,method,properties,pushSlice,ref1,start;for(this.ctor=null,this.boundMethods=[],executableBody=null,initializer=[],expressions=this.body.expressions,i=0,ref1=expressions.slice(),(j=0,len1=ref1.length);j<len1;j++)if(expression=ref1[j],expression instanceof Value&&expression.isObject(!0)){for(properties=expression.base.properties,exprs=[],end=0,start=0,pushSlice=function(){if(end>start)return exprs.push(new Value(new Obj(properties.slice(start,end),!0)))};assign=properties[end];)(initializerExpression=this.addInitializerExpression(assign,o))&&(pushSlice(),exprs.push(initializerExpression),initializer.push(initializerExpression),start=end+1),end++;pushSlice(),splice.apply(expressions,[i,i-i+1].concat(exprs)),exprs,i+=exprs.length}else(initializerExpression=this.addInitializerExpression(expression,o))&&(initializer.push(initializerExpression),expressions[i]=initializerExpression),i+=1;for(k=0,len2=initializer.length;k<len2;k++)method=initializer[k],method instanceof Code&&(method.ctor?(this.ctor&&method.error(\"Cannot define more than one constructor in a class\"),this.ctor=method):method.isStatic&&method.bound?method.context=this.name:method.bound&&this.boundMethods.push(method));return o.compiling?initializer.length===expressions.length?void 0:(this.body.expressions=function(){var l,len3,results1;for(results1=[],l=0,len3=initializer.length;l<len3;l++)expression=initializer[l],results1.push(expression.hoist());return results1}(),new Block(expressions)):void 0}},{key:\"addInitializerExpression\",value:function addInitializerExpression(node,o){return node.unwrapAll()instanceof PassthroughLiteral?node:this.validInitializerMethod(node)?this.addInitializerMethod(node):!o.compiling&&this.validClassProperty(node)?this.addClassProperty(node):!o.compiling&&this.validClassPrototypeProperty(node)?this.addClassPrototypeProperty(node):null}},{key:\"validInitializerMethod\",value:function validInitializerMethod(node){return!!(node instanceof Assign&&node.value instanceof Code)&&(!(\"object\"!==node.context||node.variable.hasProperties())||node.variable.looksStatic(this.name)&&(this.name||!node.value.bound))}},{key:\"addInitializerMethod\",value:function addInitializerMethod(assign){var isConstructor,method,methodName,operatorToken,variable;return variable=assign.variable,method=assign.value,operatorToken=assign.operatorToken,method.isMethod=!0,method.isStatic=variable.looksStatic(this.name),method.isStatic?method.name=variable.properties[0]:(methodName=variable.base,method.name=new(methodName.shouldCache()?Index:Access)(methodName),method.name.updateLocationDataIfMissing(methodName.locationData),isConstructor=methodName instanceof StringLiteral?\"constructor\"===methodName.originalValue:\"constructor\"===methodName.value,isConstructor&&(method.ctor=this.parent?\"derived\":\"base\"),method.bound&&method.ctor&&method.error(\"Cannot define a constructor as a bound (fat arrow) function\")),method.operatorToken=operatorToken,method}},{key:\"validClassProperty\",value:function validClassProperty(node){return!!(node instanceof Assign)&&node.variable.looksStatic(this.name)}},{key:\"addClassProperty\",value:function addClassProperty(assign){var operatorToken,staticClassName,value,variable;variable=assign.variable,value=assign.value,operatorToken=assign.operatorToken;var _variable$looksStatic=variable.looksStatic(this.name);return staticClassName=_variable$looksStatic.staticClassName,new ClassProperty({name:variable.properties[0],isStatic:!0,staticClassName:staticClassName,value:value,operatorToken:operatorToken}).withLocationDataFrom(assign)}},{key:\"validClassPrototypeProperty\",value:function validClassPrototypeProperty(node){return!!(node instanceof Assign)&&\"object\"===node.context&&!node.variable.hasProperties()}},{key:\"addClassPrototypeProperty\",value:function addClassPrototypeProperty(assign){var value,variable;return variable=assign.variable,value=assign.value,new ClassPrototypeProperty({name:variable.base,value:value}).withLocationDataFrom(assign)}},{key:\"makeDefaultConstructor\",value:function makeDefaultConstructor(){var applyArgs,applyCtor,ctor;return ctor=this.addInitializerMethod(new Assign(new Value(new PropertyName(\"constructor\")),new Code())),this.body.unshift(ctor),this.parent&&ctor.body.push(new SuperCall(new Super(),[new Splat(new IdentifierLiteral(\"arguments\"))])),this.externalCtor&&(applyCtor=new Value(this.externalCtor,[new Access(new PropertyName(\"apply\"))]),applyArgs=[new ThisLiteral,new IdentifierLiteral(\"arguments\")],ctor.body.push(new Call(applyCtor,applyArgs)),ctor.body.makeReturn()),ctor}},{key:\"proxyBoundMethods\",value:function proxyBoundMethods(){var method,name;return this.ctor.thisAssignments=function(){var j,len1,ref1,results1;for(ref1=this.boundMethods,results1=[],(j=0,len1=ref1.length);j<len1;j++)method=ref1[j],this.parent&&(method.classVariable=this.variableRef),name=new Value(new ThisLiteral(),[method.name]),results1.push(new Assign(name,new Call(new Value(name,[new Access(new PropertyName(\"bind\"))]),[new ThisLiteral])));return results1}.call(this),null}},{key:\"declareName\",value:function declareName(o){var alreadyDeclared,name,ref1;if((name=null==(ref1=this.variable)?void 0:ref1.unwrap())instanceof IdentifierLiteral)return alreadyDeclared=o.scope.find(name.value),name.isDeclaration=!alreadyDeclared}},{key:\"isStatementAst\",value:function isStatementAst(){return!0}},{key:\"astNode\",value:function astNode(o){var argumentsNode,jumpNode,ref1;return(jumpNode=this.body.jumps())&&jumpNode.error(\"Class bodies cannot contain pure statements\"),(argumentsNode=this.body.contains(isLiteralArguments))&&argumentsNode.error(\"Class bodies shouldn't reference arguments\"),this.declareName(o),this.name=this.determineName(),this.body.isClassBody=!0,this.hasGeneratedBody&&(this.body.locationData=zeroWidthLocationDataFromEndLocation(this.locationData)),this.walkBody(o),sniffDirectives(this.body.expressions),null!=(ref1=this.ctor)&&(ref1.noReturn=!0),_get(_getPrototypeOf(Class.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(o){return o.level===LEVEL_TOP?\"ClassDeclaration\":\"ClassExpression\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{id:null==(ref1=null==(ref2=this.variable)?void 0:ref2.ast(o))?null:ref1,superClass:null==(ref3=null==(ref4=this.parent)?void 0:ref4.ast(o,LEVEL_PAREN))?null:ref3,body:this.body.ast(o,LEVEL_TOP)}}}]),Class}(Base);return Class.prototype.children=[\"variable\",\"parent\",\"body\"],Class}.call(this),exports.ExecutableClassBody=ExecutableClassBody=function(){var ExecutableClassBody=function(_Base30){\"use strict\";function ExecutableClassBody(_class){var body1=1<arguments.length&&void 0!==arguments[1]?arguments[1]:new Block,_this47;return _classCallCheck(this,ExecutableClassBody),_this47=_super52.call(this),_this47[\"class\"]=_class,_this47.body=body1,_this47}_inherits(ExecutableClassBody,_Base30);var _super52=_createSuper(ExecutableClassBody);return _createClass(ExecutableClassBody,[{key:\"compileNode\",value:function compileNode(o){var _this$body$expression,args,argumentsNode,directives,externalCtor,ident,jumpNode,klass,params,parent,ref1,wrapper;return(jumpNode=this.body.jumps())&&jumpNode.error(\"Class bodies cannot contain pure statements\"),(argumentsNode=this.body.contains(isLiteralArguments))&&argumentsNode.error(\"Class bodies shouldn't reference arguments\"),params=[],args=[new ThisLiteral],wrapper=new Code(params,this.body),klass=new Parens(new Call(new Value(wrapper,[new Access(new PropertyName(\"call\"))]),args)),this.body.spaced=!0,o.classScope=wrapper.makeScope(o.scope),this.name=null==(ref1=this[\"class\"].name)?o.classScope.freeVariable(this.defaultClassVariableName):ref1,ident=new IdentifierLiteral(this.name),directives=this.walkBody(),this.setContext(),this[\"class\"].hasNameClash&&(parent=new IdentifierLiteral(o.classScope.freeVariable(\"superClass\")),wrapper.params.push(new Param(parent)),args.push(this[\"class\"].parent),this[\"class\"].parent=parent),this.externalCtor&&(externalCtor=new IdentifierLiteral(o.classScope.freeVariable(\"ctor\",{reserve:!1})),this[\"class\"].externalCtor=externalCtor,this.externalCtor.variable.base=externalCtor),this.name===this[\"class\"].name?this.body.expressions.unshift(this[\"class\"]):this.body.expressions.unshift(new Assign(new IdentifierLiteral(this.name),this[\"class\"])),(_this$body$expression=this.body.expressions).unshift.apply(_this$body$expression,_toConsumableArray(directives)),this.body.push(ident),klass.compileToFragments(o)}},{key:\"walkBody\",value:function walkBody(){var _this48=this,directives,expr,index;for(directives=[],index=0;(expr=this.body.expressions[index])&&!!(expr instanceof Value&&expr.isString());)if(expr.hoisted)index++;else{var _directives;(_directives=directives).push.apply(_directives,_toConsumableArray(this.body.expressions.splice(index,1)))}return this.traverseChildren(!1,function(child){var cont,i,j,len1,node,ref1;if(child instanceof Class||child instanceof HoistTarget)return!1;if(cont=!0,child instanceof Block){for(ref1=child.expressions,i=j=0,len1=ref1.length;j<len1;i=++j)node=ref1[i],node instanceof Value&&node.isObject(!0)?(cont=!1,child.expressions[i]=_this48.addProperties(node.base.properties)):node instanceof Assign&&node.variable.looksStatic(_this48.name)&&(node.value.isStatic=!0);child.expressions=flatten(child.expressions)}return cont}),directives}},{key:\"setContext\",value:function setContext(){var _this49=this;return this.body.traverseChildren(!1,function(node){return node instanceof ThisLiteral?node.value=_this49.name:node instanceof Code&&node.bound&&(node.isStatic||!node.name)?node.context=_this49.name:void 0})}},{key:\"addProperties\",value:function addProperties(assigns){var assign,base,name,prototype,result,value,variable;return result=function(){var j,len1,results1;for(results1=[],j=0,len1=assigns.length;j<len1;j++)assign=assigns[j],variable=assign.variable,base=null==variable?void 0:variable.base,value=assign.value,delete assign.context,\"constructor\"===base.value?(value instanceof Code&&base.error(\"constructors must be defined at the top level of a class body\"),assign=this.externalCtor=new Assign(new Value(),value)):assign.variable[\"this\"]?assign.value instanceof Code&&(assign.value.isStatic=!0):(name=base instanceof ComputedPropertyName?new Index(base.value):new(base.shouldCache()?Index:Access)(base),prototype=new Access(new PropertyName(\"prototype\")),variable=new Value(new ThisLiteral(),[prototype,name]),assign.variable=variable),results1.push(assign);return results1}.call(this),compact(result)}}]),ExecutableClassBody}(Base);return ExecutableClassBody.prototype.children=[\"class\",\"body\"],ExecutableClassBody.prototype.defaultClassVariableName=\"_Class\",ExecutableClassBody}.call(this),exports.ClassProperty=ClassProperty=function(){var ClassProperty=function(_Base31){\"use strict\";function ClassProperty(_ref44){var name1=_ref44.name,isStatic=_ref44.isStatic,staticClassName1=_ref44.staticClassName,value1=_ref44.value,operatorToken1=_ref44.operatorToken,_this50;return _classCallCheck(this,ClassProperty),_this50=_super53.call(this),_this50.name=name1,_this50.isStatic=isStatic,_this50.staticClassName=staticClassName1,_this50.value=value1,_this50.operatorToken=operatorToken1,_this50}_inherits(ClassProperty,_Base31);var _super53=_createSuper(ClassProperty);return _createClass(ClassProperty,[{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{key:this.name.ast(o,LEVEL_LIST),value:this.value.ast(o,LEVEL_LIST),static:!!this.isStatic,computed:this.name instanceof Index||this.name instanceof ComputedPropertyName,operator:null==(ref1=null==(ref2=this.operatorToken)?void 0:ref2.value)?\"=\":ref1,staticClassName:null==(ref3=null==(ref4=this.staticClassName)?void 0:ref4.ast(o))?null:ref3}}}]),ClassProperty}(Base);return ClassProperty.prototype.children=[\"name\",\"value\",\"staticClassName\"],ClassProperty.prototype.isStatement=YES,ClassProperty}.call(this),exports.ClassPrototypeProperty=ClassPrototypeProperty=function(){var ClassPrototypeProperty=function(_Base32){\"use strict\";function ClassPrototypeProperty(_ref45){var name1=_ref45.name,value1=_ref45.value,_this51;return _classCallCheck(this,ClassPrototypeProperty),_this51=_super54.call(this),_this51.name=name1,_this51.value=value1,_this51}_inherits(ClassPrototypeProperty,_Base32);var _super54=_createSuper(ClassPrototypeProperty);return _createClass(ClassPrototypeProperty,[{key:\"astProperties\",value:function astProperties(o){return{key:this.name.ast(o,LEVEL_LIST),value:this.value.ast(o,LEVEL_LIST),computed:this.name instanceof ComputedPropertyName||this.name instanceof StringWithInterpolations}}}]),ClassPrototypeProperty}(Base);return ClassPrototypeProperty.prototype.children=[\"name\",\"value\"],ClassPrototypeProperty.prototype.isStatement=YES,ClassPrototypeProperty}.call(this),exports.ModuleDeclaration=ModuleDeclaration=function(){var ModuleDeclaration=function(_Base33){\"use strict\";function ModuleDeclaration(clause,source1,assertions){var _this52;return _classCallCheck(this,ModuleDeclaration),_this52=_super55.call(this),_this52.clause=clause,_this52.source=source1,_this52.assertions=assertions,_this52.checkSource(),_this52}_inherits(ModuleDeclaration,_Base33);var _super55=_createSuper(ModuleDeclaration);return _createClass(ModuleDeclaration,[{key:\"checkSource\",value:function checkSource(){if(null!=this.source&&this.source instanceof StringWithInterpolations)return this.source.error(\"the name of the module to be imported from must be an uninterpolated string\")}},{key:\"checkScope\",value:function checkScope(o,moduleDeclarationType){if(0!==o.indent.length)return this.error(\"\".concat(moduleDeclarationType,\" statements must be at top-level scope\"))}},{key:\"astAssertions\",value:function astAssertions(o){var ref1;return null==(null==(ref1=this.assertions)?void 0:ref1.properties)?[]:this.assertions.properties.map(function(assertion){var _assertion$ast=assertion.ast(o),end,left,loc,right,start;return start=_assertion$ast.start,end=_assertion$ast.end,loc=_assertion$ast.loc,left=_assertion$ast.left,right=_assertion$ast.right,{type:\"ImportAttribute\",start:start,end:end,loc:loc,key:left,value:right}})}}]),ModuleDeclaration}(Base);return ModuleDeclaration.prototype.children=[\"clause\",\"source\",\"assertions\"],ModuleDeclaration.prototype.isStatement=YES,ModuleDeclaration.prototype.jumps=THIS,ModuleDeclaration.prototype.makeReturn=THIS,ModuleDeclaration}.call(this),exports.ImportDeclaration=ImportDeclaration=function(_ModuleDeclaration){\"use strict\";function ImportDeclaration(){return _classCallCheck(this,ImportDeclaration),_super56.apply(this,arguments)}_inherits(ImportDeclaration,_ModuleDeclaration);var _super56=_createSuper(ImportDeclaration);return _createClass(ImportDeclaration,[{key:\"compileNode\",value:function compileNode(o){var code,ref1;if(this.checkScope(o,\"import\"),o.importedSymbols=[],code=[],code.push(this.makeCode(\"\".concat(this.tab,\"import \"))),null!=this.clause){var _code;(_code=code).push.apply(_code,_toConsumableArray(this.clause.compileNode(o)))}if(null!=(null==(ref1=this.source)?void 0:ref1.value)&&(null!==this.clause&&code.push(this.makeCode(\" from \")),code.push(this.makeCode(this.source.value)),null!=this.assertions)){var _code2;code.push(this.makeCode(\" assert \")),(_code2=code).push.apply(_code2,_toConsumableArray(this.assertions.compileToFragments(o)))}return code.push(this.makeCode(\";\")),code}},{key:\"astNode\",value:function astNode(o){return o.importedSymbols=[],_get(_getPrototypeOf(ImportDeclaration.prototype),\"astNode\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ret;return ret={specifiers:null==(ref1=null==(ref2=this.clause)?void 0:ref2.ast(o))?[]:ref1,source:this.source.ast(o),assertions:this.astAssertions(o)},this.clause&&(ret.importKind=\"value\"),ret}}]),ImportDeclaration}(ModuleDeclaration),exports.ImportClause=ImportClause=function(){var ImportClause=function(_Base34){\"use strict\";function ImportClause(defaultBinding,namedImports){var _this53;return _classCallCheck(this,ImportClause),_this53=_super57.call(this),_this53.defaultBinding=defaultBinding,_this53.namedImports=namedImports,_this53}_inherits(ImportClause,_Base34);var _super57=_createSuper(ImportClause);return _createClass(ImportClause,[{key:\"compileNode\",value:function compileNode(o){var code;if(code=[],null!=this.defaultBinding){var _code3;(_code3=code).push.apply(_code3,_toConsumableArray(this.defaultBinding.compileNode(o))),null!=this.namedImports&&code.push(this.makeCode(\", \"))}if(null!=this.namedImports){var _code4;(_code4=code).push.apply(_code4,_toConsumableArray(this.namedImports.compileNode(o)))}return code}},{key:\"astNode\",value:function astNode(o){var ref1,ref2;return compact(flatten([null==(ref1=this.defaultBinding)?void 0:ref1.ast(o),null==(ref2=this.namedImports)?void 0:ref2.ast(o)]))}}]),ImportClause}(Base);return ImportClause.prototype.children=[\"defaultBinding\",\"namedImports\"],ImportClause}.call(this),exports.ExportDeclaration=ExportDeclaration=function(_ModuleDeclaration2){\"use strict\";function ExportDeclaration(){return _classCallCheck(this,ExportDeclaration),_super58.apply(this,arguments)}_inherits(ExportDeclaration,_ModuleDeclaration2);var _super58=_createSuper(ExportDeclaration);return _createClass(ExportDeclaration,[{key:\"compileNode\",value:function compileNode(o){var code,ref1;if(this.checkScope(o,\"export\"),this.checkForAnonymousClassExport(),code=[],code.push(this.makeCode(\"\".concat(this.tab,\"export \"))),this instanceof ExportDefaultDeclaration&&code.push(this.makeCode(\"default \")),!(this instanceof ExportDefaultDeclaration)&&(this.clause instanceof Assign||this.clause instanceof Class)&&(code.push(this.makeCode(\"var \")),this.clause.moduleDeclaration=\"export\"),code=null!=this.clause.body&&this.clause.body instanceof Block?code.concat(this.clause.compileToFragments(o,LEVEL_TOP)):code.concat(this.clause.compileNode(o)),null!=(null==(ref1=this.source)?void 0:ref1.value)&&(code.push(this.makeCode(\" from \".concat(this.source.value))),null!=this.assertions)){var _code5;code.push(this.makeCode(\" assert \")),(_code5=code).push.apply(_code5,_toConsumableArray(this.assertions.compileToFragments(o)))}return code.push(this.makeCode(\";\")),code}},{key:\"checkForAnonymousClassExport\",value:function checkForAnonymousClassExport(){if(!(this instanceof ExportDefaultDeclaration)&&this.clause instanceof Class&&!this.clause.variable)return this.clause.error(\"anonymous classes cannot be exported\")}},{key:\"astNode\",value:function astNode(o){return this.checkForAnonymousClassExport(),_get(_getPrototypeOf(ExportDeclaration.prototype),\"astNode\",this).call(this,o)}}]),ExportDeclaration}(ModuleDeclaration),exports.ExportNamedDeclaration=ExportNamedDeclaration=function(_ExportDeclaration){\"use strict\";function ExportNamedDeclaration(){return _classCallCheck(this,ExportNamedDeclaration),_super59.apply(this,arguments)}_inherits(ExportNamedDeclaration,_ExportDeclaration);var _super59=_createSuper(ExportNamedDeclaration);return _createClass(ExportNamedDeclaration,[{key:\"astProperties\",value:function astProperties(o){var clauseAst,ref1,ref2,ret;return ret={source:null==(ref1=null==(ref2=this.source)?void 0:ref2.ast(o))?null:ref1,assertions:this.astAssertions(o),exportKind:\"value\"},clauseAst=this.clause.ast(o),this.clause instanceof ExportSpecifierList?(ret.specifiers=clauseAst,ret.declaration=null):(ret.specifiers=[],ret.declaration=clauseAst),ret}}]),ExportNamedDeclaration}(ExportDeclaration),exports.ExportDefaultDeclaration=ExportDefaultDeclaration=function(_ExportDeclaration2){\"use strict\";function ExportDefaultDeclaration(){return _classCallCheck(this,ExportDefaultDeclaration),_super60.apply(this,arguments)}_inherits(ExportDefaultDeclaration,_ExportDeclaration2);var _super60=_createSuper(ExportDefaultDeclaration);return _createClass(ExportDefaultDeclaration,[{key:\"astProperties\",value:function astProperties(o){return{declaration:this.clause.ast(o),assertions:this.astAssertions(o)}}}]),ExportDefaultDeclaration}(ExportDeclaration),exports.ExportAllDeclaration=ExportAllDeclaration=function(_ExportDeclaration3){\"use strict\";function ExportAllDeclaration(){return _classCallCheck(this,ExportAllDeclaration),_super61.apply(this,arguments)}_inherits(ExportAllDeclaration,_ExportDeclaration3);var _super61=_createSuper(ExportAllDeclaration);return _createClass(ExportAllDeclaration,[{key:\"astProperties\",value:function astProperties(o){return{source:this.source.ast(o),assertions:this.astAssertions(o),exportKind:\"value\"}}}]),ExportAllDeclaration}(ExportDeclaration),exports.ModuleSpecifierList=ModuleSpecifierList=function(){var ModuleSpecifierList=function(_Base35){\"use strict\";function ModuleSpecifierList(specifiers){var _this54;return _classCallCheck(this,ModuleSpecifierList),_this54=_super62.call(this),_this54.specifiers=specifiers,_this54}_inherits(ModuleSpecifierList,_Base35);var _super62=_createSuper(ModuleSpecifierList);return _createClass(ModuleSpecifierList,[{key:\"compileNode\",value:function compileNode(o){var code,compiledList,fragments,index,j,len1,specifier;if(code=[],o.indent+=TAB,compiledList=function(){var j,len1,ref1,results1;for(ref1=this.specifiers,results1=[],(j=0,len1=ref1.length);j<len1;j++)specifier=ref1[j],results1.push(specifier.compileToFragments(o,LEVEL_LIST));return results1}.call(this),0!==this.specifiers.length){for(code.push(this.makeCode(\"{\\n\".concat(o.indent))),index=j=0,len1=compiledList.length;j<len1;index=++j){var _code6;fragments=compiledList[index],index&&code.push(this.makeCode(\",\\n\".concat(o.indent))),(_code6=code).push.apply(_code6,_toConsumableArray(fragments))}code.push(this.makeCode(\"\\n}\"))}else code.push(this.makeCode(\"{}\"));return code}},{key:\"astNode\",value:function astNode(o){var j,len1,ref1,results1,specifier;for(ref1=this.specifiers,results1=[],(j=0,len1=ref1.length);j<len1;j++)specifier=ref1[j],results1.push(specifier.ast(o));return results1}}]),ModuleSpecifierList}(Base);return ModuleSpecifierList.prototype.children=[\"specifiers\"],ModuleSpecifierList}.call(this),exports.ImportSpecifierList=ImportSpecifierList=function(_ModuleSpecifierList){\"use strict\";function ImportSpecifierList(){return _classCallCheck(this,ImportSpecifierList),_super63.apply(this,arguments)}_inherits(ImportSpecifierList,_ModuleSpecifierList);var _super63=_createSuper(ImportSpecifierList);return _createClass(ImportSpecifierList)}(ModuleSpecifierList),exports.ExportSpecifierList=ExportSpecifierList=function(_ModuleSpecifierList2){\"use strict\";function ExportSpecifierList(){return _classCallCheck(this,ExportSpecifierList),_super64.apply(this,arguments)}_inherits(ExportSpecifierList,_ModuleSpecifierList2);var _super64=_createSuper(ExportSpecifierList);return _createClass(ExportSpecifierList)}(ModuleSpecifierList),exports.ModuleSpecifier=ModuleSpecifier=function(){var ModuleSpecifier=function(_Base36){\"use strict\";function ModuleSpecifier(original,alias,moduleDeclarationType1){var _this55;_classCallCheck(this,ModuleSpecifier);var ref1,ref2;if(_this55=_super65.call(this),_this55.original=original,_this55.alias=alias,_this55.moduleDeclarationType=moduleDeclarationType1,_this55.original.comments||(null==(ref1=_this55.alias)?void 0:ref1.comments)){if(_this55.comments=[],_this55.original.comments){var _this55$comments;(_this55$comments=_this55.comments).push.apply(_this55$comments,_toConsumableArray(_this55.original.comments))}if(null==(ref2=_this55.alias)?void 0:ref2.comments){var _this55$comments2;(_this55$comments2=_this55.comments).push.apply(_this55$comments2,_toConsumableArray(_this55.alias.comments))}}return _this55.identifier=null==_this55.alias?_this55.original.value:_this55.alias.value,_this55}_inherits(ModuleSpecifier,_Base36);var _super65=_createSuper(ModuleSpecifier);return _createClass(ModuleSpecifier,[{key:\"compileNode\",value:function compileNode(o){var code;return this.addIdentifierToScope(o),code=[],code.push(this.makeCode(this.original.value)),null!=this.alias&&code.push(this.makeCode(\" as \".concat(this.alias.value))),code}},{key:\"addIdentifierToScope\",value:function addIdentifierToScope(o){return o.scope.find(this.identifier,this.moduleDeclarationType)}},{key:\"astNode\",value:function astNode(o){return this.addIdentifierToScope(o),_get(_getPrototypeOf(ModuleSpecifier.prototype),\"astNode\",this).call(this,o)}}]),ModuleSpecifier}(Base);return ModuleSpecifier.prototype.children=[\"original\",\"alias\"],ModuleSpecifier}.call(this),exports.ImportSpecifier=ImportSpecifier=function(_ModuleSpecifier){\"use strict\";function ImportSpecifier(imported,local){return _classCallCheck(this,ImportSpecifier),_super66.call(this,imported,local,\"import\")}_inherits(ImportSpecifier,_ModuleSpecifier);var _super66=_createSuper(ImportSpecifier);return _createClass(ImportSpecifier,[{key:\"addIdentifierToScope\",value:function addIdentifierToScope(o){var ref1;return(ref1=this.identifier,0<=indexOf.call(o.importedSymbols,ref1))||o.scope.check(this.identifier)?this.error(\"'\".concat(this.identifier,\"' has already been declared\")):o.importedSymbols.push(this.identifier),_get(_getPrototypeOf(ImportSpecifier.prototype),\"addIdentifierToScope\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(o){var originalAst,ref1,ref2;return originalAst=this.original.ast(o),{imported:originalAst,local:null==(ref1=null==(ref2=this.alias)?void 0:ref2.ast(o))?originalAst:ref1,importKind:null}}}]),ImportSpecifier}(ModuleSpecifier),exports.ImportDefaultSpecifier=ImportDefaultSpecifier=function(_ImportSpecifier){\"use strict\";function ImportDefaultSpecifier(){return _classCallCheck(this,ImportDefaultSpecifier),_super67.apply(this,arguments)}_inherits(ImportDefaultSpecifier,_ImportSpecifier);var _super67=_createSuper(ImportDefaultSpecifier);return _createClass(ImportDefaultSpecifier,[{key:\"astProperties\",value:function astProperties(o){return{local:this.original.ast(o)}}}]),ImportDefaultSpecifier}(ImportSpecifier),exports.ImportNamespaceSpecifier=ImportNamespaceSpecifier=function(_ImportSpecifier2){\"use strict\";function ImportNamespaceSpecifier(){return _classCallCheck(this,ImportNamespaceSpecifier),_super68.apply(this,arguments)}_inherits(ImportNamespaceSpecifier,_ImportSpecifier2);var _super68=_createSuper(ImportNamespaceSpecifier);return _createClass(ImportNamespaceSpecifier,[{key:\"astProperties\",value:function astProperties(o){return{local:this.alias.ast(o)}}}]),ImportNamespaceSpecifier}(ImportSpecifier),exports.ExportSpecifier=ExportSpecifier=function(_ModuleSpecifier2){\"use strict\";function ExportSpecifier(local,exported){return _classCallCheck(this,ExportSpecifier),_super69.call(this,local,exported,\"export\")}_inherits(ExportSpecifier,_ModuleSpecifier2);var _super69=_createSuper(ExportSpecifier);return _createClass(ExportSpecifier,[{key:\"astProperties\",value:function astProperties(o){var originalAst,ref1,ref2;return originalAst=this.original.ast(o),{local:originalAst,exported:null==(ref1=null==(ref2=this.alias)?void 0:ref2.ast(o))?originalAst:ref1}}}]),ExportSpecifier}(ModuleSpecifier),exports.DynamicImport=DynamicImport=function(_Base37){\"use strict\";function DynamicImport(){return _classCallCheck(this,DynamicImport),_super70.apply(this,arguments)}_inherits(DynamicImport,_Base37);var _super70=_createSuper(DynamicImport);return _createClass(DynamicImport,[{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\"import\")]}},{key:\"astType\",value:function astType(){return\"Import\"}}]),DynamicImport}(Base),exports.DynamicImportCall=DynamicImportCall=function(_Call3){\"use strict\";function DynamicImportCall(){return _classCallCheck(this,DynamicImportCall),_super71.apply(this,arguments)}_inherits(DynamicImportCall,_Call3);var _super71=_createSuper(DynamicImportCall);return _createClass(DynamicImportCall,[{key:\"compileNode\",value:function compileNode(o){return this.checkArguments(),_get(_getPrototypeOf(DynamicImportCall.prototype),\"compileNode\",this).call(this,o)}},{key:\"checkArguments\",value:function checkArguments(){var ref1;if(!(1<=(ref1=this.args.length)&&2>=ref1))return this.error(\"import() accepts either one or two arguments\")}},{key:\"astNode\",value:function astNode(o){return this.checkArguments(),_get(_getPrototypeOf(DynamicImportCall.prototype),\"astNode\",this).call(this,o)}}]),DynamicImportCall}(Call),exports.Assign=Assign=function(){var Assign=function(_Base38){\"use strict\";function Assign(variable1,value1,context1){var options=3<arguments.length&&void 0!==arguments[3]?arguments[3]:{},_this56;_classCallCheck(this,Assign),_this56=_super72.call(this),_this56.variable=variable1,_this56.value=value1,_this56.context=context1,_this56.param=options.param,_this56.subpattern=options.subpattern,_this56.operatorToken=options.operatorToken,_this56.moduleDeclaration=options.moduleDeclaration;var _options$originalCont=options.originalContext;return _this56.originalContext=void 0===_options$originalCont?_this56.context:_options$originalCont,_this56.propagateLhs(),_this56}_inherits(Assign,_Base38);var _super72=_createSuper(Assign);return _createClass(Assign,[{key:\"isStatement\",value:function isStatement(o){return(null==o?void 0:o.level)===LEVEL_TOP&&null!=this.context&&(this.moduleDeclaration||0<=indexOf.call(this.context,\"?\"))}},{key:\"checkNameAssignability\",value:function checkNameAssignability(o,varBase){if(\"import\"===o.scope.type(varBase.value))return varBase.error(\"'\".concat(varBase.value,\"' is read-only\"))}},{key:\"assigns\",value:function assigns(name){return this[\"object\"===this.context?\"value\":\"variable\"].assigns(name)}},{key:\"unfoldSoak\",value:function unfoldSoak(o){return _unfoldSoak(o,this,\"variable\")}},{key:\"addScopeVariables\",value:function addScopeVariables(o){var _this57=this,_ref46=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref46$allowAssignmen=_ref46.allowAssignmentToExpansion,_ref46$allowAssignmen2=_ref46.allowAssignmentToNontrailingSplat,_ref46$allowAssignmen3=_ref46.allowAssignmentToEmptyArray,_ref46$allowAssignmen4=_ref46.allowAssignmentToComplexSplat,varBase;if(!(this.context&&\"**=\"!==this.context))return varBase=this.variable.unwrapAll(),varBase.isAssignable({allowExpansion:void 0!==_ref46$allowAssignmen&&_ref46$allowAssignmen,allowNontrailingSplat:void 0!==_ref46$allowAssignmen2&&_ref46$allowAssignmen2,allowEmptyArray:void 0!==_ref46$allowAssignmen3&&_ref46$allowAssignmen3,allowComplexSplat:void 0!==_ref46$allowAssignmen4&&_ref46$allowAssignmen4})||this.variable.error(\"'\".concat(this.variable.compile(o),\"' can't be assigned\")),varBase.eachName(function(name){var alreadyDeclared,commentFragments,commentsNode,message;if(\"function\"!=typeof name.hasProperties||!name.hasProperties())return(message=isUnassignable(name.value),message&&name.error(message),_this57.checkNameAssignability(o,name),_this57.moduleDeclaration)?(o.scope.add(name.value,_this57.moduleDeclaration),name.isDeclaration=!0):_this57.param?o.scope.add(name.value,\"alwaysDeclare\"===_this57.param?\"var\":\"param\"):(alreadyDeclared=o.scope.find(name.value),null==name.isDeclaration&&(name.isDeclaration=!alreadyDeclared),name.comments&&!o.scope.comments[name.value]&&!(_this57.value instanceof Class)&&name.comments.every(function(comment){return comment.here&&!comment.multiline}))?(commentsNode=new IdentifierLiteral(name.value),commentsNode.comments=name.comments,commentFragments=[],_this57.compileCommentFragments(o,commentsNode,commentFragments),o.scope.comments[name.value]=commentFragments):void 0})}},{key:\"compileNode\",value:function compileNode(o){var answer,compiledName,isValue,name,properties,prototype,ref1,ref2,ref3,ref4,val;if(isValue=this.variable instanceof Value,isValue){if((this.variable.isArray()||this.variable.isObject())&&!this.variable.isAssignable())return this.variable.isObject()&&this.variable.base.hasSplat()?this.compileObjectDestruct(o):this.compileDestructuring(o);if(this.variable.isSplice())return this.compileSplice(o);if(this.isConditional())return this.compileConditional(o);if(\"//=\"===(ref1=this.context)||\"%%=\"===ref1)return this.compileSpecialMath(o)}if(this.addScopeVariables(o),this.value instanceof Code)if(this.value.isStatic)this.value.name=this.variable.properties[0];else if(2<=(null==(ref2=this.variable.properties)?void 0:ref2.length)){var _ref47,_ref48,_splice$call,_splice$call2;ref3=this.variable.properties,_ref47=ref3,_ref48=_toArray(_ref47),properties=_ref48.slice(0),_ref47,_splice$call=splice.call(properties,-2),_splice$call2=_slicedToArray(_splice$call,2),prototype=_splice$call2[0],name=_splice$call2[1],_splice$call,\"prototype\"===(null==(ref4=prototype.name)?void 0:ref4.value)&&(this.value.name=name)}return(val=this.value.compileToFragments(o,LEVEL_LIST),compiledName=this.variable.compileToFragments(o,LEVEL_LIST),\"object\"===this.context)?(this.variable.shouldCache()&&(compiledName.unshift(this.makeCode(\"[\")),compiledName.push(this.makeCode(\"]\"))),compiledName.concat(this.makeCode(\": \"),val)):(answer=compiledName.concat(this.makeCode(\" \".concat(this.context||\"=\",\" \")),val),o.level>LEVEL_LIST||isValue&&this.variable.base instanceof Obj&&!this.nestedLhs&&!0!==this.param?this.wrapInParentheses(answer):answer)}},{key:\"compileObjectDestruct\",value:function compileObjectDestruct(o){var assigns,props,refVal,splat,splatProp;this.variable.base.reorderProperties(),props=this.variable.base.properties;var _slice1$call15=slice1.call(props,-1),_slice1$call16=_slicedToArray(_slice1$call15,1);return splat=_slice1$call16[0],splatProp=splat.name,assigns=[],refVal=new Value(new IdentifierLiteral(o.scope.freeVariable(\"ref\"))),props.splice(-1,1,new Splat(refVal)),assigns.push(new Assign(new Value(new Obj(props)),this.value).compileToFragments(o,LEVEL_LIST)),assigns.push(new Assign(new Value(splatProp),refVal).compileToFragments(o,LEVEL_LIST)),this.joinFragmentArrays(assigns,\", \")}},{key:\"compileDestructuring\",value:function compileDestructuring(o){var _this58=this,assignObjects,assigns,code,compSlice,compSplice,complexObjects,expIdx,expans,fragments,hasObjAssigns,isExpans,isSplat,leftObjs,loopObjects,obj,objIsUnassignable,objects,olen,processObjects,pushAssign,ref,refExp,restVar,rightObjs,slicer,splatVar,splatVarAssign,splatVarRef,splats,splatsAndExpans,top,value,vvar,vvarText;if(top=o.level===LEVEL_TOP,value=this.value,objects=this.variable.base.objects,olen=objects.length,0===olen)return code=value.compileToFragments(o),o.level>=LEVEL_OP?this.wrapInParentheses(code):code;var _objects=objects,_objects2=_slicedToArray(_objects,1);obj=_objects2[0],this.disallowLoneExpansion();var _this$getAndCheckSpla=this.getAndCheckSplatsAndExpansions();return splats=_this$getAndCheckSpla.splats,expans=_this$getAndCheckSpla.expans,splatsAndExpans=_this$getAndCheckSpla.splatsAndExpans,isSplat=0<(null==splats?void 0:splats.length),isExpans=0<(null==expans?void 0:expans.length),vvar=value.compileToFragments(o,LEVEL_LIST),vvarText=fragmentsToText(vvar),assigns=[],pushAssign=function(variable,val){return assigns.push(new Assign(variable,val,null,{param:_this58.param,subpattern:!0}).compileToFragments(o,LEVEL_LIST))},isSplat&&(splatVar=objects[splats[0]].name.unwrap(),(splatVar instanceof Arr||splatVar instanceof Obj)&&(splatVarRef=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),objects[splats[0]].name=splatVarRef,splatVarAssign=function(){return pushAssign(new Value(splatVar),splatVarRef)})),(!(value.unwrap()instanceof IdentifierLiteral)||this.variable.assigns(vvarText))&&(ref=o.scope.freeVariable(\"ref\"),assigns.push([this.makeCode(ref+\" = \")].concat(_toConsumableArray(vvar))),vvar=[this.makeCode(ref)],vvarText=ref),slicer=function(type){return function(vvar,start){var end=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],args,slice;return vvar instanceof Value||(vvar=new IdentifierLiteral(vvar)),args=[vvar,new NumberLiteral(start)],end&&args.push(new NumberLiteral(end)),slice=new Value(new IdentifierLiteral(utility(type,o)),[new Access(new PropertyName(\"call\"))]),new Value(new Call(slice,args))}},compSlice=slicer(\"slice\"),compSplice=slicer(\"splice\"),hasObjAssigns=function(objs){var i,j,len1,results1;for(results1=[],i=j=0,len1=objs.length;j<len1;i=++j)obj=objs[i],obj instanceof Assign&&\"object\"===obj.context&&results1.push(i);return results1},objIsUnassignable=function(objs){var j,len1;for(j=0,len1=objs.length;j<len1;j++)if(obj=objs[j],!obj.isAssignable())return!0;return!1},complexObjects=function(objs){return hasObjAssigns(objs).length||objIsUnassignable(objs)||1===olen},loopObjects=function(objs,vvar,vvarTxt){var acc,i,idx,j,len1,message,results1,vval;for(results1=[],i=j=0,len1=objs.length;j<len1;i=++j)if(obj=objs[i],!(obj instanceof Elision)){if(obj instanceof Assign&&\"object\"===obj.context){var _obj=obj;if(idx=_obj.variable.base,vvar=_obj.value,vvar instanceof Assign){var _vvar=vvar;vvar=_vvar.variable}idx=vvar[\"this\"]?vvar.properties[0].name:new PropertyName(vvar.unwrap().value),acc=idx.unwrap()instanceof PropertyName,vval=new Value(value,[new(acc?Access:Index)(idx)])}else vvar=function(){switch(!1){case!(obj instanceof Splat):return new Value(obj.name);default:return obj;}}(),vval=function(){switch(!1){case!(obj instanceof Splat):return compSlice(vvarTxt,i);default:return new Value(new Literal(vvarTxt),[new Index(new NumberLiteral(i))]);}}();message=isUnassignable(vvar.unwrap().value),message&&vvar.error(message),results1.push(pushAssign(vvar,vval))}return results1},assignObjects=function(objs,vvar,vvarTxt){var vval;return vvar=new Value(new Arr(objs,!0)),vval=vvarTxt instanceof Value?vvarTxt:new Value(new Literal(vvarTxt)),pushAssign(vvar,vval)},processObjects=function(objs,vvar,vvarTxt){return complexObjects(objs)?loopObjects(objs,vvar,vvarTxt):assignObjects(objs,vvar,vvarTxt)},splatsAndExpans.length?(expIdx=splatsAndExpans[0],leftObjs=objects.slice(0,expIdx+(isSplat?1:0)),rightObjs=objects.slice(expIdx+1),0!==leftObjs.length&&processObjects(leftObjs,vvar,vvarText),0!==rightObjs.length&&(refExp=function(){switch(!1){case!isSplat:return compSplice(new Value(objects[expIdx].name),-1*rightObjs.length);case!isExpans:return compSlice(vvarText,-1*rightObjs.length);}}(),complexObjects(rightObjs)&&(restVar=refExp,refExp=o.scope.freeVariable(\"ref\"),assigns.push([this.makeCode(refExp+\" = \")].concat(_toConsumableArray(restVar.compileToFragments(o,LEVEL_LIST))))),processObjects(rightObjs,vvar,refExp))):processObjects(objects,vvar,vvarText),\"function\"==typeof splatVarAssign&&splatVarAssign(),top||this.subpattern||assigns.push(vvar),fragments=this.joinFragmentArrays(assigns,\", \"),o.level<LEVEL_LIST?fragments:this.wrapInParentheses(fragments)}},{key:\"disallowLoneExpansion\",value:function disallowLoneExpansion(){var loneObject,objects;if(this.variable.base instanceof Arr&&(objects=this.variable.base.objects,1===(null==objects?void 0:objects.length))){var _objects3=objects,_objects4=_slicedToArray(_objects3,1);if(loneObject=_objects4[0],loneObject instanceof Expansion)return loneObject.error(\"Destructuring assignment has no target\")}}},{key:\"getAndCheckSplatsAndExpansions\",value:function getAndCheckSplatsAndExpansions(){var expans,i,obj,objects,splats,splatsAndExpans;return this.variable.base instanceof Arr?(objects=this.variable.base.objects,splats=function(){var j,len1,results1;for(results1=[],i=j=0,len1=objects.length;j<len1;i=++j)obj=objects[i],obj instanceof Splat&&results1.push(i);return results1}(),expans=function(){var j,len1,results1;for(results1=[],i=j=0,len1=objects.length;j<len1;i=++j)obj=objects[i],obj instanceof Expansion&&results1.push(i);return results1}(),splatsAndExpans=[].concat(_toConsumableArray(splats),_toConsumableArray(expans)),1<splatsAndExpans.length&&objects[splatsAndExpans.sort()[1]].error(\"multiple splats/expansions are disallowed in an assignment\"),{splats:splats,expans:expans,splatsAndExpans:splatsAndExpans}):{splats:[],expans:[],splatsAndExpans:[]}}},{key:\"compileConditional\",value:function compileConditional(o){var _this$variable$cacheR=this.variable.cacheReference(o),_this$variable$cacheR2=_slicedToArray(_this$variable$cacheR,2),fragments,left,right;return left=_this$variable$cacheR2[0],right=_this$variable$cacheR2[1],left.properties.length||!(left.base instanceof Literal)||left.base instanceof ThisLiteral||o.scope.check(left.base.value)||this.throwUnassignableConditionalError(left.base.value),0<=indexOf.call(this.context,\"?\")?(o.isExistentialEquals=!0,new If(new Existence(left),right,{type:\"if\"}).addElse(new Assign(right,this.value,\"=\")).compileToFragments(o)):(fragments=new Op(this.context.slice(0,-1),left,new Assign(right,this.value,\"=\")).compileToFragments(o),o.level<=LEVEL_LIST?fragments:this.wrapInParentheses(fragments))}},{key:\"compileSpecialMath\",value:function compileSpecialMath(o){var _this$variable$cacheR3=this.variable.cacheReference(o),_this$variable$cacheR4=_slicedToArray(_this$variable$cacheR3,2),left,right;return left=_this$variable$cacheR4[0],right=_this$variable$cacheR4[1],new Assign(left,new Op(this.context.slice(0,-1),right,this.value)).compileToFragments(o)}},{key:\"compileSplice\",value:function compileSplice(o){var _this$variable$proper=this.variable.properties.pop(),_this$variable$proper2=_this$variable$proper.range,answer,exclusive,from,fromDecl,fromRef,name,to,unwrappedVar,valDef,valRef;if(from=_this$variable$proper2.from,to=_this$variable$proper2.to,exclusive=_this$variable$proper2.exclusive,unwrappedVar=this.variable.unwrapAll(),unwrappedVar.comments&&(moveComments(unwrappedVar,this),delete this.variable.comments),name=this.variable.compile(o),from){var _this$cacheToCodeFrag7=this.cacheToCodeFragments(from.cache(o,LEVEL_OP)),_this$cacheToCodeFrag8=_slicedToArray(_this$cacheToCodeFrag7,2);fromDecl=_this$cacheToCodeFrag8[0],fromRef=_this$cacheToCodeFrag8[1]}else fromDecl=fromRef=\"0\";to?(null==from?void 0:from.isNumber())&&to.isNumber()?(to=to.compile(o)-fromRef,!exclusive&&(to+=1)):(to=to.compile(o,LEVEL_ACCESS)+\" - \"+fromRef,!exclusive&&(to+=\" + 1\")):to=\"9e9\";var _this$value$cache=this.value.cache(o,LEVEL_LIST),_this$value$cache2=_slicedToArray(_this$value$cache,2);return valDef=_this$value$cache2[0],valRef=_this$value$cache2[1],answer=[].concat(this.makeCode(\"\".concat(utility(\"splice\",o),\".apply(\").concat(name,\", [\").concat(fromDecl,\", \").concat(to,\"].concat(\")),valDef,this.makeCode(\")), \"),valRef),o.level>LEVEL_TOP?this.wrapInParentheses(answer):answer}},{key:\"eachName\",value:function eachName(iterator){return this.variable.unwrapAll().eachName(iterator)}},{key:\"isDefaultAssignment\",value:function isDefaultAssignment(){return this.param||this.nestedLhs}},{key:\"propagateLhs\",value:function propagateLhs(){var ref1,ref2;return(null==(ref1=this.variable)?void 0:\"function\"==typeof ref1.isArray?ref1.isArray():void 0)||(null==(ref2=this.variable)?void 0:\"function\"==typeof ref2.isObject?ref2.isObject():void 0)?this.variable.base.propagateLhs(!0):void 0}},{key:\"throwUnassignableConditionalError\",value:function throwUnassignableConditionalError(name){return this.variable.error(\"the variable \\\"\".concat(name,\"\\\" can't be assigned with \").concat(this.context,\" because it has not been declared before\"))}},{key:\"isConditional\",value:function isConditional(){var ref1;return\"||=\"===(ref1=this.context)||\"&&=\"===ref1||\"?=\"===ref1}},{key:\"astNode\",value:function astNode(o){var variable;return this.disallowLoneExpansion(),this.getAndCheckSplatsAndExpansions(),this.isConditional()&&(variable=this.variable.unwrap(),variable instanceof IdentifierLiteral&&!o.scope.check(variable.value)&&this.throwUnassignableConditionalError(variable.value)),this.addScopeVariables(o,{allowAssignmentToExpansion:!0,allowAssignmentToNontrailingSplat:!0,allowAssignmentToEmptyArray:!0,allowAssignmentToComplexSplat:!0}),_get(_getPrototypeOf(Assign.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isDefaultAssignment()?\"AssignmentPattern\":\"AssignmentExpression\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ret;return ret={right:this.value.ast(o,LEVEL_LIST),left:this.variable.ast(o,LEVEL_LIST)},this.isDefaultAssignment()||(ret.operator=null==(ref1=this.originalContext)?\"=\":ref1),ret}}]),Assign}(Base);return Assign.prototype.children=[\"variable\",\"value\"],Assign.prototype.isAssignable=YES,Assign.prototype.isStatementAst=NO,Assign}.call(this),exports.FuncGlyph=FuncGlyph=function(_Base39){\"use strict\";function FuncGlyph(glyph){var _this59;return _classCallCheck(this,FuncGlyph),_this59=_super73.call(this),_this59.glyph=glyph,_this59}_inherits(FuncGlyph,_Base39);var _super73=_createSuper(FuncGlyph);return _createClass(FuncGlyph)}(Base),exports.Code=Code=function(){var Code=function(_Base40){\"use strict\";function Code(params,body,funcGlyph,paramStart){var _this60;_classCallCheck(this,Code);var ref1;return _this60=_super74.call(this),_this60.funcGlyph=funcGlyph,_this60.paramStart=paramStart,_this60.params=params||[],_this60.body=body||new Block,_this60.bound=\"=>\"===(null==(ref1=_this60.funcGlyph)?void 0:ref1.glyph),_this60.isGenerator=!1,_this60.isAsync=!1,_this60.isMethod=!1,_this60.body.traverseChildren(!1,function(node){if((node instanceof Op&&node.isYield()||node instanceof YieldReturn)&&(_this60.isGenerator=!0),(node instanceof Op&&node.isAwait()||node instanceof AwaitReturn)&&(_this60.isAsync=!0),node instanceof For&&node.isAwait())return _this60.isAsync=!0}),_this60.propagateLhs(),_this60}_inherits(Code,_Base40);var _super74=_createSuper(Code);return _createClass(Code,[{key:\"isStatement\",value:function isStatement(){return this.isMethod}},{key:\"makeScope\",value:function makeScope(parentScope){return new Scope(parentScope,this.body,this)}},{key:\"compileNode\",value:function compileNode(o){var _this$body$expression3,_answer4,answer,body,boundMethodCheck,comment,condition,exprs,generatedVariables,haveBodyParam,haveSplatParam,i,ifTrue,j,k,l,len1,len2,len3,m,methodScope,modifiers,name,param,paramToAddToScope,params,paramsAfterSplat,ref,ref1,ref2,ref3,ref4,ref5,ref6,ref7,ref8,scopeVariablesCount,signature,splatParamName,thisAssignments,wasEmpty,yieldNode;for(this.checkForAsyncOrGeneratorConstructor(),this.bound&&((null==(ref1=o.scope.method)?void 0:ref1.bound)&&(this.context=o.scope.method.context),!this.context&&(this.context=\"this\")),this.updateOptions(o),params=[],exprs=[],thisAssignments=null==(ref2=null==(ref3=this.thisAssignments)?void 0:ref3.slice())?[]:ref2,paramsAfterSplat=[],haveSplatParam=!1,haveBodyParam=!1,this.checkForDuplicateParams(),this.disallowLoneExpansionAndMultipleSplats(),this.eachParamName(function(name,node,param,obj){var replacement,target;if(node[\"this\"])return name=node.properties[0].name.value,0<=indexOf.call(JS_FORBIDDEN,name)&&(name=\"_\".concat(name)),target=new IdentifierLiteral(o.scope.freeVariable(name,{reserve:!1})),replacement=param.name instanceof Obj&&obj instanceof Assign&&\"=\"===obj.operatorToken.value?new Assign(new IdentifierLiteral(name),target,\"object\"):target,param.renameParam(node,replacement),thisAssignments.push(new Assign(node,target))}),ref4=this.params,(i=j=0,len1=ref4.length);j<len1;i=++j)param=ref4[i],param.splat||param instanceof Expansion?(haveSplatParam=!0,param.splat?(param.name instanceof Arr||param.name instanceof Obj?(splatParamName=o.scope.freeVariable(\"arg\"),params.push(ref=new Value(new IdentifierLiteral(splatParamName))),exprs.push(new Assign(new Value(param.name),ref))):(params.push(ref=param.asReference(o)),splatParamName=fragmentsToText(ref.compileNodeWithoutComments(o))),param.shouldCache()&&exprs.push(new Assign(new Value(param.name),ref))):(splatParamName=o.scope.freeVariable(\"args\"),params.push(new Value(new IdentifierLiteral(splatParamName)))),o.scope.parameter(splatParamName)):((param.shouldCache()||haveBodyParam)&&(param.assignedInBody=!0,haveBodyParam=!0,null==param.value?exprs.push(new Assign(new Value(param.name),param.asReference(o),null,{param:\"alwaysDeclare\"})):(condition=new Op(\"===\",param,new UndefinedLiteral()),ifTrue=new Assign(new Value(param.name),param.value),exprs.push(new If(condition,ifTrue)))),haveSplatParam?(paramsAfterSplat.push(param),null!=param.value&&!param.shouldCache()&&(condition=new Op(\"===\",param,new UndefinedLiteral()),ifTrue=new Assign(new Value(param.name),param.value),exprs.push(new If(condition,ifTrue))),null!=(null==(ref5=param.name)?void 0:ref5.value)&&o.scope.add(param.name.value,\"var\",!0)):(ref=param.shouldCache()?param.asReference(o):null==param.value||param.assignedInBody?param:new Assign(new Value(param.name),param.value,null,{param:!0}),param.name instanceof Arr||param.name instanceof Obj?(param.name.lhs=!0,!param.shouldCache()&&param.name.eachName(function(prop){return o.scope.parameter(prop.value)})):(paramToAddToScope=null==param.value?ref:param,o.scope.parameter(fragmentsToText(paramToAddToScope.compileToFragmentsWithoutComments(o)))),params.push(ref)));if(0!==paramsAfterSplat.length&&exprs.unshift(new Assign(new Value(new Arr([new Splat(new IdentifierLiteral(splatParamName))].concat(_toConsumableArray(function(){var k,len2,results1;for(results1=[],k=0,len2=paramsAfterSplat.length;k<len2;k++)param=paramsAfterSplat[k],results1.push(param.asReference(o));return results1}())))),new Value(new IdentifierLiteral(splatParamName)))),wasEmpty=this.body.isEmpty(),this.disallowSuperInParamDefaults(),this.checkSuperCallsInConstructorBody(),!this.expandCtorSuper(thisAssignments)){var _this$body$expression2;(_this$body$expression2=this.body.expressions).unshift.apply(_this$body$expression2,_toConsumableArray(thisAssignments))}for((_this$body$expression3=this.body.expressions).unshift.apply(_this$body$expression3,_toConsumableArray(exprs)),this.isMethod&&this.bound&&!this.isStatic&&this.classVariable&&(boundMethodCheck=new Value(new Literal(utility(\"boundMethodCheck\",o))),this.body.expressions.unshift(new Call(boundMethodCheck,[new Value(new ThisLiteral()),this.classVariable]))),wasEmpty||this.noReturn||this.body.makeReturn(),this.bound&&this.isGenerator&&(yieldNode=this.body.contains(function(node){return node instanceof Op&&\"yield\"===node.operator}),(yieldNode||this).error(\"yield cannot occur inside bound (fat arrow) functions\")),modifiers=[],this.isMethod&&this.isStatic&&modifiers.push(\"static\"),this.isAsync&&modifiers.push(\"async\"),this.isMethod||this.bound?this.isGenerator&&modifiers.push(\"*\"):modifiers.push(\"function\".concat(this.isGenerator?\"*\":\"\")),signature=[this.makeCode(\"(\")],null!=(null==(ref6=this.paramStart)?void 0:ref6.comments)&&this.compileCommentFragments(o,this.paramStart,signature),(i=k=0,len2=params.length);k<len2;i=++k){var _signature;if(param=params[i],0!==i&&signature.push(this.makeCode(\", \")),haveSplatParam&&i===params.length-1&&signature.push(this.makeCode(\"...\")),scopeVariablesCount=o.scope.variables.length,(_signature=signature).push.apply(_signature,_toConsumableArray(param.compileToFragments(o,LEVEL_PAREN))),scopeVariablesCount!==o.scope.variables.length){var _o$scope$parent$varia;generatedVariables=o.scope.variables.splice(scopeVariablesCount),(_o$scope$parent$varia=o.scope.parent.variables).push.apply(_o$scope$parent$varia,_toConsumableArray(generatedVariables))}}if(signature.push(this.makeCode(\")\")),null!=(null==(ref7=this.funcGlyph)?void 0:ref7.comments)){for(ref8=this.funcGlyph.comments,l=0,len3=ref8.length;l<len3;l++)comment=ref8[l],comment.unshift=!1;this.compileCommentFragments(o,this.funcGlyph,signature)}if(this.body.isEmpty()||(body=this.body.compileWithDeclarations(o)),this.isMethod){var _ref49=[o.scope,o.scope.parent];methodScope=_ref49[0],o.scope=_ref49[1],name=this.name.compileToFragments(o),\".\"===name[0].code&&name.shift(),o.scope=methodScope}if(answer=this.joinFragmentArrays(function(){var len4,p,results1;for(results1=[],p=0,len4=modifiers.length;p<len4;p++)m=modifiers[p],results1.push(this.makeCode(m));return results1}.call(this),\" \"),modifiers.length&&name&&answer.push(this.makeCode(\" \")),name){var _answer3;(_answer3=answer).push.apply(_answer3,_toConsumableArray(name))}if((_answer4=answer).push.apply(_answer4,_toConsumableArray(signature)),this.bound&&!this.isMethod&&answer.push(this.makeCode(\" =>\")),answer.push(this.makeCode(\" {\")),null==body?void 0:body.length){var _answer5;(_answer5=answer).push.apply(_answer5,[this.makeCode(\"\\n\")].concat(_toConsumableArray(body),[this.makeCode(\"\\n\".concat(this.tab))]))}return answer.push(this.makeCode(\"}\")),this.isMethod?indentInitial(answer,this):this.front||o.level>=LEVEL_ACCESS?this.wrapInParentheses(answer):answer}},{key:\"updateOptions\",value:function updateOptions(o){return o.scope=del(o,\"classScope\")||this.makeScope(o.scope),o.scope.shared=del(o,\"sharedScope\"),o.indent+=TAB,delete o.bare,delete o.isExistentialEquals}},{key:\"checkForDuplicateParams\",value:function checkForDuplicateParams(){var paramNames;return paramNames=[],this.eachParamName(function(name,node){return 0<=indexOf.call(paramNames,name)&&node.error(\"multiple parameters named '\".concat(name,\"'\")),paramNames.push(name)})}},{key:\"eachParamName\",value:function eachParamName(iterator){var j,len1,param,ref1,results1;for(ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],results1.push(param.eachName(iterator));return results1}},{key:\"traverseChildren\",value:function traverseChildren(crossScope,func){if(crossScope)return _get(_getPrototypeOf(Code.prototype),\"traverseChildren\",this).call(this,crossScope,func)}},{key:\"replaceInContext\",value:function replaceInContext(child,replacement){return!!this.bound&&_get(_getPrototypeOf(Code.prototype),\"replaceInContext\",this).call(this,child,replacement)}},{key:\"disallowSuperInParamDefaults\",value:function disallowSuperInParamDefaults(){var _ref50=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},forAst=_ref50.forAst;return!!this.ctor&&this.eachSuperCall(Block.wrap(this.params),function(superCall){return superCall.error(\"'super' is not allowed in constructor parameter defaults\")},{checkForThisBeforeSuper:!forAst})}},{key:\"checkSuperCallsInConstructorBody\",value:function checkSuperCallsInConstructorBody(){var _this61=this,seenSuper;return!!this.ctor&&(seenSuper=this.eachSuperCall(this.body,function(superCall){if(\"base\"===_this61.ctor)return superCall.error(\"'super' is only allowed in derived class constructors\")}),seenSuper)}},{key:\"flagThisParamInDerivedClassConstructorWithoutCallingSuper\",value:function flagThisParamInDerivedClassConstructorWithoutCallingSuper(param){return param.error(\"Can't use @params in derived class constructors without calling super\")}},{key:\"checkForAsyncOrGeneratorConstructor\",value:function checkForAsyncOrGeneratorConstructor(){if(this.ctor&&(this.isAsync&&this.name.error(\"Class constructor may not be async\"),this.isGenerator))return this.name.error(\"Class constructor may not be a generator\")}},{key:\"disallowLoneExpansionAndMultipleSplats\",value:function disallowLoneExpansionAndMultipleSplats(){var j,len1,param,ref1,results1,seenSplatParam;for(seenSplatParam=!1,ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],param.splat||param instanceof Expansion?(seenSplatParam?param.error(\"only one splat or expansion parameter is allowed per function definition\"):param instanceof Expansion&&1===this.params.length&&param.error(\"an expansion parameter cannot be the only parameter in a function definition\"),results1.push(seenSplatParam=!0)):results1.push(void 0);return results1}},{key:\"expandCtorSuper\",value:function expandCtorSuper(thisAssignments){var haveThisParam,param,ref1,seenSuper;return!!this.ctor&&(seenSuper=this.eachSuperCall(this.body,function(superCall){return superCall.expressions=thisAssignments}),haveThisParam=thisAssignments.length&&thisAssignments.length!==(null==(ref1=this.thisAssignments)?void 0:ref1.length),\"derived\"===this.ctor&&!seenSuper&&haveThisParam&&(param=thisAssignments[0].variable,this.flagThisParamInDerivedClassConstructorWithoutCallingSuper(param)),seenSuper)}},{key:\"eachSuperCall\",value:function eachSuperCall(context,iterator){var _this62=this,_ref51=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_ref51$checkForThisBe=_ref51.checkForThisBeforeSuper,seenSuper;return seenSuper=!1,context.traverseChildren(!0,function(child){var childArgs;return child instanceof SuperCall?(!child.variable.accessor&&(childArgs=child.args.filter(function(arg){return!(arg instanceof Class)&&(!(arg instanceof Code)||arg.bound)}),Block.wrap(childArgs).traverseChildren(!0,function(node){if(node[\"this\"])return node.error(\"Can't call super with @params in derived class constructors\")})),seenSuper=!0,iterator(child)):(void 0===_ref51$checkForThisBe||_ref51$checkForThisBe)&&child instanceof ThisLiteral&&\"derived\"===_this62.ctor&&!seenSuper&&child.error(\"Can't reference 'this' before calling super in derived class constructors\"),!(child instanceof SuperCall)&&(!(child instanceof Code)||child.bound)}),seenSuper}},{key:\"propagateLhs\",value:function propagateLhs(){var j,len1,name,param,ref1,results1;for(ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++){param=ref1[j];var _param=param;name=_param.name,name instanceof Arr||name instanceof Obj?results1.push(name.propagateLhs(!0)):param instanceof Expansion?results1.push(param.lhs=!0):results1.push(void 0)}return results1}},{key:\"astAddParamsToScope\",value:function astAddParamsToScope(o){return this.eachParamName(function(name){return o.scope.add(name,\"param\")})}},{key:\"astNode\",value:function astNode(o){var _this63=this,seenSuper;return this.updateOptions(o),this.checkForAsyncOrGeneratorConstructor(),this.checkForDuplicateParams(),this.disallowSuperInParamDefaults({forAst:!0}),this.disallowLoneExpansionAndMultipleSplats(),seenSuper=this.checkSuperCallsInConstructorBody(),\"derived\"!==this.ctor||seenSuper||this.eachParamName(function(name,node){if(node[\"this\"])return _this63.flagThisParamInDerivedClassConstructorWithoutCallingSuper(node)}),this.astAddParamsToScope(o),this.body.isEmpty()||this.noReturn||this.body.makeReturn(null,!0),_get(_getPrototypeOf(Code.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isMethod?\"ClassMethod\":this.bound?\"ArrowFunctionExpression\":\"FunctionExpression\"}},{key:\"paramForAst\",value:function paramForAst(param){var name,splat,value;return param instanceof Expansion?param:(name=param.name,value=param.value,splat=param.splat,splat?new Splat(name,{lhs:!0,postfix:splat.postfix}).withLocationDataFrom(param):null==value?name:new Assign(name,value,null,{param:!0}).withLocationDataFrom({locationData:mergeLocationData(name.locationData,value.locationData)}))}},{key:\"methodAstProperties\",value:function methodAstProperties(o){var _this64=this,getIsComputed,ref1,ref2,ref3,ref4;return getIsComputed=function(){return!!(_this64.name instanceof Index)||!!(_this64.name instanceof ComputedPropertyName)||!!(_this64.name.name instanceof ComputedPropertyName)},{static:!!this.isStatic,key:this.name.ast(o),computed:getIsComputed(),kind:this.ctor?\"constructor\":\"method\",operator:null==(ref1=null==(ref2=this.operatorToken)?void 0:ref2.value)?\"=\":ref1,staticClassName:null==(ref3=null==(ref4=this.isStatic.staticClassName)?void 0:ref4.ast(o))?null:ref3,bound:!!this.bound}}},{key:\"astProperties\",value:function astProperties(o){var param,ref1;return Object.assign({params:function(){var j,len1,ref1,results1;for(ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],results1.push(this.paramForAst(param).ast(o));return results1}.call(this),body:this.body.ast(Object.assign({},o,{checkForDirectives:!0}),LEVEL_TOP),generator:!!this.isGenerator,async:!!this.isAsync,id:null,hasIndentedBody:this.body.locationData.first_line>(null==(ref1=this.funcGlyph)?void 0:ref1.locationData.first_line)},this.isMethod?this.methodAstProperties(o):{})}},{key:\"astLocationData\",value:function(){var astLocationData,functionLocationData;return(functionLocationData=_get(_getPrototypeOf(Code.prototype),\"astLocationData\",this).call(this),!this.isMethod)?functionLocationData:(astLocationData=mergeAstLocationData(this.name.astLocationData(),functionLocationData),null!=this.isStatic.staticClassName&&(astLocationData=mergeAstLocationData(this.isStatic.staticClassName.astLocationData(),astLocationData)),astLocationData)}}]),Code}(Base);return Code.prototype.children=[\"params\",\"body\"],Code.prototype.jumps=NO,Code}.call(this),exports.Param=Param=function(){var Param=function(_Base41){\"use strict\";function Param(name1,value1,splat1){var _this65;_classCallCheck(this,Param);var message,token;return _this65=_super75.call(this),_this65.name=name1,_this65.value=value1,_this65.splat=splat1,message=isUnassignable(_this65.name.unwrapAll().value),message&&_this65.name.error(message),_this65.name instanceof Obj&&_this65.name.generated&&(token=_this65.name.objects[0].operatorToken,token.error(\"unexpected \".concat(token.value))),_this65}_inherits(Param,_Base41);var _super75=_createSuper(Param);return _createClass(Param,[{key:\"compileToFragments\",value:function compileToFragments(o){return this.name.compileToFragments(o,LEVEL_LIST)}},{key:\"compileToFragmentsWithoutComments\",value:function compileToFragmentsWithoutComments(o){return this.name.compileToFragmentsWithoutComments(o,LEVEL_LIST)}},{key:\"asReference\",value:function asReference(o){var name,node;return this.reference?this.reference:(node=this.name,node[\"this\"]?(name=node.properties[0].name.value,0<=indexOf.call(JS_FORBIDDEN,name)&&(name=\"_\".concat(name)),node=new IdentifierLiteral(o.scope.freeVariable(name))):node.shouldCache()&&(node=new IdentifierLiteral(o.scope.freeVariable(\"arg\"))),node=new Value(node),node.updateLocationDataIfMissing(this.locationData),this.reference=node)}},{key:\"shouldCache\",value:function shouldCache(){return this.name.shouldCache()}},{key:\"eachName\",value:function eachName(iterator){var _this66=this,name=1<arguments.length&&void 0!==arguments[1]?arguments[1]:this.name,atParam,checkAssignabilityOfLiteral,j,len1,nObj,node,obj,ref1,ref2;if(checkAssignabilityOfLiteral=function(literal){var message;if(message=isUnassignable(literal.value),message&&literal.error(message),!literal.isAssignable())return literal.error(\"'\".concat(literal.value,\"' can't be assigned\"))},atParam=function(obj){var originalObj=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;return iterator(\"@\".concat(obj.properties[0].name.value),obj,_this66,originalObj)},name instanceof Call&&name.error(\"Function invocation can't be assigned\"),name instanceof Literal)return checkAssignabilityOfLiteral(name),iterator(name.value,name,this);if(name instanceof Value)return atParam(name);for(ref2=null==(ref1=name.objects)?[]:ref1,j=0,len1=ref2.length;j<len1;j++)obj=ref2[j],nObj=obj,obj instanceof Assign&&null==obj.context&&(obj=obj.variable),obj instanceof Assign?(obj=obj.value instanceof Assign?obj.value.variable:obj.value,this.eachName(iterator,obj.unwrap())):obj instanceof Splat?(node=obj.name.unwrap(),iterator(node.value,node,this)):obj instanceof Value?obj.isArray()||obj.isObject()?this.eachName(iterator,obj.base):obj[\"this\"]?atParam(obj,nObj):(checkAssignabilityOfLiteral(obj.base),iterator(obj.base.value,obj.base,this)):obj instanceof Elision?obj:!(obj instanceof Expansion)&&obj.error(\"illegal parameter \".concat(obj.compile()))}},{key:\"renameParam\",value:function renameParam(node,newNode){var isNode,replacement;return isNode=function(candidate){return candidate===node},replacement=function(node,parent){var key;return parent instanceof Obj?(key=node,node[\"this\"]&&(key=node.properties[0].name),node[\"this\"]&&key.value===newNode.value?new Value(newNode):new Assign(new Value(key),newNode,\"object\")):newNode},this.replaceInContext(isNode,replacement)}}]),Param}(Base);return Param.prototype.children=[\"name\",\"value\"],Param}.call(this),exports.Splat=Splat=function(){var Splat=function(_Base42){\"use strict\";function Splat(name){var _ref52=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},lhs1=_ref52.lhs,_ref52$postfix=_ref52.postfix,_this67;return _classCallCheck(this,Splat),_this67=_super76.call(this),_this67.lhs=lhs1,_this67.postfix=void 0===_ref52$postfix||_ref52$postfix,_this67.name=name.compile?name:new Literal(name),_this67}_inherits(Splat,_Base42);var _super76=_createSuper(Splat);return _createClass(Splat,[{key:\"shouldCache\",value:function shouldCache(){return!1}},{key:\"isAssignable\",value:function isAssignable(){var _ref53=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},_ref53$allowComplexSp=_ref53.allowComplexSplat;return this.name instanceof Obj||this.name instanceof Parens?void 0!==_ref53$allowComplexSp&&_ref53$allowComplexSp:this.name.isAssignable()&&(!this.name.isAtomic||this.name.isAtomic())}},{key:\"assigns\",value:function assigns(name){return this.name.assigns(name)}},{key:\"compileNode\",value:function compileNode(o){var compiledSplat;return compiledSplat=[this.makeCode(\"...\")].concat(_toConsumableArray(this.name.compileToFragments(o,LEVEL_OP))),this.jsx?[this.makeCode(\"{\")].concat(_toConsumableArray(compiledSplat),[this.makeCode(\"}\")]):compiledSplat}},{key:\"unwrap\",value:function unwrap(){return this.name}},{key:\"propagateLhs\",value:function propagateLhs(setLhs){var base1;return setLhs&&(this.lhs=!0),this.lhs?\"function\"==typeof(base1=this.name).propagateLhs?base1.propagateLhs(!0):void 0:void 0}},{key:\"astType\",value:function astType(){return this.jsx?\"JSXSpreadAttribute\":this.lhs?\"RestElement\":\"SpreadElement\"}},{key:\"astProperties\",value:function astProperties(o){return{argument:this.name.ast(o,LEVEL_OP),postfix:this.postfix}}}]),Splat}(Base);return Splat.prototype.children=[\"name\"],Splat}.call(this),exports.Expansion=Expansion=function(){var Expansion=function(_Base43){\"use strict\";function Expansion(){return _classCallCheck(this,Expansion),_super77.apply(this,arguments)}_inherits(Expansion,_Base43);var _super77=_createSuper(Expansion);return _createClass(Expansion,[{key:\"compileNode\",value:function compileNode(){return this.throwLhsError()}},{key:\"asReference\",value:function asReference(){return this}},{key:\"eachName\",value:function eachName(){}},{key:\"throwLhsError\",value:function throwLhsError(){return this.error(\"Expansion must be used inside a destructuring assignment or parameter list\")}},{key:\"astNode\",value:function astNode(o){return this.lhs||this.throwLhsError(),_get(_getPrototypeOf(Expansion.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"RestElement\"}},{key:\"astProperties\",value:function astProperties(){return{argument:null}}}]),Expansion}(Base);return Expansion.prototype.shouldCache=NO,Expansion}.call(this),exports.Elision=Elision=function(){var Elision=function(_Base44){\"use strict\";function Elision(){return _classCallCheck(this,Elision),_super78.apply(this,arguments)}_inherits(Elision,_Base44);var _super78=_createSuper(Elision);return _createClass(Elision,[{key:\"compileToFragments\",value:function compileToFragments(o,level){var fragment;return fragment=_get(_getPrototypeOf(Elision.prototype),\"compileToFragments\",this).call(this,o,level),fragment.isElision=!0,fragment}},{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\", \")]}},{key:\"asReference\",value:function asReference(){return this}},{key:\"eachName\",value:function eachName(){}},{key:\"astNode\",value:function astNode(){return null}}]),Elision}(Base);return Elision.prototype.isAssignable=YES,Elision.prototype.shouldCache=NO,Elision}.call(this),exports.While=While=function(){var While=function(_Base45){\"use strict\";function While(condition1){var _ref54=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},inverted=_ref54.invert,guard=_ref54.guard,isLoop=_ref54.isLoop,_this68;return _classCallCheck(this,While),_this68=_super79.call(this),_this68.condition=condition1,_this68.inverted=inverted,_this68.guard=guard,_this68.isLoop=isLoop,_this68}_inherits(While,_Base45);var _super79=_createSuper(While);return _createClass(While,[{key:\"makeReturn\",value:function makeReturn(results,mark){return results?_get(_getPrototypeOf(While.prototype),\"makeReturn\",this).call(this,results,mark):(this.returns=!this.jumps(),mark?void(this.returns&&this.body.makeReturn(results,mark)):this)}},{key:\"addBody\",value:function addBody(body1){return this.body=body1,this}},{key:\"jumps\",value:function jumps(){var expressions,j,jumpNode,len1,node;if(expressions=this.body.expressions,!expressions.length)return!1;for(j=0,len1=expressions.length;j<len1;j++)if(node=expressions[j],jumpNode=node.jumps({loop:!0}))return jumpNode;return!1}},{key:\"compileNode\",value:function compileNode(o){var answer,body,rvar,set;return o.indent+=TAB,set=\"\",body=this.body,body.isEmpty()?body=this.makeCode(\"\"):(this.returns&&(body.makeReturn(rvar=o.scope.freeVariable(\"results\")),set=\"\".concat(this.tab).concat(rvar,\" = [];\\n\")),this.guard&&(1<body.expressions.length?body.expressions.unshift(new If(new Parens(this.guard).invert(),new StatementLiteral(\"continue\"))):this.guard&&(body=Block.wrap([new If(this.guard,body)]))),body=[].concat(this.makeCode(\"\\n\"),body.compileToFragments(o,LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab)))),answer=[].concat(this.makeCode(set+this.tab+\"while (\"),this.processedCondition().compileToFragments(o,LEVEL_PAREN),this.makeCode(\") {\"),body,this.makeCode(\"}\")),this.returns&&answer.push(this.makeCode(\"\\n\".concat(this.tab,\"return \").concat(rvar,\";\"))),answer}},{key:\"processedCondition\",value:function processedCondition(){return null==this.processedConditionCache?this.processedConditionCache=this.inverted?this.condition.invert():this.condition:this.processedConditionCache}},{key:\"astType\",value:function astType(){return\"WhileStatement\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{test:this.condition.ast(o,LEVEL_PAREN),body:this.body.ast(o,LEVEL_TOP),guard:null==(ref1=null==(ref2=this.guard)?void 0:ref2.ast(o))?null:ref1,inverted:!!this.inverted,postfix:!!this.postfix,loop:!!this.isLoop}}}]),While}(Base);return While.prototype.children=[\"condition\",\"guard\",\"body\"],While.prototype.isStatement=YES,While}.call(this),exports.Op=Op=function(){var Op=function(_Base46){\"use strict\";function Op(op,first,second,flip){var _ref55=4<arguments.length&&void 0!==arguments[4]?arguments[4]:{},invertOperator=_ref55.invertOperator,_ref55$originalOperat=_ref55.originalOperator,originalOperator=void 0===_ref55$originalOperat?op:_ref55$originalOperat,_this69;_classCallCheck(this,Op);var call,firstCall,message,ref1,unwrapped;return(_this69=_super80.call(this),_this69.invertOperator=invertOperator,_this69.originalOperator=originalOperator,\"new\"===op)?((firstCall=unwrapped=first.unwrap())instanceof Call||(firstCall=unwrapped.base)instanceof Call)&&!firstCall[\"do\"]&&!firstCall.isNew?_possibleConstructorReturn(_this69,new Value(firstCall.newInstance(),firstCall===unwrapped?[]:unwrapped.properties)):(first instanceof Parens||first.unwrap()instanceof IdentifierLiteral||(\"function\"==typeof first.hasProperties?first.hasProperties():void 0)||(first=new Parens(first)),call=new Call(first,[]),call.locationData=_this69.locationData,call.isNew=!0,_possibleConstructorReturn(_this69,call)):(_this69.operator=CONVERSIONS[op]||op,_this69.first=first,_this69.second=second,_this69.flip=!!flip,(\"--\"===(ref1=_this69.operator)||\"++\"===ref1)&&(message=isUnassignable(_this69.first.unwrapAll().value),message&&_this69.first.error(message)),_possibleConstructorReturn(_this69,_assertThisInitialized(_this69)))}_inherits(Op,_Base46);var _super80=_createSuper(Op);return _createClass(Op,[{key:\"isNumber\",value:function(){var ref1;return this.isUnary()&&(\"+\"===(ref1=this.operator)||\"-\"===ref1)&&this.first instanceof Value&&this.first.isNumber()}},{key:\"isAwait\",value:function isAwait(){return\"await\"===this.operator}},{key:\"isYield\",value:function isYield(){var ref1;return\"yield\"===(ref1=this.operator)||\"yield*\"===ref1}},{key:\"isUnary\",value:function isUnary(){return!this.second}},{key:\"shouldCache\",value:function shouldCache(){return!this.isNumber()}},{key:\"isChainable\",value:function isChainable(){var ref1;return\"<\"===(ref1=this.operator)||\">\"===ref1||\">=\"===ref1||\"<=\"===ref1||\"===\"===ref1||\"!==\"===ref1}},{key:\"isChain\",value:function isChain(){return this.isChainable()&&this.first.isChainable()}},{key:\"invert\",value:function invert(){var allInvertable,curr,fst,op,ref1;if(this.isInOperator())return this.invertOperator=\"!\",this;if(this.isChain()){for(allInvertable=!0,curr=this;curr&&curr.operator;)allInvertable&&(allInvertable=curr.operator in INVERSIONS),curr=curr.first;if(!allInvertable)return new Parens(this).invert();for(curr=this;curr&&curr.operator;)curr.invert=!curr.invert,curr.operator=INVERSIONS[curr.operator],curr=curr.first;return this}return(op=INVERSIONS[this.operator])?(this.operator=op,this.first.unwrap()instanceof Op&&this.first.invert(),this):this.second?new Parens(this).invert():\"!\"===this.operator&&(fst=this.first.unwrap())instanceof Op&&(\"!\"===(ref1=fst.operator)||\"in\"===ref1||\"instanceof\"===ref1)?fst:new Op(\"!\",this)}},{key:\"unfoldSoak\",value:function unfoldSoak(o){var ref1;return(\"++\"===(ref1=this.operator)||\"--\"===ref1||\"delete\"===ref1)&&_unfoldSoak(o,this,\"first\")}},{key:\"generateDo\",value:function generateDo(exp){var call,func,j,len1,param,passedParams,ref,ref1;for(passedParams=[],func=exp instanceof Assign&&(ref=exp.value.unwrap())instanceof Code?ref:exp,ref1=func.params||[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],param.value?(passedParams.push(param.value),delete param.value):passedParams.push(param);return call=new Call(exp,passedParams),call[\"do\"]=!0,call}},{key:\"isInOperator\",value:function isInOperator(){return\"in\"===this.originalOperator}},{key:\"compileNode\",value:function compileNode(o){var answer,inNode,isChain,lhs,rhs;if(this.isInOperator())return inNode=new In(this.first,this.second),(this.invertOperator?inNode.invert():inNode).compileNode(o);if(this.invertOperator)return this.invertOperator=null,this.invert().compileNode(o);if(\"do\"===this.operator)return Op.prototype.generateDo(this.first).compileNode(o);if(isChain=this.isChain(),isChain||(this.first.front=this.front),this.checkDeleteOperand(o),this.isYield()||this.isAwait())return this.compileContinuation(o);if(this.isUnary())return this.compileUnary(o);if(isChain)return this.compileChain(o);switch(this.operator){case\"?\":return this.compileExistence(o,this.second.isDefaultValue);case\"//\":return this.compileFloorDivision(o);case\"%%\":return this.compileModulo(o);default:return lhs=this.first.compileToFragments(o,LEVEL_OP),rhs=this.second.compileToFragments(o,LEVEL_OP),answer=[].concat(lhs,this.makeCode(\" \".concat(this.operator,\" \")),rhs),o.level<=LEVEL_OP?answer:this.wrapInParentheses(answer);}}},{key:\"compileChain\",value:function compileChain(o){var _this$first$second$ca=this.first.second.cache(o),_this$first$second$ca2=_slicedToArray(_this$first$second$ca,2),fragments,fst,shared;return this.first.second=_this$first$second$ca2[0],shared=_this$first$second$ca2[1],fst=this.first.compileToFragments(o,LEVEL_OP),fragments=fst.concat(this.makeCode(\" \".concat(this.invert?\"&&\":\"||\",\" \")),shared.compileToFragments(o),this.makeCode(\" \".concat(this.operator,\" \")),this.second.compileToFragments(o,LEVEL_OP)),this.wrapInParentheses(fragments)}},{key:\"compileExistence\",value:function compileExistence(o,checkOnlyUndefined){var fst,ref;return this.first.shouldCache()?(ref=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),fst=new Parens(new Assign(ref,this.first))):(fst=this.first,ref=fst),new If(new Existence(fst,checkOnlyUndefined),ref,{type:\"if\"}).addElse(this.second).compileToFragments(o)}},{key:\"compileUnary\",value:function compileUnary(o){var op,parts,plusMinus;return(parts=[],op=this.operator,parts.push([this.makeCode(op)]),\"!\"===op&&this.first instanceof Existence)?(this.first.negated=!this.first.negated,this.first.compileToFragments(o)):o.level>=LEVEL_ACCESS?new Parens(this).compileToFragments(o):(plusMinus=\"+\"===op||\"-\"===op,(\"typeof\"===op||\"delete\"===op||plusMinus&&this.first instanceof Op&&this.first.operator===op)&&parts.push([this.makeCode(\" \")]),plusMinus&&this.first instanceof Op&&(this.first=new Parens(this.first)),parts.push(this.first.compileToFragments(o,LEVEL_OP)),this.flip&&parts.reverse(),this.joinFragmentArrays(parts,\"\"))}},{key:\"compileContinuation\",value:function compileContinuation(o){var op,parts,ref1;return parts=[],op=this.operator,this.isAwait()||this.checkContinuation(o),0<=indexOf.call(Object.keys(this.first),\"expression\")&&!(this.first instanceof Throw)?null!=this.first.expression&&parts.push(this.first.expression.compileToFragments(o,LEVEL_OP)):(o.level>=LEVEL_PAREN&&parts.push([this.makeCode(\"(\")]),parts.push([this.makeCode(op)]),\"\"!==(null==(ref1=this.first.base)?void 0:ref1.value)&&parts.push([this.makeCode(\" \")]),parts.push(this.first.compileToFragments(o,LEVEL_OP)),o.level>=LEVEL_PAREN&&parts.push([this.makeCode(\")\")])),this.joinFragmentArrays(parts,\"\")}},{key:\"checkContinuation\",value:function checkContinuation(o){var ref1;if(null==o.scope.parent&&this.error(\"\".concat(this.operator,\" can only occur inside functions\")),(null==(ref1=o.scope.method)?void 0:ref1.bound)&&o.scope.method.isGenerator)return this.error(\"yield cannot occur inside bound (fat arrow) functions\")}},{key:\"compileFloorDivision\",value:function compileFloorDivision(o){var div,floor,second;return floor=new Value(new IdentifierLiteral(\"Math\"),[new Access(new PropertyName(\"floor\"))]),second=this.second.shouldCache()?new Parens(this.second):this.second,div=new Op(\"/\",this.first,second),new Call(floor,[div]).compileToFragments(o)}},{key:\"compileModulo\",value:function compileModulo(o){var mod;return mod=new Value(new Literal(utility(\"modulo\",o))),new Call(mod,[this.first,this.second]).compileToFragments(o)}},{key:\"toString\",value:function toString(idt){return _get(_getPrototypeOf(Op.prototype),\"toString\",this).call(this,idt,this.constructor.name+\" \"+this.operator)}},{key:\"checkDeleteOperand\",value:function checkDeleteOperand(o){if(\"delete\"===this.operator&&o.scope.check(this.first.unwrapAll().value))return this.error(\"delete operand may not be argument or var\")}},{key:\"astNode\",value:function astNode(o){return this.isYield()&&this.checkContinuation(o),this.checkDeleteOperand(o),_get(_getPrototypeOf(Op.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){if(this.isAwait())return\"AwaitExpression\";if(this.isYield())return\"YieldExpression\";if(this.isChain())return\"ChainedComparison\";switch(this.operator){case\"||\":case\"&&\":case\"?\":return\"LogicalExpression\";case\"++\":case\"--\":return\"UpdateExpression\";default:return this.isUnary()?\"UnaryExpression\":\"BinaryExpression\";}}},{key:\"operatorAst\",value:function operatorAst(){return\"\".concat(this.invertOperator?\"\".concat(this.invertOperator,\" \"):\"\").concat(this.originalOperator)}},{key:\"chainAstProperties\",value:function chainAstProperties(o){var currentOp,operand,operands,operators;for(operators=[this.operatorAst()],operands=[this.second],currentOp=this.first;;)if(operators.unshift(currentOp.operatorAst()),operands.unshift(currentOp.second),currentOp=currentOp.first,!currentOp.isChainable()){operands.unshift(currentOp);break}return{operators:operators,operands:function(){var j,len1,results1;for(results1=[],j=0,len1=operands.length;j<len1;j++)operand=operands[j],results1.push(operand.ast(o,LEVEL_OP));return results1}()}}},{key:\"astProperties\",value:function astProperties(o){var argument,firstAst,operatorAst,ref1,secondAst;if(this.isChain())return this.chainAstProperties(o);switch(firstAst=this.first.ast(o,LEVEL_OP),secondAst=null==(ref1=this.second)?void 0:ref1.ast(o,LEVEL_OP),operatorAst=this.operatorAst(),!1){case!this.isUnary():return argument=this.isYield()&&\"\"===this.first.unwrap().value?null:firstAst,this.isAwait()?{argument:argument}:this.isYield()?{argument:argument,delegate:\"yield*\"===this.operator}:{argument:argument,operator:operatorAst,prefix:!this.flip};default:return{left:firstAst,right:secondAst,operator:operatorAst};}}}]),Op}(Base),CONVERSIONS,INVERSIONS;return CONVERSIONS={\"==\":\"===\",\"!=\":\"!==\",of:\"in\",yieldfrom:\"yield*\"},INVERSIONS={\"!==\":\"===\",\"===\":\"!==\"},Op.prototype.children=[\"first\",\"second\"],Op}.call(this),exports.In=In=function(){var In=function(_Base47){\"use strict\";function In(object1,array){var _this70;return _classCallCheck(this,In),_this70=_super81.call(this),_this70.object=object1,_this70.array=array,_this70}_inherits(In,_Base47);var _super81=_createSuper(In);return _createClass(In,[{key:\"compileNode\",value:function compileNode(o){var hasSplat,j,len1,obj,ref1;if(this.array instanceof Value&&this.array.isArray()&&this.array.base.objects.length){for(ref1=this.array.base.objects,j=0,len1=ref1.length;j<len1;j++)if(obj=ref1[j],!!(obj instanceof Splat)){hasSplat=!0;break}if(!hasSplat)return this.compileOrTest(o)}return this.compileLoopTest(o)}},{key:\"compileOrTest\",value:function compileOrTest(o){var _this$object$cache=this.object.cache(o,LEVEL_OP),_this$object$cache2=_slicedToArray(_this$object$cache,2),cmp,cnj,i,item,j,len1,ref,ref1,sub,tests;sub=_this$object$cache2[0],ref=_this$object$cache2[1];var _ref56=this.negated?[\" !== \",\" && \"]:[\" === \",\" || \"],_ref57=_slicedToArray(_ref56,2);for(cmp=_ref57[0],cnj=_ref57[1],tests=[],ref1=this.array.base.objects,(i=j=0,len1=ref1.length);j<len1;i=++j)item=ref1[i],i&&tests.push(this.makeCode(cnj)),tests=tests.concat(i?ref:sub,this.makeCode(cmp),item.compileToFragments(o,LEVEL_ACCESS));return o.level<LEVEL_OP?tests:this.wrapInParentheses(tests)}},{key:\"compileLoopTest\",value:function compileLoopTest(o){var _this$object$cache3=this.object.cache(o,LEVEL_LIST),_this$object$cache4=_slicedToArray(_this$object$cache3,2),fragments,ref,sub;return(sub=_this$object$cache4[0],ref=_this$object$cache4[1],fragments=[].concat(this.makeCode(utility(\"indexOf\",o)+\".call(\"),this.array.compileToFragments(o,LEVEL_LIST),this.makeCode(\", \"),ref,this.makeCode(\") \"+(this.negated?\"< 0\":\">= 0\"))),fragmentsToText(sub)===fragmentsToText(ref))?fragments:(fragments=sub.concat(this.makeCode(\", \"),fragments),o.level<LEVEL_LIST?fragments:this.wrapInParentheses(fragments))}},{key:\"toString\",value:function toString(idt){return _get(_getPrototypeOf(In.prototype),\"toString\",this).call(this,idt,this.constructor.name+(this.negated?\"!\":\"\"))}}]),In}(Base);return In.prototype.children=[\"object\",\"array\"],In.prototype.invert=NEGATE,In}.call(this),exports.Try=Try=function(){var Try=function(_Base48){\"use strict\";function Try(attempt,_catch,ensure,finallyTag){var _this71;return _classCallCheck(this,Try),_this71=_super82.call(this),_this71.attempt=attempt,_this71[\"catch\"]=_catch,_this71.ensure=ensure,_this71.finallyTag=finallyTag,_this71}_inherits(Try,_Base48);var _super82=_createSuper(Try);return _createClass(Try,[{key:\"jumps\",value:function jumps(o){var ref1;return this.attempt.jumps(o)||(null==(ref1=this[\"catch\"])?void 0:ref1.jumps(o))}},{key:\"makeReturn\",value:function makeReturn(results,mark){var ref1,ref2;return mark?(null!=(ref1=this.attempt)&&ref1.makeReturn(results,mark),void(null!=(ref2=this[\"catch\"])&&ref2.makeReturn(results,mark))):(this.attempt&&(this.attempt=this.attempt.makeReturn(results)),this[\"catch\"]&&(this[\"catch\"]=this[\"catch\"].makeReturn(results)),this)}},{key:\"compileNode\",value:function compileNode(o){var catchPart,ensurePart,generatedErrorVariableName,originalIndent,tryPart;return originalIndent=o.indent,o.indent+=TAB,tryPart=this.attempt.compileToFragments(o,LEVEL_TOP),catchPart=this[\"catch\"]?this[\"catch\"].compileToFragments(merge(o,{indent:originalIndent}),LEVEL_TOP):this.ensure||this[\"catch\"]?[]:(generatedErrorVariableName=o.scope.freeVariable(\"error\",{reserve:!1}),[this.makeCode(\" catch (\".concat(generatedErrorVariableName,\") {}\"))]),ensurePart=this.ensure?[].concat(this.makeCode(\" finally {\\n\"),this.ensure.compileToFragments(o,LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab,\"}\"))):[],[].concat(this.makeCode(\"\".concat(this.tab,\"try {\\n\")),tryPart,this.makeCode(\"\\n\".concat(this.tab,\"}\")),catchPart,ensurePart)}},{key:\"astType\",value:function astType(){return\"TryStatement\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{block:this.attempt.ast(o,LEVEL_TOP),handler:null==(ref1=null==(ref2=this[\"catch\"])?void 0:ref2.ast(o))?null:ref1,finalizer:null==this.ensure?null:Object.assign(this.ensure.ast(o,LEVEL_TOP),mergeAstLocationData(jisonLocationDataToAstLocationData(this.finallyTag.locationData),this.ensure.astLocationData()))}}}]),Try}(Base);return Try.prototype.children=[\"attempt\",\"catch\",\"ensure\"],Try.prototype.isStatement=YES,Try}.call(this),exports.Catch=Catch=function(){var Catch=function(_Base49){\"use strict\";function Catch(recovery,errorVariable){var _this72;_classCallCheck(this,Catch);var base1,ref1;return _this72=_super83.call(this),_this72.recovery=recovery,_this72.errorVariable=errorVariable,null!=(ref1=_this72.errorVariable)&&\"function\"==typeof(base1=ref1.unwrap()).propagateLhs&&base1.propagateLhs(!0),_this72}_inherits(Catch,_Base49);var _super83=_createSuper(Catch);return _createClass(Catch,[{key:\"jumps\",value:function jumps(o){return this.recovery.jumps(o)}},{key:\"makeReturn\",value:function makeReturn(results,mark){var ret;if(ret=this.recovery.makeReturn(results,mark),!mark)return this.recovery=ret,this}},{key:\"compileNode\",value:function compileNode(o){var generatedErrorVariableName,placeholder;return o.indent+=TAB,generatedErrorVariableName=o.scope.freeVariable(\"error\",{reserve:!1}),placeholder=new IdentifierLiteral(generatedErrorVariableName),this.checkUnassignable(),this.errorVariable&&this.recovery.unshift(new Assign(this.errorVariable,placeholder)),[].concat(this.makeCode(\" catch (\"),placeholder.compileToFragments(o),this.makeCode(\") {\\n\"),this.recovery.compileToFragments(o,LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab,\"}\")))}},{key:\"checkUnassignable\",value:function checkUnassignable(){var message;if(this.errorVariable&&(message=isUnassignable(this.errorVariable.unwrapAll().value),message))return this.errorVariable.error(message)}},{key:\"astNode\",value:function astNode(o){var ref1;return this.checkUnassignable(),null!=(ref1=this.errorVariable)&&ref1.eachName(function(name){var alreadyDeclared;return alreadyDeclared=o.scope.find(name.value),name.isDeclaration=!alreadyDeclared}),_get(_getPrototypeOf(Catch.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"CatchClause\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{param:null==(ref1=null==(ref2=this.errorVariable)?void 0:ref2.ast(o))?null:ref1,body:this.recovery.ast(o,LEVEL_TOP)}}}]),Catch}(Base);return Catch.prototype.children=[\"recovery\",\"errorVariable\"],Catch.prototype.isStatement=YES,Catch}.call(this),exports.Throw=Throw=function(){var Throw=function(_Base50){\"use strict\";function Throw(expression1){var _this73;return _classCallCheck(this,Throw),_this73=_super84.call(this),_this73.expression=expression1,_this73}_inherits(Throw,_Base50);var _super84=_createSuper(Throw);return _createClass(Throw,[{key:\"compileNode\",value:function compileNode(o){var fragments;return fragments=this.expression.compileToFragments(o,LEVEL_LIST),unshiftAfterComments(fragments,this.makeCode(\"throw \")),fragments.unshift(this.makeCode(this.tab)),fragments.push(this.makeCode(\";\")),fragments}},{key:\"astType\",value:function astType(){return\"ThrowStatement\"}},{key:\"astProperties\",value:function astProperties(o){return{argument:this.expression.ast(o,LEVEL_LIST)}}}]),Throw}(Base);return Throw.prototype.children=[\"expression\"],Throw.prototype.isStatement=YES,Throw.prototype.jumps=NO,Throw.prototype.makeReturn=THIS,Throw}.call(this),exports.Existence=Existence=function(){var Existence=function(_Base51){\"use strict\";function Existence(expression1){var onlyNotUndefined=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],_this74;_classCallCheck(this,Existence);var salvagedComments;return _this74=_super85.call(this),_this74.expression=expression1,_this74.comparisonTarget=onlyNotUndefined?\"undefined\":\"null\",salvagedComments=[],_this74.expression.traverseChildren(!0,function(child){var comment,j,len1,ref1;if(child.comments){for(ref1=child.comments,j=0,len1=ref1.length;j<len1;j++)comment=ref1[j],0>indexOf.call(salvagedComments,comment)&&salvagedComments.push(comment);return delete child.comments}}),attachCommentsToNode(salvagedComments,_assertThisInitialized(_this74)),moveComments(_this74.expression,_assertThisInitialized(_this74)),_this74}_inherits(Existence,_Base51);var _super85=_createSuper(Existence);return _createClass(Existence,[{key:\"compileNode\",value:function compileNode(o){var cmp,cnj,code;if(this.expression.front=this.front,code=this.expression.compile(o,LEVEL_OP),this.expression.unwrap()instanceof IdentifierLiteral&&!o.scope.check(code)){var _ref58=this.negated?[\"===\",\"||\"]:[\"!==\",\"&&\"],_ref59=_slicedToArray(_ref58,2);cmp=_ref59[0],cnj=_ref59[1],code=\"typeof \".concat(code,\" \").concat(cmp,\" \\\"undefined\\\"\")+(\"undefined\"===this.comparisonTarget?\"\":\" \".concat(cnj,\" \").concat(code,\" \").concat(cmp,\" \").concat(this.comparisonTarget))}else cmp=\"null\"===this.comparisonTarget?this.negated?\"==\":\"!=\":this.negated?\"===\":\"!==\",code=\"\".concat(code,\" \").concat(cmp,\" \").concat(this.comparisonTarget);return[this.makeCode(o.level<=LEVEL_COND?code:\"(\".concat(code,\")\"))]}},{key:\"astType\",value:function astType(){return\"UnaryExpression\"}},{key:\"astProperties\",value:function astProperties(o){return{argument:this.expression.ast(o),operator:\"?\",prefix:!1}}}]),Existence}(Base);return Existence.prototype.children=[\"expression\"],Existence.prototype.invert=NEGATE,Existence}.call(this),exports.Parens=Parens=function(){var Parens=function(_Base52){\"use strict\";function Parens(body1){var _this75;return _classCallCheck(this,Parens),_this75=_super86.call(this),_this75.body=body1,_this75}_inherits(Parens,_Base52);var _super86=_createSuper(Parens);return _createClass(Parens,[{key:\"unwrap\",value:function unwrap(){return this.body}},{key:\"shouldCache\",value:function shouldCache(){return this.body.shouldCache()}},{key:\"compileNode\",value:function compileNode(o){var bare,expr,fragments,ref1,shouldWrapComment;return(expr=this.body.unwrap(),shouldWrapComment=null==(ref1=expr.comments)?void 0:ref1.some(function(comment){return comment.here&&!comment.unshift&&!comment.newLine}),expr instanceof Value&&expr.isAtomic()&&!this.jsxAttribute&&!shouldWrapComment)?(expr.front=this.front,expr.compileToFragments(o)):(fragments=expr.compileToFragments(o,LEVEL_PAREN),bare=o.level<LEVEL_OP&&!shouldWrapComment&&(expr instanceof Op&&!expr.isInOperator()||expr.unwrap()instanceof Call||expr instanceof For&&expr.returns)&&(o.level<LEVEL_COND||3>=fragments.length),this.jsxAttribute?this.wrapInBraces(fragments):bare?fragments:this.wrapInParentheses(fragments))}},{key:\"astNode\",value:function astNode(o){return this.body.unwrap().ast(o,LEVEL_PAREN)}}]),Parens}(Base);return Parens.prototype.children=[\"body\"],Parens}.call(this),exports.StringWithInterpolations=StringWithInterpolations=function(){var StringWithInterpolations=function(_Base53){\"use strict\";function StringWithInterpolations(body1){var _ref60=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},quote=_ref60.quote,startQuote=_ref60.startQuote,jsxAttribute=_ref60.jsxAttribute,_this76;return _classCallCheck(this,StringWithInterpolations),_this76=_super87.call(this),_this76.body=body1,_this76.quote=quote,_this76.startQuote=startQuote,_this76.jsxAttribute=jsxAttribute,_this76}_inherits(StringWithInterpolations,_Base53);var _super87=_createSuper(StringWithInterpolations);return _createClass(StringWithInterpolations,[{key:\"unwrap\",value:function unwrap(){return this}},{key:\"shouldCache\",value:function shouldCache(){return this.body.shouldCache()}},{key:\"extractElements\",value:function extractElements(o){var _ref61=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},includeInterpolationWrappers=_ref61.includeInterpolationWrappers,isJsx=_ref61.isJsx,elements,expr,salvagedComments;return expr=this.body.unwrap(),elements=[],salvagedComments=[],expr.traverseChildren(!1,function(node){var comment,commentPlaceholder,empty,j,k,len1,len2,ref1,ref2,ref3,unwrapped;if(node instanceof StringLiteral){if(node.comments){var _salvagedComments;(_salvagedComments=salvagedComments).push.apply(_salvagedComments,_toConsumableArray(node.comments)),delete node.comments}return elements.push(node),!0}if(node instanceof Interpolation){if(0!==salvagedComments.length){for(j=0,len1=salvagedComments.length;j<len1;j++)comment=salvagedComments[j],comment.unshift=!0,comment.newLine=!0;attachCommentsToNode(salvagedComments,node)}if((unwrapped=null==(ref1=node.expression)?void 0:ref1.unwrapAll())instanceof PassthroughLiteral&&unwrapped.generated&&!(isJsx&&o.compiling)){if(o.compiling){if(commentPlaceholder=new StringLiteral(\"\").withLocationDataFrom(node),commentPlaceholder.comments=unwrapped.comments,node.comments){var _ref62;(_ref62=null==commentPlaceholder.comments?commentPlaceholder.comments=[]:commentPlaceholder.comments).push.apply(_ref62,_toConsumableArray(node.comments))}elements.push(new Value(commentPlaceholder))}else empty=new Interpolation().withLocationDataFrom(node),empty.comments=node.comments,elements.push(empty);}else if(node.expression||includeInterpolationWrappers){if(node.comments){var _ref63;(_ref63=null==(ref2=node.expression)?void 0:null==ref2.comments?ref2.comments=[]:ref2.comments).push.apply(_ref63,_toConsumableArray(node.comments))}elements.push(includeInterpolationWrappers?node:node.expression)}return!1}if(node.comments){if(0!==elements.length&&!(elements[elements.length-1]instanceof StringLiteral)){for(ref3=node.comments,k=0,len2=ref3.length;k<len2;k++)comment=ref3[k],comment.unshift=!1,comment.newLine=!0;attachCommentsToNode(node.comments,elements[elements.length-1])}else{var _salvagedComments2;(_salvagedComments2=salvagedComments).push.apply(_salvagedComments2,_toConsumableArray(node.comments))}delete node.comments}return!0}),elements}},{key:\"compileNode\",value:function compileNode(o){var code,element,elements,fragments,j,len1,ref1,unquotedElementValue,wrapped;if(null==this.comments&&(this.comments=null==(ref1=this.startQuote)?void 0:ref1.comments),this.jsxAttribute)return wrapped=new Parens(new StringWithInterpolations(this.body)),wrapped.jsxAttribute=!0,wrapped.compileNode(o);for(elements=this.extractElements(o,{isJsx:this.jsx}),fragments=[],this.jsx||fragments.push(this.makeCode(\"`\")),(j=0,len1=elements.length);j<len1;j++)if(element=elements[j],element instanceof StringLiteral)unquotedElementValue=this.jsx?element.unquotedValueForJSX:element.unquotedValueForTemplateLiteral,fragments.push(this.makeCode(unquotedElementValue));else{var _fragments12;this.jsx||fragments.push(this.makeCode(\"$\")),code=element.compileToFragments(o,LEVEL_PAREN),(!this.isNestedTag(element)||code.some(function(fragment){var ref2;return null==(ref2=fragment.comments)?void 0:ref2.some(function(comment){return!1===comment.here})}))&&(code=this.wrapInBraces(code),code[0].isStringWithInterpolations=!0,code[code.length-1].isStringWithInterpolations=!0),(_fragments12=fragments).push.apply(_fragments12,_toConsumableArray(code))}return this.jsx||fragments.push(this.makeCode(\"`\")),fragments}},{key:\"isNestedTag\",value:function isNestedTag(element){var call;return call=\"function\"==typeof element.unwrapAll?element.unwrapAll():void 0,this.jsx&&call instanceof JSXElement}},{key:\"astType\",value:function astType(){return\"TemplateLiteral\"}},{key:\"astProperties\",value:function astProperties(o){var element,elements,emptyInterpolation,expression,expressions,index,j,last,len1,node,quasis;elements=this.extractElements(o,{includeInterpolationWrappers:!0});var _slice1$call17=slice1.call(elements,-1),_slice1$call18=_slicedToArray(_slice1$call17,1);for(last=_slice1$call18[0],quasis=[],expressions=[],(index=j=0,len1=elements.length);j<len1;index=++j)if(element=elements[index],element instanceof StringLiteral)quasis.push(new TemplateElement(element.originalValue,{tail:element===last}).withLocationDataFrom(element).ast(o));else{var _element2=element;expression=_element2.expression,node=null==expression?(emptyInterpolation=new EmptyInterpolation,emptyInterpolation.locationData=emptyExpressionLocationData({interpolationNode:element,openingBrace:\"#{\",closingBrace:\"}\"}),emptyInterpolation):expression.unwrapAll(),expressions.push(astAsBlockIfNeeded(node,o))}return{expressions:expressions,quasis:quasis,quote:this.quote}}}],[{key:\"fromStringLiteral\",value:function fromStringLiteral(stringLiteral){var updatedString,updatedStringValue;return updatedString=stringLiteral.withoutQuotesInLocationData(),updatedStringValue=new Value(updatedString).withLocationDataFrom(updatedString),new StringWithInterpolations(Block.wrap([updatedStringValue]),{quote:stringLiteral.quote,jsxAttribute:stringLiteral.jsxAttribute}).withLocationDataFrom(stringLiteral)}}]),StringWithInterpolations}(Base);return StringWithInterpolations.prototype.children=[\"body\"],StringWithInterpolations}.call(this),exports.TemplateElement=TemplateElement=function(_Base54){\"use strict\";function TemplateElement(value1){var _ref64=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},tail1=_ref64.tail,_this77;return _classCallCheck(this,TemplateElement),_this77=_super88.call(this),_this77.value=value1,_this77.tail=tail1,_this77}_inherits(TemplateElement,_Base54);var _super88=_createSuper(TemplateElement);return _createClass(TemplateElement,[{key:\"astProperties\",value:function astProperties(){return{value:{raw:this.value},tail:!!this.tail}}}]),TemplateElement}(Base),exports.Interpolation=Interpolation=function(){var Interpolation=function(_Base55){\"use strict\";function Interpolation(expression1){var _this78;return _classCallCheck(this,Interpolation),_this78=_super89.call(this),_this78.expression=expression1,_this78}_inherits(Interpolation,_Base55);var _super89=_createSuper(Interpolation);return _createClass(Interpolation)}(Base);return Interpolation.prototype.children=[\"expression\"],Interpolation}.call(this),exports.EmptyInterpolation=EmptyInterpolation=function(_Base56){\"use strict\";function EmptyInterpolation(){return _classCallCheck(this,EmptyInterpolation),_super90.call(this)}_inherits(EmptyInterpolation,_Base56);var _super90=_createSuper(EmptyInterpolation);return _createClass(EmptyInterpolation)}(Base),exports.For=For=function(){var For=function(_While){\"use strict\";function For(body,source){var _this79;return _classCallCheck(this,For),_this79=_super91.call(this),_this79.addBody(body),_this79.addSource(source),_this79}_inherits(For,_While);var _super91=_createSuper(For);return _createClass(For,[{key:\"isAwait\",value:function isAwait(){var ref1;return null!=(ref1=this[\"await\"])&&ref1}},{key:\"addBody\",value:function addBody(body){var base1,expressions;return this.body=Block.wrap([body]),expressions=this.body.expressions,expressions.length&&null==(base1=this.body).locationData&&(base1.locationData=mergeLocationData(expressions[0].locationData,expressions[expressions.length-1].locationData)),this}},{key:\"addSource\",value:function addSource(source){var _this80=this,_source$source=source.source,attr,attribs,attribute,base1,j,k,len1,len2,ref1,ref2,ref3,ref4;for(this.source=void 0!==_source$source&&_source$source,attribs=[\"name\",\"index\",\"guard\",\"step\",\"own\",\"ownTag\",\"await\",\"awaitTag\",\"object\",\"from\"],(j=0,len1=attribs.length);j<len1;j++)attr=attribs[j],this[attr]=null==(ref1=source[attr])?this[attr]:ref1;if(!this.source)return this;if(this.from&&this.index&&this.index.error(\"cannot use index with for-from\"),this.own&&!this.object&&this.ownTag.error(\"cannot use own with for-\".concat(this.from?\"from\":\"in\")),this.object){var _ref65=[this.index,this.name];this.name=_ref65[0],this.index=_ref65[1]}for(((null==(ref2=this.index)?void 0:\"function\"==typeof ref2.isArray?ref2.isArray():void 0)||(null==(ref3=this.index)?void 0:\"function\"==typeof ref3.isObject?ref3.isObject():void 0))&&this.index.error(\"index cannot be a pattern matching expression\"),this[\"await\"]&&!this.from&&this.awaitTag.error(\"await must be used with for-from\"),this.range=this.source instanceof Value&&this.source.base instanceof Range&&!this.source.properties.length&&!this.from,this.pattern=this.name instanceof Value,this.pattern&&\"function\"==typeof(base1=this.name.unwrap()).propagateLhs&&base1.propagateLhs(!0),this.range&&this.index&&this.index.error(\"indexes do not apply to range loops\"),this.range&&this.pattern&&this.name.error(\"cannot pattern match over range loops\"),this.returns=!1,ref4=[\"source\",\"guard\",\"step\",\"name\",\"index\"],(k=0,len2=ref4.length);k<len2;k++)(attribute=ref4[k],!!this[attribute])&&(this[attribute].traverseChildren(!0,function(node){var comment,l,len3,ref5;if(node.comments){for(ref5=node.comments,l=0,len3=ref5.length;l<len3;l++)comment=ref5[l],comment.newLine=comment.unshift=!0;return moveComments(node,_this80[attribute])}}),moveComments(this[attribute],this));return this}},{key:\"compileNode\",value:function compileNode(o){var _slice1$call19,_slice1$call20,body,bodyFragments,compare,compareDown,declare,declareDown,defPart,down,forClose,forCode,forPartFragments,fragments,guardPart,idt1,increment,index,ivar,kvar,kvarAssign,last,lvar,name,namePart,ref,ref1,resultPart,returnResult,rvar,scope,source,step,stepNum,stepVar,svar,varPart;if(body=Block.wrap([this.body]),ref1=body.expressions,_slice1$call19=slice1.call(ref1,-1),_slice1$call20=_slicedToArray(_slice1$call19,1),last=_slice1$call20[0],_slice1$call19,(null==last?void 0:last.jumps())instanceof Return&&(this.returns=!1),source=this.range?this.source.base:this.source,scope=o.scope,this.pattern||(name=this.name&&this.name.compile(o,LEVEL_LIST)),index=this.index&&this.index.compile(o,LEVEL_LIST),name&&!this.pattern&&scope.find(name),index&&!(this.index instanceof Value)&&scope.find(index),this.returns&&(rvar=scope.freeVariable(\"results\")),this.from?this.pattern&&(ivar=scope.freeVariable(\"x\",{single:!0})):ivar=this.object&&index||scope.freeVariable(\"i\",{single:!0}),kvar=(this.range||this.from)&&name||index||ivar,kvarAssign=kvar===ivar?\"\":\"\".concat(kvar,\" = \"),this.step&&!this.range){var _this$cacheToCodeFrag9=this.cacheToCodeFragments(this.step.cache(o,LEVEL_LIST,shouldCacheOrIsAssignable)),_this$cacheToCodeFrag10=_slicedToArray(_this$cacheToCodeFrag9,2);step=_this$cacheToCodeFrag10[0],stepVar=_this$cacheToCodeFrag10[1],this.step.isNumber()&&(stepNum=parseNumber(stepVar))}return this.pattern&&(name=ivar),varPart=\"\",guardPart=\"\",defPart=\"\",idt1=this.tab+TAB,this.range?forPartFragments=source.compileToFragments(merge(o,{index:ivar,name:name,step:this.step,shouldCache:shouldCacheOrIsAssignable})):(svar=this.source.compile(o,LEVEL_LIST),(name||this.own)&&!this.from&&!(this.source.unwrap()instanceof IdentifierLiteral)&&(defPart+=\"\".concat(this.tab).concat(ref=scope.freeVariable(\"ref\"),\" = \").concat(svar,\";\\n\"),svar=ref),name&&!this.pattern&&!this.from&&(namePart=\"\".concat(name,\" = \").concat(svar,\"[\").concat(kvar,\"]\")),!this.object&&!this.from&&(step!==stepVar&&(defPart+=\"\".concat(this.tab).concat(step,\";\\n\")),down=0>stepNum,!(this.step&&null!=stepNum&&down)&&(lvar=scope.freeVariable(\"len\")),declare=\"\".concat(kvarAssign).concat(ivar,\" = 0, \").concat(lvar,\" = \").concat(svar,\".length\"),declareDown=\"\".concat(kvarAssign).concat(ivar,\" = \").concat(svar,\".length - 1\"),compare=\"\".concat(ivar,\" < \").concat(lvar),compareDown=\"\".concat(ivar,\" >= 0\"),this.step?(null==stepNum?(compare=\"\".concat(stepVar,\" > 0 ? \").concat(compare,\" : \").concat(compareDown),declare=\"(\".concat(stepVar,\" > 0 ? (\").concat(declare,\") : \").concat(declareDown,\")\")):down&&(compare=compareDown,declare=declareDown),increment=\"\".concat(ivar,\" += \").concat(stepVar)):increment=\"\".concat(kvar===ivar?\"\".concat(ivar,\"++\"):\"++\".concat(ivar)),forPartFragments=[this.makeCode(\"\".concat(declare,\"; \").concat(compare,\"; \").concat(kvarAssign).concat(increment))])),this.returns&&(resultPart=\"\".concat(this.tab).concat(rvar,\" = [];\\n\"),returnResult=\"\\n\".concat(this.tab,\"return \").concat(rvar,\";\"),body.makeReturn(rvar)),this.guard&&(1<body.expressions.length?body.expressions.unshift(new If(new Parens(this.guard).invert(),new StatementLiteral(\"continue\"))):this.guard&&(body=Block.wrap([new If(this.guard,body)]))),this.pattern&&body.expressions.unshift(new Assign(this.name,this.from?new IdentifierLiteral(kvar):new Literal(\"\".concat(svar,\"[\").concat(kvar,\"]\")))),namePart&&(varPart=\"\\n\".concat(idt1).concat(namePart,\";\")),this.object?(forPartFragments=[this.makeCode(\"\".concat(kvar,\" in \").concat(svar))],this.own&&(guardPart=\"\\n\".concat(idt1,\"if (!\").concat(utility(\"hasProp\",o),\".call(\").concat(svar,\", \").concat(kvar,\")) continue;\"))):this.from&&(this[\"await\"]?(forPartFragments=new Op(\"await\",new Parens(new Literal(\"\".concat(kvar,\" of \").concat(svar)))),forPartFragments=forPartFragments.compileToFragments(o,LEVEL_TOP)):forPartFragments=[this.makeCode(\"\".concat(kvar,\" of \").concat(svar))]),bodyFragments=body.compileToFragments(merge(o,{indent:idt1}),LEVEL_TOP),bodyFragments&&0<bodyFragments.length&&(bodyFragments=[].concat(this.makeCode(\"\\n\"),bodyFragments,this.makeCode(\"\\n\"))),fragments=[this.makeCode(defPart)],resultPart&&fragments.push(this.makeCode(resultPart)),forCode=this[\"await\"]?\"for \":\"for (\",forClose=this[\"await\"]?\"\":\")\",fragments=fragments.concat(this.makeCode(this.tab),this.makeCode(forCode),forPartFragments,this.makeCode(\"\".concat(forClose,\" {\").concat(guardPart).concat(varPart)),bodyFragments,this.makeCode(this.tab),this.makeCode(\"}\")),returnResult&&fragments.push(this.makeCode(returnResult)),fragments}},{key:\"astNode\",value:function astNode(o){var addToScope,ref1,ref2;return addToScope=function(name){var alreadyDeclared;return alreadyDeclared=o.scope.find(name.value),name.isDeclaration=!alreadyDeclared},null!=(ref1=this.name)&&ref1.eachName(addToScope,{checkAssignability:!1}),null!=(ref2=this.index)&&ref2.eachName(addToScope,{checkAssignability:!1}),_get(_getPrototypeOf(For.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"For\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4,ref5,ref6,ref7,ref8,ref9;return{source:null==(ref1=this.source)?void 0:ref1.ast(o),body:this.body.ast(o,LEVEL_TOP),guard:null==(ref2=null==(ref3=this.guard)?void 0:ref3.ast(o))?null:ref2,name:null==(ref4=null==(ref5=this.name)?void 0:ref5.ast(o))?null:ref4,index:null==(ref6=null==(ref7=this.index)?void 0:ref7.ast(o))?null:ref6,step:null==(ref8=null==(ref9=this.step)?void 0:ref9.ast(o))?null:ref8,postfix:!!this.postfix,own:!!this.own,await:!!this[\"await\"],style:function(){switch(!1){case!this.from:return\"from\";case!this.object:return\"of\";case!this.name:return\"in\";default:return\"range\";}}.call(this)}}}]),For}(While);return For.prototype.children=[\"body\",\"source\",\"guard\",\"step\"],For}.call(this),exports.Switch=Switch=function(){var Switch=function(_Base57){\"use strict\";function Switch(subject,cases1,otherwise){var _this81;return _classCallCheck(this,Switch),_this81=_super92.call(this),_this81.subject=subject,_this81.cases=cases1,_this81.otherwise=otherwise,_this81}_inherits(Switch,_Base57);var _super92=_createSuper(Switch);return _createClass(Switch,[{key:\"jumps\",value:function jumps(){var o=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{block:!0},block,j,jumpNode,len1,ref1,ref2;for(ref1=this.cases,j=0,len1=ref1.length;j<len1;j++)if(block=ref1[j].block,jumpNode=block.jumps(o))return jumpNode;return null==(ref2=this.otherwise)?void 0:ref2.jumps(o)}},{key:\"makeReturn\",value:function makeReturn(results,mark){var block,j,len1,ref1,ref2;for(ref1=this.cases,j=0,len1=ref1.length;j<len1;j++)block=ref1[j].block,block.makeReturn(results,mark);return results&&(this.otherwise||(this.otherwise=new Block([new Literal(\"void 0\")]))),null!=(ref2=this.otherwise)&&ref2.makeReturn(results,mark),this}},{key:\"compileNode\",value:function compileNode(o){var block,body,cond,conditions,expr,fragments,i,idt1,idt2,j,k,len1,len2,ref1,ref2;for(idt1=o.indent+TAB,idt2=o.indent=idt1+TAB,fragments=[].concat(this.makeCode(this.tab+\"switch (\"),this.subject?this.subject.compileToFragments(o,LEVEL_PAREN):this.makeCode(\"false\"),this.makeCode(\") {\\n\")),ref1=this.cases,(i=j=0,len1=ref1.length);j<len1;i=++j){var _ref1$i=ref1[i];for(conditions=_ref1$i.conditions,block=_ref1$i.block,ref2=flatten([conditions]),(k=0,len2=ref2.length);k<len2;k++)cond=ref2[k],this.subject||(cond=cond.invert()),fragments=fragments.concat(this.makeCode(idt1+\"case \"),cond.compileToFragments(o,LEVEL_PAREN),this.makeCode(\":\\n\"));if(0<(body=block.compileToFragments(o,LEVEL_TOP)).length&&(fragments=fragments.concat(body,this.makeCode(\"\\n\"))),i===this.cases.length-1&&!this.otherwise)break;(expr=this.lastNode(block.expressions),!(expr instanceof Return||expr instanceof Throw||expr instanceof Literal&&expr.jumps()&&\"debugger\"!==expr.value))&&fragments.push(cond.makeCode(idt2+\"break;\\n\"))}if(this.otherwise&&this.otherwise.expressions.length){var _fragments13;(_fragments13=fragments).push.apply(_fragments13,[this.makeCode(idt1+\"default:\\n\")].concat(_toConsumableArray(this.otherwise.compileToFragments(o,LEVEL_TOP)),[this.makeCode(\"\\n\")]))}return fragments.push(this.makeCode(this.tab+\"}\")),fragments}},{key:\"astType\",value:function astType(){return\"SwitchStatement\"}},{key:\"casesAst\",value:function casesAst(o){var caseIndex,caseLocationData,cases,consequent,j,k,kase,l,lastTestIndex,len1,len2,len3,ref1,ref2,results1,test,testConsequent,testIndex,tests;for(cases=[],ref1=this.cases,(caseIndex=j=0,len1=ref1.length);j<len1;caseIndex=++j){kase=ref1[caseIndex];var _kase=kase;for(tests=_kase.conditions,consequent=_kase.block,tests=flatten([tests]),lastTestIndex=tests.length-1,(testIndex=k=0,len2=tests.length);k<len2;testIndex=++k)test=tests[testIndex],testConsequent=testIndex===lastTestIndex?consequent:null,caseLocationData=test.locationData,(null==testConsequent?void 0:testConsequent.expressions.length)&&(caseLocationData=mergeLocationData(caseLocationData,testConsequent.expressions[testConsequent.expressions.length-1].locationData)),0===testIndex&&(caseLocationData=mergeLocationData(caseLocationData,kase.locationData,{justLeading:!0})),testIndex===lastTestIndex&&(caseLocationData=mergeLocationData(caseLocationData,kase.locationData,{justEnding:!0})),cases.push(new SwitchCase(test,testConsequent,{trailing:testIndex===lastTestIndex}).withLocationDataFrom({locationData:caseLocationData}))}for((null==(ref2=this.otherwise)?void 0:ref2.expressions.length)&&cases.push(new SwitchCase(null,this.otherwise).withLocationDataFrom(this.otherwise)),results1=[],(l=0,len3=cases.length);l<len3;l++)kase=cases[l],results1.push(kase.ast(o));return results1}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{discriminant:null==(ref1=null==(ref2=this.subject)?void 0:ref2.ast(o,LEVEL_PAREN))?null:ref1,cases:this.casesAst(o)}}}]),Switch}(Base);return Switch.prototype.children=[\"subject\",\"cases\",\"otherwise\"],Switch.prototype.isStatement=YES,Switch}.call(this),SwitchCase=function(){var SwitchCase=function(_Base58){\"use strict\";function SwitchCase(test1,block1){var _ref66=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},trailing=_ref66.trailing,_this82;return _classCallCheck(this,SwitchCase),_this82=_super93.call(this),_this82.test=test1,_this82.block=block1,_this82.trailing=trailing,_this82}_inherits(SwitchCase,_Base58);var _super93=_createSuper(SwitchCase);return _createClass(SwitchCase,[{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{test:null==(ref1=null==(ref2=this.test)?void 0:ref2.ast(o,LEVEL_PAREN))?null:ref1,consequent:null==(ref3=null==(ref4=this.block)?void 0:ref4.ast(o,LEVEL_TOP).body)?[]:ref3,trailing:!!this.trailing}}}]),SwitchCase}(Base);return SwitchCase.prototype.children=[\"test\",\"block\"],SwitchCase}.call(this),exports.SwitchWhen=SwitchWhen=function(){var SwitchWhen=function(_Base59){\"use strict\";function SwitchWhen(conditions1,block1){var _this83;return _classCallCheck(this,SwitchWhen),_this83=_super94.call(this),_this83.conditions=conditions1,_this83.block=block1,_this83}_inherits(SwitchWhen,_Base59);var _super94=_createSuper(SwitchWhen);return _createClass(SwitchWhen)}(Base);return SwitchWhen.prototype.children=[\"conditions\",\"block\"],SwitchWhen}.call(this),exports.If=If=function(){var If=function(_Base60){\"use strict\";function If(condition1,body1){var options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_this84;return _classCallCheck(this,If),_this84=_super95.call(this),_this84.condition=condition1,_this84.body=body1,_this84.elseBody=null,_this84.isChain=!1,_this84.soak=options.soak,_this84.postfix=options.postfix,_this84.type=options.type,_this84.condition.comments&&moveComments(_this84.condition,_assertThisInitialized(_this84)),_this84}_inherits(If,_Base60);var _super95=_createSuper(If);return _createClass(If,[{key:\"bodyNode\",value:function bodyNode(){var ref1;return null==(ref1=this.body)?void 0:ref1.unwrap()}},{key:\"elseBodyNode\",value:function elseBodyNode(){var ref1;return null==(ref1=this.elseBody)?void 0:ref1.unwrap()}},{key:\"addElse\",value:function addElse(elseBody){return this.isChain?(this.elseBodyNode().addElse(elseBody),this.locationData=mergeLocationData(this.locationData,this.elseBodyNode().locationData)):(this.isChain=elseBody instanceof If,this.elseBody=this.ensureBlock(elseBody),this.elseBody.updateLocationDataIfMissing(elseBody.locationData),null!=this.locationData&&null!=this.elseBody.locationData&&(this.locationData=mergeLocationData(this.locationData,this.elseBody.locationData))),this}},{key:\"isStatement\",value:function isStatement(o){var ref1;return(null==o?void 0:o.level)===LEVEL_TOP||this.bodyNode().isStatement(o)||(null==(ref1=this.elseBodyNode())?void 0:ref1.isStatement(o))}},{key:\"jumps\",value:function jumps(o){var ref1;return this.body.jumps(o)||(null==(ref1=this.elseBody)?void 0:ref1.jumps(o))}},{key:\"compileNode\",value:function compileNode(o){return this.isStatement(o)?this.compileStatement(o):this.compileExpression(o)}},{key:\"makeReturn\",value:function makeReturn(results,mark){var ref1,ref2;return mark?(null!=(ref1=this.body)&&ref1.makeReturn(results,mark),void(null!=(ref2=this.elseBody)&&ref2.makeReturn(results,mark))):(results&&(this.elseBody||(this.elseBody=new Block([new Literal(\"void 0\")]))),this.body&&(this.body=new Block([this.body.makeReturn(results)])),this.elseBody&&(this.elseBody=new Block([this.elseBody.makeReturn(results)])),this)}},{key:\"ensureBlock\",value:function ensureBlock(node){return node instanceof Block?node:new Block([node])}},{key:\"compileStatement\",value:function compileStatement(o){var answer,body,child,cond,exeq,ifPart,indent;return(child=del(o,\"chainChild\"),exeq=del(o,\"isExistentialEquals\"),exeq)?new If(this.processedCondition().invert(),this.elseBodyNode(),{type:\"if\"}).compileToFragments(o):(indent=o.indent+TAB,cond=this.processedCondition().compileToFragments(o,LEVEL_PAREN),body=this.ensureBlock(this.body).compileToFragments(merge(o,{indent:indent})),ifPart=[].concat(this.makeCode(\"if (\"),cond,this.makeCode(\") {\\n\"),body,this.makeCode(\"\\n\".concat(this.tab,\"}\"))),child||ifPart.unshift(this.makeCode(this.tab)),!this.elseBody)?ifPart:(answer=ifPart.concat(this.makeCode(\" else \")),this.isChain?(o.chainChild=!0,answer=answer.concat(this.elseBody.unwrap().compileToFragments(o,LEVEL_TOP))):answer=answer.concat(this.makeCode(\"{\\n\"),this.elseBody.compileToFragments(merge(o,{indent:indent}),LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab,\"}\"))),answer)}},{key:\"compileExpression\",value:function compileExpression(o){var alt,body,cond,fragments;return cond=this.processedCondition().compileToFragments(o,LEVEL_COND),body=this.bodyNode().compileToFragments(o,LEVEL_LIST),alt=this.elseBodyNode()?this.elseBodyNode().compileToFragments(o,LEVEL_LIST):[this.makeCode(\"void 0\")],fragments=cond.concat(this.makeCode(\" ? \"),body,this.makeCode(\" : \"),alt),o.level>=LEVEL_COND?this.wrapInParentheses(fragments):fragments}},{key:\"unfoldSoak\",value:function unfoldSoak(){return this.soak&&this}},{key:\"processedCondition\",value:function processedCondition(){return null==this.processedConditionCache?this.processedConditionCache=\"unless\"===this.type?this.condition.invert():this.condition:this.processedConditionCache}},{key:\"isStatementAst\",value:function isStatementAst(o){return o.level===LEVEL_TOP}},{key:\"astType\",value:function astType(o){return this.isStatementAst(o)?\"IfStatement\":\"ConditionalExpression\"}},{key:\"astProperties\",value:function astProperties(o){var isStatement,ref1,ref2,ref3,ref4;return isStatement=this.isStatementAst(o),{test:this.condition.ast(o,isStatement?LEVEL_PAREN:LEVEL_COND),consequent:isStatement?this.body.ast(o,LEVEL_TOP):this.bodyNode().ast(o,LEVEL_TOP),alternate:this.isChain?this.elseBody.unwrap().ast(o,isStatement?LEVEL_TOP:LEVEL_COND):isStatement||1!==(null==(ref1=this.elseBody)||null==(ref2=ref1.expressions)?void 0:ref2.length)?null==(ref3=null==(ref4=this.elseBody)?void 0:ref4.ast(o,LEVEL_TOP))?null:ref3:this.elseBody.expressions[0].ast(o,LEVEL_TOP),postfix:!!this.postfix,inverted:\"unless\"===this.type}}}]),If}(Base);return If.prototype.children=[\"condition\",\"body\",\"elseBody\"],If}.call(this),exports.Sequence=Sequence=function(){var Sequence=function(_Base61){\"use strict\";function Sequence(expressions1){var _this85;return _classCallCheck(this,Sequence),_this85=_super96.call(this),_this85.expressions=expressions1,_this85}_inherits(Sequence,_Base61);var _super96=_createSuper(Sequence);return _createClass(Sequence,[{key:\"astNode\",value:function astNode(o){return 1===this.expressions.length?this.expressions[0].ast(o):_get(_getPrototypeOf(Sequence.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"SequenceExpression\"}},{key:\"astProperties\",value:function astProperties(o){var expression;return{expressions:function(){var j,len1,ref1,results1;for(ref1=this.expressions,results1=[],(j=0,len1=ref1.length);j<len1;j++)expression=ref1[j],results1.push(expression.ast(o));return results1}.call(this)}}}]),Sequence}(Base);return Sequence.prototype.children=[\"expressions\"],Sequence}.call(this),UTILITIES={modulo:function modulo(){return\"function(a, b) { return (+a % (b = +b) + b) % b; }\"},boundMethodCheck:function boundMethodCheck(){return\"function(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new Error('Bound instance method accessed before binding'); } }\"},hasProp:function hasProp(){return\"{}.hasOwnProperty\"},indexOf:function(){return\"[].indexOf\"},slice:function slice(){return\"[].slice\"},splice:function(){return\"[].splice\"}},LEVEL_TOP=1,LEVEL_PAREN=2,LEVEL_LIST=3,LEVEL_COND=4,LEVEL_OP=5,LEVEL_ACCESS=6,TAB=\"  \",SIMPLENUM=/^[+-]?\\d+(?:_\\d+)*$/,SIMPLE_STRING_OMIT=/\\s*\\n\\s*/g,LEADING_BLANK_LINE=/^[^\\n\\S]*\\n/,TRAILING_BLANK_LINE=/\\n[^\\n\\S]*$/,STRING_OMIT=/((?:\\\\\\\\)+)|\\\\[^\\S\\n]*\\n\\s*/g,HEREGEX_OMIT=/((?:\\\\\\\\)+)|\\\\(\\s)|\\s+(?:#.*)?/g,utility=function(name,o){var ref,root;return root=o.scope.root,name in root.utilities?root.utilities[name]:(ref=root.freeVariable(name),root.assign(ref,UTILITIES[name](o)),root.utilities[name]=ref)},multident=function(code,tab){var includingFirstLine=!(2<arguments.length&&void 0!==arguments[2])||arguments[2],endsWithNewLine;return endsWithNewLine=\"\\n\"===code[code.length-1],code=(includingFirstLine?tab:\"\")+code.replace(/\\n/g,\"$&\".concat(tab)),code=code.replace(/\\s+$/,\"\"),endsWithNewLine&&(code+=\"\\n\"),code},indentInitial=function(fragments,node){var fragment,fragmentIndex,j,len1;for(fragmentIndex=j=0,len1=fragments.length;j<len1;fragmentIndex=++j)if(fragment=fragments[fragmentIndex],fragment.isHereComment)fragment.code=multident(fragment.code,node.tab);else{fragments.splice(fragmentIndex,0,node.makeCode(\"\".concat(node.tab)));break}return fragments},hasLineComments=function(node){var comment,j,len1,ref1;if(!node.comments)return!1;for(ref1=node.comments,j=0,len1=ref1.length;j<len1;j++)if(comment=ref1[j],!1===comment.here)return!0;return!1},moveComments=function(from,to){if(null!=from&&from.comments)return attachCommentsToNode(from.comments,to),delete from.comments},unshiftAfterComments=function(fragments,fragmentToInsert){var fragment,fragmentIndex,inserted,j,len1;for(inserted=!1,fragmentIndex=j=0,len1=fragments.length;j<len1;fragmentIndex=++j)if(fragment=fragments[fragmentIndex],!!!fragment.isComment){fragments.splice(fragmentIndex,0,fragmentToInsert),inserted=!0;break}return inserted||fragments.push(fragmentToInsert),fragments},isLiteralArguments=function(node){return node instanceof IdentifierLiteral&&\"arguments\"===node.value},isLiteralThis=function(node){return node instanceof ThisLiteral||node instanceof Code&&node.bound},shouldCacheOrIsAssignable=function(node){return node.shouldCache()||(\"function\"==typeof node.isAssignable?node.isAssignable():void 0)},_unfoldSoak=function(o,parent,name){var ifn;if(ifn=parent[name].unfoldSoak(o))return parent[name]=ifn.body,ifn.body=new Value(parent),ifn},makeDelimitedLiteral=function(body){var _ref67=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},delimiterOption=_ref67.delimiter,escapeNewlines=_ref67.escapeNewlines,_double2=_ref67.double,_ref67$includeDelimit=_ref67.includeDelimiters,_ref67$escapeDelimite=_ref67.escapeDelimiter,escapeDelimiter=void 0===_ref67$escapeDelimite||_ref67$escapeDelimite,convertTrailingNullEscapes=_ref67.convertTrailingNullEscapes,escapeTemplateLiteralCurlies,printedDelimiter,regex;return\"\"===body&&\"/\"===delimiterOption&&(body=\"(?:)\"),escapeTemplateLiteralCurlies=\"`\"===delimiterOption,regex=RegExp(\"(\\\\\\\\\\\\\\\\)|(\\\\\\\\0(?=\\\\d))\".concat(convertTrailingNullEscapes?/|(\\\\0)$/.source:\"\").concat(escapeDelimiter?RegExp(\"|\\\\\\\\?(\".concat(delimiterOption,\")\")).source:\"\").concat(escapeTemplateLiteralCurlies?/|\\\\?(\\$\\{)/.source:\"\",\"|\\\\\\\\?(?:\").concat(escapeNewlines?\"(\\n)|\":\"\",\"(\\\\r)|(\\\\u2028)|(\\\\u2029))|(\\\\\\\\.)\"),\"g\"),body=body.replace(regex,function(match,backslash,nul){for(var _len2=arguments.length,args=Array(3<_len2?_len2-3:0),_key2=3,cr,delimiter,lf,ls,other,ps,templateLiteralCurly,trailingNullEscape;_key2<_len2;_key2++)args[_key2-3]=arguments[_key2];switch(trailingNullEscape=convertTrailingNullEscapes?args.shift():void 0,delimiter=escapeDelimiter?args.shift():void 0,templateLiteralCurly=escapeTemplateLiteralCurlies?args.shift():void 0,lf=escapeNewlines?args.shift():void 0,cr=args[0],ls=args[1],ps=args[2],other=args[3],!1){case!backslash:return _double2?backslash+backslash:backslash;case!nul:return\"\\\\x00\";case!trailingNullEscape:return\"\\\\x00\";case!delimiter:return\"\\\\\".concat(delimiter);case!templateLiteralCurly:return\"\\\\${\";case!lf:return\"\\\\n\";case!cr:return\"\\\\r\";case!ls:return\"\\\\u2028\";case!ps:return\"\\\\u2029\";case!other:return _double2?\"\\\\\".concat(other):other;}}),printedDelimiter=void 0===_ref67$includeDelimit||_ref67$includeDelimit?delimiterOption:\"\",\"\".concat(printedDelimiter).concat(body).concat(printedDelimiter)},sniffDirectives=function(expressions){var _ref68=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},notFinalExpression=_ref68.notFinalExpression,expression,index,lastIndex,results1,unwrapped;for(index=0,lastIndex=expressions.length-1,results1=[];index<=lastIndex&&!(index===lastIndex&&notFinalExpression);){if(expression=expressions[index],(unwrapped=null==expression?void 0:\"function\"==typeof expression.unwrap?expression.unwrap():void 0)instanceof PassthroughLiteral&&unwrapped.generated){index++;continue}if(!(expression instanceof Value&&expression.isString()&&!expression.unwrap().shouldGenerateTemplateLiteral()))break;expressions[index]=new Directive(expression).withLocationDataFrom(expression),results1.push(index++)}return results1},astAsBlockIfNeeded=function(node,o){var unwrapped;return unwrapped=node.unwrap(),unwrapped instanceof Block&&1<unwrapped.expressions.length?(unwrapped.makeReturn(null,!0),unwrapped.ast(o,LEVEL_TOP)):node.ast(o,LEVEL_PAREN)},lesser=function(a,b){return a<b?a:b},greater=function(a,b){return a>b?a:b},isAstLocGreater=function(a,b){return!!(a.line>b.line)||a.line===b.line&&a.column>b.column},isLocationDataStartGreater=function(a,b){return!!(a.first_line>b.first_line)||a.first_line===b.first_line&&a.first_column>b.first_column},isLocationDataEndGreater=function(a,b){return!!(a.last_line>b.last_line)||a.last_line===b.last_line&&a.last_column>b.last_column},exports.mergeLocationData=mergeLocationData=function(locationDataA,locationDataB){var _ref69=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},justLeading=_ref69.justLeading,justEnding=_ref69.justEnding;return Object.assign(justEnding?{first_line:locationDataA.first_line,first_column:locationDataA.first_column}:isLocationDataStartGreater(locationDataA,locationDataB)?{first_line:locationDataB.first_line,first_column:locationDataB.first_column}:{first_line:locationDataA.first_line,first_column:locationDataA.first_column},justLeading?{last_line:locationDataA.last_line,last_column:locationDataA.last_column,last_line_exclusive:locationDataA.last_line_exclusive,last_column_exclusive:locationDataA.last_column_exclusive}:isLocationDataEndGreater(locationDataA,locationDataB)?{last_line:locationDataA.last_line,last_column:locationDataA.last_column,last_line_exclusive:locationDataA.last_line_exclusive,last_column_exclusive:locationDataA.last_column_exclusive}:{last_line:locationDataB.last_line,last_column:locationDataB.last_column,last_line_exclusive:locationDataB.last_line_exclusive,last_column_exclusive:locationDataB.last_column_exclusive},{range:[justEnding?locationDataA.range[0]:lesser(locationDataA.range[0],locationDataB.range[0]),justLeading?locationDataA.range[1]:greater(locationDataA.range[1],locationDataB.range[1])]})},exports.mergeAstLocationData=mergeAstLocationData=function(nodeA,nodeB){var _ref70=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},justLeading=_ref70.justLeading,justEnding=_ref70.justEnding;return{loc:{start:justEnding?nodeA.loc.start:isAstLocGreater(nodeA.loc.start,nodeB.loc.start)?nodeB.loc.start:nodeA.loc.start,end:justLeading?nodeA.loc.end:isAstLocGreater(nodeA.loc.end,nodeB.loc.end)?nodeA.loc.end:nodeB.loc.end},range:[justEnding?nodeA.range[0]:lesser(nodeA.range[0],nodeB.range[0]),justLeading?nodeA.range[1]:greater(nodeA.range[1],nodeB.range[1])],start:justEnding?nodeA.start:lesser(nodeA.start,nodeB.start),end:justLeading?nodeA.end:greater(nodeA.end,nodeB.end)}},exports.jisonLocationDataToAstLocationData=jisonLocationDataToAstLocationData=function(_ref71){var first_line=_ref71.first_line,first_column=_ref71.first_column,last_line_exclusive=_ref71.last_line_exclusive,last_column_exclusive=_ref71.last_column_exclusive,range=_ref71.range;return{loc:{start:{line:first_line+1,column:first_column},end:{line:last_line_exclusive+1,column:last_column_exclusive}},range:[range[0],range[1]],start:range[0],end:range[1]}},zeroWidthLocationDataFromEndLocation=function(_ref72){var _ref72$range=_slicedToArray(_ref72.range,2),endRange=_ref72$range[1],last_line_exclusive=_ref72.last_line_exclusive,last_column_exclusive=_ref72.last_column_exclusive;return{first_line:last_line_exclusive,first_column:last_column_exclusive,last_line:last_line_exclusive,last_column:last_column_exclusive,last_line_exclusive:last_line_exclusive,last_column_exclusive:last_column_exclusive,range:[endRange,endRange]}},extractSameLineLocationDataFirst=function(numChars){return function(_ref73){var _ref73$range=_slicedToArray(_ref73.range,1),startRange=_ref73$range[0],first_line=_ref73.first_line,first_column=_ref73.first_column;return{first_line:first_line,first_column:first_column,last_line:first_line,last_column:first_column+numChars-1,last_line_exclusive:first_line,last_column_exclusive:first_column+numChars,range:[startRange,startRange+numChars]}}},extractSameLineLocationDataLast=function(numChars){return function(_ref74){var _ref74$range=_slicedToArray(_ref74.range,2),endRange=_ref74$range[1],last_line=_ref74.last_line,last_column=_ref74.last_column,last_line_exclusive=_ref74.last_line_exclusive,last_column_exclusive=_ref74.last_column_exclusive;return{first_line:last_line,first_column:last_column-(numChars-1),last_line:last_line,last_column:last_column,last_line_exclusive:last_line_exclusive,last_column_exclusive:last_column_exclusive,range:[endRange-numChars,endRange]}}},emptyExpressionLocationData=function(_ref75){var element=_ref75.interpolationNode,openingBrace=_ref75.openingBrace,closingBrace=_ref75.closingBrace;return{first_line:element.locationData.first_line,first_column:element.locationData.first_column+openingBrace.length,last_line:element.locationData.last_line,last_column:element.locationData.last_column-closingBrace.length,last_line_exclusive:element.locationData.last_line,last_column_exclusive:element.locationData.last_column,range:[element.locationData.range[0]+openingBrace.length,element.locationData.range[1]-closingBrace.length]}}}.call(this),{exports:exports}.exports}(),require[\"./sourcemap\"]=function(){var module={exports:{}};return function(){var LineMap,SourceMap;LineMap=function(){\"use strict\";function LineMap(line1){_classCallCheck(this,LineMap),this.line=line1,this.columns=[]}return _createClass(LineMap,[{key:\"add\",value:function add(column,_ref76){var _ref77=_slicedToArray(_ref76,2),sourceLine=_ref77[0],sourceColumn=_ref77[1],options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};return this.columns[column]&&options.noReplace?void 0:this.columns[column]={line:this.line,column:column,sourceLine:sourceLine,sourceColumn:sourceColumn}}},{key:\"sourceLocation\",value:function sourceLocation(column){for(var mapping;!((mapping=this.columns[column])||0>=column);)column--;return mapping&&[mapping.sourceLine,mapping.sourceColumn]}}]),LineMap}(),SourceMap=function(){var SourceMap=function(){\"use strict\";function SourceMap(){_classCallCheck(this,SourceMap),this.lines=[]}return _createClass(SourceMap,[{key:\"add\",value:function add(sourceLocation,generatedLocation){var options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_generatedLocation=_slicedToArray(generatedLocation,2),base,column,line,lineMap;return line=_generatedLocation[0],column=_generatedLocation[1],lineMap=(base=this.lines)[line]||(base[line]=new LineMap(line)),lineMap.add(column,sourceLocation,options)}},{key:\"sourceLocation\",value:function sourceLocation(_ref78){for(var _ref79=_slicedToArray(_ref78,2),line=_ref79[0],column=_ref79[1],lineMap;!((lineMap=this.lines[line])||0>=line);)line--;return lineMap&&lineMap.sourceLocation(column)}},{key:\"generate\",value:function generate(){var options=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},code=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null,buffer,i,j,lastColumn,lastSourceColumn,lastSourceLine,len,len1,lineMap,lineNumber,mapping,needComma,ref,ref1,sources,v3,writingline;for(writingline=0,lastColumn=0,lastSourceLine=0,lastSourceColumn=0,needComma=!1,buffer=\"\",ref=this.lines,(lineNumber=i=0,len=ref.length);i<len;lineNumber=++i)if(lineMap=ref[lineNumber],lineMap)for(ref1=lineMap.columns,j=0,len1=ref1.length;j<len1;j++)if(mapping=ref1[j],!!mapping){for(;writingline<mapping.line;)lastColumn=0,needComma=!1,buffer+=\";\",writingline++;needComma&&(buffer+=\",\",needComma=!1),buffer+=this.encodeVlq(mapping.column-lastColumn),lastColumn=mapping.column,buffer+=this.encodeVlq(0),buffer+=this.encodeVlq(mapping.sourceLine-lastSourceLine),lastSourceLine=mapping.sourceLine,buffer+=this.encodeVlq(mapping.sourceColumn-lastSourceColumn),lastSourceColumn=mapping.sourceColumn,needComma=!0}return sources=options.sourceFiles?options.sourceFiles:options.filename?[options.filename]:[\"<anonymous>\"],v3={version:3,file:options.generatedFile||\"\",sourceRoot:options.sourceRoot||\"\",sources:sources,names:[],mappings:buffer},(options.sourceMap||options.inlineMap)&&(v3.sourcesContent=[code]),v3}},{key:\"encodeVlq\",value:function encodeVlq(value){var answer,nextChunk,signBit,valueToEncode;for(answer=\"\",signBit=0>value?1:0,valueToEncode=(_Mathabs(value)<<1)+signBit;valueToEncode||!answer;)nextChunk=valueToEncode&VLQ_VALUE_MASK,valueToEncode>>=VLQ_SHIFT,valueToEncode&&(nextChunk|=VLQ_CONTINUATION_BIT),answer+=this.encodeBase64(nextChunk);return answer}},{key:\"encodeBase64\",value:function encodeBase64(value){return BASE64_CHARS[value]||function(){throw new Error(\"Cannot Base64 encode value: \".concat(value))}()}}],[{key:\"registerCompiled\",value:function registerCompiled(filename,source,sourcemap){if(null!=sourcemap)return SourceMap.sourceMaps[filename]=sourcemap}},{key:\"getSourceMap\",value:function getSourceMap(filename){return SourceMap.sourceMaps[filename]}}]),SourceMap}(),BASE64_CHARS,VLQ_CONTINUATION_BIT,VLQ_SHIFT,VLQ_VALUE_MASK;return SourceMap.sourceMaps=Object.create(null),VLQ_SHIFT=5,VLQ_CONTINUATION_BIT=1<<VLQ_SHIFT,VLQ_VALUE_MASK=VLQ_CONTINUATION_BIT-1,BASE64_CHARS=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",SourceMap}.call(this),module.exports=SourceMap}.call(this),module.exports}(),require[\"./coffeescript\"]=function(){var exports={};return function(){var _require7=require(\"./lexer\"),FILE_EXTENSIONS,Lexer,SourceMap,base64encode,checkShebangLine,compile,getSourceMap,helpers,lexer,packageJson,parser,registerCompiled,withPrettyErrors;Lexer=_require7.Lexer;var _require8=require(\"./parser\");parser=_require8.parser,helpers=require(\"./helpers\"),SourceMap=require(\"./sourcemap\"),packageJson=require(\"../../package.json\"),exports.VERSION=packageJson.version,exports.FILE_EXTENSIONS=FILE_EXTENSIONS=[\".coffee\",\".litcoffee\",\".coffee.md\"],exports.helpers=helpers;var _SourceMap=SourceMap;getSourceMap=_SourceMap.getSourceMap,registerCompiled=_SourceMap.registerCompiled,exports.registerCompiled=registerCompiled,base64encode=function(src){switch(!1){case\"function\"!=typeof Buffer:return Buffer.from(src).toString(\"base64\");case\"function\"!=typeof btoa:return btoa(encodeURIComponent(src).replace(/%([0-9A-F]{2})/g,function(match,p1){return _StringfromCharCode(\"0x\"+p1)}));default:throw new Error(\"Unable to base64 encode inline sourcemap.\");}},withPrettyErrors=function(fn){return function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},err;try{return fn.call(this,code,options)}catch(error){if(err=error,\"string\"!=typeof code)throw err;throw helpers.updateSyntaxError(err,code,options.filename)}}},exports.compile=compile=withPrettyErrors(function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},ast,currentColumn,currentLine,encoded,filename,fragment,fragments,generateSourceMap,header,i,j,js,len,len1,map,newLines,nodes,range,ref,sourceCodeLastLine,sourceCodeNumberOfLines,sourceMapDataURI,sourceURL,token,tokens,transpiler,transpilerOptions,transpilerOutput,v3SourceMap;if(options=Object.assign({},options),generateSourceMap=options.sourceMap||options.inlineMap||null==options.filename,filename=options.filename||helpers.anonymousFileName(),checkShebangLine(filename,code),generateSourceMap&&(map=new SourceMap),tokens=lexer.tokenize(code,options),options.referencedVars=function(){var i,len,results;for(results=[],i=0,len=tokens.length;i<len;i++)token=tokens[i],\"IDENTIFIER\"===token[0]&&results.push(token[1]);return results}(),null==options.bare||!0!==options.bare)for(i=0,len=tokens.length;i<len;i++)if(token=tokens[i],\"IMPORT\"===(ref=token[0])||\"EXPORT\"===ref){options.bare=!0;break}if(nodes=parser.parse(tokens),options.ast)return nodes.allCommentTokens=helpers.extractAllCommentTokens(tokens),sourceCodeNumberOfLines=(code.match(/\\r?\\n/g)||\"\").length+1,sourceCodeLastLine=/.*$/.exec(code)[0],ast=nodes.ast(options),range=[0,code.length],ast.start=ast.program.start=range[0],ast.end=ast.program.end=range[1],ast.range=ast.program.range=range,ast.loc.start=ast.program.loc.start={line:1,column:0},ast.loc.end.line=ast.program.loc.end.line=sourceCodeNumberOfLines,ast.loc.end.column=ast.program.loc.end.column=sourceCodeLastLine.length,ast.tokens=tokens,ast;for(fragments=nodes.compileToFragments(options),currentLine=0,options.header&&(currentLine+=1),options.shiftLine&&(currentLine+=1),currentColumn=0,js=\"\",(j=0,len1=fragments.length);j<len1;j++)fragment=fragments[j],generateSourceMap&&(fragment.locationData&&!/^[;\\s]*$/.test(fragment.code)&&map.add([fragment.locationData.first_line,fragment.locationData.first_column],[currentLine,currentColumn],{noReplace:!0}),newLines=helpers.count(fragment.code,\"\\n\"),currentLine+=newLines,newLines?currentColumn=fragment.code.length-(fragment.code.lastIndexOf(\"\\n\")+1):currentColumn+=fragment.code.length),js+=fragment.code;if(options.header&&(header=\"Generated by CoffeeScript \".concat(this.VERSION),js=\"// \".concat(header,\"\\n\").concat(js)),generateSourceMap&&(v3SourceMap=map.generate(options,code)),options.transpile){if(\"object\"!==_typeof(options.transpile))throw new Error(\"The transpile option must be given an object with options to pass to Babel\");transpiler=options.transpile.transpile,delete options.transpile.transpile,transpilerOptions=Object.assign({},options.transpile),v3SourceMap&&null==transpilerOptions.inputSourceMap&&(transpilerOptions.inputSourceMap=v3SourceMap),transpilerOutput=transpiler(js,transpilerOptions),js=transpilerOutput.code,v3SourceMap&&transpilerOutput.map&&(v3SourceMap=transpilerOutput.map)}return options.inlineMap&&(encoded=base64encode(JSON.stringify(v3SourceMap)),sourceMapDataURI=\"//# sourceMappingURL=data:application/json;base64,\".concat(encoded),sourceURL=\"//# sourceURL=\".concat(filename),js=\"\".concat(js,\"\\n\").concat(sourceMapDataURI,\"\\n\").concat(sourceURL)),registerCompiled(filename,code,map),options.sourceMap?{js:js,sourceMap:map,v3SourceMap:JSON.stringify(v3SourceMap,null,2)}:js}),exports.tokens=withPrettyErrors(function(code,options){return lexer.tokenize(code,options)}),exports.nodes=withPrettyErrors(function(source,options){return\"string\"==typeof source&&(source=lexer.tokenize(source,options)),parser.parse(source)}),exports.run=exports.eval=exports.register=function(){throw new Error(\"require index.coffee, not this file\")},lexer=new Lexer,parser.lexer={yylloc:{range:[]},options:{ranges:!0},lex:function lex(){var tag,token;if(token=parser.tokens[this.pos++],token){var _token6=token,_token7=_slicedToArray(_token6,3);tag=_token7[0],this.yytext=_token7[1],this.yylloc=_token7[2],parser.errorToken=token.origin||token,this.yylineno=this.yylloc.first_line}else tag=\"\";return tag},setInput:function setInput(tokens){return parser.tokens=tokens,this.pos=0},upcomingInput:function upcomingInput(){return\"\"}},parser.yy=require(\"./nodes\"),parser.yy.parseError=function(message,_ref80){var token=_ref80.token,_parser=parser,errorLoc,errorTag,errorText,errorToken,tokens;errorToken=_parser.errorToken,tokens=_parser.tokens;var _errorToken=errorToken,_errorToken2=_slicedToArray(_errorToken,3);return errorTag=_errorToken2[0],errorText=_errorToken2[1],errorLoc=_errorToken2[2],errorText=function(){switch(!1){case errorToken!==tokens[tokens.length-1]:return\"end of input\";case\"INDENT\"!==errorTag&&\"OUTDENT\"!==errorTag:return\"indentation\";case\"IDENTIFIER\"!==errorTag&&\"NUMBER\"!==errorTag&&\"INFINITY\"!==errorTag&&\"STRING\"!==errorTag&&\"STRING_START\"!==errorTag&&\"REGEX\"!==errorTag&&\"REGEX_START\"!==errorTag:return errorTag.replace(/_START$/,\"\").toLowerCase();default:return helpers.nameWhitespaceCharacter(errorText);}}(),helpers.throwSyntaxError(\"unexpected \".concat(errorText),errorLoc)},exports.patchStackTrace=function(){var formatSourcePosition,getSourceMapping;return formatSourcePosition=function(frame,getSourceMapping){var as,column,fileLocation,filename,functionName,isConstructor,isMethodCall,line,methodName,source,tp,typeName;return filename=void 0,fileLocation=\"\",frame.isNative()?fileLocation=\"native\":(frame.isEval()?(filename=frame.getScriptNameOrSourceURL(),!filename&&(fileLocation=\"\".concat(frame.getEvalOrigin(),\", \"))):filename=frame.getFileName(),filename||(filename=\"<anonymous>\"),line=frame.getLineNumber(),column=frame.getColumnNumber(),source=getSourceMapping(filename,line,column),fileLocation=source?\"\".concat(filename,\":\").concat(source[0],\":\").concat(source[1]):\"\".concat(filename,\":\").concat(line,\":\").concat(column)),functionName=frame.getFunctionName(),isConstructor=frame.isConstructor(),isMethodCall=!(frame.isToplevel()||isConstructor),isMethodCall?(methodName=frame.getMethodName(),typeName=frame.getTypeName(),functionName?(tp=as=\"\",typeName&&functionName.indexOf(typeName)&&(tp=\"\".concat(typeName,\".\")),methodName&&functionName.indexOf(\".\".concat(methodName))!==functionName.length-methodName.length-1&&(as=\" [as \".concat(methodName,\"]\")),\"\".concat(tp).concat(functionName).concat(as,\" (\").concat(fileLocation,\")\")):\"\".concat(typeName,\".\").concat(methodName||\"<anonymous>\",\" (\").concat(fileLocation,\")\")):isConstructor?\"new \".concat(functionName||\"<anonymous>\",\" (\").concat(fileLocation,\")\"):functionName?\"\".concat(functionName,\" (\").concat(fileLocation,\")\"):fileLocation},getSourceMapping=function(filename,line,column){var answer,sourceMap;return sourceMap=getSourceMap(filename,line,column),null!=sourceMap&&(answer=sourceMap.sourceLocation([line-1,column-1])),null==answer?null:[answer[0]+1,answer[1]+1]},Error.prepareStackTrace=function(err,stack){var frame,frames;return frames=function(){var i,len,results;for(results=[],i=0,len=stack.length;i<len&&(frame=stack[i],frame.getFunction()!==exports.run);i++)results.push(\"    at \".concat(formatSourcePosition(frame,getSourceMapping)));return results}(),\"\".concat(err.toString(),\"\\n\").concat(frames.join(\"\\n\"),\"\\n\")}},checkShebangLine=function(file,input){var args,firstLine,ref,rest;if(firstLine=input.split(/$/m,1)[0],rest=null==firstLine?void 0:firstLine.match(/^#!\\s*([^\\s]+\\s*)(.*)/),args=null==rest||null==(ref=rest[2])?void 0:ref.split(/\\s/).filter(function(s){return\"\"!==s}),1<(null==args?void 0:args.length))return console.error(\"The script to be run begins with a shebang line with more than one\\nargument. This script will fail on platforms such as Linux which only\\nallow a single argument.\"),console.error(\"The shebang line was: '\".concat(firstLine,\"' in file '\").concat(file,\"'\")),console.error(\"The arguments were: \".concat(JSON.stringify(args)))}}.call(this),{exports:exports}.exports}(),require[\"./browser\"]=function(){var module={exports:{}};return function(){var indexOf=[].indexOf,CoffeeScript,compile;CoffeeScript=require(\"./coffeescript\");var _CoffeeScript=CoffeeScript;compile=_CoffeeScript.compile,CoffeeScript.eval=function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},globalRoot;return null==options.bare&&(options.bare=!0),globalRoot=\"undefined\"!=typeof window&&null!==window?window:global,globalRoot.eval(compile(code,options))},CoffeeScript.run=function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};return options.bare=!0,options.shiftLine=!0,Function(compile(code,options))()},module.exports=CoffeeScript,\"undefined\"==typeof window||null===window||(\"undefined\"!=typeof btoa&&null!==btoa&&\"undefined\"!=typeof JSON&&null!==JSON&&(compile=function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};return options.inlineMap=!0,CoffeeScript.compile(code,options)}),CoffeeScript.load=function(url,callback){var options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},hold=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3],xhr;return options.sourceFiles=[url],xhr=window.ActiveXObject?new window.ActiveXObject(\"Microsoft.XMLHTTP\"):new window.XMLHttpRequest,xhr.open(\"GET\",url,!0),\"overrideMimeType\"in xhr&&xhr.overrideMimeType(\"text/plain\"),xhr.onreadystatechange=function(){var param,ref;if(4===xhr.readyState){if(0!==(ref=xhr.status)&&200!==ref)throw new Error(\"Could not load \".concat(url));else if(param=[xhr.responseText,options],!hold){var _CoffeeScript2;(_CoffeeScript2=CoffeeScript).run.apply(_CoffeeScript2,_toConsumableArray(param))}if(callback)return callback(param)}},xhr.send(null)},CoffeeScript.runScripts=function(){var coffees,coffeetypes,_execute,i,index,j,len,s,script,scripts;for(scripts=window.document.getElementsByTagName(\"script\"),coffeetypes=[\"text/coffeescript\",\"text/literate-coffeescript\"],coffees=function(){var j,len,ref,results;for(results=[],j=0,len=scripts.length;j<len;j++)s=scripts[j],(ref=s.type,0<=indexOf.call(coffeetypes,ref))&&results.push(s);return results}(),index=0,_execute=function execute(){var param;if(param=coffees[index],param instanceof Array){var _CoffeeScript3;return(_CoffeeScript3=CoffeeScript).run.apply(_CoffeeScript3,_toConsumableArray(param)),index++,_execute()}},(i=j=0,len=coffees.length);j<len;i=++j)script=coffees[i],function(script,i){var options,source;return options={literate:script.type===coffeetypes[1]},source=script.src||script.getAttribute(\"data-src\"),source?(options.filename=source,CoffeeScript.load(source,function(param){return coffees[i]=param,_execute()},options,!0)):(options.filename=script.id&&\"\"!==script.id?script.id:\"coffeescript\".concat(0===i?\"\":i),options.sourceFiles=[\"embedded\"],coffees[i]=[script.innerHTML,options])}(script,i);return _execute()},this===window&&(window.addEventListener?window.addEventListener(\"DOMContentLoaded\",CoffeeScript.runScripts,!1):window.attachEvent(\"onload\",CoffeeScript.runScripts)))}.call(this),module.exports}(),require[\"./browser\"]}();\"function\"==typeof define&&define.amd?define(function(){return CoffeeScript}):root.CoffeeScript=CoffeeScript})(this);"
  },
  {
    "path": "docs/v2/browser-compiler-modern/coffeescript.js",
    "content": "/**\n * CoffeeScript Compiler v2.7.0\n * https://coffeescript.org\n *\n * Copyright 2011-2023, Jeremy Ashkenas\n * Released under the MIT License\n */\nfunction _get(){return _get=\"undefined\"!=typeof Reflect&&Reflect.get?Reflect.get:function(target,property,receiver){var base=_superPropBase(target,property);if(base){var desc=Object.getOwnPropertyDescriptor(base,property);return desc.get?desc.get.call(3>arguments.length?target:receiver):desc.value}},_get.apply(this,arguments)}function _superPropBase(object,property){for(;!Object.prototype.hasOwnProperty.call(object,property)&&(object=_getPrototypeOf(object),null!==object););return object}function _inherits(subClass,superClass){if(\"function\"!=typeof superClass&&null!==superClass)throw new TypeError(\"Super expression must either be null or a function\");subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:!0,configurable:!0}}),Object.defineProperty(subClass,\"prototype\",{writable:!1}),superClass&&_setPrototypeOf(subClass,superClass)}function _setPrototypeOf(o,p){return _setPrototypeOf=Object.setPrototypeOf||function(o,p){return o.__proto__=p,o},_setPrototypeOf(o,p)}function _createSuper(Derived){var hasNativeReflectConstruct=_isNativeReflectConstruct();return function(){var Super=_getPrototypeOf(Derived),result;if(hasNativeReflectConstruct){var NewTarget=_getPrototypeOf(this).constructor;result=Reflect.construct(Super,arguments,NewTarget)}else result=Super.apply(this,arguments);return _possibleConstructorReturn(this,result)}}function _possibleConstructorReturn(self,call){if(call&&(\"object\"===_typeof(call)||\"function\"==typeof call))return call;if(void 0!==call)throw new TypeError(\"Derived constructors may only return object or undefined\");return _assertThisInitialized(self)}function _assertThisInitialized(self){if(void 0===self)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return self}function _isNativeReflectConstruct(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}function _getPrototypeOf(o){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function(o){return o.__proto__||Object.getPrototypeOf(o)},_getPrototypeOf(o)}function _toArray(arr){return _arrayWithHoles(arr)||_iterableToArray(arr)||_unsupportedIterableToArray(arr)||_nonIterableRest()}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_unsupportedIterableToArray(arr,i)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}function _iterableToArrayLimit(arr,i){var _i=null==arr?null:\"undefined\"!=typeof Symbol&&arr[Symbol.iterator]||arr[\"@@iterator\"];if(null!=_i){var _arr=[],_n=!0,_d=!1,_s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!(i&&_arr.length===i));_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i[\"return\"]||_i[\"return\"]()}finally{if(_d)throw _e}}return _arr}}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(target,props){for(var i=0,descriptor;i<props.length;i++)descriptor=props[i],descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,\"value\"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}function _createClass(Constructor,protoProps,staticProps){return protoProps&&_defineProperties(Constructor.prototype,protoProps),staticProps&&_defineProperties(Constructor,staticProps),Object.defineProperty(Constructor,\"prototype\",{writable:!1}),Constructor}function _typeof(obj){\"@babel/helpers - typeof\";return _typeof=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&\"function\"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?\"symbol\":typeof obj},_typeof(obj)}function _toConsumableArray(arr){return _arrayWithoutHoles(arr)||_iterableToArray(arr)||_unsupportedIterableToArray(arr)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}function _unsupportedIterableToArray(o,minLen){if(o){if(\"string\"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);return\"Object\"===n&&o.constructor&&(n=o.constructor.name),\"Map\"===n||\"Set\"===n?Array.from(o):\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(o,minLen):void 0}}function _iterableToArray(iter){if(\"undefined\"!=typeof Symbol&&null!=iter[Symbol.iterator]||null!=iter[\"@@iterator\"])return Array.from(iter)}function _arrayWithoutHoles(arr){if(Array.isArray(arr))return _arrayLikeToArray(arr)}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=Array(len);i<len;i++)arr2[i]=arr[i];return arr2}var CoffeeScript=function(){var _Mathabs=Math.abs,_StringfromCharCode=String.fromCharCode,_Mathfloor=Math.floor;function require(path){return require[path]}return require[\"../../package.json\"]=function(){return{name:\"coffeescript\",description:\"Unfancy JavaScript\",keywords:[\"javascript\",\"language\",\"coffeescript\",\"compiler\"],author:\"Jeremy Ashkenas\",version:\"2.7.0\",license:\"MIT\",engines:{node:\">=6\"},directories:{lib:\"./lib/coffeescript\"},main:\"./lib/coffeescript/index\",module:\"./lib/coffeescript-browser-compiler-modern/coffeescript.js\",browser:\"./lib/coffeescript-browser-compiler-legacy/coffeescript.js\",bin:{coffee:\"./bin/coffee\",cake:\"./bin/cake\"},files:[\"bin\",\"lib\",\"register.js\",\"repl.js\"],scripts:{test:\"node ./bin/cake test\",\"test-harmony\":\"node --harmony ./bin/cake test\"},homepage:\"https://coffeescript.org\",bugs:\"https://github.com/jashkenas/coffeescript/issues\",repository:{type:\"git\",url:\"git://github.com/jashkenas/coffeescript.git\"},devDependencies:{\"@babel/core\":\"~7.17.9\",\"@babel/preset-env\":\"~7.16.11\",\"babel-preset-minify\":\"~0.5.1\",codemirror:\"~5.65.3\",docco:\"~0.9.1\",\"highlight.js\":\"~11.5.1\",jison:\"~0.4.18\",\"markdown-it\":\"~13.0.0\",puppeteer:\"~13.6.0\",underscore:\"~1.13.3\",webpack:\"~5.72.0\"}}}(),require[\"./helpers\"]=function(){var exports={};return function(){var indexOf=[].indexOf,UNICODE_CODE_POINT_ESCAPE,attachCommentsToNode,buildLocationData,buildLocationHash,buildTokenDataDictionary,extend,flatten,isBoolean,isNumber,isString,ref,repeat,syntaxErrorToString,unicodeCodePointToUnicodeEscapes;exports.starts=function(string,literal,start){return literal===string.substr(start,literal.length)},exports.ends=function(string,literal,back){var len;return len=literal.length,literal===string.substr(string.length-len-(back||0),len)},exports.repeat=repeat=function(str,n){var res;for(res=\"\";0<n;)1&n&&(res+=str),n>>>=1,str+=str;return res},exports.compact=function(array){var i,item,len1,results;for(results=[],i=0,len1=array.length;i<len1;i++)item=array[i],item&&results.push(item);return results},exports.count=function(string,substr){var num,pos;if(num=pos=0,!substr.length)return 1/0;for(;pos=1+string.indexOf(substr,pos);)num++;return num},exports.merge=function(options,overrides){return extend(extend({},options),overrides)},extend=exports.extend=function(object,properties){var key,val;for(key in properties)val=properties[key],object[key]=val;return object},exports.flatten=flatten=function(array){return array.flat(2e308)},exports.del=function(obj,key){var val;return val=obj[key],delete obj[key],val},exports.some=null==(ref=Array.prototype.some)?function(fn){var e,i,len1,ref1;for(ref1=this,i=0,len1=ref1.length;i<len1;i++)if(e=ref1[i],fn(e))return!0;return!1}:ref,exports.invertLiterate=function(code){var blankLine,i,indented,insideComment,len1,line,listItemStart,out,ref1;for(out=[],blankLine=/^\\s*$/,indented=/^[\\t ]/,listItemStart=/^(?:\\t?| {0,3})(?:[\\*\\-\\+]|[0-9]{1,9}\\.)[ \\t]/,insideComment=!1,ref1=code.split(\"\\n\"),(i=0,len1=ref1.length);i<len1;i++)line=ref1[i],blankLine.test(line)?(insideComment=!1,out.push(line)):insideComment||listItemStart.test(line)?(insideComment=!0,out.push(\"# \".concat(line))):!insideComment&&indented.test(line)?out.push(line):(insideComment=!0,out.push(\"# \".concat(line)));return out.join(\"\\n\")},buildLocationData=function(first,last){return last?{first_line:first.first_line,first_column:first.first_column,last_line:last.last_line,last_column:last.last_column,last_line_exclusive:last.last_line_exclusive,last_column_exclusive:last.last_column_exclusive,range:[first.range[0],last.range[1]]}:first},exports.extractAllCommentTokens=function(tokens){var allCommentsObj,comment,commentKey,i,j,k,key,len1,len2,len3,ref1,results,sortedKeys,token;for(allCommentsObj={},i=0,len1=tokens.length;i<len1;i++)if(token=tokens[i],token.comments)for(ref1=token.comments,j=0,len2=ref1.length;j<len2;j++)comment=ref1[j],commentKey=comment.locationData.range[0],allCommentsObj[commentKey]=comment;for(sortedKeys=Object.keys(allCommentsObj).sort(function(a,b){return a-b}),results=[],(k=0,len3=sortedKeys.length);k<len3;k++)key=sortedKeys[k],results.push(allCommentsObj[key]);return results},buildLocationHash=function(loc){return\"\".concat(loc.range[0],\"-\").concat(loc.range[1])},exports.buildTokenDataDictionary=buildTokenDataDictionary=function(tokens){var base1,i,len1,token,tokenData,tokenHash;for(tokenData={},i=0,len1=tokens.length;i<len1;i++)if((token=tokens[i],!!token.comments)&&(tokenHash=buildLocationHash(token[2]),null==tokenData[tokenHash]&&(tokenData[tokenHash]={}),token.comments)){var _ref;(_ref=null==(base1=tokenData[tokenHash]).comments?base1.comments=[]:base1.comments).push.apply(_ref,_toConsumableArray(token.comments))}return tokenData},exports.addDataToNode=function(parserState,firstLocationData,firstValue,lastLocationData,lastValue){var forceUpdateLocation=!(5<arguments.length&&void 0!==arguments[5])||arguments[5];return function(obj){var locationData,objHash,ref1,ref2,ref3;return locationData=buildLocationData(null==(ref1=null==firstValue?void 0:firstValue.locationData)?firstLocationData:ref1,null==(ref2=null==lastValue?void 0:lastValue.locationData)?lastLocationData:ref2),null!=(null==obj?void 0:obj.updateLocationDataIfMissing)&&null!=firstLocationData?obj.updateLocationDataIfMissing(locationData,forceUpdateLocation):obj.locationData=locationData,null==parserState.tokenData&&(parserState.tokenData=buildTokenDataDictionary(parserState.parser.tokens)),null!=obj.locationData&&(objHash=buildLocationHash(obj.locationData),null!=(null==(ref3=parserState.tokenData[objHash])?void 0:ref3.comments)&&attachCommentsToNode(parserState.tokenData[objHash].comments,obj)),obj}},exports.attachCommentsToNode=attachCommentsToNode=function(comments,node){var _node$comments;if(null!=comments&&0!==comments.length)return null==node.comments&&(node.comments=[]),(_node$comments=node.comments).push.apply(_node$comments,_toConsumableArray(comments))},exports.locationDataToString=function(obj){var locationData;return\"2\"in obj&&\"first_line\"in obj[2]?locationData=obj[2]:\"first_line\"in obj&&(locationData=obj),locationData?\"\".concat(locationData.first_line+1,\":\").concat(locationData.first_column+1,\"-\")+\"\".concat(locationData.last_line+1,\":\").concat(locationData.last_column+1):\"No location data\"},exports.anonymousFileName=function(){var n;return n=0,function(){return\"<anonymous-\".concat(n++,\">\")}}(),exports.baseFileName=function(file){var stripExt=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],useWinPathSep=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],parts,pathSep;return(pathSep=useWinPathSep?/\\\\|\\//:/\\//,parts=file.split(pathSep),file=parts[parts.length-1],!(stripExt&&0<=file.indexOf(\".\")))?file:(parts=file.split(\".\"),parts.pop(),\"coffee\"===parts[parts.length-1]&&1<parts.length&&parts.pop(),parts.join(\".\"))},exports.isCoffee=function(file){return /\\.((lit)?coffee|coffee\\.md)$/.test(file)},exports.isLiterate=function(file){return /\\.(litcoffee|coffee\\.md)$/.test(file)},exports.throwSyntaxError=function(message,location){var error;throw error=new SyntaxError(message),error.location=location,error.toString=syntaxErrorToString,error.stack=error.toString(),error},exports.updateSyntaxError=function(error,code,filename){return error.toString===syntaxErrorToString&&(error.code||(error.code=code),error.filename||(error.filename=filename),error.stack=error.toString()),error},syntaxErrorToString=function(){var codeLine,colorize,colorsEnabled,end,filename,first_column,first_line,last_column,last_line,marker,ref1,ref2,ref3,ref4,start;if(!(this.code&&this.location))return Error.prototype.toString.call(this);var _this$location=this.location;return first_line=_this$location.first_line,first_column=_this$location.first_column,last_line=_this$location.last_line,last_column=_this$location.last_column,null==last_line&&(last_line=first_line),null==last_column&&(last_column=first_column),filename=(null==(ref1=this.filename)?void 0:ref1.startsWith(\"<anonymous\"))?\"[stdin]\":this.filename||\"[stdin]\",codeLine=this.code.split(\"\\n\")[first_line],start=first_column,end=first_line===last_line?last_column+1:codeLine.length,marker=codeLine.slice(0,start).replace(/[^\\s]/g,\" \")+repeat(\"^\",end-start),\"undefined\"!=typeof process&&null!==process&&(colorsEnabled=(null==(ref2=process.stdout)?void 0:ref2.isTTY)&&(null==(ref3=process.env)||!ref3.NODE_DISABLE_COLORS)),(null==(ref4=this.colorful)?colorsEnabled:ref4)&&(colorize=function(str){return\"\\x1B[1;31m\".concat(str,\"\\x1B[0m\")},codeLine=codeLine.slice(0,start)+colorize(codeLine.slice(start,end))+codeLine.slice(end),marker=colorize(marker)),\"\".concat(filename,\":\").concat(first_line+1,\":\").concat(first_column+1,\": error: \").concat(this.message,\"\\n\").concat(codeLine,\"\\n\").concat(marker)},exports.nameWhitespaceCharacter=function(string){return\" \"===string?\"space\":\"\\n\"===string?\"newline\":\"\\r\"===string?\"carriage return\":\"\\t\"===string?\"tab\":string},exports.parseNumber=function(string){var base;return null==string?0/0:(base=function(){switch(string.charAt(1)){case\"b\":return 2;case\"o\":return 8;case\"x\":return 16;default:return null;}}(),null==base?parseFloat(string.replace(/_/g,\"\")):parseInt(string.slice(2).replace(/_/g,\"\"),base))},exports.isFunction=function(obj){return\"[object Function]\"===Object.prototype.toString.call(obj)},exports.isNumber=isNumber=function(obj){return\"[object Number]\"===Object.prototype.toString.call(obj)},exports.isString=isString=function(obj){return\"[object String]\"===Object.prototype.toString.call(obj)},exports.isBoolean=isBoolean=function(obj){return!0===obj||!1===obj||\"[object Boolean]\"===Object.prototype.toString.call(obj)},exports.isPlainObject=function(obj){return\"object\"===_typeof(obj)&&!!obj&&!Array.isArray(obj)&&!isNumber(obj)&&!isString(obj)&&!isBoolean(obj)},unicodeCodePointToUnicodeEscapes=function(codePoint){var high,low,toUnicodeEscape;return(toUnicodeEscape=function(val){var str;return str=val.toString(16),\"\\\\u\".concat(repeat(\"0\",4-str.length)).concat(str)},65536>codePoint)?toUnicodeEscape(codePoint):(high=_Mathfloor((codePoint-65536)/1024)+55296,low=(codePoint-65536)%1024+56320,\"\".concat(toUnicodeEscape(high)).concat(toUnicodeEscape(low)))},exports.replaceUnicodeCodePointEscapes=function(str){var _ref2=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},flags=_ref2.flags,error=_ref2.error,_ref2$delimiter=_ref2.delimiter,delimiter=void 0===_ref2$delimiter?\"\":_ref2$delimiter,shouldReplace;return shouldReplace=null!=flags&&0>indexOf.call(flags,\"u\"),str.replace(UNICODE_CODE_POINT_ESCAPE,function(match,escapedBackslash,codePointHex,offset){var codePointDecimal;return escapedBackslash?escapedBackslash:(codePointDecimal=parseInt(codePointHex,16),1114111<codePointDecimal&&error(\"unicode code point escapes greater than \\\\u{10ffff} are not allowed\",{offset:offset+delimiter.length,length:codePointHex.length+4}),shouldReplace?unicodeCodePointToUnicodeEscapes(codePointDecimal):match)})},UNICODE_CODE_POINT_ESCAPE=/(\\\\\\\\)|\\\\u\\{([\\da-fA-F]+)\\}/g}.call(this),{exports:exports}.exports}(),require[\"./rewriter\"]=function(){var exports={};return function(){var indexOf=[].indexOf,hasProp={}.hasOwnProperty,_require=require(\"./helpers\"),BALANCED_PAIRS,CALL_CLOSERS,CONTROL_IN_IMPLICIT,DISCARDED,EXPRESSION_CLOSE,EXPRESSION_END,EXPRESSION_START,IMPLICIT_CALL,IMPLICIT_END,IMPLICIT_FUNC,IMPLICIT_UNSPACED_CALL,INVERSES,LINEBREAKS,Rewriter,SINGLE_CLOSERS,SINGLE_LINERS,UNFINISHED,extractAllCommentTokens,generate,k,left,len,moveComments,right,throwSyntaxError;for(throwSyntaxError=_require.throwSyntaxError,extractAllCommentTokens=_require.extractAllCommentTokens,moveComments=function(fromToken,toToken){var comment,k,len,ref,unshiftedComments;if(fromToken.comments){if(toToken.comments&&0!==toToken.comments.length){for(unshiftedComments=[],ref=fromToken.comments,(k=0,len=ref.length);k<len;k++)comment=ref[k],comment.unshift?unshiftedComments.push(comment):toToken.comments.push(comment);toToken.comments=unshiftedComments.concat(toToken.comments)}else toToken.comments=fromToken.comments;return delete fromToken.comments}},generate=function(tag,value,origin,commentsToken){var token;return token=[tag,value],token.generated=!0,origin&&(token.origin=origin),commentsToken&&moveComments(commentsToken,token),token},exports.Rewriter=Rewriter=function(){var Rewriter=function(){function Rewriter(){_classCallCheck(this,Rewriter)}return _createClass(Rewriter,[{key:\"rewrite\",value:function rewrite(tokens1){var ref,ref1,t;return this.tokens=tokens1,(\"undefined\"!=typeof process&&null!==process?null==(ref=process.env)?void 0:ref.DEBUG_TOKEN_STREAM:void 0)&&(process.env.DEBUG_REWRITTEN_TOKEN_STREAM&&console.log(\"Initial token stream:\"),console.log(function(){var k,len,ref1,results;for(ref1=this.tokens,results=[],(k=0,len=ref1.length);k<len;k++)t=ref1[k],results.push(t[0]+\"/\"+t[1]+(t.comments?\"*\":\"\"));return results}.call(this).join(\" \"))),this.removeLeadingNewlines(),this.closeOpenCalls(),this.closeOpenIndexes(),this.normalizeLines(),this.tagPostfixConditionals(),this.addImplicitBracesAndParens(),this.rescueStowawayComments(),this.addLocationDataToGeneratedTokens(),this.enforceValidJSXAttributes(),this.fixIndentationLocationData(),this.exposeTokenDataToGrammar(),(\"undefined\"!=typeof process&&null!==process?null==(ref1=process.env)?void 0:ref1.DEBUG_REWRITTEN_TOKEN_STREAM:void 0)&&(process.env.DEBUG_TOKEN_STREAM&&console.log(\"Rewritten token stream:\"),console.log(function(){var k,len,ref2,results;for(ref2=this.tokens,results=[],(k=0,len=ref2.length);k<len;k++)t=ref2[k],results.push(t[0]+\"/\"+t[1]+(t.comments?\"*\":\"\"));return results}.call(this).join(\" \"))),this.tokens}},{key:\"scanTokens\",value:function scanTokens(block){var i,token,tokens;for(tokens=this.tokens,i=0;token=tokens[i];)i+=block.call(this,token,i,tokens);return!0}},{key:\"detectEnd\",value:function detectEnd(i,condition,action){var opts=3<arguments.length&&void 0!==arguments[3]?arguments[3]:{},levels,ref,ref1,token,tokens;for(tokens=this.tokens,levels=0;token=tokens[i];){if(0===levels&&condition.call(this,token,i))return action.call(this,token,i);if((ref=token[0],0<=indexOf.call(EXPRESSION_START,ref))?levels+=1:(ref1=token[0],0<=indexOf.call(EXPRESSION_END,ref1))&&(levels-=1),0>levels)return opts.returnOnNegativeLevel?void 0:action.call(this,token,i);i+=1}return i-1}},{key:\"removeLeadingNewlines\",value:function removeLeadingNewlines(){var i,k,l,leadingNewlineToken,len,len1,ref,ref1,tag;for(ref=this.tokens,i=k=0,len=ref.length;k<len;i=++k){var _ref$i=_slicedToArray(ref[i],1);if(tag=_ref$i[0],\"TERMINATOR\"!==tag)break}if(0!==i){for(ref1=this.tokens.slice(0,i),l=0,len1=ref1.length;l<len1;l++)leadingNewlineToken=ref1[l],moveComments(leadingNewlineToken,this.tokens[i]);return this.tokens.splice(0,i)}}},{key:\"closeOpenCalls\",value:function closeOpenCalls(){var action,condition;return condition=function(token){var ref;return\")\"===(ref=token[0])||\"CALL_END\"===ref},action=function(token){return token[0]=\"CALL_END\"},this.scanTokens(function(token,i){return\"CALL_START\"===token[0]&&this.detectEnd(i+1,condition,action),1})}},{key:\"closeOpenIndexes\",value:function closeOpenIndexes(){var action,condition,startToken;return startToken=null,condition=function(token){var ref;return\"]\"===(ref=token[0])||\"INDEX_END\"===ref},action=function(token,i){return this.tokens.length>=i&&\":\"===this.tokens[i+1][0]?(startToken[0]=\"[\",token[0]=\"]\"):token[0]=\"INDEX_END\"},this.scanTokens(function(token,i){return\"INDEX_START\"===token[0]&&(startToken=token,this.detectEnd(i+1,condition,action)),1})}},{key:\"indexOfTag\",value:function indexOfTag(i){var fuzz,j,k,ref,ref1;fuzz=0;for(var _len=arguments.length,pattern=Array(1<_len?_len-1:0),_key=1;_key<_len;_key++)pattern[_key-1]=arguments[_key];for(j=k=0,ref=pattern.length;0<=ref?k<ref:k>ref;j=0<=ref?++k:--k)if(null!=pattern[j]&&(\"string\"==typeof pattern[j]&&(pattern[j]=[pattern[j]]),ref1=this.tag(i+j+fuzz),0>indexOf.call(pattern[j],ref1)))return-1;return i+j+fuzz-1}},{key:\"looksObjectish\",value:function looksObjectish(j){var end,index;return-1!==this.indexOfTag(j,\"@\",null,\":\")||-1!==this.indexOfTag(j,null,\":\")||(index=this.indexOfTag(j,EXPRESSION_START),!!(-1!==index&&(end=null,this.detectEnd(index+1,function(token){var ref;return ref=token[0],0<=indexOf.call(EXPRESSION_END,ref)},function(token,i){return end=i}),\":\"===this.tag(end+1))))}},{key:\"findTagsBackwards\",value:function findTagsBackwards(i,tags){var backStack,ref,ref1,ref2,ref3,ref4,ref5;for(backStack=[];0<=i&&(backStack.length||(ref2=this.tag(i),0>indexOf.call(tags,ref2))&&((ref3=this.tag(i),0>indexOf.call(EXPRESSION_START,ref3))||this.tokens[i].generated)&&(ref4=this.tag(i),0>indexOf.call(LINEBREAKS,ref4)));)(ref=this.tag(i),0<=indexOf.call(EXPRESSION_END,ref))&&backStack.push(this.tag(i)),(ref1=this.tag(i),0<=indexOf.call(EXPRESSION_START,ref1))&&backStack.length&&backStack.pop(),i-=1;return ref5=this.tag(i),0<=indexOf.call(tags,ref5)}},{key:\"addImplicitBracesAndParens\",value:function addImplicitBracesAndParens(){var stack,start;return stack=[],start=null,this.scanTokens(function(token,i,tokens){var _this=this,_token=_slicedToArray(token,1),endImplicitCall,endImplicitObject,forward,implicitObjectContinues,implicitObjectIndent,inControlFlow,inImplicit,inImplicitCall,inImplicitControl,inImplicitObject,isImplicit,isImplicitCall,isImplicitObject,k,newLine,nextTag,nextToken,offset,preContinuationLineIndent,preObjectToken,prevTag,prevToken,ref,ref1,ref2,ref3,ref4,ref5,s,sameLine,stackIdx,stackItem,stackNext,stackTag,stackTop,startIdx,startImplicitCall,startImplicitObject,startIndex,startTag,startsLine,tag;tag=_token[0];var _prevToken=prevToken=0<i?tokens[i-1]:[],_prevToken2=_slicedToArray(_prevToken,1);prevTag=_prevToken2[0];var _nextToken=nextToken=i<tokens.length-1?tokens[i+1]:[],_nextToken2=_slicedToArray(_nextToken,1);if(nextTag=_nextToken2[0],stackTop=function(){return stack[stack.length-1]},startIdx=i,forward=function(n){return i-startIdx+n},isImplicit=function(stackItem){var ref;return null==stackItem||null==(ref=stackItem[2])?void 0:ref.ours},isImplicitObject=function(stackItem){return isImplicit(stackItem)&&\"{\"===(null==stackItem?void 0:stackItem[0])},isImplicitCall=function(stackItem){return isImplicit(stackItem)&&\"(\"===(null==stackItem?void 0:stackItem[0])},inImplicit=function(){return isImplicit(stackTop())},inImplicitCall=function(){return isImplicitCall(stackTop())},inImplicitObject=function(){return isImplicitObject(stackTop())},inImplicitControl=function(){var ref;return inImplicit()&&\"CONTROL\"===(null==(ref=stackTop())?void 0:ref[0])},startImplicitCall=function(idx){return stack.push([\"(\",idx,{ours:!0}]),tokens.splice(idx,0,generate(\"CALL_START\",\"(\",[\"\",\"implicit function call\",token[2]],prevToken))},endImplicitCall=function(){return stack.pop(),tokens.splice(i,0,generate(\"CALL_END\",\")\",[\"\",\"end of input\",token[2]],prevToken)),i+=1},startImplicitObject=function(idx){var _ref3=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref3$startsLine=_ref3.startsLine,continuationLineIndent=_ref3.continuationLineIndent,val;return stack.push([\"{\",idx,{sameLine:!0,startsLine:void 0===_ref3$startsLine||_ref3$startsLine,ours:!0,continuationLineIndent:continuationLineIndent}]),val=new String(\"{\"),val.generated=!0,tokens.splice(idx,0,generate(\"{\",val,token,prevToken))},endImplicitObject=function(j){return j=null==j?i:j,stack.pop(),tokens.splice(j,0,generate(\"}\",\"}\",token,prevToken)),i+=1},implicitObjectContinues=function(j){var nextTerminatorIdx;return nextTerminatorIdx=null,_this.detectEnd(j,function(token){return\"TERMINATOR\"===token[0]},function(token,i){return nextTerminatorIdx=i},{returnOnNegativeLevel:!0}),null!=nextTerminatorIdx&&_this.looksObjectish(nextTerminatorIdx+1)},(inImplicitCall()||inImplicitObject())&&0<=indexOf.call(CONTROL_IN_IMPLICIT,tag)||inImplicitObject()&&\":\"===prevTag&&\"FOR\"===tag)return stack.push([\"CONTROL\",i,{ours:!0}]),forward(1);if(\"INDENT\"===tag&&inImplicit()){if(\"=>\"!==prevTag&&\"->\"!==prevTag&&\"[\"!==prevTag&&\"(\"!==prevTag&&\",\"!==prevTag&&\"{\"!==prevTag&&\"ELSE\"!==prevTag&&\"=\"!==prevTag)for(;inImplicitCall()||inImplicitObject()&&\":\"!==prevTag;)inImplicitCall()?endImplicitCall():endImplicitObject();return inImplicitControl()&&stack.pop(),stack.push([tag,i]),forward(1)}if(0<=indexOf.call(EXPRESSION_START,tag))return stack.push([tag,i]),forward(1);if(0<=indexOf.call(EXPRESSION_END,tag)){for(;inImplicit();)inImplicitCall()?endImplicitCall():inImplicitObject()?endImplicitObject():stack.pop();start=stack.pop()}if(inControlFlow=function(){var controlFlow,isFunc,seenFor,tagCurrentLine;return(seenFor=_this.findTagsBackwards(i,[\"FOR\"])&&_this.findTagsBackwards(i,[\"FORIN\",\"FOROF\",\"FORFROM\"]),controlFlow=seenFor||_this.findTagsBackwards(i,[\"WHILE\",\"UNTIL\",\"LOOP\",\"LEADING_WHEN\"]),!!controlFlow)&&(isFunc=!1,tagCurrentLine=token[2].first_line,_this.detectEnd(i,function(token){var ref;return ref=token[0],0<=indexOf.call(LINEBREAKS,ref)},function(token,i){var _ref4=tokens[i-1]||[],_ref5=_slicedToArray(_ref4,3),first_line;return prevTag=_ref5[0],first_line=_ref5[2].first_line,isFunc=tagCurrentLine===first_line&&(\"->\"===prevTag||\"=>\"===prevTag)},{returnOnNegativeLevel:!0}),isFunc)},(0<=indexOf.call(IMPLICIT_FUNC,tag)&&token.spaced||\"?\"===tag&&0<i&&!tokens[i-1].spaced)&&(0<=indexOf.call(IMPLICIT_CALL,nextTag)||\"...\"===nextTag&&(ref=this.tag(i+2),0<=indexOf.call(IMPLICIT_CALL,ref))&&!this.findTagsBackwards(i,[\"INDEX_START\",\"[\"])||0<=indexOf.call(IMPLICIT_UNSPACED_CALL,nextTag)&&!nextToken.spaced&&!nextToken.newLine)&&!inControlFlow())return\"?\"===tag&&(tag=token[0]=\"FUNC_EXIST\"),startImplicitCall(i+1),forward(2);if(0<=indexOf.call(IMPLICIT_FUNC,tag)&&-1<this.indexOfTag(i+1,\"INDENT\")&&this.looksObjectish(i+2)&&!this.findTagsBackwards(i,[\"CLASS\",\"EXTENDS\",\"IF\",\"CATCH\",\"SWITCH\",\"LEADING_WHEN\",\"FOR\",\"WHILE\",\"UNTIL\"])&&(\"{\"!==(ref1=s=null==(ref2=stackTop())?void 0:ref2[0])&&\"[\"!==ref1||isImplicit(stackTop())||!this.findTagsBackwards(i,s)))return startImplicitCall(i+1),stack.push([\"INDENT\",i+2]),forward(3);if(\":\"===tag){if(s=function(){var ref3;switch(!1){case(ref3=this.tag(i-1),0>indexOf.call(EXPRESSION_END,ref3)):var _start=start,_start2=_slicedToArray(_start,2);return startTag=_start2[0],startIndex=_start2[1],\"[\"===startTag&&0<startIndex&&\"@\"===this.tag(startIndex-1)&&!tokens[startIndex-1].spaced?startIndex-1:startIndex;break;case\"@\"!==this.tag(i-2):return i-2;default:return i-1;}}.call(this),startsLine=0>=s||(ref3=this.tag(s-1),0<=indexOf.call(LINEBREAKS,ref3))||tokens[s-1].newLine,stackTop()){var _stackTop=stackTop(),_stackTop2=_slicedToArray(_stackTop,2);if(stackTag=_stackTop2[0],stackIdx=_stackTop2[1],stackNext=stack[stack.length-2],(\"{\"===stackTag||\"INDENT\"===stackTag&&\"{\"===(null==stackNext?void 0:stackNext[0])&&!isImplicit(stackNext)&&this.findTagsBackwards(stackIdx-1,[\"{\"]))&&(startsLine||\",\"===this.tag(s-1)||\"{\"===this.tag(s-1))&&(ref4=this.tag(s-1),0>indexOf.call(UNFINISHED,ref4)))return forward(1)}return preObjectToken=1<i?tokens[i-2]:[],startImplicitObject(s,{startsLine:!!startsLine,continuationLineIndent:preObjectToken.continuationLineIndent}),forward(2)}if(0<=indexOf.call(LINEBREAKS,tag))for(k=stack.length-1;0<=k&&(stackItem=stack[k],!!isImplicit(stackItem));k+=-1)isImplicitObject(stackItem)&&(stackItem[2].sameLine=!1);if(\"TERMINATOR\"===tag&&token.endsContinuationLineIndentation)for(preContinuationLineIndent=token.endsContinuationLineIndentation.preContinuationLineIndent;inImplicitObject()&&null!=(implicitObjectIndent=stackTop()[2].continuationLineIndent)&&implicitObjectIndent>preContinuationLineIndent;)endImplicitObject();if(newLine=\"OUTDENT\"===prevTag||prevToken.newLine,0<=indexOf.call(IMPLICIT_END,tag)||0<=indexOf.call(CALL_CLOSERS,tag)&&newLine||(\"..\"===tag||\"...\"===tag)&&this.findTagsBackwards(i,[\"INDEX_START\"]))for(;inImplicit();){var _stackTop3=stackTop(),_stackTop4=_slicedToArray(_stackTop3,3);stackTag=_stackTop4[0],stackIdx=_stackTop4[1];var _stackTop4$=_stackTop4[2];if(sameLine=_stackTop4$.sameLine,startsLine=_stackTop4$.startsLine,inImplicitCall()&&\",\"!==prevTag||\",\"===prevTag&&\"TERMINATOR\"===tag&&null==nextTag)endImplicitCall();else if(inImplicitObject()&&sameLine&&\"TERMINATOR\"!==tag&&\":\"!==prevTag&&!((\"POST_IF\"===tag||\"FOR\"===tag||\"WHILE\"===tag||\"UNTIL\"===tag)&&startsLine&&implicitObjectContinues(i+1)))endImplicitObject();else if(inImplicitObject()&&\"TERMINATOR\"===tag&&\",\"!==prevTag&&!(startsLine&&this.looksObjectish(i+1)))endImplicitObject();else if(inImplicitControl()&&\"CLASS\"===tokens[stackTop()[1]][0]&&\"TERMINATOR\"===tag)stack.pop();else break}if(\",\"===tag&&!this.looksObjectish(i+1)&&inImplicitObject()&&\"FOROF\"!==(ref5=this.tag(i+2))&&\"FORIN\"!==ref5&&(\"TERMINATOR\"!==nextTag||!this.looksObjectish(i+2)))for(offset=\"OUTDENT\"===nextTag?1:0;inImplicitObject();)endImplicitObject(i+offset);return forward(1)})}},{key:\"enforceValidJSXAttributes\",value:function enforceValidJSXAttributes(){return this.scanTokens(function(token,i,tokens){var next,ref;return token.jsxColon&&(next=tokens[i+1],\"STRING_START\"!==(ref=next[0])&&\"STRING\"!==ref&&\"(\"!==ref&&throwSyntaxError(\"expected wrapped or quoted JSX attribute\",next[2])),1})}},{key:\"rescueStowawayComments\",value:function rescueStowawayComments(){var dontShiftForward,insertPlaceholder,shiftCommentsBackward,shiftCommentsForward;return insertPlaceholder=function(token,j,tokens,method){return\"TERMINATOR\"!==tokens[j][0]&&tokens[method](generate(\"TERMINATOR\",\"\\n\",tokens[j])),tokens[method](generate(\"JS\",\"\",tokens[j],token))},dontShiftForward=function(i,tokens){var j,ref;for(j=i+1;j!==tokens.length&&(ref=tokens[j][0],0<=indexOf.call(DISCARDED,ref));){if(\"INTERPOLATION_END\"===tokens[j][0])return!0;j++}return!1},shiftCommentsForward=function(token,i,tokens){var comment,j,k,len,ref,ref1,ref2;for(j=i;j!==tokens.length&&(ref=tokens[j][0],0<=indexOf.call(DISCARDED,ref));)j++;if(!(j===tokens.length||(ref1=tokens[j][0],0<=indexOf.call(DISCARDED,ref1)))){for(ref2=token.comments,k=0,len=ref2.length;k<len;k++)comment=ref2[k],comment.unshift=!0;return moveComments(token,tokens[j]),1}return j=tokens.length-1,insertPlaceholder(token,j,tokens,\"push\"),1},shiftCommentsBackward=function(token,i,tokens){var j,ref,ref1;for(j=i;-1!==j&&(ref=tokens[j][0],0<=indexOf.call(DISCARDED,ref));)j--;return-1===j||(ref1=tokens[j][0],0<=indexOf.call(DISCARDED,ref1))?(insertPlaceholder(token,0,tokens,\"unshift\"),3):(moveComments(token,tokens[j]),1)},this.scanTokens(function(token,i,tokens){var dummyToken,j,ref,ref1,ret;if(!token.comments)return 1;if(ret=1,ref=token[0],0<=indexOf.call(DISCARDED,ref)){for(dummyToken={comments:[]},j=token.comments.length-1;-1!==j;)!1===token.comments[j].newLine&&!1===token.comments[j].here&&(dummyToken.comments.unshift(token.comments[j]),token.comments.splice(j,1)),j--;0!==dummyToken.comments.length&&(ret=shiftCommentsBackward(dummyToken,i-1,tokens)),0!==token.comments.length&&shiftCommentsForward(token,i,tokens)}else if(!dontShiftForward(i,tokens)){for(dummyToken={comments:[]},j=token.comments.length-1;-1!==j;)!token.comments[j].newLine||token.comments[j].unshift||\"JS\"===token[0]&&token.generated||(dummyToken.comments.unshift(token.comments[j]),token.comments.splice(j,1)),j--;0!==dummyToken.comments.length&&(ret=shiftCommentsForward(dummyToken,i+1,tokens))}return 0===(null==(ref1=token.comments)?void 0:ref1.length)&&delete token.comments,ret})}},{key:\"addLocationDataToGeneratedTokens\",value:function addLocationDataToGeneratedTokens(){return this.scanTokens(function(token,i,tokens){var column,line,nextLocation,prevLocation,rangeIndex,ref,ref1;if(token[2])return 1;if(!(token.generated||token.explicit))return 1;if(token.fromThen&&\"INDENT\"===token[0])return token[2]=token.origin[2],1;if(\"{\"===token[0]&&(nextLocation=null==(ref=tokens[i+1])?void 0:ref[2])){var _nextLocation=nextLocation;line=_nextLocation.first_line,column=_nextLocation.first_column;var _nextLocation$range=_slicedToArray(_nextLocation.range,1);rangeIndex=_nextLocation$range[0]}else if(prevLocation=null==(ref1=tokens[i-1])?void 0:ref1[2]){var _prevLocation=prevLocation;line=_prevLocation.last_line,column=_prevLocation.last_column;var _prevLocation$range=_slicedToArray(_prevLocation.range,2);rangeIndex=_prevLocation$range[1],column+=1}else line=column=0,rangeIndex=0;return token[2]={first_line:line,first_column:column,last_line:line,last_column:column,last_line_exclusive:line,last_column_exclusive:column,range:[rangeIndex,rangeIndex]},1})}},{key:\"fixIndentationLocationData\",value:function fixIndentationLocationData(){var _this2=this,findPrecedingComment;return null==this.allComments&&(this.allComments=extractAllCommentTokens(this.tokens)),findPrecedingComment=function(token,_ref6){var afterPosition=_ref6.afterPosition,indentSize=_ref6.indentSize,first=_ref6.first,indented=_ref6.indented,comment,k,l,lastMatching,matches,ref,ref1,tokenStart;if(tokenStart=token[2].range[0],matches=function(comment){return(!comment.outdented||null!=indentSize&&comment.indentSize>indentSize)&&(!indented||comment.indented)&&!!(comment.locationData.range[0]<tokenStart)&&!!(comment.locationData.range[0]>afterPosition)},first){for(lastMatching=null,ref=_this2.allComments,k=ref.length-1;0<=k;k+=-1)if(comment=ref[k],matches(comment))lastMatching=comment;else if(lastMatching)return lastMatching;return lastMatching}for(ref1=_this2.allComments,l=ref1.length-1;0<=l;l+=-1)if(comment=ref1[l],matches(comment))return comment;return null},this.scanTokens(function(token,i,tokens){var isIndent,nextToken,nextTokenIndex,precedingComment,prevLocationData,prevToken,ref,ref1,ref2,useNextToken;if(\"INDENT\"!==(ref=token[0])&&\"OUTDENT\"!==ref&&(!token.generated||\"CALL_END\"!==token[0]||null!=(ref1=token.data)&&ref1.closingTagNameToken)&&(!token.generated||\"}\"!==token[0]))return 1;if(isIndent=\"INDENT\"===token[0],prevToken=null==(ref2=token.prevToken)?tokens[i-1]:ref2,prevLocationData=prevToken[2],useNextToken=token.explicit||token.generated,useNextToken)for(nextToken=token,nextTokenIndex=i;(nextToken.explicit||nextToken.generated)&&nextTokenIndex!==tokens.length-1;)nextToken=tokens[nextTokenIndex++];return(precedingComment=findPrecedingComment(useNextToken?nextToken:token,{afterPosition:prevLocationData.range[0],indentSize:token.indentSize,first:isIndent,indented:useNextToken}),isIndent&&(null==precedingComment||!precedingComment.newLine))?1:token.generated&&\"CALL_END\"===token[0]&&(null==precedingComment?void 0:precedingComment.indented)?1:(null!=precedingComment&&(prevLocationData=precedingComment.locationData),token[2]={first_line:null==precedingComment?prevLocationData.last_line:prevLocationData.first_line,first_column:null==precedingComment?prevLocationData.last_column:isIndent?0:prevLocationData.first_column,last_line:prevLocationData.last_line,last_column:prevLocationData.last_column,last_line_exclusive:prevLocationData.last_line_exclusive,last_column_exclusive:prevLocationData.last_column_exclusive,range:isIndent&&null!=precedingComment?[prevLocationData.range[0]-precedingComment.indentSize,prevLocationData.range[1]]:prevLocationData.range},1)})}},{key:\"normalizeLines\",value:function normalizeLines(){var _this3=this,action,closeElseTag,condition,ifThens,indent,leading_if_then,leading_switch_when,outdent,starter;return starter=indent=outdent=null,leading_switch_when=null,leading_if_then=null,ifThens=[],condition=function(token,i){var ref,ref1,ref2,ref3;return\";\"!==token[1]&&(ref=token[0],0<=indexOf.call(SINGLE_CLOSERS,ref))&&!(\"TERMINATOR\"===token[0]&&(ref1=this.tag(i+1),0<=indexOf.call(EXPRESSION_CLOSE,ref1)))&&!(\"ELSE\"===token[0]&&(\"THEN\"!==starter||leading_if_then||leading_switch_when))&&(\"CATCH\"!==(ref2=token[0])&&\"FINALLY\"!==ref2||\"->\"!==starter&&\"=>\"!==starter)||(ref3=token[0],0<=indexOf.call(CALL_CLOSERS,ref3))&&(this.tokens[i-1].newLine||\"OUTDENT\"===this.tokens[i-1][0])},action=function(token,i){return\"ELSE\"===token[0]&&\"THEN\"===starter&&ifThens.pop(),this.tokens.splice(\",\"===this.tag(i-1)?i-1:i,0,outdent)},closeElseTag=function(tokens,i){var lastThen,outdentElse,tlen;if(tlen=ifThens.length,!(0<tlen))return i;lastThen=ifThens.pop();var _this3$indentation=_this3.indentation(tokens[lastThen]),_this3$indentation2=_slicedToArray(_this3$indentation,2);return outdentElse=_this3$indentation2[1],outdentElse[1]=2*tlen,tokens.splice(i,0,outdentElse),outdentElse[1]=2,tokens.splice(i+1,0,outdentElse),_this3.detectEnd(i+2,function(token){var ref;return\"OUTDENT\"===(ref=token[0])||\"TERMINATOR\"===ref},function(token,i){if(\"OUTDENT\"===this.tag(i)&&\"OUTDENT\"===this.tag(i+1))return tokens.splice(i,2)}),i+2},this.scanTokens(function(token,i,tokens){var _token2=_slicedToArray(token,1),conditionTag,j,k,ref,ref1,ref2,tag;if(tag=_token2[0],conditionTag=(\"->\"===tag||\"=>\"===tag)&&this.findTagsBackwards(i,[\"IF\",\"WHILE\",\"FOR\",\"UNTIL\",\"SWITCH\",\"WHEN\",\"LEADING_WHEN\",\"[\",\"INDEX_START\"])&&!this.findTagsBackwards(i,[\"THEN\",\"..\",\"...\"]),\"TERMINATOR\"===tag){if(\"ELSE\"===this.tag(i+1)&&\"OUTDENT\"!==this.tag(i-1))return tokens.splice.apply(tokens,[i,1].concat(_toConsumableArray(this.indentation()))),1;if(ref=this.tag(i+1),0<=indexOf.call(EXPRESSION_CLOSE,ref))return\";\"===token[1]&&\"OUTDENT\"===this.tag(i+1)&&(tokens[i+1].prevToken=token,moveComments(token,tokens[i+1])),tokens.splice(i,1),0}if(\"CATCH\"===tag)for(j=k=1;2>=k;j=++k)if(\"OUTDENT\"===(ref1=this.tag(i+j))||\"TERMINATOR\"===ref1||\"FINALLY\"===ref1)return tokens.splice.apply(tokens,[i+j,0].concat(_toConsumableArray(this.indentation()))),2+j;if((\"->\"===tag||\"=>\"===tag)&&(\",\"===(ref2=this.tag(i+1))||\"]\"===ref2||\".\"===this.tag(i+1)&&token.newLine)){var _this$indentation=this.indentation(tokens[i]),_this$indentation2=_slicedToArray(_this$indentation,2);return indent=_this$indentation2[0],outdent=_this$indentation2[1],tokens.splice(i+1,0,indent,outdent),1}if(0<=indexOf.call(SINGLE_LINERS,tag)&&\"INDENT\"!==this.tag(i+1)&&(\"ELSE\"!==tag||\"IF\"!==this.tag(i+1))&&!conditionTag){starter=tag;var _this$indentation3=this.indentation(tokens[i]),_this$indentation4=_slicedToArray(_this$indentation3,2);return indent=_this$indentation4[0],outdent=_this$indentation4[1],\"THEN\"===starter&&(indent.fromThen=!0),\"THEN\"===tag&&(leading_switch_when=this.findTagsBackwards(i,[\"LEADING_WHEN\"])&&\"IF\"===this.tag(i+1),leading_if_then=this.findTagsBackwards(i,[\"IF\"])&&\"IF\"===this.tag(i+1)),\"THEN\"===tag&&this.findTagsBackwards(i,[\"IF\"])&&ifThens.push(i),\"ELSE\"===tag&&\"OUTDENT\"!==this.tag(i-1)&&(i=closeElseTag(tokens,i)),tokens.splice(i+1,0,indent),this.detectEnd(i+2,condition,action),\"THEN\"===tag&&tokens.splice(i,1),1}return 1})}},{key:\"tagPostfixConditionals\",value:function tagPostfixConditionals(){var action,condition,original;return original=null,condition=function(token,i){var _token3=_slicedToArray(token,1),prevTag,tag;tag=_token3[0];var _this$tokens=_slicedToArray(this.tokens[i-1],1);return prevTag=_this$tokens[0],\"TERMINATOR\"===tag||\"INDENT\"===tag&&0>indexOf.call(SINGLE_LINERS,prevTag)},action=function(token){if(\"INDENT\"!==token[0]||token.generated&&!token.fromThen)return original[0]=\"POST_\"+original[0]},this.scanTokens(function(token,i){return\"IF\"===token[0]?(original=token,this.detectEnd(i+1,condition,action),1):1})}},{key:\"exposeTokenDataToGrammar\",value:function exposeTokenDataToGrammar(){return this.scanTokens(function(token){var key,ref,ref1,val;if(token.generated||token.data&&0!==Object.keys(token.data).length){for(key in token[1]=new String(token[1]),ref1=null==(ref=token.data)?{}:ref,ref1)hasProp.call(ref1,key)&&(val=ref1[key],token[1][key]=val);token.generated&&(token[1].generated=!0)}return 1})}},{key:\"indentation\",value:function indentation(origin){var indent,outdent;return indent=[\"INDENT\",2],outdent=[\"OUTDENT\",2],origin?(indent.generated=outdent.generated=!0,indent.origin=outdent.origin=origin):indent.explicit=outdent.explicit=!0,[indent,outdent]}},{key:\"tag\",value:function tag(i){var ref;return null==(ref=this.tokens[i])?void 0:ref[0]}}]),Rewriter}();return Rewriter.prototype.generate=generate,Rewriter}.call(this),BALANCED_PAIRS=[[\"(\",\")\"],[\"[\",\"]\"],[\"{\",\"}\"],[\"INDENT\",\"OUTDENT\"],[\"CALL_START\",\"CALL_END\"],[\"PARAM_START\",\"PARAM_END\"],[\"INDEX_START\",\"INDEX_END\"],[\"STRING_START\",\"STRING_END\"],[\"INTERPOLATION_START\",\"INTERPOLATION_END\"],[\"REGEX_START\",\"REGEX_END\"]],exports.INVERSES=INVERSES={},EXPRESSION_START=[],EXPRESSION_END=[],(k=0,len=BALANCED_PAIRS.length);k<len;k++){var _BALANCED_PAIRS$k=_slicedToArray(BALANCED_PAIRS[k],2);left=_BALANCED_PAIRS$k[0],right=_BALANCED_PAIRS$k[1],EXPRESSION_START.push(INVERSES[right]=left),EXPRESSION_END.push(INVERSES[left]=right)}EXPRESSION_CLOSE=[\"CATCH\",\"THEN\",\"ELSE\",\"FINALLY\"].concat(EXPRESSION_END),IMPLICIT_FUNC=[\"IDENTIFIER\",\"PROPERTY\",\"SUPER\",\")\",\"CALL_END\",\"]\",\"INDEX_END\",\"@\",\"THIS\"],IMPLICIT_CALL=[\"IDENTIFIER\",\"JSX_TAG\",\"PROPERTY\",\"NUMBER\",\"INFINITY\",\"NAN\",\"STRING\",\"STRING_START\",\"REGEX\",\"REGEX_START\",\"JS\",\"NEW\",\"PARAM_START\",\"CLASS\",\"IF\",\"TRY\",\"SWITCH\",\"THIS\",\"DYNAMIC_IMPORT\",\"IMPORT_META\",\"NEW_TARGET\",\"UNDEFINED\",\"NULL\",\"BOOL\",\"UNARY\",\"DO\",\"DO_IIFE\",\"YIELD\",\"AWAIT\",\"UNARY_MATH\",\"SUPER\",\"THROW\",\"@\",\"->\",\"=>\",\"[\",\"(\",\"{\",\"--\",\"++\"],IMPLICIT_UNSPACED_CALL=[\"+\",\"-\"],IMPLICIT_END=[\"POST_IF\",\"FOR\",\"WHILE\",\"UNTIL\",\"WHEN\",\"BY\",\"LOOP\",\"TERMINATOR\"],SINGLE_LINERS=[\"ELSE\",\"->\",\"=>\",\"TRY\",\"FINALLY\",\"THEN\"],SINGLE_CLOSERS=[\"TERMINATOR\",\"CATCH\",\"FINALLY\",\"ELSE\",\"OUTDENT\",\"LEADING_WHEN\"],LINEBREAKS=[\"TERMINATOR\",\"INDENT\",\"OUTDENT\"],CALL_CLOSERS=[\".\",\"?.\",\"::\",\"?::\"],CONTROL_IN_IMPLICIT=[\"IF\",\"TRY\",\"FINALLY\",\"CATCH\",\"CLASS\",\"SWITCH\"],DISCARDED=[\"(\",\")\",\"[\",\"]\",\"{\",\"}\",\":\",\".\",\"..\",\"...\",\",\",\"=\",\"++\",\"--\",\"?\",\"AS\",\"AWAIT\",\"CALL_START\",\"CALL_END\",\"DEFAULT\",\"DO\",\"DO_IIFE\",\"ELSE\",\"EXTENDS\",\"EXPORT\",\"FORIN\",\"FOROF\",\"FORFROM\",\"IMPORT\",\"INDENT\",\"INDEX_SOAK\",\"INTERPOLATION_START\",\"INTERPOLATION_END\",\"LEADING_WHEN\",\"OUTDENT\",\"PARAM_END\",\"REGEX_START\",\"REGEX_END\",\"RETURN\",\"STRING_END\",\"THROW\",\"UNARY\",\"YIELD\"].concat(IMPLICIT_UNSPACED_CALL.concat(IMPLICIT_END.concat(CALL_CLOSERS.concat(CONTROL_IN_IMPLICIT)))),exports.UNFINISHED=UNFINISHED=[\"\\\\\",\".\",\"?.\",\"?::\",\"UNARY\",\"DO\",\"DO_IIFE\",\"MATH\",\"UNARY_MATH\",\"+\",\"-\",\"**\",\"SHIFT\",\"RELATION\",\"COMPARE\",\"&\",\"^\",\"|\",\"&&\",\"||\",\"BIN?\",\"EXTENDS\"]}.call(this),{exports:exports}.exports}(),require[\"./lexer\"]=function(){var exports={};return function(){var indexOf=[].indexOf,slice=[].slice,_require2=require(\"./rewriter\"),BOM,BOOL,CALLABLE,CODE,COFFEE_ALIASES,COFFEE_ALIAS_MAP,COFFEE_KEYWORDS,COMMENT,COMPARABLE_LEFT_SIDE,COMPARE,COMPOUND_ASSIGN,HERECOMMENT_ILLEGAL,HEREDOC_DOUBLE,HEREDOC_INDENT,HEREDOC_SINGLE,HEREGEX,HEREGEX_COMMENT,HERE_JSTOKEN,IDENTIFIER,INDENTABLE_CLOSERS,INDEXABLE,INSIDE_JSX,INVERSES,JSTOKEN,JSX_ATTRIBUTE,JSX_FRAGMENT_IDENTIFIER,JSX_IDENTIFIER,JSX_IDENTIFIER_PART,JSX_INTERPOLATION,JS_KEYWORDS,LINE_BREAK,LINE_CONTINUER,Lexer,MATH,MULTI_DENT,NOT_REGEX,NUMBER,OPERATOR,POSSIBLY_DIVISION,REGEX,REGEX_FLAGS,REGEX_ILLEGAL,REGEX_INVALID_ESCAPE,RELATION,RESERVED,Rewriter,SHIFT,STRICT_PROSCRIBED,STRING_DOUBLE,STRING_INVALID_ESCAPE,STRING_SINGLE,STRING_START,TRAILING_SPACES,UNARY,UNARY_MATH,UNFINISHED,VALID_FLAGS,WHITESPACE,addTokenData,attachCommentsToNode,compact,count,flatten,invertLiterate,isForFrom,isUnassignable,key,locationDataToString,merge,parseNumber,repeat,replaceUnicodeCodePointEscapes,starts,throwSyntaxError;Rewriter=_require2.Rewriter,INVERSES=_require2.INVERSES,UNFINISHED=_require2.UNFINISHED;var _require3=require(\"./helpers\");count=_require3.count,starts=_require3.starts,compact=_require3.compact,repeat=_require3.repeat,invertLiterate=_require3.invertLiterate,merge=_require3.merge,attachCommentsToNode=_require3.attachCommentsToNode,locationDataToString=_require3.locationDataToString,throwSyntaxError=_require3.throwSyntaxError,replaceUnicodeCodePointEscapes=_require3.replaceUnicodeCodePointEscapes,flatten=_require3.flatten,parseNumber=_require3.parseNumber,exports.Lexer=Lexer=function(){function Lexer(){_classCallCheck(this,Lexer),this.error=this.error.bind(this)}return _createClass(Lexer,[{key:\"tokenize\",value:function tokenize(code){var opts=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},consumed,end,i,ref;for(this.literate=opts.literate,this.indent=0,this.baseIndent=0,this.continuationLineAdditionalIndent=0,this.outdebt=0,this.indents=[],this.indentLiteral=\"\",this.ends=[],this.tokens=[],this.seenFor=!1,this.seenImport=!1,this.seenExport=!1,this.importSpecifierList=!1,this.exportSpecifierList=!1,this.jsxDepth=0,this.jsxObjAttribute={},this.chunkLine=opts.line||0,this.chunkColumn=opts.column||0,this.chunkOffset=opts.offset||0,this.locationDataCompensations=opts.locationDataCompensations||{},code=this.clean(code),i=0;this.chunk=code.slice(i);){consumed=this.identifierToken()||this.commentToken()||this.whitespaceToken()||this.lineToken()||this.stringToken()||this.numberToken()||this.jsxToken()||this.regexToken()||this.jsToken()||this.literalToken();var _this$getLineAndColum=this.getLineAndColumnFromChunk(consumed),_this$getLineAndColum2=_slicedToArray(_this$getLineAndColum,3);if(this.chunkLine=_this$getLineAndColum2[0],this.chunkColumn=_this$getLineAndColum2[1],this.chunkOffset=_this$getLineAndColum2[2],i+=consumed,opts.untilBalanced&&0===this.ends.length)return{tokens:this.tokens,index:i}}return this.closeIndentation(),(end=this.ends.pop())&&this.error(\"missing \".concat(end.tag),(null==(ref=end.origin)?end:ref)[2]),!1===opts.rewrite?this.tokens:new Rewriter().rewrite(this.tokens)}},{key:\"clean\",value:function clean(code){var _this4=this,base,thusFar;return thusFar=0,code.charCodeAt(0)===BOM&&(code=code.slice(1),this.locationDataCompensations[0]=1,thusFar+=1),WHITESPACE.test(code)&&(code=\"\\n\".concat(code),this.chunkLine--,null==(base=this.locationDataCompensations)[0]&&(base[0]=0),this.locationDataCompensations[0]-=1),code=code.replace(/\\r/g,function(match,offset){return _this4.locationDataCompensations[thusFar+offset]=1,\"\"}).replace(TRAILING_SPACES,\"\"),this.literate&&(code=invertLiterate(code)),code}},{key:\"identifierToken\",value:function identifierToken(){var alias,colon,colonOffset,colonToken,id,idLength,inJSXTag,input,match,poppedToken,prev,prevprev,ref,ref1,ref10,ref11,ref12,ref2,ref3,ref4,ref5,ref6,ref7,ref8,ref9,regExSuper,regex,sup,tag,tagToken,tokenData;if(inJSXTag=this.atJSXTag(),regex=inJSXTag?JSX_ATTRIBUTE:IDENTIFIER,!(match=regex.exec(this.chunk)))return 0;var _match=match,_match2=_slicedToArray(_match,3);if(input=_match2[0],id=_match2[1],colon=_match2[2],idLength=id.length,poppedToken=void 0,\"own\"===id&&\"FOR\"===this.tag())return this.token(\"OWN\",id),id.length;if(\"from\"===id&&\"YIELD\"===this.tag())return this.token(\"FROM\",id),id.length;if(\"as\"===id&&this.seenImport){if(\"*\"===this.value())this.tokens[this.tokens.length-1][0]=\"IMPORT_ALL\";else if(ref=this.value(!0),0<=indexOf.call(COFFEE_KEYWORDS,ref)){prev=this.prev();var _ref7=[\"IDENTIFIER\",this.value(!0)];prev[0]=_ref7[0],prev[1]=_ref7[1]}if(\"DEFAULT\"===(ref1=this.tag())||\"IMPORT_ALL\"===ref1||\"IDENTIFIER\"===ref1)return this.token(\"AS\",id),id.length}if(\"as\"===id&&this.seenExport){if(\"IDENTIFIER\"===(ref2=this.tag())||\"DEFAULT\"===ref2)return this.token(\"AS\",id),id.length;if(ref3=this.value(!0),0<=indexOf.call(COFFEE_KEYWORDS,ref3)){prev=this.prev();var _ref8=[\"IDENTIFIER\",this.value(!0)];return prev[0]=_ref8[0],prev[1]=_ref8[1],this.token(\"AS\",id),id.length}}if(\"default\"===id&&this.seenExport&&(\"EXPORT\"===(ref4=this.tag())||\"AS\"===ref4))return this.token(\"DEFAULT\",id),id.length;if(\"assert\"===id&&(this.seenImport||this.seenExport)&&\"STRING\"===this.tag())return this.token(\"ASSERT\",id),id.length;if(\"do\"===id&&(regExSuper=/^(\\s*super)(?!\\(\\))/.exec(this.chunk.slice(3)))){this.token(\"SUPER\",\"super\"),this.token(\"CALL_START\",\"(\"),this.token(\"CALL_END\",\")\");var _regExSuper=regExSuper,_regExSuper2=_slicedToArray(_regExSuper,2);return input=_regExSuper2[0],sup=_regExSuper2[1],sup.length+3}if(prev=this.prev(),tag=colon||null!=prev&&(\".\"===(ref5=prev[0])||\"?.\"===ref5||\"::\"===ref5||\"?::\"===ref5||!prev.spaced&&\"@\"===prev[0])?\"PROPERTY\":\"IDENTIFIER\",tokenData={},\"IDENTIFIER\"===tag&&(0<=indexOf.call(JS_KEYWORDS,id)||0<=indexOf.call(COFFEE_KEYWORDS,id))&&!(this.exportSpecifierList&&0<=indexOf.call(COFFEE_KEYWORDS,id))?(tag=id.toUpperCase(),\"WHEN\"===tag&&(ref6=this.tag(),0<=indexOf.call(LINE_BREAK,ref6))?tag=\"LEADING_WHEN\":\"FOR\"===tag?this.seenFor={endsLength:this.ends.length}:\"UNLESS\"===tag?tag=\"IF\":\"IMPORT\"===tag?this.seenImport=!0:\"EXPORT\"===tag?this.seenExport=!0:0<=indexOf.call(UNARY,tag)?tag=\"UNARY\":0<=indexOf.call(RELATION,tag)&&(\"INSTANCEOF\"!==tag&&this.seenFor?(tag=\"FOR\"+tag,this.seenFor=!1):(tag=\"RELATION\",\"!\"===this.value()&&(poppedToken=this.tokens.pop(),tokenData.invert=null==(ref7=null==(ref8=poppedToken.data)?void 0:ref8.original)?poppedToken[1]:ref7)))):\"IDENTIFIER\"===tag&&this.seenFor&&\"from\"===id&&isForFrom(prev)?(tag=\"FORFROM\",this.seenFor=!1):\"PROPERTY\"===tag&&prev&&(prev.spaced&&(ref9=prev[0],0<=indexOf.call(CALLABLE,ref9))&&/^[gs]et$/.test(prev[1])&&1<this.tokens.length&&\".\"!==(ref10=this.tokens[this.tokens.length-2][0])&&\"?.\"!==ref10&&\"@\"!==ref10?this.error(\"'\".concat(prev[1],\"' cannot be used as a keyword, or as a function call without parentheses\"),prev[2]):\".\"===prev[0]&&1<this.tokens.length&&\"UNARY\"===(prevprev=this.tokens[this.tokens.length-2])[0]&&\"new\"===prevprev[1]?prevprev[0]=\"NEW_TARGET\":\".\"===prev[0]&&1<this.tokens.length&&\"IMPORT\"===(prevprev=this.tokens[this.tokens.length-2])[0]&&\"import\"===prevprev[1]?(this.seenImport=!1,prevprev[0]=\"IMPORT_META\"):2<this.tokens.length&&(prevprev=this.tokens[this.tokens.length-2],(\"@\"===(ref11=prev[0])||\"THIS\"===ref11)&&prevprev&&prevprev.spaced&&/^[gs]et$/.test(prevprev[1])&&\".\"!==(ref12=this.tokens[this.tokens.length-3][0])&&\"?.\"!==ref12&&\"@\"!==ref12&&this.error(\"'\".concat(prevprev[1],\"' cannot be used as a keyword, or as a function call without parentheses\"),prevprev[2]))),\"IDENTIFIER\"===tag&&0<=indexOf.call(RESERVED,id)&&!inJSXTag&&this.error(\"reserved word '\".concat(id,\"'\"),{length:id.length}),\"PROPERTY\"===tag||this.exportSpecifierList||this.importSpecifierList||(0<=indexOf.call(COFFEE_ALIASES,id)&&(alias=id,id=COFFEE_ALIAS_MAP[id],tokenData.original=alias),tag=function(){return\"!\"===id?\"UNARY\":\"==\"===id||\"!=\"===id?\"COMPARE\":\"true\"===id||\"false\"===id?\"BOOL\":\"break\"===id||\"continue\"===id||\"debugger\"===id?\"STATEMENT\":\"&&\"===id||\"||\"===id?id:tag}()),tagToken=this.token(tag,id,{length:idLength,data:tokenData}),alias&&(tagToken.origin=[tag,alias,tagToken[2]]),poppedToken){var _ref9=[poppedToken[2].first_line,poppedToken[2].first_column,poppedToken[2].range[0]];tagToken[2].first_line=_ref9[0],tagToken[2].first_column=_ref9[1],tagToken[2].range[0]=_ref9[2]}return colon&&(colonOffset=input.lastIndexOf(inJSXTag?\"=\":\":\"),colonToken=this.token(\":\",\":\",{offset:colonOffset}),inJSXTag&&(colonToken.jsxColon=!0)),inJSXTag&&\"IDENTIFIER\"===tag&&\":\"!==prev[0]&&this.token(\",\",\",\",{length:0,origin:tagToken,generated:!0}),input.length}},{key:\"numberToken\",value:function numberToken(){var lexedLength,match,number,parsedValue,tag,tokenData;if(!(match=NUMBER.exec(this.chunk)))return 0;switch(number=match[0],lexedLength=number.length,!1){case!/^0[BOX]/.test(number):this.error(\"radix prefix in '\".concat(number,\"' must be lowercase\"),{offset:1});break;case!/^0\\d*[89]/.test(number):this.error(\"decimal literal '\".concat(number,\"' must not be prefixed with '0'\"),{length:lexedLength});break;case!/^0\\d+/.test(number):this.error(\"octal literal '\".concat(number,\"' must be prefixed with '0o'\"),{length:lexedLength});}return parsedValue=parseNumber(number),tokenData={parsedValue:parsedValue},tag=2e308===parsedValue?\"INFINITY\":\"NUMBER\",\"INFINITY\"===tag&&(tokenData.original=number),this.token(tag,number,{length:lexedLength,data:tokenData}),lexedLength}},{key:\"stringToken\",value:function stringToken(){var _this5=this,_ref10=STRING_START.exec(this.chunk)||[],_ref11=_slicedToArray(_ref10,1),attempt,delimiter,doc,end,heredoc,i,indent,match,prev,quote,ref,regex,token,tokens;if(quote=_ref11[0],!quote)return 0;prev=this.prev(),prev&&\"from\"===this.value()&&(this.seenImport||this.seenExport)&&(prev[0]=\"FROM\"),regex=function(){return\"'\"===quote?STRING_SINGLE:\"\\\"\"===quote?STRING_DOUBLE:\"'''\"===quote?HEREDOC_SINGLE:\"\\\"\\\"\\\"\"===quote?HEREDOC_DOUBLE:void 0}();var _this$matchWithInterp=this.matchWithInterpolations(regex,quote);if(tokens=_this$matchWithInterp.tokens,end=_this$matchWithInterp.index,heredoc=3===quote.length,heredoc)for(indent=null,doc=function(){var j,len,results;for(results=[],i=j=0,len=tokens.length;j<len;i=++j)token=tokens[i],\"NEOSTRING\"===token[0]&&results.push(token[1]);return results}().join(\"#{}\");match=HEREDOC_INDENT.exec(doc);)attempt=match[1],(null===indent||0<(ref=attempt.length)&&ref<indent.length)&&(indent=attempt);return delimiter=quote.charAt(0),this.mergeInterpolationTokens(tokens,{quote:quote,indent:indent,endOffset:end},function(value){return _this5.validateUnicodeCodePointEscapes(value,{delimiter:quote})}),this.atJSXTag()&&this.token(\",\",\",\",{length:0,origin:this.prev,generated:!0}),end}},{key:\"commentToken\",value:function commentToken(){var chunk=0<arguments.length&&void 0!==arguments[0]?arguments[0]:this.chunk,_ref12=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},heregex=_ref12.heregex,_ref12$returnCommentT=_ref12.returnCommentTokens,_ref12$offsetInChunk=_ref12.offsetInChunk,offsetInChunk=void 0===_ref12$offsetInChunk?0:_ref12$offsetInChunk,commentAttachment,commentAttachments,commentWithSurroundingWhitespace,content,contents,getIndentSize,hasSeenFirstCommentLine,hereComment,hereLeadingWhitespace,hereTrailingWhitespace,i,indentSize,leadingNewline,leadingNewlineOffset,leadingNewlines,leadingWhitespace,length,lineComment,match,matchIllegal,noIndent,nonInitial,placeholderToken,precededByBlankLine,precedingNonCommentLines,prev;if(!(match=chunk.match(COMMENT)))return 0;var _match3=match,_match4=_slicedToArray(_match3,5);return commentWithSurroundingWhitespace=_match4[0],hereLeadingWhitespace=_match4[1],hereComment=_match4[2],hereTrailingWhitespace=_match4[3],lineComment=_match4[4],contents=null,leadingNewline=/^\\s*\\n+\\s*#/.test(commentWithSurroundingWhitespace),hereComment?(matchIllegal=HERECOMMENT_ILLEGAL.exec(hereComment),matchIllegal&&this.error(\"block comments cannot contain \".concat(matchIllegal[0]),{offset:\"###\".length+matchIllegal.index,length:matchIllegal[0].length}),chunk=chunk.replace(\"###\".concat(hereComment,\"###\"),\"\"),chunk=chunk.replace(/^\\n+/,\"\"),this.lineToken({chunk:chunk}),content=hereComment,contents=[{content:content,length:commentWithSurroundingWhitespace.length-hereLeadingWhitespace.length-hereTrailingWhitespace.length,leadingWhitespace:hereLeadingWhitespace}]):(leadingNewlines=\"\",content=lineComment.replace(/^(\\n*)/,function(leading){return leadingNewlines=leading,\"\"}),precedingNonCommentLines=\"\",hasSeenFirstCommentLine=!1,contents=content.split(\"\\n\").map(function(line){var comment,leadingWhitespace;return-1<line.indexOf(\"#\")?(leadingWhitespace=\"\",content=line.replace(/^([ |\\t]*)#/,function(_,whitespace){return leadingWhitespace=whitespace,\"\"}),comment={content:content,length:\"#\".length+content.length,leadingWhitespace:\"\".concat(hasSeenFirstCommentLine?\"\":leadingNewlines).concat(precedingNonCommentLines).concat(leadingWhitespace),precededByBlankLine:!!precedingNonCommentLines},hasSeenFirstCommentLine=!0,precedingNonCommentLines=\"\",comment):void(precedingNonCommentLines+=\"\\n\".concat(line))}).filter(function(comment){return comment})),getIndentSize=function(_ref13){var leadingWhitespace=_ref13.leadingWhitespace,nonInitial=_ref13.nonInitial,lastNewlineIndex;if(lastNewlineIndex=leadingWhitespace.lastIndexOf(\"\\n\"),null==hereComment&&nonInitial)null==lastNewlineIndex&&(lastNewlineIndex=-1);else if(!(-1<lastNewlineIndex))return null;return leadingWhitespace.length-1-lastNewlineIndex},commentAttachments=function(){var j,len,results;for(results=[],i=j=0,len=contents.length;j<len;i=++j){var _contents$i=contents[i];content=_contents$i.content,length=_contents$i.length,leadingWhitespace=_contents$i.leadingWhitespace,precededByBlankLine=_contents$i.precededByBlankLine,nonInitial=0!==i,leadingNewlineOffset=nonInitial?1:0,offsetInChunk+=leadingNewlineOffset+leadingWhitespace.length,indentSize=getIndentSize({leadingWhitespace:leadingWhitespace,nonInitial:nonInitial}),noIndent=null==indentSize||-1===indentSize,commentAttachment={content:content,here:null!=hereComment,newLine:leadingNewline||nonInitial,locationData:this.makeLocationData({offsetInChunk:offsetInChunk,length:length}),precededByBlankLine:precededByBlankLine,indentSize:indentSize,indented:!noIndent&&indentSize>this.indent,outdented:!noIndent&&indentSize<this.indent},heregex&&(commentAttachment.heregex=!0),offsetInChunk+=length,results.push(commentAttachment)}return results}.call(this),prev=this.prev(),prev?attachCommentsToNode(commentAttachments,prev):(commentAttachments[0].newLine=!0,this.lineToken({chunk:this.chunk.slice(commentWithSurroundingWhitespace.length),offset:commentWithSurroundingWhitespace.length}),placeholderToken=this.makeToken(\"JS\",\"\",{offset:commentWithSurroundingWhitespace.length,generated:!0}),placeholderToken.comments=commentAttachments,this.tokens.push(placeholderToken),this.newlineToken(commentWithSurroundingWhitespace.length)),void 0!==_ref12$returnCommentT&&_ref12$returnCommentT?commentAttachments:commentWithSurroundingWhitespace.length}},{key:\"jsToken\",value:function jsToken(){var length,match,matchedHere,script;return\"`\"===this.chunk.charAt(0)&&(match=(matchedHere=HERE_JSTOKEN.exec(this.chunk))||JSTOKEN.exec(this.chunk))?(script=match[1],length=match[0].length,this.token(\"JS\",script,{length:length,data:{here:!!matchedHere}}),length):0}},{key:\"regexToken\",value:function regexToken(){var _this6=this,body,closed,comment,commentIndex,commentOpts,commentTokens,comments,delimiter,end,flags,fullMatch,index,leadingWhitespace,match,matchedComment,origin,prev,ref,ref1,regex,tokens;switch(!1){case!(match=REGEX_ILLEGAL.exec(this.chunk)):this.error(\"regular expressions cannot begin with \".concat(match[2]),{offset:match.index+match[1].length});break;case!(match=this.matchWithInterpolations(HEREGEX,\"///\")):var _match5=match;for(tokens=_match5.tokens,index=_match5.index,comments=[];matchedComment=HEREGEX_COMMENT.exec(this.chunk.slice(0,index));){var _matchedComment=matchedComment;commentIndex=_matchedComment.index;var _matchedComment2=matchedComment,_matchedComment3=_slicedToArray(_matchedComment2,3);fullMatch=_matchedComment3[0],leadingWhitespace=_matchedComment3[1],comment=_matchedComment3[2],comments.push({comment:comment,offsetInChunk:commentIndex+leadingWhitespace.length})}commentTokens=flatten(function(){var j,len,results;for(results=[],j=0,len=comments.length;j<len;j++)commentOpts=comments[j],results.push(this.commentToken(commentOpts.comment,Object.assign(commentOpts,{heregex:!0,returnCommentTokens:!0})));return results}.call(this));break;case!(match=REGEX.exec(this.chunk)):var _match6=match,_match7=_slicedToArray(_match6,3);if(regex=_match7[0],body=_match7[1],closed=_match7[2],this.validateEscapes(body,{isRegex:!0,offsetInChunk:1}),index=regex.length,prev=this.prev(),prev)if(prev.spaced&&(ref=prev[0],0<=indexOf.call(CALLABLE,ref))){if(!closed||POSSIBLY_DIVISION.test(regex))return 0;}else if(ref1=prev[0],0<=indexOf.call(NOT_REGEX,ref1))return 0;closed||this.error(\"missing / (unclosed regex)\");break;default:return 0;}var _REGEX_FLAGS$exec=REGEX_FLAGS.exec(this.chunk.slice(index)),_REGEX_FLAGS$exec2=_slicedToArray(_REGEX_FLAGS$exec,1);switch(flags=_REGEX_FLAGS$exec2[0],end=index+flags.length,origin=this.makeToken(\"REGEX\",null,{length:end}),!1){case!!VALID_FLAGS.test(flags):this.error(\"invalid regular expression flags \".concat(flags),{offset:index,length:flags.length});break;case!(regex||1===tokens.length):delimiter=body?\"/\":\"///\",null==body&&(body=tokens[0][1]),this.validateUnicodeCodePointEscapes(body,{delimiter:delimiter}),this.token(\"REGEX\",\"/\".concat(body,\"/\").concat(flags),{length:end,origin:origin,data:{delimiter:delimiter}});break;default:this.token(\"REGEX_START\",\"(\",{length:0,origin:origin,generated:!0}),this.token(\"IDENTIFIER\",\"RegExp\",{length:0,generated:!0}),this.token(\"CALL_START\",\"(\",{length:0,generated:!0}),this.mergeInterpolationTokens(tokens,{double:!0,heregex:{flags:flags},endOffset:end-flags.length,quote:\"///\"},function(str){return _this6.validateUnicodeCodePointEscapes(str,{delimiter:delimiter})}),flags&&(this.token(\",\",\",\",{offset:index-1,length:0,generated:!0}),this.token(\"STRING\",\"\\\"\"+flags+\"\\\"\",{offset:index,length:flags.length})),this.token(\")\",\")\",{offset:end,length:0,generated:!0}),this.token(\"REGEX_END\",\")\",{offset:end,length:0,generated:!0});}return(null==commentTokens?void 0:commentTokens.length)&&addTokenData(this.tokens[this.tokens.length-1],{heregexCommentTokens:commentTokens}),end}},{key:\"lineToken\",value:function lineToken(){var _Mathmin=Math.min,_ref14=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},_ref14$chunk=_ref14.chunk,chunk=void 0===_ref14$chunk?this.chunk:_ref14$chunk,_ref14$offset=_ref14.offset,offset=void 0===_ref14$offset?0:_ref14$offset,backslash,diff,endsContinuationLineIndentation,indent,match,minLiteralLength,newIndentLiteral,noNewlines,prev,ref,size;if(!(match=MULTI_DENT.exec(chunk)))return 0;if(indent=match[0],prev=this.prev(),backslash=\"\\\\\"===(null==prev?void 0:prev[0]),(backslash||(null==(ref=this.seenFor)?void 0:ref.endsLength)<this.ends.length)&&this.seenFor||(this.seenFor=!1),backslash&&this.seenImport||this.importSpecifierList||(this.seenImport=!1),backslash&&this.seenExport||this.exportSpecifierList||(this.seenExport=!1),size=indent.length-1-indent.lastIndexOf(\"\\n\"),noNewlines=this.unfinished(),newIndentLiteral=0<size?indent.slice(-size):\"\",!/^(.?)\\1*$/.exec(newIndentLiteral))return this.error(\"mixed indentation\",{offset:indent.length}),indent.length;if(minLiteralLength=_Mathmin(newIndentLiteral.length,this.indentLiteral.length),newIndentLiteral.slice(0,minLiteralLength)!==this.indentLiteral.slice(0,minLiteralLength))return this.error(\"indentation mismatch\",{offset:indent.length}),indent.length;if(size-this.continuationLineAdditionalIndent===this.indent)return noNewlines?this.suppressNewlines():this.newlineToken(offset),indent.length;if(size>this.indent){if(noNewlines)return backslash||(this.continuationLineAdditionalIndent=size-this.indent),this.continuationLineAdditionalIndent&&(prev.continuationLineIndent=this.indent+this.continuationLineAdditionalIndent),this.suppressNewlines(),indent.length;if(!this.tokens.length)return this.baseIndent=this.indent=size,this.indentLiteral=newIndentLiteral,indent.length;diff=size-this.indent+this.outdebt,this.token(\"INDENT\",diff,{offset:offset+indent.length-size,length:size}),this.indents.push(diff),this.ends.push({tag:\"OUTDENT\"}),this.outdebt=this.continuationLineAdditionalIndent=0,this.indent=size,this.indentLiteral=newIndentLiteral}else size<this.baseIndent?this.error(\"missing indentation\",{offset:offset+indent.length}):(endsContinuationLineIndentation=0<this.continuationLineAdditionalIndent,this.continuationLineAdditionalIndent=0,this.outdentToken({moveOut:this.indent-size,noNewlines:noNewlines,outdentLength:indent.length,offset:offset,indentSize:size,endsContinuationLineIndentation:endsContinuationLineIndentation}));return indent.length}},{key:\"outdentToken\",value:function outdentToken(_ref15){var moveOut=_ref15.moveOut,noNewlines=_ref15.noNewlines,_ref15$outdentLength=_ref15.outdentLength,outdentLength=void 0===_ref15$outdentLength?0:_ref15$outdentLength,_ref15$offset=_ref15.offset,offset=void 0===_ref15$offset?0:_ref15$offset,indentSize=_ref15.indentSize,endsContinuationLineIndentation=_ref15.endsContinuationLineIndentation,decreasedIndent,dent,lastIndent,ref,terminatorToken;for(decreasedIndent=this.indent-moveOut;0<moveOut;)lastIndent=this.indents[this.indents.length-1],lastIndent?this.outdebt&&moveOut<=this.outdebt?(this.outdebt-=moveOut,moveOut=0):(dent=this.indents.pop()+this.outdebt,outdentLength&&(ref=this.chunk[outdentLength],0<=indexOf.call(INDENTABLE_CLOSERS,ref))&&(decreasedIndent-=dent-moveOut,moveOut=dent),this.outdebt=0,this.pair(\"OUTDENT\"),this.token(\"OUTDENT\",moveOut,{length:outdentLength,indentSize:indentSize+moveOut-dent}),moveOut-=dent):this.outdebt=moveOut=0;return dent&&(this.outdebt-=moveOut),this.suppressSemicolons(),\"TERMINATOR\"===this.tag()||noNewlines||(terminatorToken=this.token(\"TERMINATOR\",\"\\n\",{offset:offset+outdentLength,length:0}),endsContinuationLineIndentation&&(terminatorToken.endsContinuationLineIndentation={preContinuationLineIndent:this.indent})),this.indent=decreasedIndent,this.indentLiteral=this.indentLiteral.slice(0,decreasedIndent),this}},{key:\"whitespaceToken\",value:function whitespaceToken(){var match,nline,prev;return(match=WHITESPACE.exec(this.chunk))||(nline=\"\\n\"===this.chunk.charAt(0))?(prev=this.prev(),prev&&(prev[match?\"spaced\":\"newLine\"]=!0),match?match[0].length:0):0}},{key:\"newlineToken\",value:function newlineToken(offset){return this.suppressSemicolons(),\"TERMINATOR\"!==this.tag()&&this.token(\"TERMINATOR\",\"\\n\",{offset:offset,length:0}),this}},{key:\"suppressNewlines\",value:function suppressNewlines(){var prev;return prev=this.prev(),\"\\\\\"===prev[1]&&(prev.comments&&1<this.tokens.length&&attachCommentsToNode(prev.comments,this.tokens[this.tokens.length-2]),this.tokens.pop()),this}},{key:\"jsxToken\",value:function jsxToken(){var _this7=this,afterTag,end,endToken,firstChar,fullId,fullTagName,id,input,j,jsxTag,len,match,offset,openingTagToken,prev,prevChar,properties,property,ref,tagToken,token,tokens;if(firstChar=this.chunk[0],prevChar=0<this.tokens.length?this.tokens[this.tokens.length-1][0]:\"\",\"<\"===firstChar){if(match=JSX_IDENTIFIER.exec(this.chunk.slice(1))||JSX_FRAGMENT_IDENTIFIER.exec(this.chunk.slice(1)),!(match&&(0<this.jsxDepth||!(prev=this.prev())||prev.spaced||(ref=prev[0],0>indexOf.call(COMPARABLE_LEFT_SIDE,ref)))))return 0;var _match8=match,_match9=_slicedToArray(_match8,2);if(input=_match9[0],id=_match9[1],fullId=id,0<=indexOf.call(id,\".\")){var _id$split=id.split(\".\"),_id$split2=_toArray(_id$split);id=_id$split2[0],properties=_id$split2.slice(1)}else properties=[];for(tagToken=this.token(\"JSX_TAG\",id,{length:id.length+1,data:{openingBracketToken:this.makeToken(\"<\",\"<\"),tagNameToken:this.makeToken(\"IDENTIFIER\",id,{offset:1})}}),offset=id.length+1,(j=0,len=properties.length);j<len;j++)property=properties[j],this.token(\".\",\".\",{offset:offset}),offset+=1,this.token(\"PROPERTY\",property,{offset:offset}),offset+=property.length;return this.token(\"CALL_START\",\"(\",{generated:!0}),this.token(\"[\",\"[\",{generated:!0}),this.ends.push({tag:\"/>\",origin:tagToken,name:id,properties:properties}),this.jsxDepth++,fullId.length+1}if(jsxTag=this.atJSXTag()){if(\"/>\"===this.chunk.slice(0,2))return this.pair(\"/>\"),this.token(\"]\",\"]\",{length:2,generated:!0}),this.token(\"CALL_END\",\")\",{length:2,generated:!0,data:{selfClosingSlashToken:this.makeToken(\"/\",\"/\"),closingBracketToken:this.makeToken(\">\",\">\",{offset:1})}}),this.jsxDepth--,2;if(\"{\"===firstChar)return\":\"===prevChar?(token=this.token(\"(\",\"{\"),this.jsxObjAttribute[this.jsxDepth]=!1,addTokenData(this.tokens[this.tokens.length-3],{jsx:!0})):(token=this.token(\"{\",\"{\"),this.jsxObjAttribute[this.jsxDepth]=!0),this.ends.push({tag:\"}\",origin:token}),1;if(\">\"===firstChar){var _this$pair=this.pair(\"/>\");openingTagToken=_this$pair.origin,this.token(\"]\",\"]\",{generated:!0,data:{closingBracketToken:this.makeToken(\">\",\">\")}}),this.token(\",\",\"JSX_COMMA\",{generated:!0});var _this$matchWithInterp2=this.matchWithInterpolations(INSIDE_JSX,\">\",\"</\",JSX_INTERPOLATION);tokens=_this$matchWithInterp2.tokens,end=_this$matchWithInterp2.index,this.mergeInterpolationTokens(tokens,{endOffset:end,jsx:!0},function(value){return _this7.validateUnicodeCodePointEscapes(value,{delimiter:\">\"})}),match=JSX_IDENTIFIER.exec(this.chunk.slice(end))||JSX_FRAGMENT_IDENTIFIER.exec(this.chunk.slice(end)),match&&match[1]===\"\".concat(jsxTag.name).concat(function(){var k,len1,ref1,results;for(ref1=jsxTag.properties,results=[],(k=0,len1=ref1.length);k<len1;k++)property=ref1[k],results.push(\".\".concat(property));return results}().join(\"\"))||this.error(\"expected corresponding JSX closing tag for \".concat(jsxTag.name),jsxTag.origin.data.tagNameToken[2]);var _match10=match,_match11=_slicedToArray(_match10,2);return fullTagName=_match11[1],afterTag=end+fullTagName.length,\">\"!==this.chunk[afterTag]&&this.error(\"missing closing > after tag name\",{offset:afterTag,length:1}),endToken=this.token(\"CALL_END\",\")\",{offset:end-2,length:fullTagName.length+3,generated:!0,data:{closingTagOpeningBracketToken:this.makeToken(\"<\",\"<\",{offset:end-2}),closingTagSlashToken:this.makeToken(\"/\",\"/\",{offset:end-1}),closingTagNameToken:this.makeToken(\"IDENTIFIER\",fullTagName,{offset:end}),closingTagClosingBracketToken:this.makeToken(\">\",\">\",{offset:end+fullTagName.length})}}),addTokenData(openingTagToken,endToken.data),this.jsxDepth--,afterTag+1}return 0}return this.atJSXTag(1)?\"}\"===firstChar?(this.pair(firstChar),this.jsxObjAttribute[this.jsxDepth]?(this.token(\"}\",\"}\"),this.jsxObjAttribute[this.jsxDepth]=!1):this.token(\")\",\"}\"),this.token(\",\",\",\",{generated:!0}),1):0:0}},{key:\"atJSXTag\",value:function atJSXTag(){var depth=0<arguments.length&&void 0!==arguments[0]?arguments[0]:0,i,last,ref;if(0===this.jsxDepth)return!1;for(i=this.ends.length-1;\"OUTDENT\"===(null==(ref=this.ends[i])?void 0:ref.tag)||0<depth--;)i--;return last=this.ends[i],\"/>\"===(null==last?void 0:last.tag)&&last}},{key:\"literalToken\",value:function literalToken(){var match,message,origin,prev,ref,ref1,ref2,ref3,ref4,ref5,skipToken,tag,token,value;if(match=OPERATOR.exec(this.chunk)){var _match12=match,_match13=_slicedToArray(_match12,1);value=_match13[0],CODE.test(value)&&this.tagParameters()}else value=this.chunk.charAt(0);if(tag=value,prev=this.prev(),prev&&0<=indexOf.call([\"=\"].concat(_toConsumableArray(COMPOUND_ASSIGN)),value)&&(skipToken=!1,\"=\"!==value||\"||\"!==(ref=prev[1])&&\"&&\"!==ref||prev.spaced||(prev[0]=\"COMPOUND_ASSIGN\",prev[1]+=\"=\",(null==(ref1=prev.data)?void 0:ref1.original)&&(prev.data.original+=\"=\"),prev[2].range=[prev[2].range[0],prev[2].range[1]+1],prev[2].last_column+=1,prev[2].last_column_exclusive+=1,prev=this.tokens[this.tokens.length-2],skipToken=!0),prev&&\"PROPERTY\"!==prev[0]&&(origin=null==(ref2=prev.origin)?prev:ref2,message=isUnassignable(prev[1],origin[1]),message&&this.error(message,origin[2])),skipToken))return value.length;if(\"(\"===value&&\"IMPORT\"===(null==prev?void 0:prev[0])&&(prev[0]=\"DYNAMIC_IMPORT\"),\"{\"===value&&this.seenImport?this.importSpecifierList=!0:this.importSpecifierList&&\"}\"===value?this.importSpecifierList=!1:\"{\"===value&&\"EXPORT\"===(null==prev?void 0:prev[0])?this.exportSpecifierList=!0:this.exportSpecifierList&&\"}\"===value&&(this.exportSpecifierList=!1),\";\"===value)(ref3=null==prev?void 0:prev[0],0<=indexOf.call([\"=\"].concat(_toConsumableArray(UNFINISHED)),ref3))&&this.error(\"unexpected ;\"),this.seenFor=this.seenImport=this.seenExport=!1,tag=\"TERMINATOR\";else if(\"*\"===value&&\"EXPORT\"===(null==prev?void 0:prev[0]))tag=\"EXPORT_ALL\";else if(0<=indexOf.call(MATH,value))tag=\"MATH\";else if(0<=indexOf.call(COMPARE,value))tag=\"COMPARE\";else if(0<=indexOf.call(COMPOUND_ASSIGN,value))tag=\"COMPOUND_ASSIGN\";else if(0<=indexOf.call(UNARY,value))tag=\"UNARY\";else if(0<=indexOf.call(UNARY_MATH,value))tag=\"UNARY_MATH\";else if(0<=indexOf.call(SHIFT,value))tag=\"SHIFT\";else if(\"?\"===value&&(null==prev?void 0:prev.spaced))tag=\"BIN?\";else if(prev)if(\"(\"===value&&!prev.spaced&&(ref4=prev[0],0<=indexOf.call(CALLABLE,ref4)))\"?\"===prev[0]&&(prev[0]=\"FUNC_EXIST\"),tag=\"CALL_START\";else if(\"[\"===value&&((ref5=prev[0],0<=indexOf.call(INDEXABLE,ref5))&&!prev.spaced||\"::\"===prev[0]))switch(tag=\"INDEX_START\",prev[0]){case\"?\":prev[0]=\"INDEX_SOAK\";}return token=this.makeToken(tag,value),\"(\"===value||\"{\"===value||\"[\"===value?this.ends.push({tag:INVERSES[value],origin:token}):\")\"===value||\"}\"===value||\"]\"===value?this.pair(value):void 0,(this.tokens.push(this.makeToken(tag,value)),value.length)}},{key:\"tagParameters\",value:function tagParameters(){var i,paramEndToken,stack,tok,tokens;if(\")\"!==this.tag())return this.tagDoIife();for(stack=[],tokens=this.tokens,i=tokens.length,paramEndToken=tokens[--i],paramEndToken[0]=\"PARAM_END\";tok=tokens[--i];)switch(tok[0]){case\")\":stack.push(tok);break;case\"(\":case\"CALL_START\":if(stack.length)stack.pop();else return\"(\"===tok[0]?(tok[0]=\"PARAM_START\",this.tagDoIife(i-1)):(paramEndToken[0]=\"CALL_END\",this);}return this}},{key:\"tagDoIife\",value:function tagDoIife(tokenIndex){var tok;return(tok=this.tokens[null==tokenIndex?this.tokens.length-1:tokenIndex],\"DO\"!==(null==tok?void 0:tok[0]))?this:(tok[0]=\"DO_IIFE\",this)}},{key:\"closeIndentation\",value:function closeIndentation(){return this.outdentToken({moveOut:this.indent,indentSize:0})}},{key:\"matchWithInterpolations\",value:function matchWithInterpolations(regex,delimiter){var closingDelimiter=2<arguments.length&&void 0!==arguments[2]?arguments[2]:delimiter,interpolators=3<arguments.length&&void 0!==arguments[3]?arguments[3]:/^#\\{/,braceInterpolator,close,column,index,interpolationOffset,interpolator,line,match,nested,offset,offsetInChunk,open,ref,ref1,rest,str,strPart,tokens;if(tokens=[],offsetInChunk=delimiter.length,this.chunk.slice(0,offsetInChunk)!==delimiter)return null;for(str=this.chunk.slice(offsetInChunk);;){var _regex$exec=regex.exec(str),_regex$exec2=_slicedToArray(_regex$exec,1);if(strPart=_regex$exec2[0],this.validateEscapes(strPart,{isRegex:\"/\"===delimiter.charAt(0),offsetInChunk:offsetInChunk}),tokens.push(this.makeToken(\"NEOSTRING\",strPart,{offset:offsetInChunk})),str=str.slice(strPart.length),offsetInChunk+=strPart.length,!(match=interpolators.exec(str)))break;var _match14=match,_match15=_slicedToArray(_match14,1);interpolator=_match15[0],interpolationOffset=interpolator.length-1;var _this$getLineAndColum3=this.getLineAndColumnFromChunk(offsetInChunk+interpolationOffset),_this$getLineAndColum4=_slicedToArray(_this$getLineAndColum3,3);line=_this$getLineAndColum4[0],column=_this$getLineAndColum4[1],offset=_this$getLineAndColum4[2],rest=str.slice(interpolationOffset);var _Lexer$tokenize=new Lexer().tokenize(rest,{line:line,column:column,offset:offset,untilBalanced:!0,locationDataCompensations:this.locationDataCompensations});if(nested=_Lexer$tokenize.tokens,index=_Lexer$tokenize.index,index+=interpolationOffset,braceInterpolator=\"}\"===str[index-1],braceInterpolator){var _nested,_nested2,_slice$call,_slice$call2;_nested=nested,_nested2=_slicedToArray(_nested,1),open=_nested2[0],_nested,_slice$call=slice.call(nested,-1),_slice$call2=_slicedToArray(_slice$call,1),close=_slice$call2[0],_slice$call,open[0]=\"INTERPOLATION_START\",open[1]=\"(\",open[2].first_column-=interpolationOffset,open[2].range=[open[2].range[0]-interpolationOffset,open[2].range[1]],close[0]=\"INTERPOLATION_END\",close[1]=\")\",close.origin=[\"\",\"end of interpolation\",close[2]]}\"TERMINATOR\"===(null==(ref=nested[1])?void 0:ref[0])&&nested.splice(1,1),\"INDENT\"===(null==(ref1=nested[nested.length-3])?void 0:ref1[0])&&\"OUTDENT\"===nested[nested.length-2][0]&&nested.splice(-3,2),braceInterpolator||(open=this.makeToken(\"INTERPOLATION_START\",\"(\",{offset:offsetInChunk,length:0,generated:!0}),close=this.makeToken(\"INTERPOLATION_END\",\")\",{offset:offsetInChunk+index,length:0,generated:!0}),nested=[open].concat(_toConsumableArray(nested),[close])),tokens.push([\"TOKENS\",nested]),str=str.slice(index),offsetInChunk+=index}return str.slice(0,closingDelimiter.length)!==closingDelimiter&&this.error(\"missing \".concat(closingDelimiter),{length:delimiter.length}),{tokens:tokens,index:offsetInChunk+closingDelimiter.length}}},{key:\"mergeInterpolationTokens\",value:function mergeInterpolationTokens(tokens,options,fn){var $,converted,_double,endOffset,firstIndex,heregex,i,indent,j,jsx,k,lastToken,len,len1,locationToken,lparen,placeholderToken,quote,ref,ref1,rparen,tag,token,tokensToPush,val,value;for(quote=options.quote,indent=options.indent,_double=options.double,heregex=options.heregex,endOffset=options.endOffset,jsx=options.jsx,1<tokens.length&&(lparen=this.token(\"STRING_START\",\"(\",{length:null==(ref=null==quote?void 0:quote.length)?0:ref,data:{quote:quote},generated:null==quote||!quote.length})),firstIndex=this.tokens.length,$=tokens.length-1,(i=j=0,len=tokens.length);j<len;i=++j){var _this$tokens2;token=tokens[i];var _token4=token,_token5=_slicedToArray(_token4,2);switch(tag=_token5[0],value=_token5[1],tag){case\"TOKENS\":if(2===value.length&&(value[0].comments||value[1].comments)){for(placeholderToken=this.makeToken(\"JS\",\"\",{generated:!0}),placeholderToken[2]=value[0][2],(k=0,len1=value.length);k<len1;k++){var _placeholderToken$com;(val=value[k],!!val.comments)&&(null==placeholderToken.comments&&(placeholderToken.comments=[]),(_placeholderToken$com=placeholderToken.comments).push.apply(_placeholderToken$com,_toConsumableArray(val.comments)))}value.splice(1,0,placeholderToken)}locationToken=value[0],tokensToPush=value;break;case\"NEOSTRING\":converted=fn.call(this,token[1],i),0===i&&addTokenData(token,{initialChunk:!0}),i===$&&addTokenData(token,{finalChunk:!0}),addTokenData(token,{indent:indent,quote:quote,double:_double}),heregex&&addTokenData(token,{heregex:heregex}),jsx&&addTokenData(token,{jsx:jsx}),token[0]=\"STRING\",token[1]=\"\\\"\"+converted+\"\\\"\",1===tokens.length&&null!=quote&&(token[2].first_column-=quote.length,\"\\n\"===token[1].substr(-2,1)?(token[2].last_line+=1,token[2].last_column=quote.length-1):(token[2].last_column+=quote.length,2===token[1].length&&(token[2].last_column-=1)),token[2].last_column_exclusive+=quote.length,token[2].range=[token[2].range[0]-quote.length,token[2].range[1]+quote.length]),locationToken=token,tokensToPush=[token];}(_this$tokens2=this.tokens).push.apply(_this$tokens2,_toConsumableArray(tokensToPush))}if(lparen){var _slice$call3=slice.call(tokens,-1),_slice$call4=_slicedToArray(_slice$call3,1);return lastToken=_slice$call4[0],lparen.origin=[\"STRING\",null,{first_line:lparen[2].first_line,first_column:lparen[2].first_column,last_line:lastToken[2].last_line,last_column:lastToken[2].last_column,last_line_exclusive:lastToken[2].last_line_exclusive,last_column_exclusive:lastToken[2].last_column_exclusive,range:[lparen[2].range[0],lastToken[2].range[1]]}],(null==quote?void 0:quote.length)||(lparen[2]=lparen.origin[2]),rparen=this.token(\"STRING_END\",\")\",{offset:endOffset-(null==quote?\"\":quote).length,length:null==(ref1=null==quote?void 0:quote.length)?0:ref1,generated:null==quote||!quote.length})}}},{key:\"pair\",value:function pair(tag){var _slice$call5,_slice$call6,lastIndent,prev,ref,ref1,wanted;if(ref=this.ends,_slice$call5=slice.call(ref,-1),_slice$call6=_slicedToArray(_slice$call5,1),prev=_slice$call6[0],_slice$call5,tag!==(wanted=null==prev?void 0:prev.tag)){var _slice$call7,_slice$call8;return\"OUTDENT\"!==wanted&&this.error(\"unmatched \".concat(tag)),ref1=this.indents,_slice$call7=slice.call(ref1,-1),_slice$call8=_slicedToArray(_slice$call7,1),lastIndent=_slice$call8[0],_slice$call7,this.outdentToken({moveOut:lastIndent,noNewlines:!0}),this.pair(tag)}return this.ends.pop()}},{key:\"getLocationDataCompensation\",value:function getLocationDataCompensation(start,end){var compensation,current,initialEnd,totalCompensation;for(totalCompensation=0,initialEnd=end,current=start;current<=end&&(current!==end||start===initialEnd);)compensation=this.locationDataCompensations[current],null!=compensation&&(totalCompensation+=compensation,end+=compensation),current++;return totalCompensation}},{key:\"getLineAndColumnFromChunk\",value:function getLineAndColumnFromChunk(offset){var column,columnCompensation,compensation,lastLine,lineCount,previousLinesCompensation,ref,string;if(compensation=this.getLocationDataCompensation(this.chunkOffset,this.chunkOffset+offset),0===offset)return[this.chunkLine,this.chunkColumn+compensation,this.chunkOffset+compensation];if(string=offset>=this.chunk.length?this.chunk:this.chunk.slice(0,+(offset-1)+1||9e9),lineCount=count(string,\"\\n\"),column=this.chunkColumn,0<lineCount){var _slice$call9,_slice$call10;ref=string.split(\"\\n\"),_slice$call9=slice.call(ref,-1),_slice$call10=_slicedToArray(_slice$call9,1),lastLine=_slice$call10[0],_slice$call9,column=lastLine.length,previousLinesCompensation=this.getLocationDataCompensation(this.chunkOffset,this.chunkOffset+offset-column),0>previousLinesCompensation&&(previousLinesCompensation=0),columnCompensation=this.getLocationDataCompensation(this.chunkOffset+offset+previousLinesCompensation-column,this.chunkOffset+offset+previousLinesCompensation)}else column+=string.length,columnCompensation=compensation;return[this.chunkLine+lineCount,column+columnCompensation,this.chunkOffset+offset+compensation]}},{key:\"makeLocationData\",value:function makeLocationData(_ref16){var offsetInChunk=_ref16.offsetInChunk,length=_ref16.length,endOffset,lastCharacter,locationData;locationData={range:[]};var _this$getLineAndColum5=this.getLineAndColumnFromChunk(offsetInChunk),_this$getLineAndColum6=_slicedToArray(_this$getLineAndColum5,3);locationData.first_line=_this$getLineAndColum6[0],locationData.first_column=_this$getLineAndColum6[1],locationData.range[0]=_this$getLineAndColum6[2],lastCharacter=0<length?length-1:0;var _this$getLineAndColum7=this.getLineAndColumnFromChunk(offsetInChunk+lastCharacter),_this$getLineAndColum8=_slicedToArray(_this$getLineAndColum7,3);locationData.last_line=_this$getLineAndColum8[0],locationData.last_column=_this$getLineAndColum8[1],endOffset=_this$getLineAndColum8[2];var _this$getLineAndColum9=this.getLineAndColumnFromChunk(offsetInChunk+lastCharacter+(0<length?1:0)),_this$getLineAndColum10=_slicedToArray(_this$getLineAndColum9,2);return locationData.last_line_exclusive=_this$getLineAndColum10[0],locationData.last_column_exclusive=_this$getLineAndColum10[1],locationData.range[1]=0<length?endOffset+1:endOffset,locationData}},{key:\"makeToken\",value:function makeToken(tag,value){var _ref17=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_ref17$offset=_ref17.offset,offsetInChunk=void 0===_ref17$offset?0:_ref17$offset,_ref17$length=_ref17.length,length=void 0===_ref17$length?value.length:_ref17$length,origin=_ref17.origin,generated=_ref17.generated,indentSize=_ref17.indentSize,token;return token=[tag,value,this.makeLocationData({offsetInChunk:offsetInChunk,length:length})],origin&&(token.origin=origin),generated&&(token.generated=!0),null!=indentSize&&(token.indentSize=indentSize),token}},{key:\"token\",value:function(tag,value){var _ref18=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},offset=_ref18.offset,length=_ref18.length,origin=_ref18.origin,data=_ref18.data,generated=_ref18.generated,indentSize=_ref18.indentSize,token;return token=this.makeToken(tag,value,{offset:offset,length:length,origin:origin,generated:generated,indentSize:indentSize}),data&&addTokenData(token,data),this.tokens.push(token),token}},{key:\"tag\",value:function tag(){var _slice$call11,_slice$call12,ref,token;return ref=this.tokens,_slice$call11=slice.call(ref,-1),_slice$call12=_slicedToArray(_slice$call11,1),token=_slice$call12[0],_slice$call11,null==token?void 0:token[0]}},{key:\"value\",value:function value(){var useOrigin=!!(0<arguments.length&&void 0!==arguments[0])&&arguments[0],_slice$call13,_slice$call14,ref,token;return ref=this.tokens,_slice$call13=slice.call(ref,-1),_slice$call14=_slicedToArray(_slice$call13,1),token=_slice$call14[0],_slice$call13,useOrigin&&null!=(null==token?void 0:token.origin)?token.origin[1]:null==token?void 0:token[1]}},{key:\"prev\",value:function prev(){return this.tokens[this.tokens.length-1]}},{key:\"unfinished\",value:function unfinished(){var ref;return LINE_CONTINUER.test(this.chunk)||(ref=this.tag(),0<=indexOf.call(UNFINISHED,ref))}},{key:\"validateUnicodeCodePointEscapes\",value:function validateUnicodeCodePointEscapes(str,options){return replaceUnicodeCodePointEscapes(str,merge(options,{error:this.error}))}},{key:\"validateEscapes\",value:function validateEscapes(str){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},before,hex,invalidEscape,invalidEscapeRegex,match,message,octal,ref,unicode,unicodeCodePoint;if(invalidEscapeRegex=options.isRegex?REGEX_INVALID_ESCAPE:STRING_INVALID_ESCAPE,match=invalidEscapeRegex.exec(str),!!match)return match[0],before=match[1],octal=match[2],hex=match[3],unicodeCodePoint=match[4],unicode=match[5],message=octal?\"octal escape sequences are not allowed\":\"invalid escape sequence\",invalidEscape=\"\\\\\".concat(octal||hex||unicodeCodePoint||unicode),this.error(\"\".concat(message,\" \").concat(invalidEscape),{offset:(null==(ref=options.offsetInChunk)?0:ref)+match.index+before.length,length:invalidEscape.length})}},{key:\"suppressSemicolons\",value:function suppressSemicolons(){var ref,ref1,results;for(results=[];\";\"===this.value();)this.tokens.pop(),(ref=null==(ref1=this.prev())?void 0:ref1[0],0<=indexOf.call([\"=\"].concat(_toConsumableArray(UNFINISHED)),ref))?results.push(this.error(\"unexpected ;\")):results.push(void 0);return results}},{key:\"error\",value:function error(message){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_this$getLineAndColum11,_this$getLineAndColum12,first_column,first_line,location,ref,ref1;return location=\"first_line\"in options?options:(_this$getLineAndColum11=this.getLineAndColumnFromChunk(null==(ref=options.offset)?0:ref),_this$getLineAndColum12=_slicedToArray(_this$getLineAndColum11,2),first_line=_this$getLineAndColum12[0],first_column=_this$getLineAndColum12[1],_this$getLineAndColum11,{first_line:first_line,first_column:first_column,last_column:first_column+(null==(ref1=options.length)?1:ref1)-1}),throwSyntaxError(message,location)}}]),Lexer}(),isUnassignable=function(name){var displayName=1<arguments.length&&void 0!==arguments[1]?arguments[1]:name;switch(!1){case 0>indexOf.call([].concat(_toConsumableArray(JS_KEYWORDS),_toConsumableArray(COFFEE_KEYWORDS)),name):return\"keyword '\".concat(displayName,\"' can't be assigned\");case 0>indexOf.call(STRICT_PROSCRIBED,name):return\"'\".concat(displayName,\"' can't be assigned\");case 0>indexOf.call(RESERVED,name):return\"reserved word '\".concat(displayName,\"' can't be assigned\");default:return!1;}},exports.isUnassignable=isUnassignable,isForFrom=function(prev){var ref;return\"IDENTIFIER\"===prev[0]||\"FOR\"!==prev[0]&&\"{\"!==(ref=prev[1])&&\"[\"!==ref&&\",\"!==ref&&\":\"!==ref},addTokenData=function(token,data){return Object.assign(null==token.data?token.data={}:token.data,data)},JS_KEYWORDS=[\"true\",\"false\",\"null\",\"this\",\"new\",\"delete\",\"typeof\",\"in\",\"instanceof\",\"return\",\"throw\",\"break\",\"continue\",\"debugger\",\"yield\",\"await\",\"if\",\"else\",\"switch\",\"for\",\"while\",\"do\",\"try\",\"catch\",\"finally\",\"class\",\"extends\",\"super\",\"import\",\"export\",\"default\"],COFFEE_KEYWORDS=[\"undefined\",\"Infinity\",\"NaN\",\"then\",\"unless\",\"until\",\"loop\",\"of\",\"by\",\"when\"],COFFEE_ALIAS_MAP={and:\"&&\",or:\"||\",is:\"==\",isnt:\"!=\",not:\"!\",yes:\"true\",no:\"false\",on:\"true\",off:\"false\"},COFFEE_ALIASES=function(){var results;for(key in results=[],COFFEE_ALIAS_MAP)results.push(key);return results}(),COFFEE_KEYWORDS=COFFEE_KEYWORDS.concat(COFFEE_ALIASES),RESERVED=[\"case\",\"function\",\"var\",\"void\",\"with\",\"const\",\"let\",\"enum\",\"native\",\"implements\",\"interface\",\"package\",\"private\",\"protected\",\"public\",\"static\"],STRICT_PROSCRIBED=[\"arguments\",\"eval\"],exports.JS_FORBIDDEN=JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED),BOM=65279,IDENTIFIER=/^(?!\\d)((?:(?!\\s)[$\\w\\x7f-\\uffff])+)([^\\n\\S]*:(?!:))?/,JSX_IDENTIFIER_PART=/(?:(?!\\s)[\\-$\\w\\x7f-\\uffff])+/.source,JSX_IDENTIFIER=RegExp(\"^(?![\\\\d<])(\".concat(JSX_IDENTIFIER_PART,\"(?:\\\\s*:\\\\s*\").concat(JSX_IDENTIFIER_PART,\"|(?:\\\\s*\\\\.\\\\s*\").concat(JSX_IDENTIFIER_PART,\")+)?)\")),JSX_FRAGMENT_IDENTIFIER=/^()>/,JSX_ATTRIBUTE=RegExp(\"^(?!\\\\d)(\".concat(JSX_IDENTIFIER_PART,\"(?:\\\\s*:\\\\s*\").concat(JSX_IDENTIFIER_PART,\")?)([^\\\\S]*=(?!=))?\")),NUMBER=/^0b[01](?:_?[01])*n?|^0o[0-7](?:_?[0-7])*n?|^0x[\\da-f](?:_?[\\da-f])*n?|^\\d+(?:_\\d+)*n|^(?:\\d+(?:_\\d+)*)?\\.?\\d+(?:_\\d+)*(?:e[+-]?\\d+(?:_\\d+)*)?/i,OPERATOR=/^(?:[-=]>|[-+*\\/%<>&|^!?=]=|>>>=?|([-+:])\\1|([&|<>*\\/%])\\2=?|\\?(\\.|::)|\\.{2,3})/,WHITESPACE=/^[^\\n\\S]+/,COMMENT=/^(\\s*)###([^#][\\s\\S]*?)(?:###([^\\n\\S]*)|###$)|^((?:\\s*#(?!##[^#]).*)+)/,CODE=/^[-=]>/,MULTI_DENT=/^(?:\\n[^\\n\\S]*)+/,JSTOKEN=/^`(?!``)((?:[^`\\\\]|\\\\[\\s\\S])*)`/,HERE_JSTOKEN=/^```((?:[^`\\\\]|\\\\[\\s\\S]|`(?!``))*)```/,STRING_START=/^(?:'''|\"\"\"|'|\")/,STRING_SINGLE=/^(?:[^\\\\']|\\\\[\\s\\S])*/,STRING_DOUBLE=/^(?:[^\\\\\"#]|\\\\[\\s\\S]|\\#(?!\\{))*/,HEREDOC_SINGLE=/^(?:[^\\\\']|\\\\[\\s\\S]|'(?!''))*/,HEREDOC_DOUBLE=/^(?:[^\\\\\"#]|\\\\[\\s\\S]|\"(?!\"\")|\\#(?!\\{))*/,INSIDE_JSX=/^(?:[^\\{<])*/,JSX_INTERPOLATION=/^(?:\\{|<(?!\\/))/,HEREDOC_INDENT=/\\n+([^\\n\\S]*)(?=\\S)/g,REGEX=/^\\/(?!\\/)((?:[^[\\/\\n\\\\]|\\\\[^\\n]|\\[(?:\\\\[^\\n]|[^\\]\\n\\\\])*\\])*)(\\/)?/,REGEX_FLAGS=/^\\w*/,VALID_FLAGS=/^(?!.*(.).*\\1)[gimsuy]*$/,HEREGEX=/^(?:[^\\\\\\/#\\s]|\\\\[\\s\\S]|\\/(?!\\/\\/)|\\#(?!\\{)|\\s+(?:#(?!\\{).*)?)*/,HEREGEX_COMMENT=/(\\s+)(#(?!{).*)/gm,REGEX_ILLEGAL=/^(\\/|\\/{3}\\s*)(\\*)/,POSSIBLY_DIVISION=/^\\/=?\\s/,HERECOMMENT_ILLEGAL=/\\*\\//,LINE_CONTINUER=/^\\s*(?:,|\\??\\.(?![.\\d])|\\??::)/,STRING_INVALID_ESCAPE=/((?:^|[^\\\\])(?:\\\\\\\\)*)\\\\(?:(0\\d|[1-7])|(x(?![\\da-fA-F]{2}).{0,2})|(u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?)|(u(?!\\{|[\\da-fA-F]{4}).{0,4}))/,REGEX_INVALID_ESCAPE=/((?:^|[^\\\\])(?:\\\\\\\\)*)\\\\(?:(0\\d)|(x(?![\\da-fA-F]{2}).{0,2})|(u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?)|(u(?!\\{|[\\da-fA-F]{4}).{0,4}))/,TRAILING_SPACES=/\\s+$/,COMPOUND_ASSIGN=[\"-=\",\"+=\",\"/=\",\"*=\",\"%=\",\"||=\",\"&&=\",\"?=\",\"<<=\",\">>=\",\">>>=\",\"&=\",\"^=\",\"|=\",\"**=\",\"//=\",\"%%=\"],UNARY=[\"NEW\",\"TYPEOF\",\"DELETE\"],UNARY_MATH=[\"!\",\"~\"],SHIFT=[\"<<\",\">>\",\">>>\"],COMPARE=[\"==\",\"!=\",\"<\",\">\",\"<=\",\">=\"],MATH=[\"*\",\"/\",\"%\",\"//\",\"%%\"],RELATION=[\"IN\",\"OF\",\"INSTANCEOF\"],BOOL=[\"TRUE\",\"FALSE\"],CALLABLE=[\"IDENTIFIER\",\"PROPERTY\",\")\",\"]\",\"?\",\"@\",\"THIS\",\"SUPER\",\"DYNAMIC_IMPORT\"],INDEXABLE=CALLABLE.concat([\"NUMBER\",\"INFINITY\",\"NAN\",\"STRING\",\"STRING_END\",\"REGEX\",\"REGEX_END\",\"BOOL\",\"NULL\",\"UNDEFINED\",\"}\",\"::\"]),COMPARABLE_LEFT_SIDE=[\"IDENTIFIER\",\")\",\"]\",\"NUMBER\"],NOT_REGEX=INDEXABLE.concat([\"++\",\"--\"]),LINE_BREAK=[\"INDENT\",\"OUTDENT\",\"TERMINATOR\"],INDENTABLE_CLOSERS=[\")\",\"}\",\"]\"]}.call(this),{exports:exports}.exports}(),require[\"./parser\"]=function(){var exports={},module={exports:exports},parser=function(){function Parser(){this.yy={}}var o=function(k,v,_o,l){for(_o=_o||{},l=k.length;l--;_o[k[l]]=v);return _o},$V0=[1,24],$V1=[1,59],$V2=[1,98],$V3=[1,99],$V4=[1,94],$V5=[1,100],$V6=[1,101],$V7=[1,96],$V8=[1,97],$V9=[1,68],$Va=[1,70],$Vb=[1,71],$Vc=[1,72],$Vd=[1,73],$Ve=[1,74],$Vf=[1,76],$Vg=[1,80],$Vh=[1,77],$Vi=[1,78],$Vj=[1,62],$Vk=[1,45],$Vl=[1,38],$Vm=[1,83],$Vn=[1,84],$Vo=[1,81],$Vp=[1,82],$Vq=[1,93],$Vr=[1,57],$Vs=[1,63],$Vt=[1,64],$Vu=[1,79],$Vv=[1,50],$Vw=[1,58],$Vx=[1,75],$Vy=[1,88],$Vz=[1,89],$VA=[1,90],$VB=[1,91],$VC=[1,56],$VD=[1,87],$VE=[1,40],$VF=[1,41],$VG=[1,61],$VH=[1,42],$VI=[1,43],$VJ=[1,44],$VK=[1,46],$VL=[1,47],$VM=[1,102],$VN=[1,6,35,52,155],$VO=[1,6,33,35,52,74,76,96,137,144,155,158,166],$VP=[1,120],$VQ=[1,121],$VR=[1,122],$VS=[1,117],$VT=[1,105],$VU=[1,104],$VV=[1,103],$VW=[1,106],$VX=[1,107],$VY=[1,108],$VZ=[1,109],$V_=[1,110],$V$=[1,111],$V01=[1,112],$V11=[1,113],$V21=[1,114],$V31=[1,115],$V41=[1,116],$V51=[1,124],$V61=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V71=[2,222],$V81=[1,130],$V91=[1,135],$Va1=[1,131],$Vb1=[1,132],$Vc1=[1,133],$Vd1=[1,136],$Ve1=[1,129],$Vf1=[1,6,33,35,52,74,76,96,137,144,155,157,158,159,165,166,183],$Vg1=[1,6,33,35,46,47,52,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vh1=[2,129],$Vi1=[2,133],$Vj1=[6,33,91,96],$Vk1=[2,106],$Vl1=[1,148],$Vm1=[1,147],$Vn1=[1,142],$Vo1=[1,151],$Vp1=[1,156],$Vq1=[1,154],$Vr1=[1,160],$Vs1=[1,166],$Vt1=[1,162],$Vu1=[1,163],$Vv1=[1,165],$Vw1=[1,170],$Vx1=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vy1=[2,126],$Vz1=[1,6,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VA1=[2,31],$VB1=[1,195],$VC1=[1,196],$VD1=[2,93],$VE1=[1,202],$VF1=[1,208],$VG1=[1,223],$VH1=[1,218],$VI1=[1,227],$VJ1=[1,224],$VK1=[1,229],$VL1=[1,230],$VM1=[1,232],$VN1=[2,227],$VO1=[1,234],$VP1=[14,32,33,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VQ1=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,121,135,136,137,144,155,157,158,159,165,166,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$VR1=[1,247],$VS1=[1,248],$VT1=[2,156],$VU1=[1,264],$VV1=[1,265],$VW1=[1,267],$VX1=[1,277],$VY1=[1,278],$VZ1=[1,6,33,35,46,47,52,70,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V_1=[1,6,33,35,36,46,47,52,66,70,74,76,91,96,105,106,107,110,111,112,115,119,121,128,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$V$1=[1,6,33,35,46,47,49,51,52,57,70,74,76,91,96,105,106,107,110,111,112,115,119,123,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V02=[1,283],$V12=[46,47,136],$V22=[1,322],$V32=[1,321],$V42=[6,33],$V52=[2,104],$V62=[1,328],$V72=[6,33,35,91,96],$V82=[6,33,35,66,76,91,96],$V92=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,194,195,196,197,198,199,200,201,202,203,204],$Va2=[2,377],$Vb2=[2,378],$Vc2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,194,196,197,198,199,200,201,202,203,204],$Vd2=[46,47,105,106,110,111,112,115,135,136],$Ve2=[1,357],$Vf2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183],$Vg2=[2,91],$Vh2=[1,375],$Vi2=[1,377],$Vj2=[1,382],$Vk2=[1,384],$Vl2=[6,33,74,96],$Vm2=[2,247],$Vn2=[2,248],$Vo2=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vp2=[1,398],$Vq2=[14,32,33,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,74,75,76,82,85,87,88,89,93,94,96,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$Vr2=[1,400],$Vs2=[6,33,35,74,96],$Vt2=[6,14,32,33,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,74,75,76,82,85,87,88,89,93,94,96,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$Vu2=[6,33,35,74,96,137],$Vv2=[1,6,33,35,46,47,52,57,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vw2=[1,411],$Vx2=[1,6,33,35,46,47,52,66,70,74,76,91,96,105,106,107,110,111,112,115,119,121,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$Vy2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,166,183],$Vz2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,158,166,183],$VA2=[2,300],$VB2=[173,174,175],$VC2=[96,173,174,175],$VD2=[6,33,119],$VE2=[1,431],$VF2=[6,33,35,96,119],$VG2=[6,33,35,70,96,119],$VH2=[6,33,35,66,70,76,96,105,106,110,111,112,115,119,135,136],$VI2=[6,33,35,76,96,105,106,110,111,112,115,119,135,136],$VJ2=[46,47,49,51],$VK2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,196,197,198,199,200,201,202,203,204],$VL2=[2,367],$VM2=[2,366],$VN2=[35,107],$VO2=[14,32,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,107,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VP2=[2,233],$VQ2=[6,33,35],$VR2=[2,105],$VS2=[1,470],$VT2=[1,471],$VU2=[1,6,33,35,46,47,52,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,151,152,155,157,158,159,165,166,178,180,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VV2=[1,337],$VW2=[35,178,180],$VX2=[1,6,35,52,74,76,91,96,107,119,137,144,155,158,166,183],$VY2=[1,509],$VZ2=[1,516],$V_2=[1,6,33,35,52,74,76,96,137,144,155,158,166,183],$V$2=[2,120],$V03=[1,529],$V13=[33,35,74],$V23=[1,537],$V33=[6,33,35,96,137],$V43=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,178,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V53=[1,6,33,35,52,74,76,96,137,144,155,158,166,178],$V63=[2,314],$V73=[2,315],$V83=[2,330],$V93=[1,557],$Va3=[1,558],$Vb3=[6,33,35,119],$Vc3=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,159,165,166,183],$Vd3=[6,33,35,96],$Ve3=[1,6,33,35,52,74,76,91,96,107,119,137,144,151,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vf3=[33,96],$Vg3=[1,611],$Vh3=[1,612],$Vi3=[1,619],$Vj3=[1,620],$Vk3=[1,638],$Vl3=[1,639],$Vm3=[2,285],$Vn3=[2,288],$Vo3=[2,301],$Vp3=[2,316],$Vq3=[2,320],$Vr3=[2,317],$Vs3=[2,321],$Vt3=[2,318],$Vu3=[2,319],$Vv3=[2,331],$Vw3=[2,332],$Vx3=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,183],$Vy3=[2,322],$Vz3=[2,324],$VA3=[2,326],$VB3=[2,328],$VC3=[2,323],$VD3=[2,325],$VE3=[2,327],$VF3=[2,329],parser={trace:function(){},yy:{},symbols_:{error:2,Root:3,Body:4,Line:5,TERMINATOR:6,Expression:7,ExpressionLine:8,Statement:9,FuncDirective:10,YieldReturn:11,AwaitReturn:12,Return:13,STATEMENT:14,Import:15,Export:16,Value:17,Code:18,Operation:19,Assign:20,If:21,Try:22,While:23,For:24,Switch:25,Class:26,Throw:27,Yield:28,CodeLine:29,IfLine:30,OperationLine:31,YIELD:32,INDENT:33,Object:34,OUTDENT:35,FROM:36,Block:37,Identifier:38,IDENTIFIER:39,JSX_TAG:40,Property:41,PROPERTY:42,AlphaNumeric:43,NUMBER:44,String:45,STRING:46,STRING_START:47,Interpolations:48,STRING_END:49,InterpolationChunk:50,INTERPOLATION_START:51,INTERPOLATION_END:52,Regex:53,REGEX:54,REGEX_START:55,Invocation:56,REGEX_END:57,Literal:58,JS:59,UNDEFINED:60,NULL:61,BOOL:62,INFINITY:63,NAN:64,Assignable:65,\"=\":66,AssignObj:67,ObjAssignable:68,ObjRestValue:69,\":\":70,SimpleObjAssignable:71,ThisProperty:72,\"[\":73,\"]\":74,\"@\":75,\"...\":76,ObjSpreadExpr:77,ObjSpreadIdentifier:78,Parenthetical:79,Super:80,This:81,SUPER:82,OptFuncExist:83,Arguments:84,DYNAMIC_IMPORT:85,Accessor:86,RETURN:87,AWAIT:88,PARAM_START:89,ParamList:90,PARAM_END:91,FuncGlyph:92,\"->\":93,\"=>\":94,OptComma:95,\",\":96,Param:97,ParamVar:98,Array:99,Splat:100,SimpleAssignable:101,Range:102,DoIife:103,MetaProperty:104,\".\":105,INDEX_START:106,INDEX_END:107,NEW_TARGET:108,IMPORT_META:109,\"?.\":110,\"::\":111,\"?::\":112,Index:113,IndexValue:114,INDEX_SOAK:115,Slice:116,\"{\":117,AssignList:118,\"}\":119,CLASS:120,EXTENDS:121,IMPORT:122,ASSERT:123,ImportDefaultSpecifier:124,ImportNamespaceSpecifier:125,ImportSpecifierList:126,ImportSpecifier:127,AS:128,DEFAULT:129,IMPORT_ALL:130,EXPORT:131,ExportSpecifierList:132,EXPORT_ALL:133,ExportSpecifier:134,FUNC_EXIST:135,CALL_START:136,CALL_END:137,ArgList:138,THIS:139,Elisions:140,ArgElisionList:141,OptElisions:142,RangeDots:143,\"..\":144,Arg:145,ArgElision:146,Elision:147,SimpleArgs:148,TRY:149,Catch:150,FINALLY:151,CATCH:152,THROW:153,\"(\":154,\")\":155,WhileLineSource:156,WHILE:157,WHEN:158,UNTIL:159,WhileSource:160,Loop:161,LOOP:162,ForBody:163,ForLineBody:164,FOR:165,BY:166,ForStart:167,ForSource:168,ForLineSource:169,ForVariables:170,OWN:171,ForValue:172,FORIN:173,FOROF:174,FORFROM:175,SWITCH:176,Whens:177,ELSE:178,When:179,LEADING_WHEN:180,IfBlock:181,IF:182,POST_IF:183,IfBlockLine:184,UNARY:185,DO:186,DO_IIFE:187,UNARY_MATH:188,\"-\":189,\"+\":190,\"--\":191,\"++\":192,\"?\":193,MATH:194,\"**\":195,SHIFT:196,COMPARE:197,\"&\":198,\"^\":199,\"|\":200,\"&&\":201,\"||\":202,\"BIN?\":203,RELATION:204,COMPOUND_ASSIGN:205,$accept:0,$end:1},terminals_:{2:\"error\",6:\"TERMINATOR\",14:\"STATEMENT\",32:\"YIELD\",33:\"INDENT\",35:\"OUTDENT\",36:\"FROM\",39:\"IDENTIFIER\",40:\"JSX_TAG\",42:\"PROPERTY\",44:\"NUMBER\",46:\"STRING\",47:\"STRING_START\",49:\"STRING_END\",51:\"INTERPOLATION_START\",52:\"INTERPOLATION_END\",54:\"REGEX\",55:\"REGEX_START\",57:\"REGEX_END\",59:\"JS\",60:\"UNDEFINED\",61:\"NULL\",62:\"BOOL\",63:\"INFINITY\",64:\"NAN\",66:\"=\",70:\":\",73:\"[\",74:\"]\",75:\"@\",76:\"...\",82:\"SUPER\",85:\"DYNAMIC_IMPORT\",87:\"RETURN\",88:\"AWAIT\",89:\"PARAM_START\",91:\"PARAM_END\",93:\"->\",94:\"=>\",96:\",\",105:\".\",106:\"INDEX_START\",107:\"INDEX_END\",108:\"NEW_TARGET\",109:\"IMPORT_META\",110:\"?.\",111:\"::\",112:\"?::\",115:\"INDEX_SOAK\",117:\"{\",119:\"}\",120:\"CLASS\",121:\"EXTENDS\",122:\"IMPORT\",123:\"ASSERT\",128:\"AS\",129:\"DEFAULT\",130:\"IMPORT_ALL\",131:\"EXPORT\",133:\"EXPORT_ALL\",135:\"FUNC_EXIST\",136:\"CALL_START\",137:\"CALL_END\",139:\"THIS\",144:\"..\",149:\"TRY\",151:\"FINALLY\",152:\"CATCH\",153:\"THROW\",154:\"(\",155:\")\",157:\"WHILE\",158:\"WHEN\",159:\"UNTIL\",162:\"LOOP\",165:\"FOR\",166:\"BY\",171:\"OWN\",173:\"FORIN\",174:\"FOROF\",175:\"FORFROM\",176:\"SWITCH\",178:\"ELSE\",180:\"LEADING_WHEN\",182:\"IF\",183:\"POST_IF\",185:\"UNARY\",186:\"DO\",187:\"DO_IIFE\",188:\"UNARY_MATH\",189:\"-\",190:\"+\",191:\"--\",192:\"++\",193:\"?\",194:\"MATH\",195:\"**\",196:\"SHIFT\",197:\"COMPARE\",198:\"&\",199:\"^\",200:\"|\",201:\"&&\",202:\"||\",203:\"BIN?\",204:\"RELATION\",205:\"COMPOUND_ASSIGN\"},productions_:[0,[3,0],[3,1],[4,1],[4,3],[4,2],[5,1],[5,1],[5,1],[5,1],[10,1],[10,1],[9,1],[9,1],[9,1],[9,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[8,1],[8,1],[8,1],[28,1],[28,2],[28,4],[28,3],[37,2],[37,3],[38,1],[38,1],[41,1],[43,1],[43,1],[45,1],[45,3],[48,1],[48,2],[50,3],[50,5],[50,2],[50,1],[53,1],[53,3],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[20,3],[20,4],[20,5],[67,1],[67,1],[67,3],[67,5],[67,3],[67,5],[71,1],[71,1],[71,1],[68,1],[68,3],[68,4],[68,1],[69,2],[69,2],[69,2],[69,2],[77,1],[77,1],[77,1],[77,1],[77,1],[77,3],[77,2],[77,3],[77,3],[78,2],[78,2],[13,2],[13,4],[13,1],[11,3],[11,2],[12,3],[12,2],[18,5],[18,2],[29,5],[29,2],[92,1],[92,1],[95,0],[95,1],[90,0],[90,1],[90,3],[90,4],[90,6],[97,1],[97,2],[97,2],[97,3],[97,1],[98,1],[98,1],[98,1],[98,1],[100,2],[100,2],[101,1],[101,2],[101,2],[101,1],[65,1],[65,1],[65,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[80,3],[80,4],[80,6],[104,3],[104,3],[86,2],[86,2],[86,2],[86,2],[86,1],[86,1],[86,1],[113,3],[113,5],[113,2],[114,1],[114,1],[34,4],[118,0],[118,1],[118,3],[118,4],[118,6],[26,1],[26,2],[26,3],[26,4],[26,2],[26,3],[26,4],[26,5],[15,2],[15,4],[15,4],[15,6],[15,4],[15,6],[15,5],[15,7],[15,7],[15,9],[15,6],[15,8],[15,9],[15,11],[126,1],[126,3],[126,4],[126,4],[126,6],[127,1],[127,3],[127,1],[127,3],[124,1],[125,3],[16,3],[16,5],[16,2],[16,4],[16,5],[16,6],[16,3],[16,5],[16,4],[16,6],[16,5],[16,7],[16,7],[16,9],[132,1],[132,3],[132,4],[132,4],[132,6],[134,1],[134,3],[134,3],[134,1],[134,3],[56,3],[56,3],[56,3],[56,2],[83,0],[83,1],[84,2],[84,4],[81,1],[81,1],[72,2],[99,2],[99,3],[99,4],[143,1],[143,1],[102,5],[102,5],[116,3],[116,2],[116,3],[116,2],[116,2],[116,1],[138,1],[138,3],[138,4],[138,4],[138,6],[145,1],[145,1],[145,1],[145,1],[141,1],[141,3],[141,4],[141,4],[141,6],[146,1],[146,2],[142,1],[142,2],[140,1],[140,2],[147,1],[147,2],[148,1],[148,1],[148,3],[148,3],[22,2],[22,3],[22,4],[22,5],[150,3],[150,3],[150,2],[27,2],[27,4],[79,3],[79,5],[156,2],[156,4],[156,2],[156,4],[160,2],[160,4],[160,4],[160,2],[160,4],[160,4],[23,2],[23,2],[23,2],[23,2],[23,1],[161,2],[161,2],[24,2],[24,2],[24,2],[24,2],[163,2],[163,4],[163,2],[164,4],[164,2],[167,2],[167,3],[167,3],[172,1],[172,1],[172,1],[172,1],[170,1],[170,3],[168,2],[168,2],[168,4],[168,4],[168,4],[168,4],[168,4],[168,4],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,2],[168,4],[168,4],[169,2],[169,2],[169,4],[169,4],[169,4],[169,4],[169,4],[169,4],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,2],[169,4],[169,4],[25,5],[25,5],[25,7],[25,7],[25,4],[25,6],[177,1],[177,2],[179,3],[179,4],[181,3],[181,5],[21,1],[21,3],[21,3],[21,3],[184,3],[184,5],[30,1],[30,3],[30,3],[30,3],[31,2],[31,2],[31,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,4],[19,2],[19,2],[19,2],[19,2],[19,2],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,5],[19,4],[103,2]],performAction:function(yytext,yyleng,yylineno,yy,yystate,$$,_$){var $0=$$.length-1;switch(yystate){case 1:return this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Root(new yy.Block()));break;case 2:return this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Root($$[$0]));break;case 3:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(yy.Block.wrap([$$[$0]]));break;case 4:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-2].push($$[$0]));break;case 5:this.$=$$[$0-1];break;case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 41:case 52:case 54:case 64:case 69:case 70:case 71:case 72:case 75:case 80:case 81:case 82:case 83:case 84:case 104:case 105:case 116:case 117:case 118:case 119:case 125:case 126:case 129:case 135:case 149:case 247:case 248:case 249:case 251:case 264:case 265:case 308:case 309:case 364:case 370:this.$=$$[$0];break;case 13:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.StatementLiteral($$[$0]));break;case 31:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Op($$[$0],new yy.Value(new yy.Literal(\"\"))));break;case 32:case 374:case 375:case 376:case 378:case 379:case 382:case 405:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1],$$[$0]));break;case 33:case 383:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Op($$[$0-3],$$[$0-1]));break;case 34:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op($$[$0-2].concat($$[$0-1]),$$[$0]));break;case 35:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Block);break;case 36:case 150:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-1]);break;case 37:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.IdentifierLiteral($$[$0]));break;case 38:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(function(){var ref,ref1,ref2,ref3;return new yy.JSXTag($$[$0].toString(),{tagNameLocationData:$$[$0].tagNameToken[2],closingTagOpeningBracketLocationData:null==(ref=$$[$0].closingTagOpeningBracketToken)?void 0:ref[2],closingTagSlashLocationData:null==(ref1=$$[$0].closingTagSlashToken)?void 0:ref1[2],closingTagNameLocationData:null==(ref2=$$[$0].closingTagNameToken)?void 0:ref2[2],closingTagClosingBracketLocationData:null==(ref3=$$[$0].closingTagClosingBracketToken)?void 0:ref3[2]})}());break;case 39:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.PropertyName($$[$0].toString()));break;case 40:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.NumberLiteral($$[$0].toString(),{parsedValue:$$[$0].parsedValue}));break;case 42:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.StringLiteral($$[$0].slice(1,-1),{quote:$$[$0].quote,initialChunk:$$[$0].initialChunk,finalChunk:$$[$0].finalChunk,indent:$$[$0].indent,double:$$[$0].double,heregex:$$[$0].heregex}));break;case 43:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.StringWithInterpolations(yy.Block.wrap($$[$0-1]),{quote:$$[$0-2].quote,startQuote:yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Literal($$[$0-2].toString()))}));break;case 44:case 107:case 157:case 183:case 208:case 242:case 256:case 260:case 312:case 358:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)([$$[$0]]);break;case 45:case 257:case 261:case 359:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].concat($$[$0]));break;case 46:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Interpolation($$[$0-1]));break;case 47:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Interpolation($$[$0-2]));break;case 48:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Interpolation);break;case 49:case 293:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)($$[$0]);break;case 50:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.RegexLiteral($$[$0].toString(),{delimiter:$$[$0].delimiter,heregexCommentTokens:$$[$0].heregexCommentTokens}));break;case 51:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.RegexWithInterpolations($$[$0-1],{heregexCommentTokens:$$[$0].heregexCommentTokens}));break;case 53:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.PassthroughLiteral($$[$0].toString(),{here:$$[$0].here,generated:$$[$0].generated}));break;case 55:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.UndefinedLiteral($$[$0]));break;case 56:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.NullLiteral($$[$0]));break;case 57:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.BooleanLiteral($$[$0].toString(),{originalValue:$$[$0].original}));break;case 58:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.InfinityLiteral($$[$0].toString(),{originalValue:$$[$0].original}));break;case 59:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.NaNLiteral($$[$0]));break;case 60:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-2],$$[$0]));break;case 61:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-3],$$[$0]));break;case 62:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-4],$$[$0-1]));break;case 63:case 122:case 127:case 128:case 130:case 131:case 132:case 133:case 134:case 136:case 137:case 310:case 311:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Value($$[$0]));break;case 65:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Value($$[$0-2])),$$[$0],\"object\",{operatorToken:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 66:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Value($$[$0-4])),$$[$0-1],\"object\",{operatorToken:yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.Literal($$[$0-3]))}));break;case 67:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Value($$[$0-2])),$$[$0],null,{operatorToken:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 68:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Value($$[$0-4])),$$[$0-1],null,{operatorToken:yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.Literal($$[$0-3]))}));break;case 73:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Value(new yy.ComputedPropertyName($$[$0-1])));break;case 74:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Value(yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.ThisLiteral($$[$0-3])),[yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.ComputedPropertyName($$[$0-1]))],\"this\"));break;case 76:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat(new yy.Value($$[$0-1])));break;case 77:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat(new yy.Value($$[$0]),{postfix:!1}));break;case 78:case 120:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat($$[$0-1]));break;case 79:case 121:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat($$[$0],{postfix:!1}));break;case 85:case 220:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.SuperCall(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Super),$$[$0],$$[$0-1].soak,$$[$0-2]));break;case 86:case 221:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.DynamicImportCall(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.DynamicImport),$$[$0]));break;case 87:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Call(new yy.Value($$[$0-2]),$$[$0],$$[$0-1].soak));break;case 88:case 219:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Call($$[$0-2],$$[$0],$$[$0-1].soak));break;case 89:case 90:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Value($$[$0-1]).add($$[$0]));break;case 91:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Return($$[$0]));break;case 92:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Return(new yy.Value($$[$0-1])));break;case 93:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Return);break;case 94:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.YieldReturn($$[$0],{returnKeyword:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 95:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.YieldReturn(null,{returnKeyword:yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Literal($$[$0]))}));break;case 96:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.AwaitReturn($$[$0],{returnKeyword:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 97:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.AwaitReturn(null,{returnKeyword:yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Literal($$[$0]))}));break;case 98:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Code($$[$0-3],$$[$0],$$[$0-1],yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Literal($$[$0-4]))));break;case 99:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Code([],$$[$0],$$[$0-1]));break;case 100:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Code($$[$0-3],yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(yy.Block.wrap([$$[$0]])),$$[$0-1],yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Literal($$[$0-4]))));break;case 101:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Code([],yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(yy.Block.wrap([$$[$0]])),$$[$0-1]));break;case 102:case 103:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.FuncGlyph($$[$0]));break;case 106:case 156:case 258:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)([]);break;case 108:case 158:case 184:case 209:case 243:case 252:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-2].concat($$[$0]));break;case 109:case 159:case 185:case 210:case 244:case 253:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)($$[$0-3].concat($$[$0]));break;case 110:case 160:case 187:case 212:case 246:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)($$[$0-5].concat($$[$0-2]));break;case 111:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Param($$[$0]));break;case 112:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Param($$[$0-1],null,!0));break;case 113:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Param($$[$0],null,{postfix:!1}));break;case 114:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Param($$[$0-2],$$[$0]));break;case 115:case 250:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Expansion);break;case 123:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].add($$[$0]));break;case 124:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Value($$[$0-1]).add($$[$0]));break;case 138:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Super(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0])),yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Literal($$[$0-2]))));break;case 139:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Super(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Index($$[$0-1])),yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.Literal($$[$0-3]))));break;case 140:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.Super(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Index($$[$0-2])),yy.addDataToNode(yy,_$[$0-5],$$[$0-5],null,null,!0)(new yy.Literal($$[$0-5]))));break;case 141:case 142:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.MetaProperty(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.IdentifierLiteral($$[$0-2])),yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))));break;case 143:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Access($$[$0]));break;case 144:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Access($$[$0],{soak:!0}));break;case 145:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0})),yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))]);break;case 146:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0,soak:!0})),yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))]);break;case 147:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0}));break;case 148:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0,soak:!0}));break;case 151:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)($$[$0-2]);break;case 152:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(yy.extend($$[$0],{soak:!0}));break;case 153:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Index($$[$0]));break;case 154:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Slice($$[$0]));break;case 155:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Obj($$[$0-2],$$[$0-3].generated));break;case 161:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Class);break;case 162:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Class(null,null,$$[$0]));break;case 163:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Class(null,$$[$0]));break;case 164:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Class(null,$$[$0-1],$$[$0]));break;case 165:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Class($$[$0]));break;case 166:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Class($$[$0-1],null,$$[$0]));break;case 167:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Class($$[$0-2],$$[$0]));break;case 168:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Class($$[$0-3],$$[$0-1],$$[$0]));break;case 169:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(null,$$[$0]));break;case 170:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(null,$$[$0-2],$$[$0]));break;case 171:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-2],null),$$[$0]));break;case 172:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-4],null),$$[$0-2],$$[$0]));break;case 173:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,$$[$0-2]),$$[$0]));break;case 174:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,$$[$0-4]),$$[$0-2],$$[$0]));break;case 175:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList([])),$$[$0]));break;case 176:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList([])),$$[$0-2],$$[$0]));break;case 177:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList($$[$0-4])),$$[$0]));break;case 178:this.$=yy.addDataToNode(yy,_$[$0-8],$$[$0-8],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList($$[$0-6])),$$[$0-2],$$[$0]));break;case 179:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-4],$$[$0-2]),$$[$0]));break;case 180:this.$=yy.addDataToNode(yy,_$[$0-7],$$[$0-7],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-6],$$[$0-4]),$$[$0-2],$$[$0]));break;case 181:this.$=yy.addDataToNode(yy,_$[$0-8],$$[$0-8],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-7],new yy.ImportSpecifierList($$[$0-4])),$$[$0]));break;case 182:this.$=yy.addDataToNode(yy,_$[$0-10],$$[$0-10],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-9],new yy.ImportSpecifierList($$[$0-6])),$$[$0-2],$$[$0]));break;case 186:case 211:case 245:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)($$[$0-2]);break;case 188:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ImportSpecifier($$[$0]));break;case 189:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ImportSpecifier($$[$0-2],$$[$0]));break;case 190:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ImportSpecifier(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.DefaultLiteral($$[$0]))));break;case 191:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ImportSpecifier(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.DefaultLiteral($$[$0-2])),$$[$0]));break;case 192:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ImportDefaultSpecifier($$[$0]));break;case 193:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ImportNamespaceSpecifier(new yy.Literal($$[$0-2]),$$[$0]));break;case 194:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([])));break;case 195:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-2])));break;case 196:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration($$[$0]));break;case 197:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-2],$$[$0],null,{moduleDeclaration:\"export\"}))));break;case 198:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-3],$$[$0],null,{moduleDeclaration:\"export\"}))));break;case 199:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-4],$$[$0-1],null,{moduleDeclaration:\"export\"}))));break;case 200:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportDefaultDeclaration($$[$0]));break;case 201:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportDefaultDeclaration(new yy.Value($$[$0-1])));break;case 202:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ExportAllDeclaration(new yy.Literal($$[$0-2]),$$[$0]));break;case 203:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ExportAllDeclaration(new yy.Literal($$[$0-4]),$$[$0-2],$$[$0]));break;case 204:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([]),$$[$0]));break;case 205:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([]),$$[$0-2],$$[$0]));break;case 206:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-4]),$$[$0]));break;case 207:this.$=yy.addDataToNode(yy,_$[$0-8],$$[$0-8],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-6]),$$[$0-2],$$[$0]));break;case 213:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ExportSpecifier($$[$0]));break;case 214:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportSpecifier($$[$0-2],$$[$0]));break;case 215:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportSpecifier($$[$0-2],yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.DefaultLiteral($$[$0]))));break;case 216:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ExportSpecifier(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.DefaultLiteral($$[$0]))));break;case 217:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportSpecifier(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.DefaultLiteral($$[$0-2])),$$[$0]));break;case 218:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.TaggedTemplateCall($$[$0-2],$$[$0],$$[$0-1].soak));break;case 222:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({soak:!1});break;case 223:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({soak:!0});break;case 224:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([]);break;case 225:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(function(){return $$[$0-2].implicit=$$[$0-3].generated,$$[$0-2]}());break;case 226:case 227:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Value(new yy.ThisLiteral($$[$0])));break;case 228:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Value(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.ThisLiteral($$[$0-1])),[yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))],\"this\"));break;case 229:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Arr([]));break;case 230:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Arr($$[$0-1]));break;case 231:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Arr([].concat($$[$0-2],$$[$0-1])));break;case 232:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({exclusive:!1});break;case 233:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({exclusive:!0});break;case 234:case 235:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Range($$[$0-3],$$[$0-1],$$[$0-2].exclusive?\"exclusive\":\"inclusive\"));break;case 236:case 238:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Range($$[$0-2],$$[$0],$$[$0-1].exclusive?\"exclusive\":\"inclusive\"));break;case 237:case 239:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Range($$[$0-1],null,$$[$0].exclusive?\"exclusive\":\"inclusive\"));break;case 240:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Range(null,$$[$0],$$[$0-1].exclusive?\"exclusive\":\"inclusive\"));break;case 241:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Range(null,null,$$[$0].exclusive?\"exclusive\":\"inclusive\"));break;case 254:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)($$[$0-2].concat($$[$0-1]));break;case 255:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)($$[$0-5].concat($$[$0-4],$$[$0-2],$$[$0-1]));break;case 259:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([].concat($$[$0]));break;case 262:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Elision);break;case 263:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1]);break;case 266:case 267:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)([].concat($$[$0-2],$$[$0]));break;case 268:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Try($$[$0]));break;case 269:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Try($$[$0-1],$$[$0]));break;case 270:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Try($$[$0-2],null,$$[$0],yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))));break;case 271:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Try($$[$0-3],$$[$0-2],$$[$0],yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))));break;case 272:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Catch($$[$0],$$[$0-1]));break;case 273:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Catch($$[$0],yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Value($$[$0-1]))));break;case 274:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Catch($$[$0]));break;case 275:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Throw($$[$0]));break;case 276:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Throw(new yy.Value($$[$0-1])));break;case 277:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Parens($$[$0-1]));break;case 278:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Parens($$[$0-2]));break;case 279:case 283:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While($$[$0]));break;case 280:case 284:case 285:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.While($$[$0-2],{guard:$$[$0]}));break;case 281:case 286:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While($$[$0],{invert:!0}));break;case 282:case 287:case 288:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.While($$[$0-2],{invert:!0,guard:$$[$0]}));break;case 289:case 290:case 298:case 299:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].addBody($$[$0]));break;case 291:case 292:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(Object.assign($$[$0],{postfix:!0}).addBody(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(yy.Block.wrap([$$[$0-1]]))));break;case 294:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.BooleanLiteral(\"true\")),{isLoop:!0}).addBody($$[$0]));break;case 295:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.BooleanLiteral(\"true\")),{isLoop:!0}).addBody(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(yy.Block.wrap([$$[$0]]))));break;case 296:case 297:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(function(){return $$[$0].postfix=!0,$$[$0].addBody($$[$0-1])}());break;case 300:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.For([],{source:yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Value($$[$0]))}));break;case 301:case 303:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.For([],{source:yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Value($$[$0-2])),step:$$[$0]}));break;case 302:case 304:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].addSource($$[$0]));break;case 305:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.For([],{name:$$[$0][0],index:$$[$0][1]}));break;case 306:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(function(){var _$$$$=_slicedToArray($$[$0],2),index,name;return name=_$$$$[0],index=_$$$$[1],new yy.For([],{name:name,index:index,await:!0,awaitTag:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))})}());break;case 307:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(function(){var _$$$$2=_slicedToArray($$[$0],2),index,name;return name=_$$$$2[0],index=_$$$$2[1],new yy.For([],{name:name,index:index,own:!0,ownTag:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))})}());break;case 313:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)([$$[$0-2],$$[$0]]);break;case 314:case 333:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)({source:$$[$0]});break;case 315:case 334:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)({source:$$[$0],object:!0});break;case 316:case 317:case 335:case 336:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],guard:$$[$0]});break;case 318:case 319:case 337:case 338:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],guard:$$[$0],object:!0});break;case 320:case 321:case 339:case 340:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],step:$$[$0]});break;case 322:case 323:case 324:case 325:case 341:case 342:case 343:case 344:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)({source:$$[$0-4],guard:$$[$0-2],step:$$[$0]});break;case 326:case 327:case 328:case 329:case 345:case 346:case 347:case 348:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)({source:$$[$0-4],step:$$[$0-2],guard:$$[$0]});break;case 330:case 349:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)({source:$$[$0],from:!0});break;case 331:case 332:case 350:case 351:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],guard:$$[$0],from:!0});break;case 352:case 353:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Switch($$[$0-3],$$[$0-1]));break;case 354:case 355:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.Switch($$[$0-5],$$[$0-3],yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0-1],$$[$0-1],!0)($$[$0-1])));break;case 356:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Switch(null,$$[$0-1]));break;case 357:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.Switch(null,$$[$0-3],yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0-1],$$[$0-1],!0)($$[$0-1])));break;case 360:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.SwitchWhen($$[$0-1],$$[$0]));break;case 361:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!1)(yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0-1],$$[$0-1],!0)(new yy.SwitchWhen($$[$0-2],$$[$0-1])));break;case 362:case 368:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.If($$[$0-1],$$[$0],{type:$$[$0-2]}));break;case 363:case 369:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)($$[$0-4].addElse(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.If($$[$0-1],$$[$0],{type:$$[$0-2]}))));break;case 365:case 371:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-2].addElse($$[$0]));break;case 366:case 367:case 372:case 373:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.If($$[$0],yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(yy.Block.wrap([$$[$0-2]])),{type:$$[$0-1],postfix:!0}));break;case 377:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1].toString(),$$[$0],void 0,void 0,{originalOperator:$$[$0-1].original}));break;case 380:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"-\",$$[$0]));break;case 381:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"+\",$$[$0]));break;case 384:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"--\",$$[$0]));break;case 385:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"++\",$$[$0]));break;case 386:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"--\",$$[$0-1],null,!0));break;case 387:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"++\",$$[$0-1],null,!0));break;case 388:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Existence($$[$0-1]));break;case 389:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op(\"+\",$$[$0-2],$$[$0]));break;case 390:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op(\"-\",$$[$0-2],$$[$0]));break;case 391:case 392:case 393:case 395:case 396:case 397:case 400:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1],$$[$0-2],$$[$0]));break;case 394:case 398:case 399:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1].toString(),$$[$0-2],$$[$0],void 0,{originalOperator:$$[$0-1].original}));break;case 401:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(function(){var ref,ref1;return new yy.Op($$[$0-1].toString(),$$[$0-2],$$[$0],void 0,{invertOperator:null==(ref=null==(ref1=$$[$0-1].invert)?void 0:ref1.original)?$$[$0-1].invert:ref})}());break;case 402:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-2],$$[$0],$$[$0-1].toString(),{originalContext:$$[$0-1].original}));break;case 403:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-4],$$[$0-1],$$[$0-3].toString(),{originalContext:$$[$0-3].original}));break;case 404:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-3],$$[$0],$$[$0-2].toString(),{originalContext:$$[$0-2].original}));}},table:[{1:[2,1],3:1,4:2,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{1:[3]},{1:[2,2],6:$VM},o($VN,[2,3]),o($VO,[2,6],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,7]),o($VO,[2,8],{167:123,160:125,163:126,157:$VP,159:$VQ,165:$VR,183:$V51}),o($VO,[2,9]),o($V61,[2,16],{83:127,86:128,113:134,46:$V71,47:$V71,136:$V71,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1}),o($V61,[2,17],{113:134,86:137,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1}),o($V61,[2,18]),o($V61,[2,19]),o($V61,[2,20]),o($V61,[2,21]),o($V61,[2,22]),o($V61,[2,23]),o($V61,[2,24]),o($V61,[2,25]),o($V61,[2,26]),o($V61,[2,27]),o($VO,[2,28]),o($VO,[2,29]),o($VO,[2,30]),o($Vf1,[2,12]),o($Vf1,[2,13]),o($Vf1,[2,14]),o($Vf1,[2,15]),o($VO,[2,10]),o($VO,[2,11]),o($Vg1,$Vh1,{66:[1,138]}),o($Vg1,[2,130]),o($Vg1,[2,131]),o($Vg1,[2,132]),o($Vg1,$Vi1),o($Vg1,[2,134]),o($Vg1,[2,135]),o($Vg1,[2,136]),o($Vg1,[2,137]),o($Vj1,$Vk1,{90:139,97:140,98:141,38:143,72:144,99:145,34:146,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{5:150,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:$Vo1,34:66,37:149,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:152,8:153,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:157,8:158,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:159,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:167,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:168,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:169,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vw1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:[1,171],88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:172,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:176,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},o($Vx1,$Vy1,{191:[1,177],192:[1,178],205:[1,179]}),o($V61,[2,364],{178:[1,180]}),{33:$Vo1,37:181},{33:$Vo1,37:182},{33:$Vo1,37:183},o($V61,[2,293]),{33:$Vo1,37:184},{33:$Vo1,37:185},{7:186,8:187,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:[1,188],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz1,[2,161],{58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,99:65,34:66,43:67,53:69,38:85,72:86,45:95,92:161,17:173,18:174,65:175,37:189,101:191,33:$Vo1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,121:[1,190],139:$Vu,154:$Vx,187:$Vv1}),{7:192,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,193],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,35,52,74,76,96,137,144,155,157,158,159,165,166,183,193,194,195,196,197,198,199,200,201,202,203,204],$VA1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:194,14:$V0,32:$Vp1,33:$VB1,36:$VC1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:[1,197],88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VO,[2,370],{178:[1,198]}),{18:200,29:199,89:$Vl,92:39,93:$Vm,94:$Vn},o([1,6,35,52,74,76,96,137,144,155,157,158,159,165,166,183],$VD1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:201,14:$V0,32:$Vp1,33:$VE1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{38:207,39:$V2,40:$V3,45:203,46:$V5,47:$V6,117:[1,206],124:204,125:205,130:$VF1},{26:210,38:211,39:$V2,40:$V3,117:[1,209],120:$Vr,129:[1,212],133:[1,213]},o($Vx1,[2,127]),o($Vx1,[2,128]),o($Vg1,[2,52]),o($Vg1,[2,53]),o($Vg1,[2,54]),o($Vg1,[2,55]),o($Vg1,[2,56]),o($Vg1,[2,57]),o($Vg1,[2,58]),o($Vg1,[2,59]),{4:214,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:[1,215],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:216,8:217,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:$VH1,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:219,141:220,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{83:228,105:$VK1,106:$VL1,135:$Ve1,136:$V71},{84:231,136:$VM1},o($Vg1,[2,226]),o($Vg1,$VN1,{41:233,42:$VO1}),{105:[1,235]},{105:[1,236]},o($VP1,[2,102]),o($VP1,[2,103]),o($VQ1,[2,122]),o($VQ1,[2,125]),{7:237,8:238,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:239,8:240,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:241,8:242,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:244,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vo1,34:66,37:243,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vf,75:$Vm1,88:$VR1,99:252,102:245,117:$Vq,170:246,171:$VS1,172:249},{168:254,169:255,173:[1,256],174:[1,257],175:[1,258]},o([6,33,96,119],$VT1,{45:95,118:259,67:260,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),o($VZ1,[2,40]),o($VZ1,[2,41]),o($Vg1,[2,50]),{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:279,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:280,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},o($V_1,[2,37]),o($V_1,[2,38]),o($V$1,[2,42]),{45:284,46:$V5,47:$V6,48:281,50:282,51:$V02},o($VN,[2,5],{7:4,8:5,9:6,10:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,11:27,12:28,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,5:285,14:$V0,32:$V1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V61,[2,388]),{7:286,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:287,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:288,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:289,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:290,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:291,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:292,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:293,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:294,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:295,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:296,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:297,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:298,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:299,8:300,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,292]),o($V61,[2,297]),{7:239,8:301,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:241,8:302,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vf,75:$Vm1,88:$VR1,99:252,102:303,117:$Vq,170:246,171:$VS1,172:249},{168:254,173:[1,304],174:[1,305],175:[1,306]},{7:307,8:308,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,291]),o($V61,[2,296]),{45:309,46:$V5,47:$V6,84:310,136:$VM1},o($VQ1,[2,123]),o($V12,[2,223]),{41:311,42:$VO1},{41:312,42:$VO1},o($VQ1,[2,147],{41:313,42:$VO1}),o($VQ1,[2,148],{41:314,42:$VO1}),o($VQ1,[2,149]),{7:317,8:319,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:[1,316],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$V22,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,114:315,116:318,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,143:320,144:$V32,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{106:$V91,113:323,115:$Vd1},o($VQ1,[2,124]),{6:[1,325],7:324,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,326],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V42,$V52,{95:329,91:[1,327],96:$V62}),o($V72,[2,107]),o($V72,[2,111],{66:[1,331],76:[1,330]}),o($V72,[2,115],{38:143,72:144,99:145,34:146,98:332,39:$V2,40:$V3,73:$Vl1,75:$Vm1,117:$Vq}),o($V82,[2,116]),o($V82,[2,117]),o($V82,[2,118]),o($V82,[2,119]),{41:233,42:$VO1},{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:$VH1,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:219,141:220,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vg1,[2,99]),o($VO,[2,101]),{4:336,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,35:[1,335],38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V92,$Va2,{160:118,163:119,167:123,193:$VV}),o($VO,[2,374]),{7:169,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vw1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{157:$VP,159:$VQ,160:125,163:126,165:$VR,167:123,183:$V51},o([1,6,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,193,194,195,196,197,198,199,200,201,202,203,204],$VA1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:194,14:$V0,32:$Vp1,33:$VB1,36:$VC1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V92,$Vb2,{160:118,163:119,167:123,193:$VV}),o($VO,[2,375]),o($Vc2,[2,379],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vj1,$Vk1,{97:140,98:141,38:143,72:144,99:145,34:146,90:338,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{33:$Vo1,37:149},{7:339,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:340,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{157:$VP,159:$VQ,160:125,163:126,165:$VR,167:123,183:[1,341]},{18:200,89:$Vr1,92:161,93:$Vm,94:$Vn},{7:342,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vc2,[2,380],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vc2,[2,381],{160:118,163:119,167:123,193:$VV,195:$VX}),o($V92,[2,382],{160:118,163:119,167:123,193:$VV}),{34:343,117:$Vq},o($VO,[2,97],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:344,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$VD1,159:$VD1,165:$VD1,183:$VD1,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V61,[2,384],{46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1}),o($V12,$V71,{83:127,86:128,113:134,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1}),{86:137,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,113:134,115:$Vd1},o($Vd2,$Vh1),o($V61,[2,385],{46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1}),o($V61,[2,386]),o($V61,[2,387]),{6:[1,347],7:345,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,346],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$Vo1,37:348,182:[1,349]},o($V61,[2,268],{150:350,151:[1,351],152:[1,352]}),o($V61,[2,289]),o($V61,[2,290]),o($V61,[2,298]),o($V61,[2,299]),{33:[1,353],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[1,354]},{177:355,179:356,180:$Ve2},o($V61,[2,162]),{7:358,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz1,[2,165],{37:359,33:$Vo1,46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1,121:[1,360]}),o($Vf2,[2,275],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:361,117:$Vq},o($Vf2,[2,32],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:362,117:$Vq},{7:363,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,35,52,74,76,96,137,144,155,158,166],[2,95],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:364,14:$V0,32:$Vp1,33:$VE1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$VD1,159:$VD1,165:$VD1,183:$VD1,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{33:$Vo1,37:365,182:[1,366]},o($VO,[2,376]),o($Vg1,[2,405]),o($Vf1,$Vg2,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:367,117:$Vq},o($Vf1,[2,169],{123:[1,368]}),{36:[1,369],96:[1,370]},{36:[1,371]},{33:$Vh2,38:376,39:$V2,40:$V3,119:[1,372],126:373,127:374,129:$Vi2},o([36,96],[2,192]),{128:[1,378]},{33:$Vj2,38:383,39:$V2,40:$V3,119:[1,379],129:$Vk2,132:380,134:381},o($Vf1,[2,196]),{66:[1,385]},{7:386,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,387],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{36:[1,388]},{6:$VM,155:[1,389]},{4:390,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vl2,$Vm2,{160:118,163:119,167:123,143:391,76:[1,392],144:$V32,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vl2,$Vn2,{143:393,76:$V22,144:$V32}),o($Vo2,[2,229]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:[1,394],75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:396,147:395,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([6,33,74],$V52,{142:397,95:399,96:$Vp2}),o($Vq2,[2,260],{6:$Vr2}),o($Vs2,[2,251]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,141:401,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vt2,[2,262]),o($Vs2,[2,256]),o($Vu2,[2,249]),o($Vu2,[2,250],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:403,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{84:404,136:$VM1},{41:405,42:$VO1},{7:406,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,407],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vv2,[2,221]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,137:[1,408],138:409,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vx2,[2,228]),o($Vx2,[2,39]),{41:412,42:$VO1},{41:413,42:$VO1},{33:$Vo1,37:414,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:$Vo1,37:415},o($Vy2,[2,283],{160:118,163:119,167:123,157:$VP,158:[1,416],159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:[2,279],158:[1,417]},o($Vy2,[2,286],{160:118,163:119,167:123,157:$VP,158:[1,418],159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:[2,281],158:[1,419]},o($V61,[2,294]),o($Vz2,[2,295],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$VA2,166:[1,420]},o($VB2,[2,305]),{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,170:421,172:249},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,170:422,172:249},o($VB2,[2,312],{96:[1,423]}),o($VC2,[2,308]),o($VC2,[2,309]),o($VC2,[2,310]),o($VC2,[2,311]),o($V61,[2,302]),{33:[2,304]},{7:424,8:425,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:426,8:427,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:428,8:429,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VD2,$V52,{95:430,96:$VE2}),o($VF2,[2,157]),o($VF2,[2,63],{70:[1,432]}),o($VF2,[2,64]),o($VG2,[2,72],{113:134,83:435,86:436,66:[1,433],76:[1,434],105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),{7:437,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([76,105,106,110,111,112,115,135,136],$VN1,{41:233,42:$VO1,73:[1,438]}),o($VG2,[2,75]),{34:273,38:269,39:$V2,40:$V3,41:270,42:$VO1,71:439,72:271,75:$Vg,77:440,78:272,79:274,80:275,81:276,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx},{76:[1,441],83:442,86:443,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,113:134,115:$Vd1,135:$Ve1,136:$V71},o($VH2,[2,69]),o($VH2,[2,70]),o($VH2,[2,71]),o($VI2,[2,80]),o($VI2,[2,81]),o($VI2,[2,82]),o($VI2,[2,83]),o($VI2,[2,84]),{83:444,105:$VK1,106:$VL1,135:$Ve1,136:$V71},{84:445,136:$VM1},o($Vd2,$Vi1,{57:[1,446]}),o($Vd2,$Vy1),{45:284,46:$V5,47:$V6,49:[1,447],50:448,51:$V02},o($VJ2,[2,44]),{4:449,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:[1,450],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,52:[1,451],53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VJ2,[2,49]),o($VN,[2,4]),o($VK2,[2,389],{160:118,163:119,167:123,193:$VV,194:$VW,195:$VX}),o($VK2,[2,390],{160:118,163:119,167:123,193:$VV,194:$VW,195:$VX}),o($Vc2,[2,391],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vc2,[2,392],{160:118,163:119,167:123,193:$VV,195:$VX}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,196,197,198,199,200,201,202,203,204],[2,393],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,197,198,199,200,201,202,203],[2,394],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,198,199,200,201,202,203],[2,395],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,199,200,201,202,203],[2,396],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,200,201,202,203],[2,397],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,201,202,203],[2,398],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,202,203],[2,399],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,203],[2,400],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,197,198,199,200,201,202,203,204],[2,401],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY}),o($Vz2,$VL2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,373]),{158:[1,452]},{158:[1,453]},o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VA2,{166:[1,454]}),{7:455,8:456,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:457,8:458,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:459,8:460,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz2,$VM2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,372]),o($Vv2,[2,218]),o($Vv2,[2,219]),o($VQ1,[2,143]),o($VQ1,[2,144]),o($VQ1,[2,145]),o($VQ1,[2,146]),{107:[1,461]},{7:317,8:319,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$V22,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,114:462,116:318,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,143:320,144:$V32,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VN2,[2,153],{160:118,163:119,167:123,143:463,76:$V22,144:$V32,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VN2,[2,154]),{76:$V22,143:464,144:$V32},o($VN2,[2,241],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:465,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VO2,[2,232]),o($VO2,$VP2),o($VQ1,[2,152]),o($Vf2,[2,60],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:466,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:467,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{92:468,93:$Vm,94:$Vn},o($VQ2,$VR2,{98:141,38:143,72:144,99:145,34:146,97:469,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{6:$VS2,33:$VT2},o($V72,[2,112]),{7:472,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,113]),o($Vu2,$Vm2,{160:118,163:119,167:123,76:[1,473],157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vu2,$Vn2),o($VU2,[2,35]),{6:$VM,35:[1,474]},{7:475,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V42,$V52,{95:329,91:[1,476],96:$V62}),o($V92,$Va2,{160:118,163:119,167:123,193:$VV}),o($V92,$Vb2,{160:118,163:119,167:123,193:$VV}),{7:477,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$Vo1,37:414,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{35:[1,478]},o($VO,[2,96],{160:118,163:119,167:123,157:$Vg2,159:$Vg2,165:$Vg2,183:$Vg2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,[2,402],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:479,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:480,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,365]),{7:481,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,269],{151:[1,482]}),{33:$Vo1,37:483},{33:$Vo1,34:485,37:486,38:484,39:$V2,40:$V3,117:$Vq},{177:487,179:356,180:$Ve2},{177:488,179:356,180:$Ve2},{35:[1,489],178:[1,490],179:491,180:$Ve2},o($VW2,[2,358]),{7:493,8:494,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,148:492,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VX2,[2,163],{160:118,163:119,167:123,37:495,33:$Vo1,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,166]),{7:496,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,497]},{35:[1,498]},o($Vf2,[2,34],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,94],{160:118,163:119,167:123,157:$Vg2,159:$Vg2,165:$Vg2,183:$Vg2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,371]),{7:500,8:499,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,501]},{34:502,117:$Vq},{45:503,46:$V5,47:$V6},{117:[1,505],125:504,130:$VF1},{45:506,46:$V5,47:$V6},{36:[1,507]},o($VD2,$V52,{95:508,96:$VY2}),o($VF2,[2,183]),{33:$Vh2,38:376,39:$V2,40:$V3,126:510,127:374,129:$Vi2},o($VF2,[2,188],{128:[1,511]}),o($VF2,[2,190],{128:[1,512]}),{38:513,39:$V2,40:$V3},o($Vf1,[2,194],{36:[1,514]}),o($VD2,$V52,{95:515,96:$VZ2}),o($VF2,[2,208]),{33:$Vj2,38:383,39:$V2,40:$V3,129:$Vk2,132:517,134:381},o($VF2,[2,213],{128:[1,518]}),o($VF2,[2,216],{128:[1,519]}),{6:[1,521],7:520,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,522],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V_2,[2,200],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:523,117:$Vq},{45:524,46:$V5,47:$V6},o($Vg1,[2,277]),{6:$VM,35:[1,525]},{7:526,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([14,32,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VP2,{6:$V$2,33:$V$2,74:$V$2,96:$V$2}),{7:527,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vo2,[2,230]),o($Vq2,[2,261],{6:$Vr2}),o($Vs2,[2,257]),{33:$V03,74:[1,528]},o([6,33,35,74],$VR2,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,147:221,145:225,100:226,7:333,8:334,146:530,140:531,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,96:$VJ1,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V13,[2,258],{6:[1,532]}),o($Vt2,[2,263]),o($VQ2,$V52,{95:399,142:533,96:$Vp2}),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:396,147:395,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vu2,[2,121],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vv2,[2,220]),o($Vg1,[2,138]),{107:[1,534],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{7:535,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vv2,[2,224]),o([6,33,137],$V52,{95:536,96:$V23}),o($V33,[2,242]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,138:538,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vg1,[2,141]),o($Vg1,[2,142]),o($V43,[2,362]),o($V53,[2,368]),{7:539,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:540,8:541,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:542,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:543,8:544,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:545,8:546,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VB2,[2,306]),o($VB2,[2,307]),{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,172:547},{33:$V63,157:$VP,158:[1,548],159:$VQ,160:118,163:119,165:$VR,166:[1,549],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,333],158:[1,550],166:[1,551]},{33:$V73,157:$VP,158:[1,552],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,334],158:[1,553]},{33:$V83,157:$VP,158:[1,554],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,349],158:[1,555]},{6:$V93,33:$Va3,119:[1,556]},o($Vb3,$VR2,{45:95,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,67:559,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),{7:560,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,561],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:562,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,563],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,76]),{84:564,136:$VM1},o($VI2,[2,89]),{74:[1,565],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{7:566,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,77],{113:134,83:435,86:436,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),o($VF2,[2,79],{113:134,83:442,86:443,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),o($VF2,[2,78]),{84:567,136:$VM1},o($VI2,[2,90]),{84:568,136:$VM1},o($VI2,[2,86]),o($Vg1,[2,51]),o($V$1,[2,43]),o($VJ2,[2,45]),{6:$VM,52:[1,569]},{4:570,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VJ2,[2,48]),{7:571,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:572,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:573,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,159,165,183],$V63,{160:118,163:119,167:123,158:[1,574],166:[1,575],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,576],166:[1,577]},o($Vc3,$V73,{160:118,163:119,167:123,158:[1,578],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,579]},o($Vc3,$V83,{160:118,163:119,167:123,158:[1,580],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,581]},o($VQ1,[2,150]),{35:[1,582]},o($VN2,[2,237],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:583,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VN2,[2,239],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:584,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VN2,[2,240],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,[2,61],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{35:[1,585],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{5:587,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:$Vo1,34:66,37:586,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,108]),{34:146,38:143,39:$V2,40:$V3,72:144,73:$Vl1,75:$Vm1,76:$Vn1,97:588,98:141,99:145,117:$Vq},o($Vd3,$Vk1,{97:140,98:141,38:143,72:144,99:145,34:146,90:589,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),o($V72,[2,114],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vu2,$V$2),o($VU2,[2,36]),o($Vz2,$VL2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{92:590,93:$Vm,94:$Vn},o($Vz2,$VM2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,383]),{35:[1,591],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf2,[2,404],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vo1,37:592,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:$Vo1,37:593},o($V61,[2,270]),{33:$Vo1,37:594},{33:$Vo1,37:595},o($Ve3,[2,274]),{35:[1,596],178:[1,597],179:491,180:$Ve2},{35:[1,598],178:[1,599],179:491,180:$Ve2},o($V61,[2,356]),{33:$Vo1,37:600},o($VW2,[2,359]),{33:$Vo1,37:601,96:[1,602]},o($Vf3,[2,264],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf3,[2,265]),o($V61,[2,164]),o($VX2,[2,167],{160:118,163:119,167:123,37:603,33:$Vo1,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,276]),o($V61,[2,33]),{33:$Vo1,37:604},{157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf1,[2,92]),o($Vf1,[2,170]),o($Vf1,[2,171],{123:[1,605]}),{36:[1,606]},{33:$Vh2,38:376,39:$V2,40:$V3,126:607,127:374,129:$Vi2},o($Vf1,[2,173],{123:[1,608]}),{45:609,46:$V5,47:$V6},{6:$Vg3,33:$Vh3,119:[1,610]},o($Vb3,$VR2,{38:376,127:613,39:$V2,40:$V3,129:$Vi2}),o($VQ2,$V52,{95:614,96:$VY2}),{38:615,39:$V2,40:$V3},{38:616,39:$V2,40:$V3},{36:[2,193]},{45:617,46:$V5,47:$V6},{6:$Vi3,33:$Vj3,119:[1,618]},o($Vb3,$VR2,{38:383,134:621,39:$V2,40:$V3,129:$Vk2}),o($VQ2,$V52,{95:622,96:$VZ2}),{38:623,39:$V2,40:$V3,129:[1,624]},{38:625,39:$V2,40:$V3},o($V_2,[2,197],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:626,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:627,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,628]},o($Vf1,[2,202],{123:[1,629]}),{155:[1,630]},{74:[1,631],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{74:[1,632],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vo2,[2,231]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,141:633,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vs2,[2,252]),o($V13,[2,259],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,100:226,7:333,8:334,147:395,145:396,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,96:$VJ1,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,145:225,146:634,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$V03,35:[1,635]},o($Vg1,[2,139]),{35:[1,636],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{6:$Vk3,33:$Vl3,137:[1,637]},o([6,33,35,137],$VR2,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,100:226,7:333,8:334,145:640,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VQ2,$V52,{95:641,96:$V23}),o($Vz2,[2,284],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vm3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,280]},o($Vz2,[2,287],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vn3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,282]},{33:$Vo3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,303]},o($VB2,[2,313]),{7:642,8:643,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:644,8:645,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:646,8:647,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:648,8:649,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:650,8:651,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:652,8:653,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:654,8:655,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:656,8:657,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vo2,[2,155]),{34:273,38:269,39:$V2,40:$V3,41:270,42:$VO1,43:266,44:$V4,45:95,46:$V5,47:$V6,67:658,68:261,69:262,71:263,72:271,73:$VU1,75:$VV1,76:$VW1,77:268,78:272,79:274,80:275,81:276,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx},o($Vd3,$VT1,{45:95,67:260,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,118:659,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),o($VF2,[2,158]),o($VF2,[2,65],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:660,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,67],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:661,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VI2,[2,87]),o($VG2,[2,73]),{74:[1,662],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($VI2,[2,88]),o($VI2,[2,85]),o($VJ2,[2,46]),{6:$VM,35:[1,663]},o($Vz2,$Vm3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vz2,$Vn3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vz2,$Vo3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:664,8:665,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:666,8:667,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:668,8:669,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:670,8:671,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:672,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:673,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:674,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:675,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{107:[1,676]},o($VN2,[2,236],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VN2,[2,238],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,62]),o($Vg1,[2,98]),o($VO,[2,100]),o($V72,[2,109]),o($VQ2,$V52,{95:677,96:$V62}),{33:$Vo1,37:586},o($V61,[2,403]),o($V43,[2,363]),o($V61,[2,271]),o($Ve3,[2,272]),o($Ve3,[2,273]),o($V61,[2,352]),{33:$Vo1,37:678},o($V61,[2,353]),{33:$Vo1,37:679},{35:[1,680]},o($VW2,[2,360],{6:[1,681]}),{7:682,8:683,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,168]),o($V53,[2,369]),{34:684,117:$Vq},{45:685,46:$V5,47:$V6},o($VD2,$V52,{95:686,96:$VY2}),{34:687,117:$Vq},o($Vf1,[2,175],{123:[1,688]}),{36:[1,689]},{38:376,39:$V2,40:$V3,127:690,129:$Vi2},{33:$Vh2,38:376,39:$V2,40:$V3,126:691,127:374,129:$Vi2},o($VF2,[2,184]),{6:$Vg3,33:$Vh3,35:[1,692]},o($VF2,[2,189]),o($VF2,[2,191]),o($Vf1,[2,204],{123:[1,693]}),o($Vf1,[2,195],{36:[1,694]}),{38:383,39:$V2,40:$V3,129:$Vk2,134:695},{33:$Vj2,38:383,39:$V2,40:$V3,129:$Vk2,132:696,134:381},o($VF2,[2,209]),{6:$Vi3,33:$Vj3,35:[1,697]},o($VF2,[2,214]),o($VF2,[2,215]),o($VF2,[2,217]),o($V_2,[2,198],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{35:[1,698],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf1,[2,201]),{34:699,117:$Vq},o($Vg1,[2,278]),o($Vg1,[2,234]),o($Vg1,[2,235]),o($VQ2,$V52,{95:399,142:700,96:$Vp2}),o($Vs2,[2,253]),o($Vs2,[2,254]),{107:[1,701]},o($Vv2,[2,225]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:702,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,138:703,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V33,[2,243]),{6:$Vk3,33:$Vl3,35:[1,704]},{33:$Vp3,157:$VP,159:$VQ,160:118,163:119,165:$VR,166:[1,705],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,335],166:[1,706]},{33:$Vq3,157:$VP,158:[1,707],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,339],158:[1,708]},{33:$Vr3,157:$VP,159:$VQ,160:118,163:119,165:$VR,166:[1,709],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,336],166:[1,710]},{33:$Vs3,157:$VP,158:[1,711],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,340],158:[1,712]},{33:$Vt3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,337]},{33:$Vu3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,338]},{33:$Vv3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,350]},{33:$Vw3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,351]},o($VF2,[2,159]),o($VQ2,$V52,{95:713,96:$VE2}),{35:[1,714],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{35:[1,715],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($VG2,[2,74]),{52:[1,716]},o($Vx3,$Vp3,{160:118,163:119,167:123,166:[1,717],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{166:[1,718]},o($Vc3,$Vq3,{160:118,163:119,167:123,158:[1,719],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,720]},o($Vx3,$Vr3,{160:118,163:119,167:123,166:[1,721],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{166:[1,722]},o($Vc3,$Vs3,{160:118,163:119,167:123,158:[1,723],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,724]},o($Vf2,$Vt3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vu3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vv3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vw3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VQ1,[2,151]),{6:$VS2,33:$VT2,35:[1,725]},{35:[1,726]},{35:[1,727]},o($V61,[2,357]),o($VW2,[2,361]),o($Vf3,[2,266],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf3,[2,267]),o($Vf1,[2,172]),o($Vf1,[2,179],{123:[1,728]}),{6:$Vg3,33:$Vh3,119:[1,729]},o($Vf1,[2,174]),{34:730,117:$Vq},{45:731,46:$V5,47:$V6},o($VF2,[2,185]),o($VQ2,$V52,{95:732,96:$VY2}),o($VF2,[2,186]),{34:733,117:$Vq},{45:734,46:$V5,47:$V6},o($VF2,[2,210]),o($VQ2,$V52,{95:735,96:$VZ2}),o($VF2,[2,211]),o($Vf1,[2,199]),o($Vf1,[2,203]),{33:$V03,35:[1,736]},o($Vg1,[2,140]),o($V33,[2,244]),o($VQ2,$V52,{95:737,96:$V23}),o($V33,[2,245]),{7:738,8:739,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:740,8:741,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:742,8:743,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:744,8:745,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:746,8:747,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:748,8:749,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:750,8:751,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:752,8:753,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{6:$V93,33:$Va3,35:[1,754]},o($VF2,[2,66]),o($VF2,[2,68]),o($VJ2,[2,47]),{7:755,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:756,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:757,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:758,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:759,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:760,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:761,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:762,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,110]),o($V61,[2,354]),o($V61,[2,355]),{34:763,117:$Vq},{36:[1,764]},o($Vf1,[2,176]),o($Vf1,[2,177],{123:[1,765]}),{6:$Vg3,33:$Vh3,35:[1,766]},o($Vf1,[2,205]),o($Vf1,[2,206],{123:[1,767]}),{6:$Vi3,33:$Vj3,35:[1,768]},o($Vs2,[2,255]),{6:$Vk3,33:$Vl3,35:[1,769]},{33:$Vy3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,341]},{33:$Vz3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,343]},{33:$VA3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,345]},{33:$VB3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,347]},{33:$VC3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,342]},{33:$VD3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,344]},{33:$VE3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,346]},{33:$VF3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,348]},o($VF2,[2,160]),o($Vf2,$Vy3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vz3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VA3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VB3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VC3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VD3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VE3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VF3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf1,[2,180]),{45:770,46:$V5,47:$V6},{34:771,117:$Vq},o($VF2,[2,187]),{34:772,117:$Vq},o($VF2,[2,212]),o($V33,[2,246]),o($Vf1,[2,181],{123:[1,773]}),o($Vf1,[2,178]),o($Vf1,[2,207]),{34:774,117:$Vq},o($Vf1,[2,182])],defaultActions:{255:[2,304],513:[2,193],541:[2,280],544:[2,282],546:[2,303],651:[2,337],653:[2,338],655:[2,350],657:[2,351],739:[2,341],741:[2,343],743:[2,345],745:[2,347],747:[2,342],749:[2,344],751:[2,346],753:[2,348]},parseError:function(str,hash){if(hash.recoverable)this.trace(str);else{var error=new Error(str);throw error.hash=hash,error}},parse:function(input){var self=this,stack=[0],vstack=[null],lstack=[],table=this.table,yytext=\"\",yylineno=0,yyleng=0,recovering=0,EOF=1,args=lstack.slice.call(arguments,1),lexer=Object.create(this.lexer),sharedState={yy:{}};for(var k in this.yy)Object.prototype.hasOwnProperty.call(this.yy,k)&&(sharedState.yy[k]=this.yy[k]);lexer.setInput(input,sharedState.yy),sharedState.yy.lexer=lexer,sharedState.yy.parser=this,\"undefined\"==typeof lexer.yylloc&&(lexer.yylloc={});var yyloc=lexer.yylloc;lstack.push(yyloc);var ranges=lexer.options&&lexer.options.ranges;this.parseError=\"function\"==typeof sharedState.yy.parseError?sharedState.yy.parseError:Object.getPrototypeOf(this).parseError;_token_stack:var lex=function(){var token;return token=lexer.lex()||EOF,\"number\"!=typeof token&&(token=self.symbols_[token]||token),token};for(var yyval={},symbol,preErrorSymbol,state,action,r,p,len,newState,expected;;){if(state=stack[stack.length-1],this.defaultActions[state]?action=this.defaultActions[state]:((null===symbol||\"undefined\"==typeof symbol)&&(symbol=lex()),action=table[state]&&table[state][symbol]),\"undefined\"==typeof action||!action.length||!action[0]){var errStr=\"\";for(p in expected=[],table[state])this.terminals_[p]&&p>2&&expected.push(\"'\"+this.terminals_[p]+\"'\");errStr=lexer.showPosition?\"Parse error on line \"+(yylineno+1)+\":\\n\"+lexer.showPosition()+\"\\nExpecting \"+expected.join(\", \")+\", got '\"+(this.terminals_[symbol]||symbol)+\"'\":\"Parse error on line \"+(yylineno+1)+\": Unexpected \"+(symbol==EOF?\"end of input\":\"'\"+(this.terminals_[symbol]||symbol)+\"'\"),this.parseError(errStr,{text:lexer.match,token:this.terminals_[symbol]||symbol,line:lexer.yylineno,loc:yyloc,expected:expected})}if(action[0]instanceof Array&&1<action.length)throw new Error(\"Parse Error: multiple actions possible at state: \"+state+\", token: \"+symbol);switch(action[0]){case 1:stack.push(symbol),vstack.push(lexer.yytext),lstack.push(lexer.yylloc),stack.push(action[1]),symbol=null,preErrorSymbol?(symbol=preErrorSymbol,preErrorSymbol=null):(yyleng=lexer.yyleng,yytext=lexer.yytext,yylineno=lexer.yylineno,yyloc=lexer.yylloc,0<recovering&&recovering--);break;case 2:if(len=this.productions_[action[1]][1],yyval.$=vstack[vstack.length-len],yyval._$={first_line:lstack[lstack.length-(len||1)].first_line,last_line:lstack[lstack.length-1].last_line,first_column:lstack[lstack.length-(len||1)].first_column,last_column:lstack[lstack.length-1].last_column},ranges&&(yyval._$.range=[lstack[lstack.length-(len||1)].range[0],lstack[lstack.length-1].range[1]]),r=this.performAction.apply(yyval,[yytext,yyleng,yylineno,sharedState.yy,action[1],vstack,lstack].concat(args)),\"undefined\"!=typeof r)return r;len&&(stack=stack.slice(0,2*(-1*len)),vstack=vstack.slice(0,-1*len),lstack=lstack.slice(0,-1*len)),stack.push(this.productions_[action[1]][0]),vstack.push(yyval.$),lstack.push(yyval._$),newState=table[stack[stack.length-2]][stack[stack.length-1]],stack.push(newState);break;case 3:return!0;}}return!0}};return Parser.prototype=parser,parser.Parser=Parser,new Parser}();return\"undefined\"!=typeof require&&\"undefined\"!=typeof exports&&(exports.parser=parser,exports.Parser=parser.Parser,exports.parse=function(){return parser.parse.apply(parser,arguments)},exports.main=function(){},require.main===module&&exports.main(process.argv.slice(1))),module.exports}(),require[\"./scope\"]=function(){var exports={};return function(){var indexOf=[].indexOf,Scope;exports.Scope=Scope=function(){function Scope(parent,expressions,method,referencedVars){_classCallCheck(this,Scope);var ref,ref1;this.parent=parent,this.expressions=expressions,this.method=method,this.referencedVars=referencedVars,this.variables=[{name:\"arguments\",type:\"arguments\"}],this.comments={},this.positions={},this.parent||(this.utilities={}),this.root=null==(ref=null==(ref1=this.parent)?void 0:ref1.root)?this:ref}return _createClass(Scope,[{key:\"add\",value:function add(name,type,immediate){return this.shared&&!immediate?this.parent.add(name,type,immediate):Object.prototype.hasOwnProperty.call(this.positions,name)?this.variables[this.positions[name]].type=type:this.positions[name]=this.variables.push({name:name,type:type})-1}},{key:\"namedMethod\",value:function namedMethod(){var ref;return(null==(ref=this.method)?void 0:ref.name)||!this.parent?this.method:this.parent.namedMethod()}},{key:\"find\",value:function find(name){var type=1<arguments.length&&void 0!==arguments[1]?arguments[1]:\"var\";return!!this.check(name)||(this.add(name,type),!1)}},{key:\"parameter\",value:function parameter(name){return this.shared&&this.parent.check(name,!0)?void 0:this.add(name,\"param\")}},{key:\"check\",value:function check(name){var ref;return!!(this.type(name)||(null==(ref=this.parent)?void 0:ref.check(name)))}},{key:\"temporary\",value:function temporary(name,index){var single=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],diff,endCode,letter,newCode,num,startCode;return single?(startCode=name.charCodeAt(0),endCode=\"z\".charCodeAt(0),diff=endCode-startCode,newCode=startCode+index%(diff+1),letter=_StringfromCharCode(newCode),num=_Mathfloor(index/(diff+1)),\"\".concat(letter).concat(num||\"\")):\"\".concat(name).concat(index||\"\")}},{key:\"type\",value:function type(name){var i,len,ref,v;for(ref=this.variables,i=0,len=ref.length;i<len;i++)if(v=ref[i],v.name===name)return v.type;return null}},{key:\"freeVariable\",value:function freeVariable(name){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},index,ref,temp;for(index=0;temp=this.temporary(name,index,options.single),!!(this.check(temp)||0<=indexOf.call(this.root.referencedVars,temp));)index++;return(null==(ref=options.reserve)||ref)&&this.add(temp,\"var\",!0),temp}},{key:\"assign\",value:function assign(name,value){return this.add(name,{value:value,assigned:!0},!0),this.hasAssignments=!0}},{key:\"hasDeclarations\",value:function hasDeclarations(){return!!this.declaredVariables().length}},{key:\"declaredVariables\",value:function declaredVariables(){var v;return function(){var i,len,ref,results;for(ref=this.variables,results=[],(i=0,len=ref.length);i<len;i++)v=ref[i],\"var\"===v.type&&results.push(v.name);return results}.call(this).sort()}},{key:\"assignedVariables\",value:function assignedVariables(){var i,len,ref,results,v;for(ref=this.variables,results=[],(i=0,len=ref.length);i<len;i++)v=ref[i],v.type.assigned&&results.push(\"\".concat(v.name,\" = \").concat(v.type.value));return results}}]),Scope}()}.call(this),{exports:exports}.exports}(),require[\"./nodes\"]=function(){var exports={};return function(){var indexOf=[].indexOf,splice=[].splice,slice1=[].slice,Access,Arr,Assign,AwaitReturn,Base,Block,BooleanLiteral,Call,Catch,Class,ClassProperty,ClassPrototypeProperty,Code,CodeFragment,ComputedPropertyName,DefaultLiteral,Directive,DynamicImport,DynamicImportCall,Elision,EmptyInterpolation,ExecutableClassBody,Existence,Expansion,ExportAllDeclaration,ExportDeclaration,ExportDefaultDeclaration,ExportNamedDeclaration,ExportSpecifier,ExportSpecifierList,Extends,For,FuncDirectiveReturn,FuncGlyph,HEREGEX_OMIT,HereComment,HoistTarget,IdentifierLiteral,If,ImportClause,ImportDeclaration,ImportDefaultSpecifier,ImportNamespaceSpecifier,ImportSpecifier,ImportSpecifierList,In,Index,InfinityLiteral,Interpolation,JSXAttribute,JSXAttributes,JSXElement,JSXEmptyExpression,JSXExpressionContainer,JSXIdentifier,JSXNamespacedName,JSXTag,JSXText,JS_FORBIDDEN,LEADING_BLANK_LINE,LEVEL_ACCESS,LEVEL_COND,LEVEL_LIST,LEVEL_OP,LEVEL_PAREN,LEVEL_TOP,LineComment,Literal,MetaProperty,ModuleDeclaration,ModuleSpecifier,ModuleSpecifierList,NEGATE,NO,NaNLiteral,NullLiteral,NumberLiteral,Obj,ObjectProperty,Op,Param,Parens,PassthroughLiteral,PropertyName,Range,RegexLiteral,RegexWithInterpolations,Return,Root,SIMPLENUM,SIMPLE_STRING_OMIT,STRING_OMIT,Scope,Sequence,Slice,Splat,StatementLiteral,StringLiteral,StringWithInterpolations,Super,SuperCall,Switch,SwitchCase,SwitchWhen,TAB,THIS,TRAILING_BLANK_LINE,TaggedTemplateCall,TemplateElement,ThisLiteral,Throw,Try,UTILITIES,UndefinedLiteral,Value,While,YES,YieldReturn,addDataToNode,astAsBlockIfNeeded,attachCommentsToNode,compact,del,emptyExpressionLocationData,ends,extend,extractSameLineLocationDataFirst,extractSameLineLocationDataLast,flatten,fragmentsToText,greater,hasLineComments,indentInitial,isAstLocGreater,isFunction,isLiteralArguments,isLiteralThis,isLocationDataEndGreater,isLocationDataStartGreater,isNumber,isPlainObject,isUnassignable,jisonLocationDataToAstLocationData,lesser,locationDataToString,makeDelimitedLiteral,merge,mergeAstLocationData,mergeLocationData,moveComments,multident,parseNumber,replaceUnicodeCodePointEscapes,shouldCacheOrIsAssignable,sniffDirectives,some,starts,throwSyntaxError,_unfoldSoak,unshiftAfterComments,utility,zeroWidthLocationDataFromEndLocation;Error.stackTraceLimit=2e308;var _require4=require(\"./scope\");Scope=_require4.Scope;var _require5=require(\"./lexer\");isUnassignable=_require5.isUnassignable,JS_FORBIDDEN=_require5.JS_FORBIDDEN;var _require6=require(\"./helpers\");compact=_require6.compact,flatten=_require6.flatten,extend=_require6.extend,merge=_require6.merge,del=_require6.del,starts=_require6.starts,ends=_require6.ends,some=_require6.some,addDataToNode=_require6.addDataToNode,attachCommentsToNode=_require6.attachCommentsToNode,locationDataToString=_require6.locationDataToString,throwSyntaxError=_require6.throwSyntaxError,replaceUnicodeCodePointEscapes=_require6.replaceUnicodeCodePointEscapes,isFunction=_require6.isFunction,isPlainObject=_require6.isPlainObject,isNumber=_require6.isNumber,parseNumber=_require6.parseNumber,exports.extend=extend,exports.addDataToNode=addDataToNode,YES=function(){return!0},NO=function(){return!1},THIS=function(){return this},NEGATE=function(){return this.negated=!this.negated,this},exports.CodeFragment=CodeFragment=function(){function CodeFragment(parent,code){_classCallCheck(this,CodeFragment);var ref1;this.code=\"\".concat(code),this.type=(null==parent||null==(ref1=parent.constructor)?void 0:ref1.name)||\"unknown\",this.locationData=null==parent?void 0:parent.locationData,this.comments=null==parent?void 0:parent.comments}return _createClass(CodeFragment,[{key:\"toString\",value:function toString(){return\"\".concat(this.code).concat(this.locationData?\": \"+locationDataToString(this.locationData):\"\")}}]),CodeFragment}(),fragmentsToText=function(fragments){var fragment;return function(){var j,len1,results1;for(results1=[],j=0,len1=fragments.length;j<len1;j++)fragment=fragments[j],results1.push(fragment.code);return results1}().join(\"\")},exports.Base=Base=function(){var Base=function(){function Base(){_classCallCheck(this,Base)}return _createClass(Base,[{key:\"compile\",value:function(o,lvl){return fragmentsToText(this.compileToFragments(o,lvl))}},{key:\"compileWithoutComments\",value:function compileWithoutComments(o,lvl){var method=2<arguments.length&&void 0!==arguments[2]?arguments[2]:\"compile\",fragments,unwrapped;return this.comments&&(this.ignoreTheseCommentsTemporarily=this.comments,delete this.comments),unwrapped=this.unwrapAll(),unwrapped.comments&&(unwrapped.ignoreTheseCommentsTemporarily=unwrapped.comments,delete unwrapped.comments),fragments=this[method](o,lvl),this.ignoreTheseCommentsTemporarily&&(this.comments=this.ignoreTheseCommentsTemporarily,delete this.ignoreTheseCommentsTemporarily),unwrapped.ignoreTheseCommentsTemporarily&&(unwrapped.comments=unwrapped.ignoreTheseCommentsTemporarily,delete unwrapped.ignoreTheseCommentsTemporarily),fragments}},{key:\"compileNodeWithoutComments\",value:function compileNodeWithoutComments(o,lvl){return this.compileWithoutComments(o,lvl,\"compileNode\")}},{key:\"compileToFragments\",value:function compileToFragments(o,lvl){var fragments,node;return o=extend({},o),lvl&&(o.level=lvl),node=this.unfoldSoak(o)||this,node.tab=o.indent,fragments=o.level!==LEVEL_TOP&&node.isStatement(o)?node.compileClosure(o):node.compileNode(o),this.compileCommentFragments(o,node,fragments),fragments}},{key:\"compileToFragmentsWithoutComments\",value:function compileToFragmentsWithoutComments(o,lvl){return this.compileWithoutComments(o,lvl,\"compileToFragments\")}},{key:\"compileClosure\",value:function compileClosure(o){var args,argumentsNode,func,meth,parts,ref1,ref2;switch(this.checkForPureStatementInExpression(),o.sharedScope=!0,func=new Code([],Block.wrap([this])),args=[],this.contains(function(node){return node instanceof SuperCall})?func.bound=!0:((argumentsNode=this.contains(isLiteralArguments))||this.contains(isLiteralThis))&&(args=[new ThisLiteral],argumentsNode?(meth=\"apply\",args.push(new IdentifierLiteral(\"arguments\"))):meth=\"call\",func=new Value(func,[new Access(new PropertyName(meth))])),parts=new Call(func,args).compileNode(o),!1){case!(func.isGenerator||(null==(ref1=func.base)?void 0:ref1.isGenerator)):parts.unshift(this.makeCode(\"(yield* \")),parts.push(this.makeCode(\")\"));break;case!(func.isAsync||(null==(ref2=func.base)?void 0:ref2.isAsync)):parts.unshift(this.makeCode(\"(await \")),parts.push(this.makeCode(\")\"));}return parts}},{key:\"compileCommentFragments\",value:function compileCommentFragments(o,node,fragments){var base1,base2,comment,commentFragment,j,len1,ref1,unshiftCommentFragment;if(!node.comments)return fragments;for(unshiftCommentFragment=function(commentFragment){var precedingFragment;return commentFragment.unshift?unshiftAfterComments(fragments,commentFragment):(0!==fragments.length&&(precedingFragment=fragments[fragments.length-1],commentFragment.newLine&&\"\"!==precedingFragment.code&&!/\\n\\s*$/.test(precedingFragment.code)&&(commentFragment.code=\"\\n\".concat(commentFragment.code))),fragments.push(commentFragment))},ref1=node.comments,(j=0,len1=ref1.length);j<len1;j++)(comment=ref1[j],!!(0>indexOf.call(this.compiledComments,comment)))&&(this.compiledComments.push(comment),commentFragment=comment.here?new HereComment(comment).compileNode(o):new LineComment(comment).compileNode(o),commentFragment.isHereComment&&!commentFragment.newLine||node.includeCommentFragments()?unshiftCommentFragment(commentFragment):(0===fragments.length&&fragments.push(this.makeCode(\"\")),commentFragment.unshift?(null==(base1=fragments[0]).precedingComments&&(base1.precedingComments=[]),fragments[0].precedingComments.push(commentFragment)):(null==(base2=fragments[fragments.length-1]).followingComments&&(base2.followingComments=[]),fragments[fragments.length-1].followingComments.push(commentFragment))));return fragments}},{key:\"cache\",value:function cache(o,level,shouldCache){var complex,ref,sub;return complex=null==shouldCache?this.shouldCache():shouldCache(this),complex?(ref=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),sub=new Assign(ref,this),level?[sub.compileToFragments(o,level),[this.makeCode(ref.value)]]:[sub,ref]):(ref=level?this.compileToFragments(o,level):this,[ref,ref])}},{key:\"hoist\",value:function hoist(){var compileNode,compileToFragments,target;return this.hoisted=!0,target=new HoistTarget(this),compileNode=this.compileNode,compileToFragments=this.compileToFragments,this.compileNode=function(o){return target.update(compileNode,o)},this.compileToFragments=function(o){return target.update(compileToFragments,o)},target}},{key:\"cacheToCodeFragments\",value:function cacheToCodeFragments(cacheValues){return[fragmentsToText(cacheValues[0]),fragmentsToText(cacheValues[1])]}},{key:\"makeReturn\",value:function makeReturn(results,mark){var node;return mark?void(this.canBeReturned=!0):(node=this.unwrapAll(),results?new Call(new Literal(\"\".concat(results,\".push\")),[node]):new Return(node))}},{key:\"contains\",value:function contains(pred){var node;return node=void 0,this.traverseChildren(!1,function(n){if(pred(n))return node=n,!1}),node}},{key:\"lastNode\",value:function lastNode(list){return 0===list.length?null:list[list.length-1]}},{key:\"toString\",value:function toString(){var idt=0<arguments.length&&void 0!==arguments[0]?arguments[0]:\"\",name=1<arguments.length&&void 0!==arguments[1]?arguments[1]:this.constructor.name,tree;return tree=\"\\n\"+idt+name,this.soak&&(tree+=\"?\"),this.eachChild(function(node){return tree+=node.toString(idt+TAB)}),tree}},{key:\"checkForPureStatementInExpression\",value:function checkForPureStatementInExpression(){var jumpNode;if(jumpNode=this.jumps())return jumpNode.error(\"cannot use a pure statement in an expression\")}},{key:\"ast\",value:function ast(o,level){var astNode;return o=this.astInitialize(o,level),astNode=this.astNode(o),null!=this.astNode&&this.canBeReturned&&Object.assign(astNode,{returns:!0}),astNode}},{key:\"astInitialize\",value:function astInitialize(o,level){return o=Object.assign({},o),null!=level&&(o.level=level),o.level>LEVEL_TOP&&this.checkForPureStatementInExpression(),this.isStatement(o)&&o.level!==LEVEL_TOP&&null!=o.scope&&this.makeReturn(null,!0),o}},{key:\"astNode\",value:function astNode(o){return Object.assign({},{type:this.astType(o)},this.astProperties(o),this.astLocationData())}},{key:\"astProperties\",value:function astProperties(){return{}}},{key:\"astType\",value:function astType(){return this.constructor.name}},{key:\"astLocationData\",value:function astLocationData(){return jisonLocationDataToAstLocationData(this.locationData)}},{key:\"isStatementAst\",value:function isStatementAst(o){return this.isStatement(o)}},{key:\"eachChild\",value:function eachChild(func){var attr,child,j,k,len1,len2,ref1,ref2;if(!this.children)return this;for(ref1=this.children,j=0,len1=ref1.length;j<len1;j++)if(attr=ref1[j],this[attr])for(ref2=flatten([this[attr]]),k=0,len2=ref2.length;k<len2;k++)if(child=ref2[k],!1===func(child))return this;return this}},{key:\"traverseChildren\",value:function traverseChildren(crossScope,func){return this.eachChild(function(child){var recur;if(recur=func(child),!1!==recur)return child.traverseChildren(crossScope,func)})}},{key:\"replaceInContext\",value:function replaceInContext(match,replacement){var attr,child,children,i,j,k,len1,len2,ref1,ref2;if(!this.children)return!1;for(ref1=this.children,j=0,len1=ref1.length;j<len1;j++)if(attr=ref1[j],children=this[attr])if(Array.isArray(children))for(i=k=0,len2=children.length;k<len2;i=++k){if(child=children[i],match(child))return splice.apply(children,[i,i-i+1].concat(ref2=replacement(child,this))),ref2,!0;if(child.replaceInContext(match,replacement))return!0}else{if(match(children))return this[attr]=replacement(children,this),!0;if(children.replaceInContext(match,replacement))return!0}}},{key:\"invert\",value:function invert(){return new Op(\"!\",this)}},{key:\"unwrapAll\",value:function unwrapAll(){var node;for(node=this;node!==(node=node.unwrap());)continue;return node}},{key:\"updateLocationDataIfMissing\",value:function updateLocationDataIfMissing(locationData,force){return(force&&(this.forceUpdateLocation=!0),this.locationData&&!this.forceUpdateLocation)?this:(delete this.forceUpdateLocation,this.locationData=locationData,this.eachChild(function(child){return child.updateLocationDataIfMissing(locationData)}))}},{key:\"withLocationDataFrom\",value:function withLocationDataFrom(_ref19){var locationData=_ref19.locationData;return this.updateLocationDataIfMissing(locationData)}},{key:\"withLocationDataAndCommentsFrom\",value:function withLocationDataAndCommentsFrom(node){var comments;return this.withLocationDataFrom(node),comments=node.comments,(null==comments?void 0:comments.length)&&(this.comments=comments),this}},{key:\"error\",value:function error(message){return throwSyntaxError(message,this.locationData)}},{key:\"makeCode\",value:function makeCode(code){return new CodeFragment(this,code)}},{key:\"wrapInParentheses\",value:function wrapInParentheses(fragments){return[this.makeCode(\"(\")].concat(_toConsumableArray(fragments),[this.makeCode(\")\")])}},{key:\"wrapInBraces\",value:function wrapInBraces(fragments){return[this.makeCode(\"{\")].concat(_toConsumableArray(fragments),[this.makeCode(\"}\")])}},{key:\"joinFragmentArrays\",value:function joinFragmentArrays(fragmentsList,joinStr){var answer,fragments,i,j,len1;for(answer=[],i=j=0,len1=fragmentsList.length;j<len1;i=++j)fragments=fragmentsList[i],i&&answer.push(this.makeCode(joinStr)),answer=answer.concat(fragments);return answer}}]),Base}();return Base.prototype.children=[],Base.prototype.isStatement=NO,Base.prototype.compiledComments=[],Base.prototype.includeCommentFragments=NO,Base.prototype.jumps=NO,Base.prototype.shouldCache=YES,Base.prototype.isChainable=NO,Base.prototype.isAssignable=NO,Base.prototype.isNumber=NO,Base.prototype.unwrap=THIS,Base.prototype.unfoldSoak=NO,Base.prototype.assigns=NO,Base}.call(this),exports.HoistTarget=HoistTarget=function(_Base){function HoistTarget(source1){var _this8;return _classCallCheck(this,HoistTarget),_this8=_super.call(this),_this8.source=source1,_this8.options={},_this8.targetFragments={fragments:[]},_this8}_inherits(HoistTarget,_Base);var _super=_createSuper(HoistTarget);return _createClass(HoistTarget,[{key:\"isStatement\",value:function isStatement(o){return this.source.isStatement(o)}},{key:\"update\",value:function update(compile,o){return this.targetFragments.fragments=compile.call(this.source,merge(o,this.options))}},{key:\"compileToFragments\",value:function compileToFragments(o,level){return this.options.indent=o.indent,this.options.level=null==level?o.level:level,[this.targetFragments]}},{key:\"compileNode\",value:function compileNode(o){return this.compileToFragments(o)}},{key:\"compileClosure\",value:function compileClosure(o){return this.compileToFragments(o)}}],[{key:\"expand\",value:function expand(fragments){var fragment,i,j,ref1;for(i=j=fragments.length-1;0<=j;i=j+=-1)fragment=fragments[i],fragment.fragments&&(splice.apply(fragments,[i,i-i+1].concat(ref1=this.expand(fragment.fragments))),ref1);return fragments}}]),HoistTarget}(Base),exports.Root=Root=function(){var Root=function(_Base2){function Root(body1){var _this9;return _classCallCheck(this,Root),_this9=_super2.call(this),_this9.body=body1,_this9.isAsync=new Code([],_this9.body).isAsync,_this9}_inherits(Root,_Base2);var _super2=_createSuper(Root);return _createClass(Root,[{key:\"compileNode\",value:function compileNode(o){var fragments,functionKeyword;return(o.indent=o.bare?\"\":TAB,o.level=LEVEL_TOP,o.compiling=!0,this.initializeScope(o),fragments=this.body.compileRoot(o),o.bare)?fragments:(functionKeyword=\"\".concat(this.isAsync?\"async \":\"\",\"function\"),[].concat(this.makeCode(\"(\".concat(functionKeyword,\"() {\\n\")),fragments,this.makeCode(\"\\n}).call(this);\\n\")))}},{key:\"initializeScope\",value:function initializeScope(o){var j,len1,name,ref1,ref2,results1;for(o.scope=new Scope(null,this.body,null,null==(ref1=o.referencedVars)?[]:ref1),ref2=o.locals||[],results1=[],(j=0,len1=ref2.length);j<len1;j++)name=ref2[j],results1.push(o.scope.parameter(name));return results1}},{key:\"commentsAst\",value:function commentsAst(){var comment,commentToken,j,len1,ref1,results1;for(null==this.allComments&&(this.allComments=function(){var j,len1,ref1,ref2,results1;for(ref2=null==(ref1=this.allCommentTokens)?[]:ref1,results1=[],(j=0,len1=ref2.length);j<len1;j++)commentToken=ref2[j],commentToken.heregex||(commentToken.here?results1.push(new HereComment(commentToken)):results1.push(new LineComment(commentToken)));return results1}.call(this)),ref1=this.allComments,results1=[],(j=0,len1=ref1.length);j<len1;j++)comment=ref1[j],results1.push(comment.ast());return results1}},{key:\"astNode\",value:function astNode(o){return o.level=LEVEL_TOP,this.initializeScope(o),_get(_getPrototypeOf(Root.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"File\"}},{key:\"astProperties\",value:function astProperties(o){return this.body.isRootBlock=!0,{program:Object.assign(this.body.ast(o),this.astLocationData()),comments:this.commentsAst()}}}]),Root}(Base);return Root.prototype.children=[\"body\"],Root}.call(this),exports.Block=Block=function(){var Block=function(_Base3){function Block(nodes){var _this10;return _classCallCheck(this,Block),_this10=_super3.call(this),_this10.expressions=compact(flatten(nodes||[])),_this10}_inherits(Block,_Base3);var _super3=_createSuper(Block);return _createClass(Block,[{key:\"push\",value:function push(node){return this.expressions.push(node),this}},{key:\"pop\",value:function pop(){return this.expressions.pop()}},{key:\"unshift\",value:function unshift(node){return this.expressions.unshift(node),this}},{key:\"unwrap\",value:function unwrap(){return 1===this.expressions.length?this.expressions[0]:this}},{key:\"isEmpty\",value:function isEmpty(){return!this.expressions.length}},{key:\"isStatement\",value:function isStatement(o){var exp,j,len1,ref1;for(ref1=this.expressions,j=0,len1=ref1.length;j<len1;j++)if(exp=ref1[j],exp.isStatement(o))return!0;return!1}},{key:\"jumps\",value:function jumps(o){var exp,j,jumpNode,len1,ref1;for(ref1=this.expressions,j=0,len1=ref1.length;j<len1;j++)if(exp=ref1[j],jumpNode=exp.jumps(o))return jumpNode}},{key:\"makeReturn\",value:function makeReturn(results,mark){var _slice1$call,_slice1$call2,expr,expressions,last,lastExp,len,penult,ref1,ref2;if(len=this.expressions.length,ref1=this.expressions,_slice1$call=slice1.call(ref1,-1),_slice1$call2=_slicedToArray(_slice1$call,1),lastExp=_slice1$call2[0],_slice1$call,lastExp=(null==lastExp?void 0:lastExp.unwrap())||!1,lastExp&&lastExp instanceof Parens&&1<lastExp.body.expressions.length){var _lastExp=lastExp;expressions=_lastExp.body.expressions;var _slice1$call3=slice1.call(expressions,-2),_slice1$call4=_slicedToArray(_slice1$call3,2);penult=_slice1$call4[0],last=_slice1$call4[1],penult=penult.unwrap(),last=last.unwrap(),penult instanceof JSXElement&&last instanceof JSXElement&&expressions[expressions.length-1].error(\"Adjacent JSX elements must be wrapped in an enclosing tag\")}if(mark)return void(null!=(ref2=this.expressions[len-1])&&ref2.makeReturn(results,mark));for(;len--;){expr=this.expressions[len],this.expressions[len]=expr.makeReturn(results),expr instanceof Return&&!expr.expression&&this.expressions.splice(len,1);break}return this}},{key:\"compile\",value:function(o,lvl){return o.scope?_get(_getPrototypeOf(Block.prototype),\"compile\",this).call(this,o,lvl):new Root(this).withLocationDataFrom(this).compile(o,lvl)}},{key:\"compileNode\",value:function compileNode(o){var answer,compiledNodes,fragments,index,j,lastFragment,len1,node,ref1,top;for(this.tab=o.indent,top=o.level===LEVEL_TOP,compiledNodes=[],ref1=this.expressions,(index=j=0,len1=ref1.length);j<len1;index=++j){if(node=ref1[index],node.hoisted){node.compileToFragments(o);continue}if(node=node.unfoldSoak(o)||node,node instanceof Block)compiledNodes.push(node.compileNode(o));else if(top){if(node.front=!0,fragments=node.compileToFragments(o),!node.isStatement(o)){fragments=indentInitial(fragments,this);var _slice1$call5=slice1.call(fragments,-1),_slice1$call6=_slicedToArray(_slice1$call5,1);lastFragment=_slice1$call6[0],\"\"===lastFragment.code||lastFragment.isComment||fragments.push(this.makeCode(\";\"))}compiledNodes.push(fragments)}else compiledNodes.push(node.compileToFragments(o,LEVEL_LIST))}return top?this.spaced?[].concat(this.joinFragmentArrays(compiledNodes,\"\\n\\n\"),this.makeCode(\"\\n\")):this.joinFragmentArrays(compiledNodes,\"\\n\"):(answer=compiledNodes.length?this.joinFragmentArrays(compiledNodes,\", \"):[this.makeCode(\"void 0\")],1<compiledNodes.length&&o.level>=LEVEL_LIST?this.wrapInParentheses(answer):answer)}},{key:\"compileRoot\",value:function compileRoot(o){var fragments;return this.spaced=!0,fragments=this.compileWithDeclarations(o),HoistTarget.expand(fragments),this.compileComments(fragments)}},{key:\"compileWithDeclarations\",value:function compileWithDeclarations(o){var assigns,declaredVariable,declaredVariables,declaredVariablesIndex,declars,exp,fragments,i,j,k,len1,len2,post,ref1,rest,scope,spaced;for(fragments=[],post=[],ref1=this.expressions,(i=j=0,len1=ref1.length);j<len1&&(exp=ref1[i],exp=exp.unwrap(),!!(exp instanceof Literal));i=++j);if(o=merge(o,{level:LEVEL_TOP}),i){rest=this.expressions.splice(i,9e9);var _ref20=[this.spaced,!1];spaced=_ref20[0],this.spaced=_ref20[1];var _ref21=[this.compileNode(o),spaced];fragments=_ref21[0],this.spaced=_ref21[1],this.expressions=rest}post=this.compileNode(o);var _o2=o;if(scope=_o2.scope,scope.expressions===this)if(declars=o.scope.hasDeclarations(),assigns=scope.hasAssignments,declars||assigns){if(i&&fragments.push(this.makeCode(\"\\n\")),fragments.push(this.makeCode(\"\".concat(this.tab,\"var \"))),declars)for(declaredVariables=scope.declaredVariables(),declaredVariablesIndex=k=0,len2=declaredVariables.length;k<len2;declaredVariablesIndex=++k){if(declaredVariable=declaredVariables[declaredVariablesIndex],fragments.push(this.makeCode(declaredVariable)),Object.prototype.hasOwnProperty.call(o.scope.comments,declaredVariable)){var _fragments;(_fragments=fragments).push.apply(_fragments,_toConsumableArray(o.scope.comments[declaredVariable]))}declaredVariablesIndex!==declaredVariables.length-1&&fragments.push(this.makeCode(\", \"))}assigns&&(declars&&fragments.push(this.makeCode(\",\\n\".concat(this.tab+TAB))),fragments.push(this.makeCode(scope.assignedVariables().join(\",\\n\".concat(this.tab+TAB))))),fragments.push(this.makeCode(\";\\n\".concat(this.spaced?\"\\n\":\"\")))}else fragments.length&&post.length&&fragments.push(this.makeCode(\"\\n\"));return fragments.concat(post)}},{key:\"compileComments\",value:function compileComments(fragments){var code,commentFragment,fragment,fragmentIndent,fragmentIndex,indent,j,k,l,len1,len2,len3,newLineIndex,onNextLine,p,pastFragment,pastFragmentIndex,q,ref1,ref2,ref3,ref4,trail,upcomingFragment,upcomingFragmentIndex;for(fragmentIndex=j=0,len1=fragments.length;j<len1;fragmentIndex=++j){if(fragment=fragments[fragmentIndex],fragment.precedingComments){for(fragmentIndent=\"\",ref1=fragments.slice(0,fragmentIndex+1),k=ref1.length-1;0<=k;k+=-1)if(pastFragment=ref1[k],indent=/^ {2,}/m.exec(pastFragment.code),indent){fragmentIndent=indent[0];break}else if(0<=indexOf.call(pastFragment.code,\"\\n\"))break;for(code=\"\\n\".concat(fragmentIndent)+function(){var l,len2,ref2,results1;for(ref2=fragment.precedingComments,results1=[],(l=0,len2=ref2.length);l<len2;l++)commentFragment=ref2[l],commentFragment.isHereComment&&commentFragment.multiline?results1.push(multident(commentFragment.code,fragmentIndent,!1)):results1.push(commentFragment.code);return results1}().join(\"\\n\".concat(fragmentIndent)).replace(/^(\\s*)$/gm,\"\"),ref2=fragments.slice(0,fragmentIndex+1),pastFragmentIndex=l=ref2.length-1;0<=l;pastFragmentIndex=l+=-1){if(pastFragment=ref2[pastFragmentIndex],newLineIndex=pastFragment.code.lastIndexOf(\"\\n\"),-1===newLineIndex)if(0===pastFragmentIndex)pastFragment.code=\"\\n\"+pastFragment.code,newLineIndex=0;else if(pastFragment.isStringWithInterpolations&&\"{\"===pastFragment.code)code=code.slice(1)+\"\\n\",newLineIndex=1;else continue;delete fragment.precedingComments,pastFragment.code=pastFragment.code.slice(0,newLineIndex)+code+pastFragment.code.slice(newLineIndex);break}}if(fragment.followingComments){if(trail=fragment.followingComments[0].trail,fragmentIndent=\"\",!(trail&&1===fragment.followingComments.length))for(onNextLine=!1,ref3=fragments.slice(fragmentIndex),(p=0,len2=ref3.length);p<len2;p++)if(upcomingFragment=ref3[p],!onNextLine){if(0<=indexOf.call(upcomingFragment.code,\"\\n\"))onNextLine=!0;else continue;}else if(indent=/^ {2,}/m.exec(upcomingFragment.code),indent){fragmentIndent=indent[0];break}else if(0<=indexOf.call(upcomingFragment.code,\"\\n\"))break;for(code=1===fragmentIndex&&/^\\s+$/.test(fragments[0].code)?\"\":trail?\" \":\"\\n\".concat(fragmentIndent),code+=function(){var len3,q,ref4,results1;for(ref4=fragment.followingComments,results1=[],(q=0,len3=ref4.length);q<len3;q++)commentFragment=ref4[q],commentFragment.isHereComment&&commentFragment.multiline?results1.push(multident(commentFragment.code,fragmentIndent,!1)):results1.push(commentFragment.code);return results1}().join(\"\\n\".concat(fragmentIndent)).replace(/^(\\s*)$/gm,\"\"),ref4=fragments.slice(fragmentIndex),(upcomingFragmentIndex=q=0,len3=ref4.length);q<len3;upcomingFragmentIndex=++q){if(upcomingFragment=ref4[upcomingFragmentIndex],newLineIndex=upcomingFragment.code.indexOf(\"\\n\"),-1===newLineIndex)if(upcomingFragmentIndex===fragments.length-1)upcomingFragment.code+=\"\\n\",newLineIndex=upcomingFragment.code.length;else if(upcomingFragment.isStringWithInterpolations&&\"}\"===upcomingFragment.code)code=\"\".concat(code,\"\\n\"),newLineIndex=0;else continue;delete fragment.followingComments,\"\\n\"===upcomingFragment.code&&(code=code.replace(/^\\n/,\"\")),upcomingFragment.code=upcomingFragment.code.slice(0,newLineIndex)+code+upcomingFragment.code.slice(newLineIndex);break}}}return fragments}},{key:\"astNode\",value:function astNode(o){return null!=o.level&&o.level!==LEVEL_TOP&&this.expressions.length?new Sequence(this.expressions).withLocationDataFrom(this).ast(o):_get(_getPrototypeOf(Block.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isRootBlock?\"Program\":this.isClassBody?\"ClassBody\":\"BlockStatement\"}},{key:\"astProperties\",value:function astProperties(o){var body,checkForDirectives,directives,expression,expressionAst,j,len1,ref1;for(checkForDirectives=del(o,\"checkForDirectives\"),(this.isRootBlock||checkForDirectives)&&sniffDirectives(this.expressions,{notFinalExpression:checkForDirectives}),directives=[],body=[],ref1=this.expressions,(j=0,len1=ref1.length);j<len1;j++)if(expression=ref1[j],expressionAst=expression.ast(o),null==expressionAst)continue;else expression instanceof Directive?directives.push(expressionAst):expression.isStatementAst(o)?body.push(expressionAst):body.push(Object.assign({type:\"ExpressionStatement\",expression:expressionAst},expression.astLocationData()));return{body:body,directives:directives}}},{key:\"astLocationData\",value:function astLocationData(){return this.isRootBlock&&null==this.locationData?void 0:_get(_getPrototypeOf(Block.prototype),\"astLocationData\",this).call(this)}}],[{key:\"wrap\",value:function wrap(nodes){return 1===nodes.length&&nodes[0]instanceof Block?nodes[0]:new Block(nodes)}}]),Block}(Base);return Block.prototype.children=[\"expressions\"],Block}.call(this),exports.Directive=Directive=function(_Base4){function Directive(value1){var _this11;return _classCallCheck(this,Directive),_this11=_super4.call(this),_this11.value=value1,_this11}_inherits(Directive,_Base4);var _super4=_createSuper(Directive);return _createClass(Directive,[{key:\"astProperties\",value:function astProperties(o){return{value:Object.assign({},this.value.ast(o),{type:\"DirectiveLiteral\"})}}}]),Directive}(Base),exports.Literal=Literal=function(){var Literal=function(_Base5){function Literal(value1){var _this12;return _classCallCheck(this,Literal),_this12=_super5.call(this),_this12.value=value1,_this12}_inherits(Literal,_Base5);var _super5=_createSuper(Literal);return _createClass(Literal,[{key:\"assigns\",value:function assigns(name){return name===this.value}},{key:\"compileNode\",value:function compileNode(){return[this.makeCode(this.value)]}},{key:\"astProperties\",value:function astProperties(){return{value:this.value}}},{key:\"toString\",value:function toString(){return\" \".concat(this.isStatement()?_get(_getPrototypeOf(Literal.prototype),\"toString\",this).call(this):this.constructor.name,\": \").concat(this.value)}}]),Literal}(Base);return Literal.prototype.shouldCache=NO,Literal}.call(this),exports.NumberLiteral=NumberLiteral=function(_Literal){function NumberLiteral(value1){var _ref22=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},parsedValue=_ref22.parsedValue,_this13;return _classCallCheck(this,NumberLiteral),_this13=_super6.call(this),_this13.value=value1,_this13.parsedValue=parsedValue,null==_this13.parsedValue&&(isNumber(_this13.value)?(_this13.parsedValue=_this13.value,_this13.value=\"\".concat(_this13.value)):_this13.parsedValue=parseNumber(_this13.value)),_this13}_inherits(NumberLiteral,_Literal);var _super6=_createSuper(NumberLiteral);return _createClass(NumberLiteral,[{key:\"isBigInt\",value:function isBigInt(){return /n$/.test(this.value)}},{key:\"astType\",value:function astType(){return this.isBigInt()?\"BigIntLiteral\":\"NumericLiteral\"}},{key:\"astProperties\",value:function astProperties(){return{value:this.isBigInt()?this.parsedValue.toString():this.parsedValue,extra:{rawValue:this.isBigInt()?this.parsedValue.toString():this.parsedValue,raw:this.value}}}}]),NumberLiteral}(Literal),exports.InfinityLiteral=InfinityLiteral=function(_NumberLiteral){function InfinityLiteral(value1){var _ref23=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref23$originalValue=_ref23.originalValue,originalValue=void 0===_ref23$originalValue?\"Infinity\":_ref23$originalValue,_this14;return _classCallCheck(this,InfinityLiteral),_this14=_super7.call(this),_this14.value=value1,_this14.originalValue=originalValue,_this14}_inherits(InfinityLiteral,_NumberLiteral);var _super7=_createSuper(InfinityLiteral);return _createClass(InfinityLiteral,[{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\"2e308\")]}},{key:\"astNode\",value:function astNode(o){return\"Infinity\"===this.originalValue?_get(_getPrototypeOf(InfinityLiteral.prototype),\"astNode\",this).call(this,o):new NumberLiteral(this.value).withLocationDataFrom(this).ast(o)}},{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:\"Infinity\",declaration:!1}}}]),InfinityLiteral}(NumberLiteral),exports.NaNLiteral=NaNLiteral=function(_NumberLiteral2){function NaNLiteral(){return _classCallCheck(this,NaNLiteral),_super8.call(this,\"NaN\")}_inherits(NaNLiteral,_NumberLiteral2);var _super8=_createSuper(NaNLiteral);return _createClass(NaNLiteral,[{key:\"compileNode\",value:function compileNode(o){var code;return code=[this.makeCode(\"0/0\")],o.level>=LEVEL_OP?this.wrapInParentheses(code):code}},{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:\"NaN\",declaration:!1}}}]),NaNLiteral}(NumberLiteral),exports.StringLiteral=StringLiteral=function(_Literal2){function StringLiteral(originalValue){var _ref24=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},quote=_ref24.quote,initialChunk=_ref24.initialChunk,finalChunk=_ref24.finalChunk,indent1=_ref24.indent,double1=_ref24.double,heregex1=_ref24.heregex,_this15;_classCallCheck(this,StringLiteral);var heredoc,indentRegex,val;return _this15=_super9.call(this,\"\"),_this15.originalValue=originalValue,_this15.quote=quote,_this15.initialChunk=initialChunk,_this15.finalChunk=finalChunk,_this15.indent=indent1,_this15.double=double1,_this15.heregex=heregex1,\"///\"===_this15.quote&&(_this15.quote=null),_this15.fromSourceString=null!=_this15.quote,null==_this15.quote&&(_this15.quote=\"\\\"\"),heredoc=_this15.isFromHeredoc(),val=_this15.originalValue,_this15.heregex?(val=val.replace(HEREGEX_OMIT,\"$1$2\"),val=replaceUnicodeCodePointEscapes(val,{flags:_this15.heregex.flags})):(val=val.replace(STRING_OMIT,\"$1\"),val=_this15.fromSourceString?heredoc?(_this15.indent?indentRegex=RegExp(\"\\\\n\".concat(_this15.indent),\"g\"):void 0,indentRegex?val=val.replace(indentRegex,\"\\n\"):void 0,_this15.initialChunk?val=val.replace(LEADING_BLANK_LINE,\"\"):void 0,_this15.finalChunk?val=val.replace(TRAILING_BLANK_LINE,\"\"):void 0,val):val.replace(SIMPLE_STRING_OMIT,function(match,offset){return _this15.initialChunk&&0===offset||_this15.finalChunk&&offset+match.length===val.length?\"\":\" \"}):val),_this15.delimiter=_this15.quote.charAt(0),_this15.value=makeDelimitedLiteral(val,{delimiter:_this15.delimiter,double:_this15.double}),_this15.unquotedValueForTemplateLiteral=makeDelimitedLiteral(val,{delimiter:\"`\",double:_this15.double,escapeNewlines:!1,includeDelimiters:!1,convertTrailingNullEscapes:!0}),_this15.unquotedValueForJSX=makeDelimitedLiteral(val,{double:_this15.double,escapeNewlines:!1,includeDelimiters:!1,escapeDelimiter:!1}),_this15}_inherits(StringLiteral,_Literal2);var _super9=_createSuper(StringLiteral);return _createClass(StringLiteral,[{key:\"compileNode\",value:function compileNode(o){return this.shouldGenerateTemplateLiteral()?StringWithInterpolations.fromStringLiteral(this).compileNode(o):this.jsx?[this.makeCode(this.unquotedValueForJSX)]:_get(_getPrototypeOf(StringLiteral.prototype),\"compileNode\",this).call(this,o)}},{key:\"withoutQuotesInLocationData\",value:function withoutQuotesInLocationData(){var copy,endsWithNewline,locationData;return endsWithNewline=\"\\n\"===this.originalValue.slice(-1),locationData=Object.assign({},this.locationData),locationData.first_column+=this.quote.length,endsWithNewline?(locationData.last_line-=1,locationData.last_column=locationData.last_line===locationData.first_line?locationData.first_column+this.originalValue.length-\"\\n\".length:this.originalValue.slice(0,-1).length-\"\\n\".length-this.originalValue.slice(0,-1).lastIndexOf(\"\\n\")):locationData.last_column-=this.quote.length,locationData.last_column_exclusive-=this.quote.length,locationData.range=[locationData.range[0]+this.quote.length,locationData.range[1]-this.quote.length],copy=new StringLiteral(this.originalValue,{quote:this.quote,initialChunk:this.initialChunk,finalChunk:this.finalChunk,indent:this.indent,double:this.double,heregex:this.heregex}),copy.locationData=locationData,copy}},{key:\"isFromHeredoc\",value:function isFromHeredoc(){return 3===this.quote.length}},{key:\"shouldGenerateTemplateLiteral\",value:function shouldGenerateTemplateLiteral(){return this.isFromHeredoc()}},{key:\"astNode\",value:function astNode(o){return this.shouldGenerateTemplateLiteral()?StringWithInterpolations.fromStringLiteral(this).ast(o):_get(_getPrototypeOf(StringLiteral.prototype),\"astNode\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(){return{value:this.originalValue,extra:{raw:\"\".concat(this.delimiter).concat(this.originalValue).concat(this.delimiter)}}}}]),StringLiteral}(Literal),exports.RegexLiteral=RegexLiteral=function(){var RegexLiteral=function(_Literal3){function RegexLiteral(value){var _ref25=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref25$delimiter=_ref25.delimiter,delimiter1=void 0===_ref25$delimiter?\"/\":_ref25$delimiter,_ref25$heregexComment=_ref25.heregexCommentTokens,heregexCommentTokens=void 0===_ref25$heregexComment?[]:_ref25$heregexComment,_this16;_classCallCheck(this,RegexLiteral);var endDelimiterIndex,heregex,val;return _this16=_super10.call(this,\"\"),_this16.delimiter=delimiter1,_this16.heregexCommentTokens=heregexCommentTokens,heregex=\"///\"===_this16.delimiter,endDelimiterIndex=value.lastIndexOf(\"/\"),_this16.flags=value.slice(endDelimiterIndex+1),val=_this16.originalValue=value.slice(1,endDelimiterIndex),heregex&&(val=val.replace(HEREGEX_OMIT,\"$1$2\")),val=replaceUnicodeCodePointEscapes(val,{flags:_this16.flags}),_this16.value=\"\".concat(makeDelimitedLiteral(val,{delimiter:\"/\"})).concat(_this16.flags),_this16}_inherits(RegexLiteral,_Literal3);var _super10=_createSuper(RegexLiteral);return _createClass(RegexLiteral,[{key:\"astType\",value:function astType(){return\"RegExpLiteral\"}},{key:\"astProperties\",value:function astProperties(o){var _this$REGEX_REGEX$exe=this.REGEX_REGEX.exec(this.value),_this$REGEX_REGEX$exe2=_slicedToArray(_this$REGEX_REGEX$exe,2),heregexCommentToken,pattern;return pattern=_this$REGEX_REGEX$exe2[1],{value:void 0,pattern:pattern,flags:this.flags,delimiter:this.delimiter,originalPattern:this.originalValue,extra:{raw:this.value,originalRaw:\"\".concat(this.delimiter).concat(this.originalValue).concat(this.delimiter).concat(this.flags),rawValue:void 0},comments:function(){var j,len1,ref1,results1;for(ref1=this.heregexCommentTokens,results1=[],(j=0,len1=ref1.length);j<len1;j++)heregexCommentToken=ref1[j],heregexCommentToken.here?results1.push(new HereComment(heregexCommentToken).ast(o)):results1.push(new LineComment(heregexCommentToken).ast(o));return results1}.call(this)}}}]),RegexLiteral}(Literal);return RegexLiteral.prototype.REGEX_REGEX=/^\\/(.*)\\/\\w*$/,RegexLiteral}.call(this),exports.PassthroughLiteral=PassthroughLiteral=function(_Literal4){function PassthroughLiteral(originalValue){var _ref26=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},here=_ref26.here,generated=_ref26.generated,_this17;return _classCallCheck(this,PassthroughLiteral),_this17=_super11.call(this,\"\"),_this17.originalValue=originalValue,_this17.here=here,_this17.generated=generated,_this17.value=_this17.originalValue.replace(/\\\\+(`|$)/g,function(string){var _Mathceil=Math.ceil;return string.slice(-_Mathceil(string.length/2))}),_this17}_inherits(PassthroughLiteral,_Literal4);var _super11=_createSuper(PassthroughLiteral);return _createClass(PassthroughLiteral,[{key:\"astNode\",value:function astNode(o){return this.generated?null:_get(_getPrototypeOf(PassthroughLiteral.prototype),\"astNode\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(){return{value:this.originalValue,here:!!this.here}}}]),PassthroughLiteral}(Literal),exports.IdentifierLiteral=IdentifierLiteral=function(){var IdentifierLiteral=function(_Literal5){function IdentifierLiteral(){return _classCallCheck(this,IdentifierLiteral),_super12.apply(this,arguments)}_inherits(IdentifierLiteral,_Literal5);var _super12=_createSuper(IdentifierLiteral);return _createClass(IdentifierLiteral,[{key:\"eachName\",value:function eachName(iterator){return iterator(this)}},{key:\"astType\",value:function astType(){return this.jsx?\"JSXIdentifier\":\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:this.value,declaration:!!this.isDeclaration}}}]),IdentifierLiteral}(Literal);return IdentifierLiteral.prototype.isAssignable=YES,IdentifierLiteral}.call(this),exports.PropertyName=PropertyName=function(){var PropertyName=function(_Literal6){function PropertyName(){return _classCallCheck(this,PropertyName),_super13.apply(this,arguments)}_inherits(PropertyName,_Literal6);var _super13=_createSuper(PropertyName);return _createClass(PropertyName,[{key:\"astType\",value:function astType(){return this.jsx?\"JSXIdentifier\":\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:this.value,declaration:!1}}}]),PropertyName}(Literal);return PropertyName.prototype.isAssignable=YES,PropertyName}.call(this),exports.ComputedPropertyName=ComputedPropertyName=function(_PropertyName){function ComputedPropertyName(){return _classCallCheck(this,ComputedPropertyName),_super14.apply(this,arguments)}_inherits(ComputedPropertyName,_PropertyName);var _super14=_createSuper(ComputedPropertyName);return _createClass(ComputedPropertyName,[{key:\"compileNode\",value:function compileNode(o){return[this.makeCode(\"[\")].concat(_toConsumableArray(this.value.compileToFragments(o,LEVEL_LIST)),[this.makeCode(\"]\")])}},{key:\"astNode\",value:function astNode(o){return this.value.ast(o)}}]),ComputedPropertyName}(PropertyName),exports.StatementLiteral=StatementLiteral=function(){var StatementLiteral=function(_Literal7){function StatementLiteral(){return _classCallCheck(this,StatementLiteral),_super15.apply(this,arguments)}_inherits(StatementLiteral,_Literal7);var _super15=_createSuper(StatementLiteral);return _createClass(StatementLiteral,[{key:\"jumps\",value:function jumps(o){return\"break\"!==this.value||(null==o?void 0:o.loop)||(null==o?void 0:o.block)?\"continue\"!==this.value||null!=o&&o.loop?void 0:this:this}},{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\"\".concat(this.tab).concat(this.value,\";\"))]}},{key:\"astType\",value:function astType(){switch(this.value){case\"continue\":return\"ContinueStatement\";case\"break\":return\"BreakStatement\";case\"debugger\":return\"DebuggerStatement\";}}}]),StatementLiteral}(Literal);return StatementLiteral.prototype.isStatement=YES,StatementLiteral.prototype.makeReturn=THIS,StatementLiteral}.call(this),exports.ThisLiteral=ThisLiteral=function(_Literal8){function ThisLiteral(value){var _this18;return _classCallCheck(this,ThisLiteral),_this18=_super16.call(this,\"this\"),_this18.shorthand=\"@\"===value,_this18}_inherits(ThisLiteral,_Literal8);var _super16=_createSuper(ThisLiteral);return _createClass(ThisLiteral,[{key:\"compileNode\",value:function compileNode(o){var code,ref1;return code=(null==(ref1=o.scope.method)?void 0:ref1.bound)?o.scope.method.context:this.value,[this.makeCode(code)]}},{key:\"astType\",value:function astType(){return\"ThisExpression\"}},{key:\"astProperties\",value:function astProperties(){return{shorthand:this.shorthand}}}]),ThisLiteral}(Literal),exports.UndefinedLiteral=UndefinedLiteral=function(_Literal9){function UndefinedLiteral(){return _classCallCheck(this,UndefinedLiteral),_super17.call(this,\"undefined\")}_inherits(UndefinedLiteral,_Literal9);var _super17=_createSuper(UndefinedLiteral);return _createClass(UndefinedLiteral,[{key:\"compileNode\",value:function compileNode(o){return[this.makeCode(o.level>=LEVEL_ACCESS?\"(void 0)\":\"void 0\")]}},{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:this.value,declaration:!1}}}]),UndefinedLiteral}(Literal),exports.NullLiteral=NullLiteral=function(_Literal10){function NullLiteral(){return _classCallCheck(this,NullLiteral),_super18.call(this,\"null\")}_inherits(NullLiteral,_Literal10);var _super18=_createSuper(NullLiteral);return _createClass(NullLiteral)}(Literal),exports.BooleanLiteral=BooleanLiteral=function(_Literal11){function BooleanLiteral(value){var _ref27=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},originalValue=_ref27.originalValue,_this19;return _classCallCheck(this,BooleanLiteral),_this19=_super19.call(this,value),_this19.originalValue=originalValue,null==_this19.originalValue&&(_this19.originalValue=_this19.value),_this19}_inherits(BooleanLiteral,_Literal11);var _super19=_createSuper(BooleanLiteral);return _createClass(BooleanLiteral,[{key:\"astProperties\",value:function astProperties(){return{value:\"true\"===this.value,name:this.originalValue}}}]),BooleanLiteral}(Literal),exports.DefaultLiteral=DefaultLiteral=function(_Literal12){function DefaultLiteral(){return _classCallCheck(this,DefaultLiteral),_super20.apply(this,arguments)}_inherits(DefaultLiteral,_Literal12);var _super20=_createSuper(DefaultLiteral);return _createClass(DefaultLiteral,[{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:\"default\",declaration:!1}}}]),DefaultLiteral}(Literal),exports.Return=Return=function(){var Return=function(_Base6){function Return(expression1){var _ref28=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},belongsToFuncDirectiveReturn=_ref28.belongsToFuncDirectiveReturn,_this20;return _classCallCheck(this,Return),_this20=_super21.call(this),_this20.expression=expression1,_this20.belongsToFuncDirectiveReturn=belongsToFuncDirectiveReturn,_this20}_inherits(Return,_Base6);var _super21=_createSuper(Return);return _createClass(Return,[{key:\"compileToFragments\",value:function compileToFragments(o,level){var expr,ref1;return expr=null==(ref1=this.expression)?void 0:ref1.makeReturn(),expr&&!(expr instanceof Return)?expr.compileToFragments(o,level):_get(_getPrototypeOf(Return.prototype),\"compileToFragments\",this).call(this,o,level)}},{key:\"compileNode\",value:function compileNode(o){var answer,fragment,j,len1;if(answer=[],this.expression){for(answer=this.expression.compileToFragments(o,LEVEL_PAREN),unshiftAfterComments(answer,this.makeCode(\"\".concat(this.tab,\"return \"))),(j=0,len1=answer.length);j<len1;j++)if(fragment=answer[j],fragment.isHereComment&&0<=indexOf.call(fragment.code,\"\\n\"))fragment.code=multident(fragment.code,this.tab);else if(fragment.isLineComment)fragment.code=\"\".concat(this.tab).concat(fragment.code);else break;}else answer.push(this.makeCode(\"\".concat(this.tab,\"return\")));return answer.push(this.makeCode(\";\")),answer}},{key:\"checkForPureStatementInExpression\",value:function checkForPureStatementInExpression(){return this.belongsToFuncDirectiveReturn?void 0:_get(_getPrototypeOf(Return.prototype),\"checkForPureStatementInExpression\",this).call(this)}},{key:\"astType\",value:function astType(){return\"ReturnStatement\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{argument:null==(ref1=null==(ref2=this.expression)?void 0:ref2.ast(o,LEVEL_PAREN))?null:ref1}}}]),Return}(Base);return Return.prototype.children=[\"expression\"],Return.prototype.isStatement=YES,Return.prototype.makeReturn=THIS,Return.prototype.jumps=THIS,Return}.call(this),exports.FuncDirectiveReturn=FuncDirectiveReturn=function(){var FuncDirectiveReturn=function(_Return){function FuncDirectiveReturn(expression,_ref29){var returnKeyword=_ref29.returnKeyword,_this21;return _classCallCheck(this,FuncDirectiveReturn),_this21=_super22.call(this,expression),_this21.returnKeyword=returnKeyword,_this21}_inherits(FuncDirectiveReturn,_Return);var _super22=_createSuper(FuncDirectiveReturn);return _createClass(FuncDirectiveReturn,[{key:\"compileNode\",value:function compileNode(o){return this.checkScope(o),_get(_getPrototypeOf(FuncDirectiveReturn.prototype),\"compileNode\",this).call(this,o)}},{key:\"checkScope\",value:function checkScope(o){if(null==o.scope.parent)return this.error(\"\".concat(this.keyword,\" can only occur inside functions\"))}},{key:\"astNode\",value:function astNode(o){return this.checkScope(o),new Op(this.keyword,new Return(this.expression,{belongsToFuncDirectiveReturn:!0}).withLocationDataFrom(null==this.expression?this.returnKeyword:{locationData:mergeLocationData(this.returnKeyword.locationData,this.expression.locationData)})).withLocationDataFrom(this).ast(o)}}]),FuncDirectiveReturn}(Return);return FuncDirectiveReturn.prototype.isStatementAst=NO,FuncDirectiveReturn}.call(this),exports.YieldReturn=YieldReturn=function(){var YieldReturn=function(_FuncDirectiveReturn){function YieldReturn(){return _classCallCheck(this,YieldReturn),_super23.apply(this,arguments)}_inherits(YieldReturn,_FuncDirectiveReturn);var _super23=_createSuper(YieldReturn);return _createClass(YieldReturn)}(FuncDirectiveReturn);return YieldReturn.prototype.keyword=\"yield\",YieldReturn}.call(this),exports.AwaitReturn=AwaitReturn=function(){var AwaitReturn=function(_FuncDirectiveReturn2){function AwaitReturn(){return _classCallCheck(this,AwaitReturn),_super24.apply(this,arguments)}_inherits(AwaitReturn,_FuncDirectiveReturn2);var _super24=_createSuper(AwaitReturn);return _createClass(AwaitReturn)}(FuncDirectiveReturn);return AwaitReturn.prototype.keyword=\"await\",AwaitReturn}.call(this),exports.Value=Value=function(){var Value=function(_Base7){function Value(base,props,tag){var isDefaultValue=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3],_this22;_classCallCheck(this,Value);var ref1,ref2;return(_this22=_super25.call(this),!props&&base instanceof Value)?_possibleConstructorReturn(_this22,base):(_this22.base=base,_this22.properties=props||[],_this22.tag=tag,tag&&(_this22[tag]=!0),_this22.isDefaultValue=isDefaultValue,(null==(ref1=_this22.base)?void 0:ref1.comments)&&_this22.base instanceof ThisLiteral&&null!=(null==(ref2=_this22.properties[0])?void 0:ref2.name)&&moveComments(_this22.base,_this22.properties[0].name),_this22)}_inherits(Value,_Base7);var _super25=_createSuper(Value);return _createClass(Value,[{key:\"add\",value:function add(props){return this.properties=this.properties.concat(props),this.forceUpdateLocation=!0,this}},{key:\"hasProperties\",value:function hasProperties(){return 0!==this.properties.length}},{key:\"bareLiteral\",value:function bareLiteral(type){return!this.properties.length&&this.base instanceof type}},{key:\"isArray\",value:function isArray(){return this.bareLiteral(Arr)}},{key:\"isRange\",value:function isRange(){return this.bareLiteral(Range)}},{key:\"shouldCache\",value:function shouldCache(){return this.hasProperties()||this.base.shouldCache()}},{key:\"isAssignable\",value:function isAssignable(opts){return this.hasProperties()||this.base.isAssignable(opts)}},{key:\"isNumber\",value:function(){return this.bareLiteral(NumberLiteral)}},{key:\"isString\",value:function isString(){return this.bareLiteral(StringLiteral)}},{key:\"isRegex\",value:function isRegex(){return this.bareLiteral(RegexLiteral)}},{key:\"isUndefined\",value:function isUndefined(){return this.bareLiteral(UndefinedLiteral)}},{key:\"isNull\",value:function isNull(){return this.bareLiteral(NullLiteral)}},{key:\"isBoolean\",value:function isBoolean(){return this.bareLiteral(BooleanLiteral)}},{key:\"isAtomic\",value:function isAtomic(){var j,len1,node,ref1;for(ref1=this.properties.concat(this.base),j=0,len1=ref1.length;j<len1;j++)if(node=ref1[j],node.soak||node instanceof Call||node instanceof Op&&\"do\"===node.operator)return!1;return!0}},{key:\"isNotCallable\",value:function isNotCallable(){return this.isNumber()||this.isString()||this.isRegex()||this.isArray()||this.isRange()||this.isSplice()||this.isObject()||this.isUndefined()||this.isNull()||this.isBoolean()}},{key:\"isStatement\",value:function isStatement(o){return!this.properties.length&&this.base.isStatement(o)}},{key:\"isJSXTag\",value:function isJSXTag(){return this.base instanceof JSXTag}},{key:\"assigns\",value:function assigns(name){return!this.properties.length&&this.base.assigns(name)}},{key:\"jumps\",value:function jumps(o){return!this.properties.length&&this.base.jumps(o)}},{key:\"isObject\",value:function isObject(onlyGenerated){return!this.properties.length&&this.base instanceof Obj&&(!onlyGenerated||this.base.generated)}},{key:\"isElision\",value:function isElision(){return!!(this.base instanceof Arr)&&this.base.hasElision()}},{key:\"isSplice\",value:function isSplice(){var _slice1$call7,_slice1$call8,lastProperty,ref1;return ref1=this.properties,_slice1$call7=slice1.call(ref1,-1),_slice1$call8=_slicedToArray(_slice1$call7,1),lastProperty=_slice1$call8[0],_slice1$call7,lastProperty instanceof Slice}},{key:\"looksStatic\",value:function looksStatic(className){var name,ref1,thisLiteral;return!!(((thisLiteral=this.base)instanceof ThisLiteral||(name=this.base).value===className)&&1===this.properties.length&&\"prototype\"!==(null==(ref1=this.properties[0].name)?void 0:ref1.value))&&{staticClassName:null==thisLiteral?name:thisLiteral}}},{key:\"unwrap\",value:function unwrap(){return this.properties.length?this:this.base}},{key:\"cacheReference\",value:function cacheReference(o){var _slice1$call9,_slice1$call10,base,bref,name,nref,ref1;return(ref1=this.properties,_slice1$call9=slice1.call(ref1,-1),_slice1$call10=_slicedToArray(_slice1$call9,1),name=_slice1$call10[0],_slice1$call9,2>this.properties.length&&!this.base.shouldCache()&&(null==name||!name.shouldCache()))?[this,this]:(base=new Value(this.base,this.properties.slice(0,-1)),base.shouldCache()&&(bref=new IdentifierLiteral(o.scope.freeVariable(\"base\")),base=new Value(new Parens(new Assign(bref,base)))),!name)?[base,bref]:(name.shouldCache()&&(nref=new IdentifierLiteral(o.scope.freeVariable(\"name\")),name=new Index(new Assign(nref,name.index)),nref=new Index(nref)),[base.add(name),new Value(bref||base.base,[nref||name])])}},{key:\"compileNode\",value:function compileNode(o){var fragments,j,len1,prop,props;for(this.base.front=this.front,props=this.properties,fragments=props.length&&null!=this.base.cached?this.base.cached:this.base.compileToFragments(o,props.length?LEVEL_ACCESS:null),props.length&&SIMPLENUM.test(fragmentsToText(fragments))&&fragments.push(this.makeCode(\".\")),(j=0,len1=props.length);j<len1;j++){var _fragments2;prop=props[j],(_fragments2=fragments).push.apply(_fragments2,_toConsumableArray(prop.compileToFragments(o)))}return fragments}},{key:\"unfoldSoak\",value:function unfoldSoak(o){var _this23=this;return null==this.unfoldedSoak?this.unfoldedSoak=function(){var fst,i,ifn,j,len1,prop,ref,ref1,snd;if(ifn=_this23.base.unfoldSoak(o),ifn){var _ifn$body$properties;return(_ifn$body$properties=ifn.body.properties).push.apply(_ifn$body$properties,_toConsumableArray(_this23.properties)),ifn}for(ref1=_this23.properties,i=j=0,len1=ref1.length;j<len1;i=++j)if(prop=ref1[i],!!prop.soak)return prop.soak=!1,fst=new Value(_this23.base,_this23.properties.slice(0,i)),snd=new Value(_this23.base,_this23.properties.slice(i)),fst.shouldCache()&&(ref=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),fst=new Parens(new Assign(ref,fst)),snd.base=ref),new If(new Existence(fst),snd,{soak:!0});return!1}():this.unfoldedSoak}},{key:\"eachName\",value:function eachName(iterator){var _ref30=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref30$checkAssignabi=_ref30.checkAssignability;return this.hasProperties()?iterator(this):!(void 0===_ref30$checkAssignabi||_ref30$checkAssignabi)||this.base.isAssignable()?this.base.eachName(iterator):this.error(\"tried to assign to unassignable value\")}},{key:\"object\",value:function(){var initialProperties,object;return this.hasProperties()?(initialProperties=this.properties.slice(0,this.properties.length-1),object=new Value(this.base,initialProperties,this.tag,this.isDefaultValue),object.locationData=0===initialProperties.length?this.base.locationData:mergeLocationData(this.base.locationData,initialProperties[initialProperties.length-1].locationData),object):this}},{key:\"containsSoak\",value:function containsSoak(){var j,len1,property,ref1;if(!this.hasProperties())return!1;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(property=ref1[j],property.soak)return!0;return!!(this.base instanceof Call&&this.base.soak)}},{key:\"astNode\",value:function astNode(o){return this.hasProperties()?_get(_getPrototypeOf(Value.prototype),\"astNode\",this).call(this,o):this.base.ast(o)}},{key:\"astType\",value:function astType(){return this.isJSXTag()?\"JSXMemberExpression\":this.containsSoak()?\"OptionalMemberExpression\":\"MemberExpression\"}},{key:\"astProperties\",value:function astProperties(o){var _slice1$call11,_slice1$call12,computed,property,ref1,ref2;return ref1=this.properties,_slice1$call11=slice1.call(ref1,-1),_slice1$call12=_slicedToArray(_slice1$call11,1),property=_slice1$call12[0],_slice1$call11,this.isJSXTag()&&(property.name.jsx=!0),computed=property instanceof Index||!((null==(ref2=property.name)?void 0:ref2.unwrap())instanceof PropertyName),{object:this.object().ast(o,LEVEL_ACCESS),property:property.ast(o,computed?LEVEL_PAREN:void 0),computed:computed,optional:!!property.soak,shorthand:!!property.shorthand}}},{key:\"astLocationData\",value:function astLocationData(){return this.isJSXTag()?mergeAstLocationData(jisonLocationDataToAstLocationData(this.base.tagNameLocationData),jisonLocationDataToAstLocationData(this.properties[this.properties.length-1].locationData)):_get(_getPrototypeOf(Value.prototype),\"astLocationData\",this).call(this)}}]),Value}(Base);return Value.prototype.children=[\"base\",\"properties\"],Value}.call(this),exports.MetaProperty=MetaProperty=function(){var MetaProperty=function(_Base8){function MetaProperty(meta,property1){var _this24;return _classCallCheck(this,MetaProperty),_this24=_super26.call(this),_this24.meta=meta,_this24.property=property1,_this24}_inherits(MetaProperty,_Base8);var _super26=_createSuper(MetaProperty);return _createClass(MetaProperty,[{key:\"checkValid\",value:function checkValid(o){if(\"new\"===this.meta.value){if(!(this.property instanceof Access&&\"target\"===this.property.name.value))return this.error(\"the only valid meta property for new is new.target\");if(null==o.scope.parent)return this.error(\"new.target can only occur inside functions\")}else if(\"import\"===this.meta.value&&!(this.property instanceof Access&&\"meta\"===this.property.name.value))return this.error(\"the only valid meta property for import is import.meta\")}},{key:\"compileNode\",value:function compileNode(o){var _fragments3,_fragments4,fragments;return this.checkValid(o),fragments=[],(_fragments3=fragments).push.apply(_fragments3,_toConsumableArray(this.meta.compileToFragments(o,LEVEL_ACCESS))),(_fragments4=fragments).push.apply(_fragments4,_toConsumableArray(this.property.compileToFragments(o))),fragments}},{key:\"astProperties\",value:function astProperties(o){return this.checkValid(o),{meta:this.meta.ast(o,LEVEL_ACCESS),property:this.property.ast(o)}}}]),MetaProperty}(Base);return MetaProperty.prototype.children=[\"meta\",\"property\"],MetaProperty}.call(this),exports.HereComment=HereComment=function(_Base9){function HereComment(_ref31){var content1=_ref31.content,newLine=_ref31.newLine,unshift=_ref31.unshift,locationData1=_ref31.locationData,_this25;return _classCallCheck(this,HereComment),_this25=_super27.call(this),_this25.content=content1,_this25.newLine=newLine,_this25.unshift=unshift,_this25.locationData=locationData1,_this25}_inherits(HereComment,_Base9);var _super27=_createSuper(HereComment);return _createClass(HereComment,[{key:\"compileNode\",value:function compileNode(){var fragment,hasLeadingMarks,indent,j,leadingWhitespace,len1,line,multiline,ref1;if(multiline=0<=indexOf.call(this.content,\"\\n\"),multiline){for(indent=null,ref1=this.content.split(\"\\n\"),(j=0,len1=ref1.length);j<len1;j++)line=ref1[j],leadingWhitespace=/^\\s*/.exec(line)[0],(!indent||leadingWhitespace.length<indent.length)&&(indent=leadingWhitespace);indent&&(this.content=this.content.replace(RegExp(\"\\\\n\".concat(indent),\"g\"),\"\\n\"))}return hasLeadingMarks=/\\n\\s*[#|\\*]/.test(this.content),hasLeadingMarks&&(this.content=this.content.replace(/^([ \\t]*)#(?=\\s)/gm,\" *\")),this.content=\"/*\".concat(this.content).concat(hasLeadingMarks?\" \":\"\",\"*/\"),fragment=this.makeCode(this.content),fragment.newLine=this.newLine,fragment.unshift=this.unshift,fragment.multiline=multiline,fragment.isComment=fragment.isHereComment=!0,fragment}},{key:\"astType\",value:function astType(){return\"CommentBlock\"}},{key:\"astProperties\",value:function astProperties(){return{value:this.content}}}]),HereComment}(Base),exports.LineComment=LineComment=function(_Base10){function LineComment(_ref32){var content1=_ref32.content,newLine=_ref32.newLine,unshift=_ref32.unshift,locationData1=_ref32.locationData,precededByBlankLine=_ref32.precededByBlankLine,_this26;return _classCallCheck(this,LineComment),_this26=_super28.call(this),_this26.content=content1,_this26.newLine=newLine,_this26.unshift=unshift,_this26.locationData=locationData1,_this26.precededByBlankLine=precededByBlankLine,_this26}_inherits(LineComment,_Base10);var _super28=_createSuper(LineComment);return _createClass(LineComment,[{key:\"compileNode\",value:function compileNode(o){var fragment;return fragment=this.makeCode(/^\\s*$/.test(this.content)?\"\":\"\".concat(this.precededByBlankLine?\"\\n\".concat(o.indent):\"\",\"//\").concat(this.content)),fragment.newLine=this.newLine,fragment.unshift=this.unshift,fragment.trail=!this.newLine&&!this.unshift,fragment.isComment=fragment.isLineComment=!0,fragment}},{key:\"astType\",value:function astType(){return\"CommentLine\"}},{key:\"astProperties\",value:function astProperties(){return{value:this.content}}}]),LineComment}(Base),exports.JSXIdentifier=JSXIdentifier=function(_IdentifierLiteral){function JSXIdentifier(){return _classCallCheck(this,JSXIdentifier),_super29.apply(this,arguments)}_inherits(JSXIdentifier,_IdentifierLiteral);var _super29=_createSuper(JSXIdentifier);return _createClass(JSXIdentifier,[{key:\"astType\",value:function astType(){return\"JSXIdentifier\"}}]),JSXIdentifier}(IdentifierLiteral),exports.JSXTag=JSXTag=function(_JSXIdentifier){function JSXTag(value,_ref33){var tagNameLocationData=_ref33.tagNameLocationData,closingTagOpeningBracketLocationData=_ref33.closingTagOpeningBracketLocationData,closingTagSlashLocationData=_ref33.closingTagSlashLocationData,closingTagNameLocationData=_ref33.closingTagNameLocationData,closingTagClosingBracketLocationData=_ref33.closingTagClosingBracketLocationData,_this27;return _classCallCheck(this,JSXTag),_this27=_super30.call(this,value),_this27.tagNameLocationData=tagNameLocationData,_this27.closingTagOpeningBracketLocationData=closingTagOpeningBracketLocationData,_this27.closingTagSlashLocationData=closingTagSlashLocationData,_this27.closingTagNameLocationData=closingTagNameLocationData,_this27.closingTagClosingBracketLocationData=closingTagClosingBracketLocationData,_this27}_inherits(JSXTag,_JSXIdentifier);var _super30=_createSuper(JSXTag);return _createClass(JSXTag,[{key:\"astProperties\",value:function astProperties(){return{name:this.value}}}]),JSXTag}(JSXIdentifier),exports.JSXExpressionContainer=JSXExpressionContainer=function(){var JSXExpressionContainer=function(_Base11){function JSXExpressionContainer(expression1){var _ref34=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},locationData=_ref34.locationData,_this28;return _classCallCheck(this,JSXExpressionContainer),_this28=_super31.call(this),_this28.expression=expression1,_this28.expression.jsxAttribute=!0,_this28.locationData=null==locationData?_this28.expression.locationData:locationData,_this28}_inherits(JSXExpressionContainer,_Base11);var _super31=_createSuper(JSXExpressionContainer);return _createClass(JSXExpressionContainer,[{key:\"compileNode\",value:function compileNode(o){return this.expression.compileNode(o)}},{key:\"astProperties\",value:function astProperties(o){return{expression:astAsBlockIfNeeded(this.expression,o)}}}]),JSXExpressionContainer}(Base);return JSXExpressionContainer.prototype.children=[\"expression\"],JSXExpressionContainer}.call(this),exports.JSXEmptyExpression=JSXEmptyExpression=function(_Base12){function JSXEmptyExpression(){return _classCallCheck(this,JSXEmptyExpression),_super32.apply(this,arguments)}_inherits(JSXEmptyExpression,_Base12);var _super32=_createSuper(JSXEmptyExpression);return _createClass(JSXEmptyExpression)}(Base),exports.JSXText=JSXText=function(_Base13){function JSXText(stringLiteral){var _this29;return _classCallCheck(this,JSXText),_this29=_super33.call(this),_this29.value=stringLiteral.unquotedValueForJSX,_this29.locationData=stringLiteral.locationData,_this29}_inherits(JSXText,_Base13);var _super33=_createSuper(JSXText);return _createClass(JSXText,[{key:\"astProperties\",value:function astProperties(){return{value:this.value,extra:{raw:this.value}}}}]),JSXText}(Base),exports.JSXAttribute=JSXAttribute=function(){var JSXAttribute=function(_Base14){function JSXAttribute(_ref35){var name1=_ref35.name,value=_ref35.value,_this30;_classCallCheck(this,JSXAttribute);var ref1;return _this30=_super34.call(this),_this30.name=name1,_this30.value=null==value?null:(value=value.base,value instanceof StringLiteral&&!value.shouldGenerateTemplateLiteral()?value:new JSXExpressionContainer(value)),null!=(ref1=_this30.value)&&(ref1.comments=value.comments),_this30}_inherits(JSXAttribute,_Base14);var _super34=_createSuper(JSXAttribute);return _createClass(JSXAttribute,[{key:\"compileNode\",value:function compileNode(o){var compiledName,val;return(compiledName=this.name.compileToFragments(o,LEVEL_LIST),null==this.value)?compiledName:(val=this.value.compileToFragments(o,LEVEL_LIST),compiledName.concat(this.makeCode(\"=\"),val))}},{key:\"astProperties\",value:function astProperties(o){var name,ref1,ref2;return name=this.name,0<=indexOf.call(name.value,\":\")&&(name=new JSXNamespacedName(name)),{name:name.ast(o),value:null==(ref1=null==(ref2=this.value)?void 0:ref2.ast(o))?null:ref1}}}]),JSXAttribute}(Base);return JSXAttribute.prototype.children=[\"name\",\"value\"],JSXAttribute}.call(this),exports.JSXAttributes=JSXAttributes=function(){var JSXAttributes=function(_Base15){function JSXAttributes(arr){var _this31;_classCallCheck(this,JSXAttributes);var attribute,base,j,k,len1,len2,object,property,ref1,ref2,value,variable;for(_this31=_super35.call(this),_this31.attributes=[],ref1=arr.objects,(j=0,len1=ref1.length);j<len1;j++){object=ref1[j],_this31.checkValidAttribute(object);var _object=object;if(base=_object.base,base instanceof IdentifierLiteral)attribute=new JSXAttribute({name:new JSXIdentifier(base.value).withLocationDataAndCommentsFrom(base)}),attribute.locationData=base.locationData,_this31.attributes.push(attribute);else if(!base.generated)attribute=base.properties[0],attribute.jsx=!0,attribute.locationData=base.locationData,_this31.attributes.push(attribute);else for(ref2=base.properties,k=0,len2=ref2.length;k<len2;k++){property=ref2[k];var _property=property;variable=_property.variable,value=_property.value,attribute=new JSXAttribute({name:new JSXIdentifier(variable.base.value).withLocationDataAndCommentsFrom(variable.base),value:value}),attribute.locationData=property.locationData,_this31.attributes.push(attribute)}}return _this31.locationData=arr.locationData,_this31}_inherits(JSXAttributes,_Base15);var _super35=_createSuper(JSXAttributes);return _createClass(JSXAttributes,[{key:\"checkValidAttribute\",value:function checkValidAttribute(object){var attribute,properties;if(attribute=object.base,properties=(null==attribute?void 0:attribute.properties)||[],!(attribute instanceof Obj||attribute instanceof IdentifierLiteral)||attribute instanceof Obj&&!attribute.generated&&(1<properties.length||!(properties[0]instanceof Splat)))return object.error(\"Unexpected token. Allowed JSX attributes are: id=\\\"val\\\", src={source}, {props...} or attribute.\")}},{key:\"compileNode\",value:function compileNode(o){var attribute,fragments,j,len1,ref1;for(fragments=[],ref1=this.attributes,(j=0,len1=ref1.length);j<len1;j++){var _fragments5;attribute=ref1[j],fragments.push(this.makeCode(\" \")),(_fragments5=fragments).push.apply(_fragments5,_toConsumableArray(attribute.compileToFragments(o,LEVEL_TOP)))}return fragments}},{key:\"astNode\",value:function astNode(o){var attribute,j,len1,ref1,results1;for(ref1=this.attributes,results1=[],(j=0,len1=ref1.length);j<len1;j++)attribute=ref1[j],results1.push(attribute.ast(o));return results1}}]),JSXAttributes}(Base);return JSXAttributes.prototype.children=[\"attributes\"],JSXAttributes}.call(this),exports.JSXNamespacedName=JSXNamespacedName=function(){var JSXNamespacedName=function(_Base16){function JSXNamespacedName(tag){var _this32;_classCallCheck(this,JSXNamespacedName);var name,namespace;_this32=_super36.call(this);var _tag$value$split=tag.value.split(\":\"),_tag$value$split2=_slicedToArray(_tag$value$split,2);return namespace=_tag$value$split2[0],name=_tag$value$split2[1],_this32.namespace=new JSXIdentifier(namespace).withLocationDataFrom({locationData:extractSameLineLocationDataFirst(namespace.length)(tag.locationData)}),_this32.name=new JSXIdentifier(name).withLocationDataFrom({locationData:extractSameLineLocationDataLast(name.length)(tag.locationData)}),_this32.locationData=tag.locationData,_this32}_inherits(JSXNamespacedName,_Base16);var _super36=_createSuper(JSXNamespacedName);return _createClass(JSXNamespacedName,[{key:\"astProperties\",value:function astProperties(o){return{namespace:this.namespace.ast(o),name:this.name.ast(o)}}}]),JSXNamespacedName}(Base);return JSXNamespacedName.prototype.children=[\"namespace\",\"name\"],JSXNamespacedName}.call(this),exports.JSXElement=JSXElement=function(){var JSXElement=function(_Base17){function JSXElement(_ref36){var tagName1=_ref36.tagName,attributes=_ref36.attributes,content1=_ref36.content,_this33;return _classCallCheck(this,JSXElement),_this33=_super37.call(this),_this33.tagName=tagName1,_this33.attributes=attributes,_this33.content=content1,_this33}_inherits(JSXElement,_Base17);var _super37=_createSuper(JSXElement);return _createClass(JSXElement,[{key:\"compileNode\",value:function compileNode(o){var _fragments6,_fragments7,fragments,ref1,tag;if(null!=(ref1=this.content)&&(ref1.base.jsx=!0),fragments=[this.makeCode(\"<\")],(_fragments6=fragments).push.apply(_fragments6,_toConsumableArray(tag=this.tagName.compileToFragments(o,LEVEL_ACCESS))),(_fragments7=fragments).push.apply(_fragments7,_toConsumableArray(this.attributes.compileToFragments(o))),this.content){var _fragments8,_fragments9;fragments.push(this.makeCode(\">\")),(_fragments8=fragments).push.apply(_fragments8,_toConsumableArray(this.content.compileNode(o,LEVEL_LIST))),(_fragments9=fragments).push.apply(_fragments9,[this.makeCode(\"</\")].concat(_toConsumableArray(tag),[this.makeCode(\">\")]))}else fragments.push(this.makeCode(\" />\"));return fragments}},{key:\"isFragment\",value:function isFragment(){return!this.tagName.base.value.length}},{key:\"astNode\",value:function astNode(o){var tagName;return this.openingElementLocationData=jisonLocationDataToAstLocationData(this.attributes.locationData),tagName=this.tagName.base,tagName.locationData=tagName.tagNameLocationData,null!=this.content&&(this.closingElementLocationData=mergeAstLocationData(jisonLocationDataToAstLocationData(tagName.closingTagOpeningBracketLocationData),jisonLocationDataToAstLocationData(tagName.closingTagClosingBracketLocationData))),_get(_getPrototypeOf(JSXElement.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isFragment()?\"JSXFragment\":\"JSXElement\"}},{key:\"elementAstProperties\",value:function elementAstProperties(o){var _this34=this,closingElement,columnDiff,currentExpr,openingElement,rangeDiff,ref1,shiftAstLocationData,tagNameAst;if(tagNameAst=function(){var tag;return tag=_this34.tagName.unwrap(),(null==tag?void 0:tag.value)&&0<=indexOf.call(tag.value,\":\")&&(tag=new JSXNamespacedName(tag)),tag.ast(o)},openingElement=Object.assign({type:\"JSXOpeningElement\",name:tagNameAst(),selfClosing:null==this.closingElementLocationData,attributes:this.attributes.ast(o)},this.openingElementLocationData),closingElement=null,null!=this.closingElementLocationData&&(closingElement=Object.assign({type:\"JSXClosingElement\",name:Object.assign(tagNameAst(),jisonLocationDataToAstLocationData(this.tagName.base.closingTagNameLocationData))},this.closingElementLocationData),\"JSXMemberExpression\"===(ref1=closingElement.name.type)||\"JSXNamespacedName\"===ref1))if(rangeDiff=closingElement.range[0]-openingElement.range[0]+\"/\".length,columnDiff=closingElement.loc.start.column-openingElement.loc.start.column+\"/\".length,shiftAstLocationData=function(node){return node.range=[node.range[0]+rangeDiff,node.range[1]+rangeDiff],node.start+=rangeDiff,node.end+=rangeDiff,node.loc.start={line:_this34.closingElementLocationData.loc.start.line,column:node.loc.start.column+columnDiff},node.loc.end={line:_this34.closingElementLocationData.loc.start.line,column:node.loc.end.column+columnDiff}},\"JSXMemberExpression\"===closingElement.name.type){for(currentExpr=closingElement.name;\"JSXMemberExpression\"===currentExpr.type;)currentExpr!==closingElement.name&&shiftAstLocationData(currentExpr),shiftAstLocationData(currentExpr.property),currentExpr=currentExpr.object;shiftAstLocationData(currentExpr)}else shiftAstLocationData(closingElement.name.namespace),shiftAstLocationData(closingElement.name.name);return{openingElement:openingElement,closingElement:closingElement}}},{key:\"fragmentAstProperties\",value:function fragmentAstProperties(){var closingFragment,openingFragment;return openingFragment=Object.assign({type:\"JSXOpeningFragment\"},this.openingElementLocationData),closingFragment=Object.assign({type:\"JSXClosingFragment\"},this.closingElementLocationData),{openingFragment:openingFragment,closingFragment:closingFragment}}},{key:\"contentAst\",value:function contentAst(o){var base1,child,children,content,element,emptyExpression,expression,j,len1,results1,unwrapped;if(!this.content||(\"function\"==typeof(base1=this.content.base).isEmpty?base1.isEmpty():void 0))return[];for(content=this.content.unwrapAll(),children=function(){var j,len1,ref1,results1;if(content instanceof StringLiteral)return[new JSXText(content)];for(ref1=this.content.unwrapAll().extractElements(o,{includeInterpolationWrappers:!0,isJsx:!0}),results1=[],(j=0,len1=ref1.length);j<len1;j++)if(element=ref1[j],element instanceof StringLiteral)results1.push(new JSXText(element));else{var _element=element;expression=_element.expression,null==expression?(emptyExpression=new JSXEmptyExpression,emptyExpression.locationData=emptyExpressionLocationData({interpolationNode:element,openingBrace:\"{\",closingBrace:\"}\"}),results1.push(new JSXExpressionContainer(emptyExpression,{locationData:element.locationData}))):(unwrapped=expression.unwrapAll(),unwrapped instanceof JSXElement&&unwrapped.locationData.range[0]===element.locationData.range[0]?results1.push(unwrapped):results1.push(new JSXExpressionContainer(unwrapped,{locationData:element.locationData})))}return results1}.call(this),results1=[],(j=0,len1=children.length);j<len1;j++)child=children[j],child instanceof JSXText&&0===child.value.length||results1.push(child.ast(o));return results1}},{key:\"astProperties\",value:function astProperties(o){return Object.assign(this.isFragment()?this.fragmentAstProperties(o):this.elementAstProperties(o),{children:this.contentAst(o)})}},{key:\"astLocationData\",value:function astLocationData(){return null==this.closingElementLocationData?this.openingElementLocationData:mergeAstLocationData(this.openingElementLocationData,this.closingElementLocationData)}}]),JSXElement}(Base);return JSXElement.prototype.children=[\"tagName\",\"attributes\",\"content\"],JSXElement}.call(this),exports.Call=Call=function(){var Call=function(_Base18){function Call(variable1){var args1=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[],soak1=2<arguments.length?arguments[2]:void 0,token1=3<arguments.length?arguments[3]:void 0,_this35;_classCallCheck(this,Call);var ref1;return(_this35=_super38.call(this),_this35.variable=variable1,_this35.args=args1,_this35.soak=soak1,_this35.token=token1,_this35.implicit=_this35.args.implicit,_this35.isNew=!1,_this35.variable instanceof Value&&_this35.variable.isNotCallable()&&_this35.variable.error(\"literal is not a function\"),_this35.variable.base instanceof JSXTag)?_possibleConstructorReturn(_this35,new JSXElement({tagName:_this35.variable,attributes:new JSXAttributes(_this35.args[0].base),content:_this35.args[1]})):(\"RegExp\"===(null==(ref1=_this35.variable.base)?void 0:ref1.value)&&0!==_this35.args.length&&moveComments(_this35.variable,_this35.args[0]),_this35)}_inherits(Call,_Base18);var _super38=_createSuper(Call);return _createClass(Call,[{key:\"updateLocationDataIfMissing\",value:function updateLocationDataIfMissing(locationData){var base,ref1;return this.locationData&&this.needsUpdatedStartLocation&&(this.locationData=Object.assign({},this.locationData,{first_line:locationData.first_line,first_column:locationData.first_column,range:[locationData.range[0],this.locationData.range[1]]}),base=(null==(ref1=this.variable)?void 0:ref1.base)||this.variable,base.needsUpdatedStartLocation&&(this.variable.locationData=Object.assign({},this.variable.locationData,{first_line:locationData.first_line,first_column:locationData.first_column,range:[locationData.range[0],this.variable.locationData.range[1]]}),base.updateLocationDataIfMissing(locationData)),delete this.needsUpdatedStartLocation),_get(_getPrototypeOf(Call.prototype),\"updateLocationDataIfMissing\",this).call(this,locationData)}},{key:\"newInstance\",value:function newInstance(){var base,ref1;return base=(null==(ref1=this.variable)?void 0:ref1.base)||this.variable,base instanceof Call&&!base.isNew?base.newInstance():this.isNew=!0,this.needsUpdatedStartLocation=!0,this}},{key:\"unfoldSoak\",value:function unfoldSoak(o){var call,ifn,j,left,len1,list,ref1,rite;if(this.soak){if(this.variable instanceof Super)left=new Literal(this.variable.compile(o)),rite=new Value(left),null==this.variable.accessor&&this.variable.error(\"Unsupported reference to 'super'\");else{if(ifn=_unfoldSoak(o,this,\"variable\"))return ifn;var _Value$cacheReference=new Value(this.variable).cacheReference(o),_Value$cacheReference2=_slicedToArray(_Value$cacheReference,2);left=_Value$cacheReference2[0],rite=_Value$cacheReference2[1]}return rite=new Call(rite,this.args),rite.isNew=this.isNew,left=new Literal(\"typeof \".concat(left.compile(o),\" === \\\"function\\\"\")),new If(left,new Value(rite),{soak:!0})}for(call=this,list=[];;){if(call.variable instanceof Call){list.push(call),call=call.variable;continue}if(!(call.variable instanceof Value))break;if(list.push(call),!((call=call.variable.base)instanceof Call))break}for(ref1=list.reverse(),j=0,len1=ref1.length;j<len1;j++)call=ref1[j],ifn&&(call.variable instanceof Call?call.variable=ifn:call.variable.base=ifn),ifn=_unfoldSoak(o,call,\"variable\");return ifn}},{key:\"compileNode\",value:function compileNode(o){var _fragments10,_fragments11,arg,argCode,argIndex,cache,compiledArgs,fragments,j,len1,ref1,ref2,ref3,ref4,varAccess;if(this.checkForNewSuper(),null!=(ref1=this.variable)&&(ref1.front=this.front),compiledArgs=[],varAccess=(null==(ref2=this.variable)||null==(ref3=ref2.properties)?void 0:ref3[0])instanceof Access,argCode=function(){var j,len1,ref4,results1;for(ref4=this.args||[],results1=[],(j=0,len1=ref4.length);j<len1;j++)arg=ref4[j],arg instanceof Code&&results1.push(arg);return results1}.call(this),0<argCode.length&&varAccess&&!this.variable.base.cached){var _this$variable$base$c=this.variable.base.cache(o,LEVEL_ACCESS,function(){return!1}),_this$variable$base$c2=_slicedToArray(_this$variable$base$c,1);cache=_this$variable$base$c2[0],this.variable.base.cached=cache}for(ref4=this.args,argIndex=j=0,len1=ref4.length;j<len1;argIndex=++j){var _compiledArgs;arg=ref4[argIndex],argIndex&&compiledArgs.push(this.makeCode(\", \")),(_compiledArgs=compiledArgs).push.apply(_compiledArgs,_toConsumableArray(arg.compileToFragments(o,LEVEL_LIST)))}return fragments=[],this.isNew&&fragments.push(this.makeCode(\"new \")),(_fragments10=fragments).push.apply(_fragments10,_toConsumableArray(this.variable.compileToFragments(o,LEVEL_ACCESS))),(_fragments11=fragments).push.apply(_fragments11,[this.makeCode(\"(\")].concat(_toConsumableArray(compiledArgs),[this.makeCode(\")\")])),fragments}},{key:\"checkForNewSuper\",value:function checkForNewSuper(){if(this.isNew&&this.variable instanceof Super)return this.variable.error(\"Unsupported reference to 'super'\")}},{key:\"containsSoak\",value:function containsSoak(){var ref1;return!!this.soak||null!=(ref1=this.variable)&&\"function\"==typeof ref1.containsSoak&&ref1.containsSoak()}},{key:\"astNode\",value:function astNode(o){var ref1;return this.soak&&this.variable instanceof Super&&(null==(ref1=o.scope.namedMethod())?void 0:ref1.ctor)&&this.variable.error(\"Unsupported reference to 'super'\"),this.checkForNewSuper(),_get(_getPrototypeOf(Call.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isNew?\"NewExpression\":this.containsSoak()?\"OptionalCallExpression\":\"CallExpression\"}},{key:\"astProperties\",value:function astProperties(o){var arg;return{callee:this.variable.ast(o,LEVEL_ACCESS),arguments:function(){var j,len1,ref1,results1;for(ref1=this.args,results1=[],(j=0,len1=ref1.length);j<len1;j++)arg=ref1[j],results1.push(arg.ast(o,LEVEL_LIST));return results1}.call(this),optional:!!this.soak,implicit:!!this.implicit}}}]),Call}(Base);return Call.prototype.children=[\"variable\",\"args\"],Call}.call(this),exports.SuperCall=SuperCall=function(){var SuperCall=function(_Call){function SuperCall(){return _classCallCheck(this,SuperCall),_super39.apply(this,arguments)}_inherits(SuperCall,_Call);var _super39=_createSuper(SuperCall);return _createClass(SuperCall,[{key:\"isStatement\",value:function isStatement(o){var ref1;return(null==(ref1=this.expressions)?void 0:ref1.length)&&o.level===LEVEL_TOP}},{key:\"compileNode\",value:function compileNode(o){var ref,ref1,replacement,superCall;if(null==(ref1=this.expressions)||!ref1.length)return _get(_getPrototypeOf(SuperCall.prototype),\"compileNode\",this).call(this,o);if(superCall=new Literal(fragmentsToText(_get(_getPrototypeOf(SuperCall.prototype),\"compileNode\",this).call(this,o))),replacement=new Block(this.expressions.slice()),o.level>LEVEL_TOP){var _superCall$cache=superCall.cache(o,null,YES),_superCall$cache2=_slicedToArray(_superCall$cache,2);superCall=_superCall$cache2[0],ref=_superCall$cache2[1],replacement.push(ref)}return replacement.unshift(superCall),replacement.compileToFragments(o,o.level===LEVEL_TOP?o.level:LEVEL_LIST)}}]),SuperCall}(Call);return SuperCall.prototype.children=Call.prototype.children.concat([\"expressions\"]),SuperCall}.call(this),exports.Super=Super=function(){var Super=function(_Base19){function Super(accessor,superLiteral){var _this36;return _classCallCheck(this,Super),_this36=_super40.call(this),_this36.accessor=accessor,_this36.superLiteral=superLiteral,_this36}_inherits(Super,_Base19);var _super40=_createSuper(Super);return _createClass(Super,[{key:\"compileNode\",value:function compileNode(o){var fragments,method,name,nref,ref1,ref2,salvagedComments,variable;if(this.checkInInstanceMethod(o),method=o.scope.namedMethod(),null==method.ctor&&null==this.accessor){var _method=method;name=_method.name,variable=_method.variable,(name.shouldCache()||name instanceof Index&&name.index.isAssignable())&&(nref=new IdentifierLiteral(o.scope.parent.freeVariable(\"name\")),name.index=new Assign(nref,name.index)),this.accessor=null==nref?name:new Index(nref)}return(null==(ref1=this.accessor)||null==(ref2=ref1.name)?void 0:ref2.comments)&&(salvagedComments=this.accessor.name.comments,delete this.accessor.name.comments),fragments=new Value(new Literal(\"super\"),this.accessor?[this.accessor]:[]).compileToFragments(o),salvagedComments&&attachCommentsToNode(salvagedComments,this.accessor.name),fragments}},{key:\"checkInInstanceMethod\",value:function checkInInstanceMethod(o){var method;if(method=o.scope.namedMethod(),null==method||!method.isMethod)return this.error(\"cannot use super outside of an instance method\")}},{key:\"astNode\",value:function astNode(o){var ref1;return this.checkInInstanceMethod(o),null==this.accessor?_get(_getPrototypeOf(Super.prototype),\"astNode\",this).call(this,o):new Value(new Super().withLocationDataFrom(null==(ref1=this.superLiteral)?this:ref1),[this.accessor]).withLocationDataFrom(this).ast(o)}}]),Super}(Base);return Super.prototype.children=[\"accessor\"],Super}.call(this),exports.RegexWithInterpolations=RegexWithInterpolations=function(){var RegexWithInterpolations=function(_Base20){function RegexWithInterpolations(call1){var _ref37=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref37$heregexComment=_ref37.heregexCommentTokens,heregexCommentTokens=void 0===_ref37$heregexComment?[]:_ref37$heregexComment,_this37;return _classCallCheck(this,RegexWithInterpolations),_this37=_super41.call(this),_this37.call=call1,_this37.heregexCommentTokens=heregexCommentTokens,_this37}_inherits(RegexWithInterpolations,_Base20);var _super41=_createSuper(RegexWithInterpolations);return _createClass(RegexWithInterpolations,[{key:\"compileNode\",value:function compileNode(o){return this.call.compileNode(o)}},{key:\"astType\",value:function astType(){return\"InterpolatedRegExpLiteral\"}},{key:\"astProperties\",value:function astProperties(o){var heregexCommentToken,ref1,ref2;return{interpolatedPattern:this.call.args[0].ast(o),flags:null==(ref1=null==(ref2=this.call.args[1])?void 0:ref2.unwrap().originalValue)?\"\":ref1,comments:function(){var j,len1,ref3,results1;for(ref3=this.heregexCommentTokens,results1=[],(j=0,len1=ref3.length);j<len1;j++)heregexCommentToken=ref3[j],heregexCommentToken.here?results1.push(new HereComment(heregexCommentToken).ast(o)):results1.push(new LineComment(heregexCommentToken).ast(o));return results1}.call(this)}}}]),RegexWithInterpolations}(Base);return RegexWithInterpolations.prototype.children=[\"call\"],RegexWithInterpolations}.call(this),exports.TaggedTemplateCall=TaggedTemplateCall=function(_Call2){function TaggedTemplateCall(variable,arg,soak){return _classCallCheck(this,TaggedTemplateCall),arg instanceof StringLiteral&&(arg=StringWithInterpolations.fromStringLiteral(arg)),_super42.call(this,variable,[arg],soak)}_inherits(TaggedTemplateCall,_Call2);var _super42=_createSuper(TaggedTemplateCall);return _createClass(TaggedTemplateCall,[{key:\"compileNode\",value:function compileNode(o){return this.variable.compileToFragments(o,LEVEL_ACCESS).concat(this.args[0].compileToFragments(o,LEVEL_LIST))}},{key:\"astType\",value:function astType(){return\"TaggedTemplateExpression\"}},{key:\"astProperties\",value:function astProperties(o){return{tag:this.variable.ast(o,LEVEL_ACCESS),quasi:this.args[0].ast(o,LEVEL_LIST)}}}]),TaggedTemplateCall}(Call),exports.Extends=Extends=function(){var Extends=function(_Base21){function Extends(child1,parent1){var _this38;return _classCallCheck(this,Extends),_this38=_super43.call(this),_this38.child=child1,_this38.parent=parent1,_this38}_inherits(Extends,_Base21);var _super43=_createSuper(Extends);return _createClass(Extends,[{key:\"compileToFragments\",value:function compileToFragments(o){return new Call(new Value(new Literal(utility(\"extend\",o))),[this.child,this.parent]).compileToFragments(o)}}]),Extends}(Base);return Extends.prototype.children=[\"child\",\"parent\"],Extends}.call(this),exports.Access=Access=function(){var Access=function(_Base22){function Access(name1){var _ref38=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},soak1=_ref38.soak,shorthand=_ref38.shorthand,_this39;return _classCallCheck(this,Access),_this39=_super44.call(this),_this39.name=name1,_this39.soak=soak1,_this39.shorthand=shorthand,_this39}_inherits(Access,_Base22);var _super44=_createSuper(Access);return _createClass(Access,[{key:\"compileToFragments\",value:function compileToFragments(o){var name,node;return name=this.name.compileToFragments(o),node=this.name.unwrap(),node instanceof PropertyName?[this.makeCode(\".\")].concat(_toConsumableArray(name)):[this.makeCode(\"[\")].concat(_toConsumableArray(name),[this.makeCode(\"]\")])}},{key:\"astNode\",value:function astNode(o){return this.name.ast(o)}}]),Access}(Base);return Access.prototype.children=[\"name\"],Access.prototype.shouldCache=NO,Access}.call(this),exports.Index=Index=function(){var Index=function(_Base23){function Index(index1){var _this40;return _classCallCheck(this,Index),_this40=_super45.call(this),_this40.index=index1,_this40}_inherits(Index,_Base23);var _super45=_createSuper(Index);return _createClass(Index,[{key:\"compileToFragments\",value:function compileToFragments(o){return[].concat(this.makeCode(\"[\"),this.index.compileToFragments(o,LEVEL_PAREN),this.makeCode(\"]\"))}},{key:\"shouldCache\",value:function shouldCache(){return this.index.shouldCache()}},{key:\"astNode\",value:function astNode(o){return this.index.ast(o)}}]),Index}(Base);return Index.prototype.children=[\"index\"],Index}.call(this),exports.Range=Range=function(){var Range=function(_Base24){function Range(from1,to1,tag){var _this41;return _classCallCheck(this,Range),_this41=_super46.call(this),_this41.from=from1,_this41.to=to1,_this41.exclusive=\"exclusive\"===tag,_this41.equals=_this41.exclusive?\"\":\"=\",_this41}_inherits(Range,_Base24);var _super46=_createSuper(Range);return _createClass(Range,[{key:\"compileVariables\",value:function compileVariables(o){var shouldCache,step;o=merge(o,{top:!0}),shouldCache=del(o,\"shouldCache\");var _this$cacheToCodeFrag=this.cacheToCodeFragments(this.from.cache(o,LEVEL_LIST,shouldCache)),_this$cacheToCodeFrag2=_slicedToArray(_this$cacheToCodeFrag,2);this.fromC=_this$cacheToCodeFrag2[0],this.fromVar=_this$cacheToCodeFrag2[1];var _this$cacheToCodeFrag3=this.cacheToCodeFragments(this.to.cache(o,LEVEL_LIST,shouldCache)),_this$cacheToCodeFrag4=_slicedToArray(_this$cacheToCodeFrag3,2);if(this.toC=_this$cacheToCodeFrag4[0],this.toVar=_this$cacheToCodeFrag4[1],step=del(o,\"step\")){var _this$cacheToCodeFrag5=this.cacheToCodeFragments(step.cache(o,LEVEL_LIST,shouldCache)),_this$cacheToCodeFrag6=_slicedToArray(_this$cacheToCodeFrag5,2);this.step=_this$cacheToCodeFrag6[0],this.stepVar=_this$cacheToCodeFrag6[1]}return this.fromNum=this.from.isNumber()?parseNumber(this.fromVar):null,this.toNum=this.to.isNumber()?parseNumber(this.toVar):null,this.stepNum=(null==step?void 0:step.isNumber())?parseNumber(this.stepVar):null}},{key:\"compileNode\",value:function compileNode(o){var cond,condPart,from,gt,idx,idxName,known,lowerBound,lt,namedIndex,ref1,ref2,stepCond,stepNotZero,stepPart,to,upperBound,varPart;if(this.fromVar||this.compileVariables(o),!o.index)return this.compileArray(o);known=null!=this.fromNum&&null!=this.toNum,idx=del(o,\"index\"),idxName=del(o,\"name\"),namedIndex=idxName&&idxName!==idx,varPart=known&&!namedIndex?\"var \".concat(idx,\" = \").concat(this.fromC):\"\".concat(idx,\" = \").concat(this.fromC),this.toC!==this.toVar&&(varPart+=\", \".concat(this.toC)),this.step!==this.stepVar&&(varPart+=\", \".concat(this.step)),lt=\"\".concat(idx,\" <\").concat(this.equals),gt=\"\".concat(idx,\" >\").concat(this.equals);var _ref39=[this.fromNum,this.toNum];return from=_ref39[0],to=_ref39[1],stepNotZero=\"\".concat(null==(ref1=this.stepNum)?this.stepVar:ref1,\" !== 0\"),stepCond=\"\".concat(null==(ref2=this.stepNum)?this.stepVar:ref2,\" > 0\"),lowerBound=\"\".concat(lt,\" \").concat(known?to:this.toVar),upperBound=\"\".concat(gt,\" \").concat(known?to:this.toVar),condPart=null==this.step?known?\"\".concat(from<=to?lt:gt,\" \").concat(to):\"(\".concat(this.fromVar,\" <= \").concat(this.toVar,\" ? \").concat(lowerBound,\" : \").concat(upperBound,\")\"):null!=this.stepNum&&0!==this.stepNum?0<this.stepNum?\"\".concat(lowerBound):\"\".concat(upperBound):\"\".concat(stepNotZero,\" && (\").concat(stepCond,\" ? \").concat(lowerBound,\" : \").concat(upperBound,\")\"),cond=this.stepVar?\"\".concat(this.stepVar,\" > 0\"):\"\".concat(this.fromVar,\" <= \").concat(this.toVar),stepPart=this.stepVar?\"\".concat(idx,\" += \").concat(this.stepVar):known?namedIndex?from<=to?\"++\".concat(idx):\"--\".concat(idx):from<=to?\"\".concat(idx,\"++\"):\"\".concat(idx,\"--\"):namedIndex?\"\".concat(cond,\" ? ++\").concat(idx,\" : --\").concat(idx):\"\".concat(cond,\" ? \").concat(idx,\"++ : \").concat(idx,\"--\"),namedIndex&&(varPart=\"\".concat(idxName,\" = \").concat(varPart)),namedIndex&&(stepPart=\"\".concat(idxName,\" = \").concat(stepPart)),[this.makeCode(\"\".concat(varPart,\"; \").concat(condPart,\"; \").concat(stepPart))]}},{key:\"compileArray\",value:function compileArray(o){var args,body,cond,hasArgs,i,idt,known,post,pre,range,ref1,result,vars;return(known=null!=this.fromNum&&null!=this.toNum,known&&20>=_Mathabs(this.fromNum-this.toNum))?(range=function(){for(var results1=[],j=ref1=this.fromNum,ref2=this.toNum;ref1<=ref2?j<=ref2:j>=ref2;ref1<=ref2?j++:j--)results1.push(j);return results1}.apply(this),this.exclusive&&range.pop(),[this.makeCode(\"[\".concat(range.join(\", \"),\"]\"))]):(idt=this.tab+TAB,i=o.scope.freeVariable(\"i\",{single:!0,reserve:!1}),result=o.scope.freeVariable(\"results\",{reserve:!1}),pre=\"\\n\".concat(idt,\"var \").concat(result,\" = [];\"),known?(o.index=i,body=fragmentsToText(this.compileNode(o))):(vars=\"\".concat(i,\" = \").concat(this.fromC)+(this.toC===this.toVar?\"\":\", \".concat(this.toC)),cond=\"\".concat(this.fromVar,\" <= \").concat(this.toVar),body=\"var \".concat(vars,\"; \").concat(cond,\" ? \").concat(i,\" <\").concat(this.equals,\" \").concat(this.toVar,\" : \").concat(i,\" >\").concat(this.equals,\" \").concat(this.toVar,\"; \").concat(cond,\" ? \").concat(i,\"++ : \").concat(i,\"--\")),post=\"{ \".concat(result,\".push(\").concat(i,\"); }\\n\").concat(idt,\"return \").concat(result,\";\\n\").concat(o.indent),hasArgs=function(node){return null==node?void 0:node.contains(isLiteralArguments)},(hasArgs(this.from)||hasArgs(this.to))&&(args=\", arguments\"),[this.makeCode(\"(function() {\".concat(pre,\"\\n\").concat(idt,\"for (\").concat(body,\")\").concat(post,\"}).apply(this\").concat(null==args?\"\":args,\")\"))])}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{from:null==(ref1=null==(ref2=this.from)?void 0:ref2.ast(o))?null:ref1,to:null==(ref3=null==(ref4=this.to)?void 0:ref4.ast(o))?null:ref3,exclusive:this.exclusive}}}]),Range}(Base);return Range.prototype.children=[\"from\",\"to\"],Range}.call(this),exports.Slice=Slice=function(){var Slice=function(_Base25){function Slice(range1){var _this42;return _classCallCheck(this,Slice),_this42=_super47.call(this),_this42.range=range1,_this42}_inherits(Slice,_Base25);var _super47=_createSuper(Slice);return _createClass(Slice,[{key:\"compileNode\",value:function compileNode(o){var _this$range=this.range,compiled,compiledText,from,fromCompiled,to,toStr;return to=_this$range.to,from=_this$range.from,(null==from?void 0:from.shouldCache())&&(from=new Value(new Parens(from))),(null==to?void 0:to.shouldCache())&&(to=new Value(new Parens(to))),fromCompiled=(null==from?void 0:from.compileToFragments(o,LEVEL_PAREN))||[this.makeCode(\"0\")],to&&(compiled=to.compileToFragments(o,LEVEL_PAREN),compiledText=fragmentsToText(compiled),(this.range.exclusive||-1!=+compiledText)&&(toStr=\", \"+(this.range.exclusive?compiledText:to.isNumber()?\"\".concat(+compiledText+1):(compiled=to.compileToFragments(o,LEVEL_ACCESS),\"+\".concat(fragmentsToText(compiled),\" + 1 || 9e9\"))))),[this.makeCode(\".slice(\".concat(fragmentsToText(fromCompiled)).concat(toStr||\"\",\")\"))]}},{key:\"astNode\",value:function astNode(o){return this.range.ast(o)}}]),Slice}(Base);return Slice.prototype.children=[\"range\"],Slice}.call(this),exports.Obj=Obj=function(){var Obj=function(_Base26){function Obj(props){var generated=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],_this43;return _classCallCheck(this,Obj),_this43=_super48.call(this),_this43.generated=generated,_this43.objects=_this43.properties=props||[],_this43}_inherits(Obj,_Base26);var _super48=_createSuper(Obj);return _createClass(Obj,[{key:\"isAssignable\",value:function isAssignable(opts){var j,len1,message,prop,ref1,ref2;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(prop=ref1[j],message=isUnassignable(prop.unwrapAll().value),message&&prop.error(message),prop instanceof Assign&&\"object\"===prop.context&&!((null==(ref2=prop.value)?void 0:ref2.base)instanceof Arr)&&(prop=prop.value),!prop.isAssignable(opts))return!1;return!0}},{key:\"shouldCache\",value:function shouldCache(){return!this.isAssignable()}},{key:\"hasSplat\",value:function hasSplat(){var j,len1,prop,ref1;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(prop=ref1[j],prop instanceof Splat)return!0;return!1}},{key:\"reorderProperties\",value:function reorderProperties(){var props,splatProp,splatProps;return props=this.properties,splatProps=this.getAndCheckSplatProps(),splatProp=props.splice(splatProps[0],1),this.objects=this.properties=[].concat(props,splatProp)}},{key:\"compileNode\",value:function compileNode(o){var answer,i,idt,indent,isCompact,j,join,k,key,l,lastNode,len1,len2,len3,node,prop,props,ref1,value;if(this.hasSplat()&&this.lhs&&this.reorderProperties(),props=this.properties,this.generated)for(j=0,len1=props.length;j<len1;j++)node=props[j],node instanceof Value&&node.error(\"cannot have an implicit value in an implicit object\");for(idt=o.indent+=TAB,lastNode=this.lastNode(this.properties),this.propagateLhs(),isCompact=!0,ref1=this.properties,(k=0,len2=ref1.length);k<len2;k++)prop=ref1[k],prop instanceof Assign&&\"object\"===prop.context&&(isCompact=!1);for(answer=[],answer.push(this.makeCode(isCompact?\"\":\"\\n\")),(i=l=0,len3=props.length);l<len3;i=++l){var _answer;if(prop=props[i],join=i===props.length-1?\"\":isCompact?\", \":prop===lastNode?\"\\n\":\",\\n\",indent=isCompact?\"\":idt,key=prop instanceof Assign&&\"object\"===prop.context?prop.variable:prop instanceof Assign?(this.lhs?void 0:prop.operatorToken.error(\"unexpected \".concat(prop.operatorToken.value)),prop.variable):prop,key instanceof Value&&key.hasProperties()&&((\"object\"===prop.context||!key[\"this\"])&&key.error(\"invalid object key\"),key=key.properties[0].name,prop=new Assign(key,prop,\"object\")),key===prop)if(prop.shouldCache()){var _prop$base$cache=prop.base.cache(o),_prop$base$cache2=_slicedToArray(_prop$base$cache,2);key=_prop$base$cache2[0],value=_prop$base$cache2[1],key instanceof IdentifierLiteral&&(key=new PropertyName(key.value)),prop=new Assign(key,value,\"object\")}else if(!(key instanceof Value&&key.base instanceof ComputedPropertyName))\"function\"==typeof prop.bareLiteral&&prop.bareLiteral(IdentifierLiteral)||prop instanceof Splat||(prop=new Assign(prop,prop,\"object\"));else if(prop.base.value.shouldCache()){var _prop$base$value$cach=prop.base.value.cache(o),_prop$base$value$cach2=_slicedToArray(_prop$base$value$cach,2);key=_prop$base$value$cach2[0],value=_prop$base$value$cach2[1],key instanceof IdentifierLiteral&&(key=new ComputedPropertyName(key.value)),prop=new Assign(key,value,\"object\")}else prop=new Assign(key,prop.base.value,\"object\");indent&&answer.push(this.makeCode(indent)),(_answer=answer).push.apply(_answer,_toConsumableArray(prop.compileToFragments(o,LEVEL_TOP))),join&&answer.push(this.makeCode(join))}return answer.push(this.makeCode(isCompact?\"\":\"\\n\".concat(this.tab))),answer=this.wrapInBraces(answer),this.front?this.wrapInParentheses(answer):answer}},{key:\"getAndCheckSplatProps\",value:function getAndCheckSplatProps(){var i,prop,props,splatProps;if(this.hasSplat()&&this.lhs)return props=this.properties,splatProps=function(){var j,len1,results1;for(results1=[],i=j=0,len1=props.length;j<len1;i=++j)prop=props[i],prop instanceof Splat&&results1.push(i);return results1}(),1<(null==splatProps?void 0:splatProps.length)&&props[splatProps[1]].error(\"multiple spread elements are disallowed\"),splatProps}},{key:\"assigns\",value:function assigns(name){var j,len1,prop,ref1;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(prop=ref1[j],prop.assigns(name))return!0;return!1}},{key:\"eachName\",value:function eachName(iterator){var j,len1,prop,ref1,results1;for(ref1=this.properties,results1=[],(j=0,len1=ref1.length);j<len1;j++)prop=ref1[j],prop instanceof Assign&&\"object\"===prop.context&&(prop=prop.value),prop=prop.unwrapAll(),null==prop.eachName?results1.push(void 0):results1.push(prop.eachName(iterator));return results1}},{key:\"expandProperty\",value:function expandProperty(property){var context,key,operatorToken,variable;return variable=property.variable,context=property.context,operatorToken=property.operatorToken,key=property instanceof Assign&&\"object\"===context?variable:property instanceof Assign?(this.lhs?void 0:operatorToken.error(\"unexpected \".concat(operatorToken.value)),variable):property,key instanceof Value&&key.hasProperties()?(\"object\"!==context&&key[\"this\"]||key.error(\"invalid object key\"),property instanceof Assign?new ObjectProperty({fromAssign:property}):new ObjectProperty({key:property})):key===property?property instanceof Splat?property:new ObjectProperty({key:property}):new ObjectProperty({fromAssign:property})}},{key:\"expandProperties\",value:function expandProperties(){var j,len1,property,ref1,results1;for(ref1=this.properties,results1=[],(j=0,len1=ref1.length);j<len1;j++)property=ref1[j],results1.push(this.expandProperty(property));return results1}},{key:\"propagateLhs\",value:function propagateLhs(setLhs){var j,len1,property,ref1,results1,unwrappedValue,value;if(setLhs&&(this.lhs=!0),!!this.lhs){for(ref1=this.properties,results1=[],(j=0,len1=ref1.length);j<len1;j++)if(property=ref1[j],property instanceof Assign&&\"object\"===property.context){var _property2=property;value=_property2.value,unwrappedValue=value.unwrapAll(),unwrappedValue instanceof Arr||unwrappedValue instanceof Obj?results1.push(unwrappedValue.propagateLhs(!0)):unwrappedValue instanceof Assign?results1.push(unwrappedValue.nestedLhs=!0):results1.push(void 0)}else property instanceof Assign?results1.push(property.nestedLhs=!0):property instanceof Splat?results1.push(property.propagateLhs(!0)):results1.push(void 0);return results1}}},{key:\"astNode\",value:function astNode(o){return this.getAndCheckSplatProps(),_get(_getPrototypeOf(Obj.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.lhs?\"ObjectPattern\":\"ObjectExpression\"}},{key:\"astProperties\",value:function astProperties(o){var property;return{implicit:!!this.generated,properties:function(){var j,len1,ref1,results1;for(ref1=this.expandProperties(),results1=[],(j=0,len1=ref1.length);j<len1;j++)property=ref1[j],results1.push(property.ast(o));return results1}.call(this)}}}]),Obj}(Base);return Obj.prototype.children=[\"properties\"],Obj}.call(this),exports.ObjectProperty=ObjectProperty=function(_Base27){function ObjectProperty(_ref40){var key=_ref40.key,fromAssign=_ref40.fromAssign,_this44;_classCallCheck(this,ObjectProperty);var context,value;return _this44=_super49.call(this),fromAssign?(_this44.key=fromAssign.variable,value=fromAssign.value,context=fromAssign.context,\"object\"===context?_this44.value=value:(_this44.value=fromAssign,_this44.shorthand=!0),_this44.locationData=fromAssign.locationData):(_this44.key=key,_this44.shorthand=!0,_this44.locationData=key.locationData),_this44}_inherits(ObjectProperty,_Base27);var _super49=_createSuper(ObjectProperty);return _createClass(ObjectProperty,[{key:\"astProperties\",value:function astProperties(o){var isComputedPropertyName,keyAst,ref1,ref2;return isComputedPropertyName=this.key instanceof Value&&this.key.base instanceof ComputedPropertyName||this.key.unwrap()instanceof StringWithInterpolations,keyAst=this.key.ast(o,LEVEL_LIST),{key:(null==keyAst?void 0:keyAst.declaration)?Object.assign({},keyAst,{declaration:!1}):keyAst,value:null==(ref1=null==(ref2=this.value)?void 0:ref2.ast(o,LEVEL_LIST))?keyAst:ref1,shorthand:!!this.shorthand,computed:!!isComputedPropertyName,method:!1}}}]),ObjectProperty}(Base),exports.Arr=Arr=function(){var Arr=function(_Base28){function Arr(objs){var lhs1=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],_this45;return _classCallCheck(this,Arr),_this45=_super50.call(this),_this45.lhs=lhs1,_this45.objects=objs||[],_this45.propagateLhs(),_this45}_inherits(Arr,_Base28);var _super50=_createSuper(Arr);return _createClass(Arr,[{key:\"hasElision\",value:function hasElision(){var j,len1,obj,ref1;for(ref1=this.objects,j=0,len1=ref1.length;j<len1;j++)if(obj=ref1[j],obj instanceof Elision)return!0;return!1}},{key:\"isAssignable\",value:function isAssignable(opts){var _ref41=null==opts?{}:opts,allowEmptyArray,allowExpansion,allowNontrailingSplat,i,j,len1,obj,ref1;allowExpansion=_ref41.allowExpansion,allowNontrailingSplat=_ref41.allowNontrailingSplat;var _ref41$allowEmptyArra=_ref41.allowEmptyArray;if(allowEmptyArray=void 0!==_ref41$allowEmptyArra&&_ref41$allowEmptyArra,!this.objects.length)return allowEmptyArray;for(ref1=this.objects,i=j=0,len1=ref1.length;j<len1;i=++j){if(obj=ref1[i],!allowNontrailingSplat&&obj instanceof Splat&&i+1!==this.objects.length)return!1;if(!(allowExpansion&&obj instanceof Expansion||obj.isAssignable(opts)&&(!obj.isAtomic||obj.isAtomic())))return!1}return!0}},{key:\"shouldCache\",value:function shouldCache(){return!this.isAssignable()}},{key:\"compileNode\",value:function compileNode(o){var answer,compiledObjs,fragment,fragmentIndex,fragmentIsElision,fragments,includesLineCommentsOnNonFirstElement,index,j,k,l,len1,len2,len3,len4,len5,obj,objIndex,olen,p,passedElision,q,ref1,ref2,unwrappedObj;if(!this.objects.length)return[this.makeCode(\"[]\")];for(o.indent+=TAB,fragmentIsElision=function(_ref42){var _ref43=_slicedToArray(_ref42,1),fragment=_ref43[0];return\"Elision\"===fragment.type&&\",\"===fragment.code.trim()},passedElision=!1,answer=[],ref1=this.objects,(objIndex=j=0,len1=ref1.length);j<len1;objIndex=++j)obj=ref1[objIndex],unwrappedObj=obj.unwrapAll(),unwrappedObj.comments&&0===unwrappedObj.comments.filter(function(comment){return!comment.here}).length&&(unwrappedObj.includeCommentFragments=YES);for(compiledObjs=function(){var k,len2,ref2,results1;for(ref2=this.objects,results1=[],(k=0,len2=ref2.length);k<len2;k++)obj=ref2[k],results1.push(obj.compileToFragments(o,LEVEL_LIST));return results1}.call(this),olen=compiledObjs.length,includesLineCommentsOnNonFirstElement=!1,(index=k=0,len2=compiledObjs.length);k<len2;index=++k){var _answer2;for(fragments=compiledObjs[index],l=0,len3=fragments.length;l<len3;l++)fragment=fragments[l],fragment.isHereComment?fragment.code=fragment.code.trim():0!==index&&!1===includesLineCommentsOnNonFirstElement&&hasLineComments(fragment)&&(includesLineCommentsOnNonFirstElement=!0);0!==index&&passedElision&&(!fragmentIsElision(fragments)||index===olen-1)&&answer.push(this.makeCode(\", \")),passedElision=passedElision||!fragmentIsElision(fragments),(_answer2=answer).push.apply(_answer2,_toConsumableArray(fragments))}if(includesLineCommentsOnNonFirstElement||0<=indexOf.call(fragmentsToText(answer),\"\\n\")){for(fragmentIndex=p=0,len4=answer.length;p<len4;fragmentIndex=++p)fragment=answer[fragmentIndex],fragment.isHereComment?fragment.code=\"\".concat(multident(fragment.code,o.indent,!1),\"\\n\").concat(o.indent):\", \"===fragment.code&&(null==fragment||!fragment.isElision)&&\"StringLiteral\"!==(ref2=fragment.type)&&\"StringWithInterpolations\"!==ref2&&(fragment.code=\",\\n\".concat(o.indent));answer.unshift(this.makeCode(\"[\\n\".concat(o.indent))),answer.push(this.makeCode(\"\\n\".concat(this.tab,\"]\")))}else{for(q=0,len5=answer.length;q<len5;q++)fragment=answer[q],fragment.isHereComment&&(fragment.code=\"\".concat(fragment.code,\" \"));answer.unshift(this.makeCode(\"[\")),answer.push(this.makeCode(\"]\"))}return answer}},{key:\"assigns\",value:function assigns(name){var j,len1,obj,ref1;for(ref1=this.objects,j=0,len1=ref1.length;j<len1;j++)if(obj=ref1[j],obj.assigns(name))return!0;return!1}},{key:\"eachName\",value:function eachName(iterator){var j,len1,obj,ref1,results1;for(ref1=this.objects,results1=[],(j=0,len1=ref1.length);j<len1;j++)obj=ref1[j],obj=obj.unwrapAll(),results1.push(obj.eachName(iterator));return results1}},{key:\"propagateLhs\",value:function propagateLhs(setLhs){var j,len1,object,ref1,results1,unwrappedObject;if(setLhs&&(this.lhs=!0),!!this.lhs){for(ref1=this.objects,results1=[],(j=0,len1=ref1.length);j<len1;j++)object=ref1[j],(object instanceof Splat||object instanceof Expansion)&&(object.lhs=!0),unwrappedObject=object.unwrapAll(),unwrappedObject instanceof Arr||unwrappedObject instanceof Obj?results1.push(unwrappedObject.propagateLhs(!0)):unwrappedObject instanceof Assign?results1.push(unwrappedObject.nestedLhs=!0):results1.push(void 0);return results1}}},{key:\"astType\",value:function astType(){return this.lhs?\"ArrayPattern\":\"ArrayExpression\"}},{key:\"astProperties\",value:function astProperties(o){var object;return{elements:function(){var j,len1,ref1,results1;for(ref1=this.objects,results1=[],(j=0,len1=ref1.length);j<len1;j++)object=ref1[j],results1.push(object.ast(o,LEVEL_LIST));return results1}.call(this)}}}]),Arr}(Base);return Arr.prototype.children=[\"objects\"],Arr}.call(this),exports.Class=Class=function(){var Class=function(_Base29){function Class(variable1,parent1,body1){var _this46;return _classCallCheck(this,Class),_this46=_super51.call(this),_this46.variable=variable1,_this46.parent=parent1,_this46.body=body1,null==_this46.body&&(_this46.body=new Block,_this46.hasGeneratedBody=!0),_this46}_inherits(Class,_Base29);var _super51=_createSuper(Class);return _createClass(Class,[{key:\"compileNode\",value:function compileNode(o){var executableBody,node,parentName;if(this.name=this.determineName(),executableBody=this.walkBody(o),this.parent instanceof Value&&!this.parent.hasProperties()&&(parentName=this.parent.base.value),this.hasNameClash=null!=this.name&&this.name===parentName,node=this,executableBody||this.hasNameClash?node=new ExecutableClassBody(node,executableBody):null==this.name&&o.level===LEVEL_TOP&&(node=new Parens(node)),this.boundMethods.length&&this.parent&&(null==this.variable&&(this.variable=new IdentifierLiteral(o.scope.freeVariable(\"_class\"))),null==this.variableRef)){var _this$variable$cache=this.variable.cache(o),_this$variable$cache2=_slicedToArray(_this$variable$cache,2);this.variable=_this$variable$cache2[0],this.variableRef=_this$variable$cache2[1]}this.variable&&(node=new Assign(this.variable,node,null,{moduleDeclaration:this.moduleDeclaration})),this.compileNode=this.compileClassDeclaration;try{return node.compileToFragments(o)}finally{delete this.compileNode}}},{key:\"compileClassDeclaration\",value:function compileClassDeclaration(o){var ref1,ref2,result;if((this.externalCtor||this.boundMethods.length)&&null==this.ctor&&(this.ctor=this.makeDefaultConstructor()),null!=(ref1=this.ctor)&&(ref1.noReturn=!0),this.boundMethods.length&&this.proxyBoundMethods(),o.indent+=TAB,result=[],result.push(this.makeCode(\"class \")),this.name&&result.push(this.makeCode(this.name)),null!=(null==(ref2=this.variable)?void 0:ref2.comments)&&this.compileCommentFragments(o,this.variable,result),this.name&&result.push(this.makeCode(\" \")),this.parent){var _result;(_result=result).push.apply(_result,[this.makeCode(\"extends \")].concat(_toConsumableArray(this.parent.compileToFragments(o)),[this.makeCode(\" \")]))}if(result.push(this.makeCode(\"{\")),!this.body.isEmpty()){var _result2;this.body.spaced=!0,result.push(this.makeCode(\"\\n\")),(_result2=result).push.apply(_result2,_toConsumableArray(this.body.compileToFragments(o,LEVEL_TOP))),result.push(this.makeCode(\"\\n\".concat(this.tab)))}return result.push(this.makeCode(\"}\")),result}},{key:\"determineName\",value:function determineName(){var _slice1$call13,_slice1$call14,message,name,node,ref1,tail;return this.variable?(ref1=this.variable.properties,_slice1$call13=slice1.call(ref1,-1),_slice1$call14=_slicedToArray(_slice1$call13,1),tail=_slice1$call14[0],_slice1$call13,node=tail?tail instanceof Access&&tail.name:this.variable.base,!(node instanceof IdentifierLiteral||node instanceof PropertyName))?null:(name=node.value,tail||(message=isUnassignable(name),message&&this.variable.error(message)),0<=indexOf.call(JS_FORBIDDEN,name)?\"_\".concat(name):name):null}},{key:\"walkBody\",value:function walkBody(o){var assign,end,executableBody,expression,expressions,exprs,i,initializer,initializerExpression,j,k,len1,len2,method,properties,pushSlice,ref1,start;for(this.ctor=null,this.boundMethods=[],executableBody=null,initializer=[],expressions=this.body.expressions,i=0,ref1=expressions.slice(),(j=0,len1=ref1.length);j<len1;j++)if(expression=ref1[j],expression instanceof Value&&expression.isObject(!0)){for(properties=expression.base.properties,exprs=[],end=0,start=0,pushSlice=function(){if(end>start)return exprs.push(new Value(new Obj(properties.slice(start,end),!0)))};assign=properties[end];)(initializerExpression=this.addInitializerExpression(assign,o))&&(pushSlice(),exprs.push(initializerExpression),initializer.push(initializerExpression),start=end+1),end++;pushSlice(),splice.apply(expressions,[i,i-i+1].concat(exprs)),exprs,i+=exprs.length}else(initializerExpression=this.addInitializerExpression(expression,o))&&(initializer.push(initializerExpression),expressions[i]=initializerExpression),i+=1;for(k=0,len2=initializer.length;k<len2;k++)method=initializer[k],method instanceof Code&&(method.ctor?(this.ctor&&method.error(\"Cannot define more than one constructor in a class\"),this.ctor=method):method.isStatic&&method.bound?method.context=this.name:method.bound&&this.boundMethods.push(method));return o.compiling?initializer.length===expressions.length?void 0:(this.body.expressions=function(){var l,len3,results1;for(results1=[],l=0,len3=initializer.length;l<len3;l++)expression=initializer[l],results1.push(expression.hoist());return results1}(),new Block(expressions)):void 0}},{key:\"addInitializerExpression\",value:function addInitializerExpression(node,o){return node.unwrapAll()instanceof PassthroughLiteral?node:this.validInitializerMethod(node)?this.addInitializerMethod(node):!o.compiling&&this.validClassProperty(node)?this.addClassProperty(node):!o.compiling&&this.validClassPrototypeProperty(node)?this.addClassPrototypeProperty(node):null}},{key:\"validInitializerMethod\",value:function validInitializerMethod(node){return!!(node instanceof Assign&&node.value instanceof Code)&&(!(\"object\"!==node.context||node.variable.hasProperties())||node.variable.looksStatic(this.name)&&(this.name||!node.value.bound))}},{key:\"addInitializerMethod\",value:function addInitializerMethod(assign){var isConstructor,method,methodName,operatorToken,variable;return variable=assign.variable,method=assign.value,operatorToken=assign.operatorToken,method.isMethod=!0,method.isStatic=variable.looksStatic(this.name),method.isStatic?method.name=variable.properties[0]:(methodName=variable.base,method.name=new(methodName.shouldCache()?Index:Access)(methodName),method.name.updateLocationDataIfMissing(methodName.locationData),isConstructor=methodName instanceof StringLiteral?\"constructor\"===methodName.originalValue:\"constructor\"===methodName.value,isConstructor&&(method.ctor=this.parent?\"derived\":\"base\"),method.bound&&method.ctor&&method.error(\"Cannot define a constructor as a bound (fat arrow) function\")),method.operatorToken=operatorToken,method}},{key:\"validClassProperty\",value:function validClassProperty(node){return!!(node instanceof Assign)&&node.variable.looksStatic(this.name)}},{key:\"addClassProperty\",value:function addClassProperty(assign){var operatorToken,staticClassName,value,variable;variable=assign.variable,value=assign.value,operatorToken=assign.operatorToken;var _variable$looksStatic=variable.looksStatic(this.name);return staticClassName=_variable$looksStatic.staticClassName,new ClassProperty({name:variable.properties[0],isStatic:!0,staticClassName:staticClassName,value:value,operatorToken:operatorToken}).withLocationDataFrom(assign)}},{key:\"validClassPrototypeProperty\",value:function validClassPrototypeProperty(node){return!!(node instanceof Assign)&&\"object\"===node.context&&!node.variable.hasProperties()}},{key:\"addClassPrototypeProperty\",value:function addClassPrototypeProperty(assign){var value,variable;return variable=assign.variable,value=assign.value,new ClassPrototypeProperty({name:variable.base,value:value}).withLocationDataFrom(assign)}},{key:\"makeDefaultConstructor\",value:function makeDefaultConstructor(){var applyArgs,applyCtor,ctor;return ctor=this.addInitializerMethod(new Assign(new Value(new PropertyName(\"constructor\")),new Code())),this.body.unshift(ctor),this.parent&&ctor.body.push(new SuperCall(new Super(),[new Splat(new IdentifierLiteral(\"arguments\"))])),this.externalCtor&&(applyCtor=new Value(this.externalCtor,[new Access(new PropertyName(\"apply\"))]),applyArgs=[new ThisLiteral,new IdentifierLiteral(\"arguments\")],ctor.body.push(new Call(applyCtor,applyArgs)),ctor.body.makeReturn()),ctor}},{key:\"proxyBoundMethods\",value:function proxyBoundMethods(){var method,name;return this.ctor.thisAssignments=function(){var j,len1,ref1,results1;for(ref1=this.boundMethods,results1=[],(j=0,len1=ref1.length);j<len1;j++)method=ref1[j],this.parent&&(method.classVariable=this.variableRef),name=new Value(new ThisLiteral(),[method.name]),results1.push(new Assign(name,new Call(new Value(name,[new Access(new PropertyName(\"bind\"))]),[new ThisLiteral])));return results1}.call(this),null}},{key:\"declareName\",value:function declareName(o){var alreadyDeclared,name,ref1;if((name=null==(ref1=this.variable)?void 0:ref1.unwrap())instanceof IdentifierLiteral)return alreadyDeclared=o.scope.find(name.value),name.isDeclaration=!alreadyDeclared}},{key:\"isStatementAst\",value:function isStatementAst(){return!0}},{key:\"astNode\",value:function astNode(o){var argumentsNode,jumpNode,ref1;return(jumpNode=this.body.jumps())&&jumpNode.error(\"Class bodies cannot contain pure statements\"),(argumentsNode=this.body.contains(isLiteralArguments))&&argumentsNode.error(\"Class bodies shouldn't reference arguments\"),this.declareName(o),this.name=this.determineName(),this.body.isClassBody=!0,this.hasGeneratedBody&&(this.body.locationData=zeroWidthLocationDataFromEndLocation(this.locationData)),this.walkBody(o),sniffDirectives(this.body.expressions),null!=(ref1=this.ctor)&&(ref1.noReturn=!0),_get(_getPrototypeOf(Class.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(o){return o.level===LEVEL_TOP?\"ClassDeclaration\":\"ClassExpression\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{id:null==(ref1=null==(ref2=this.variable)?void 0:ref2.ast(o))?null:ref1,superClass:null==(ref3=null==(ref4=this.parent)?void 0:ref4.ast(o,LEVEL_PAREN))?null:ref3,body:this.body.ast(o,LEVEL_TOP)}}}]),Class}(Base);return Class.prototype.children=[\"variable\",\"parent\",\"body\"],Class}.call(this),exports.ExecutableClassBody=ExecutableClassBody=function(){var ExecutableClassBody=function(_Base30){function ExecutableClassBody(_class){var body1=1<arguments.length&&void 0!==arguments[1]?arguments[1]:new Block,_this47;return _classCallCheck(this,ExecutableClassBody),_this47=_super52.call(this),_this47[\"class\"]=_class,_this47.body=body1,_this47}_inherits(ExecutableClassBody,_Base30);var _super52=_createSuper(ExecutableClassBody);return _createClass(ExecutableClassBody,[{key:\"compileNode\",value:function compileNode(o){var _this$body$expression,args,argumentsNode,directives,externalCtor,ident,jumpNode,klass,params,parent,ref1,wrapper;return(jumpNode=this.body.jumps())&&jumpNode.error(\"Class bodies cannot contain pure statements\"),(argumentsNode=this.body.contains(isLiteralArguments))&&argumentsNode.error(\"Class bodies shouldn't reference arguments\"),params=[],args=[new ThisLiteral],wrapper=new Code(params,this.body),klass=new Parens(new Call(new Value(wrapper,[new Access(new PropertyName(\"call\"))]),args)),this.body.spaced=!0,o.classScope=wrapper.makeScope(o.scope),this.name=null==(ref1=this[\"class\"].name)?o.classScope.freeVariable(this.defaultClassVariableName):ref1,ident=new IdentifierLiteral(this.name),directives=this.walkBody(),this.setContext(),this[\"class\"].hasNameClash&&(parent=new IdentifierLiteral(o.classScope.freeVariable(\"superClass\")),wrapper.params.push(new Param(parent)),args.push(this[\"class\"].parent),this[\"class\"].parent=parent),this.externalCtor&&(externalCtor=new IdentifierLiteral(o.classScope.freeVariable(\"ctor\",{reserve:!1})),this[\"class\"].externalCtor=externalCtor,this.externalCtor.variable.base=externalCtor),this.name===this[\"class\"].name?this.body.expressions.unshift(this[\"class\"]):this.body.expressions.unshift(new Assign(new IdentifierLiteral(this.name),this[\"class\"])),(_this$body$expression=this.body.expressions).unshift.apply(_this$body$expression,_toConsumableArray(directives)),this.body.push(ident),klass.compileToFragments(o)}},{key:\"walkBody\",value:function walkBody(){var _this48=this,directives,expr,index;for(directives=[],index=0;(expr=this.body.expressions[index])&&!!(expr instanceof Value&&expr.isString());)if(expr.hoisted)index++;else{var _directives;(_directives=directives).push.apply(_directives,_toConsumableArray(this.body.expressions.splice(index,1)))}return this.traverseChildren(!1,function(child){var cont,i,j,len1,node,ref1;if(child instanceof Class||child instanceof HoistTarget)return!1;if(cont=!0,child instanceof Block){for(ref1=child.expressions,i=j=0,len1=ref1.length;j<len1;i=++j)node=ref1[i],node instanceof Value&&node.isObject(!0)?(cont=!1,child.expressions[i]=_this48.addProperties(node.base.properties)):node instanceof Assign&&node.variable.looksStatic(_this48.name)&&(node.value.isStatic=!0);child.expressions=flatten(child.expressions)}return cont}),directives}},{key:\"setContext\",value:function setContext(){var _this49=this;return this.body.traverseChildren(!1,function(node){return node instanceof ThisLiteral?node.value=_this49.name:node instanceof Code&&node.bound&&(node.isStatic||!node.name)?node.context=_this49.name:void 0})}},{key:\"addProperties\",value:function addProperties(assigns){var assign,base,name,prototype,result,value,variable;return result=function(){var j,len1,results1;for(results1=[],j=0,len1=assigns.length;j<len1;j++)assign=assigns[j],variable=assign.variable,base=null==variable?void 0:variable.base,value=assign.value,delete assign.context,\"constructor\"===base.value?(value instanceof Code&&base.error(\"constructors must be defined at the top level of a class body\"),assign=this.externalCtor=new Assign(new Value(),value)):assign.variable[\"this\"]?assign.value instanceof Code&&(assign.value.isStatic=!0):(name=base instanceof ComputedPropertyName?new Index(base.value):new(base.shouldCache()?Index:Access)(base),prototype=new Access(new PropertyName(\"prototype\")),variable=new Value(new ThisLiteral(),[prototype,name]),assign.variable=variable),results1.push(assign);return results1}.call(this),compact(result)}}]),ExecutableClassBody}(Base);return ExecutableClassBody.prototype.children=[\"class\",\"body\"],ExecutableClassBody.prototype.defaultClassVariableName=\"_Class\",ExecutableClassBody}.call(this),exports.ClassProperty=ClassProperty=function(){var ClassProperty=function(_Base31){function ClassProperty(_ref44){var name1=_ref44.name,isStatic=_ref44.isStatic,staticClassName1=_ref44.staticClassName,value1=_ref44.value,operatorToken1=_ref44.operatorToken,_this50;return _classCallCheck(this,ClassProperty),_this50=_super53.call(this),_this50.name=name1,_this50.isStatic=isStatic,_this50.staticClassName=staticClassName1,_this50.value=value1,_this50.operatorToken=operatorToken1,_this50}_inherits(ClassProperty,_Base31);var _super53=_createSuper(ClassProperty);return _createClass(ClassProperty,[{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{key:this.name.ast(o,LEVEL_LIST),value:this.value.ast(o,LEVEL_LIST),static:!!this.isStatic,computed:this.name instanceof Index||this.name instanceof ComputedPropertyName,operator:null==(ref1=null==(ref2=this.operatorToken)?void 0:ref2.value)?\"=\":ref1,staticClassName:null==(ref3=null==(ref4=this.staticClassName)?void 0:ref4.ast(o))?null:ref3}}}]),ClassProperty}(Base);return ClassProperty.prototype.children=[\"name\",\"value\",\"staticClassName\"],ClassProperty.prototype.isStatement=YES,ClassProperty}.call(this),exports.ClassPrototypeProperty=ClassPrototypeProperty=function(){var ClassPrototypeProperty=function(_Base32){function ClassPrototypeProperty(_ref45){var name1=_ref45.name,value1=_ref45.value,_this51;return _classCallCheck(this,ClassPrototypeProperty),_this51=_super54.call(this),_this51.name=name1,_this51.value=value1,_this51}_inherits(ClassPrototypeProperty,_Base32);var _super54=_createSuper(ClassPrototypeProperty);return _createClass(ClassPrototypeProperty,[{key:\"astProperties\",value:function astProperties(o){return{key:this.name.ast(o,LEVEL_LIST),value:this.value.ast(o,LEVEL_LIST),computed:this.name instanceof ComputedPropertyName||this.name instanceof StringWithInterpolations}}}]),ClassPrototypeProperty}(Base);return ClassPrototypeProperty.prototype.children=[\"name\",\"value\"],ClassPrototypeProperty.prototype.isStatement=YES,ClassPrototypeProperty}.call(this),exports.ModuleDeclaration=ModuleDeclaration=function(){var ModuleDeclaration=function(_Base33){function ModuleDeclaration(clause,source1,assertions){var _this52;return _classCallCheck(this,ModuleDeclaration),_this52=_super55.call(this),_this52.clause=clause,_this52.source=source1,_this52.assertions=assertions,_this52.checkSource(),_this52}_inherits(ModuleDeclaration,_Base33);var _super55=_createSuper(ModuleDeclaration);return _createClass(ModuleDeclaration,[{key:\"checkSource\",value:function checkSource(){if(null!=this.source&&this.source instanceof StringWithInterpolations)return this.source.error(\"the name of the module to be imported from must be an uninterpolated string\")}},{key:\"checkScope\",value:function checkScope(o,moduleDeclarationType){if(0!==o.indent.length)return this.error(\"\".concat(moduleDeclarationType,\" statements must be at top-level scope\"))}},{key:\"astAssertions\",value:function astAssertions(o){var ref1;return null==(null==(ref1=this.assertions)?void 0:ref1.properties)?[]:this.assertions.properties.map(function(assertion){var _assertion$ast=assertion.ast(o),end,left,loc,right,start;return start=_assertion$ast.start,end=_assertion$ast.end,loc=_assertion$ast.loc,left=_assertion$ast.left,right=_assertion$ast.right,{type:\"ImportAttribute\",start:start,end:end,loc:loc,key:left,value:right}})}}]),ModuleDeclaration}(Base);return ModuleDeclaration.prototype.children=[\"clause\",\"source\",\"assertions\"],ModuleDeclaration.prototype.isStatement=YES,ModuleDeclaration.prototype.jumps=THIS,ModuleDeclaration.prototype.makeReturn=THIS,ModuleDeclaration}.call(this),exports.ImportDeclaration=ImportDeclaration=function(_ModuleDeclaration){function ImportDeclaration(){return _classCallCheck(this,ImportDeclaration),_super56.apply(this,arguments)}_inherits(ImportDeclaration,_ModuleDeclaration);var _super56=_createSuper(ImportDeclaration);return _createClass(ImportDeclaration,[{key:\"compileNode\",value:function compileNode(o){var code,ref1;if(this.checkScope(o,\"import\"),o.importedSymbols=[],code=[],code.push(this.makeCode(\"\".concat(this.tab,\"import \"))),null!=this.clause){var _code;(_code=code).push.apply(_code,_toConsumableArray(this.clause.compileNode(o)))}if(null!=(null==(ref1=this.source)?void 0:ref1.value)&&(null!==this.clause&&code.push(this.makeCode(\" from \")),code.push(this.makeCode(this.source.value)),null!=this.assertions)){var _code2;code.push(this.makeCode(\" assert \")),(_code2=code).push.apply(_code2,_toConsumableArray(this.assertions.compileToFragments(o)))}return code.push(this.makeCode(\";\")),code}},{key:\"astNode\",value:function astNode(o){return o.importedSymbols=[],_get(_getPrototypeOf(ImportDeclaration.prototype),\"astNode\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ret;return ret={specifiers:null==(ref1=null==(ref2=this.clause)?void 0:ref2.ast(o))?[]:ref1,source:this.source.ast(o),assertions:this.astAssertions(o)},this.clause&&(ret.importKind=\"value\"),ret}}]),ImportDeclaration}(ModuleDeclaration),exports.ImportClause=ImportClause=function(){var ImportClause=function(_Base34){function ImportClause(defaultBinding,namedImports){var _this53;return _classCallCheck(this,ImportClause),_this53=_super57.call(this),_this53.defaultBinding=defaultBinding,_this53.namedImports=namedImports,_this53}_inherits(ImportClause,_Base34);var _super57=_createSuper(ImportClause);return _createClass(ImportClause,[{key:\"compileNode\",value:function compileNode(o){var code;if(code=[],null!=this.defaultBinding){var _code3;(_code3=code).push.apply(_code3,_toConsumableArray(this.defaultBinding.compileNode(o))),null!=this.namedImports&&code.push(this.makeCode(\", \"))}if(null!=this.namedImports){var _code4;(_code4=code).push.apply(_code4,_toConsumableArray(this.namedImports.compileNode(o)))}return code}},{key:\"astNode\",value:function astNode(o){var ref1,ref2;return compact(flatten([null==(ref1=this.defaultBinding)?void 0:ref1.ast(o),null==(ref2=this.namedImports)?void 0:ref2.ast(o)]))}}]),ImportClause}(Base);return ImportClause.prototype.children=[\"defaultBinding\",\"namedImports\"],ImportClause}.call(this),exports.ExportDeclaration=ExportDeclaration=function(_ModuleDeclaration2){function ExportDeclaration(){return _classCallCheck(this,ExportDeclaration),_super58.apply(this,arguments)}_inherits(ExportDeclaration,_ModuleDeclaration2);var _super58=_createSuper(ExportDeclaration);return _createClass(ExportDeclaration,[{key:\"compileNode\",value:function compileNode(o){var code,ref1;if(this.checkScope(o,\"export\"),this.checkForAnonymousClassExport(),code=[],code.push(this.makeCode(\"\".concat(this.tab,\"export \"))),this instanceof ExportDefaultDeclaration&&code.push(this.makeCode(\"default \")),!(this instanceof ExportDefaultDeclaration)&&(this.clause instanceof Assign||this.clause instanceof Class)&&(code.push(this.makeCode(\"var \")),this.clause.moduleDeclaration=\"export\"),code=null!=this.clause.body&&this.clause.body instanceof Block?code.concat(this.clause.compileToFragments(o,LEVEL_TOP)):code.concat(this.clause.compileNode(o)),null!=(null==(ref1=this.source)?void 0:ref1.value)&&(code.push(this.makeCode(\" from \".concat(this.source.value))),null!=this.assertions)){var _code5;code.push(this.makeCode(\" assert \")),(_code5=code).push.apply(_code5,_toConsumableArray(this.assertions.compileToFragments(o)))}return code.push(this.makeCode(\";\")),code}},{key:\"checkForAnonymousClassExport\",value:function checkForAnonymousClassExport(){if(!(this instanceof ExportDefaultDeclaration)&&this.clause instanceof Class&&!this.clause.variable)return this.clause.error(\"anonymous classes cannot be exported\")}},{key:\"astNode\",value:function astNode(o){return this.checkForAnonymousClassExport(),_get(_getPrototypeOf(ExportDeclaration.prototype),\"astNode\",this).call(this,o)}}]),ExportDeclaration}(ModuleDeclaration),exports.ExportNamedDeclaration=ExportNamedDeclaration=function(_ExportDeclaration){function ExportNamedDeclaration(){return _classCallCheck(this,ExportNamedDeclaration),_super59.apply(this,arguments)}_inherits(ExportNamedDeclaration,_ExportDeclaration);var _super59=_createSuper(ExportNamedDeclaration);return _createClass(ExportNamedDeclaration,[{key:\"astProperties\",value:function astProperties(o){var clauseAst,ref1,ref2,ret;return ret={source:null==(ref1=null==(ref2=this.source)?void 0:ref2.ast(o))?null:ref1,assertions:this.astAssertions(o),exportKind:\"value\"},clauseAst=this.clause.ast(o),this.clause instanceof ExportSpecifierList?(ret.specifiers=clauseAst,ret.declaration=null):(ret.specifiers=[],ret.declaration=clauseAst),ret}}]),ExportNamedDeclaration}(ExportDeclaration),exports.ExportDefaultDeclaration=ExportDefaultDeclaration=function(_ExportDeclaration2){function ExportDefaultDeclaration(){return _classCallCheck(this,ExportDefaultDeclaration),_super60.apply(this,arguments)}_inherits(ExportDefaultDeclaration,_ExportDeclaration2);var _super60=_createSuper(ExportDefaultDeclaration);return _createClass(ExportDefaultDeclaration,[{key:\"astProperties\",value:function astProperties(o){return{declaration:this.clause.ast(o),assertions:this.astAssertions(o)}}}]),ExportDefaultDeclaration}(ExportDeclaration),exports.ExportAllDeclaration=ExportAllDeclaration=function(_ExportDeclaration3){function ExportAllDeclaration(){return _classCallCheck(this,ExportAllDeclaration),_super61.apply(this,arguments)}_inherits(ExportAllDeclaration,_ExportDeclaration3);var _super61=_createSuper(ExportAllDeclaration);return _createClass(ExportAllDeclaration,[{key:\"astProperties\",value:function astProperties(o){return{source:this.source.ast(o),assertions:this.astAssertions(o),exportKind:\"value\"}}}]),ExportAllDeclaration}(ExportDeclaration),exports.ModuleSpecifierList=ModuleSpecifierList=function(){var ModuleSpecifierList=function(_Base35){function ModuleSpecifierList(specifiers){var _this54;return _classCallCheck(this,ModuleSpecifierList),_this54=_super62.call(this),_this54.specifiers=specifiers,_this54}_inherits(ModuleSpecifierList,_Base35);var _super62=_createSuper(ModuleSpecifierList);return _createClass(ModuleSpecifierList,[{key:\"compileNode\",value:function compileNode(o){var code,compiledList,fragments,index,j,len1,specifier;if(code=[],o.indent+=TAB,compiledList=function(){var j,len1,ref1,results1;for(ref1=this.specifiers,results1=[],(j=0,len1=ref1.length);j<len1;j++)specifier=ref1[j],results1.push(specifier.compileToFragments(o,LEVEL_LIST));return results1}.call(this),0!==this.specifiers.length){for(code.push(this.makeCode(\"{\\n\".concat(o.indent))),index=j=0,len1=compiledList.length;j<len1;index=++j){var _code6;fragments=compiledList[index],index&&code.push(this.makeCode(\",\\n\".concat(o.indent))),(_code6=code).push.apply(_code6,_toConsumableArray(fragments))}code.push(this.makeCode(\"\\n}\"))}else code.push(this.makeCode(\"{}\"));return code}},{key:\"astNode\",value:function astNode(o){var j,len1,ref1,results1,specifier;for(ref1=this.specifiers,results1=[],(j=0,len1=ref1.length);j<len1;j++)specifier=ref1[j],results1.push(specifier.ast(o));return results1}}]),ModuleSpecifierList}(Base);return ModuleSpecifierList.prototype.children=[\"specifiers\"],ModuleSpecifierList}.call(this),exports.ImportSpecifierList=ImportSpecifierList=function(_ModuleSpecifierList){function ImportSpecifierList(){return _classCallCheck(this,ImportSpecifierList),_super63.apply(this,arguments)}_inherits(ImportSpecifierList,_ModuleSpecifierList);var _super63=_createSuper(ImportSpecifierList);return _createClass(ImportSpecifierList)}(ModuleSpecifierList),exports.ExportSpecifierList=ExportSpecifierList=function(_ModuleSpecifierList2){function ExportSpecifierList(){return _classCallCheck(this,ExportSpecifierList),_super64.apply(this,arguments)}_inherits(ExportSpecifierList,_ModuleSpecifierList2);var _super64=_createSuper(ExportSpecifierList);return _createClass(ExportSpecifierList)}(ModuleSpecifierList),exports.ModuleSpecifier=ModuleSpecifier=function(){var ModuleSpecifier=function(_Base36){function ModuleSpecifier(original,alias,moduleDeclarationType1){var _this55;_classCallCheck(this,ModuleSpecifier);var ref1,ref2;if(_this55=_super65.call(this),_this55.original=original,_this55.alias=alias,_this55.moduleDeclarationType=moduleDeclarationType1,_this55.original.comments||(null==(ref1=_this55.alias)?void 0:ref1.comments)){if(_this55.comments=[],_this55.original.comments){var _this55$comments;(_this55$comments=_this55.comments).push.apply(_this55$comments,_toConsumableArray(_this55.original.comments))}if(null==(ref2=_this55.alias)?void 0:ref2.comments){var _this55$comments2;(_this55$comments2=_this55.comments).push.apply(_this55$comments2,_toConsumableArray(_this55.alias.comments))}}return _this55.identifier=null==_this55.alias?_this55.original.value:_this55.alias.value,_this55}_inherits(ModuleSpecifier,_Base36);var _super65=_createSuper(ModuleSpecifier);return _createClass(ModuleSpecifier,[{key:\"compileNode\",value:function compileNode(o){var code;return this.addIdentifierToScope(o),code=[],code.push(this.makeCode(this.original.value)),null!=this.alias&&code.push(this.makeCode(\" as \".concat(this.alias.value))),code}},{key:\"addIdentifierToScope\",value:function addIdentifierToScope(o){return o.scope.find(this.identifier,this.moduleDeclarationType)}},{key:\"astNode\",value:function astNode(o){return this.addIdentifierToScope(o),_get(_getPrototypeOf(ModuleSpecifier.prototype),\"astNode\",this).call(this,o)}}]),ModuleSpecifier}(Base);return ModuleSpecifier.prototype.children=[\"original\",\"alias\"],ModuleSpecifier}.call(this),exports.ImportSpecifier=ImportSpecifier=function(_ModuleSpecifier){function ImportSpecifier(imported,local){return _classCallCheck(this,ImportSpecifier),_super66.call(this,imported,local,\"import\")}_inherits(ImportSpecifier,_ModuleSpecifier);var _super66=_createSuper(ImportSpecifier);return _createClass(ImportSpecifier,[{key:\"addIdentifierToScope\",value:function addIdentifierToScope(o){var ref1;return(ref1=this.identifier,0<=indexOf.call(o.importedSymbols,ref1))||o.scope.check(this.identifier)?this.error(\"'\".concat(this.identifier,\"' has already been declared\")):o.importedSymbols.push(this.identifier),_get(_getPrototypeOf(ImportSpecifier.prototype),\"addIdentifierToScope\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(o){var originalAst,ref1,ref2;return originalAst=this.original.ast(o),{imported:originalAst,local:null==(ref1=null==(ref2=this.alias)?void 0:ref2.ast(o))?originalAst:ref1,importKind:null}}}]),ImportSpecifier}(ModuleSpecifier),exports.ImportDefaultSpecifier=ImportDefaultSpecifier=function(_ImportSpecifier){function ImportDefaultSpecifier(){return _classCallCheck(this,ImportDefaultSpecifier),_super67.apply(this,arguments)}_inherits(ImportDefaultSpecifier,_ImportSpecifier);var _super67=_createSuper(ImportDefaultSpecifier);return _createClass(ImportDefaultSpecifier,[{key:\"astProperties\",value:function astProperties(o){return{local:this.original.ast(o)}}}]),ImportDefaultSpecifier}(ImportSpecifier),exports.ImportNamespaceSpecifier=ImportNamespaceSpecifier=function(_ImportSpecifier2){function ImportNamespaceSpecifier(){return _classCallCheck(this,ImportNamespaceSpecifier),_super68.apply(this,arguments)}_inherits(ImportNamespaceSpecifier,_ImportSpecifier2);var _super68=_createSuper(ImportNamespaceSpecifier);return _createClass(ImportNamespaceSpecifier,[{key:\"astProperties\",value:function astProperties(o){return{local:this.alias.ast(o)}}}]),ImportNamespaceSpecifier}(ImportSpecifier),exports.ExportSpecifier=ExportSpecifier=function(_ModuleSpecifier2){function ExportSpecifier(local,exported){return _classCallCheck(this,ExportSpecifier),_super69.call(this,local,exported,\"export\")}_inherits(ExportSpecifier,_ModuleSpecifier2);var _super69=_createSuper(ExportSpecifier);return _createClass(ExportSpecifier,[{key:\"astProperties\",value:function astProperties(o){var originalAst,ref1,ref2;return originalAst=this.original.ast(o),{local:originalAst,exported:null==(ref1=null==(ref2=this.alias)?void 0:ref2.ast(o))?originalAst:ref1}}}]),ExportSpecifier}(ModuleSpecifier),exports.DynamicImport=DynamicImport=function(_Base37){function DynamicImport(){return _classCallCheck(this,DynamicImport),_super70.apply(this,arguments)}_inherits(DynamicImport,_Base37);var _super70=_createSuper(DynamicImport);return _createClass(DynamicImport,[{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\"import\")]}},{key:\"astType\",value:function astType(){return\"Import\"}}]),DynamicImport}(Base),exports.DynamicImportCall=DynamicImportCall=function(_Call3){function DynamicImportCall(){return _classCallCheck(this,DynamicImportCall),_super71.apply(this,arguments)}_inherits(DynamicImportCall,_Call3);var _super71=_createSuper(DynamicImportCall);return _createClass(DynamicImportCall,[{key:\"compileNode\",value:function compileNode(o){return this.checkArguments(),_get(_getPrototypeOf(DynamicImportCall.prototype),\"compileNode\",this).call(this,o)}},{key:\"checkArguments\",value:function checkArguments(){var ref1;if(!(1<=(ref1=this.args.length)&&2>=ref1))return this.error(\"import() accepts either one or two arguments\")}},{key:\"astNode\",value:function astNode(o){return this.checkArguments(),_get(_getPrototypeOf(DynamicImportCall.prototype),\"astNode\",this).call(this,o)}}]),DynamicImportCall}(Call),exports.Assign=Assign=function(){var Assign=function(_Base38){function Assign(variable1,value1,context1){var options=3<arguments.length&&void 0!==arguments[3]?arguments[3]:{},_this56;_classCallCheck(this,Assign),_this56=_super72.call(this),_this56.variable=variable1,_this56.value=value1,_this56.context=context1,_this56.param=options.param,_this56.subpattern=options.subpattern,_this56.operatorToken=options.operatorToken,_this56.moduleDeclaration=options.moduleDeclaration;var _options$originalCont=options.originalContext;return _this56.originalContext=void 0===_options$originalCont?_this56.context:_options$originalCont,_this56.propagateLhs(),_this56}_inherits(Assign,_Base38);var _super72=_createSuper(Assign);return _createClass(Assign,[{key:\"isStatement\",value:function isStatement(o){return(null==o?void 0:o.level)===LEVEL_TOP&&null!=this.context&&(this.moduleDeclaration||0<=indexOf.call(this.context,\"?\"))}},{key:\"checkNameAssignability\",value:function checkNameAssignability(o,varBase){if(\"import\"===o.scope.type(varBase.value))return varBase.error(\"'\".concat(varBase.value,\"' is read-only\"))}},{key:\"assigns\",value:function assigns(name){return this[\"object\"===this.context?\"value\":\"variable\"].assigns(name)}},{key:\"unfoldSoak\",value:function unfoldSoak(o){return _unfoldSoak(o,this,\"variable\")}},{key:\"addScopeVariables\",value:function addScopeVariables(o){var _this57=this,_ref46=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref46$allowAssignmen=_ref46.allowAssignmentToExpansion,_ref46$allowAssignmen2=_ref46.allowAssignmentToNontrailingSplat,_ref46$allowAssignmen3=_ref46.allowAssignmentToEmptyArray,_ref46$allowAssignmen4=_ref46.allowAssignmentToComplexSplat,varBase;if(!(this.context&&\"**=\"!==this.context))return varBase=this.variable.unwrapAll(),varBase.isAssignable({allowExpansion:void 0!==_ref46$allowAssignmen&&_ref46$allowAssignmen,allowNontrailingSplat:void 0!==_ref46$allowAssignmen2&&_ref46$allowAssignmen2,allowEmptyArray:void 0!==_ref46$allowAssignmen3&&_ref46$allowAssignmen3,allowComplexSplat:void 0!==_ref46$allowAssignmen4&&_ref46$allowAssignmen4})||this.variable.error(\"'\".concat(this.variable.compile(o),\"' can't be assigned\")),varBase.eachName(function(name){var alreadyDeclared,commentFragments,commentsNode,message;if(\"function\"!=typeof name.hasProperties||!name.hasProperties())return(message=isUnassignable(name.value),message&&name.error(message),_this57.checkNameAssignability(o,name),_this57.moduleDeclaration)?(o.scope.add(name.value,_this57.moduleDeclaration),name.isDeclaration=!0):_this57.param?o.scope.add(name.value,\"alwaysDeclare\"===_this57.param?\"var\":\"param\"):(alreadyDeclared=o.scope.find(name.value),null==name.isDeclaration&&(name.isDeclaration=!alreadyDeclared),name.comments&&!o.scope.comments[name.value]&&!(_this57.value instanceof Class)&&name.comments.every(function(comment){return comment.here&&!comment.multiline}))?(commentsNode=new IdentifierLiteral(name.value),commentsNode.comments=name.comments,commentFragments=[],_this57.compileCommentFragments(o,commentsNode,commentFragments),o.scope.comments[name.value]=commentFragments):void 0})}},{key:\"compileNode\",value:function compileNode(o){var answer,compiledName,isValue,name,properties,prototype,ref1,ref2,ref3,ref4,val;if(isValue=this.variable instanceof Value,isValue){if((this.variable.isArray()||this.variable.isObject())&&!this.variable.isAssignable())return this.variable.isObject()&&this.variable.base.hasSplat()?this.compileObjectDestruct(o):this.compileDestructuring(o);if(this.variable.isSplice())return this.compileSplice(o);if(this.isConditional())return this.compileConditional(o);if(\"//=\"===(ref1=this.context)||\"%%=\"===ref1)return this.compileSpecialMath(o)}if(this.addScopeVariables(o),this.value instanceof Code)if(this.value.isStatic)this.value.name=this.variable.properties[0];else if(2<=(null==(ref2=this.variable.properties)?void 0:ref2.length)){var _ref47,_ref48,_splice$call,_splice$call2;ref3=this.variable.properties,_ref47=ref3,_ref48=_toArray(_ref47),properties=_ref48.slice(0),_ref47,_splice$call=splice.call(properties,-2),_splice$call2=_slicedToArray(_splice$call,2),prototype=_splice$call2[0],name=_splice$call2[1],_splice$call,\"prototype\"===(null==(ref4=prototype.name)?void 0:ref4.value)&&(this.value.name=name)}return(val=this.value.compileToFragments(o,LEVEL_LIST),compiledName=this.variable.compileToFragments(o,LEVEL_LIST),\"object\"===this.context)?(this.variable.shouldCache()&&(compiledName.unshift(this.makeCode(\"[\")),compiledName.push(this.makeCode(\"]\"))),compiledName.concat(this.makeCode(\": \"),val)):(answer=compiledName.concat(this.makeCode(\" \".concat(this.context||\"=\",\" \")),val),o.level>LEVEL_LIST||isValue&&this.variable.base instanceof Obj&&!this.nestedLhs&&!0!==this.param?this.wrapInParentheses(answer):answer)}},{key:\"compileObjectDestruct\",value:function compileObjectDestruct(o){var assigns,props,refVal,splat,splatProp;this.variable.base.reorderProperties(),props=this.variable.base.properties;var _slice1$call15=slice1.call(props,-1),_slice1$call16=_slicedToArray(_slice1$call15,1);return splat=_slice1$call16[0],splatProp=splat.name,assigns=[],refVal=new Value(new IdentifierLiteral(o.scope.freeVariable(\"ref\"))),props.splice(-1,1,new Splat(refVal)),assigns.push(new Assign(new Value(new Obj(props)),this.value).compileToFragments(o,LEVEL_LIST)),assigns.push(new Assign(new Value(splatProp),refVal).compileToFragments(o,LEVEL_LIST)),this.joinFragmentArrays(assigns,\", \")}},{key:\"compileDestructuring\",value:function compileDestructuring(o){var _this58=this,assignObjects,assigns,code,compSlice,compSplice,complexObjects,expIdx,expans,fragments,hasObjAssigns,isExpans,isSplat,leftObjs,loopObjects,obj,objIsUnassignable,objects,olen,processObjects,pushAssign,ref,refExp,restVar,rightObjs,slicer,splatVar,splatVarAssign,splatVarRef,splats,splatsAndExpans,top,value,vvar,vvarText;if(top=o.level===LEVEL_TOP,value=this.value,objects=this.variable.base.objects,olen=objects.length,0===olen)return code=value.compileToFragments(o),o.level>=LEVEL_OP?this.wrapInParentheses(code):code;var _objects=objects,_objects2=_slicedToArray(_objects,1);obj=_objects2[0],this.disallowLoneExpansion();var _this$getAndCheckSpla=this.getAndCheckSplatsAndExpansions();return splats=_this$getAndCheckSpla.splats,expans=_this$getAndCheckSpla.expans,splatsAndExpans=_this$getAndCheckSpla.splatsAndExpans,isSplat=0<(null==splats?void 0:splats.length),isExpans=0<(null==expans?void 0:expans.length),vvar=value.compileToFragments(o,LEVEL_LIST),vvarText=fragmentsToText(vvar),assigns=[],pushAssign=function(variable,val){return assigns.push(new Assign(variable,val,null,{param:_this58.param,subpattern:!0}).compileToFragments(o,LEVEL_LIST))},isSplat&&(splatVar=objects[splats[0]].name.unwrap(),(splatVar instanceof Arr||splatVar instanceof Obj)&&(splatVarRef=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),objects[splats[0]].name=splatVarRef,splatVarAssign=function(){return pushAssign(new Value(splatVar),splatVarRef)})),(!(value.unwrap()instanceof IdentifierLiteral)||this.variable.assigns(vvarText))&&(ref=o.scope.freeVariable(\"ref\"),assigns.push([this.makeCode(ref+\" = \")].concat(_toConsumableArray(vvar))),vvar=[this.makeCode(ref)],vvarText=ref),slicer=function(type){return function(vvar,start){var end=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],args,slice;return vvar instanceof Value||(vvar=new IdentifierLiteral(vvar)),args=[vvar,new NumberLiteral(start)],end&&args.push(new NumberLiteral(end)),slice=new Value(new IdentifierLiteral(utility(type,o)),[new Access(new PropertyName(\"call\"))]),new Value(new Call(slice,args))}},compSlice=slicer(\"slice\"),compSplice=slicer(\"splice\"),hasObjAssigns=function(objs){var i,j,len1,results1;for(results1=[],i=j=0,len1=objs.length;j<len1;i=++j)obj=objs[i],obj instanceof Assign&&\"object\"===obj.context&&results1.push(i);return results1},objIsUnassignable=function(objs){var j,len1;for(j=0,len1=objs.length;j<len1;j++)if(obj=objs[j],!obj.isAssignable())return!0;return!1},complexObjects=function(objs){return hasObjAssigns(objs).length||objIsUnassignable(objs)||1===olen},loopObjects=function(objs,vvar,vvarTxt){var acc,i,idx,j,len1,message,results1,vval;for(results1=[],i=j=0,len1=objs.length;j<len1;i=++j)if(obj=objs[i],!(obj instanceof Elision)){if(obj instanceof Assign&&\"object\"===obj.context){var _obj=obj;if(idx=_obj.variable.base,vvar=_obj.value,vvar instanceof Assign){var _vvar=vvar;vvar=_vvar.variable}idx=vvar[\"this\"]?vvar.properties[0].name:new PropertyName(vvar.unwrap().value),acc=idx.unwrap()instanceof PropertyName,vval=new Value(value,[new(acc?Access:Index)(idx)])}else vvar=function(){switch(!1){case!(obj instanceof Splat):return new Value(obj.name);default:return obj;}}(),vval=function(){switch(!1){case!(obj instanceof Splat):return compSlice(vvarTxt,i);default:return new Value(new Literal(vvarTxt),[new Index(new NumberLiteral(i))]);}}();message=isUnassignable(vvar.unwrap().value),message&&vvar.error(message),results1.push(pushAssign(vvar,vval))}return results1},assignObjects=function(objs,vvar,vvarTxt){var vval;return vvar=new Value(new Arr(objs,!0)),vval=vvarTxt instanceof Value?vvarTxt:new Value(new Literal(vvarTxt)),pushAssign(vvar,vval)},processObjects=function(objs,vvar,vvarTxt){return complexObjects(objs)?loopObjects(objs,vvar,vvarTxt):assignObjects(objs,vvar,vvarTxt)},splatsAndExpans.length?(expIdx=splatsAndExpans[0],leftObjs=objects.slice(0,expIdx+(isSplat?1:0)),rightObjs=objects.slice(expIdx+1),0!==leftObjs.length&&processObjects(leftObjs,vvar,vvarText),0!==rightObjs.length&&(refExp=function(){switch(!1){case!isSplat:return compSplice(new Value(objects[expIdx].name),-1*rightObjs.length);case!isExpans:return compSlice(vvarText,-1*rightObjs.length);}}(),complexObjects(rightObjs)&&(restVar=refExp,refExp=o.scope.freeVariable(\"ref\"),assigns.push([this.makeCode(refExp+\" = \")].concat(_toConsumableArray(restVar.compileToFragments(o,LEVEL_LIST))))),processObjects(rightObjs,vvar,refExp))):processObjects(objects,vvar,vvarText),\"function\"==typeof splatVarAssign&&splatVarAssign(),top||this.subpattern||assigns.push(vvar),fragments=this.joinFragmentArrays(assigns,\", \"),o.level<LEVEL_LIST?fragments:this.wrapInParentheses(fragments)}},{key:\"disallowLoneExpansion\",value:function disallowLoneExpansion(){var loneObject,objects;if(this.variable.base instanceof Arr&&(objects=this.variable.base.objects,1===(null==objects?void 0:objects.length))){var _objects3=objects,_objects4=_slicedToArray(_objects3,1);if(loneObject=_objects4[0],loneObject instanceof Expansion)return loneObject.error(\"Destructuring assignment has no target\")}}},{key:\"getAndCheckSplatsAndExpansions\",value:function getAndCheckSplatsAndExpansions(){var expans,i,obj,objects,splats,splatsAndExpans;return this.variable.base instanceof Arr?(objects=this.variable.base.objects,splats=function(){var j,len1,results1;for(results1=[],i=j=0,len1=objects.length;j<len1;i=++j)obj=objects[i],obj instanceof Splat&&results1.push(i);return results1}(),expans=function(){var j,len1,results1;for(results1=[],i=j=0,len1=objects.length;j<len1;i=++j)obj=objects[i],obj instanceof Expansion&&results1.push(i);return results1}(),splatsAndExpans=[].concat(_toConsumableArray(splats),_toConsumableArray(expans)),1<splatsAndExpans.length&&objects[splatsAndExpans.sort()[1]].error(\"multiple splats/expansions are disallowed in an assignment\"),{splats:splats,expans:expans,splatsAndExpans:splatsAndExpans}):{splats:[],expans:[],splatsAndExpans:[]}}},{key:\"compileConditional\",value:function compileConditional(o){var _this$variable$cacheR=this.variable.cacheReference(o),_this$variable$cacheR2=_slicedToArray(_this$variable$cacheR,2),fragments,left,right;return left=_this$variable$cacheR2[0],right=_this$variable$cacheR2[1],left.properties.length||!(left.base instanceof Literal)||left.base instanceof ThisLiteral||o.scope.check(left.base.value)||this.throwUnassignableConditionalError(left.base.value),0<=indexOf.call(this.context,\"?\")?(o.isExistentialEquals=!0,new If(new Existence(left),right,{type:\"if\"}).addElse(new Assign(right,this.value,\"=\")).compileToFragments(o)):(fragments=new Op(this.context.slice(0,-1),left,new Assign(right,this.value,\"=\")).compileToFragments(o),o.level<=LEVEL_LIST?fragments:this.wrapInParentheses(fragments))}},{key:\"compileSpecialMath\",value:function compileSpecialMath(o){var _this$variable$cacheR3=this.variable.cacheReference(o),_this$variable$cacheR4=_slicedToArray(_this$variable$cacheR3,2),left,right;return left=_this$variable$cacheR4[0],right=_this$variable$cacheR4[1],new Assign(left,new Op(this.context.slice(0,-1),right,this.value)).compileToFragments(o)}},{key:\"compileSplice\",value:function compileSplice(o){var _this$variable$proper=this.variable.properties.pop(),_this$variable$proper2=_this$variable$proper.range,answer,exclusive,from,fromDecl,fromRef,name,to,unwrappedVar,valDef,valRef;if(from=_this$variable$proper2.from,to=_this$variable$proper2.to,exclusive=_this$variable$proper2.exclusive,unwrappedVar=this.variable.unwrapAll(),unwrappedVar.comments&&(moveComments(unwrappedVar,this),delete this.variable.comments),name=this.variable.compile(o),from){var _this$cacheToCodeFrag7=this.cacheToCodeFragments(from.cache(o,LEVEL_OP)),_this$cacheToCodeFrag8=_slicedToArray(_this$cacheToCodeFrag7,2);fromDecl=_this$cacheToCodeFrag8[0],fromRef=_this$cacheToCodeFrag8[1]}else fromDecl=fromRef=\"0\";to?(null==from?void 0:from.isNumber())&&to.isNumber()?(to=to.compile(o)-fromRef,!exclusive&&(to+=1)):(to=to.compile(o,LEVEL_ACCESS)+\" - \"+fromRef,!exclusive&&(to+=\" + 1\")):to=\"9e9\";var _this$value$cache=this.value.cache(o,LEVEL_LIST),_this$value$cache2=_slicedToArray(_this$value$cache,2);return valDef=_this$value$cache2[0],valRef=_this$value$cache2[1],answer=[].concat(this.makeCode(\"\".concat(utility(\"splice\",o),\".apply(\").concat(name,\", [\").concat(fromDecl,\", \").concat(to,\"].concat(\")),valDef,this.makeCode(\")), \"),valRef),o.level>LEVEL_TOP?this.wrapInParentheses(answer):answer}},{key:\"eachName\",value:function eachName(iterator){return this.variable.unwrapAll().eachName(iterator)}},{key:\"isDefaultAssignment\",value:function isDefaultAssignment(){return this.param||this.nestedLhs}},{key:\"propagateLhs\",value:function propagateLhs(){var ref1,ref2;return(null==(ref1=this.variable)?void 0:\"function\"==typeof ref1.isArray?ref1.isArray():void 0)||(null==(ref2=this.variable)?void 0:\"function\"==typeof ref2.isObject?ref2.isObject():void 0)?this.variable.base.propagateLhs(!0):void 0}},{key:\"throwUnassignableConditionalError\",value:function throwUnassignableConditionalError(name){return this.variable.error(\"the variable \\\"\".concat(name,\"\\\" can't be assigned with \").concat(this.context,\" because it has not been declared before\"))}},{key:\"isConditional\",value:function isConditional(){var ref1;return\"||=\"===(ref1=this.context)||\"&&=\"===ref1||\"?=\"===ref1}},{key:\"astNode\",value:function astNode(o){var variable;return this.disallowLoneExpansion(),this.getAndCheckSplatsAndExpansions(),this.isConditional()&&(variable=this.variable.unwrap(),variable instanceof IdentifierLiteral&&!o.scope.check(variable.value)&&this.throwUnassignableConditionalError(variable.value)),this.addScopeVariables(o,{allowAssignmentToExpansion:!0,allowAssignmentToNontrailingSplat:!0,allowAssignmentToEmptyArray:!0,allowAssignmentToComplexSplat:!0}),_get(_getPrototypeOf(Assign.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isDefaultAssignment()?\"AssignmentPattern\":\"AssignmentExpression\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ret;return ret={right:this.value.ast(o,LEVEL_LIST),left:this.variable.ast(o,LEVEL_LIST)},this.isDefaultAssignment()||(ret.operator=null==(ref1=this.originalContext)?\"=\":ref1),ret}}]),Assign}(Base);return Assign.prototype.children=[\"variable\",\"value\"],Assign.prototype.isAssignable=YES,Assign.prototype.isStatementAst=NO,Assign}.call(this),exports.FuncGlyph=FuncGlyph=function(_Base39){function FuncGlyph(glyph){var _this59;return _classCallCheck(this,FuncGlyph),_this59=_super73.call(this),_this59.glyph=glyph,_this59}_inherits(FuncGlyph,_Base39);var _super73=_createSuper(FuncGlyph);return _createClass(FuncGlyph)}(Base),exports.Code=Code=function(){var Code=function(_Base40){function Code(params,body,funcGlyph,paramStart){var _this60;_classCallCheck(this,Code);var ref1;return _this60=_super74.call(this),_this60.funcGlyph=funcGlyph,_this60.paramStart=paramStart,_this60.params=params||[],_this60.body=body||new Block,_this60.bound=\"=>\"===(null==(ref1=_this60.funcGlyph)?void 0:ref1.glyph),_this60.isGenerator=!1,_this60.isAsync=!1,_this60.isMethod=!1,_this60.body.traverseChildren(!1,function(node){if((node instanceof Op&&node.isYield()||node instanceof YieldReturn)&&(_this60.isGenerator=!0),(node instanceof Op&&node.isAwait()||node instanceof AwaitReturn)&&(_this60.isAsync=!0),node instanceof For&&node.isAwait())return _this60.isAsync=!0}),_this60.propagateLhs(),_this60}_inherits(Code,_Base40);var _super74=_createSuper(Code);return _createClass(Code,[{key:\"isStatement\",value:function isStatement(){return this.isMethod}},{key:\"makeScope\",value:function makeScope(parentScope){return new Scope(parentScope,this.body,this)}},{key:\"compileNode\",value:function compileNode(o){var _this$body$expression3,_answer4,answer,body,boundMethodCheck,comment,condition,exprs,generatedVariables,haveBodyParam,haveSplatParam,i,ifTrue,j,k,l,len1,len2,len3,m,methodScope,modifiers,name,param,paramToAddToScope,params,paramsAfterSplat,ref,ref1,ref2,ref3,ref4,ref5,ref6,ref7,ref8,scopeVariablesCount,signature,splatParamName,thisAssignments,wasEmpty,yieldNode;for(this.checkForAsyncOrGeneratorConstructor(),this.bound&&((null==(ref1=o.scope.method)?void 0:ref1.bound)&&(this.context=o.scope.method.context),!this.context&&(this.context=\"this\")),this.updateOptions(o),params=[],exprs=[],thisAssignments=null==(ref2=null==(ref3=this.thisAssignments)?void 0:ref3.slice())?[]:ref2,paramsAfterSplat=[],haveSplatParam=!1,haveBodyParam=!1,this.checkForDuplicateParams(),this.disallowLoneExpansionAndMultipleSplats(),this.eachParamName(function(name,node,param,obj){var replacement,target;if(node[\"this\"])return name=node.properties[0].name.value,0<=indexOf.call(JS_FORBIDDEN,name)&&(name=\"_\".concat(name)),target=new IdentifierLiteral(o.scope.freeVariable(name,{reserve:!1})),replacement=param.name instanceof Obj&&obj instanceof Assign&&\"=\"===obj.operatorToken.value?new Assign(new IdentifierLiteral(name),target,\"object\"):target,param.renameParam(node,replacement),thisAssignments.push(new Assign(node,target))}),ref4=this.params,(i=j=0,len1=ref4.length);j<len1;i=++j)param=ref4[i],param.splat||param instanceof Expansion?(haveSplatParam=!0,param.splat?(param.name instanceof Arr||param.name instanceof Obj?(splatParamName=o.scope.freeVariable(\"arg\"),params.push(ref=new Value(new IdentifierLiteral(splatParamName))),exprs.push(new Assign(new Value(param.name),ref))):(params.push(ref=param.asReference(o)),splatParamName=fragmentsToText(ref.compileNodeWithoutComments(o))),param.shouldCache()&&exprs.push(new Assign(new Value(param.name),ref))):(splatParamName=o.scope.freeVariable(\"args\"),params.push(new Value(new IdentifierLiteral(splatParamName)))),o.scope.parameter(splatParamName)):((param.shouldCache()||haveBodyParam)&&(param.assignedInBody=!0,haveBodyParam=!0,null==param.value?exprs.push(new Assign(new Value(param.name),param.asReference(o),null,{param:\"alwaysDeclare\"})):(condition=new Op(\"===\",param,new UndefinedLiteral()),ifTrue=new Assign(new Value(param.name),param.value),exprs.push(new If(condition,ifTrue)))),haveSplatParam?(paramsAfterSplat.push(param),null!=param.value&&!param.shouldCache()&&(condition=new Op(\"===\",param,new UndefinedLiteral()),ifTrue=new Assign(new Value(param.name),param.value),exprs.push(new If(condition,ifTrue))),null!=(null==(ref5=param.name)?void 0:ref5.value)&&o.scope.add(param.name.value,\"var\",!0)):(ref=param.shouldCache()?param.asReference(o):null==param.value||param.assignedInBody?param:new Assign(new Value(param.name),param.value,null,{param:!0}),param.name instanceof Arr||param.name instanceof Obj?(param.name.lhs=!0,!param.shouldCache()&&param.name.eachName(function(prop){return o.scope.parameter(prop.value)})):(paramToAddToScope=null==param.value?ref:param,o.scope.parameter(fragmentsToText(paramToAddToScope.compileToFragmentsWithoutComments(o)))),params.push(ref)));if(0!==paramsAfterSplat.length&&exprs.unshift(new Assign(new Value(new Arr([new Splat(new IdentifierLiteral(splatParamName))].concat(_toConsumableArray(function(){var k,len2,results1;for(results1=[],k=0,len2=paramsAfterSplat.length;k<len2;k++)param=paramsAfterSplat[k],results1.push(param.asReference(o));return results1}())))),new Value(new IdentifierLiteral(splatParamName)))),wasEmpty=this.body.isEmpty(),this.disallowSuperInParamDefaults(),this.checkSuperCallsInConstructorBody(),!this.expandCtorSuper(thisAssignments)){var _this$body$expression2;(_this$body$expression2=this.body.expressions).unshift.apply(_this$body$expression2,_toConsumableArray(thisAssignments))}for((_this$body$expression3=this.body.expressions).unshift.apply(_this$body$expression3,_toConsumableArray(exprs)),this.isMethod&&this.bound&&!this.isStatic&&this.classVariable&&(boundMethodCheck=new Value(new Literal(utility(\"boundMethodCheck\",o))),this.body.expressions.unshift(new Call(boundMethodCheck,[new Value(new ThisLiteral()),this.classVariable]))),wasEmpty||this.noReturn||this.body.makeReturn(),this.bound&&this.isGenerator&&(yieldNode=this.body.contains(function(node){return node instanceof Op&&\"yield\"===node.operator}),(yieldNode||this).error(\"yield cannot occur inside bound (fat arrow) functions\")),modifiers=[],this.isMethod&&this.isStatic&&modifiers.push(\"static\"),this.isAsync&&modifiers.push(\"async\"),this.isMethod||this.bound?this.isGenerator&&modifiers.push(\"*\"):modifiers.push(\"function\".concat(this.isGenerator?\"*\":\"\")),signature=[this.makeCode(\"(\")],null!=(null==(ref6=this.paramStart)?void 0:ref6.comments)&&this.compileCommentFragments(o,this.paramStart,signature),(i=k=0,len2=params.length);k<len2;i=++k){var _signature;if(param=params[i],0!==i&&signature.push(this.makeCode(\", \")),haveSplatParam&&i===params.length-1&&signature.push(this.makeCode(\"...\")),scopeVariablesCount=o.scope.variables.length,(_signature=signature).push.apply(_signature,_toConsumableArray(param.compileToFragments(o,LEVEL_PAREN))),scopeVariablesCount!==o.scope.variables.length){var _o$scope$parent$varia;generatedVariables=o.scope.variables.splice(scopeVariablesCount),(_o$scope$parent$varia=o.scope.parent.variables).push.apply(_o$scope$parent$varia,_toConsumableArray(generatedVariables))}}if(signature.push(this.makeCode(\")\")),null!=(null==(ref7=this.funcGlyph)?void 0:ref7.comments)){for(ref8=this.funcGlyph.comments,l=0,len3=ref8.length;l<len3;l++)comment=ref8[l],comment.unshift=!1;this.compileCommentFragments(o,this.funcGlyph,signature)}if(this.body.isEmpty()||(body=this.body.compileWithDeclarations(o)),this.isMethod){var _ref49=[o.scope,o.scope.parent];methodScope=_ref49[0],o.scope=_ref49[1],name=this.name.compileToFragments(o),\".\"===name[0].code&&name.shift(),o.scope=methodScope}if(answer=this.joinFragmentArrays(function(){var len4,p,results1;for(results1=[],p=0,len4=modifiers.length;p<len4;p++)m=modifiers[p],results1.push(this.makeCode(m));return results1}.call(this),\" \"),modifiers.length&&name&&answer.push(this.makeCode(\" \")),name){var _answer3;(_answer3=answer).push.apply(_answer3,_toConsumableArray(name))}if((_answer4=answer).push.apply(_answer4,_toConsumableArray(signature)),this.bound&&!this.isMethod&&answer.push(this.makeCode(\" =>\")),answer.push(this.makeCode(\" {\")),null==body?void 0:body.length){var _answer5;(_answer5=answer).push.apply(_answer5,[this.makeCode(\"\\n\")].concat(_toConsumableArray(body),[this.makeCode(\"\\n\".concat(this.tab))]))}return answer.push(this.makeCode(\"}\")),this.isMethod?indentInitial(answer,this):this.front||o.level>=LEVEL_ACCESS?this.wrapInParentheses(answer):answer}},{key:\"updateOptions\",value:function updateOptions(o){return o.scope=del(o,\"classScope\")||this.makeScope(o.scope),o.scope.shared=del(o,\"sharedScope\"),o.indent+=TAB,delete o.bare,delete o.isExistentialEquals}},{key:\"checkForDuplicateParams\",value:function checkForDuplicateParams(){var paramNames;return paramNames=[],this.eachParamName(function(name,node){return 0<=indexOf.call(paramNames,name)&&node.error(\"multiple parameters named '\".concat(name,\"'\")),paramNames.push(name)})}},{key:\"eachParamName\",value:function eachParamName(iterator){var j,len1,param,ref1,results1;for(ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],results1.push(param.eachName(iterator));return results1}},{key:\"traverseChildren\",value:function traverseChildren(crossScope,func){if(crossScope)return _get(_getPrototypeOf(Code.prototype),\"traverseChildren\",this).call(this,crossScope,func)}},{key:\"replaceInContext\",value:function replaceInContext(child,replacement){return!!this.bound&&_get(_getPrototypeOf(Code.prototype),\"replaceInContext\",this).call(this,child,replacement)}},{key:\"disallowSuperInParamDefaults\",value:function disallowSuperInParamDefaults(){var _ref50=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},forAst=_ref50.forAst;return!!this.ctor&&this.eachSuperCall(Block.wrap(this.params),function(superCall){return superCall.error(\"'super' is not allowed in constructor parameter defaults\")},{checkForThisBeforeSuper:!forAst})}},{key:\"checkSuperCallsInConstructorBody\",value:function checkSuperCallsInConstructorBody(){var _this61=this,seenSuper;return!!this.ctor&&(seenSuper=this.eachSuperCall(this.body,function(superCall){if(\"base\"===_this61.ctor)return superCall.error(\"'super' is only allowed in derived class constructors\")}),seenSuper)}},{key:\"flagThisParamInDerivedClassConstructorWithoutCallingSuper\",value:function flagThisParamInDerivedClassConstructorWithoutCallingSuper(param){return param.error(\"Can't use @params in derived class constructors without calling super\")}},{key:\"checkForAsyncOrGeneratorConstructor\",value:function checkForAsyncOrGeneratorConstructor(){if(this.ctor&&(this.isAsync&&this.name.error(\"Class constructor may not be async\"),this.isGenerator))return this.name.error(\"Class constructor may not be a generator\")}},{key:\"disallowLoneExpansionAndMultipleSplats\",value:function disallowLoneExpansionAndMultipleSplats(){var j,len1,param,ref1,results1,seenSplatParam;for(seenSplatParam=!1,ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],param.splat||param instanceof Expansion?(seenSplatParam?param.error(\"only one splat or expansion parameter is allowed per function definition\"):param instanceof Expansion&&1===this.params.length&&param.error(\"an expansion parameter cannot be the only parameter in a function definition\"),results1.push(seenSplatParam=!0)):results1.push(void 0);return results1}},{key:\"expandCtorSuper\",value:function expandCtorSuper(thisAssignments){var haveThisParam,param,ref1,seenSuper;return!!this.ctor&&(seenSuper=this.eachSuperCall(this.body,function(superCall){return superCall.expressions=thisAssignments}),haveThisParam=thisAssignments.length&&thisAssignments.length!==(null==(ref1=this.thisAssignments)?void 0:ref1.length),\"derived\"===this.ctor&&!seenSuper&&haveThisParam&&(param=thisAssignments[0].variable,this.flagThisParamInDerivedClassConstructorWithoutCallingSuper(param)),seenSuper)}},{key:\"eachSuperCall\",value:function eachSuperCall(context,iterator){var _this62=this,_ref51=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_ref51$checkForThisBe=_ref51.checkForThisBeforeSuper,seenSuper;return seenSuper=!1,context.traverseChildren(!0,function(child){var childArgs;return child instanceof SuperCall?(!child.variable.accessor&&(childArgs=child.args.filter(function(arg){return!(arg instanceof Class)&&(!(arg instanceof Code)||arg.bound)}),Block.wrap(childArgs).traverseChildren(!0,function(node){if(node[\"this\"])return node.error(\"Can't call super with @params in derived class constructors\")})),seenSuper=!0,iterator(child)):(void 0===_ref51$checkForThisBe||_ref51$checkForThisBe)&&child instanceof ThisLiteral&&\"derived\"===_this62.ctor&&!seenSuper&&child.error(\"Can't reference 'this' before calling super in derived class constructors\"),!(child instanceof SuperCall)&&(!(child instanceof Code)||child.bound)}),seenSuper}},{key:\"propagateLhs\",value:function propagateLhs(){var j,len1,name,param,ref1,results1;for(ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++){param=ref1[j];var _param=param;name=_param.name,name instanceof Arr||name instanceof Obj?results1.push(name.propagateLhs(!0)):param instanceof Expansion?results1.push(param.lhs=!0):results1.push(void 0)}return results1}},{key:\"astAddParamsToScope\",value:function astAddParamsToScope(o){return this.eachParamName(function(name){return o.scope.add(name,\"param\")})}},{key:\"astNode\",value:function astNode(o){var _this63=this,seenSuper;return this.updateOptions(o),this.checkForAsyncOrGeneratorConstructor(),this.checkForDuplicateParams(),this.disallowSuperInParamDefaults({forAst:!0}),this.disallowLoneExpansionAndMultipleSplats(),seenSuper=this.checkSuperCallsInConstructorBody(),\"derived\"!==this.ctor||seenSuper||this.eachParamName(function(name,node){if(node[\"this\"])return _this63.flagThisParamInDerivedClassConstructorWithoutCallingSuper(node)}),this.astAddParamsToScope(o),this.body.isEmpty()||this.noReturn||this.body.makeReturn(null,!0),_get(_getPrototypeOf(Code.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isMethod?\"ClassMethod\":this.bound?\"ArrowFunctionExpression\":\"FunctionExpression\"}},{key:\"paramForAst\",value:function paramForAst(param){var name,splat,value;return param instanceof Expansion?param:(name=param.name,value=param.value,splat=param.splat,splat?new Splat(name,{lhs:!0,postfix:splat.postfix}).withLocationDataFrom(param):null==value?name:new Assign(name,value,null,{param:!0}).withLocationDataFrom({locationData:mergeLocationData(name.locationData,value.locationData)}))}},{key:\"methodAstProperties\",value:function methodAstProperties(o){var _this64=this,getIsComputed,ref1,ref2,ref3,ref4;return getIsComputed=function(){return!!(_this64.name instanceof Index)||!!(_this64.name instanceof ComputedPropertyName)||!!(_this64.name.name instanceof ComputedPropertyName)},{static:!!this.isStatic,key:this.name.ast(o),computed:getIsComputed(),kind:this.ctor?\"constructor\":\"method\",operator:null==(ref1=null==(ref2=this.operatorToken)?void 0:ref2.value)?\"=\":ref1,staticClassName:null==(ref3=null==(ref4=this.isStatic.staticClassName)?void 0:ref4.ast(o))?null:ref3,bound:!!this.bound}}},{key:\"astProperties\",value:function astProperties(o){var param,ref1;return Object.assign({params:function(){var j,len1,ref1,results1;for(ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],results1.push(this.paramForAst(param).ast(o));return results1}.call(this),body:this.body.ast(Object.assign({},o,{checkForDirectives:!0}),LEVEL_TOP),generator:!!this.isGenerator,async:!!this.isAsync,id:null,hasIndentedBody:this.body.locationData.first_line>(null==(ref1=this.funcGlyph)?void 0:ref1.locationData.first_line)},this.isMethod?this.methodAstProperties(o):{})}},{key:\"astLocationData\",value:function(){var astLocationData,functionLocationData;return(functionLocationData=_get(_getPrototypeOf(Code.prototype),\"astLocationData\",this).call(this),!this.isMethod)?functionLocationData:(astLocationData=mergeAstLocationData(this.name.astLocationData(),functionLocationData),null!=this.isStatic.staticClassName&&(astLocationData=mergeAstLocationData(this.isStatic.staticClassName.astLocationData(),astLocationData)),astLocationData)}}]),Code}(Base);return Code.prototype.children=[\"params\",\"body\"],Code.prototype.jumps=NO,Code}.call(this),exports.Param=Param=function(){var Param=function(_Base41){function Param(name1,value1,splat1){var _this65;_classCallCheck(this,Param);var message,token;return _this65=_super75.call(this),_this65.name=name1,_this65.value=value1,_this65.splat=splat1,message=isUnassignable(_this65.name.unwrapAll().value),message&&_this65.name.error(message),_this65.name instanceof Obj&&_this65.name.generated&&(token=_this65.name.objects[0].operatorToken,token.error(\"unexpected \".concat(token.value))),_this65}_inherits(Param,_Base41);var _super75=_createSuper(Param);return _createClass(Param,[{key:\"compileToFragments\",value:function compileToFragments(o){return this.name.compileToFragments(o,LEVEL_LIST)}},{key:\"compileToFragmentsWithoutComments\",value:function compileToFragmentsWithoutComments(o){return this.name.compileToFragmentsWithoutComments(o,LEVEL_LIST)}},{key:\"asReference\",value:function asReference(o){var name,node;return this.reference?this.reference:(node=this.name,node[\"this\"]?(name=node.properties[0].name.value,0<=indexOf.call(JS_FORBIDDEN,name)&&(name=\"_\".concat(name)),node=new IdentifierLiteral(o.scope.freeVariable(name))):node.shouldCache()&&(node=new IdentifierLiteral(o.scope.freeVariable(\"arg\"))),node=new Value(node),node.updateLocationDataIfMissing(this.locationData),this.reference=node)}},{key:\"shouldCache\",value:function shouldCache(){return this.name.shouldCache()}},{key:\"eachName\",value:function eachName(iterator){var _this66=this,name=1<arguments.length&&void 0!==arguments[1]?arguments[1]:this.name,atParam,checkAssignabilityOfLiteral,j,len1,nObj,node,obj,ref1,ref2;if(checkAssignabilityOfLiteral=function(literal){var message;if(message=isUnassignable(literal.value),message&&literal.error(message),!literal.isAssignable())return literal.error(\"'\".concat(literal.value,\"' can't be assigned\"))},atParam=function(obj){var originalObj=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;return iterator(\"@\".concat(obj.properties[0].name.value),obj,_this66,originalObj)},name instanceof Call&&name.error(\"Function invocation can't be assigned\"),name instanceof Literal)return checkAssignabilityOfLiteral(name),iterator(name.value,name,this);if(name instanceof Value)return atParam(name);for(ref2=null==(ref1=name.objects)?[]:ref1,j=0,len1=ref2.length;j<len1;j++)obj=ref2[j],nObj=obj,obj instanceof Assign&&null==obj.context&&(obj=obj.variable),obj instanceof Assign?(obj=obj.value instanceof Assign?obj.value.variable:obj.value,this.eachName(iterator,obj.unwrap())):obj instanceof Splat?(node=obj.name.unwrap(),iterator(node.value,node,this)):obj instanceof Value?obj.isArray()||obj.isObject()?this.eachName(iterator,obj.base):obj[\"this\"]?atParam(obj,nObj):(checkAssignabilityOfLiteral(obj.base),iterator(obj.base.value,obj.base,this)):obj instanceof Elision?obj:!(obj instanceof Expansion)&&obj.error(\"illegal parameter \".concat(obj.compile()))}},{key:\"renameParam\",value:function renameParam(node,newNode){var isNode,replacement;return isNode=function(candidate){return candidate===node},replacement=function(node,parent){var key;return parent instanceof Obj?(key=node,node[\"this\"]&&(key=node.properties[0].name),node[\"this\"]&&key.value===newNode.value?new Value(newNode):new Assign(new Value(key),newNode,\"object\")):newNode},this.replaceInContext(isNode,replacement)}}]),Param}(Base);return Param.prototype.children=[\"name\",\"value\"],Param}.call(this),exports.Splat=Splat=function(){var Splat=function(_Base42){function Splat(name){var _ref52=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},lhs1=_ref52.lhs,_ref52$postfix=_ref52.postfix,_this67;return _classCallCheck(this,Splat),_this67=_super76.call(this),_this67.lhs=lhs1,_this67.postfix=void 0===_ref52$postfix||_ref52$postfix,_this67.name=name.compile?name:new Literal(name),_this67}_inherits(Splat,_Base42);var _super76=_createSuper(Splat);return _createClass(Splat,[{key:\"shouldCache\",value:function shouldCache(){return!1}},{key:\"isAssignable\",value:function isAssignable(){var _ref53=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},_ref53$allowComplexSp=_ref53.allowComplexSplat;return this.name instanceof Obj||this.name instanceof Parens?void 0!==_ref53$allowComplexSp&&_ref53$allowComplexSp:this.name.isAssignable()&&(!this.name.isAtomic||this.name.isAtomic())}},{key:\"assigns\",value:function assigns(name){return this.name.assigns(name)}},{key:\"compileNode\",value:function compileNode(o){var compiledSplat;return compiledSplat=[this.makeCode(\"...\")].concat(_toConsumableArray(this.name.compileToFragments(o,LEVEL_OP))),this.jsx?[this.makeCode(\"{\")].concat(_toConsumableArray(compiledSplat),[this.makeCode(\"}\")]):compiledSplat}},{key:\"unwrap\",value:function unwrap(){return this.name}},{key:\"propagateLhs\",value:function propagateLhs(setLhs){var base1;return setLhs&&(this.lhs=!0),this.lhs?\"function\"==typeof(base1=this.name).propagateLhs?base1.propagateLhs(!0):void 0:void 0}},{key:\"astType\",value:function astType(){return this.jsx?\"JSXSpreadAttribute\":this.lhs?\"RestElement\":\"SpreadElement\"}},{key:\"astProperties\",value:function astProperties(o){return{argument:this.name.ast(o,LEVEL_OP),postfix:this.postfix}}}]),Splat}(Base);return Splat.prototype.children=[\"name\"],Splat}.call(this),exports.Expansion=Expansion=function(){var Expansion=function(_Base43){function Expansion(){return _classCallCheck(this,Expansion),_super77.apply(this,arguments)}_inherits(Expansion,_Base43);var _super77=_createSuper(Expansion);return _createClass(Expansion,[{key:\"compileNode\",value:function compileNode(){return this.throwLhsError()}},{key:\"asReference\",value:function asReference(){return this}},{key:\"eachName\",value:function eachName(){}},{key:\"throwLhsError\",value:function throwLhsError(){return this.error(\"Expansion must be used inside a destructuring assignment or parameter list\")}},{key:\"astNode\",value:function astNode(o){return this.lhs||this.throwLhsError(),_get(_getPrototypeOf(Expansion.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"RestElement\"}},{key:\"astProperties\",value:function astProperties(){return{argument:null}}}]),Expansion}(Base);return Expansion.prototype.shouldCache=NO,Expansion}.call(this),exports.Elision=Elision=function(){var Elision=function(_Base44){function Elision(){return _classCallCheck(this,Elision),_super78.apply(this,arguments)}_inherits(Elision,_Base44);var _super78=_createSuper(Elision);return _createClass(Elision,[{key:\"compileToFragments\",value:function compileToFragments(o,level){var fragment;return fragment=_get(_getPrototypeOf(Elision.prototype),\"compileToFragments\",this).call(this,o,level),fragment.isElision=!0,fragment}},{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\", \")]}},{key:\"asReference\",value:function asReference(){return this}},{key:\"eachName\",value:function eachName(){}},{key:\"astNode\",value:function astNode(){return null}}]),Elision}(Base);return Elision.prototype.isAssignable=YES,Elision.prototype.shouldCache=NO,Elision}.call(this),exports.While=While=function(){var While=function(_Base45){function While(condition1){var _ref54=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},inverted=_ref54.invert,guard=_ref54.guard,isLoop=_ref54.isLoop,_this68;return _classCallCheck(this,While),_this68=_super79.call(this),_this68.condition=condition1,_this68.inverted=inverted,_this68.guard=guard,_this68.isLoop=isLoop,_this68}_inherits(While,_Base45);var _super79=_createSuper(While);return _createClass(While,[{key:\"makeReturn\",value:function makeReturn(results,mark){return results?_get(_getPrototypeOf(While.prototype),\"makeReturn\",this).call(this,results,mark):(this.returns=!this.jumps(),mark?void(this.returns&&this.body.makeReturn(results,mark)):this)}},{key:\"addBody\",value:function addBody(body1){return this.body=body1,this}},{key:\"jumps\",value:function jumps(){var expressions,j,jumpNode,len1,node;if(expressions=this.body.expressions,!expressions.length)return!1;for(j=0,len1=expressions.length;j<len1;j++)if(node=expressions[j],jumpNode=node.jumps({loop:!0}))return jumpNode;return!1}},{key:\"compileNode\",value:function compileNode(o){var answer,body,rvar,set;return o.indent+=TAB,set=\"\",body=this.body,body.isEmpty()?body=this.makeCode(\"\"):(this.returns&&(body.makeReturn(rvar=o.scope.freeVariable(\"results\")),set=\"\".concat(this.tab).concat(rvar,\" = [];\\n\")),this.guard&&(1<body.expressions.length?body.expressions.unshift(new If(new Parens(this.guard).invert(),new StatementLiteral(\"continue\"))):this.guard&&(body=Block.wrap([new If(this.guard,body)]))),body=[].concat(this.makeCode(\"\\n\"),body.compileToFragments(o,LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab)))),answer=[].concat(this.makeCode(set+this.tab+\"while (\"),this.processedCondition().compileToFragments(o,LEVEL_PAREN),this.makeCode(\") {\"),body,this.makeCode(\"}\")),this.returns&&answer.push(this.makeCode(\"\\n\".concat(this.tab,\"return \").concat(rvar,\";\"))),answer}},{key:\"processedCondition\",value:function processedCondition(){return null==this.processedConditionCache?this.processedConditionCache=this.inverted?this.condition.invert():this.condition:this.processedConditionCache}},{key:\"astType\",value:function astType(){return\"WhileStatement\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{test:this.condition.ast(o,LEVEL_PAREN),body:this.body.ast(o,LEVEL_TOP),guard:null==(ref1=null==(ref2=this.guard)?void 0:ref2.ast(o))?null:ref1,inverted:!!this.inverted,postfix:!!this.postfix,loop:!!this.isLoop}}}]),While}(Base);return While.prototype.children=[\"condition\",\"guard\",\"body\"],While.prototype.isStatement=YES,While}.call(this),exports.Op=Op=function(){var Op=function(_Base46){function Op(op,first,second,flip){var _ref55=4<arguments.length&&void 0!==arguments[4]?arguments[4]:{},invertOperator=_ref55.invertOperator,_ref55$originalOperat=_ref55.originalOperator,originalOperator=void 0===_ref55$originalOperat?op:_ref55$originalOperat,_this69;_classCallCheck(this,Op);var call,firstCall,message,ref1,unwrapped;return(_this69=_super80.call(this),_this69.invertOperator=invertOperator,_this69.originalOperator=originalOperator,\"new\"===op)?((firstCall=unwrapped=first.unwrap())instanceof Call||(firstCall=unwrapped.base)instanceof Call)&&!firstCall[\"do\"]&&!firstCall.isNew?_possibleConstructorReturn(_this69,new Value(firstCall.newInstance(),firstCall===unwrapped?[]:unwrapped.properties)):(first instanceof Parens||first.unwrap()instanceof IdentifierLiteral||(\"function\"==typeof first.hasProperties?first.hasProperties():void 0)||(first=new Parens(first)),call=new Call(first,[]),call.locationData=_this69.locationData,call.isNew=!0,_possibleConstructorReturn(_this69,call)):(_this69.operator=CONVERSIONS[op]||op,_this69.first=first,_this69.second=second,_this69.flip=!!flip,(\"--\"===(ref1=_this69.operator)||\"++\"===ref1)&&(message=isUnassignable(_this69.first.unwrapAll().value),message&&_this69.first.error(message)),_possibleConstructorReturn(_this69,_assertThisInitialized(_this69)))}_inherits(Op,_Base46);var _super80=_createSuper(Op);return _createClass(Op,[{key:\"isNumber\",value:function(){var ref1;return this.isUnary()&&(\"+\"===(ref1=this.operator)||\"-\"===ref1)&&this.first instanceof Value&&this.first.isNumber()}},{key:\"isAwait\",value:function isAwait(){return\"await\"===this.operator}},{key:\"isYield\",value:function isYield(){var ref1;return\"yield\"===(ref1=this.operator)||\"yield*\"===ref1}},{key:\"isUnary\",value:function isUnary(){return!this.second}},{key:\"shouldCache\",value:function shouldCache(){return!this.isNumber()}},{key:\"isChainable\",value:function isChainable(){var ref1;return\"<\"===(ref1=this.operator)||\">\"===ref1||\">=\"===ref1||\"<=\"===ref1||\"===\"===ref1||\"!==\"===ref1}},{key:\"isChain\",value:function isChain(){return this.isChainable()&&this.first.isChainable()}},{key:\"invert\",value:function invert(){var allInvertable,curr,fst,op,ref1;if(this.isInOperator())return this.invertOperator=\"!\",this;if(this.isChain()){for(allInvertable=!0,curr=this;curr&&curr.operator;)allInvertable&&(allInvertable=curr.operator in INVERSIONS),curr=curr.first;if(!allInvertable)return new Parens(this).invert();for(curr=this;curr&&curr.operator;)curr.invert=!curr.invert,curr.operator=INVERSIONS[curr.operator],curr=curr.first;return this}return(op=INVERSIONS[this.operator])?(this.operator=op,this.first.unwrap()instanceof Op&&this.first.invert(),this):this.second?new Parens(this).invert():\"!\"===this.operator&&(fst=this.first.unwrap())instanceof Op&&(\"!\"===(ref1=fst.operator)||\"in\"===ref1||\"instanceof\"===ref1)?fst:new Op(\"!\",this)}},{key:\"unfoldSoak\",value:function unfoldSoak(o){var ref1;return(\"++\"===(ref1=this.operator)||\"--\"===ref1||\"delete\"===ref1)&&_unfoldSoak(o,this,\"first\")}},{key:\"generateDo\",value:function generateDo(exp){var call,func,j,len1,param,passedParams,ref,ref1;for(passedParams=[],func=exp instanceof Assign&&(ref=exp.value.unwrap())instanceof Code?ref:exp,ref1=func.params||[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],param.value?(passedParams.push(param.value),delete param.value):passedParams.push(param);return call=new Call(exp,passedParams),call[\"do\"]=!0,call}},{key:\"isInOperator\",value:function isInOperator(){return\"in\"===this.originalOperator}},{key:\"compileNode\",value:function compileNode(o){var answer,inNode,isChain,lhs,rhs;if(this.isInOperator())return inNode=new In(this.first,this.second),(this.invertOperator?inNode.invert():inNode).compileNode(o);if(this.invertOperator)return this.invertOperator=null,this.invert().compileNode(o);if(\"do\"===this.operator)return Op.prototype.generateDo(this.first).compileNode(o);if(isChain=this.isChain(),isChain||(this.first.front=this.front),this.checkDeleteOperand(o),this.isYield()||this.isAwait())return this.compileContinuation(o);if(this.isUnary())return this.compileUnary(o);if(isChain)return this.compileChain(o);switch(this.operator){case\"?\":return this.compileExistence(o,this.second.isDefaultValue);case\"//\":return this.compileFloorDivision(o);case\"%%\":return this.compileModulo(o);default:return lhs=this.first.compileToFragments(o,LEVEL_OP),rhs=this.second.compileToFragments(o,LEVEL_OP),answer=[].concat(lhs,this.makeCode(\" \".concat(this.operator,\" \")),rhs),o.level<=LEVEL_OP?answer:this.wrapInParentheses(answer);}}},{key:\"compileChain\",value:function compileChain(o){var _this$first$second$ca=this.first.second.cache(o),_this$first$second$ca2=_slicedToArray(_this$first$second$ca,2),fragments,fst,shared;return this.first.second=_this$first$second$ca2[0],shared=_this$first$second$ca2[1],fst=this.first.compileToFragments(o,LEVEL_OP),fragments=fst.concat(this.makeCode(\" \".concat(this.invert?\"&&\":\"||\",\" \")),shared.compileToFragments(o),this.makeCode(\" \".concat(this.operator,\" \")),this.second.compileToFragments(o,LEVEL_OP)),this.wrapInParentheses(fragments)}},{key:\"compileExistence\",value:function compileExistence(o,checkOnlyUndefined){var fst,ref;return this.first.shouldCache()?(ref=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),fst=new Parens(new Assign(ref,this.first))):(fst=this.first,ref=fst),new If(new Existence(fst,checkOnlyUndefined),ref,{type:\"if\"}).addElse(this.second).compileToFragments(o)}},{key:\"compileUnary\",value:function compileUnary(o){var op,parts,plusMinus;return(parts=[],op=this.operator,parts.push([this.makeCode(op)]),\"!\"===op&&this.first instanceof Existence)?(this.first.negated=!this.first.negated,this.first.compileToFragments(o)):o.level>=LEVEL_ACCESS?new Parens(this).compileToFragments(o):(plusMinus=\"+\"===op||\"-\"===op,(\"typeof\"===op||\"delete\"===op||plusMinus&&this.first instanceof Op&&this.first.operator===op)&&parts.push([this.makeCode(\" \")]),plusMinus&&this.first instanceof Op&&(this.first=new Parens(this.first)),parts.push(this.first.compileToFragments(o,LEVEL_OP)),this.flip&&parts.reverse(),this.joinFragmentArrays(parts,\"\"))}},{key:\"compileContinuation\",value:function compileContinuation(o){var op,parts,ref1;return parts=[],op=this.operator,this.isAwait()||this.checkContinuation(o),0<=indexOf.call(Object.keys(this.first),\"expression\")&&!(this.first instanceof Throw)?null!=this.first.expression&&parts.push(this.first.expression.compileToFragments(o,LEVEL_OP)):(o.level>=LEVEL_PAREN&&parts.push([this.makeCode(\"(\")]),parts.push([this.makeCode(op)]),\"\"!==(null==(ref1=this.first.base)?void 0:ref1.value)&&parts.push([this.makeCode(\" \")]),parts.push(this.first.compileToFragments(o,LEVEL_OP)),o.level>=LEVEL_PAREN&&parts.push([this.makeCode(\")\")])),this.joinFragmentArrays(parts,\"\")}},{key:\"checkContinuation\",value:function checkContinuation(o){var ref1;if(null==o.scope.parent&&this.error(\"\".concat(this.operator,\" can only occur inside functions\")),(null==(ref1=o.scope.method)?void 0:ref1.bound)&&o.scope.method.isGenerator)return this.error(\"yield cannot occur inside bound (fat arrow) functions\")}},{key:\"compileFloorDivision\",value:function compileFloorDivision(o){var div,floor,second;return floor=new Value(new IdentifierLiteral(\"Math\"),[new Access(new PropertyName(\"floor\"))]),second=this.second.shouldCache()?new Parens(this.second):this.second,div=new Op(\"/\",this.first,second),new Call(floor,[div]).compileToFragments(o)}},{key:\"compileModulo\",value:function compileModulo(o){var mod;return mod=new Value(new Literal(utility(\"modulo\",o))),new Call(mod,[this.first,this.second]).compileToFragments(o)}},{key:\"toString\",value:function toString(idt){return _get(_getPrototypeOf(Op.prototype),\"toString\",this).call(this,idt,this.constructor.name+\" \"+this.operator)}},{key:\"checkDeleteOperand\",value:function checkDeleteOperand(o){if(\"delete\"===this.operator&&o.scope.check(this.first.unwrapAll().value))return this.error(\"delete operand may not be argument or var\")}},{key:\"astNode\",value:function astNode(o){return this.isYield()&&this.checkContinuation(o),this.checkDeleteOperand(o),_get(_getPrototypeOf(Op.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){if(this.isAwait())return\"AwaitExpression\";if(this.isYield())return\"YieldExpression\";if(this.isChain())return\"ChainedComparison\";switch(this.operator){case\"||\":case\"&&\":case\"?\":return\"LogicalExpression\";case\"++\":case\"--\":return\"UpdateExpression\";default:return this.isUnary()?\"UnaryExpression\":\"BinaryExpression\";}}},{key:\"operatorAst\",value:function operatorAst(){return\"\".concat(this.invertOperator?\"\".concat(this.invertOperator,\" \"):\"\").concat(this.originalOperator)}},{key:\"chainAstProperties\",value:function chainAstProperties(o){var currentOp,operand,operands,operators;for(operators=[this.operatorAst()],operands=[this.second],currentOp=this.first;;)if(operators.unshift(currentOp.operatorAst()),operands.unshift(currentOp.second),currentOp=currentOp.first,!currentOp.isChainable()){operands.unshift(currentOp);break}return{operators:operators,operands:function(){var j,len1,results1;for(results1=[],j=0,len1=operands.length;j<len1;j++)operand=operands[j],results1.push(operand.ast(o,LEVEL_OP));return results1}()}}},{key:\"astProperties\",value:function astProperties(o){var argument,firstAst,operatorAst,ref1,secondAst;if(this.isChain())return this.chainAstProperties(o);switch(firstAst=this.first.ast(o,LEVEL_OP),secondAst=null==(ref1=this.second)?void 0:ref1.ast(o,LEVEL_OP),operatorAst=this.operatorAst(),!1){case!this.isUnary():return argument=this.isYield()&&\"\"===this.first.unwrap().value?null:firstAst,this.isAwait()?{argument:argument}:this.isYield()?{argument:argument,delegate:\"yield*\"===this.operator}:{argument:argument,operator:operatorAst,prefix:!this.flip};default:return{left:firstAst,right:secondAst,operator:operatorAst};}}}]),Op}(Base),CONVERSIONS,INVERSIONS;return CONVERSIONS={\"==\":\"===\",\"!=\":\"!==\",of:\"in\",yieldfrom:\"yield*\"},INVERSIONS={\"!==\":\"===\",\"===\":\"!==\"},Op.prototype.children=[\"first\",\"second\"],Op}.call(this),exports.In=In=function(){var In=function(_Base47){function In(object1,array){var _this70;return _classCallCheck(this,In),_this70=_super81.call(this),_this70.object=object1,_this70.array=array,_this70}_inherits(In,_Base47);var _super81=_createSuper(In);return _createClass(In,[{key:\"compileNode\",value:function compileNode(o){var hasSplat,j,len1,obj,ref1;if(this.array instanceof Value&&this.array.isArray()&&this.array.base.objects.length){for(ref1=this.array.base.objects,j=0,len1=ref1.length;j<len1;j++)if(obj=ref1[j],!!(obj instanceof Splat)){hasSplat=!0;break}if(!hasSplat)return this.compileOrTest(o)}return this.compileLoopTest(o)}},{key:\"compileOrTest\",value:function compileOrTest(o){var _this$object$cache=this.object.cache(o,LEVEL_OP),_this$object$cache2=_slicedToArray(_this$object$cache,2),cmp,cnj,i,item,j,len1,ref,ref1,sub,tests;sub=_this$object$cache2[0],ref=_this$object$cache2[1];var _ref56=this.negated?[\" !== \",\" && \"]:[\" === \",\" || \"],_ref57=_slicedToArray(_ref56,2);for(cmp=_ref57[0],cnj=_ref57[1],tests=[],ref1=this.array.base.objects,(i=j=0,len1=ref1.length);j<len1;i=++j)item=ref1[i],i&&tests.push(this.makeCode(cnj)),tests=tests.concat(i?ref:sub,this.makeCode(cmp),item.compileToFragments(o,LEVEL_ACCESS));return o.level<LEVEL_OP?tests:this.wrapInParentheses(tests)}},{key:\"compileLoopTest\",value:function compileLoopTest(o){var _this$object$cache3=this.object.cache(o,LEVEL_LIST),_this$object$cache4=_slicedToArray(_this$object$cache3,2),fragments,ref,sub;return(sub=_this$object$cache4[0],ref=_this$object$cache4[1],fragments=[].concat(this.makeCode(utility(\"indexOf\",o)+\".call(\"),this.array.compileToFragments(o,LEVEL_LIST),this.makeCode(\", \"),ref,this.makeCode(\") \"+(this.negated?\"< 0\":\">= 0\"))),fragmentsToText(sub)===fragmentsToText(ref))?fragments:(fragments=sub.concat(this.makeCode(\", \"),fragments),o.level<LEVEL_LIST?fragments:this.wrapInParentheses(fragments))}},{key:\"toString\",value:function toString(idt){return _get(_getPrototypeOf(In.prototype),\"toString\",this).call(this,idt,this.constructor.name+(this.negated?\"!\":\"\"))}}]),In}(Base);return In.prototype.children=[\"object\",\"array\"],In.prototype.invert=NEGATE,In}.call(this),exports.Try=Try=function(){var Try=function(_Base48){function Try(attempt,_catch,ensure,finallyTag){var _this71;return _classCallCheck(this,Try),_this71=_super82.call(this),_this71.attempt=attempt,_this71[\"catch\"]=_catch,_this71.ensure=ensure,_this71.finallyTag=finallyTag,_this71}_inherits(Try,_Base48);var _super82=_createSuper(Try);return _createClass(Try,[{key:\"jumps\",value:function jumps(o){var ref1;return this.attempt.jumps(o)||(null==(ref1=this[\"catch\"])?void 0:ref1.jumps(o))}},{key:\"makeReturn\",value:function makeReturn(results,mark){var ref1,ref2;return mark?(null!=(ref1=this.attempt)&&ref1.makeReturn(results,mark),void(null!=(ref2=this[\"catch\"])&&ref2.makeReturn(results,mark))):(this.attempt&&(this.attempt=this.attempt.makeReturn(results)),this[\"catch\"]&&(this[\"catch\"]=this[\"catch\"].makeReturn(results)),this)}},{key:\"compileNode\",value:function compileNode(o){var catchPart,ensurePart,generatedErrorVariableName,originalIndent,tryPart;return originalIndent=o.indent,o.indent+=TAB,tryPart=this.attempt.compileToFragments(o,LEVEL_TOP),catchPart=this[\"catch\"]?this[\"catch\"].compileToFragments(merge(o,{indent:originalIndent}),LEVEL_TOP):this.ensure||this[\"catch\"]?[]:(generatedErrorVariableName=o.scope.freeVariable(\"error\",{reserve:!1}),[this.makeCode(\" catch (\".concat(generatedErrorVariableName,\") {}\"))]),ensurePart=this.ensure?[].concat(this.makeCode(\" finally {\\n\"),this.ensure.compileToFragments(o,LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab,\"}\"))):[],[].concat(this.makeCode(\"\".concat(this.tab,\"try {\\n\")),tryPart,this.makeCode(\"\\n\".concat(this.tab,\"}\")),catchPart,ensurePart)}},{key:\"astType\",value:function astType(){return\"TryStatement\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{block:this.attempt.ast(o,LEVEL_TOP),handler:null==(ref1=null==(ref2=this[\"catch\"])?void 0:ref2.ast(o))?null:ref1,finalizer:null==this.ensure?null:Object.assign(this.ensure.ast(o,LEVEL_TOP),mergeAstLocationData(jisonLocationDataToAstLocationData(this.finallyTag.locationData),this.ensure.astLocationData()))}}}]),Try}(Base);return Try.prototype.children=[\"attempt\",\"catch\",\"ensure\"],Try.prototype.isStatement=YES,Try}.call(this),exports.Catch=Catch=function(){var Catch=function(_Base49){function Catch(recovery,errorVariable){var _this72;_classCallCheck(this,Catch);var base1,ref1;return _this72=_super83.call(this),_this72.recovery=recovery,_this72.errorVariable=errorVariable,null!=(ref1=_this72.errorVariable)&&\"function\"==typeof(base1=ref1.unwrap()).propagateLhs&&base1.propagateLhs(!0),_this72}_inherits(Catch,_Base49);var _super83=_createSuper(Catch);return _createClass(Catch,[{key:\"jumps\",value:function jumps(o){return this.recovery.jumps(o)}},{key:\"makeReturn\",value:function makeReturn(results,mark){var ret;if(ret=this.recovery.makeReturn(results,mark),!mark)return this.recovery=ret,this}},{key:\"compileNode\",value:function compileNode(o){var generatedErrorVariableName,placeholder;return o.indent+=TAB,generatedErrorVariableName=o.scope.freeVariable(\"error\",{reserve:!1}),placeholder=new IdentifierLiteral(generatedErrorVariableName),this.checkUnassignable(),this.errorVariable&&this.recovery.unshift(new Assign(this.errorVariable,placeholder)),[].concat(this.makeCode(\" catch (\"),placeholder.compileToFragments(o),this.makeCode(\") {\\n\"),this.recovery.compileToFragments(o,LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab,\"}\")))}},{key:\"checkUnassignable\",value:function checkUnassignable(){var message;if(this.errorVariable&&(message=isUnassignable(this.errorVariable.unwrapAll().value),message))return this.errorVariable.error(message)}},{key:\"astNode\",value:function astNode(o){var ref1;return this.checkUnassignable(),null!=(ref1=this.errorVariable)&&ref1.eachName(function(name){var alreadyDeclared;return alreadyDeclared=o.scope.find(name.value),name.isDeclaration=!alreadyDeclared}),_get(_getPrototypeOf(Catch.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"CatchClause\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{param:null==(ref1=null==(ref2=this.errorVariable)?void 0:ref2.ast(o))?null:ref1,body:this.recovery.ast(o,LEVEL_TOP)}}}]),Catch}(Base);return Catch.prototype.children=[\"recovery\",\"errorVariable\"],Catch.prototype.isStatement=YES,Catch}.call(this),exports.Throw=Throw=function(){var Throw=function(_Base50){function Throw(expression1){var _this73;return _classCallCheck(this,Throw),_this73=_super84.call(this),_this73.expression=expression1,_this73}_inherits(Throw,_Base50);var _super84=_createSuper(Throw);return _createClass(Throw,[{key:\"compileNode\",value:function compileNode(o){var fragments;return fragments=this.expression.compileToFragments(o,LEVEL_LIST),unshiftAfterComments(fragments,this.makeCode(\"throw \")),fragments.unshift(this.makeCode(this.tab)),fragments.push(this.makeCode(\";\")),fragments}},{key:\"astType\",value:function astType(){return\"ThrowStatement\"}},{key:\"astProperties\",value:function astProperties(o){return{argument:this.expression.ast(o,LEVEL_LIST)}}}]),Throw}(Base);return Throw.prototype.children=[\"expression\"],Throw.prototype.isStatement=YES,Throw.prototype.jumps=NO,Throw.prototype.makeReturn=THIS,Throw}.call(this),exports.Existence=Existence=function(){var Existence=function(_Base51){function Existence(expression1){var onlyNotUndefined=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],_this74;_classCallCheck(this,Existence);var salvagedComments;return _this74=_super85.call(this),_this74.expression=expression1,_this74.comparisonTarget=onlyNotUndefined?\"undefined\":\"null\",salvagedComments=[],_this74.expression.traverseChildren(!0,function(child){var comment,j,len1,ref1;if(child.comments){for(ref1=child.comments,j=0,len1=ref1.length;j<len1;j++)comment=ref1[j],0>indexOf.call(salvagedComments,comment)&&salvagedComments.push(comment);return delete child.comments}}),attachCommentsToNode(salvagedComments,_assertThisInitialized(_this74)),moveComments(_this74.expression,_assertThisInitialized(_this74)),_this74}_inherits(Existence,_Base51);var _super85=_createSuper(Existence);return _createClass(Existence,[{key:\"compileNode\",value:function compileNode(o){var cmp,cnj,code;if(this.expression.front=this.front,code=this.expression.compile(o,LEVEL_OP),this.expression.unwrap()instanceof IdentifierLiteral&&!o.scope.check(code)){var _ref58=this.negated?[\"===\",\"||\"]:[\"!==\",\"&&\"],_ref59=_slicedToArray(_ref58,2);cmp=_ref59[0],cnj=_ref59[1],code=\"typeof \".concat(code,\" \").concat(cmp,\" \\\"undefined\\\"\")+(\"undefined\"===this.comparisonTarget?\"\":\" \".concat(cnj,\" \").concat(code,\" \").concat(cmp,\" \").concat(this.comparisonTarget))}else cmp=\"null\"===this.comparisonTarget?this.negated?\"==\":\"!=\":this.negated?\"===\":\"!==\",code=\"\".concat(code,\" \").concat(cmp,\" \").concat(this.comparisonTarget);return[this.makeCode(o.level<=LEVEL_COND?code:\"(\".concat(code,\")\"))]}},{key:\"astType\",value:function astType(){return\"UnaryExpression\"}},{key:\"astProperties\",value:function astProperties(o){return{argument:this.expression.ast(o),operator:\"?\",prefix:!1}}}]),Existence}(Base);return Existence.prototype.children=[\"expression\"],Existence.prototype.invert=NEGATE,Existence}.call(this),exports.Parens=Parens=function(){var Parens=function(_Base52){function Parens(body1){var _this75;return _classCallCheck(this,Parens),_this75=_super86.call(this),_this75.body=body1,_this75}_inherits(Parens,_Base52);var _super86=_createSuper(Parens);return _createClass(Parens,[{key:\"unwrap\",value:function unwrap(){return this.body}},{key:\"shouldCache\",value:function shouldCache(){return this.body.shouldCache()}},{key:\"compileNode\",value:function compileNode(o){var bare,expr,fragments,ref1,shouldWrapComment;return(expr=this.body.unwrap(),shouldWrapComment=null==(ref1=expr.comments)?void 0:ref1.some(function(comment){return comment.here&&!comment.unshift&&!comment.newLine}),expr instanceof Value&&expr.isAtomic()&&!this.jsxAttribute&&!shouldWrapComment)?(expr.front=this.front,expr.compileToFragments(o)):(fragments=expr.compileToFragments(o,LEVEL_PAREN),bare=o.level<LEVEL_OP&&!shouldWrapComment&&(expr instanceof Op&&!expr.isInOperator()||expr.unwrap()instanceof Call||expr instanceof For&&expr.returns)&&(o.level<LEVEL_COND||3>=fragments.length),this.jsxAttribute?this.wrapInBraces(fragments):bare?fragments:this.wrapInParentheses(fragments))}},{key:\"astNode\",value:function astNode(o){return this.body.unwrap().ast(o,LEVEL_PAREN)}}]),Parens}(Base);return Parens.prototype.children=[\"body\"],Parens}.call(this),exports.StringWithInterpolations=StringWithInterpolations=function(){var StringWithInterpolations=function(_Base53){function StringWithInterpolations(body1){var _ref60=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},quote=_ref60.quote,startQuote=_ref60.startQuote,jsxAttribute=_ref60.jsxAttribute,_this76;return _classCallCheck(this,StringWithInterpolations),_this76=_super87.call(this),_this76.body=body1,_this76.quote=quote,_this76.startQuote=startQuote,_this76.jsxAttribute=jsxAttribute,_this76}_inherits(StringWithInterpolations,_Base53);var _super87=_createSuper(StringWithInterpolations);return _createClass(StringWithInterpolations,[{key:\"unwrap\",value:function unwrap(){return this}},{key:\"shouldCache\",value:function shouldCache(){return this.body.shouldCache()}},{key:\"extractElements\",value:function extractElements(o){var _ref61=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},includeInterpolationWrappers=_ref61.includeInterpolationWrappers,isJsx=_ref61.isJsx,elements,expr,salvagedComments;return expr=this.body.unwrap(),elements=[],salvagedComments=[],expr.traverseChildren(!1,function(node){var comment,commentPlaceholder,empty,j,k,len1,len2,ref1,ref2,ref3,unwrapped;if(node instanceof StringLiteral){if(node.comments){var _salvagedComments;(_salvagedComments=salvagedComments).push.apply(_salvagedComments,_toConsumableArray(node.comments)),delete node.comments}return elements.push(node),!0}if(node instanceof Interpolation){if(0!==salvagedComments.length){for(j=0,len1=salvagedComments.length;j<len1;j++)comment=salvagedComments[j],comment.unshift=!0,comment.newLine=!0;attachCommentsToNode(salvagedComments,node)}if((unwrapped=null==(ref1=node.expression)?void 0:ref1.unwrapAll())instanceof PassthroughLiteral&&unwrapped.generated&&!(isJsx&&o.compiling)){if(o.compiling){if(commentPlaceholder=new StringLiteral(\"\").withLocationDataFrom(node),commentPlaceholder.comments=unwrapped.comments,node.comments){var _ref62;(_ref62=null==commentPlaceholder.comments?commentPlaceholder.comments=[]:commentPlaceholder.comments).push.apply(_ref62,_toConsumableArray(node.comments))}elements.push(new Value(commentPlaceholder))}else empty=new Interpolation().withLocationDataFrom(node),empty.comments=node.comments,elements.push(empty);}else if(node.expression||includeInterpolationWrappers){if(node.comments){var _ref63;(_ref63=null==(ref2=node.expression)?void 0:null==ref2.comments?ref2.comments=[]:ref2.comments).push.apply(_ref63,_toConsumableArray(node.comments))}elements.push(includeInterpolationWrappers?node:node.expression)}return!1}if(node.comments){if(0!==elements.length&&!(elements[elements.length-1]instanceof StringLiteral)){for(ref3=node.comments,k=0,len2=ref3.length;k<len2;k++)comment=ref3[k],comment.unshift=!1,comment.newLine=!0;attachCommentsToNode(node.comments,elements[elements.length-1])}else{var _salvagedComments2;(_salvagedComments2=salvagedComments).push.apply(_salvagedComments2,_toConsumableArray(node.comments))}delete node.comments}return!0}),elements}},{key:\"compileNode\",value:function compileNode(o){var code,element,elements,fragments,j,len1,ref1,unquotedElementValue,wrapped;if(null==this.comments&&(this.comments=null==(ref1=this.startQuote)?void 0:ref1.comments),this.jsxAttribute)return wrapped=new Parens(new StringWithInterpolations(this.body)),wrapped.jsxAttribute=!0,wrapped.compileNode(o);for(elements=this.extractElements(o,{isJsx:this.jsx}),fragments=[],this.jsx||fragments.push(this.makeCode(\"`\")),(j=0,len1=elements.length);j<len1;j++)if(element=elements[j],element instanceof StringLiteral)unquotedElementValue=this.jsx?element.unquotedValueForJSX:element.unquotedValueForTemplateLiteral,fragments.push(this.makeCode(unquotedElementValue));else{var _fragments12;this.jsx||fragments.push(this.makeCode(\"$\")),code=element.compileToFragments(o,LEVEL_PAREN),(!this.isNestedTag(element)||code.some(function(fragment){var ref2;return null==(ref2=fragment.comments)?void 0:ref2.some(function(comment){return!1===comment.here})}))&&(code=this.wrapInBraces(code),code[0].isStringWithInterpolations=!0,code[code.length-1].isStringWithInterpolations=!0),(_fragments12=fragments).push.apply(_fragments12,_toConsumableArray(code))}return this.jsx||fragments.push(this.makeCode(\"`\")),fragments}},{key:\"isNestedTag\",value:function isNestedTag(element){var call;return call=\"function\"==typeof element.unwrapAll?element.unwrapAll():void 0,this.jsx&&call instanceof JSXElement}},{key:\"astType\",value:function astType(){return\"TemplateLiteral\"}},{key:\"astProperties\",value:function astProperties(o){var element,elements,emptyInterpolation,expression,expressions,index,j,last,len1,node,quasis;elements=this.extractElements(o,{includeInterpolationWrappers:!0});var _slice1$call17=slice1.call(elements,-1),_slice1$call18=_slicedToArray(_slice1$call17,1);for(last=_slice1$call18[0],quasis=[],expressions=[],(index=j=0,len1=elements.length);j<len1;index=++j)if(element=elements[index],element instanceof StringLiteral)quasis.push(new TemplateElement(element.originalValue,{tail:element===last}).withLocationDataFrom(element).ast(o));else{var _element2=element;expression=_element2.expression,node=null==expression?(emptyInterpolation=new EmptyInterpolation,emptyInterpolation.locationData=emptyExpressionLocationData({interpolationNode:element,openingBrace:\"#{\",closingBrace:\"}\"}),emptyInterpolation):expression.unwrapAll(),expressions.push(astAsBlockIfNeeded(node,o))}return{expressions:expressions,quasis:quasis,quote:this.quote}}}],[{key:\"fromStringLiteral\",value:function fromStringLiteral(stringLiteral){var updatedString,updatedStringValue;return updatedString=stringLiteral.withoutQuotesInLocationData(),updatedStringValue=new Value(updatedString).withLocationDataFrom(updatedString),new StringWithInterpolations(Block.wrap([updatedStringValue]),{quote:stringLiteral.quote,jsxAttribute:stringLiteral.jsxAttribute}).withLocationDataFrom(stringLiteral)}}]),StringWithInterpolations}(Base);return StringWithInterpolations.prototype.children=[\"body\"],StringWithInterpolations}.call(this),exports.TemplateElement=TemplateElement=function(_Base54){function TemplateElement(value1){var _ref64=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},tail1=_ref64.tail,_this77;return _classCallCheck(this,TemplateElement),_this77=_super88.call(this),_this77.value=value1,_this77.tail=tail1,_this77}_inherits(TemplateElement,_Base54);var _super88=_createSuper(TemplateElement);return _createClass(TemplateElement,[{key:\"astProperties\",value:function astProperties(){return{value:{raw:this.value},tail:!!this.tail}}}]),TemplateElement}(Base),exports.Interpolation=Interpolation=function(){var Interpolation=function(_Base55){function Interpolation(expression1){var _this78;return _classCallCheck(this,Interpolation),_this78=_super89.call(this),_this78.expression=expression1,_this78}_inherits(Interpolation,_Base55);var _super89=_createSuper(Interpolation);return _createClass(Interpolation)}(Base);return Interpolation.prototype.children=[\"expression\"],Interpolation}.call(this),exports.EmptyInterpolation=EmptyInterpolation=function(_Base56){function EmptyInterpolation(){return _classCallCheck(this,EmptyInterpolation),_super90.call(this)}_inherits(EmptyInterpolation,_Base56);var _super90=_createSuper(EmptyInterpolation);return _createClass(EmptyInterpolation)}(Base),exports.For=For=function(){var For=function(_While){function For(body,source){var _this79;return _classCallCheck(this,For),_this79=_super91.call(this),_this79.addBody(body),_this79.addSource(source),_this79}_inherits(For,_While);var _super91=_createSuper(For);return _createClass(For,[{key:\"isAwait\",value:function isAwait(){var ref1;return null!=(ref1=this[\"await\"])&&ref1}},{key:\"addBody\",value:function addBody(body){var base1,expressions;return this.body=Block.wrap([body]),expressions=this.body.expressions,expressions.length&&null==(base1=this.body).locationData&&(base1.locationData=mergeLocationData(expressions[0].locationData,expressions[expressions.length-1].locationData)),this}},{key:\"addSource\",value:function addSource(source){var _this80=this,_source$source=source.source,attr,attribs,attribute,base1,j,k,len1,len2,ref1,ref2,ref3,ref4;for(this.source=void 0!==_source$source&&_source$source,attribs=[\"name\",\"index\",\"guard\",\"step\",\"own\",\"ownTag\",\"await\",\"awaitTag\",\"object\",\"from\"],(j=0,len1=attribs.length);j<len1;j++)attr=attribs[j],this[attr]=null==(ref1=source[attr])?this[attr]:ref1;if(!this.source)return this;if(this.from&&this.index&&this.index.error(\"cannot use index with for-from\"),this.own&&!this.object&&this.ownTag.error(\"cannot use own with for-\".concat(this.from?\"from\":\"in\")),this.object){var _ref65=[this.index,this.name];this.name=_ref65[0],this.index=_ref65[1]}for(((null==(ref2=this.index)?void 0:\"function\"==typeof ref2.isArray?ref2.isArray():void 0)||(null==(ref3=this.index)?void 0:\"function\"==typeof ref3.isObject?ref3.isObject():void 0))&&this.index.error(\"index cannot be a pattern matching expression\"),this[\"await\"]&&!this.from&&this.awaitTag.error(\"await must be used with for-from\"),this.range=this.source instanceof Value&&this.source.base instanceof Range&&!this.source.properties.length&&!this.from,this.pattern=this.name instanceof Value,this.pattern&&\"function\"==typeof(base1=this.name.unwrap()).propagateLhs&&base1.propagateLhs(!0),this.range&&this.index&&this.index.error(\"indexes do not apply to range loops\"),this.range&&this.pattern&&this.name.error(\"cannot pattern match over range loops\"),this.returns=!1,ref4=[\"source\",\"guard\",\"step\",\"name\",\"index\"],(k=0,len2=ref4.length);k<len2;k++)(attribute=ref4[k],!!this[attribute])&&(this[attribute].traverseChildren(!0,function(node){var comment,l,len3,ref5;if(node.comments){for(ref5=node.comments,l=0,len3=ref5.length;l<len3;l++)comment=ref5[l],comment.newLine=comment.unshift=!0;return moveComments(node,_this80[attribute])}}),moveComments(this[attribute],this));return this}},{key:\"compileNode\",value:function compileNode(o){var _slice1$call19,_slice1$call20,body,bodyFragments,compare,compareDown,declare,declareDown,defPart,down,forClose,forCode,forPartFragments,fragments,guardPart,idt1,increment,index,ivar,kvar,kvarAssign,last,lvar,name,namePart,ref,ref1,resultPart,returnResult,rvar,scope,source,step,stepNum,stepVar,svar,varPart;if(body=Block.wrap([this.body]),ref1=body.expressions,_slice1$call19=slice1.call(ref1,-1),_slice1$call20=_slicedToArray(_slice1$call19,1),last=_slice1$call20[0],_slice1$call19,(null==last?void 0:last.jumps())instanceof Return&&(this.returns=!1),source=this.range?this.source.base:this.source,scope=o.scope,this.pattern||(name=this.name&&this.name.compile(o,LEVEL_LIST)),index=this.index&&this.index.compile(o,LEVEL_LIST),name&&!this.pattern&&scope.find(name),index&&!(this.index instanceof Value)&&scope.find(index),this.returns&&(rvar=scope.freeVariable(\"results\")),this.from?this.pattern&&(ivar=scope.freeVariable(\"x\",{single:!0})):ivar=this.object&&index||scope.freeVariable(\"i\",{single:!0}),kvar=(this.range||this.from)&&name||index||ivar,kvarAssign=kvar===ivar?\"\":\"\".concat(kvar,\" = \"),this.step&&!this.range){var _this$cacheToCodeFrag9=this.cacheToCodeFragments(this.step.cache(o,LEVEL_LIST,shouldCacheOrIsAssignable)),_this$cacheToCodeFrag10=_slicedToArray(_this$cacheToCodeFrag9,2);step=_this$cacheToCodeFrag10[0],stepVar=_this$cacheToCodeFrag10[1],this.step.isNumber()&&(stepNum=parseNumber(stepVar))}return this.pattern&&(name=ivar),varPart=\"\",guardPart=\"\",defPart=\"\",idt1=this.tab+TAB,this.range?forPartFragments=source.compileToFragments(merge(o,{index:ivar,name:name,step:this.step,shouldCache:shouldCacheOrIsAssignable})):(svar=this.source.compile(o,LEVEL_LIST),(name||this.own)&&!this.from&&!(this.source.unwrap()instanceof IdentifierLiteral)&&(defPart+=\"\".concat(this.tab).concat(ref=scope.freeVariable(\"ref\"),\" = \").concat(svar,\";\\n\"),svar=ref),name&&!this.pattern&&!this.from&&(namePart=\"\".concat(name,\" = \").concat(svar,\"[\").concat(kvar,\"]\")),!this.object&&!this.from&&(step!==stepVar&&(defPart+=\"\".concat(this.tab).concat(step,\";\\n\")),down=0>stepNum,!(this.step&&null!=stepNum&&down)&&(lvar=scope.freeVariable(\"len\")),declare=\"\".concat(kvarAssign).concat(ivar,\" = 0, \").concat(lvar,\" = \").concat(svar,\".length\"),declareDown=\"\".concat(kvarAssign).concat(ivar,\" = \").concat(svar,\".length - 1\"),compare=\"\".concat(ivar,\" < \").concat(lvar),compareDown=\"\".concat(ivar,\" >= 0\"),this.step?(null==stepNum?(compare=\"\".concat(stepVar,\" > 0 ? \").concat(compare,\" : \").concat(compareDown),declare=\"(\".concat(stepVar,\" > 0 ? (\").concat(declare,\") : \").concat(declareDown,\")\")):down&&(compare=compareDown,declare=declareDown),increment=\"\".concat(ivar,\" += \").concat(stepVar)):increment=\"\".concat(kvar===ivar?\"\".concat(ivar,\"++\"):\"++\".concat(ivar)),forPartFragments=[this.makeCode(\"\".concat(declare,\"; \").concat(compare,\"; \").concat(kvarAssign).concat(increment))])),this.returns&&(resultPart=\"\".concat(this.tab).concat(rvar,\" = [];\\n\"),returnResult=\"\\n\".concat(this.tab,\"return \").concat(rvar,\";\"),body.makeReturn(rvar)),this.guard&&(1<body.expressions.length?body.expressions.unshift(new If(new Parens(this.guard).invert(),new StatementLiteral(\"continue\"))):this.guard&&(body=Block.wrap([new If(this.guard,body)]))),this.pattern&&body.expressions.unshift(new Assign(this.name,this.from?new IdentifierLiteral(kvar):new Literal(\"\".concat(svar,\"[\").concat(kvar,\"]\")))),namePart&&(varPart=\"\\n\".concat(idt1).concat(namePart,\";\")),this.object?(forPartFragments=[this.makeCode(\"\".concat(kvar,\" in \").concat(svar))],this.own&&(guardPart=\"\\n\".concat(idt1,\"if (!\").concat(utility(\"hasProp\",o),\".call(\").concat(svar,\", \").concat(kvar,\")) continue;\"))):this.from&&(this[\"await\"]?(forPartFragments=new Op(\"await\",new Parens(new Literal(\"\".concat(kvar,\" of \").concat(svar)))),forPartFragments=forPartFragments.compileToFragments(o,LEVEL_TOP)):forPartFragments=[this.makeCode(\"\".concat(kvar,\" of \").concat(svar))]),bodyFragments=body.compileToFragments(merge(o,{indent:idt1}),LEVEL_TOP),bodyFragments&&0<bodyFragments.length&&(bodyFragments=[].concat(this.makeCode(\"\\n\"),bodyFragments,this.makeCode(\"\\n\"))),fragments=[this.makeCode(defPart)],resultPart&&fragments.push(this.makeCode(resultPart)),forCode=this[\"await\"]?\"for \":\"for (\",forClose=this[\"await\"]?\"\":\")\",fragments=fragments.concat(this.makeCode(this.tab),this.makeCode(forCode),forPartFragments,this.makeCode(\"\".concat(forClose,\" {\").concat(guardPart).concat(varPart)),bodyFragments,this.makeCode(this.tab),this.makeCode(\"}\")),returnResult&&fragments.push(this.makeCode(returnResult)),fragments}},{key:\"astNode\",value:function astNode(o){var addToScope,ref1,ref2;return addToScope=function(name){var alreadyDeclared;return alreadyDeclared=o.scope.find(name.value),name.isDeclaration=!alreadyDeclared},null!=(ref1=this.name)&&ref1.eachName(addToScope,{checkAssignability:!1}),null!=(ref2=this.index)&&ref2.eachName(addToScope,{checkAssignability:!1}),_get(_getPrototypeOf(For.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"For\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4,ref5,ref6,ref7,ref8,ref9;return{source:null==(ref1=this.source)?void 0:ref1.ast(o),body:this.body.ast(o,LEVEL_TOP),guard:null==(ref2=null==(ref3=this.guard)?void 0:ref3.ast(o))?null:ref2,name:null==(ref4=null==(ref5=this.name)?void 0:ref5.ast(o))?null:ref4,index:null==(ref6=null==(ref7=this.index)?void 0:ref7.ast(o))?null:ref6,step:null==(ref8=null==(ref9=this.step)?void 0:ref9.ast(o))?null:ref8,postfix:!!this.postfix,own:!!this.own,await:!!this[\"await\"],style:function(){switch(!1){case!this.from:return\"from\";case!this.object:return\"of\";case!this.name:return\"in\";default:return\"range\";}}.call(this)}}}]),For}(While);return For.prototype.children=[\"body\",\"source\",\"guard\",\"step\"],For}.call(this),exports.Switch=Switch=function(){var Switch=function(_Base57){function Switch(subject,cases1,otherwise){var _this81;return _classCallCheck(this,Switch),_this81=_super92.call(this),_this81.subject=subject,_this81.cases=cases1,_this81.otherwise=otherwise,_this81}_inherits(Switch,_Base57);var _super92=_createSuper(Switch);return _createClass(Switch,[{key:\"jumps\",value:function jumps(){var o=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{block:!0},block,j,jumpNode,len1,ref1,ref2;for(ref1=this.cases,j=0,len1=ref1.length;j<len1;j++)if(block=ref1[j].block,jumpNode=block.jumps(o))return jumpNode;return null==(ref2=this.otherwise)?void 0:ref2.jumps(o)}},{key:\"makeReturn\",value:function makeReturn(results,mark){var block,j,len1,ref1,ref2;for(ref1=this.cases,j=0,len1=ref1.length;j<len1;j++)block=ref1[j].block,block.makeReturn(results,mark);return results&&(this.otherwise||(this.otherwise=new Block([new Literal(\"void 0\")]))),null!=(ref2=this.otherwise)&&ref2.makeReturn(results,mark),this}},{key:\"compileNode\",value:function compileNode(o){var block,body,cond,conditions,expr,fragments,i,idt1,idt2,j,k,len1,len2,ref1,ref2;for(idt1=o.indent+TAB,idt2=o.indent=idt1+TAB,fragments=[].concat(this.makeCode(this.tab+\"switch (\"),this.subject?this.subject.compileToFragments(o,LEVEL_PAREN):this.makeCode(\"false\"),this.makeCode(\") {\\n\")),ref1=this.cases,(i=j=0,len1=ref1.length);j<len1;i=++j){var _ref1$i=ref1[i];for(conditions=_ref1$i.conditions,block=_ref1$i.block,ref2=flatten([conditions]),(k=0,len2=ref2.length);k<len2;k++)cond=ref2[k],this.subject||(cond=cond.invert()),fragments=fragments.concat(this.makeCode(idt1+\"case \"),cond.compileToFragments(o,LEVEL_PAREN),this.makeCode(\":\\n\"));if(0<(body=block.compileToFragments(o,LEVEL_TOP)).length&&(fragments=fragments.concat(body,this.makeCode(\"\\n\"))),i===this.cases.length-1&&!this.otherwise)break;(expr=this.lastNode(block.expressions),!(expr instanceof Return||expr instanceof Throw||expr instanceof Literal&&expr.jumps()&&\"debugger\"!==expr.value))&&fragments.push(cond.makeCode(idt2+\"break;\\n\"))}if(this.otherwise&&this.otherwise.expressions.length){var _fragments13;(_fragments13=fragments).push.apply(_fragments13,[this.makeCode(idt1+\"default:\\n\")].concat(_toConsumableArray(this.otherwise.compileToFragments(o,LEVEL_TOP)),[this.makeCode(\"\\n\")]))}return fragments.push(this.makeCode(this.tab+\"}\")),fragments}},{key:\"astType\",value:function astType(){return\"SwitchStatement\"}},{key:\"casesAst\",value:function casesAst(o){var caseIndex,caseLocationData,cases,consequent,j,k,kase,l,lastTestIndex,len1,len2,len3,ref1,ref2,results1,test,testConsequent,testIndex,tests;for(cases=[],ref1=this.cases,(caseIndex=j=0,len1=ref1.length);j<len1;caseIndex=++j){kase=ref1[caseIndex];var _kase=kase;for(tests=_kase.conditions,consequent=_kase.block,tests=flatten([tests]),lastTestIndex=tests.length-1,(testIndex=k=0,len2=tests.length);k<len2;testIndex=++k)test=tests[testIndex],testConsequent=testIndex===lastTestIndex?consequent:null,caseLocationData=test.locationData,(null==testConsequent?void 0:testConsequent.expressions.length)&&(caseLocationData=mergeLocationData(caseLocationData,testConsequent.expressions[testConsequent.expressions.length-1].locationData)),0===testIndex&&(caseLocationData=mergeLocationData(caseLocationData,kase.locationData,{justLeading:!0})),testIndex===lastTestIndex&&(caseLocationData=mergeLocationData(caseLocationData,kase.locationData,{justEnding:!0})),cases.push(new SwitchCase(test,testConsequent,{trailing:testIndex===lastTestIndex}).withLocationDataFrom({locationData:caseLocationData}))}for((null==(ref2=this.otherwise)?void 0:ref2.expressions.length)&&cases.push(new SwitchCase(null,this.otherwise).withLocationDataFrom(this.otherwise)),results1=[],(l=0,len3=cases.length);l<len3;l++)kase=cases[l],results1.push(kase.ast(o));return results1}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{discriminant:null==(ref1=null==(ref2=this.subject)?void 0:ref2.ast(o,LEVEL_PAREN))?null:ref1,cases:this.casesAst(o)}}}]),Switch}(Base);return Switch.prototype.children=[\"subject\",\"cases\",\"otherwise\"],Switch.prototype.isStatement=YES,Switch}.call(this),SwitchCase=function(){var SwitchCase=function(_Base58){function SwitchCase(test1,block1){var _ref66=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},trailing=_ref66.trailing,_this82;return _classCallCheck(this,SwitchCase),_this82=_super93.call(this),_this82.test=test1,_this82.block=block1,_this82.trailing=trailing,_this82}_inherits(SwitchCase,_Base58);var _super93=_createSuper(SwitchCase);return _createClass(SwitchCase,[{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{test:null==(ref1=null==(ref2=this.test)?void 0:ref2.ast(o,LEVEL_PAREN))?null:ref1,consequent:null==(ref3=null==(ref4=this.block)?void 0:ref4.ast(o,LEVEL_TOP).body)?[]:ref3,trailing:!!this.trailing}}}]),SwitchCase}(Base);return SwitchCase.prototype.children=[\"test\",\"block\"],SwitchCase}.call(this),exports.SwitchWhen=SwitchWhen=function(){var SwitchWhen=function(_Base59){function SwitchWhen(conditions1,block1){var _this83;return _classCallCheck(this,SwitchWhen),_this83=_super94.call(this),_this83.conditions=conditions1,_this83.block=block1,_this83}_inherits(SwitchWhen,_Base59);var _super94=_createSuper(SwitchWhen);return _createClass(SwitchWhen)}(Base);return SwitchWhen.prototype.children=[\"conditions\",\"block\"],SwitchWhen}.call(this),exports.If=If=function(){var If=function(_Base60){function If(condition1,body1){var options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_this84;return _classCallCheck(this,If),_this84=_super95.call(this),_this84.condition=condition1,_this84.body=body1,_this84.elseBody=null,_this84.isChain=!1,_this84.soak=options.soak,_this84.postfix=options.postfix,_this84.type=options.type,_this84.condition.comments&&moveComments(_this84.condition,_assertThisInitialized(_this84)),_this84}_inherits(If,_Base60);var _super95=_createSuper(If);return _createClass(If,[{key:\"bodyNode\",value:function bodyNode(){var ref1;return null==(ref1=this.body)?void 0:ref1.unwrap()}},{key:\"elseBodyNode\",value:function elseBodyNode(){var ref1;return null==(ref1=this.elseBody)?void 0:ref1.unwrap()}},{key:\"addElse\",value:function addElse(elseBody){return this.isChain?(this.elseBodyNode().addElse(elseBody),this.locationData=mergeLocationData(this.locationData,this.elseBodyNode().locationData)):(this.isChain=elseBody instanceof If,this.elseBody=this.ensureBlock(elseBody),this.elseBody.updateLocationDataIfMissing(elseBody.locationData),null!=this.locationData&&null!=this.elseBody.locationData&&(this.locationData=mergeLocationData(this.locationData,this.elseBody.locationData))),this}},{key:\"isStatement\",value:function isStatement(o){var ref1;return(null==o?void 0:o.level)===LEVEL_TOP||this.bodyNode().isStatement(o)||(null==(ref1=this.elseBodyNode())?void 0:ref1.isStatement(o))}},{key:\"jumps\",value:function jumps(o){var ref1;return this.body.jumps(o)||(null==(ref1=this.elseBody)?void 0:ref1.jumps(o))}},{key:\"compileNode\",value:function compileNode(o){return this.isStatement(o)?this.compileStatement(o):this.compileExpression(o)}},{key:\"makeReturn\",value:function makeReturn(results,mark){var ref1,ref2;return mark?(null!=(ref1=this.body)&&ref1.makeReturn(results,mark),void(null!=(ref2=this.elseBody)&&ref2.makeReturn(results,mark))):(results&&(this.elseBody||(this.elseBody=new Block([new Literal(\"void 0\")]))),this.body&&(this.body=new Block([this.body.makeReturn(results)])),this.elseBody&&(this.elseBody=new Block([this.elseBody.makeReturn(results)])),this)}},{key:\"ensureBlock\",value:function ensureBlock(node){return node instanceof Block?node:new Block([node])}},{key:\"compileStatement\",value:function compileStatement(o){var answer,body,child,cond,exeq,ifPart,indent;return(child=del(o,\"chainChild\"),exeq=del(o,\"isExistentialEquals\"),exeq)?new If(this.processedCondition().invert(),this.elseBodyNode(),{type:\"if\"}).compileToFragments(o):(indent=o.indent+TAB,cond=this.processedCondition().compileToFragments(o,LEVEL_PAREN),body=this.ensureBlock(this.body).compileToFragments(merge(o,{indent:indent})),ifPart=[].concat(this.makeCode(\"if (\"),cond,this.makeCode(\") {\\n\"),body,this.makeCode(\"\\n\".concat(this.tab,\"}\"))),child||ifPart.unshift(this.makeCode(this.tab)),!this.elseBody)?ifPart:(answer=ifPart.concat(this.makeCode(\" else \")),this.isChain?(o.chainChild=!0,answer=answer.concat(this.elseBody.unwrap().compileToFragments(o,LEVEL_TOP))):answer=answer.concat(this.makeCode(\"{\\n\"),this.elseBody.compileToFragments(merge(o,{indent:indent}),LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab,\"}\"))),answer)}},{key:\"compileExpression\",value:function compileExpression(o){var alt,body,cond,fragments;return cond=this.processedCondition().compileToFragments(o,LEVEL_COND),body=this.bodyNode().compileToFragments(o,LEVEL_LIST),alt=this.elseBodyNode()?this.elseBodyNode().compileToFragments(o,LEVEL_LIST):[this.makeCode(\"void 0\")],fragments=cond.concat(this.makeCode(\" ? \"),body,this.makeCode(\" : \"),alt),o.level>=LEVEL_COND?this.wrapInParentheses(fragments):fragments}},{key:\"unfoldSoak\",value:function unfoldSoak(){return this.soak&&this}},{key:\"processedCondition\",value:function processedCondition(){return null==this.processedConditionCache?this.processedConditionCache=\"unless\"===this.type?this.condition.invert():this.condition:this.processedConditionCache}},{key:\"isStatementAst\",value:function isStatementAst(o){return o.level===LEVEL_TOP}},{key:\"astType\",value:function astType(o){return this.isStatementAst(o)?\"IfStatement\":\"ConditionalExpression\"}},{key:\"astProperties\",value:function astProperties(o){var isStatement,ref1,ref2,ref3,ref4;return isStatement=this.isStatementAst(o),{test:this.condition.ast(o,isStatement?LEVEL_PAREN:LEVEL_COND),consequent:isStatement?this.body.ast(o,LEVEL_TOP):this.bodyNode().ast(o,LEVEL_TOP),alternate:this.isChain?this.elseBody.unwrap().ast(o,isStatement?LEVEL_TOP:LEVEL_COND):isStatement||1!==(null==(ref1=this.elseBody)||null==(ref2=ref1.expressions)?void 0:ref2.length)?null==(ref3=null==(ref4=this.elseBody)?void 0:ref4.ast(o,LEVEL_TOP))?null:ref3:this.elseBody.expressions[0].ast(o,LEVEL_TOP),postfix:!!this.postfix,inverted:\"unless\"===this.type}}}]),If}(Base);return If.prototype.children=[\"condition\",\"body\",\"elseBody\"],If}.call(this),exports.Sequence=Sequence=function(){var Sequence=function(_Base61){function Sequence(expressions1){var _this85;return _classCallCheck(this,Sequence),_this85=_super96.call(this),_this85.expressions=expressions1,_this85}_inherits(Sequence,_Base61);var _super96=_createSuper(Sequence);return _createClass(Sequence,[{key:\"astNode\",value:function astNode(o){return 1===this.expressions.length?this.expressions[0].ast(o):_get(_getPrototypeOf(Sequence.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"SequenceExpression\"}},{key:\"astProperties\",value:function astProperties(o){var expression;return{expressions:function(){var j,len1,ref1,results1;for(ref1=this.expressions,results1=[],(j=0,len1=ref1.length);j<len1;j++)expression=ref1[j],results1.push(expression.ast(o));return results1}.call(this)}}}]),Sequence}(Base);return Sequence.prototype.children=[\"expressions\"],Sequence}.call(this),UTILITIES={modulo:function modulo(){return\"function(a, b) { return (+a % (b = +b) + b) % b; }\"},boundMethodCheck:function boundMethodCheck(){return\"function(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new Error('Bound instance method accessed before binding'); } }\"},hasProp:function hasProp(){return\"{}.hasOwnProperty\"},indexOf:function(){return\"[].indexOf\"},slice:function slice(){return\"[].slice\"},splice:function(){return\"[].splice\"}},LEVEL_TOP=1,LEVEL_PAREN=2,LEVEL_LIST=3,LEVEL_COND=4,LEVEL_OP=5,LEVEL_ACCESS=6,TAB=\"  \",SIMPLENUM=/^[+-]?\\d+(?:_\\d+)*$/,SIMPLE_STRING_OMIT=/\\s*\\n\\s*/g,LEADING_BLANK_LINE=/^[^\\n\\S]*\\n/,TRAILING_BLANK_LINE=/\\n[^\\n\\S]*$/,STRING_OMIT=/((?:\\\\\\\\)+)|\\\\[^\\S\\n]*\\n\\s*/g,HEREGEX_OMIT=/((?:\\\\\\\\)+)|\\\\(\\s)|\\s+(?:#.*)?/g,utility=function(name,o){var ref,root;return root=o.scope.root,name in root.utilities?root.utilities[name]:(ref=root.freeVariable(name),root.assign(ref,UTILITIES[name](o)),root.utilities[name]=ref)},multident=function(code,tab){var includingFirstLine=!(2<arguments.length&&void 0!==arguments[2])||arguments[2],endsWithNewLine;return endsWithNewLine=\"\\n\"===code[code.length-1],code=(includingFirstLine?tab:\"\")+code.replace(/\\n/g,\"$&\".concat(tab)),code=code.replace(/\\s+$/,\"\"),endsWithNewLine&&(code+=\"\\n\"),code},indentInitial=function(fragments,node){var fragment,fragmentIndex,j,len1;for(fragmentIndex=j=0,len1=fragments.length;j<len1;fragmentIndex=++j)if(fragment=fragments[fragmentIndex],fragment.isHereComment)fragment.code=multident(fragment.code,node.tab);else{fragments.splice(fragmentIndex,0,node.makeCode(\"\".concat(node.tab)));break}return fragments},hasLineComments=function(node){var comment,j,len1,ref1;if(!node.comments)return!1;for(ref1=node.comments,j=0,len1=ref1.length;j<len1;j++)if(comment=ref1[j],!1===comment.here)return!0;return!1},moveComments=function(from,to){if(null!=from&&from.comments)return attachCommentsToNode(from.comments,to),delete from.comments},unshiftAfterComments=function(fragments,fragmentToInsert){var fragment,fragmentIndex,inserted,j,len1;for(inserted=!1,fragmentIndex=j=0,len1=fragments.length;j<len1;fragmentIndex=++j)if(fragment=fragments[fragmentIndex],!!!fragment.isComment){fragments.splice(fragmentIndex,0,fragmentToInsert),inserted=!0;break}return inserted||fragments.push(fragmentToInsert),fragments},isLiteralArguments=function(node){return node instanceof IdentifierLiteral&&\"arguments\"===node.value},isLiteralThis=function(node){return node instanceof ThisLiteral||node instanceof Code&&node.bound},shouldCacheOrIsAssignable=function(node){return node.shouldCache()||(\"function\"==typeof node.isAssignable?node.isAssignable():void 0)},_unfoldSoak=function(o,parent,name){var ifn;if(ifn=parent[name].unfoldSoak(o))return parent[name]=ifn.body,ifn.body=new Value(parent),ifn},makeDelimitedLiteral=function(body){var _ref67=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},delimiterOption=_ref67.delimiter,escapeNewlines=_ref67.escapeNewlines,_double2=_ref67.double,_ref67$includeDelimit=_ref67.includeDelimiters,_ref67$escapeDelimite=_ref67.escapeDelimiter,escapeDelimiter=void 0===_ref67$escapeDelimite||_ref67$escapeDelimite,convertTrailingNullEscapes=_ref67.convertTrailingNullEscapes,escapeTemplateLiteralCurlies,printedDelimiter,regex;return\"\"===body&&\"/\"===delimiterOption&&(body=\"(?:)\"),escapeTemplateLiteralCurlies=\"`\"===delimiterOption,regex=RegExp(\"(\\\\\\\\\\\\\\\\)|(\\\\\\\\0(?=\\\\d))\".concat(convertTrailingNullEscapes?/|(\\\\0)$/.source:\"\").concat(escapeDelimiter?RegExp(\"|\\\\\\\\?(\".concat(delimiterOption,\")\")).source:\"\").concat(escapeTemplateLiteralCurlies?/|\\\\?(\\$\\{)/.source:\"\",\"|\\\\\\\\?(?:\").concat(escapeNewlines?\"(\\n)|\":\"\",\"(\\\\r)|(\\\\u2028)|(\\\\u2029))|(\\\\\\\\.)\"),\"g\"),body=body.replace(regex,function(match,backslash,nul){for(var _len2=arguments.length,args=Array(3<_len2?_len2-3:0),_key2=3,cr,delimiter,lf,ls,other,ps,templateLiteralCurly,trailingNullEscape;_key2<_len2;_key2++)args[_key2-3]=arguments[_key2];switch(trailingNullEscape=convertTrailingNullEscapes?args.shift():void 0,delimiter=escapeDelimiter?args.shift():void 0,templateLiteralCurly=escapeTemplateLiteralCurlies?args.shift():void 0,lf=escapeNewlines?args.shift():void 0,cr=args[0],ls=args[1],ps=args[2],other=args[3],!1){case!backslash:return _double2?backslash+backslash:backslash;case!nul:return\"\\\\x00\";case!trailingNullEscape:return\"\\\\x00\";case!delimiter:return\"\\\\\".concat(delimiter);case!templateLiteralCurly:return\"\\\\${\";case!lf:return\"\\\\n\";case!cr:return\"\\\\r\";case!ls:return\"\\\\u2028\";case!ps:return\"\\\\u2029\";case!other:return _double2?\"\\\\\".concat(other):other;}}),printedDelimiter=void 0===_ref67$includeDelimit||_ref67$includeDelimit?delimiterOption:\"\",\"\".concat(printedDelimiter).concat(body).concat(printedDelimiter)},sniffDirectives=function(expressions){var _ref68=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},notFinalExpression=_ref68.notFinalExpression,expression,index,lastIndex,results1,unwrapped;for(index=0,lastIndex=expressions.length-1,results1=[];index<=lastIndex&&!(index===lastIndex&&notFinalExpression);){if(expression=expressions[index],(unwrapped=null==expression?void 0:\"function\"==typeof expression.unwrap?expression.unwrap():void 0)instanceof PassthroughLiteral&&unwrapped.generated){index++;continue}if(!(expression instanceof Value&&expression.isString()&&!expression.unwrap().shouldGenerateTemplateLiteral()))break;expressions[index]=new Directive(expression).withLocationDataFrom(expression),results1.push(index++)}return results1},astAsBlockIfNeeded=function(node,o){var unwrapped;return unwrapped=node.unwrap(),unwrapped instanceof Block&&1<unwrapped.expressions.length?(unwrapped.makeReturn(null,!0),unwrapped.ast(o,LEVEL_TOP)):node.ast(o,LEVEL_PAREN)},lesser=function(a,b){return a<b?a:b},greater=function(a,b){return a>b?a:b},isAstLocGreater=function(a,b){return!!(a.line>b.line)||a.line===b.line&&a.column>b.column},isLocationDataStartGreater=function(a,b){return!!(a.first_line>b.first_line)||a.first_line===b.first_line&&a.first_column>b.first_column},isLocationDataEndGreater=function(a,b){return!!(a.last_line>b.last_line)||a.last_line===b.last_line&&a.last_column>b.last_column},exports.mergeLocationData=mergeLocationData=function(locationDataA,locationDataB){var _ref69=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},justLeading=_ref69.justLeading,justEnding=_ref69.justEnding;return Object.assign(justEnding?{first_line:locationDataA.first_line,first_column:locationDataA.first_column}:isLocationDataStartGreater(locationDataA,locationDataB)?{first_line:locationDataB.first_line,first_column:locationDataB.first_column}:{first_line:locationDataA.first_line,first_column:locationDataA.first_column},justLeading?{last_line:locationDataA.last_line,last_column:locationDataA.last_column,last_line_exclusive:locationDataA.last_line_exclusive,last_column_exclusive:locationDataA.last_column_exclusive}:isLocationDataEndGreater(locationDataA,locationDataB)?{last_line:locationDataA.last_line,last_column:locationDataA.last_column,last_line_exclusive:locationDataA.last_line_exclusive,last_column_exclusive:locationDataA.last_column_exclusive}:{last_line:locationDataB.last_line,last_column:locationDataB.last_column,last_line_exclusive:locationDataB.last_line_exclusive,last_column_exclusive:locationDataB.last_column_exclusive},{range:[justEnding?locationDataA.range[0]:lesser(locationDataA.range[0],locationDataB.range[0]),justLeading?locationDataA.range[1]:greater(locationDataA.range[1],locationDataB.range[1])]})},exports.mergeAstLocationData=mergeAstLocationData=function(nodeA,nodeB){var _ref70=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},justLeading=_ref70.justLeading,justEnding=_ref70.justEnding;return{loc:{start:justEnding?nodeA.loc.start:isAstLocGreater(nodeA.loc.start,nodeB.loc.start)?nodeB.loc.start:nodeA.loc.start,end:justLeading?nodeA.loc.end:isAstLocGreater(nodeA.loc.end,nodeB.loc.end)?nodeA.loc.end:nodeB.loc.end},range:[justEnding?nodeA.range[0]:lesser(nodeA.range[0],nodeB.range[0]),justLeading?nodeA.range[1]:greater(nodeA.range[1],nodeB.range[1])],start:justEnding?nodeA.start:lesser(nodeA.start,nodeB.start),end:justLeading?nodeA.end:greater(nodeA.end,nodeB.end)}},exports.jisonLocationDataToAstLocationData=jisonLocationDataToAstLocationData=function(_ref71){var first_line=_ref71.first_line,first_column=_ref71.first_column,last_line_exclusive=_ref71.last_line_exclusive,last_column_exclusive=_ref71.last_column_exclusive,range=_ref71.range;return{loc:{start:{line:first_line+1,column:first_column},end:{line:last_line_exclusive+1,column:last_column_exclusive}},range:[range[0],range[1]],start:range[0],end:range[1]}},zeroWidthLocationDataFromEndLocation=function(_ref72){var _ref72$range=_slicedToArray(_ref72.range,2),endRange=_ref72$range[1],last_line_exclusive=_ref72.last_line_exclusive,last_column_exclusive=_ref72.last_column_exclusive;return{first_line:last_line_exclusive,first_column:last_column_exclusive,last_line:last_line_exclusive,last_column:last_column_exclusive,last_line_exclusive:last_line_exclusive,last_column_exclusive:last_column_exclusive,range:[endRange,endRange]}},extractSameLineLocationDataFirst=function(numChars){return function(_ref73){var _ref73$range=_slicedToArray(_ref73.range,1),startRange=_ref73$range[0],first_line=_ref73.first_line,first_column=_ref73.first_column;return{first_line:first_line,first_column:first_column,last_line:first_line,last_column:first_column+numChars-1,last_line_exclusive:first_line,last_column_exclusive:first_column+numChars,range:[startRange,startRange+numChars]}}},extractSameLineLocationDataLast=function(numChars){return function(_ref74){var _ref74$range=_slicedToArray(_ref74.range,2),endRange=_ref74$range[1],last_line=_ref74.last_line,last_column=_ref74.last_column,last_line_exclusive=_ref74.last_line_exclusive,last_column_exclusive=_ref74.last_column_exclusive;return{first_line:last_line,first_column:last_column-(numChars-1),last_line:last_line,last_column:last_column,last_line_exclusive:last_line_exclusive,last_column_exclusive:last_column_exclusive,range:[endRange-numChars,endRange]}}},emptyExpressionLocationData=function(_ref75){var element=_ref75.interpolationNode,openingBrace=_ref75.openingBrace,closingBrace=_ref75.closingBrace;return{first_line:element.locationData.first_line,first_column:element.locationData.first_column+openingBrace.length,last_line:element.locationData.last_line,last_column:element.locationData.last_column-closingBrace.length,last_line_exclusive:element.locationData.last_line,last_column_exclusive:element.locationData.last_column,range:[element.locationData.range[0]+openingBrace.length,element.locationData.range[1]-closingBrace.length]}}}.call(this),{exports:exports}.exports}(),require[\"./sourcemap\"]=function(){var module={exports:{}};return function(){var LineMap,SourceMap;LineMap=function(){function LineMap(line1){_classCallCheck(this,LineMap),this.line=line1,this.columns=[]}return _createClass(LineMap,[{key:\"add\",value:function add(column,_ref76){var _ref77=_slicedToArray(_ref76,2),sourceLine=_ref77[0],sourceColumn=_ref77[1],options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};return this.columns[column]&&options.noReplace?void 0:this.columns[column]={line:this.line,column:column,sourceLine:sourceLine,sourceColumn:sourceColumn}}},{key:\"sourceLocation\",value:function sourceLocation(column){for(var mapping;!((mapping=this.columns[column])||0>=column);)column--;return mapping&&[mapping.sourceLine,mapping.sourceColumn]}}]),LineMap}(),SourceMap=function(){var SourceMap=function(){function SourceMap(){_classCallCheck(this,SourceMap),this.lines=[]}return _createClass(SourceMap,[{key:\"add\",value:function add(sourceLocation,generatedLocation){var options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_generatedLocation=_slicedToArray(generatedLocation,2),base,column,line,lineMap;return line=_generatedLocation[0],column=_generatedLocation[1],lineMap=(base=this.lines)[line]||(base[line]=new LineMap(line)),lineMap.add(column,sourceLocation,options)}},{key:\"sourceLocation\",value:function sourceLocation(_ref78){for(var _ref79=_slicedToArray(_ref78,2),line=_ref79[0],column=_ref79[1],lineMap;!((lineMap=this.lines[line])||0>=line);)line--;return lineMap&&lineMap.sourceLocation(column)}},{key:\"generate\",value:function generate(){var options=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},code=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null,buffer,i,j,lastColumn,lastSourceColumn,lastSourceLine,len,len1,lineMap,lineNumber,mapping,needComma,ref,ref1,sources,v3,writingline;for(writingline=0,lastColumn=0,lastSourceLine=0,lastSourceColumn=0,needComma=!1,buffer=\"\",ref=this.lines,(lineNumber=i=0,len=ref.length);i<len;lineNumber=++i)if(lineMap=ref[lineNumber],lineMap)for(ref1=lineMap.columns,j=0,len1=ref1.length;j<len1;j++)if(mapping=ref1[j],!!mapping){for(;writingline<mapping.line;)lastColumn=0,needComma=!1,buffer+=\";\",writingline++;needComma&&(buffer+=\",\",needComma=!1),buffer+=this.encodeVlq(mapping.column-lastColumn),lastColumn=mapping.column,buffer+=this.encodeVlq(0),buffer+=this.encodeVlq(mapping.sourceLine-lastSourceLine),lastSourceLine=mapping.sourceLine,buffer+=this.encodeVlq(mapping.sourceColumn-lastSourceColumn),lastSourceColumn=mapping.sourceColumn,needComma=!0}return sources=options.sourceFiles?options.sourceFiles:options.filename?[options.filename]:[\"<anonymous>\"],v3={version:3,file:options.generatedFile||\"\",sourceRoot:options.sourceRoot||\"\",sources:sources,names:[],mappings:buffer},(options.sourceMap||options.inlineMap)&&(v3.sourcesContent=[code]),v3}},{key:\"encodeVlq\",value:function encodeVlq(value){var answer,nextChunk,signBit,valueToEncode;for(answer=\"\",signBit=0>value?1:0,valueToEncode=(_Mathabs(value)<<1)+signBit;valueToEncode||!answer;)nextChunk=valueToEncode&VLQ_VALUE_MASK,valueToEncode>>=VLQ_SHIFT,valueToEncode&&(nextChunk|=VLQ_CONTINUATION_BIT),answer+=this.encodeBase64(nextChunk);return answer}},{key:\"encodeBase64\",value:function encodeBase64(value){return BASE64_CHARS[value]||function(){throw new Error(\"Cannot Base64 encode value: \".concat(value))}()}}],[{key:\"registerCompiled\",value:function registerCompiled(filename,source,sourcemap){if(null!=sourcemap)return SourceMap.sourceMaps[filename]=sourcemap}},{key:\"getSourceMap\",value:function getSourceMap(filename){return SourceMap.sourceMaps[filename]}}]),SourceMap}(),BASE64_CHARS,VLQ_CONTINUATION_BIT,VLQ_SHIFT,VLQ_VALUE_MASK;return SourceMap.sourceMaps=Object.create(null),VLQ_SHIFT=5,VLQ_CONTINUATION_BIT=1<<VLQ_SHIFT,VLQ_VALUE_MASK=VLQ_CONTINUATION_BIT-1,BASE64_CHARS=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",SourceMap}.call(this),module.exports=SourceMap}.call(this),module.exports}(),require[\"./coffeescript\"]=function(){var exports={};return function(){var _require7=require(\"./lexer\"),FILE_EXTENSIONS,Lexer,SourceMap,base64encode,checkShebangLine,compile,getSourceMap,helpers,lexer,packageJson,parser,registerCompiled,withPrettyErrors;Lexer=_require7.Lexer;var _require8=require(\"./parser\");parser=_require8.parser,helpers=require(\"./helpers\"),SourceMap=require(\"./sourcemap\"),packageJson=require(\"../../package.json\"),exports.VERSION=packageJson.version,exports.FILE_EXTENSIONS=FILE_EXTENSIONS=[\".coffee\",\".litcoffee\",\".coffee.md\"],exports.helpers=helpers;var _SourceMap=SourceMap;getSourceMap=_SourceMap.getSourceMap,registerCompiled=_SourceMap.registerCompiled,exports.registerCompiled=registerCompiled,base64encode=function(src){switch(!1){case\"function\"!=typeof Buffer:return Buffer.from(src).toString(\"base64\");case\"function\"!=typeof btoa:return btoa(encodeURIComponent(src).replace(/%([0-9A-F]{2})/g,function(match,p1){return _StringfromCharCode(\"0x\"+p1)}));default:throw new Error(\"Unable to base64 encode inline sourcemap.\");}},withPrettyErrors=function(fn){return function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},err;try{return fn.call(this,code,options)}catch(error){if(err=error,\"string\"!=typeof code)throw err;throw helpers.updateSyntaxError(err,code,options.filename)}}},exports.compile=compile=withPrettyErrors(function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},ast,currentColumn,currentLine,encoded,filename,fragment,fragments,generateSourceMap,header,i,j,js,len,len1,map,newLines,nodes,range,ref,sourceCodeLastLine,sourceCodeNumberOfLines,sourceMapDataURI,sourceURL,token,tokens,transpiler,transpilerOptions,transpilerOutput,v3SourceMap;if(options=Object.assign({},options),generateSourceMap=options.sourceMap||options.inlineMap||null==options.filename,filename=options.filename||helpers.anonymousFileName(),checkShebangLine(filename,code),generateSourceMap&&(map=new SourceMap),tokens=lexer.tokenize(code,options),options.referencedVars=function(){var i,len,results;for(results=[],i=0,len=tokens.length;i<len;i++)token=tokens[i],\"IDENTIFIER\"===token[0]&&results.push(token[1]);return results}(),null==options.bare||!0!==options.bare)for(i=0,len=tokens.length;i<len;i++)if(token=tokens[i],\"IMPORT\"===(ref=token[0])||\"EXPORT\"===ref){options.bare=!0;break}if(nodes=parser.parse(tokens),options.ast)return nodes.allCommentTokens=helpers.extractAllCommentTokens(tokens),sourceCodeNumberOfLines=(code.match(/\\r?\\n/g)||\"\").length+1,sourceCodeLastLine=/.*$/.exec(code)[0],ast=nodes.ast(options),range=[0,code.length],ast.start=ast.program.start=range[0],ast.end=ast.program.end=range[1],ast.range=ast.program.range=range,ast.loc.start=ast.program.loc.start={line:1,column:0},ast.loc.end.line=ast.program.loc.end.line=sourceCodeNumberOfLines,ast.loc.end.column=ast.program.loc.end.column=sourceCodeLastLine.length,ast.tokens=tokens,ast;for(fragments=nodes.compileToFragments(options),currentLine=0,options.header&&(currentLine+=1),options.shiftLine&&(currentLine+=1),currentColumn=0,js=\"\",(j=0,len1=fragments.length);j<len1;j++)fragment=fragments[j],generateSourceMap&&(fragment.locationData&&!/^[;\\s]*$/.test(fragment.code)&&map.add([fragment.locationData.first_line,fragment.locationData.first_column],[currentLine,currentColumn],{noReplace:!0}),newLines=helpers.count(fragment.code,\"\\n\"),currentLine+=newLines,newLines?currentColumn=fragment.code.length-(fragment.code.lastIndexOf(\"\\n\")+1):currentColumn+=fragment.code.length),js+=fragment.code;if(options.header&&(header=\"Generated by CoffeeScript \".concat(this.VERSION),js=\"// \".concat(header,\"\\n\").concat(js)),generateSourceMap&&(v3SourceMap=map.generate(options,code)),options.transpile){if(\"object\"!==_typeof(options.transpile))throw new Error(\"The transpile option must be given an object with options to pass to Babel\");transpiler=options.transpile.transpile,delete options.transpile.transpile,transpilerOptions=Object.assign({},options.transpile),v3SourceMap&&null==transpilerOptions.inputSourceMap&&(transpilerOptions.inputSourceMap=v3SourceMap),transpilerOutput=transpiler(js,transpilerOptions),js=transpilerOutput.code,v3SourceMap&&transpilerOutput.map&&(v3SourceMap=transpilerOutput.map)}return options.inlineMap&&(encoded=base64encode(JSON.stringify(v3SourceMap)),sourceMapDataURI=\"//# sourceMappingURL=data:application/json;base64,\".concat(encoded),sourceURL=\"//# sourceURL=\".concat(filename),js=\"\".concat(js,\"\\n\").concat(sourceMapDataURI,\"\\n\").concat(sourceURL)),registerCompiled(filename,code,map),options.sourceMap?{js:js,sourceMap:map,v3SourceMap:JSON.stringify(v3SourceMap,null,2)}:js}),exports.tokens=withPrettyErrors(function(code,options){return lexer.tokenize(code,options)}),exports.nodes=withPrettyErrors(function(source,options){return\"string\"==typeof source&&(source=lexer.tokenize(source,options)),parser.parse(source)}),exports.run=exports.eval=exports.register=function(){throw new Error(\"require index.coffee, not this file\")},lexer=new Lexer,parser.lexer={yylloc:{range:[]},options:{ranges:!0},lex:function lex(){var tag,token;if(token=parser.tokens[this.pos++],token){var _token6=token,_token7=_slicedToArray(_token6,3);tag=_token7[0],this.yytext=_token7[1],this.yylloc=_token7[2],parser.errorToken=token.origin||token,this.yylineno=this.yylloc.first_line}else tag=\"\";return tag},setInput:function setInput(tokens){return parser.tokens=tokens,this.pos=0},upcomingInput:function upcomingInput(){return\"\"}},parser.yy=require(\"./nodes\"),parser.yy.parseError=function(message,_ref80){var token=_ref80.token,_parser=parser,errorLoc,errorTag,errorText,errorToken,tokens;errorToken=_parser.errorToken,tokens=_parser.tokens;var _errorToken=errorToken,_errorToken2=_slicedToArray(_errorToken,3);return errorTag=_errorToken2[0],errorText=_errorToken2[1],errorLoc=_errorToken2[2],errorText=function(){switch(!1){case errorToken!==tokens[tokens.length-1]:return\"end of input\";case\"INDENT\"!==errorTag&&\"OUTDENT\"!==errorTag:return\"indentation\";case\"IDENTIFIER\"!==errorTag&&\"NUMBER\"!==errorTag&&\"INFINITY\"!==errorTag&&\"STRING\"!==errorTag&&\"STRING_START\"!==errorTag&&\"REGEX\"!==errorTag&&\"REGEX_START\"!==errorTag:return errorTag.replace(/_START$/,\"\").toLowerCase();default:return helpers.nameWhitespaceCharacter(errorText);}}(),helpers.throwSyntaxError(\"unexpected \".concat(errorText),errorLoc)},exports.patchStackTrace=function(){var formatSourcePosition,getSourceMapping;return formatSourcePosition=function(frame,getSourceMapping){var as,column,fileLocation,filename,functionName,isConstructor,isMethodCall,line,methodName,source,tp,typeName;return filename=void 0,fileLocation=\"\",frame.isNative()?fileLocation=\"native\":(frame.isEval()?(filename=frame.getScriptNameOrSourceURL(),!filename&&(fileLocation=\"\".concat(frame.getEvalOrigin(),\", \"))):filename=frame.getFileName(),filename||(filename=\"<anonymous>\"),line=frame.getLineNumber(),column=frame.getColumnNumber(),source=getSourceMapping(filename,line,column),fileLocation=source?\"\".concat(filename,\":\").concat(source[0],\":\").concat(source[1]):\"\".concat(filename,\":\").concat(line,\":\").concat(column)),functionName=frame.getFunctionName(),isConstructor=frame.isConstructor(),isMethodCall=!(frame.isToplevel()||isConstructor),isMethodCall?(methodName=frame.getMethodName(),typeName=frame.getTypeName(),functionName?(tp=as=\"\",typeName&&functionName.indexOf(typeName)&&(tp=\"\".concat(typeName,\".\")),methodName&&functionName.indexOf(\".\".concat(methodName))!==functionName.length-methodName.length-1&&(as=\" [as \".concat(methodName,\"]\")),\"\".concat(tp).concat(functionName).concat(as,\" (\").concat(fileLocation,\")\")):\"\".concat(typeName,\".\").concat(methodName||\"<anonymous>\",\" (\").concat(fileLocation,\")\")):isConstructor?\"new \".concat(functionName||\"<anonymous>\",\" (\").concat(fileLocation,\")\"):functionName?\"\".concat(functionName,\" (\").concat(fileLocation,\")\"):fileLocation},getSourceMapping=function(filename,line,column){var answer,sourceMap;return sourceMap=getSourceMap(filename,line,column),null!=sourceMap&&(answer=sourceMap.sourceLocation([line-1,column-1])),null==answer?null:[answer[0]+1,answer[1]+1]},Error.prepareStackTrace=function(err,stack){var frame,frames;return frames=function(){var i,len,results;for(results=[],i=0,len=stack.length;i<len&&(frame=stack[i],frame.getFunction()!==exports.run);i++)results.push(\"    at \".concat(formatSourcePosition(frame,getSourceMapping)));return results}(),\"\".concat(err.toString(),\"\\n\").concat(frames.join(\"\\n\"),\"\\n\")}},checkShebangLine=function(file,input){var args,firstLine,ref,rest;if(firstLine=input.split(/$/m,1)[0],rest=null==firstLine?void 0:firstLine.match(/^#!\\s*([^\\s]+\\s*)(.*)/),args=null==rest||null==(ref=rest[2])?void 0:ref.split(/\\s/).filter(function(s){return\"\"!==s}),1<(null==args?void 0:args.length))return console.error(\"The script to be run begins with a shebang line with more than one\\nargument. This script will fail on platforms such as Linux which only\\nallow a single argument.\"),console.error(\"The shebang line was: '\".concat(firstLine,\"' in file '\").concat(file,\"'\")),console.error(\"The arguments were: \".concat(JSON.stringify(args)))}}.call(this),{exports:exports}.exports}(),require[\"./browser\"]=function(){var module={exports:{}};return function(){var indexOf=[].indexOf,CoffeeScript,compile;CoffeeScript=require(\"./coffeescript\");var _CoffeeScript=CoffeeScript;compile=_CoffeeScript.compile,CoffeeScript.eval=function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},globalRoot;return null==options.bare&&(options.bare=!0),globalRoot=\"undefined\"!=typeof window&&null!==window?window:global,globalRoot.eval(compile(code,options))},CoffeeScript.run=function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};return options.bare=!0,options.shiftLine=!0,Function(compile(code,options))()},module.exports=CoffeeScript,\"undefined\"==typeof window||null===window||(\"undefined\"!=typeof btoa&&null!==btoa&&\"undefined\"!=typeof JSON&&null!==JSON&&(compile=function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};return options.inlineMap=!0,CoffeeScript.compile(code,options)}),CoffeeScript.load=function(url,callback){var options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},hold=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3],xhr;return options.sourceFiles=[url],xhr=window.ActiveXObject?new window.ActiveXObject(\"Microsoft.XMLHTTP\"):new window.XMLHttpRequest,xhr.open(\"GET\",url,!0),\"overrideMimeType\"in xhr&&xhr.overrideMimeType(\"text/plain\"),xhr.onreadystatechange=function(){var param,ref;if(4===xhr.readyState){if(0!==(ref=xhr.status)&&200!==ref)throw new Error(\"Could not load \".concat(url));else if(param=[xhr.responseText,options],!hold){var _CoffeeScript2;(_CoffeeScript2=CoffeeScript).run.apply(_CoffeeScript2,_toConsumableArray(param))}if(callback)return callback(param)}},xhr.send(null)},CoffeeScript.runScripts=function(){var coffees,coffeetypes,_execute,i,index,j,len,s,script,scripts;for(scripts=window.document.getElementsByTagName(\"script\"),coffeetypes=[\"text/coffeescript\",\"text/literate-coffeescript\"],coffees=function(){var j,len,ref,results;for(results=[],j=0,len=scripts.length;j<len;j++)s=scripts[j],(ref=s.type,0<=indexOf.call(coffeetypes,ref))&&results.push(s);return results}(),index=0,_execute=function execute(){var param;if(param=coffees[index],param instanceof Array){var _CoffeeScript3;return(_CoffeeScript3=CoffeeScript).run.apply(_CoffeeScript3,_toConsumableArray(param)),index++,_execute()}},(i=j=0,len=coffees.length);j<len;i=++j)script=coffees[i],function(script,i){var options,source;return options={literate:script.type===coffeetypes[1]},source=script.src||script.getAttribute(\"data-src\"),source?(options.filename=source,CoffeeScript.load(source,function(param){return coffees[i]=param,_execute()},options,!0)):(options.filename=script.id&&\"\"!==script.id?script.id:\"coffeescript\".concat(0===i?\"\":i),options.sourceFiles=[\"embedded\"],coffees[i]=[script.innerHTML,options])}(script,i);return _execute()},this===window&&(window.addEventListener?window.addEventListener(\"DOMContentLoaded\",CoffeeScript.runScripts,!1):window.attachEvent(\"onload\",CoffeeScript.runScripts)))}.call(this),module.exports}(),require[\"./browser\"]}();export default CoffeeScript;var VERSION=CoffeeScript.VERSION,compile=CoffeeScript.compile,evaluate=CoffeeScript.eval,load=CoffeeScript.load,run=CoffeeScript.run,runScripts=CoffeeScript.runScripts;export{VERSION,compile,evaluate as eval,load,run,runScripts};"
  },
  {
    "path": "docs/v2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv=\"content-type\" content=\"text/html;charset=UTF-8\" />\n<title>CoffeeScript</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<link rel=\"canonical\" href=\"https://coffeescript.org\" />\n\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/apple-touch-icon.png\">\n<link rel=\"icon\" type=\"image/png\" href=\"/favicon-32x32.png\" sizes=\"32x32\">\n<link rel=\"icon\" type=\"image/png\" href=\"/favicon-16x16.png\" sizes=\"16x16\">\n<link rel=\"manifest\" href=\"/manifest.json\">\n<link rel=\"mask-icon\" href=\"/safari-pinned-tab.svg\" color=\"#5bbad5\">\n<meta name=\"theme-color\" content=\"#ffffff\">\n\n<link href=\"https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4\" crossorigin=\"anonymous\">\n<!-- The CoffeeScript logo font is Google’s Galada -->\n<link href=\"https://fonts.googleapis.com/css?family=Alegreya+Sans:400,800|Lato:300,300i,400,700|Roboto+Mono:400,400i\" rel=\"stylesheet\" crossorigin=\"anonymous\">\n<link href=\"https://cdn.jsdelivr.net/npm/codemirror@5.62.3/lib/codemirror.css\" rel=\"stylesheet\" crossorigin=\"anonymous\">\n<style>\n/* Adapted from https://github.com/FarhadG/code-mirror-themes/blob/master/themes/twilight.css and https://github.com/codemirror/CodeMirror/blob/master/theme/twilight.css */\n\n/* CodeMirror general styling */\n\n.CodeMirror,\n.placeholder-code {\n  /* https://codemirror.net/demo/resize.html */\n  height: auto;\n  background: transparent;\n  font-family: 'Roboto Mono';\n  font-weight: 400;\n  line-height: 1.25;\n  letter-spacing: 0.3px;\n  color: #f8f8f8;\n  /* Prevent mobile Safari from zooming in on our code editors; the code is 16px naturally, but somehow being explicit about it prevents the zooming */\n  font-size: 16px;\n}\n@media (min-width: 768px) {\n  .CodeMirror,\n  .placeholder-code {\n    font-size: 87.5%; /* Matching Bootstrap’s font size for code, which calculates to 14.4px */\n  }\n}\n.CodeMirror-lines {\n  padding: 0.5em 0;\n}\n.placeholder-code {\n  padding: 0.5em 4px;\n  margin-bottom: 1.37em;\n  white-space: pre-wrap;\n}\n.CodeMirror pre,\n.CodeMirror pre.CodeMirror-line,\npre.placeholder-code {\n  line-height: 1.4em;\n}\n.CodeMirror-code:focus {\n  outline: none;\n}\ndiv.CodeMirror-cursor {\n  border-left: 3px solid #f8f8f8;\n}\n.CodeMirror-activeline-background {\n  background: #ffffff08;\n}\n.CodeMirror-selected {\n  background: #ddf0ff33;\n}\n\n/* Syntax highlighting */\n\n.cm-keyword,\n.placeholder-code .keyword {\n  color: #cda869;\n}\n.cm-atom {\n  color: #dad085;\n}\n.cm-number,\n.cm-meta,\n.placeholder-code .number,\n.placeholder-code .built_in,\n.placeholder-code .builtin-name,\n.placeholder-code .literal,\n.placeholder-code .type,\n/*.placeholder-code .params,*/\n.placeholder-code .meta,\n.placeholder-code .link {\n  color: #dad085;\n}\n.cm-def {\n  color: #f8f8f8;\n}\nspan.cm-variable-2,\nspan.cm-tag {\n  color: #f8f8f8;\n}\nspan.cm-variable-3,\nspan.cm-def,\nspan.cm-type {\n  color: #f8f8f8;\n}\n.cm-operator,\n.placeholder-code .punctuation,\n.placeholder-code .symbol,\n.placeholder-code .bullet,\n.placeholder-code .addition,\n.placeholder-code .operator {\n  color: #cda869;\n}\n.cm-comment,\n.placeholder-code .comment {\n  font-style: italic;\n  color: #5f5a60;\n}\n.cm-string,\n.cm-string-2,\n.placeholder-code .string {\n  color: #8f9d6a;\n}\n.cm-property,\n.placeholder-code .attribute {\n  color: #dad085;\n}\n.cm-builtin {\n  color: #cda869;\n}\n.cm-tag {\n  color: #997643;\n}\n.cm-attribute {\n  color: #d6bb6d;\n}\n.cm-header {\n  color: #FF6400;\n}\n.cm-hr {\n  color: #AEAEAE;\n}\n.cm-link {\n  color: #ad9361;\n  font-style: italic;\n  text-decoration: none;\n}\n.cm-error {\n  border-bottom: 1px solid rgba(142, 22, 22, 0.67);\n}\n\n/* Uneditable code blocks are inverted, so use darker versions of the above */\n\n.uneditable-code-block code {\n  padding: 0;\n}\n\n.uneditable-code-block .comment {\n  font-style: italic;\n  color: #837B85;\n}\n.uneditable-code-block .class,\n.uneditable-code-block .function,\n.uneditable-code-block .keyword,\n.uneditable-code-block .reserved,\n.uneditable-code-block .title {\n  color: #534328;\n}\n.uneditable-code-block .string\n.uneditable-code-block .value\n.uneditable-code-block .inheritance\n.uneditable-code-block .header {\n  color: #3A4029;\n}\n.uneditable-code-block .variable,\n.uneditable-code-block .literal,\n.uneditable-code-block .tag,\n.uneditable-code-block .regexp,\n.uneditable-code-block .subst,\n.uneditable-code-block .property {\n  color: #474429;\n}\n.uneditable-code-block .number,\n.uneditable-code-block .preprocessor,\n.uneditable-code-block .built_in,\n.uneditable-code-block .params,\n.uneditable-code-block .constant {\n  color: #474429;\n}\n\nhtml,\nbody {\n  /* Prevent scroll on narrow devices */\n  overflow-x: hidden;\n}\nbody {\n  /* Required for Scrollspy */\n  position: relative;\n  /* Push below header bar */\n  margin-top: 3.5rem;\n}\n\nsvg {\n  width: auto;\n  height: 100%;\n}\n\na {\n  color: #1b5e20;\n  transition: 0.1s ease-in-out;\n}\na:focus, a:hover, a:active {\n  color: #388e3c;\n  cursor: pointer;\n  text-decoration: none;\n}\n\nbutton:focus, .navbar-dark .navbar-toggler:focus {\n  outline: none;\n  border: thin solid rgba(248, 243, 240, 0.3);\n}\n\n.bg-dark {\n  background-color: #3e2723 !important;\n}\n\n.bg-ribbed-light {\n  background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1 3\"><path opacity=\".03\" fill=\"#000\" d=\"M0 0h1v1H0z\"/><path opacity=\".005\" fill=\"#000\" d=\"M0 1h1v2H0z\"/></svg>');\n  background-size: 1px 3px;\n}\n.bg-ribbed-dark {\n  background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1 3\"><path opacity=\".2\" fill=\"#000\" d=\"M0 0h1v1H0z\"/><path opacity=\".15\" fill=\"#000\" d=\"M0 1h1v2H0z\"/></svg>');\n  background-size: 1px 3px;\n}\n\n\n/*\n * Header\n */\n.site-navbar {\n  height: 3.5rem;\n  font-family: 'Lato';\n  font-weight: 400;\n  font-size: 1.1em;\n}\n\n.navbar-brand {\n  height: 2.2em;\n  margin-right: 1em;\n}\n\n.navbar-dark path {\n  fill: #fff;\n}\n\n.navbar-nav .nav-item {\n  margin-left: 0.6em;\n  margin-right: 0.6em;\n  border-radius: 0.4em;\n}\n.navbar-nav .nav-item:hover,\n.navbar-nav .nav-item:active,\n.navbar-nav .nav-item.show {\n  background-color: #4e342e;\n}\n\n.navbar-toggler {\n  transition: all 0.1s ease-in-out;\n}\n\n\n/*\n * Layout; based on https://codepen.io/Sphinxxxx/pen/WjwbEO\n */\n.main-row {\n  height: calc(100vh - 3.5rem);\n}\n\n/*\n * Sidebar\n */\n\n.sidebar {\n  /* Scrollable contents if viewport is shorter than content */\n  overflow-y: auto;\n  overflow-x: hidden;\n  left: 0;\n  bottom: 0;\n  z-index: 1000;\n  padding: 0;\n  background-color: #efebe9;\n  border-right: 1px solid #efebe9;\n}\n.sidebar::-webkit-scrollbar {\n  display: none;\n}\n@media screen and (max-width: 991px) {\n  .sidebar {\n    position: fixed;\n    top: 3.5em;\n    height: calc(100% - 3.5rem);\n    left: -100%;\n    transition: 0.25s left ease-in-out;\n  }\n  .sidebar.show {\n    left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .sidebar {\n    flex: 0 0 auto;\n  }\n}\n\n.contents {\n  padding: 0.5em 0 0.5em 0.5em;\n  font-family: 'Alegreya Sans';\n  font-weight: 400;\n  font-size: 1.2em;\n  align-items: normal;\n}\n\n.contents .nav .nav {\n  margin-left: 1em;\n  font-size: 0.9em;\n}\n\n.contents .nav-link {\n  padding: 0.2em 0.7em;\n}\n\n.contents .nav-link.active,\n.contents .nav-link.active a:hover,\n.contents .nav-link.active a:focus {\n  font-weight: 800;\n}\n\n\n/*\n * Main content\n */\n\n.main {\n  max-width: 100%;\n  padding: 1.3em;\n}\n@media (min-width: 992px) {\n  .main {\n    flex: 1 1 auto;\n    overflow: auto;\n    padding-right: 2em;\n    padding-left: 2em;\n  }\n}\n\n.title-logo {\n  width: 30rem;\n  margin: 3rem auto;\n}\n.title-logo path {\n  fill: #2f2625;\n}\n\n.main p, .main li, .main td, .main th {\n  font-family: Lato;\n  font-weight: 300;\n  font-size: 1.1em;\n  line-height: 1.7;\n}\n.main blockquote {\n  font-size: 1.1em;\n}\n.main li p, .main li li, .main li blockquote {\n  font-size: 1em;\n}\n@media (min-width: 768px) {\n  .main p, .main li, .main td, .main th, .main blockquote {\n    font-size: 1.2em;\n  }\n}\n.main td {\n  vertical-align: top;\n  padding: 0.3em 0;\n}\n.main strong, .main th {\n  font-weight: 700;\n}\n.main a {\n  border-bottom: 2px solid transparent;\n  font-weight: 400;\n}\n.main a:focus, .main a:hover, .main a:active {\n  border-bottom: 2px solid rgba(56, 142, 60, 0.2);\n}\n.main blockquote pre {\n  background-color: #f8f3f0;\n  color: #2f2625;\n  border-radius: .3em;\n  padding: 0.4em 0.6em;\n}\n\np, blockquote, table, .code-example {\n  margin-bottom: 1.1em;\n}\n.main li {\n  margin-bottom: 0.6em;\n}\n\ncode, td code {\n  white-space: nowrap;\n  padding: 2px 8px;\n}\npre code {\n  white-space: pre; /* We want newlines to be newlines in code blocks */\n}\n\nh2, h3, h4 {\n  margin-top: 1.3em;\n  margin-bottom: 0.6em;\n  font-family: 'Alegreya Sans';\n}\nh2 {\n  font-weight: 800;\n}\nh3, h4, h2 time {\n  font-weight: 400;\n}\n\n@media (min-width: 1200px) {\n  .main > header, .main section > h2, .main section > h3, .main section > h4, .main section > p, .main section > blockquote, .main section > ul, .main section > table {\n    max-width: 80%;\n  }\n}\n\ncode, button {\n  font-family: 'Roboto Mono';\n  font-weight: 400;\n}\ncode, a > code {\n  background-color: #f8f3f0;\n}\ncode {\n  color: #2f2625;\n}\n\n\n/*\n * Chrome around code examples; see code.css for the styling of the code blocks themselves\n */\n\ntextarea {\n  position: absolute;\n  left: -99999px; /* Hide off canvas, while still remaining visible */\n}\n\n.code-example {\n  background-color: #2f2625;\n  padding: 1em;\n  border-radius: 0.3em;\n  margin-bottom: 1em;\n}\n\n.javascript-output-column {\n  border-left: 1px solid rgba(255, 255, 255, 0.2);\n}\n\n.btn-primary {\n  background-color: #69f0ae;\n  color: #0b140f;\n  border-color: #53d88f;\n  transition: 0.2s ease-in-out;\n  min-width: 3.125rem;\n}\n.btn-primary:active, .btn-primary:focus, .btn-primary:hover, .btn-primary:active:hover, .btn-primary:active:focus {\n  background-color: #61fea8;\n  color: #060a08;\n  border-color: #4de486;\n  outline: 0;\n}\n\n.play-button {\n  height: 1em;\n  width: 1em;\n}\n\n.javascript-output-column .CodeMirror-cursor {\n  /* https://github.com/codemirror/CodeMirror/issues/2568 */\n  display: none;\n}\n\n/*\n * Try CoffeeScript\n */\n.try-coffeescript {\n  position: fixed;\n  height: calc(100% - 3.5rem);\n  top: 3.5rem;\n  left: 0;\n  right: 0;\n  opacity: 0;\n  transition: opacity 0.15s ease-in-out;\n  z-index: -1001;\n  background-color: #2f2625;\n}\n.try-coffeescript.show {\n  opacity: 1;\n  z-index: 1001;\n}\n\n.try-coffeescript .CodeMirror {\n  height: calc(100vh - 7rem);\n  cursor: text;\n}\n\n.try-coffeescript .code-column {\n  overflow: hidden;\n  background-color: #2f2625;\n  color: #2f2625;\n}\n\n@media screen and (max-width: 767px) {\n  .try-coffeescript .code-column {\n    height: calc(50vh - 0.5 * 3.5rem);\n  }\n}\n@media screen and (min-width: 768px) {\n  .try-coffeescript .code-column {\n    padding-bottom: 100%;\n    margin-bottom: -100%;\n  }\n}\n\n.try-coffeescript button svg {\n  height: 1em;\n  transform: scale(1.3) translateY(0.1em);\n  fill: #0b140f;\n}\n\n@media screen and (max-width: 767px) {\n  .try-coffeescript .try-buttons {\n    position: absolute;\n    bottom: 1em;\n    z-index: 1002;\n  }\n}\n\n</style>\n\n</head>\n<body>\n\n<nav class=\"navbar navbar-expand-lg fixed-top navbar-dark bg-dark bg-ribbed-dark site-navbar\">\n  <a class=\"navbar-brand\" href=\"#\" data-close=\"try\" data-action=\"scroll-to-top\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-22 347 566 100\">\n  <title>\n    CoffeeScript Logo\n  </title>\n  <path d=\"M21.7 351.1c.1.6-.2 1.1-1.2 1.6-1.3-.7-4.1-1.1-6.4-.9-2.5.2-4.6 1-4.3 2.7.4 1.7 2.8 2.7 7.1 2.3 10.5-.9 10.4-8 25.8-9.4 12-1.1 18.7 2.6 19.6 7.1.7 3.5-2.2 6.9-10.9 7.6-7.7.7-12.2-1.4-12.6-3.5-.2-1.1.4-2.7 4.1-3.1.4 1.7 2.5 3.5 7.5 3 3.6-.3 6.6-1.6 6.2-3.6-.4-2.1-4.2-3.3-10.2-2.8-12.2 1.1-15.2 7.8-25.6 8.7-7.4.7-13.4-2-14.2-6-.3-1.5-.3-5 7.5-5.7 4-.3 7.2.4 7.6 2zm-39 41.8c-3.4 4.3-4.9 9.3-4.6 14.2.3 4.9 2.7 8.9 6.5 12 4 3.1 8.3 4 13.2 3.1 1.9-.3 4-1.3 5.9-1.9-4 0-7.4-1.3-10.8-4-3.7-2.7-6.2-6.5-6.8-11.1-.9-4.3 0-8.3 2.4-11.8 2.7-3.4 6.2-5.3 10.8-5.9 4.6-.3 8.6.9 12.6 3.7-.9-1.3-2.2-2.2-3.4-3.4-4-2.7-8.3-4-13.6-2.7-4.8 1-8.8 3.5-12.2 7.8zm53.6-23.1c-12.9 0-24.4-1.3-32.7-3.1-8.9-2.2-13.6-4.6-13.6-7.7 0-1.3.6-2.4 2.4-3.7-5.6 2.2-8.6 4-8.6 6.8.3 3.1 5.3 6.2 15.5 8.6 9.6 2.4 21.9 3.7 36.7 3.7 15.1 0 27.1-1.3 36.7-3.7 10.2-2.4 15.1-5.6 15.1-8.6 0-2.2-2.2-4.3-6.2-5.9.9.6 1.6 1.6 1.6 2.7 0 3.1-4.6 5.6-13.9 7.7-8.6 1.9-19.6 3.2-33 3.2zm36.8 8.6c-9.6 2.2-21.9 3.7-36.7 3.7-15.1 0-27.4-1.6-37-3.7-8.6-2.2-13.2-4.6-14.8-7.1 1.6 10.8 5.3 21 10.2 30 3.7 5.6 7.4 10.5 11.1 15.8 1.6 3.1 2.7 6.2 3.4 9.3 2.4 3.4 5.9 5.6 10.2 6.8 5.3 1.9 10.8 2.7 16.4 2.4h.6c5.6.3 11.5-.6 16.9-2.4 4-1.3 7.4-3.4 9.9-6.8h.3c.6-3.1 1.6-6.2 3.1-9.3 3.7-5.3 7.4-10.2 11.1-15.8 4.9-8.9 8.3-19.1 10.2-30-2 2.8-6.6 5.2-14.9 7.1zm106.2 30.1c-4.8 12.1-17.6 16.9-25.9 16.9-13.4 0-19.9-6-19.9-22.3 0-16.5 7.9-47.3 31.7-47.3 8.5 0 15.2 3.3 15.2 12.1 0 4.8-1.8 8.3-6.4 8.3-1.5 0-3.4-.4-5.2-2.4 2.2-1.1 4.2-4.9 4.2-8.3 0-2.9-1.5-5.6-5.6-5.6-10 0-18.9 23.9-18.9 42.4 0 8.3 2.2 14.2 10.9 14.2 7.1 0 13.5-3.4 17.7-9.1l2.2 1.1zm32.9-16.3c.4.2.7.2 1 .2 4.2 0 10.1-2.7 14-5.5l.8 2.4c-3.4 3.7-9.5 6.5-16.1 7.5-1.5 16.8-10.6 27.3-21.7 27.3-8.4 0-14.5-4-14.5-14.4 0-10.5 6.2-32.2 24.9-32.2 7.8.3 11.6 5.3 11.6 14.7zm-7.7 5c-1.9-.5-2.4-2-2.4-3.8 0-2.5 1.2-4.2 2.8-4.9-.2-3.8-1.1-5.3-3.4-5.3-6.5 0-12 16.6-12 25.6 0 6 1.2 7.3 4.6 7.3 4.2.1 8.9-8 10.4-18.9zm-6.6 39.7c0-8.3 7.1-11 15.8-13.6l10.9-51.9c2.7-13 10.6-15.5 16.5-15.5 4.1 0 8 2.2 9.7 5.7 3.6-4.6 8.4-5.7 12.4-5.7 5.6 0 10.8 3.9 10.8 9.8 0 1.5-.1 2.6-.3 3.7h-4.3c.1-.9.2-1.7.2-2.4 0-2.1-1.7-3.1-3.4-3.1-2 0-4.8 1.1-6.2 7.1l-1.7 7.4h9.1l-.8 3.6h-9l-10.3 49.1c-2.7 13-10.6 15.5-16.5 15.5-5.2 0-8.3-2.3-9.8-5.7-3.5 4.6-8.3 5.7-12.3 5.7-5.6.1-10.8-3.8-10.8-9.7zm9.1 1.8c1.9 0 4.2-1.8 5.4-7.1l1.1-5.3c-5.7 2-10.1 4.4-10.1 9.4 0 1.2 1.7 3 3.6 3zm21.7 0c1.9 0 4.2-1.8 5.4-7.1l2.2-10.4-9.4 1.8-1.8 8.3c-.5 2.1-1.1 4-1.8 5.6.9 1.3 3 1.8 5.4 1.8zm-1.4-18l9.4-1.7 7.7-36.8h-9l-8.1 38.5zm16.6-56.7c-2 0-4.8 1.1-6.2 7.1l-1.7 7.4h9l2.1-9.5c.2-.7.2-1.3.2-2 .1-2-1.5-3-3.4-3zm37.9 53c7.1 0 11.6-4 16.1-9.2h3.1c-5.2 8.3-12.9 16.8-25 16.8-8.5 0-14.2-4.2-14.2-14.5 0-10.5 5.9-32.3 24.6-32.3 8.1 0 10 4.2 10 8.7 0 10.5-10 18.5-20.9 19.2-.1 1.3-.2 2.5-.2 3.6 0 6.2 2.2 7.7 6.5 7.7zm5.3-34.4c-4.6 0-9.1 9.7-10.9 18.7 7-.5 13.2-7.4 13.2-15 0-2.2-.5-3.7-2.3-3.7zm28.6 33.4c3.4 0 7.8-2.3 10.8-4.8-2 10.4-8.4 13.4-15.8 13.4-8.4 0-14.1-4.2-14.1-14.5 0-10.5 5.9-32.3 24.6-32.3 8.1 0 10 4.2 10 8.7 0 10.6-10 18.5-20.9 19.2-.1.9-.2 2-.2 2.7 0 5.7 2.5 7.6 5.6 7.6zm6.2-33.4c-4.5 0-9.1 10.1-11 18.7 7.1-.4 13.3-7.3 13.3-15 0-2.2-.6-3.7-2.3-3.7zm51.3-6.7c-1.7 0-3-.6-4.2-1.9 2.4-1.5 4.1-4.8 4.1-7.8 0-3.1-1.8-6.1-6.8-6.1s-8.3 2.8-8.3 8.2c0 13.3 20.5 15.2 20.5 34.8 0 15.3-12.3 22.7-25.6 22.7-10.4 0-19.3-4.5-19.3-15.7 0-9.8 7-14.9 13.3-14.9 3.1 0 7.7 1.3 8 6-4.9 0-10.7 2.3-10.7 8.5 0 4.5 2.9 8.7 8.7 8.7 6.1 0 10.6-4.4 10.6-12 0-15.6-18.6-21.1-18.6-34.5 0-9.5 9.3-16.3 21-16.3 4.3 0 14.6.9 14.6 10.9.1 5.5-2.8 9.4-7.3 9.4zm36.2 10.3c0-2.3-.8-3.7-2.5-3.7-5.7 0-11.7 16.6-11.7 26.7 0 6.2 2.2 7.6 6.6 7.6 7.1 0 11.6-4 16.1-9.2h3.1c-5.2 8.3-12.9 16.8-25 16.8-8.5 0-14.2-4.2-14.2-14.5 0-10.6 6-32.3 24.5-32.3 8.1 0 10.1 4.2 10.1 8.3 0 4.4-2.2 6.7-4.8 6.7-1 0-2.1-.4-3.1-1.1.5-1.9.9-3.6.9-5.3zm27.7-7.6l-1.2 5.7c3.1-2.7 6.7-5.7 11-5.7 4.1 0 6.3 3.3 6.3 6.9 0 3.1-2.1 6.7-6.6 6.7-5.1 0-2.5-6-5.3-6-2.7 0-4.4 1.4-6.7 3.4l-7.2 34.6h-13.1l9.6-45.4 13.2-.2zm34.2 0l-6.6 30.9c-.3 1.2-.4 2.1-.4 2.9 0 2.5 1.2 3.3 3.7 3.3 3.5 0 6.9-3.4 8.1-8h3.8c-5.2 14.8-14.2 16.8-19.1 16.8-5.5 0-9.7-3.2-9.7-10.9 0-1.8.3-3.7.7-5.9l6.2-29.2 13.3.1zm-4.1-19.4c4 0 7.2 3.2 7.2 7.2s-3.2 7.1-7.2 7.1-7.1-3.1-7.1-7.1c-.1-4 3.2-7.2 7.1-7.2zm29.1 16l-1.5 6.9c2.6-2.3 6.1-3.9 10.7-3.9 6.2 0 11.1 3.5 11.1 14.4 0 12.2-4.7 32.1-22.3 32.1-4.5 0-6.8-1.6-7.7-3.2l-4.7 22.1-13.7 3.2 15.2-71.5 12.9-.1zm7.8 17c0-7-2.9-7.5-4.5-7.5-2 0-4.5 1.6-6.3 4.4l-5.4 25.5c.4 1 1.4 2.1 3.4 2.1 9.7 0 12.8-15.9 12.8-24.5zm27.8 17.3c-.3 1.1-.5 2.2-.5 3.1 0 1.9.7 3.2 3.1 3.2.7 0 1.7 0 2.4-.3-2.5 7.8-6.6 8.9-9.6 8.9-6.4 0-9.1-4.4-9.1-10.3 0-1.6.2-3.1.6-4.8l5.8-27.2h-3l.7-3.6h3L528 366l13.4-1.9s-1.4 6.2-3.1 14.4h5.5l-.7 3.6h-5.5l-5.7 27.4z\"></path>\n</svg>\n</a>\n  <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"offcanvas\" data-close=\"try\" aria-label=\"Toggle sidebar\">\n    <span class=\"navbar-toggler-icon\"></span>\n  </button>\n\n  <nav class=\"collapse navbar-collapse\">\n    <div class=\"navbar-nav mr-auto d-none d-lg-flex\">\n      <a href=\"#try\" id=\"try-link\" class=\"nav-item nav-link\" data-toggle=\"try\">Try CoffeeScript</a>\n      <a href=\"#language\" class=\"nav-item nav-link\" data-close=\"try\">Language Reference</a>\n      <a href=\"#integrations\" class=\"nav-item nav-link\" data-close=\"try\">Integrations</a>\n      <a href=\"#resources\" class=\"nav-item nav-link\" data-close=\"try\">Resources</a>\n      <a href=\"https://github.com/jashkenas/coffeescript/\" class=\"nav-item nav-link\" data-close=\"try\">GitHub\n        </a>\n    </div>\n  </nav>\n</nav>\n\n\n<aside id=\"try\" class=\"try-coffeescript container-fluid\" data-example=\"try\">\n  <div class=\"row\">\n    <div class=\"col-md-6 code-column bg-ribbed-dark coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"try-coffeescript-coffee\">alert 'Hello CoffeeScript!'</textarea>\n    </div>\n    <div class=\"col-md-6 code-column bg-ribbed-dark javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"try-coffeescript-js\">alert('Hello CoffeeScript!');</textarea>\n    </div>\n  </div>\n  <div class=\"row\">\n    <div class=\"col text-right try-buttons\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"try-coffeescript\" data-run=\"true\"><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</button>&emsp;\n    </div>\n  </div>\n</aside>\n\n\n<div class=\"container-fluid\" id=\"top\">\n  <div class=\"row flex-nowrap main-row\">\n    <nav class=\"sidebar bg-ribbed-light\">\n      <nav id=\"contents\" class=\"navbar contents\">\n  <nav class=\"nav flex-column\">\n    <a href=\"#try\" class=\"nav-link d-md-none\" data-action=\"sidebar-nav\" data-toggle=\"try\">Try CoffeeScript</a>\n    <a href=\"#introduction\" class=\"nav-link\" data-action=\"sidebar-nav\">Introduction</a>\n    <a href=\"#overview\" class=\"nav-link\" data-action=\"sidebar-nav\">Overview</a>\n    <a href=\"#coffeescript-2\" class=\"nav-link\" data-action=\"sidebar-nav\">CoffeeScript 2</a>\n    <nav class=\"nav flex-column\">\n      <a href=\"#whats-new-in-coffeescript-2\" class=\"nav-link\" data-action=\"sidebar-nav\">What’s New in CoffeeScript 2</a>\n      <a href=\"#compatibility\" class=\"nav-link\" data-action=\"sidebar-nav\">Compatibility</a>\n    </nav>\n    <a href=\"#installation\" class=\"nav-link\" data-action=\"sidebar-nav\">Installation</a>\n    <a href=\"#usage\" class=\"nav-link\" data-action=\"sidebar-nav\">Usage</a>\n    <nav class=\"nav flex-column\">\n      <a href=\"#cli\" class=\"nav-link\" data-action=\"sidebar-nav\">Command Line</a>\n      <a href=\"#nodejs-usage\" class=\"nav-link\" data-action=\"sidebar-nav\">Node.js</a>\n      <a href=\"#transpilation\" class=\"nav-link\" data-action=\"sidebar-nav\">Transpilation</a>\n    </nav>\n    <a href=\"#language\" class=\"nav-link\" data-action=\"sidebar-nav\">Language Reference</a>\n      <nav class=\"nav flex-column\">\n        <a href=\"#functions\" class=\"nav-link\" data-action=\"sidebar-nav\">Functions</a>\n        <a href=\"#strings\" class=\"nav-link\" data-action=\"sidebar-nav\">Strings</a>\n        <a href=\"#objects-and-arrays\" class=\"nav-link\" data-action=\"sidebar-nav\">Objects and Arrays</a>\n        <a href=\"#comments\" class=\"nav-link\" data-action=\"sidebar-nav\">Comments</a>\n        <a href=\"#lexical-scope\" class=\"nav-link\" data-action=\"sidebar-nav\">Lexical Scoping and Variable Safety</a>\n        <a href=\"#conditionals\" class=\"nav-link\" data-action=\"sidebar-nav\">If, Else, Unless, and Conditional Assignment</a>\n        <a href=\"#splats\" class=\"nav-link\" data-action=\"sidebar-nav\">Splats, or Rest Parameters/Spread Syntax</a>\n        <a href=\"#loops\" class=\"nav-link\" data-action=\"sidebar-nav\">Loops and Comprehensions</a>\n        <a href=\"#slices\" class=\"nav-link\" data-action=\"sidebar-nav\">Array Slicing and Splicing</a>\n        <a href=\"#expressions\" class=\"nav-link\" data-action=\"sidebar-nav\">Everything is an Expression</a>\n        <a href=\"#operators\" class=\"nav-link\" data-action=\"sidebar-nav\">Operators and Aliases</a>\n        <a href=\"#existential-operator\" class=\"nav-link\" data-action=\"sidebar-nav\">Existential Operator</a>\n        <a href=\"#destructuring\" class=\"nav-link\" data-action=\"sidebar-nav\">Destructuring Assignment</a>\n        <a href=\"#chaining\" class=\"nav-link\" data-action=\"sidebar-nav\">Chaining Function Calls</a>\n        <a href=\"#fat-arrow\" class=\"nav-link\" data-action=\"sidebar-nav\">Bound (Fat Arrow) Functions</a>\n        <a href=\"#generators\" class=\"nav-link\" data-action=\"sidebar-nav\">Generator Functions</a>\n        <a href=\"#async-functions\" class=\"nav-link\" data-action=\"sidebar-nav\">Async Functions</a>\n        <a href=\"#classes\" class=\"nav-link\" data-action=\"sidebar-nav\">Classes</a>\n        <a href=\"#prototypal-inheritance\" class=\"nav-link\" data-action=\"sidebar-nav\">Prototypal Inheritance</a>\n        <a href=\"#switch\" class=\"nav-link\" data-action=\"sidebar-nav\">Switch/When/Else</a>\n        <a href=\"#try-catch\" class=\"nav-link\" data-action=\"sidebar-nav\">Try/Catch/Finally</a>\n        <a href=\"#comparisons\" class=\"nav-link\" data-action=\"sidebar-nav\">Chained Comparisons</a>\n        <a href=\"#regexes\" class=\"nav-link\" data-action=\"sidebar-nav\">Block Regular Expressions</a>\n        <a href=\"#tagged-template-literals\" class=\"nav-link\" data-action=\"sidebar-nav\">Tagged Template Literals</a>\n        <a href=\"#modules\" class=\"nav-link\" data-action=\"sidebar-nav\">Modules</a>\n        <a href=\"#embedded\" class=\"nav-link\" data-action=\"sidebar-nav\">Embedded JavaScript</a>\n        <a href=\"#jsx\" class=\"nav-link\" data-action=\"sidebar-nav\">JSX</a>\n      </nav>\n    <a href=\"#type-annotations\" class=\"nav-link\" data-action=\"sidebar-nav\">Type Annotations</a>\n    <a href=\"#literate\" class=\"nav-link\" data-action=\"sidebar-nav\">Literate CoffeeScript</a>\n    <a href=\"#source-maps\" class=\"nav-link\" data-action=\"sidebar-nav\">Source Maps</a>\n    <a href=\"#cake\" class=\"nav-link\" data-action=\"sidebar-nav\">Cake, and Cakefiles</a>\n    <a href=\"#scripts\" class=\"nav-link\" data-action=\"sidebar-nav\"><code>\"text/coffeescript\"</code> Script Tags</a>\n    <a href=\"#integrations\" class=\"nav-link\" data-action=\"sidebar-nav\">Integrations</a>\n      <nav class=\"nav flex-column\">\n        <a href=\"#build-tools\" class=\"nav-link\" data-action=\"sidebar-nav\">Build Tools</a>\n        <a href=\"#code-editors\" class=\"nav-link\" data-action=\"sidebar-nav\">Code Editors</a>\n        <a href=\"#frameworks\" class=\"nav-link\" data-action=\"sidebar-nav\">Frameworks</a>\n        <a href=\"#linters-and-formatting\" class=\"nav-link\" data-action=\"sidebar-nav\">Linters and Formatting</a>\n        <a href=\"#testing\" class=\"nav-link\" data-action=\"sidebar-nav\">Testing</a>\n      </nav>\n    <a href=\"#resources\" class=\"nav-link\" data-action=\"sidebar-nav\">Resources</a>\n      <nav class=\"nav flex-column\">\n        <a href=\"#books\" class=\"nav-link\" data-action=\"sidebar-nav\">Books</a>\n        <a href=\"#screencasts\" class=\"nav-link\" data-action=\"sidebar-nav\">Screencasts</a>\n        <a href=\"#examples\" class=\"nav-link\" data-action=\"sidebar-nav\">Examples</a>\n        <a href=\"#chat\" class=\"nav-link\" data-action=\"sidebar-nav\">Chat</a>\n        <a href=\"#annotated-source\" class=\"nav-link\" data-action=\"sidebar-nav\">Annotated Source</a>\n        <a href=\"#contributing\" class=\"nav-link\" data-action=\"sidebar-nav\">Contributing</a>\n      </nav>\n    <a href=\"https://github.com/jashkenas/coffeescript/\" class=\"nav-item nav-link d-md-none\" data-action=\"sidebar-nav\">GitHub</a>\n    <a href=\"#unsupported\" class=\"nav-link\" data-action=\"sidebar-nav\">Unsupported ECMAScript Features</a>\n      <nav class=\"nav flex-column\">\n        <a href=\"#unsupported-let-const\" class=\"nav-link\" data-action=\"sidebar-nav\"><code>let</code> and <code>const</code></a>\n        <a href=\"#unsupported-named-functions\" class=\"nav-link\" data-action=\"sidebar-nav\">Named Functions and Function Declarations</a>\n        <a href=\"#unsupported-get-set\" class=\"nav-link\" data-action=\"sidebar-nav\"><code>get</code> and <code>set</code> Shorthand Syntax</a>\n      </nav>\n    <a href=\"#breaking-changes\" class=\"nav-link\" data-action=\"sidebar-nav\">Breaking Changes From 1.x</a>\n      <nav class=\"nav flex-column\">\n        <a href=\"#breaking-changes-fat-arrow\" class=\"nav-link\" data-action=\"sidebar-nav\">Bound (Fat Arrow) Functions</a>\n        <a href=\"#breaking-changes-default-values\" class=\"nav-link\" data-action=\"sidebar-nav\">Default Values</a>\n        <a href=\"#breaking-changes-bound-generator-functions\" class=\"nav-link\" data-action=\"sidebar-nav\">Bound Generator Functions</a>\n        <a href=\"#breaking-changes-classes\" class=\"nav-link\" data-action=\"sidebar-nav\">Classes</a>\n        <a href=\"#breaking-changes-super-this\" class=\"nav-link\" data-action=\"sidebar-nav\"><code>super</code> and <code>this</code></a>\n        <a href=\"#breaking-changes-super-extends\" class=\"nav-link\" data-action=\"sidebar-nav\"><code>super</code> and <code>extends</code></a>\n        <a href=\"#breaking-changes-jsx-and-the-less-than-and-greater-than-operators\" class=\"nav-link\" data-action=\"sidebar-nav\">JSX and the <code>&lt;</code> and <code>&gt;</code> Operators</a>\n        <a href=\"#breaking-changes-literate-coffeescript\" class=\"nav-link\" data-action=\"sidebar-nav\">Literate CoffeeScript Parsing</a>\n        <a href=\"#breaking-changes-argument-parsing-and-shebang-lines\" class=\"nav-link\" data-action=\"sidebar-nav\">Argument Parsing and <code>#!</code> Lines</a>\n      </nav>\n    <a href=\"#changelog\" class=\"nav-link\" data-action=\"sidebar-nav\">Changelog</a>\n    <a href=\"test.html\" class=\"nav-link\" data-action=\"sidebar-nav\">Browser-Based Tests</a>\n    <a href=\"/v1/\" class=\"nav-link\" data-action=\"sidebar-nav\">Version 1.x Documentation</a>\n  </nav>\n</nav>\n\n    </nav>\n    <main class=\"main\">\n      <header class=\"d-none d-lg-block\">\n        <p class=\"title-logo\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-22 347 566 100\">\n  <title>\n    CoffeeScript Logo\n  </title>\n  <path d=\"M21.7 351.1c.1.6-.2 1.1-1.2 1.6-1.3-.7-4.1-1.1-6.4-.9-2.5.2-4.6 1-4.3 2.7.4 1.7 2.8 2.7 7.1 2.3 10.5-.9 10.4-8 25.8-9.4 12-1.1 18.7 2.6 19.6 7.1.7 3.5-2.2 6.9-10.9 7.6-7.7.7-12.2-1.4-12.6-3.5-.2-1.1.4-2.7 4.1-3.1.4 1.7 2.5 3.5 7.5 3 3.6-.3 6.6-1.6 6.2-3.6-.4-2.1-4.2-3.3-10.2-2.8-12.2 1.1-15.2 7.8-25.6 8.7-7.4.7-13.4-2-14.2-6-.3-1.5-.3-5 7.5-5.7 4-.3 7.2.4 7.6 2zm-39 41.8c-3.4 4.3-4.9 9.3-4.6 14.2.3 4.9 2.7 8.9 6.5 12 4 3.1 8.3 4 13.2 3.1 1.9-.3 4-1.3 5.9-1.9-4 0-7.4-1.3-10.8-4-3.7-2.7-6.2-6.5-6.8-11.1-.9-4.3 0-8.3 2.4-11.8 2.7-3.4 6.2-5.3 10.8-5.9 4.6-.3 8.6.9 12.6 3.7-.9-1.3-2.2-2.2-3.4-3.4-4-2.7-8.3-4-13.6-2.7-4.8 1-8.8 3.5-12.2 7.8zm53.6-23.1c-12.9 0-24.4-1.3-32.7-3.1-8.9-2.2-13.6-4.6-13.6-7.7 0-1.3.6-2.4 2.4-3.7-5.6 2.2-8.6 4-8.6 6.8.3 3.1 5.3 6.2 15.5 8.6 9.6 2.4 21.9 3.7 36.7 3.7 15.1 0 27.1-1.3 36.7-3.7 10.2-2.4 15.1-5.6 15.1-8.6 0-2.2-2.2-4.3-6.2-5.9.9.6 1.6 1.6 1.6 2.7 0 3.1-4.6 5.6-13.9 7.7-8.6 1.9-19.6 3.2-33 3.2zm36.8 8.6c-9.6 2.2-21.9 3.7-36.7 3.7-15.1 0-27.4-1.6-37-3.7-8.6-2.2-13.2-4.6-14.8-7.1 1.6 10.8 5.3 21 10.2 30 3.7 5.6 7.4 10.5 11.1 15.8 1.6 3.1 2.7 6.2 3.4 9.3 2.4 3.4 5.9 5.6 10.2 6.8 5.3 1.9 10.8 2.7 16.4 2.4h.6c5.6.3 11.5-.6 16.9-2.4 4-1.3 7.4-3.4 9.9-6.8h.3c.6-3.1 1.6-6.2 3.1-9.3 3.7-5.3 7.4-10.2 11.1-15.8 4.9-8.9 8.3-19.1 10.2-30-2 2.8-6.6 5.2-14.9 7.1zm106.2 30.1c-4.8 12.1-17.6 16.9-25.9 16.9-13.4 0-19.9-6-19.9-22.3 0-16.5 7.9-47.3 31.7-47.3 8.5 0 15.2 3.3 15.2 12.1 0 4.8-1.8 8.3-6.4 8.3-1.5 0-3.4-.4-5.2-2.4 2.2-1.1 4.2-4.9 4.2-8.3 0-2.9-1.5-5.6-5.6-5.6-10 0-18.9 23.9-18.9 42.4 0 8.3 2.2 14.2 10.9 14.2 7.1 0 13.5-3.4 17.7-9.1l2.2 1.1zm32.9-16.3c.4.2.7.2 1 .2 4.2 0 10.1-2.7 14-5.5l.8 2.4c-3.4 3.7-9.5 6.5-16.1 7.5-1.5 16.8-10.6 27.3-21.7 27.3-8.4 0-14.5-4-14.5-14.4 0-10.5 6.2-32.2 24.9-32.2 7.8.3 11.6 5.3 11.6 14.7zm-7.7 5c-1.9-.5-2.4-2-2.4-3.8 0-2.5 1.2-4.2 2.8-4.9-.2-3.8-1.1-5.3-3.4-5.3-6.5 0-12 16.6-12 25.6 0 6 1.2 7.3 4.6 7.3 4.2.1 8.9-8 10.4-18.9zm-6.6 39.7c0-8.3 7.1-11 15.8-13.6l10.9-51.9c2.7-13 10.6-15.5 16.5-15.5 4.1 0 8 2.2 9.7 5.7 3.6-4.6 8.4-5.7 12.4-5.7 5.6 0 10.8 3.9 10.8 9.8 0 1.5-.1 2.6-.3 3.7h-4.3c.1-.9.2-1.7.2-2.4 0-2.1-1.7-3.1-3.4-3.1-2 0-4.8 1.1-6.2 7.1l-1.7 7.4h9.1l-.8 3.6h-9l-10.3 49.1c-2.7 13-10.6 15.5-16.5 15.5-5.2 0-8.3-2.3-9.8-5.7-3.5 4.6-8.3 5.7-12.3 5.7-5.6.1-10.8-3.8-10.8-9.7zm9.1 1.8c1.9 0 4.2-1.8 5.4-7.1l1.1-5.3c-5.7 2-10.1 4.4-10.1 9.4 0 1.2 1.7 3 3.6 3zm21.7 0c1.9 0 4.2-1.8 5.4-7.1l2.2-10.4-9.4 1.8-1.8 8.3c-.5 2.1-1.1 4-1.8 5.6.9 1.3 3 1.8 5.4 1.8zm-1.4-18l9.4-1.7 7.7-36.8h-9l-8.1 38.5zm16.6-56.7c-2 0-4.8 1.1-6.2 7.1l-1.7 7.4h9l2.1-9.5c.2-.7.2-1.3.2-2 .1-2-1.5-3-3.4-3zm37.9 53c7.1 0 11.6-4 16.1-9.2h3.1c-5.2 8.3-12.9 16.8-25 16.8-8.5 0-14.2-4.2-14.2-14.5 0-10.5 5.9-32.3 24.6-32.3 8.1 0 10 4.2 10 8.7 0 10.5-10 18.5-20.9 19.2-.1 1.3-.2 2.5-.2 3.6 0 6.2 2.2 7.7 6.5 7.7zm5.3-34.4c-4.6 0-9.1 9.7-10.9 18.7 7-.5 13.2-7.4 13.2-15 0-2.2-.5-3.7-2.3-3.7zm28.6 33.4c3.4 0 7.8-2.3 10.8-4.8-2 10.4-8.4 13.4-15.8 13.4-8.4 0-14.1-4.2-14.1-14.5 0-10.5 5.9-32.3 24.6-32.3 8.1 0 10 4.2 10 8.7 0 10.6-10 18.5-20.9 19.2-.1.9-.2 2-.2 2.7 0 5.7 2.5 7.6 5.6 7.6zm6.2-33.4c-4.5 0-9.1 10.1-11 18.7 7.1-.4 13.3-7.3 13.3-15 0-2.2-.6-3.7-2.3-3.7zm51.3-6.7c-1.7 0-3-.6-4.2-1.9 2.4-1.5 4.1-4.8 4.1-7.8 0-3.1-1.8-6.1-6.8-6.1s-8.3 2.8-8.3 8.2c0 13.3 20.5 15.2 20.5 34.8 0 15.3-12.3 22.7-25.6 22.7-10.4 0-19.3-4.5-19.3-15.7 0-9.8 7-14.9 13.3-14.9 3.1 0 7.7 1.3 8 6-4.9 0-10.7 2.3-10.7 8.5 0 4.5 2.9 8.7 8.7 8.7 6.1 0 10.6-4.4 10.6-12 0-15.6-18.6-21.1-18.6-34.5 0-9.5 9.3-16.3 21-16.3 4.3 0 14.6.9 14.6 10.9.1 5.5-2.8 9.4-7.3 9.4zm36.2 10.3c0-2.3-.8-3.7-2.5-3.7-5.7 0-11.7 16.6-11.7 26.7 0 6.2 2.2 7.6 6.6 7.6 7.1 0 11.6-4 16.1-9.2h3.1c-5.2 8.3-12.9 16.8-25 16.8-8.5 0-14.2-4.2-14.2-14.5 0-10.6 6-32.3 24.5-32.3 8.1 0 10.1 4.2 10.1 8.3 0 4.4-2.2 6.7-4.8 6.7-1 0-2.1-.4-3.1-1.1.5-1.9.9-3.6.9-5.3zm27.7-7.6l-1.2 5.7c3.1-2.7 6.7-5.7 11-5.7 4.1 0 6.3 3.3 6.3 6.9 0 3.1-2.1 6.7-6.6 6.7-5.1 0-2.5-6-5.3-6-2.7 0-4.4 1.4-6.7 3.4l-7.2 34.6h-13.1l9.6-45.4 13.2-.2zm34.2 0l-6.6 30.9c-.3 1.2-.4 2.1-.4 2.9 0 2.5 1.2 3.3 3.7 3.3 3.5 0 6.9-3.4 8.1-8h3.8c-5.2 14.8-14.2 16.8-19.1 16.8-5.5 0-9.7-3.2-9.7-10.9 0-1.8.3-3.7.7-5.9l6.2-29.2 13.3.1zm-4.1-19.4c4 0 7.2 3.2 7.2 7.2s-3.2 7.1-7.2 7.1-7.1-3.1-7.1-7.1c-.1-4 3.2-7.2 7.1-7.2zm29.1 16l-1.5 6.9c2.6-2.3 6.1-3.9 10.7-3.9 6.2 0 11.1 3.5 11.1 14.4 0 12.2-4.7 32.1-22.3 32.1-4.5 0-6.8-1.6-7.7-3.2l-4.7 22.1-13.7 3.2 15.2-71.5 12.9-.1zm7.8 17c0-7-2.9-7.5-4.5-7.5-2 0-4.5 1.6-6.3 4.4l-5.4 25.5c.4 1 1.4 2.1 3.4 2.1 9.7 0 12.8-15.9 12.8-24.5zm27.8 17.3c-.3 1.1-.5 2.2-.5 3.1 0 1.9.7 3.2 3.1 3.2.7 0 1.7 0 2.4-.3-2.5 7.8-6.6 8.9-9.6 8.9-6.4 0-9.1-4.4-9.1-10.3 0-1.6.2-3.1.6-4.8l5.8-27.2h-3l.7-3.6h3L528 366l13.4-1.9s-1.4 6.2-3.1 14.4h5.5l-.7 3.6h-5.5l-5.7 27.4z\"></path>\n</svg>\n\n        </p>\n      </header>\n      <section id=\"introduction\">\n        <p><strong>CoffeeScript is a little language that compiles into JavaScript.</strong> Underneath that awkward Java-esque patina, JavaScript has always had a gorgeous heart. CoffeeScript is an attempt to expose the good parts of JavaScript in a simple way.</p>\n<p>The golden rule of CoffeeScript is: <em>“It’s just JavaScript.”</em> The code compiles one-to-one into the equivalent JS, and there is no interpretation at runtime. You can use any existing JavaScript library seamlessly from CoffeeScript (and vice-versa). The compiled output is readable, pretty-printed, and tends to run as fast or faster than the equivalent handwritten JavaScript.</p>\n<p><strong>Latest Version:</strong> <a href=\"https://github.com/jashkenas/coffeescript/tarball/2.7.0\">2.7.0</a></p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\"><span class=\"comment\"># Install locally for a project:</span>\nnpm install --save-dev coffeescript\n\n<span class=\"comment\"># Install globally to execute .coffee files anywhere:</span>\nnpm install --global coffeescript\n</code></pre>\n</blockquote>\n      </section>\n      <section id=\"overview\">\n        <h2>Overview</h2>\n<p><em>CoffeeScript on the <span class=\"d-md-none\">top</span><span class=\"d-none d-md-inline\">left</span>, compiled JavaScript output on the <span class=\"d-md-none\">bottom</span><span class=\"d-none d-md-inline\">right</span>. The CoffeeScript is editable!</em></p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"overview\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"overview-coffee\"># Assignment:\nnumber   = 42\nopposite = true\n\n# Conditions:\nnumber = -42 if opposite\n\n# Functions:\nsquare = (x) -> x * x\n\n# Arrays:\nlist = [1, 2, 3, 4, 5]\n\n# Objects:\nmath =\n  root:   Math.sqrt\n  square: square\n  cube:   (x) -> x * square x\n\n# Splats:\nrace = (winner, runners...) ->\n  print winner, runners\n\n# Existence:\nalert \"I knew it!\" if elvis?\n\n# Array comprehensions:\ncubes = (math.cube num for num in list)\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\"># Assignment:</span>\n<span class=\"cm-variable\">number</span>   <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">42</span>\n<span class=\"cm-variable\">opposite</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-atom\">true</span>\n\n<span class=\"cm-comment\"># Conditions:</span>\n<span class=\"cm-variable\">number</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">-42</span> <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">opposite</span>\n\n<span class=\"cm-comment\"># Functions:</span>\n<span class=\"cm-variable\">square</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">x</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span> <span class=\"cm-variable\">x</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable\">x</span>\n\n<span class=\"cm-comment\"># Arrays:</span>\n<span class=\"cm-variable\">list</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-number\">1</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">2</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">3</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">4</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">5</span><span class=\"cm-punctuation\">]</span>\n\n<span class=\"cm-comment\"># Objects:</span>\n<span class=\"cm-variable\">math</span> <span class=\"cm-punctuation\">=</span>\n<span class=\"cm-indent\">  </span><span class=\"cm-variable\">root</span><span class=\"cm-punctuation\">:</span>   <span class=\"cm-variable\">Math</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">sqrt</span>\n  <span class=\"cm-variable\">square</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-variable\">square</span>\n  <span class=\"cm-variable\">cube</span><span class=\"cm-punctuation\">:</span>   <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">x</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span> <span class=\"cm-variable\">x</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable\">square</span> <span class=\"cm-variable\">x</span>\n\n<span class=\"cm-comment\"># Splats:</span>\n<span class=\"cm-variable\">race</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">winner</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">runners</span><span class=\"cm-punctuation\">...)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">print</span> <span class=\"cm-variable\">winner</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">runners</span>\n\n<span class=\"cm-comment\"># Existence:</span>\n<span class=\"cm-variable\">alert</span> <span class=\"cm-string\">\"I knew it!\"</span> <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">elvis</span><span class=\"cm-operator\">?</span>\n\n<span class=\"cm-comment\"># Array comprehensions:</span>\n<span class=\"cm-variable\">cubes</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">math</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">cube</span> <span class=\"cm-variable\">num</span> <span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">num</span> <span class=\"cm-operator\">in</span> <span class=\"cm-variable\">list</span><span class=\"cm-punctuation\">)</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"overview-js\">// Assignment:\nvar cubes, list, math, num, number, opposite, race, square;\n\nnumber = 42;\n\nopposite = true;\n\nif (opposite) {\n  // Conditions:\n  number = -42;\n}\n\n// Functions:\nsquare = function(x) {\n  return x * x;\n};\n\n// Arrays:\nlist = [1, 2, 3, 4, 5];\n\n// Objects:\nmath = {\n  root: Math.sqrt,\n  square: square,\n  cube: function(x) {\n    return x * square(x);\n  }\n};\n\n// Splats:\nrace = function(winner, ...runners) {\n  return print(winner, runners);\n};\n\nif (typeof elvis !== \"undefined\" && elvis !== null) {\n  // Existence:\n  alert(\"I knew it!\");\n}\n\n// Array comprehensions:\ncubes = (function() {\n  var i, len, results;\n  results = [];\n  for (i = 0, len = list.length; i < len; i++) {\n    num = list[i];\n    results.push(math.cube(num));\n  }\n  return results;\n})();\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\">// Assignment:</span>\n<span class=\"cm-keyword\">var</span> <span class=\"cm-def\">cubes</span>, <span class=\"cm-def\">list</span>, <span class=\"cm-def\">math</span>, <span class=\"cm-def\">num</span>, <span class=\"cm-def\">number</span>, <span class=\"cm-def\">opposite</span>, <span class=\"cm-def\">race</span>, <span class=\"cm-def\">square</span>;\n\n<span class=\"cm-variable\">number</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">42</span>;\n\n<span class=\"cm-variable\">opposite</span> <span class=\"cm-operator\">=</span> <span class=\"cm-atom\">true</span>;\n\n<span class=\"cm-keyword\">if</span> (<span class=\"cm-variable\">opposite</span>) {\n  <span class=\"cm-comment\">// Conditions:</span>\n  <span class=\"cm-variable\">number</span> <span class=\"cm-operator\">=</span> <span class=\"cm-operator\">-</span><span class=\"cm-number\">42</span>;\n}\n\n<span class=\"cm-comment\">// Functions:</span>\n<span class=\"cm-variable\">square</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">x</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">x</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable-2\">x</span>;\n};\n\n<span class=\"cm-comment\">// Arrays:</span>\n<span class=\"cm-variable\">list</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-number\">1</span>, <span class=\"cm-number\">2</span>, <span class=\"cm-number\">3</span>, <span class=\"cm-number\">4</span>, <span class=\"cm-number\">5</span>];\n\n<span class=\"cm-comment\">// Objects:</span>\n<span class=\"cm-variable\">math</span> <span class=\"cm-operator\">=</span> {\n  <span class=\"cm-property\">root</span>: <span class=\"cm-variable\">Math</span>.<span class=\"cm-property\">sqrt</span>,\n  <span class=\"cm-property\">square</span>: <span class=\"cm-variable\">square</span>,\n  <span class=\"cm-property\">cube</span>: <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">x</span>) {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">x</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable\">square</span>(<span class=\"cm-variable-2\">x</span>);\n  }\n};\n\n<span class=\"cm-comment\">// Splats:</span>\n<span class=\"cm-variable\">race</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">winner</span>, <span class=\"cm-meta\">...</span><span class=\"cm-def\">runners</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">print</span>(<span class=\"cm-variable-2\">winner</span>, <span class=\"cm-variable-2\">runners</span>);\n};\n\n<span class=\"cm-keyword\">if</span> (<span class=\"cm-keyword\">typeof</span> <span class=\"cm-variable\">elvis</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-string\">\"undefined\"</span> <span class=\"cm-operator\">&amp;&amp;</span> <span class=\"cm-variable\">elvis</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-atom\">null</span>) {\n  <span class=\"cm-comment\">// Existence:</span>\n  <span class=\"cm-variable\">alert</span>(<span class=\"cm-string\">\"I knew it!\"</span>);\n}\n\n<span class=\"cm-comment\">// Array comprehensions:</span>\n<span class=\"cm-variable\">cubes</span> <span class=\"cm-operator\">=</span> (<span class=\"cm-keyword\">function</span>() {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">i</span>, <span class=\"cm-def\">len</span>, <span class=\"cm-def\">results</span>;\n  <span class=\"cm-variable-2\">results</span> <span class=\"cm-operator\">=</span> [];\n  <span class=\"cm-keyword\">for</span> (<span class=\"cm-variable-2\">i</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">0</span>, <span class=\"cm-variable-2\">len</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">list</span>.<span class=\"cm-property\">length</span>; <span class=\"cm-variable-2\">i</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-variable-2\">len</span>; <span class=\"cm-variable-2\">i</span><span class=\"cm-operator\">++</span>) {\n    <span class=\"cm-variable\">num</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">list</span>[<span class=\"cm-variable-2\">i</span>];\n    <span class=\"cm-variable-2\">results</span>.<span class=\"cm-property\">push</span>(<span class=\"cm-variable\">math</span>.<span class=\"cm-property\">cube</span>(<span class=\"cm-variable\">num</span>));\n  }\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">results</span>;\n})();\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"overview\" data-run=\"cubes\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>cubes</button>\n    </div>\n  </div>\n  \n</aside>\n\n      </section>\n      <section id=\"coffeescript-2\">\n        <h2>CoffeeScript 2</h2>\n\n        <section id=\"whats-new-in-coffeescript-2\">\n          <h3>What’s New In CoffeeScript 2?</h3>\n<p>The biggest change in CoffeeScript 2 is that now the CoffeeScript compiler produces modern JavaScript syntax (ES6, or ES2015 and later). A CoffeeScript <code>=&gt;</code> becomes a JS <code>=&gt;</code>, a CoffeeScript <code>class</code> becomes a JS <code>class</code> and so on. Major new features in CoffeeScript 2 include <a href=\"#async-functions\">async functions</a> and <a href=\"#jsx\">JSX</a>. You can read more in the <a href=\"announcing-coffeescript-2/\">announcement</a>.</p>\n<p>There are very few <a href=\"#breaking-changes\">breaking changes from CoffeeScript 1.x to 2</a>; we hope the upgrade process is smooth for most projects.</p>\n\n        </section>\n        <section id=\"compatibility\">\n          <h3>Compatibility</h3>\n<p>Most modern JavaScript features that CoffeeScript supports can run natively in Node 7.6+, meaning that Node can run CoffeeScript’s output without any further processing required. Here are some notable exceptions:</p>\n<ul>\n<li><a href=\"#jsx\">JSX</a> always requires transpilation.</li>\n<li><a href=\"https://coffeescript.org/#splats\">Splats, a.k.a. object rest/spread syntax, for objects</a> are supported by Node 8.6+.</li>\n<li>The <a href=\"https://github.com/tc39/proposal-regexp-dotall-flag\">regular expression <code>s</code> (dotall) flag</a> is supported by Node 9+.</li>\n<li><a href=\"https://github.com/tc39/proposal-async-iteration\">Async generator functions</a> are supported by Node 10+.</li>\n<li><a href=\"#modules\">Modules</a> are supported by Node 12+ with <code>&quot;type&quot;: &quot;module&quot;</code> in your project’s <code>package.json</code>.</li>\n</ul>\n<p>This list may be incomplete, and excludes versions of Node that support newer features behind flags; please refer to <a href=\"http://node.green/\">node.green</a> for full details. You can <a href=\"test.html\">run the tests in your browser</a> to see what your browser supports. It is your responsibility to ensure that your runtime supports the modern features you use; or that you <a href=\"#transpilation\">transpile</a> your code. When in doubt, transpile.</p>\n<p>For compatibility with other JavaScript frameworks and tools, see <a href=\"#integrations\">Integrations</a>.</p>\n\n        </section>\n      </section>\n      <section id=\"installation\">\n        <h2>Installation</h2>\n<p>The command-line version of <code>coffee</code> is available as a <a href=\"https://nodejs.org/\">Node.js</a> utility, requiring Node 6 or later. The <a href=\"/v2/browser-compiler-modern/coffeescript.js\">core compiler</a> however, does not depend on Node, and can be run in any JavaScript environment, or in the browser (see <a href=\"#try\">Try CoffeeScript</a>).</p>\n<p>To install, first make sure you have a working copy of the latest stable version of <a href=\"https://nodejs.org/\">Node.js</a>. You can then install CoffeeScript globally with <a href=\"https://www.npmjs.com/\">npm</a>:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\">npm install --global coffeescript\n</code></pre>\n</blockquote><p>This will make the <code>coffee</code> and <code>cake</code> commands available globally.</p>\n<p>If you are using CoffeeScript in a project, you should install it locally for that project so that the version of CoffeeScript is tracked as one of your project’s dependencies. Within that project’s folder:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\">npm install --save-dev coffeescript\n</code></pre>\n</blockquote><p>The <code>coffee</code> and <code>cake</code> commands will first look in the current folder to see if CoffeeScript is installed locally, and use that version if so. This allows different versions of CoffeeScript to be installed globally and locally.</p>\n<p>If you plan to use the <code>--transpile</code> option (see <a href=\"#transpilation\">Transpilation</a>) you will need to also install <code>@babel/core</code> either globally or locally, depending on whether you are running a globally or locally installed version of CoffeeScript.</p>\n\n      </section>\n      <section id=\"usage\">\n        <h2>Usage</h2>\n\n        <section id=\"cli\">\n          <h3>Command Line</h3>\n<p>Once installed, you should have access to the <code>coffee</code> command, which can execute scripts, compile <code>.coffee</code> files into <code>.js</code>, and provide an interactive REPL. The <code>coffee</code> command takes the following options:</p>\n<table>\n<thead>\n<tr>\n<th>Option</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>-c, --compile</code></td>\n<td>Compile a <code>.coffee</code> script into a <code>.js</code> JavaScript file of the same name.</td>\n</tr>\n<tr>\n<td><code>-t, --transpile</code></td>\n<td>Pipe the CoffeeScript compiler’s output through Babel before saving or running the generated JavaScript. Requires <code>@babel/core</code> to be installed, and options to pass to Babel in a <code>.babelrc</code> file or a <code>package.json</code> with a <code>babel</code> key in the path of the file or folder to be compiled. See <a href=\"#transpilation\">Transpilation</a>.</td>\n</tr>\n<tr>\n<td><code>-m, --map</code></td>\n<td>Generate source maps alongside the compiled JavaScript files. Adds <code>sourceMappingURL</code> directives to the JavaScript as well.</td>\n</tr>\n<tr>\n<td><code>-M, --inline-map</code></td>\n<td>Just like <code>--map</code>, but include the source map directly in the compiled JavaScript files, rather than in a separate file.</td>\n</tr>\n<tr>\n<td><code>-i, --interactive</code></td>\n<td>Launch an interactive CoffeeScript session to try short snippets. Identical to calling <code>coffee</code> with no arguments.</td>\n</tr>\n<tr>\n<td><code>-o, --output [DIR]</code></td>\n<td>Write out all compiled JavaScript files into the specified directory. Use in conjunction with <code>--compile</code> or <code>--watch</code>.</td>\n</tr>\n<tr>\n<td><code>-w, --watch</code></td>\n<td>Watch files for changes, rerunning the specified command when any file is updated.</td>\n</tr>\n<tr>\n<td><code>-p, --print</code></td>\n<td>Instead of writing out the JavaScript as a file, print it directly to <strong>stdout</strong>.</td>\n</tr>\n<tr>\n<td><code>-s, --stdio</code></td>\n<td>Pipe in CoffeeScript to STDIN and get back JavaScript over STDOUT. Good for use with processes written in other languages. An example:<br><code>cat src/cake.coffee | coffee -sc</code></td>\n</tr>\n<tr>\n<td><code>-l, --literate</code></td>\n<td>Parses the code as Literate CoffeeScript. You only need to specify this when passing in code directly over <strong>stdio</strong>, or using some sort of extension-less file name.</td>\n</tr>\n<tr>\n<td><code>-e, --eval</code></td>\n<td>Compile and print a little snippet of CoffeeScript directly from the command line. For example:<br><code>coffee -e &quot;console.log num for num in [10..1]&quot;</code></td>\n</tr>\n<tr>\n<td><code>-r, --require [MODULE]</code> </td>\n<td><code>require()</code> the given module before starting the REPL or evaluating the code given with the <code>--eval</code> flag.</td>\n</tr>\n<tr>\n<td><code>-b, --bare</code></td>\n<td>Compile the JavaScript without the <a href=\"#lexical-scope\">top-level function safety wrapper</a>.</td>\n</tr>\n<tr>\n<td><code>--no-header</code></td>\n<td>Suppress the “Generated by CoffeeScript” header.</td>\n</tr>\n<tr>\n<td><code>--nodejs</code></td>\n<td>The <code>node</code> executable has some useful options you can set, such as <code>--debug</code>, <code>--debug-brk</code>, <code>--max-stack-size</code>, and <code>--expose-gc</code>. Use this flag to forward options directly to Node.js. To pass multiple flags, use <code>--nodejs</code> multiple times.</td>\n</tr>\n<tr>\n<td><code>--ast</code></td>\n<td>Generate an abstract syntax tree of nodes of the CoffeeScript. Used for integrating with JavaScript build tools.</td>\n</tr>\n<tr>\n<td><code>--tokens</code></td>\n<td>Instead of parsing the CoffeeScript, just lex it, and print out the token stream. Used for debugging the compiler.</td>\n</tr>\n<tr>\n<td><code>-n, --nodes</code></td>\n<td>Instead of compiling the CoffeeScript, just lex and parse it, and print out the parse tree. Used for debugging the compiler.</td>\n</tr>\n</tbody>\n</table>\n<h4>Examples:</h4>\n<ul>\n<li>Compile a directory tree of <code>.coffee</code> files in <code>src</code> into a parallel tree of <code>.js</code> files in <code>lib</code>:<br>\n<code>coffee --compile --output lib/ src/</code></li>\n<li>Watch a file for changes, and recompile it every time the file is saved:<br>\n<code>coffee --watch --compile experimental.coffee</code></li>\n<li>Concatenate a list of files into a single script:<br>\n<code>coffee --join project.js --compile src/*.coffee</code></li>\n<li>Print out the compiled JS from a one-liner:<br>\n<code>coffee -bpe &quot;alert i for i in [0..10]&quot;</code></li>\n<li>All together now, watch and recompile an entire project as you work on it:<br>\n<code>coffee -o lib/ -cw src/</code></li>\n<li>Start the CoffeeScript REPL (<code>Ctrl-D</code> to exit, <code>Ctrl-V</code>for multi-line):<br>\n<code>coffee</code></li>\n</ul>\n<p>To use <code>--transpile</code>, see <a href=\"#transpilation\">Transpilation</a>.</p>\n\n        </section>\n        <section id=\"nodejs-usage\">\n          <h3>Node.js</h3>\n<p>If you’d like to use Node.js’ CommonJS to <code>require</code> CoffeeScript files, e.g. <code>require './app.coffee'</code>, you must first “register” CoffeeScript as an extension:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-coffee\"><span class=\"built_in\">require</span> <span class=\"string\">&#x27;coffeescript/register&#x27;</span>\n\nApp = <span class=\"built_in\">require</span> <span class=\"string\">&#x27;./app&#x27;</span> <span class=\"comment\"># The .coffee extension is optional</span>\n</code></pre>\n</blockquote><p>If you want to use the compiler’s API, for example to make an app that compiles strings of CoffeeScript on the fly, you can <code>require</code> the full module:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-coffee\">CoffeeScript = <span class=\"built_in\">require</span> <span class=\"string\">&#x27;coffeescript&#x27;</span>\n\n<span class=\"built_in\">eval</span> CoffeeScript.compile <span class=\"string\">&#x27;console.log &quot;Mmmmm, I could really go for some #{Math.pi}&quot;&#x27;</span>\n</code></pre>\n</blockquote><p>The <code>compile</code> method has the signature <code>compile(code, options)</code> where <code>code</code> is a string of CoffeeScript code, and the optional <code>options</code> is an object with some or all of the following properties:</p>\n<ul>\n<li><code>options.sourceMap</code>, boolean: if true, a source map will be generated; and instead of returning a string, <code>compile</code> will return an object of the form <code>{js, v3SourceMap, sourceMap}</code>.</li>\n<li><code>options.inlineMap</code>, boolean: if true, output the source map as a base64-encoded string in a comment at the bottom.</li>\n<li><code>options.filename</code>, string: the filename to use for the source map. It can include a path (relative or absolute).</li>\n<li><code>options.bare</code>, boolean: if true, output without the <a href=\"#lexical-scope\">top-level function safety wrapper</a>.</li>\n<li><code>options.header</code>, boolean: if true, output the <code>Generated by CoffeeScript</code> header.</li>\n<li><code>options.transpile</code>, <strong>object</strong>: if set, this must be an object with the <a href=\"http://babeljs.io/docs/usage/api/#options\">options to pass to Babel</a>. See <a href=\"#transpilation\">Transpilation</a>.</li>\n<li><code>options.ast</code>, boolean: if true, return an abstract syntax tree of the input CoffeeScript source code.</li>\n</ul>\n\n        </section>\n        <section id=\"transpilation\">\n          <h3>Transpilation</h3>\n<p>CoffeeScript 2 generates JavaScript that uses the latest, modern syntax. The runtime or browsers where you want your code to run <a href=\"#compatibility\">might not support all of that syntax</a>. In that case, we want to convert modern JavaScript into older JavaScript that will run in older versions of Node or older browsers; for example, <code>{ a } = obj</code> into <code>a = obj.a</code>. This is done via transpilers like <a href=\"http://babeljs.io/\">Babel</a>, <a href=\"https://buble.surge.sh/\">Bublé</a> or <a href=\"https://github.com/google/traceur-compiler\">Traceur Compiler</a>. See <a href=\"#build-tools\">Build Tools</a>.</p>\n<h4>Quickstart</h4>\n<p>From the root of your project:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\">npm install --save-dev @babel/core @babel/preset-env\n<span class=\"built_in\">echo</span> <span class=\"string\">&#x27;{ &quot;presets&quot;: [&quot;@babel/env&quot;] }&#x27;</span> &gt; .babelrc\ncoffee --compile --transpile --inline-map some-file.coffee\n</code></pre>\n</blockquote><h4>Transpiling with the CoffeeScript compiler</h4>\n<p>To make things easy, CoffeeScript has built-in support for the popular <a href=\"http://babeljs.io/\">Babel</a> transpiler. You can use it via the <code>--transpile</code> command-line option or the <code>transpile</code> Node API option. To use either, <code>@babel/core</code> must be installed in your project:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\">npm install --save-dev @babel/core\n</code></pre>\n</blockquote><p>Or if you’re running the <code>coffee</code> command outside of a project folder, using a globally-installed <code>coffeescript</code> module, <code>@babel/core</code> needs to be installed globally:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\">npm install --global @babel/core\n</code></pre>\n</blockquote><p>By default, Babel doesn’t do anything—it doesn’t make assumptions about what you want to transpile to. You need to provide it with a configuration so that it knows what to do. One way to do this is by creating a <a href=\"https://babeljs.io/docs/usage/babelrc/\"><code>.babelrc</code> file</a> in the folder containing the files you’re compiling, or in any parent folder up the path above those files. (Babel supports <a href=\"https://babeljs.io/docs/usage/babelrc/\">other ways</a>, too.) A minimal <code>.babelrc</code> file would be just <code>{ &quot;presets&quot;: [&quot;@babel/env&quot;] }</code>. This implies that you have installed <a href=\"https://babeljs.io/docs/plugins/preset-env/\"><code>@babel/preset-env</code></a>:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\">npm install --save-dev @babel/preset-env  <span class=\"comment\"># Or --global for non-project-based usage</span>\n</code></pre>\n</blockquote><p>See <a href=\"https://babeljs.io/docs/plugins/\">Babel’s website to learn about presets and plugins</a> and the multitude of options you have. Another preset you might need is <a href=\"https://babeljs.io/docs/en/babel-plugin-transform-react-jsx/\"><code>@babel/plugin-transform-react-jsx</code></a> if you’re using JSX with React (JSX can also be used with other frameworks).</p>\n<p>Once you have <code>@babel/core</code> and <code>@babel/preset-env</code> (or other presets or plugins) installed, and a <code>.babelrc</code> file (or other equivalent) in place, you can use <code>coffee --transpile</code> to pipe CoffeeScript’s output through Babel using the options you’ve saved.</p>\n<p>If you’re using CoffeeScript via the <a href=\"nodejs_usage\">Node API</a>, where you call <code>CoffeeScript.compile</code> with a string to be compiled and an <code>options</code> object, the <code>transpile</code> key of the <code>options</code> object should be the Babel options:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-js\"><span class=\"title class_\">CoffeeScript</span>.<span class=\"title function_\">compile</span>(code, {<span class=\"attr\">transpile</span>: {<span class=\"attr\">presets</span>: [<span class=\"string\">&#x27;@babel/env&#x27;</span>]}})\n</code></pre>\n</blockquote><p>You can also transpile CoffeeScript’s output without using the <code>transpile</code> option, for example as part of a build chain. This lets you use transpilers other than Babel, and it gives you greater control over the process. There are many great task runners for setting up JavaScript build chains, such as <a href=\"http://gulpjs.com/\">Gulp</a>, <a href=\"https://webpack.github.io/\">Webpack</a>, <a href=\"https://gruntjs.com/\">Grunt</a> and <a href=\"http://broccolijs.com/\">Broccoli</a>.</p>\n<h4>Polyfills</h4>\n<p>Note that transpiling doesn’t automatically supply <a href=\"https://developer.mozilla.org/en-US/docs/Glossary/Polyfill\">polyfills</a> for your code. CoffeeScript itself will output <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf\"><code>Array.indexOf</code></a> if you use the <code>in</code> operator, or destructuring or spread/rest syntax; and <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind\"><code>Function.bind</code></a> if you use a bound (<code>=&gt;</code>) method in a class. Both are supported in Internet Explorer 9+ and all more recent browsers, but you will need to supply polyfills if you need to support Internet Explorer 8 or below and are using features that would cause these methods to be output. You’ll also need to supply polyfills if your own code uses these methods or another method added in recent versions of JavaScript. One polyfill option is <a href=\"https://babeljs.io/docs/en/babel-polyfill/\"><code>@babel/polyfill</code></a>, though there are many <a href=\"https://hackernoon.com/polyfills-everything-you-ever-wanted-to-know-or-maybe-a-bit-less-7c8de164e423\">other</a> <a href=\"https://philipwalton.com/articles/loading-polyfills-only-when-needed/\">strategies</a>.</p>\n\n        </section>\n      </section>\n      <section id=\"language\">\n        <h2>Language Reference</h2>\n<p><em>This reference is structured so that it can be read from top to bottom, if you like. Later sections use ideas and syntax previously introduced. Familiarity with JavaScript is assumed. In all of the following examples, the source CoffeeScript is provided on the left, and the direct compilation into JavaScript is on the right.</em></p>\n<p><em>Many of the examples can be run (where it makes sense) by pressing the</em> <small>▶</small> <em>button on the right. The CoffeeScript on the left is editable, and the JavaScript will update as you edit.</em></p>\n<p>First, the basics: CoffeeScript uses significant whitespace to delimit blocks of code. You don’t need to use semicolons <code>;</code> to terminate expressions, ending the line will do just as well (although semicolons can still be used to fit multiple expressions onto a single line). Instead of using curly braces <code>{ }</code> to surround blocks of code in <a href=\"#literals\">functions</a>, <a href=\"#conditionals\">if-statements</a>, <a href=\"#switch\">switch</a>, and <a href=\"#try-catch\">try/catch</a>, use indentation.</p>\n<p>You don’t need to use parentheses to invoke a function if you’re passing arguments. The implicit call wraps forward to the end of the line or block expression.<br>\n<code>console.log sys.inspect object</code> → <code>console.log(sys.inspect(object));</code></p>\n\n        <section id=\"functions\">\n          <h2>Functions</h2>\n<p>Functions are defined by an optional list of parameters in parentheses, an arrow, and the function body. The empty function looks like this: <code>-&gt;</code></p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"functions\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"functions-coffee\">square = (x) -> x * x\ncube   = (x) -> square(x) * x\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">square</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">x</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span> <span class=\"cm-variable\">x</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable\">x</span>\n<span class=\"cm-variable\">cube</span>   <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">x</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span> <span class=\"cm-variable\">square</span><span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">x</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable\">x</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"functions-js\">var cube, square;\n\nsquare = function(x) {\n  return x * x;\n};\n\ncube = function(x) {\n  return square(x) * x;\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">cube</span>, <span class=\"cm-def\">square</span>;\n\n<span class=\"cm-variable\">square</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">x</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">x</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable-2\">x</span>;\n};\n\n<span class=\"cm-variable\">cube</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">x</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">square</span>(<span class=\"cm-variable-2\">x</span>) <span class=\"cm-operator\">*</span> <span class=\"cm-variable-2\">x</span>;\n};\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"functions\" data-run=\"cube%285%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>cube(5)</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Functions may also have default values for arguments, which will be used if the incoming argument is missing (<code>undefined</code>).</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"default_args\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"default_args-coffee\">fill = (container, liquid = \"coffee\") ->\n  \"Filling the #{container} with #{liquid}...\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">fill</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">container</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">liquid</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">\"coffee\"</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-string\">\"Filling the #{container} with #{liquid}...\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"default_args-js\">var fill;\n\nfill = function(container, liquid = \"coffee\") {\n  return `Filling the ${container} with ${liquid}...`;\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">fill</span>;\n\n<span class=\"cm-variable\">fill</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">container</span>, <span class=\"cm-def\">liquid</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">\"coffee\"</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-string-2\">`Filling the ${</span><span class=\"cm-variable-2\">container</span><span class=\"cm-string-2\">}</span> <span class=\"cm-string-2\">with ${</span><span class=\"cm-variable-2\">liquid</span><span class=\"cm-string-2\">}...`</span>;\n};\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"default_args\" data-run=\"fill%28%22cup%22%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>fill(&quot;cup&quot;)</button>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"strings\">\n          <h2>Strings</h2>\n<p>Like JavaScript and many other languages, CoffeeScript supports strings as delimited by the <code>&quot;</code> or <code>'</code> characters. CoffeeScript also supports string interpolation within <code>&quot;</code>-quoted strings, using <code>#{ … }</code>. Single-quoted strings are literal. You may even use interpolation in object keys.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"interpolation\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"interpolation-coffee\">author = \"Wittgenstein\"\nquote  = \"A picture is a fact. -- #{ author }\"\n\nsentence = \"#{ 22 / 7 } is a decent approximation of π\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">author</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">\"Wittgenstein\"</span>\n<span class=\"cm-variable\">quote</span>  <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">\"A picture is a fact. -- #{ author }\"</span>\n\n<span class=\"cm-variable\">sentence</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">\"#{ 22 / 7 } is a decent approximation of π\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"interpolation-js\">var author, quote, sentence;\n\nauthor = \"Wittgenstein\";\n\nquote = `A picture is a fact. -- ${author}`;\n\nsentence = `${22 / 7} is a decent approximation of π`;\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">author</span>, <span class=\"cm-def\">quote</span>, <span class=\"cm-def\">sentence</span>;\n\n<span class=\"cm-variable\">author</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">\"Wittgenstein\"</span>;\n\n<span class=\"cm-variable\">quote</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string-2\">`A picture is a fact. -- ${</span><span class=\"cm-variable\">author</span><span class=\"cm-string-2\">}`</span>;\n\n<span class=\"cm-variable\">sentence</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string-2\">`${</span><span class=\"cm-number\">22</span> <span class=\"cm-operator\">/</span> <span class=\"cm-number\">7</span><span class=\"cm-string-2\">}</span> <span class=\"cm-string-2\">is a decent approximation of π`</span>;\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"interpolation\" data-run=\"sentence\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>sentence</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Multiline strings are allowed in CoffeeScript. Lines are joined by a single space unless they end with a backslash. Indentation is ignored.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"strings\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"strings-coffee\">mobyDick = \"Call me Ishmael. Some years ago --\n  never mind how long precisely -- having little\n  or no money in my purse, and nothing particular\n  to interest me on shore, I thought I would sail\n  about a little and see the watery part of the\n  world...\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">mobyDick</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">\"Call me Ishmael. Some years ago --</span>\n<span class=\"cm-string\">  never mind how long precisely -- having little</span>\n<span class=\"cm-string\">  or no money in my purse, and nothing particular</span>\n<span class=\"cm-string\">  to interest me on shore, I thought I would sail</span>\n<span class=\"cm-string\">  about a little and see the watery part of the</span>\n<span class=\"cm-string\">  world...\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"strings-js\">var mobyDick;\n\nmobyDick = \"Call me Ishmael. Some years ago -- never mind how long precisely -- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world...\";\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">mobyDick</span>;\n\n<span class=\"cm-variable\">mobyDick</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">\"Call me Ishmael. Some years ago -- never mind how long precisely -- having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world...\"</span>;\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"strings\" data-run=\"mobyDick\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>mobyDick</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Block strings, delimited by <code>&quot;&quot;&quot;</code> or <code>'''</code>, can be used to hold formatted or indentation-sensitive text (or, if you just don’t feel like escaping quotes and apostrophes). The indentation level that begins the block is maintained throughout, so you can keep it all aligned with the body of your code.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"heredocs\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"heredocs-coffee\">html = \"\"\"\n       <strong>\n         cup of coffeescript\n       </strong>\n       \"\"\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">html</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">\"\"\"</span>\n<span class=\"cm-string\">       &lt;strong></span>\n<span class=\"cm-string\">         cup of coffeescript</span>\n<span class=\"cm-string\">       &lt;/strong></span>\n<span class=\"cm-string\">       \"\"\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"heredocs-js\">var html;\n\nhtml = `<strong>\n  cup of coffeescript\n</strong>`;\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">html</span>;\n\n<span class=\"cm-variable\">html</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string-2\">`&lt;strong></span>\n  <span class=\"cm-string-2\">cup of coffeescript</span>\n<span class=\"cm-string-2\">&lt;/strong>`</span>;\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"heredocs\" data-run=\"html\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>html</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Double-quoted block strings, like other double-quoted strings, allow interpolation.</p>\n\n        </section>\n        <section id=\"objects-and-arrays\">\n          <h2>Objects and Arrays</h2>\n<p>The CoffeeScript literals for objects and arrays look very similar to their JavaScript cousins. When each property is listed on its own line, the commas are optional. Objects may be created using indentation instead of explicit braces, similar to <a href=\"http://yaml.org\">YAML</a>.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"objects_and_arrays\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"objects_and_arrays-coffee\">song = [\"do\", \"re\", \"mi\", \"fa\", \"so\"]\n\nsingers = {Jagger: \"Rock\", Elvis: \"Roll\"}\n\nbitlist = [\n  1, 0, 1\n  0, 0, 1\n  1, 1, 0\n]\n\nkids =\n  brother:\n    name: \"Max\"\n    age:  11\n  sister:\n    name: \"Ida\"\n    age:  9\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">song</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-string\">\"do\"</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">\"re\"</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">\"mi\"</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">\"fa\"</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">\"so\"</span><span class=\"cm-punctuation\">]</span>\n\n<span class=\"cm-variable\">singers</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">{</span><span class=\"cm-variable\">Jagger</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-string\">\"Rock\"</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">Elvis</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-string\">\"Roll\"</span><span class=\"cm-punctuation\">}</span>\n\n<span class=\"cm-variable\">bitlist</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span>\n  <span class=\"cm-number\">1</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">0</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">1</span>\n  <span class=\"cm-number\">0</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">0</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">1</span>\n  <span class=\"cm-number\">1</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">1</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">0</span>\n<span class=\"cm-punctuation\">]</span>\n\n<span class=\"cm-variable\">kids</span> <span class=\"cm-punctuation\">=</span>\n<span class=\"cm-indent\">  </span><span class=\"cm-variable\">brother</span><span class=\"cm-punctuation\">:</span>\n<span class=\"cm-indent\">    </span><span class=\"cm-variable\">name</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-string\">\"Max\"</span>\n    <span class=\"cm-variable\">age</span><span class=\"cm-punctuation\">:</span>  <span class=\"cm-number\">11</span>\n<span class=\"cm-dedent\">  </span><span class=\"cm-variable\">sister</span><span class=\"cm-punctuation\">:</span>\n<span class=\"cm-indent\">    </span><span class=\"cm-variable\">name</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-string\">\"Ida\"</span>\n    <span class=\"cm-variable\">age</span><span class=\"cm-punctuation\">:</span>  <span class=\"cm-number\">9</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"objects_and_arrays-js\">var bitlist, kids, singers, song;\n\nsong = [\"do\", \"re\", \"mi\", \"fa\", \"so\"];\n\nsingers = {\n  Jagger: \"Rock\",\n  Elvis: \"Roll\"\n};\n\nbitlist = [1, 0, 1, 0, 0, 1, 1, 1, 0];\n\nkids = {\n  brother: {\n    name: \"Max\",\n    age: 11\n  },\n  sister: {\n    name: \"Ida\",\n    age: 9\n  }\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">bitlist</span>, <span class=\"cm-def\">kids</span>, <span class=\"cm-def\">singers</span>, <span class=\"cm-def\">song</span>;\n\n<span class=\"cm-variable\">song</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-string\">\"do\"</span>, <span class=\"cm-string\">\"re\"</span>, <span class=\"cm-string\">\"mi\"</span>, <span class=\"cm-string\">\"fa\"</span>, <span class=\"cm-string\">\"so\"</span>];\n\n<span class=\"cm-variable\">singers</span> <span class=\"cm-operator\">=</span> {\n  <span class=\"cm-property\">Jagger</span>: <span class=\"cm-string\">\"Rock\"</span>,\n  <span class=\"cm-property\">Elvis</span>: <span class=\"cm-string\">\"Roll\"</span>\n};\n\n<span class=\"cm-variable\">bitlist</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-number\">1</span>, <span class=\"cm-number\">0</span>, <span class=\"cm-number\">1</span>, <span class=\"cm-number\">0</span>, <span class=\"cm-number\">0</span>, <span class=\"cm-number\">1</span>, <span class=\"cm-number\">1</span>, <span class=\"cm-number\">1</span>, <span class=\"cm-number\">0</span>];\n\n<span class=\"cm-variable\">kids</span> <span class=\"cm-operator\">=</span> {\n  <span class=\"cm-property\">brother</span>: {\n    <span class=\"cm-property\">name</span>: <span class=\"cm-string\">\"Max\"</span>,\n    <span class=\"cm-property\">age</span>: <span class=\"cm-number\">11</span>\n  },\n  <span class=\"cm-property\">sister</span>: {\n    <span class=\"cm-property\">name</span>: <span class=\"cm-string\">\"Ida\"</span>,\n    <span class=\"cm-property\">age</span>: <span class=\"cm-number\">9</span>\n  }\n};\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"objects_and_arrays\" data-run=\"song.join%28%22%20%u2026%20%22%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>song.join(&quot; … &quot;)</button>\n    </div>\n  </div>\n  \n</aside>\n<p>CoffeeScript has a shortcut for creating objects when you want the key to be set with a variable of the same name. Note that the <code>{</code> and <code>}</code> are required for this shorthand.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"objects_shorthand\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"objects_shorthand-coffee\">name = \"Michelangelo\"\nmask = \"orange\"\nweapon = \"nunchuks\"\nturtle = {name, mask, weapon}\noutput = \"#{turtle.name} wears an #{turtle.mask} mask. Watch out for his #{turtle.weapon}!\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">name</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">\"Michelangelo\"</span>\n<span class=\"cm-variable\">mask</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">\"orange\"</span>\n<span class=\"cm-variable\">weapon</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">\"nunchuks\"</span>\n<span class=\"cm-variable\">turtle</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">{</span><span class=\"cm-variable\">name</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">mask</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">weapon</span><span class=\"cm-punctuation\">}</span>\n<span class=\"cm-variable\">output</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">\"#{turtle.name} wears an #{turtle.mask} mask. Watch out for his #{turtle.weapon}!\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"objects_shorthand-js\">var mask, name, output, turtle, weapon;\n\nname = \"Michelangelo\";\n\nmask = \"orange\";\n\nweapon = \"nunchuks\";\n\nturtle = {name, mask, weapon};\n\noutput = `${turtle.name} wears an ${turtle.mask} mask. Watch out for his ${turtle.weapon}!`;\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">mask</span>, <span class=\"cm-def\">name</span>, <span class=\"cm-def\">output</span>, <span class=\"cm-def\">turtle</span>, <span class=\"cm-def\">weapon</span>;\n\n<span class=\"cm-variable\">name</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">\"Michelangelo\"</span>;\n\n<span class=\"cm-variable\">mask</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">\"orange\"</span>;\n\n<span class=\"cm-variable\">weapon</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">\"nunchuks\"</span>;\n\n<span class=\"cm-variable\">turtle</span> <span class=\"cm-operator\">=</span> {<span class=\"cm-property\">name</span>, <span class=\"cm-property\">mask</span>, <span class=\"cm-property\">weapon</span>};\n\n<span class=\"cm-variable\">output</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string-2\">`${</span><span class=\"cm-variable\">turtle</span>.<span class=\"cm-property\">name</span><span class=\"cm-string-2\">}</span> <span class=\"cm-string-2\">wears an ${</span><span class=\"cm-variable\">turtle</span>.<span class=\"cm-property\">mask</span><span class=\"cm-string-2\">}</span> <span class=\"cm-string-2\">mask. Watch out for his ${</span><span class=\"cm-variable\">turtle</span>.<span class=\"cm-property\">weapon</span><span class=\"cm-string-2\">}!`</span>;\n</pre>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"comments\">\n          <h2>Comments</h2>\n<p>In CoffeeScript, comments are denoted by the <code>#</code> character to the end of a line, or from <code>###</code> to the next appearance of <code>###</code>. Comments are ignored by the compiler, though the compiler makes its best effort at reinserting your comments into the output JavaScript after compilation.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"comment\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"comment-coffee\">###\nFortune Cookie Reader v1.0\nReleased under the MIT License\n###\n\nsayFortune = (fortune) ->\n  console.log fortune # in bed!\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\">###</span>\n<span class=\"cm-comment\">Fortune Cookie Reader v1.0</span>\n<span class=\"cm-comment\">Released under the MIT License</span>\n<span class=\"cm-comment\">###</span>\n\n<span class=\"cm-variable\">sayFortune</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">fortune</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">console</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">log</span> <span class=\"cm-variable\">fortune</span> <span class=\"cm-comment\"># in bed!</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"comment-js\">/*\nFortune Cookie Reader v1.0\nReleased under the MIT License\n*/\nvar sayFortune;\n\nsayFortune = function(fortune) {\n  return console.log(fortune); // in bed!\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\">/*</span>\n<span class=\"cm-comment\">Fortune Cookie Reader v1.0</span>\n<span class=\"cm-comment\">Released under the MIT License</span>\n<span class=\"cm-comment\">*/</span>\n<span class=\"cm-keyword\">var</span> <span class=\"cm-def\">sayFortune</span>;\n\n<span class=\"cm-variable\">sayFortune</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">fortune</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">console</span>.<span class=\"cm-property\">log</span>(<span class=\"cm-variable-2\">fortune</span>); <span class=\"cm-comment\">// in bed!</span>\n};\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p>Inline <code>###</code> comments make <a href=\"#type-annotations\">type annotations</a> possible.</p>\n\n        </section>\n        <section id=\"lexical-scope\">\n          <h2>Lexical Scoping and Variable Safety</h2>\n<p>The CoffeeScript compiler takes care to make sure that all of your variables are properly declared within lexical scope — you never need to write <code>var</code> yourself.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"scope\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"scope-coffee\">outer = 1\nchangeNumbers = ->\n  inner = -1\n  outer = 10\ninner = changeNumbers()\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">outer</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">1</span>\n<span class=\"cm-variable\">changeNumbers</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">inner</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">-1</span>\n  <span class=\"cm-variable\">outer</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">10</span>\n<span class=\"cm-variable\">inner</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">changeNumbers</span><span class=\"cm-punctuation\">()</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"scope-js\">var changeNumbers, inner, outer;\n\nouter = 1;\n\nchangeNumbers = function() {\n  var inner;\n  inner = -1;\n  return outer = 10;\n};\n\ninner = changeNumbers();\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">changeNumbers</span>, <span class=\"cm-def\">inner</span>, <span class=\"cm-def\">outer</span>;\n\n<span class=\"cm-variable\">outer</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">1</span>;\n\n<span class=\"cm-variable\">changeNumbers</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>() {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">inner</span>;\n  <span class=\"cm-variable-2\">inner</span> <span class=\"cm-operator\">=</span> <span class=\"cm-operator\">-</span><span class=\"cm-number\">1</span>;\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">outer</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">10</span>;\n};\n\n<span class=\"cm-variable-2\">inner</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">changeNumbers</span>();\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"scope\" data-run=\"inner\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>inner</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Notice how all of the variable declarations have been pushed up to the top of the closest scope, the first time they appear. <code>outer</code> is not redeclared within the inner function, because it’s already in scope; <code>inner</code> within the function, on the other hand, should not be able to change the value of the external variable of the same name, and therefore has a declaration of its own.</p>\n<p>Because you don’t have direct access to the <code>var</code> keyword, it’s impossible to shadow an outer variable on purpose, you may only refer to it. So be careful that you’re not reusing the name of an external variable accidentally, if you’re writing a deeply nested function.</p>\n<p>Although suppressed within this documentation for clarity, all CoffeeScript output (except in files with <code>import</code> or <code>export</code> statements) is wrapped in an anonymous function: <code>(function(){ … })();</code>. This safety wrapper, combined with the automatic generation of the <code>var</code> keyword, make it exceedingly difficult to pollute the global namespace by accident. (The safety wrapper can be disabled with the <a href=\"#usage\"><code>bare</code> option</a>, and is unnecessary and automatically disabled when using modules.)</p>\n<p>If you’d like to create top-level variables for other scripts to use, attach them as properties on <code>window</code>; attach them as properties on the <code>exports</code> object in CommonJS; or use an <a href=\"#modules\"><code>export</code> statement</a>. If you’re targeting both CommonJS and the browser, the <a href=\"#existential-operator\">existential operator</a> (covered below), gives you a reliable way to figure out where to add them: <code>exports ? this</code>.</p>\n<p>Since CoffeeScript takes care of all variable declaration, it is not possible to declare variables with ES2015’s <code>let</code> or <code>const</code>. <a href=\"#unsupported-let-const\">This is intentional</a>; we feel that the simplicity gained by not having to think about variable declaration outweighs the benefit of having three separate ways to declare variables.</p>\n\n        </section>\n        <section id=\"conditionals\">\n          <h2>If, Else, Unless, and Conditional Assignment</h2>\n<p><code>if</code>/<code>else</code> statements can be written without the use of parentheses and curly brackets. As with functions and other block expressions, multi-line conditionals are delimited by indentation. There’s also a handy postfix form, with the <code>if</code> or <code>unless</code> at the end.</p>\n<p>CoffeeScript can compile <code>if</code> statements into JavaScript expressions, using the ternary operator when possible, and closure wrapping otherwise. There is no explicit ternary statement in CoffeeScript — you simply use a regular <code>if</code> statement on a single line.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"conditionals\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"conditionals-coffee\">mood = greatlyImproved if singing\n\nif happy and knowsIt\n  clapsHands()\n  chaChaCha()\nelse\n  showIt()\n\ndate = if friday then sue else jill\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">mood</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">greatlyImproved</span> <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">singing</span>\n\n<span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">happy</span> <span class=\"cm-operator\">and</span> <span class=\"cm-variable\">knowsIt</span>\n  <span class=\"cm-variable\">clapsHands</span><span class=\"cm-punctuation\">()</span>\n  <span class=\"cm-variable\">chaChaCha</span><span class=\"cm-punctuation\">()</span>\n<span class=\"cm-keyword\">else</span>\n  <span class=\"cm-variable\">showIt</span><span class=\"cm-punctuation\">()</span>\n\n<span class=\"cm-variable\">date</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">friday</span> <span class=\"cm-keyword\">then</span> <span class=\"cm-variable\">sue</span> <span class=\"cm-keyword\">else</span> <span class=\"cm-variable\">jill</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"conditionals-js\">var date, mood;\n\nif (singing) {\n  mood = greatlyImproved;\n}\n\nif (happy && knowsIt) {\n  clapsHands();\n  chaChaCha();\n} else {\n  showIt();\n}\n\ndate = friday ? sue : jill;\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">date</span>, <span class=\"cm-def\">mood</span>;\n\n<span class=\"cm-keyword\">if</span> (<span class=\"cm-variable\">singing</span>) {\n  <span class=\"cm-variable\">mood</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">greatlyImproved</span>;\n}\n\n<span class=\"cm-keyword\">if</span> (<span class=\"cm-variable\">happy</span> <span class=\"cm-operator\">&amp;&amp;</span> <span class=\"cm-variable\">knowsIt</span>) {\n  <span class=\"cm-variable\">clapsHands</span>();\n  <span class=\"cm-variable\">chaChaCha</span>();\n} <span class=\"cm-keyword\">else</span> {\n  <span class=\"cm-variable\">showIt</span>();\n}\n\n<span class=\"cm-variable\">date</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">friday</span> <span class=\"cm-operator\">?</span> <span class=\"cm-variable\">sue</span> : <span class=\"cm-variable\">jill</span>;\n</pre>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"splats\">\n          <h2>Splats, or Rest Parameters/Spread Syntax</h2>\n<p>The JavaScript <code>arguments</code> object is a useful way to work with functions that accept variable numbers of arguments. CoffeeScript provides splats <code>...</code>, both for function definition as well as invocation, making variable numbers of arguments a little bit more palatable. ES2015 adopted this feature as their <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters\">rest parameters</a>.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"splats\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"splats-coffee\">gold = silver = rest = \"unknown\"\n\nawardMedals = (first, second, others...) ->\n  gold   = first\n  silver = second\n  rest   = others\n\ncontenders = [\n  \"Michael Phelps\"\n  \"Liu Xiang\"\n  \"Yao Ming\"\n  \"Allyson Felix\"\n  \"Shawn Johnson\"\n  \"Roman Sebrle\"\n  \"Guo Jingjing\"\n  \"Tyson Gay\"\n  \"Asafa Powell\"\n  \"Usain Bolt\"\n]\n\nawardMedals contenders...\n\nalert \"\"\"\nGold: #{gold}\nSilver: #{silver}\nThe Field: #{rest.join ', '}\n\"\"\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">gold</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">silver</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">rest</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">\"unknown\"</span>\n\n<span class=\"cm-variable\">awardMedals</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">first</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">second</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">others</span><span class=\"cm-punctuation\">...)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">gold</span>   <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">first</span>\n  <span class=\"cm-variable\">silver</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">second</span>\n  <span class=\"cm-variable\">rest</span>   <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">others</span>\n\n<span class=\"cm-variable\">contenders</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span>\n  <span class=\"cm-string\">\"Michael Phelps\"</span>\n  <span class=\"cm-string\">\"Liu Xiang\"</span>\n  <span class=\"cm-string\">\"Yao Ming\"</span>\n  <span class=\"cm-string\">\"Allyson Felix\"</span>\n  <span class=\"cm-string\">\"Shawn Johnson\"</span>\n  <span class=\"cm-string\">\"Roman Sebrle\"</span>\n  <span class=\"cm-string\">\"Guo Jingjing\"</span>\n  <span class=\"cm-string\">\"Tyson Gay\"</span>\n  <span class=\"cm-string\">\"Asafa Powell\"</span>\n  <span class=\"cm-string\">\"Usain Bolt\"</span>\n<span class=\"cm-punctuation\">]</span>\n\n<span class=\"cm-variable\">awardMedals</span> <span class=\"cm-variable\">contenders</span><span class=\"cm-punctuation\">...</span>\n\n<span class=\"cm-variable\">alert</span> <span class=\"cm-string\">\"\"\"</span>\n<span class=\"cm-string\">Gold: #{gold}</span>\n<span class=\"cm-string\">Silver: #{silver}</span>\n<span class=\"cm-string\">The Field: #{rest.join ', '}</span>\n<span class=\"cm-string\">\"\"\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"splats-js\">var awardMedals, contenders, gold, rest, silver;\n\ngold = silver = rest = \"unknown\";\n\nawardMedals = function(first, second, ...others) {\n  gold = first;\n  silver = second;\n  return rest = others;\n};\n\ncontenders = [\"Michael Phelps\", \"Liu Xiang\", \"Yao Ming\", \"Allyson Felix\", \"Shawn Johnson\", \"Roman Sebrle\", \"Guo Jingjing\", \"Tyson Gay\", \"Asafa Powell\", \"Usain Bolt\"];\n\nawardMedals(...contenders);\n\nalert(`Gold: ${gold}\nSilver: ${silver}\nThe Field: ${rest.join(', ')}`);\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">awardMedals</span>, <span class=\"cm-def\">contenders</span>, <span class=\"cm-def\">gold</span>, <span class=\"cm-def\">rest</span>, <span class=\"cm-def\">silver</span>;\n\n<span class=\"cm-variable\">gold</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">silver</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">rest</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">\"unknown\"</span>;\n\n<span class=\"cm-variable\">awardMedals</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">first</span>, <span class=\"cm-def\">second</span>, <span class=\"cm-meta\">...</span><span class=\"cm-def\">others</span>) {\n  <span class=\"cm-variable\">gold</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">first</span>;\n  <span class=\"cm-variable\">silver</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">second</span>;\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">rest</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">others</span>;\n};\n\n<span class=\"cm-variable\">contenders</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-string\">\"Michael Phelps\"</span>, <span class=\"cm-string\">\"Liu Xiang\"</span>, <span class=\"cm-string\">\"Yao Ming\"</span>, <span class=\"cm-string\">\"Allyson Felix\"</span>, <span class=\"cm-string\">\"Shawn Johnson\"</span>, <span class=\"cm-string\">\"Roman Sebrle\"</span>, <span class=\"cm-string\">\"Guo Jingjing\"</span>, <span class=\"cm-string\">\"Tyson Gay\"</span>, <span class=\"cm-string\">\"Asafa Powell\"</span>, <span class=\"cm-string\">\"Usain Bolt\"</span>];\n\n<span class=\"cm-variable\">awardMedals</span>(<span class=\"cm-meta\">...</span><span class=\"cm-variable\">contenders</span>);\n\n<span class=\"cm-variable\">alert</span>(<span class=\"cm-string-2\">`Gold: ${</span><span class=\"cm-variable\">gold</span><span class=\"cm-string-2\">}</span>\n<span class=\"cm-string-2\">Silver: ${</span><span class=\"cm-variable\">silver</span><span class=\"cm-string-2\">}</span>\n<span class=\"cm-string-2\">The Field: ${</span><span class=\"cm-variable\">rest</span>.<span class=\"cm-property\">join</span>(<span class=\"cm-string\">', '</span>)<span class=\"cm-string-2\">}`</span>);\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"splats\" data-run=\"true\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small></button>\n    </div>\n  </div>\n  \n</aside>\n<div id=\"array-spread\" class=\"bookmark\"></div>\n<p>Splats also let us elide array elements…</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"array_spread\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"array_spread-coffee\">popular  = ['pepperoni', 'sausage', 'cheese']\nunwanted = ['anchovies', 'olives']\n\nall = [popular..., unwanted..., 'mushrooms']\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">popular</span>  <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-string\">'pepperoni'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'sausage'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'cheese'</span><span class=\"cm-punctuation\">]</span>\n<span class=\"cm-variable\">unwanted</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-string\">'anchovies'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'olives'</span><span class=\"cm-punctuation\">]</span>\n\n<span class=\"cm-variable\">all</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">popular</span><span class=\"cm-punctuation\">...,</span> <span class=\"cm-variable\">unwanted</span><span class=\"cm-punctuation\">...,</span> <span class=\"cm-string\">'mushrooms'</span><span class=\"cm-punctuation\">]</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"array_spread-js\">var all, popular, unwanted;\n\npopular = ['pepperoni', 'sausage', 'cheese'];\n\nunwanted = ['anchovies', 'olives'];\n\nall = [...popular, ...unwanted, 'mushrooms'];\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">all</span>, <span class=\"cm-def\">popular</span>, <span class=\"cm-def\">unwanted</span>;\n\n<span class=\"cm-variable\">popular</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-string\">'pepperoni'</span>, <span class=\"cm-string\">'sausage'</span>, <span class=\"cm-string\">'cheese'</span>];\n\n<span class=\"cm-variable\">unwanted</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-string\">'anchovies'</span>, <span class=\"cm-string\">'olives'</span>];\n\n<span class=\"cm-variable\">all</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-meta\">...</span><span class=\"cm-variable\">popular</span>, <span class=\"cm-meta\">...</span><span class=\"cm-variable\">unwanted</span>, <span class=\"cm-string\">'mushrooms'</span>];\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"array_spread\" data-run=\"all\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>all</button>\n    </div>\n  </div>\n  \n</aside>\n<div id=\"object-spread\" class=\"bookmark\"></div>\n<p>…and object properties.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"object_spread\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"object_spread-coffee\">user =\n  name: 'Werner Heisenberg'\n  occupation: 'theoretical physicist'\n\ncurrentUser = { user..., status: 'Uncertain' }\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">user</span> <span class=\"cm-punctuation\">=</span>\n<span class=\"cm-indent\">  </span><span class=\"cm-variable\">name</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-string\">'Werner Heisenberg'</span>\n  <span class=\"cm-variable\">occupation</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-string\">'theoretical physicist'</span>\n\n<span class=\"cm-variable\">currentUser</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">{</span> <span class=\"cm-variable\">user</span><span class=\"cm-punctuation\">...,</span> <span class=\"cm-variable\">status</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-string\">'Uncertain'</span> <span class=\"cm-punctuation\">}</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"object_spread-js\">var currentUser, user;\n\nuser = {\n  name: 'Werner Heisenberg',\n  occupation: 'theoretical physicist'\n};\n\ncurrentUser = {\n  ...user,\n  status: 'Uncertain'\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">currentUser</span>, <span class=\"cm-def\">user</span>;\n\n<span class=\"cm-variable\">user</span> <span class=\"cm-operator\">=</span> {\n  <span class=\"cm-property\">name</span>: <span class=\"cm-string\">'Werner Heisenberg'</span>,\n  <span class=\"cm-property\">occupation</span>: <span class=\"cm-string\">'theoretical physicist'</span>\n};\n\n<span class=\"cm-variable\">currentUser</span> <span class=\"cm-operator\">=</span> {\n  <span class=\"cm-meta\">...</span><span class=\"cm-variable\">user</span>,\n  <span class=\"cm-property\">status</span>: <span class=\"cm-string\">'Uncertain'</span>\n};\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"object_spread\" data-run=\"JSON.stringify%28currentUser%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>JSON.stringify(currentUser)</button>\n    </div>\n  </div>\n  \n</aside>\n<p>In ECMAScript this is called <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator\">spread syntax</a>, and has been supported for arrays since ES2015 and objects since ES2018.</p>\n\n        </section>\n        <section id=\"loops\">\n          <h2>Loops and Comprehensions</h2>\n<p>Most of the loops you’ll write in CoffeeScript will be <strong>comprehensions</strong> over arrays, objects, and ranges. Comprehensions replace (and compile into) <code>for</code> loops, with optional guard clauses and the value of the current array index. Unlike for loops, array comprehensions are expressions, and can be returned and assigned.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"array_comprehensions\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"array_comprehensions-coffee\"># Eat lunch.\neat = (food) -> \"#{food} eaten.\"\neat food for food in ['toast', 'cheese', 'wine']\n\n# Fine five course dining.\ncourses = ['greens', 'caviar', 'truffles', 'roast', 'cake']\nmenu = (i, dish) -> \"Menu Item #{i}: #{dish}\" \nmenu i + 1, dish for dish, i in courses\n\n# Health conscious meal.\nfoods = ['broccoli', 'spinach', 'chocolate']\neat food for food in foods when food isnt 'chocolate'\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\"># Eat lunch.</span>\n<span class=\"cm-variable\">eat</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">food</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span> <span class=\"cm-string\">\"#{food} eaten.\"</span>\n<span class=\"cm-variable\">eat</span> <span class=\"cm-variable\">food</span> <span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">food</span> <span class=\"cm-operator\">in</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-string\">'toast'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'cheese'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'wine'</span><span class=\"cm-punctuation\">]</span>\n\n<span class=\"cm-comment\"># Fine five course dining.</span>\n<span class=\"cm-variable\">courses</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-string\">'greens'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'caviar'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'truffles'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'roast'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'cake'</span><span class=\"cm-punctuation\">]</span>\n<span class=\"cm-variable\">menu</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">i</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">dish</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span> <span class=\"cm-string\">\"Menu Item #{i}: #{dish}\"</span> \n<span class=\"cm-variable\">menu</span> <span class=\"cm-variable\">i</span> <span class=\"cm-operator\">+</span> <span class=\"cm-number\">1</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">dish</span> <span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">dish</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">i</span> <span class=\"cm-operator\">in</span> <span class=\"cm-variable\">courses</span>\n\n<span class=\"cm-comment\"># Health conscious meal.</span>\n<span class=\"cm-variable\">foods</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-string\">'broccoli'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'spinach'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'chocolate'</span><span class=\"cm-punctuation\">]</span>\n<span class=\"cm-variable\">eat</span> <span class=\"cm-variable\">food</span> <span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">food</span> <span class=\"cm-operator\">in</span> <span class=\"cm-variable\">foods</span> <span class=\"cm-keyword\">when</span> <span class=\"cm-variable\">food</span> <span class=\"cm-operator\">isnt</span> <span class=\"cm-string\">'chocolate'</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"array_comprehensions-js\">// Eat lunch.\nvar courses, dish, eat, food, foods, i, j, k, l, len, len1, len2, menu, ref;\n\neat = function(food) {\n  return `${food} eaten.`;\n};\n\nref = ['toast', 'cheese', 'wine'];\nfor (j = 0, len = ref.length; j < len; j++) {\n  food = ref[j];\n  eat(food);\n}\n\n// Fine five course dining.\ncourses = ['greens', 'caviar', 'truffles', 'roast', 'cake'];\n\nmenu = function(i, dish) {\n  return `Menu Item ${i}: ${dish}`;\n};\n\nfor (i = k = 0, len1 = courses.length; k < len1; i = ++k) {\n  dish = courses[i];\n  menu(i + 1, dish);\n}\n\n// Health conscious meal.\nfoods = ['broccoli', 'spinach', 'chocolate'];\n\nfor (l = 0, len2 = foods.length; l < len2; l++) {\n  food = foods[l];\n  if (food !== 'chocolate') {\n    eat(food);\n  }\n}\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\">// Eat lunch.</span>\n<span class=\"cm-keyword\">var</span> <span class=\"cm-def\">courses</span>, <span class=\"cm-def\">dish</span>, <span class=\"cm-def\">eat</span>, <span class=\"cm-def\">food</span>, <span class=\"cm-def\">foods</span>, <span class=\"cm-def\">i</span>, <span class=\"cm-def\">j</span>, <span class=\"cm-def\">k</span>, <span class=\"cm-def\">l</span>, <span class=\"cm-def\">len</span>, <span class=\"cm-def\">len1</span>, <span class=\"cm-def\">len2</span>, <span class=\"cm-def\">menu</span>, <span class=\"cm-def\">ref</span>;\n\n<span class=\"cm-variable\">eat</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">food</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-string-2\">`${</span><span class=\"cm-variable-2\">food</span><span class=\"cm-string-2\">}</span> <span class=\"cm-string-2\">eaten.`</span>;\n};\n\n<span class=\"cm-variable\">ref</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-string\">'toast'</span>, <span class=\"cm-string\">'cheese'</span>, <span class=\"cm-string\">'wine'</span>];\n<span class=\"cm-keyword\">for</span> (<span class=\"cm-variable\">j</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">0</span>, <span class=\"cm-variable\">len</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">ref</span>.<span class=\"cm-property\">length</span>; <span class=\"cm-variable\">j</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-variable\">len</span>; <span class=\"cm-variable\">j</span><span class=\"cm-operator\">++</span>) {\n  <span class=\"cm-variable\">food</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">ref</span>[<span class=\"cm-variable\">j</span>];\n  <span class=\"cm-variable\">eat</span>(<span class=\"cm-variable\">food</span>);\n}\n\n<span class=\"cm-comment\">// Fine five course dining.</span>\n<span class=\"cm-variable\">courses</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-string\">'greens'</span>, <span class=\"cm-string\">'caviar'</span>, <span class=\"cm-string\">'truffles'</span>, <span class=\"cm-string\">'roast'</span>, <span class=\"cm-string\">'cake'</span>];\n\n<span class=\"cm-variable\">menu</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">i</span>, <span class=\"cm-def\">dish</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-string-2\">`Menu Item ${</span><span class=\"cm-variable-2\">i</span><span class=\"cm-string-2\">}: ${</span><span class=\"cm-variable-2\">dish</span><span class=\"cm-string-2\">}`</span>;\n};\n\n<span class=\"cm-keyword\">for</span> (<span class=\"cm-variable\">i</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">k</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">0</span>, <span class=\"cm-variable\">len1</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">courses</span>.<span class=\"cm-property\">length</span>; <span class=\"cm-variable\">k</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-variable\">len1</span>; <span class=\"cm-variable\">i</span> <span class=\"cm-operator\">=</span> <span class=\"cm-operator\">++</span><span class=\"cm-variable\">k</span>) {\n  <span class=\"cm-variable\">dish</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">courses</span>[<span class=\"cm-variable\">i</span>];\n  <span class=\"cm-variable\">menu</span>(<span class=\"cm-variable\">i</span> <span class=\"cm-operator\">+</span> <span class=\"cm-number\">1</span>, <span class=\"cm-variable\">dish</span>);\n}\n\n<span class=\"cm-comment\">// Health conscious meal.</span>\n<span class=\"cm-variable\">foods</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-string\">'broccoli'</span>, <span class=\"cm-string\">'spinach'</span>, <span class=\"cm-string\">'chocolate'</span>];\n\n<span class=\"cm-keyword\">for</span> (<span class=\"cm-variable\">l</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">0</span>, <span class=\"cm-variable\">len2</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">foods</span>.<span class=\"cm-property\">length</span>; <span class=\"cm-variable\">l</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-variable\">len2</span>; <span class=\"cm-variable\">l</span><span class=\"cm-operator\">++</span>) {\n  <span class=\"cm-variable\">food</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">foods</span>[<span class=\"cm-variable\">l</span>];\n  <span class=\"cm-keyword\">if</span> (<span class=\"cm-variable\">food</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-string\">'chocolate'</span>) {\n    <span class=\"cm-variable\">eat</span>(<span class=\"cm-variable\">food</span>);\n  }\n}\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p>Comprehensions should be able to handle most places where you otherwise would use a loop, <code>each</code>/<code>forEach</code>, <code>map</code>, or <code>select</code>/<code>filter</code>, for example:<br>\n<code>shortNames = (name for name in list when name.length &lt; 5)</code><br>\nIf you know the start and end of your loop, or would like to step through in fixed-size increments, you can use a range to specify the start and end of your comprehension.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"range_comprehensions\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"range_comprehensions-coffee\">countdown = (num for num in [10..1])\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">countdown</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">num</span> <span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">num</span> <span class=\"cm-operator\">in</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-number\">10..1</span><span class=\"cm-punctuation\">])</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"range_comprehensions-js\">var countdown, num;\n\ncountdown = (function() {\n  var i, results;\n  results = [];\n  for (num = i = 10; i >= 1; num = --i) {\n    results.push(num);\n  }\n  return results;\n})();\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">countdown</span>, <span class=\"cm-def\">num</span>;\n\n<span class=\"cm-variable\">countdown</span> <span class=\"cm-operator\">=</span> (<span class=\"cm-keyword\">function</span>() {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">i</span>, <span class=\"cm-def\">results</span>;\n  <span class=\"cm-variable-2\">results</span> <span class=\"cm-operator\">=</span> [];\n  <span class=\"cm-keyword\">for</span> (<span class=\"cm-variable\">num</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">i</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">10</span>; <span class=\"cm-variable-2\">i</span> <span class=\"cm-operator\">>=</span> <span class=\"cm-number\">1</span>; <span class=\"cm-variable\">num</span> <span class=\"cm-operator\">=</span> <span class=\"cm-operator\">--</span><span class=\"cm-variable-2\">i</span>) {\n    <span class=\"cm-variable-2\">results</span>.<span class=\"cm-property\">push</span>(<span class=\"cm-variable\">num</span>);\n  }\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">results</span>;\n})();\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"range_comprehensions\" data-run=\"countdown\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>countdown</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Note how because we are assigning the value of the comprehensions to a variable in the example above, CoffeeScript is collecting the result of each iteration into an array. Sometimes functions end with loops that are intended to run only for their side-effects. Be careful that you’re not accidentally returning the results of the comprehension in these cases, by adding a meaningful return value — like <code>true</code> — or <code>null</code>, to the bottom of your function.</p>\n<p>To step through a range comprehension in fixed-size chunks, use <code>by</code>, for example:\n<code>evens = (x for x in [0..10] by 2)</code></p>\n<p>If you don’t need the current iteration value you may omit it:\n<code>browser.closeCurrentTab() for [0...count]</code></p>\n<p>Comprehensions can also be used to iterate over the keys and values in an object. Use <code>of</code> to signal comprehension over the properties of an object instead of the values in an array.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"object_comprehensions\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"object_comprehensions-coffee\">yearsOld = max: 10, ida: 9, tim: 11\n\nages = for child, age of yearsOld\n  \"#{child} is #{age}\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">yearsOld</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">max</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-number\">10</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">ida</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-number\">9</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">tim</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-number\">11</span>\n\n<span class=\"cm-variable\">ages</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">child</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">age</span> <span class=\"cm-keyword\">of</span> <span class=\"cm-variable\">yearsOld</span>\n  <span class=\"cm-string\">\"#{child} is #{age}\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"object_comprehensions-js\">var age, ages, child, yearsOld;\n\nyearsOld = {\n  max: 10,\n  ida: 9,\n  tim: 11\n};\n\nages = (function() {\n  var results;\n  results = [];\n  for (child in yearsOld) {\n    age = yearsOld[child];\n    results.push(`${child} is ${age}`);\n  }\n  return results;\n})();\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">age</span>, <span class=\"cm-def\">ages</span>, <span class=\"cm-def\">child</span>, <span class=\"cm-def\">yearsOld</span>;\n\n<span class=\"cm-variable\">yearsOld</span> <span class=\"cm-operator\">=</span> {\n  <span class=\"cm-property\">max</span>: <span class=\"cm-number\">10</span>,\n  <span class=\"cm-property\">ida</span>: <span class=\"cm-number\">9</span>,\n  <span class=\"cm-property\">tim</span>: <span class=\"cm-number\">11</span>\n};\n\n<span class=\"cm-variable\">ages</span> <span class=\"cm-operator\">=</span> (<span class=\"cm-keyword\">function</span>() {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">results</span>;\n  <span class=\"cm-variable-2\">results</span> <span class=\"cm-operator\">=</span> [];\n  <span class=\"cm-keyword\">for</span> (<span class=\"cm-variable\">child</span> <span class=\"cm-keyword\">in</span> <span class=\"cm-variable\">yearsOld</span>) {\n    <span class=\"cm-variable\">age</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">yearsOld</span>[<span class=\"cm-variable\">child</span>];\n    <span class=\"cm-variable-2\">results</span>.<span class=\"cm-property\">push</span>(<span class=\"cm-string-2\">`${</span><span class=\"cm-variable\">child</span><span class=\"cm-string-2\">}</span> <span class=\"cm-string-2\">is ${</span><span class=\"cm-variable\">age</span><span class=\"cm-string-2\">}`</span>);\n  }\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">results</span>;\n})();\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"object_comprehensions\" data-run=\"ages.join%28%22%2C%20%22%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>ages.join(&quot;, &quot;)</button>\n    </div>\n  </div>\n  \n</aside>\n<p>If you would like to iterate over just the keys that are defined on the object itself, by adding a <code>hasOwnProperty</code> check to avoid properties that may be inherited from the prototype, use <code>for own key, value of object</code>.</p>\n<p>To iterate a generator function, use <code>from</code>. See <a href=\"#generator-iteration\">Generator Functions</a>.</p>\n<p>The only low-level loop that CoffeeScript provides is the <code>while</code> loop. The main difference from JavaScript is that the <code>while</code> loop can be used as an expression, returning an array containing the result of each iteration through the loop.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"while\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"while-coffee\"># Econ 101\nif this.studyingEconomics\n  buy()  while supply > demand\n  sell() until supply > demand\n\n# Nursery Rhyme\nnum = 6\nlyrics = while num -= 1\n  \"#{num} little monkeys, jumping on the bed.\n    One fell out and bumped his head.\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\"># Econ 101</span>\n<span class=\"cm-keyword\">if</span> <span class=\"cm-keyword\">this</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">studyingEconomics</span>\n  <span class=\"cm-variable\">buy</span><span class=\"cm-punctuation\">()</span>  <span class=\"cm-keyword\">while</span> <span class=\"cm-variable\">supply</span> <span class=\"cm-operator\">></span> <span class=\"cm-variable\">demand</span>\n<span class=\"cm-dedent\">  </span><span class=\"cm-variable\">sell</span><span class=\"cm-punctuation\">()</span> <span class=\"cm-keyword\">until</span> <span class=\"cm-variable\">supply</span> <span class=\"cm-operator\">></span> <span class=\"cm-variable\">demand</span>\n\n<span class=\"cm-comment\"># Nursery Rhyme</span>\n<span class=\"cm-variable\">num</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">6</span>\n<span class=\"cm-variable\">lyrics</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-keyword\">while</span> <span class=\"cm-variable\">num</span> <span class=\"cm-operator\">-=</span> <span class=\"cm-number\">1</span>\n  <span class=\"cm-string\">\"#{num} little monkeys, jumping on the bed.</span>\n<span class=\"cm-string\">    One fell out and bumped his head.\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"while-js\">// Econ 101\nvar lyrics, num;\n\nif (this.studyingEconomics) {\n  while (supply > demand) {\n    buy();\n  }\n  while (!(supply > demand)) {\n    sell();\n  }\n}\n\n// Nursery Rhyme\nnum = 6;\n\nlyrics = (function() {\n  var results;\n  results = [];\n  while (num -= 1) {\n    results.push(`${num} little monkeys, jumping on the bed. One fell out and bumped his head.`);\n  }\n  return results;\n})();\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\">// Econ 101</span>\n<span class=\"cm-keyword\">var</span> <span class=\"cm-def\">lyrics</span>, <span class=\"cm-def\">num</span>;\n\n<span class=\"cm-keyword\">if</span> (<span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">studyingEconomics</span>) {\n  <span class=\"cm-keyword\">while</span> (<span class=\"cm-variable\">supply</span> <span class=\"cm-operator\">></span> <span class=\"cm-variable\">demand</span>) {\n    <span class=\"cm-variable\">buy</span>();\n  }\n  <span class=\"cm-keyword\">while</span> (<span class=\"cm-operator\">!</span>(<span class=\"cm-variable\">supply</span> <span class=\"cm-operator\">></span> <span class=\"cm-variable\">demand</span>)) {\n    <span class=\"cm-variable\">sell</span>();\n  }\n}\n\n<span class=\"cm-comment\">// Nursery Rhyme</span>\n<span class=\"cm-variable\">num</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">6</span>;\n\n<span class=\"cm-variable\">lyrics</span> <span class=\"cm-operator\">=</span> (<span class=\"cm-keyword\">function</span>() {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">results</span>;\n  <span class=\"cm-variable-2\">results</span> <span class=\"cm-operator\">=</span> [];\n  <span class=\"cm-keyword\">while</span> (<span class=\"cm-variable\">num</span> <span class=\"cm-operator\">-=</span> <span class=\"cm-number\">1</span>) {\n    <span class=\"cm-variable-2\">results</span>.<span class=\"cm-property\">push</span>(<span class=\"cm-string-2\">`${</span><span class=\"cm-variable\">num</span><span class=\"cm-string-2\">}</span> <span class=\"cm-string-2\">little monkeys, jumping on the bed. One fell out and bumped his head.`</span>);\n  }\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">results</span>;\n})();\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"while\" data-run=\"lyrics.join%28%22%5Cn%22%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>lyrics.join(&quot;\\n&quot;)</button>\n    </div>\n  </div>\n  \n</aside>\n<p>For readability, the <code>until</code> keyword is equivalent to <code>while not</code>, and the <code>loop</code> keyword is equivalent to <code>while true</code>.</p>\n<p>When using a JavaScript loop to generate functions, it’s common to insert a closure wrapper in order to ensure that loop variables are closed over, and all the generated functions don’t just share the final values. CoffeeScript provides the <code>do</code> keyword, which immediately invokes a passed function, forwarding any arguments.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"do\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"do-coffee\">for filename in list\n  do (filename) ->\n    if filename not in ['.DS_Store', 'Thumbs.db', 'ehthumbs.db']\n      fs.readFile filename, (err, contents) ->\n        compile filename, contents.toString()\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">filename</span> <span class=\"cm-operator\">in</span> <span class=\"cm-variable\">list</span>\n  <span class=\"cm-keyword\">do</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">filename</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n    <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">filename</span> <span class=\"cm-operator\">not</span> <span class=\"cm-operator\">in</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-string\">'.DS_Store'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'Thumbs.db'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'ehthumbs.db'</span><span class=\"cm-punctuation\">]</span>\n      <span class=\"cm-variable\">fs</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">readFile</span> <span class=\"cm-variable\">filename</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">err</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">contents</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n        <span class=\"cm-variable\">compile</span> <span class=\"cm-variable\">filename</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">contents</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">toString</span><span class=\"cm-punctuation\">()</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"do-js\">var filename, i, len;\n\nfor (i = 0, len = list.length; i < len; i++) {\n  filename = list[i];\n  (function(filename) {\n    if (filename !== '.DS_Store' && filename !== 'Thumbs.db' && filename !== 'ehthumbs.db') {\n      return fs.readFile(filename, function(err, contents) {\n        return compile(filename, contents.toString());\n      });\n    }\n  })(filename);\n}\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">filename</span>, <span class=\"cm-def\">i</span>, <span class=\"cm-def\">len</span>;\n\n<span class=\"cm-keyword\">for</span> (<span class=\"cm-variable\">i</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">0</span>, <span class=\"cm-variable\">len</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">list</span>.<span class=\"cm-property\">length</span>; <span class=\"cm-variable\">i</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-variable\">len</span>; <span class=\"cm-variable\">i</span><span class=\"cm-operator\">++</span>) {\n  <span class=\"cm-variable\">filename</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">list</span>[<span class=\"cm-variable\">i</span>];\n  (<span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">filename</span>) {\n    <span class=\"cm-keyword\">if</span> (<span class=\"cm-variable-2\">filename</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-string\">'.DS_Store'</span> <span class=\"cm-operator\">&amp;&amp;</span> <span class=\"cm-variable-2\">filename</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-string\">'Thumbs.db'</span> <span class=\"cm-operator\">&amp;&amp;</span> <span class=\"cm-variable-2\">filename</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-string\">'ehthumbs.db'</span>) {\n      <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">fs</span>.<span class=\"cm-property\">readFile</span>(<span class=\"cm-variable-2\">filename</span>, <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">err</span>, <span class=\"cm-def\">contents</span>) {\n        <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">compile</span>(<span class=\"cm-variable-2\">filename</span>, <span class=\"cm-variable-2\">contents</span>.<span class=\"cm-property\">toString</span>());\n      });\n    }\n  })(<span class=\"cm-variable\">filename</span>);\n}\n</pre>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"slices\">\n          <h2>Array Slicing and Splicing with Ranges</h2>\n<p>Ranges can also be used to extract slices of arrays. With two dots (<code>3..6</code>), the range is inclusive (<code>3, 4, 5, 6</code>); with three dots (<code>3...6</code>), the range excludes the end (<code>3, 4, 5</code>). Slices indices have useful defaults. An omitted first index defaults to zero and an omitted second index defaults to the size of the array.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"slices\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"slices-coffee\">numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]\n\nstart   = numbers[0..2]\n\nmiddle  = numbers[3...-2]\n\nend     = numbers[-2..]\n\ncopy    = numbers[..]\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">numbers</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-number\">1</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">2</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">3</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">4</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">5</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">6</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">7</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">8</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">9</span><span class=\"cm-punctuation\">]</span>\n\n<span class=\"cm-variable\">start</span>   <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">numbers</span><span class=\"cm-punctuation\">[</span><span class=\"cm-number\">0..2</span><span class=\"cm-punctuation\">]</span>\n\n<span class=\"cm-variable\">middle</span>  <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">numbers</span><span class=\"cm-punctuation\">[</span><span class=\"cm-number\">3</span><span class=\"cm-punctuation\">...</span><span class=\"cm-number\">-2</span><span class=\"cm-punctuation\">]</span>\n\n<span class=\"cm-variable\">end</span>     <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">numbers</span><span class=\"cm-punctuation\">[</span><span class=\"cm-number\">-2</span><span class=\"cm-punctuation\">..]</span>\n\n<span class=\"cm-variable\">copy</span>    <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">numbers</span><span class=\"cm-punctuation\">[..]</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"slices-js\">var copy, end, middle, numbers, start;\n\nnumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n\nstart = numbers.slice(0, 3);\n\nmiddle = numbers.slice(3, -2);\n\nend = numbers.slice(-2);\n\ncopy = numbers.slice(0);\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">copy</span>, <span class=\"cm-def\">end</span>, <span class=\"cm-def\">middle</span>, <span class=\"cm-def\">numbers</span>, <span class=\"cm-def\">start</span>;\n\n<span class=\"cm-variable\">numbers</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-number\">1</span>, <span class=\"cm-number\">2</span>, <span class=\"cm-number\">3</span>, <span class=\"cm-number\">4</span>, <span class=\"cm-number\">5</span>, <span class=\"cm-number\">6</span>, <span class=\"cm-number\">7</span>, <span class=\"cm-number\">8</span>, <span class=\"cm-number\">9</span>];\n\n<span class=\"cm-variable\">start</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">numbers</span>.<span class=\"cm-property\">slice</span>(<span class=\"cm-number\">0</span>, <span class=\"cm-number\">3</span>);\n\n<span class=\"cm-variable\">middle</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">numbers</span>.<span class=\"cm-property\">slice</span>(<span class=\"cm-number\">3</span>, <span class=\"cm-operator\">-</span><span class=\"cm-number\">2</span>);\n\n<span class=\"cm-variable\">end</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">numbers</span>.<span class=\"cm-property\">slice</span>(<span class=\"cm-operator\">-</span><span class=\"cm-number\">2</span>);\n\n<span class=\"cm-variable\">copy</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">numbers</span>.<span class=\"cm-property\">slice</span>(<span class=\"cm-number\">0</span>);\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"slices\" data-run=\"middle\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>middle</button>\n    </div>\n  </div>\n  \n</aside>\n<p>The same syntax can be used with assignment to replace a segment of an array with new values, splicing it.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"splices\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"splices-coffee\">numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\nnumbers[3..6] = [-3, -4, -5, -6]\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">numbers</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-number\">0</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">1</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">2</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">3</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">4</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">5</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">6</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">7</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">8</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">9</span><span class=\"cm-punctuation\">]</span>\n\n<span class=\"cm-variable\">numbers</span><span class=\"cm-punctuation\">[</span><span class=\"cm-number\">3..6</span><span class=\"cm-punctuation\">]</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-number\">-3</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">-4</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">-5</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">-6</span><span class=\"cm-punctuation\">]</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"splices-js\">var numbers, ref,\n  splice = [].splice;\n\nnumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];\n\nsplice.apply(numbers, [3, 4].concat(ref = [-3, -4, -5, -6])), ref;\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">numbers</span>, <span class=\"cm-def\">ref</span>,\n  <span class=\"cm-def\">splice</span> <span class=\"cm-operator\">=</span> [].<span class=\"cm-property\">splice</span>;\n\n<span class=\"cm-variable\">numbers</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-number\">0</span>, <span class=\"cm-number\">1</span>, <span class=\"cm-number\">2</span>, <span class=\"cm-number\">3</span>, <span class=\"cm-number\">4</span>, <span class=\"cm-number\">5</span>, <span class=\"cm-number\">6</span>, <span class=\"cm-number\">7</span>, <span class=\"cm-number\">8</span>, <span class=\"cm-number\">9</span>];\n\n<span class=\"cm-variable\">splice</span>.<span class=\"cm-property\">apply</span>(<span class=\"cm-variable\">numbers</span>, [<span class=\"cm-number\">3</span>, <span class=\"cm-number\">4</span>].<span class=\"cm-property\">concat</span>(<span class=\"cm-variable\">ref</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-operator\">-</span><span class=\"cm-number\">3</span>, <span class=\"cm-operator\">-</span><span class=\"cm-number\">4</span>, <span class=\"cm-operator\">-</span><span class=\"cm-number\">5</span>, <span class=\"cm-operator\">-</span><span class=\"cm-number\">6</span>])), <span class=\"cm-variable\">ref</span>;\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"splices\" data-run=\"numbers\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>numbers</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Note that JavaScript strings are immutable, and can’t be spliced.</p>\n\n        </section>\n        <section id=\"expressions\">\n          <h2>Everything is an Expression (at least, as much as possible)</h2>\n<p>You might have noticed how even though we don’t add return statements to CoffeeScript functions, they nonetheless return their final value. The CoffeeScript compiler tries to make sure that all statements in the language can be used as expressions. Watch how the <code>return</code> gets pushed down into each possible branch of execution in the function below.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"expressions\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"expressions-coffee\">grade = (student) ->\n  if student.excellentWork\n    \"A+\"\n  else if student.okayStuff\n    if student.triedHard then \"B\" else \"B-\"\n  else\n    \"C\"\n\neldest = if 24 > 21 then \"Liz\" else \"Ike\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">grade</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">student</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">student</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">excellentWork</span>\n    <span class=\"cm-string\">\"A+\"</span>\n<span class=\"cm-dedent\">  </span><span class=\"cm-keyword\">else</span> <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">student</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">okayStuff</span>\n<span class=\"cm-dedent\">    </span><span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">student</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">triedHard</span> <span class=\"cm-keyword\">then</span> <span class=\"cm-string\">\"B\"</span> <span class=\"cm-keyword\">else</span> <span class=\"cm-string\">\"B-\"</span>\n<span class=\"cm-dedent\">  </span><span class=\"cm-keyword\">else</span>\n    <span class=\"cm-string\">\"C\"</span>\n\n<span class=\"cm-variable\">eldest</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-keyword\">if</span> <span class=\"cm-number\">24</span> <span class=\"cm-operator\">></span> <span class=\"cm-number\">21</span> <span class=\"cm-keyword\">then</span> <span class=\"cm-string\">\"Liz\"</span> <span class=\"cm-keyword\">else</span> <span class=\"cm-string\">\"Ike\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"expressions-js\">var eldest, grade;\n\ngrade = function(student) {\n  if (student.excellentWork) {\n    return \"A+\";\n  } else if (student.okayStuff) {\n    if (student.triedHard) {\n      return \"B\";\n    } else {\n      return \"B-\";\n    }\n  } else {\n    return \"C\";\n  }\n};\n\neldest = 24 > 21 ? \"Liz\" : \"Ike\";\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">eldest</span>, <span class=\"cm-def\">grade</span>;\n\n<span class=\"cm-variable\">grade</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">student</span>) {\n  <span class=\"cm-keyword\">if</span> (<span class=\"cm-variable-2\">student</span>.<span class=\"cm-property\">excellentWork</span>) {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-string\">\"A+\"</span>;\n  } <span class=\"cm-keyword\">else</span> <span class=\"cm-keyword\">if</span> (<span class=\"cm-variable-2\">student</span>.<span class=\"cm-property\">okayStuff</span>) {\n    <span class=\"cm-keyword\">if</span> (<span class=\"cm-variable-2\">student</span>.<span class=\"cm-property\">triedHard</span>) {\n      <span class=\"cm-keyword\">return</span> <span class=\"cm-string\">\"B\"</span>;\n    } <span class=\"cm-keyword\">else</span> {\n      <span class=\"cm-keyword\">return</span> <span class=\"cm-string\">\"B-\"</span>;\n    }\n  } <span class=\"cm-keyword\">else</span> {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-string\">\"C\"</span>;\n  }\n};\n\n<span class=\"cm-variable\">eldest</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">24</span> <span class=\"cm-operator\">></span> <span class=\"cm-number\">21</span> <span class=\"cm-operator\">?</span> <span class=\"cm-string\">\"Liz\"</span> : <span class=\"cm-string\">\"Ike\"</span>;\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"expressions\" data-run=\"eldest\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>eldest</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Even though functions will always return their final value, it’s both possible and encouraged to return early from a function body writing out the explicit return (<code>return value</code>), when you know that you’re done.</p>\n<p>Because variable declarations occur at the top of scope, assignment can be used within expressions, even for variables that haven’t been seen before:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"expressions_assignment\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"expressions_assignment-coffee\">six = (one = 1) + (two = 2) + (three = 3)\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">six</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">one</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">1</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">+</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">two</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">2</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">+</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">three</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">3</span><span class=\"cm-punctuation\">)</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"expressions_assignment-js\">var one, six, three, two;\n\nsix = (one = 1) + (two = 2) + (three = 3);\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">one</span>, <span class=\"cm-def\">six</span>, <span class=\"cm-def\">three</span>, <span class=\"cm-def\">two</span>;\n\n<span class=\"cm-variable\">six</span> <span class=\"cm-operator\">=</span> (<span class=\"cm-variable\">one</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">1</span>) <span class=\"cm-operator\">+</span> (<span class=\"cm-variable\">two</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">2</span>) <span class=\"cm-operator\">+</span> (<span class=\"cm-variable\">three</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">3</span>);\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"expressions_assignment\" data-run=\"six\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>six</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Things that would otherwise be statements in JavaScript, when used as part of an expression in CoffeeScript, are converted into expressions by wrapping them in a closure. This lets you do useful things, like assign the result of a comprehension to a variable:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"expressions_comprehension\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"expressions_comprehension-coffee\"># The first ten global properties.\n\nglobals = (name for name of window)[0...10]\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\"># The first ten global properties.</span>\n\n<span class=\"cm-variable\">globals</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">name</span> <span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">name</span> <span class=\"cm-keyword\">of</span> <span class=\"cm-variable\">window</span><span class=\"cm-punctuation\">)[</span><span class=\"cm-number\">0</span><span class=\"cm-punctuation\">...</span><span class=\"cm-number\">10</span><span class=\"cm-punctuation\">]</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"expressions_comprehension-js\">// The first ten global properties.\nvar globals, name;\n\nglobals = ((function() {\n  var results;\n  results = [];\n  for (name in window) {\n    results.push(name);\n  }\n  return results;\n})()).slice(0, 10);\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\">// The first ten global properties.</span>\n<span class=\"cm-keyword\">var</span> <span class=\"cm-def\">globals</span>, <span class=\"cm-def\">name</span>;\n\n<span class=\"cm-variable\">globals</span> <span class=\"cm-operator\">=</span> ((<span class=\"cm-keyword\">function</span>() {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">results</span>;\n  <span class=\"cm-variable-2\">results</span> <span class=\"cm-operator\">=</span> [];\n  <span class=\"cm-keyword\">for</span> (<span class=\"cm-variable\">name</span> <span class=\"cm-keyword\">in</span> <span class=\"cm-variable\">window</span>) {\n    <span class=\"cm-variable-2\">results</span>.<span class=\"cm-property\">push</span>(<span class=\"cm-variable\">name</span>);\n  }\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">results</span>;\n})()).<span class=\"cm-property\">slice</span>(<span class=\"cm-number\">0</span>, <span class=\"cm-number\">10</span>);\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"expressions_comprehension\" data-run=\"globals\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>globals</button>\n    </div>\n  </div>\n  \n</aside>\n<p>As well as silly things, like passing a <code>try</code>/<code>catch</code> statement directly into a function call:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"expressions_try\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"expressions_try-coffee\">alert(\n  try\n    nonexistent / undefined\n  catch error\n    \"And the error is ... #{error}\"\n)\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">alert</span><span class=\"cm-punctuation\">(</span>\n  <span class=\"cm-keyword\">try</span>\n<span class=\"cm-indent\">    </span><span class=\"cm-variable\">nonexistent</span> <span class=\"cm-operator\">/</span> <span class=\"cm-atom\">undefined</span>\n<span class=\"cm-dedent\">  </span><span class=\"cm-keyword\">catch</span> <span class=\"cm-variable\">error</span>\n    <span class=\"cm-string\">\"And the error is ... #{error}\"</span>\n<span class=\"cm-punctuation\">)</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"expressions_try-js\">var error;\n\nalert((function() {\n  try {\n    return nonexistent / void 0;\n  } catch (error1) {\n    error = error1;\n    return `And the error is ... ${error}`;\n  }\n})());\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">error</span>;\n\n<span class=\"cm-variable\">alert</span>((<span class=\"cm-keyword\">function</span>() {\n  <span class=\"cm-keyword\">try</span> {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">nonexistent</span> <span class=\"cm-operator\">/</span> <span class=\"cm-keyword\">void</span> <span class=\"cm-number\">0</span>;\n  } <span class=\"cm-keyword\">catch</span> (<span class=\"cm-def\">error1</span>) {\n    <span class=\"cm-variable\">error</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">error1</span>;\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-string-2\">`And the error is ... ${</span><span class=\"cm-variable\">error</span><span class=\"cm-string-2\">}`</span>;\n  }\n})());\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"expressions_try\" data-run=\"true\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small></button>\n    </div>\n  </div>\n  \n</aside>\n<p>There are a handful of statements in JavaScript that can’t be meaningfully converted into expressions, namely <code>break</code>, <code>continue</code>, and <code>return</code>. If you make use of them within a block of code, CoffeeScript won’t try to perform the conversion.</p>\n\n        </section>\n        <section id=\"operators\">\n          <h2>Operators and Aliases</h2>\n<p>Because the <code>==</code> operator frequently causes undesirable coercion, is intransitive, and has a different meaning than in other languages, CoffeeScript compiles <code>==</code> into <code>===</code>, and <code>!=</code> into <code>!==</code>. In addition, <code>is</code> compiles into <code>===</code>, and <code>isnt</code> into <code>!==</code>.</p>\n<p>You can use <code>not</code> as an alias for <code>!</code>.</p>\n<p>For logic, <code>and</code> compiles to <code>&amp;&amp;</code>, and <code>or</code> into <code>||</code>.</p>\n<p>Instead of a newline or semicolon, <code>then</code> can be used to separate conditions from expressions, in <code>while</code>, <code>if</code>/<code>else</code>, and <code>switch</code>/<code>when</code> statements.</p>\n<p>As in <a href=\"http://yaml.org/\">YAML</a>, <code>on</code> and <code>yes</code> are the same as boolean <code>true</code>, while <code>off</code> and <code>no</code> are boolean <code>false</code>.</p>\n<p><code>unless</code> can be used as the inverse of <code>if</code>.</p>\n<p>As a shortcut for <code>this.property</code>, you can use <code>@property</code>.</p>\n<p>You can use <code>in</code> to test for array presence, and <code>of</code> to test for JavaScript object-key presence.</p>\n<p>In a <code>for</code> loop, <code>from</code> compiles to the <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of\">ES2015 <code>of</code></a>. (Yes, it’s unfortunate; the CoffeeScript <code>of</code> predates the ES2015 <code>of</code>.)</p>\n<p>To simplify math expressions, <code>**</code> can be used for exponentiation and <code>//</code> performs floor division. <code>%</code> works just like in JavaScript, while <code>%%</code> provides <a href=\"https://en.wikipedia.org/wiki/Modulo_operation\">“dividend dependent modulo”</a>:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"modulo\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"modulo-coffee\">-7 % 5 == -2 # The remainder of 7 / 5\n-7 %% 5 == 3 # n %% 5 is always between 0 and 4\n\ntabs.selectTabAtIndex((tabs.currentIndex - count) %% tabs.length)\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-number\">-7</span> <span class=\"cm-operator\">%</span> <span class=\"cm-number\">5</span> <span class=\"cm-operator\">==</span> <span class=\"cm-number\">-2</span> <span class=\"cm-comment\"># The remainder of 7 / 5</span>\n<span class=\"cm-number\">-7</span> <span class=\"cm-operator\">%%</span> <span class=\"cm-number\">5</span> <span class=\"cm-operator\">==</span> <span class=\"cm-number\">3</span> <span class=\"cm-comment\"># n %% 5 is always between 0 and 4</span>\n\n<span class=\"cm-variable\">tabs</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">selectTabAtIndex</span><span class=\"cm-punctuation\">((</span><span class=\"cm-variable\">tabs</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">currentIndex</span> <span class=\"cm-operator\">-</span> <span class=\"cm-variable\">count</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">%%</span> <span class=\"cm-variable\">tabs</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">length</span><span class=\"cm-punctuation\">)</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"modulo-js\">var modulo = function(a, b) { return (+a % (b = +b) + b) % b; };\n\n-7 % 5 === -2; // The remainder of 7 / 5\n\nmodulo(-7, 5) === 3; // n %% 5 is always between 0 and 4\n\ntabs.selectTabAtIndex(modulo(tabs.currentIndex - count, tabs.length));\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">modulo</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">a</span>, <span class=\"cm-def\">b</span>) { <span class=\"cm-keyword\">return</span> (<span class=\"cm-operator\">+</span><span class=\"cm-variable-2\">a</span> <span class=\"cm-operator\">%</span> (<span class=\"cm-variable-2\">b</span> <span class=\"cm-operator\">=</span> <span class=\"cm-operator\">+</span><span class=\"cm-variable-2\">b</span>) <span class=\"cm-operator\">+</span> <span class=\"cm-variable-2\">b</span>) <span class=\"cm-operator\">%</span> <span class=\"cm-variable-2\">b</span>; };\n\n<span class=\"cm-operator\">-</span><span class=\"cm-number\">7</span> <span class=\"cm-operator\">%</span> <span class=\"cm-number\">5</span> <span class=\"cm-operator\">===</span> <span class=\"cm-operator\">-</span><span class=\"cm-number\">2</span>; <span class=\"cm-comment\">// The remainder of 7 / 5</span>\n\n<span class=\"cm-variable\">modulo</span>(<span class=\"cm-operator\">-</span><span class=\"cm-number\">7</span>, <span class=\"cm-number\">5</span>) <span class=\"cm-operator\">===</span> <span class=\"cm-number\">3</span>; <span class=\"cm-comment\">// n %% 5 is always between 0 and 4</span>\n\n<span class=\"cm-variable\">tabs</span>.<span class=\"cm-property\">selectTabAtIndex</span>(<span class=\"cm-variable\">modulo</span>(<span class=\"cm-variable\">tabs</span>.<span class=\"cm-property\">currentIndex</span> <span class=\"cm-operator\">-</span> <span class=\"cm-variable\">count</span>, <span class=\"cm-variable\">tabs</span>.<span class=\"cm-property\">length</span>));\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p>All together now:</p>\n<table>\n<thead>\n<tr>\n<th>CoffeeScript</th>\n<th>JavaScript</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>is</code></td>\n<td><code>===</code></td>\n</tr>\n<tr>\n<td><code>isnt</code></td>\n<td><code>!==</code></td>\n</tr>\n<tr>\n<td><code>not</code></td>\n<td><code>!</code></td>\n</tr>\n<tr>\n<td><code>and</code></td>\n<td><code>&amp;&amp;</code></td>\n</tr>\n<tr>\n<td><code>or</code></td>\n<td><code>||</code></td>\n</tr>\n<tr>\n<td><code>true</code>, <code>yes</code>, <code>on</code></td>\n<td><code>true</code></td>\n</tr>\n<tr>\n<td><code>false</code>, <code>no</code>, <code>off</code> </td>\n<td><code>false</code></td>\n</tr>\n<tr>\n<td><code>@</code>, <code>this</code></td>\n<td><code>this</code></td>\n</tr>\n<tr>\n<td><code>a in b</code></td>\n<td><code>[].indexOf.call(b, a) &gt;= 0</code></td>\n</tr>\n<tr>\n<td><code>a of b</code></td>\n<td><code>a in b</code></td>\n</tr>\n<tr>\n<td><code>for a from b</code></td>\n<td><code>for (a of b)</code></td>\n</tr>\n<tr>\n<td><code>a ** b</code></td>\n<td><code>a ** b</code></td>\n</tr>\n<tr>\n<td><code>a // b</code></td>\n<td><code>Math.floor(a / b)</code></td>\n</tr>\n<tr>\n<td><code>a %% b</code></td>\n<td><code>(a % b + b) % b</code></td>\n</tr>\n</tbody>\n</table>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"aliases\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"aliases-coffee\">launch() if ignition is on\n\nvolume = 10 if band isnt SpinalTap\n\nletTheWildRumpusBegin() unless answer is no\n\nif car.speed < limit then accelerate()\n\nwinner = yes if pick in [47, 92, 13]\n\nprint inspect \"My name is #{@name}\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">launch</span><span class=\"cm-punctuation\">()</span> <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">ignition</span> <span class=\"cm-operator\">is</span> <span class=\"cm-atom\">on</span>\n\n<span class=\"cm-variable\">volume</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">10</span> <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">band</span> <span class=\"cm-operator\">isnt</span> <span class=\"cm-variable\">SpinalTap</span>\n\n<span class=\"cm-variable\">letTheWildRumpusBegin</span><span class=\"cm-punctuation\">()</span> <span class=\"cm-keyword\">unless</span> <span class=\"cm-variable\">answer</span> <span class=\"cm-operator\">is</span> <span class=\"cm-atom\">no</span>\n\n<span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">car</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">speed</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-variable\">limit</span> <span class=\"cm-keyword\">then</span> <span class=\"cm-variable\">accelerate</span><span class=\"cm-punctuation\">()</span>\n\n<span class=\"cm-variable\">winner</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-atom\">yes</span> <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">pick</span> <span class=\"cm-operator\">in</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-number\">47</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">92</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">13</span><span class=\"cm-punctuation\">]</span>\n\n<span class=\"cm-variable\">print</span> <span class=\"cm-variable\">inspect</span> <span class=\"cm-string\">\"My name is #{@name}\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"aliases-js\">var volume, winner;\n\nif (ignition === true) {\n  launch();\n}\n\nif (band !== SpinalTap) {\n  volume = 10;\n}\n\nif (answer !== false) {\n  letTheWildRumpusBegin();\n}\n\nif (car.speed < limit) {\n  accelerate();\n}\n\nif (pick === 47 || pick === 92 || pick === 13) {\n  winner = true;\n}\n\nprint(inspect(`My name is ${this.name}`));\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">volume</span>, <span class=\"cm-def\">winner</span>;\n\n<span class=\"cm-keyword\">if</span> (<span class=\"cm-variable\">ignition</span> <span class=\"cm-operator\">===</span> <span class=\"cm-atom\">true</span>) {\n  <span class=\"cm-variable\">launch</span>();\n}\n\n<span class=\"cm-keyword\">if</span> (<span class=\"cm-variable\">band</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-variable\">SpinalTap</span>) {\n  <span class=\"cm-variable\">volume</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">10</span>;\n}\n\n<span class=\"cm-keyword\">if</span> (<span class=\"cm-variable\">answer</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-atom\">false</span>) {\n  <span class=\"cm-variable\">letTheWildRumpusBegin</span>();\n}\n\n<span class=\"cm-keyword\">if</span> (<span class=\"cm-variable\">car</span>.<span class=\"cm-property\">speed</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-variable\">limit</span>) {\n  <span class=\"cm-variable\">accelerate</span>();\n}\n\n<span class=\"cm-keyword\">if</span> (<span class=\"cm-variable\">pick</span> <span class=\"cm-operator\">===</span> <span class=\"cm-number\">47</span> <span class=\"cm-operator\">||</span> <span class=\"cm-variable\">pick</span> <span class=\"cm-operator\">===</span> <span class=\"cm-number\">92</span> <span class=\"cm-operator\">||</span> <span class=\"cm-variable\">pick</span> <span class=\"cm-operator\">===</span> <span class=\"cm-number\">13</span>) {\n  <span class=\"cm-variable\">winner</span> <span class=\"cm-operator\">=</span> <span class=\"cm-atom\">true</span>;\n}\n\n<span class=\"cm-variable\">print</span>(<span class=\"cm-variable\">inspect</span>(<span class=\"cm-string-2\">`My name is ${</span><span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">name</span><span class=\"cm-string-2\">}`</span>));\n</pre>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"existential-operator\">\n          <h2>The Existential Operator</h2>\n<p>It’s a little difficult to check for the existence of a variable in JavaScript. <code>if (variable) …</code> comes close, but fails for zero, the empty string, and false (to name just the most common cases). CoffeeScript’s existential operator <code>?</code> returns true unless a variable is <code>null</code> or <code>undefined</code> or undeclared, which makes it analogous to Ruby’s <code>nil?</code>.</p>\n<p>It can also be used for safer conditional assignment than the JavaScript pattern <code>a = a || value</code> provides, for cases where you may be handling numbers or strings.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"existence\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"existence-coffee\">solipsism = true if mind? and not world?\n\nspeed = 0\nspeed ?= 15\n\nfootprints = yeti ? \"bear\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">solipsism</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-atom\">true</span> <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">mind</span><span class=\"cm-operator\">?</span> <span class=\"cm-operator\">and</span> <span class=\"cm-operator\">not</span> <span class=\"cm-variable\">world</span><span class=\"cm-operator\">?</span>\n\n<span class=\"cm-variable\">speed</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">0</span>\n<span class=\"cm-variable\">speed</span> <span class=\"cm-operator\">?</span><span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">15</span>\n\n<span class=\"cm-variable\">footprints</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">yeti</span> <span class=\"cm-operator\">?</span> <span class=\"cm-string\">\"bear\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"existence-js\">var footprints, solipsism, speed;\n\nif ((typeof mind !== \"undefined\" && mind !== null) && (typeof world === \"undefined\" || world === null)) {\n  solipsism = true;\n}\n\nspeed = 0;\n\nif (speed == null) {\n  speed = 15;\n}\n\nfootprints = typeof yeti !== \"undefined\" && yeti !== null ? yeti : \"bear\";\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">footprints</span>, <span class=\"cm-def\">solipsism</span>, <span class=\"cm-def\">speed</span>;\n\n<span class=\"cm-keyword\">if</span> ((<span class=\"cm-keyword\">typeof</span> <span class=\"cm-variable\">mind</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-string\">\"undefined\"</span> <span class=\"cm-operator\">&amp;&amp;</span> <span class=\"cm-variable\">mind</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-atom\">null</span>) <span class=\"cm-operator\">&amp;&amp;</span> (<span class=\"cm-keyword\">typeof</span> <span class=\"cm-variable\">world</span> <span class=\"cm-operator\">===</span> <span class=\"cm-string\">\"undefined\"</span> <span class=\"cm-operator\">||</span> <span class=\"cm-variable\">world</span> <span class=\"cm-operator\">===</span> <span class=\"cm-atom\">null</span>)) {\n  <span class=\"cm-variable\">solipsism</span> <span class=\"cm-operator\">=</span> <span class=\"cm-atom\">true</span>;\n}\n\n<span class=\"cm-variable\">speed</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">0</span>;\n\n<span class=\"cm-keyword\">if</span> (<span class=\"cm-variable\">speed</span> <span class=\"cm-operator\">==</span> <span class=\"cm-atom\">null</span>) {\n  <span class=\"cm-variable\">speed</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">15</span>;\n}\n\n<span class=\"cm-variable\">footprints</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">typeof</span> <span class=\"cm-variable\">yeti</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-string\">\"undefined\"</span> <span class=\"cm-operator\">&amp;&amp;</span> <span class=\"cm-variable\">yeti</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-atom\">null</span> <span class=\"cm-operator\">?</span> <span class=\"cm-variable\">yeti</span> : <span class=\"cm-string\">\"bear\"</span>;\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"existence\" data-run=\"footprints\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>footprints</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Note that if the compiler knows that <code>a</code> is in scope and therefore declared, <code>a?</code> compiles to <code>a != null</code>, <em>not</em> <code>a !== null</code>. The <code>!=</code> makes a loose comparison to <code>null</code>, which does double duty also comparing against <code>undefined</code>. The reverse also holds for <code>not a?</code> or <code>unless a?</code>.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"existence_declared\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"existence_declared-coffee\">major = 'Computer Science'\n\nunless major?\n  signUpForClass 'Introduction to Wines'\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">major</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">'Computer Science'</span>\n\n<span class=\"cm-keyword\">unless</span> <span class=\"cm-variable\">major</span><span class=\"cm-operator\">?</span>\n  <span class=\"cm-variable\">signUpForClass</span> <span class=\"cm-string\">'Introduction to Wines'</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"existence_declared-js\">var major;\n\nmajor = 'Computer Science';\n\nif (major == null) {\n  signUpForClass('Introduction to Wines');\n}\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">major</span>;\n\n<span class=\"cm-variable\">major</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">'Computer Science'</span>;\n\n<span class=\"cm-keyword\">if</span> (<span class=\"cm-variable\">major</span> <span class=\"cm-operator\">==</span> <span class=\"cm-atom\">null</span>) {\n  <span class=\"cm-variable\">signUpForClass</span>(<span class=\"cm-string\">'Introduction to Wines'</span>);\n}\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p>If a variable might be undeclared, the compiler does a thorough check. This is what JavaScript coders <em>should</em> be typing when they want to check if a mystery variable exists.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"existence_undeclared\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"existence_undeclared-coffee\">if window?\n  environment = 'browser (probably)'\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">window</span><span class=\"cm-operator\">?</span>\n  <span class=\"cm-variable\">environment</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">'browser (probably)'</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"existence_undeclared-js\">var environment;\n\nif (typeof window !== \"undefined\" && window !== null) {\n  environment = 'browser (probably)';\n}\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">environment</span>;\n\n<span class=\"cm-keyword\">if</span> (<span class=\"cm-keyword\">typeof</span> <span class=\"cm-variable\">window</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-string\">\"undefined\"</span> <span class=\"cm-operator\">&amp;&amp;</span> <span class=\"cm-variable\">window</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-atom\">null</span>) {\n  <span class=\"cm-variable\">environment</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">'browser (probably)'</span>;\n}\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p>The accessor variant of the existential operator <code>?.</code> can be used to soak up null references in a chain of properties. Use it instead of the dot accessor <code>.</code> in cases where the base value may be <code>null</code> or <code>undefined</code>. If all of the properties exist then you’ll get the expected result, if the chain is broken, <code>undefined</code> is returned instead of the <code>TypeError</code> that would be raised otherwise.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"soaks\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"soaks-coffee\">zip = lottery.drawWinner?().address?.zipcode\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">zip</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">lottery</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">drawWinner</span><span class=\"cm-operator\">?</span><span class=\"cm-punctuation\">().</span><span class=\"cm-property\">address</span><span class=\"cm-operator\">?</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">zipcode</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"soaks-js\">var ref, zip;\n\nzip = typeof lottery.drawWinner === \"function\" ? (ref = lottery.drawWinner().address) != null ? ref.zipcode : void 0 : void 0;\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">ref</span>, <span class=\"cm-def\">zip</span>;\n\n<span class=\"cm-variable\">zip</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">typeof</span> <span class=\"cm-variable\">lottery</span>.<span class=\"cm-property\">drawWinner</span> <span class=\"cm-operator\">===</span> <span class=\"cm-string\">\"function\"</span> <span class=\"cm-operator\">?</span> (<span class=\"cm-variable\">ref</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">lottery</span>.<span class=\"cm-property\">drawWinner</span>().<span class=\"cm-property\">address</span>) <span class=\"cm-operator\">!=</span> <span class=\"cm-atom\">null</span> <span class=\"cm-operator\">?</span> <span class=\"cm-variable\">ref</span>.<span class=\"cm-property\">zipcode</span> : <span class=\"cm-keyword\">void</span> <span class=\"cm-number\">0</span> : <span class=\"cm-keyword\">void</span> <span class=\"cm-number\">0</span>;\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p>For completeness:</p>\n<table>\n<thead>\n<tr>\n<th>Example</th>\n<th>Definition</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>a?</code></td>\n<td>tests that <code>a</code> is in scope and <code>a != null</code></td>\n</tr>\n<tr>\n<td><code>a ? b</code></td>\n<td>returns <code>a</code> if <code>a</code> is in scope and <code>a != null</code>; otherwise, <code>b</code></td>\n</tr>\n<tr>\n<td><code>a?.b</code> or <code>a?['b']</code></td>\n<td>returns <code>a.b</code> if <code>a</code> is in scope and <code>a != null</code>; otherwise, <code>undefined</code></td>\n</tr>\n<tr>\n<td><code>a?(b, c)</code> or <code>a? b, c</code> </td>\n<td>returns the result of calling <code>a</code> (with arguments <code>b</code> and <code>c</code>) if <code>a</code> is in scope and callable; otherwise, <code>undefined</code></td>\n</tr>\n<tr>\n<td><code>a ?= b</code></td>\n<td>assigns the value of <code>b</code> to <code>a</code> if <code>a</code> is not in scope or if <code>a == null</code>; produces the new value of <code>a</code></td>\n</tr>\n</tbody>\n</table>\n\n        </section>\n        <section id=\"chaining\">\n          <h2>Chaining Function Calls</h2>\n<p>Leading <code>.</code> closes all open calls, allowing for simpler chaining syntax.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"chaining\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"chaining-coffee\">$ 'body'\n.click (e) ->\n  $ '.box'\n  .fadeIn 'fast'\n  .addClass 'show'\n.css 'background', 'white'\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">$</span> <span class=\"cm-string\">'body'</span>\n<span class=\"cm-punctuation\">.</span><span class=\"cm-property\">click</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">e</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">$</span> <span class=\"cm-string\">'.box'</span>\n  <span class=\"cm-punctuation\">.</span><span class=\"cm-property\">fadeIn</span> <span class=\"cm-string\">'fast'</span>\n  <span class=\"cm-punctuation\">.</span><span class=\"cm-property\">addClass</span> <span class=\"cm-string\">'show'</span>\n<span class=\"cm-punctuation\">.</span><span class=\"cm-property\">css</span> <span class=\"cm-string\">'background'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'white'</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"chaining-js\">$('body').click(function(e) {\n  return $('.box').fadeIn('fast').addClass('show');\n}).css('background', 'white');\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">$</span>(<span class=\"cm-string\">'body'</span>).<span class=\"cm-property\">click</span>(<span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">e</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">$</span>(<span class=\"cm-string\">'.box'</span>).<span class=\"cm-property\">fadeIn</span>(<span class=\"cm-string\">'fast'</span>).<span class=\"cm-property\">addClass</span>(<span class=\"cm-string\">'show'</span>);\n}).<span class=\"cm-property\">css</span>(<span class=\"cm-string\">'background'</span>, <span class=\"cm-string\">'white'</span>);\n</pre>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"destructuring\">\n          <h2>Destructuring Assignment</h2>\n<p>Just like JavaScript (since ES2015), CoffeeScript has destructuring assignment syntax. When you assign an array or object literal to a value, CoffeeScript breaks up and matches both sides against each other, assigning the values on the right to the variables on the left. In the simplest case, it can be used for parallel assignment:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"parallel_assignment\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"parallel_assignment-coffee\">theBait   = 1000\ntheSwitch = 0\n\n[theBait, theSwitch] = [theSwitch, theBait]\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">theBait</span>   <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">1000</span>\n<span class=\"cm-variable\">theSwitch</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">0</span>\n\n<span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">theBait</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">theSwitch</span><span class=\"cm-punctuation\">]</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">theSwitch</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">theBait</span><span class=\"cm-punctuation\">]</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"parallel_assignment-js\">var theBait, theSwitch;\n\ntheBait = 1000;\n\ntheSwitch = 0;\n\n[theBait, theSwitch] = [theSwitch, theBait];\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">theBait</span>, <span class=\"cm-def\">theSwitch</span>;\n\n<span class=\"cm-variable\">theBait</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">1000</span>;\n\n<span class=\"cm-variable\">theSwitch</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">0</span>;\n\n[<span class=\"cm-variable\">theBait</span>, <span class=\"cm-variable\">theSwitch</span>] <span class=\"cm-operator\">=</span> [<span class=\"cm-variable\">theSwitch</span>, <span class=\"cm-variable\">theBait</span>];\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"parallel_assignment\" data-run=\"theBait\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>theBait</button>\n    </div>\n  </div>\n  \n</aside>\n<p>But it’s also helpful for dealing with functions that return multiple values.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"multiple_return_values\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"multiple_return_values-coffee\">weatherReport = (location) ->\n  # Make an Ajax request to fetch the weather...\n  [location, 72, \"Mostly Sunny\"]\n\n[city, temp, forecast] = weatherReport \"Berkeley, CA\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">weatherReport</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">location</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-comment\"># Make an Ajax request to fetch the weather...</span>\n  <span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">location</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">72</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">\"Mostly Sunny\"</span><span class=\"cm-punctuation\">]</span>\n\n<span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">city</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">temp</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">forecast</span><span class=\"cm-punctuation\">]</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">weatherReport</span> <span class=\"cm-string\">\"Berkeley, CA\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"multiple_return_values-js\">var city, forecast, temp, weatherReport;\n\nweatherReport = function(location) {\n  // Make an Ajax request to fetch the weather...\n  return [location, 72, \"Mostly Sunny\"];\n};\n\n[city, temp, forecast] = weatherReport(\"Berkeley, CA\");\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">city</span>, <span class=\"cm-def\">forecast</span>, <span class=\"cm-def\">temp</span>, <span class=\"cm-def\">weatherReport</span>;\n\n<span class=\"cm-variable\">weatherReport</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">location</span>) {\n  <span class=\"cm-comment\">// Make an Ajax request to fetch the weather...</span>\n  <span class=\"cm-keyword\">return</span> [<span class=\"cm-variable-2\">location</span>, <span class=\"cm-number\">72</span>, <span class=\"cm-string\">\"Mostly Sunny\"</span>];\n};\n\n[<span class=\"cm-variable\">city</span>, <span class=\"cm-variable\">temp</span>, <span class=\"cm-variable\">forecast</span>] <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">weatherReport</span>(<span class=\"cm-string\">\"Berkeley, CA\"</span>);\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"multiple_return_values\" data-run=\"forecast\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>forecast</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Destructuring assignment can be used with any depth of array and object nesting, to help pull out deeply nested properties.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"object_extraction\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"object_extraction-coffee\">futurists =\n  sculptor: \"Umberto Boccioni\"\n  painter:  \"Vladimir Burliuk\"\n  poet:\n    name:   \"F.T. Marinetti\"\n    address: [\n      \"Via Roma 42R\"\n      \"Bellagio, Italy 22021\"\n    ]\n\n{sculptor} = futurists\n\n{poet: {name, address: [street, city]}} = futurists\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">futurists</span> <span class=\"cm-punctuation\">=</span>\n<span class=\"cm-indent\">  </span><span class=\"cm-variable\">sculptor</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-string\">\"Umberto Boccioni\"</span>\n  <span class=\"cm-variable\">painter</span><span class=\"cm-punctuation\">:</span>  <span class=\"cm-string\">\"Vladimir Burliuk\"</span>\n  <span class=\"cm-variable\">poet</span><span class=\"cm-punctuation\">:</span>\n<span class=\"cm-indent\">    </span><span class=\"cm-variable\">name</span><span class=\"cm-punctuation\">:</span>   <span class=\"cm-string\">\"F.T. Marinetti\"</span>\n    <span class=\"cm-variable\">address</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-punctuation\">[</span>\n      <span class=\"cm-string\">\"Via Roma 42R\"</span>\n      <span class=\"cm-string\">\"Bellagio, Italy 22021\"</span>\n<span class=\"cm-dedent\">    </span><span class=\"cm-punctuation\">]</span>\n\n<span class=\"cm-punctuation\">{</span><span class=\"cm-variable\">sculptor</span><span class=\"cm-punctuation\">}</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">futurists</span>\n\n<span class=\"cm-punctuation\">{</span><span class=\"cm-variable\">poet</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-punctuation\">{</span><span class=\"cm-variable\">name</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">address</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">street</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">city</span><span class=\"cm-punctuation\">]}}</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">futurists</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"object_extraction-js\">var city, futurists, name, sculptor, street;\n\nfuturists = {\n  sculptor: \"Umberto Boccioni\",\n  painter: \"Vladimir Burliuk\",\n  poet: {\n    name: \"F.T. Marinetti\",\n    address: [\"Via Roma 42R\", \"Bellagio, Italy 22021\"]\n  }\n};\n\n({sculptor} = futurists);\n\n({\n  poet: {\n    name,\n    address: [street, city]\n  }\n} = futurists);\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">city</span>, <span class=\"cm-def\">futurists</span>, <span class=\"cm-def\">name</span>, <span class=\"cm-def\">sculptor</span>, <span class=\"cm-def\">street</span>;\n\n<span class=\"cm-variable\">futurists</span> <span class=\"cm-operator\">=</span> {\n  <span class=\"cm-property\">sculptor</span>: <span class=\"cm-string\">\"Umberto Boccioni\"</span>,\n  <span class=\"cm-property\">painter</span>: <span class=\"cm-string\">\"Vladimir Burliuk\"</span>,\n  <span class=\"cm-property\">poet</span>: {\n    <span class=\"cm-property\">name</span>: <span class=\"cm-string\">\"F.T. Marinetti\"</span>,\n    <span class=\"cm-property\">address</span>: [<span class=\"cm-string\">\"Via Roma 42R\"</span>, <span class=\"cm-string\">\"Bellagio, Italy 22021\"</span>]\n  }\n};\n\n({<span class=\"cm-property\">sculptor</span>} <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">futurists</span>);\n\n({\n  <span class=\"cm-property\">poet</span>: {\n    <span class=\"cm-property\">name</span>,\n    <span class=\"cm-property\">address</span>: [<span class=\"cm-variable\">street</span>, <span class=\"cm-variable\">city</span>]\n  }\n} <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">futurists</span>);\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"object_extraction\" data-run=\"name%20+%20%22-%22%20+%20street\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>name + &quot;-&quot; + street</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Destructuring assignment can even be combined with splats.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"patterns_and_splats\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"patterns_and_splats-coffee\">tag = \"<impossible>\"\n\n[open, contents..., close] = tag.split(\"\")\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">tag</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">\"&lt;impossible>\"</span>\n\n<span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">open</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">contents</span><span class=\"cm-punctuation\">...,</span> <span class=\"cm-variable\">close</span><span class=\"cm-punctuation\">]</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">tag</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">split</span><span class=\"cm-punctuation\">(</span><span class=\"cm-string\">\"\"</span><span class=\"cm-punctuation\">)</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"patterns_and_splats-js\">var close, contents, open, ref, tag,\n  splice = [].splice;\n\ntag = \"<impossible>\";\n\nref = tag.split(\"\"), [open, ...contents] = ref, [close] = splice.call(contents, -1);\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">close</span>, <span class=\"cm-def\">contents</span>, <span class=\"cm-def\">open</span>, <span class=\"cm-def\">ref</span>, <span class=\"cm-def\">tag</span>,\n  <span class=\"cm-def\">splice</span> <span class=\"cm-operator\">=</span> [].<span class=\"cm-property\">splice</span>;\n\n<span class=\"cm-variable\">tag</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">\"&lt;impossible>\"</span>;\n\n<span class=\"cm-variable\">ref</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">tag</span>.<span class=\"cm-property\">split</span>(<span class=\"cm-string\">\"\"</span>), [<span class=\"cm-variable\">open</span>, <span class=\"cm-meta\">...</span><span class=\"cm-variable\">contents</span>] <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">ref</span>, [<span class=\"cm-variable\">close</span>] <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">splice</span>.<span class=\"cm-property\">call</span>(<span class=\"cm-variable\">contents</span>, <span class=\"cm-operator\">-</span><span class=\"cm-number\">1</span>);\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"patterns_and_splats\" data-run=\"contents.join%28%22%22%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>contents.join(&quot;&quot;)</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Expansion can be used to retrieve elements from the end of an array without having to assign the rest of its values. It works in function parameter lists as well.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"expansion\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"expansion-coffee\">text = \"Every literary critic believes he will\n        outwit history and have the last word\"\n\n[first, ..., last] = text.split \" \"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">text</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">\"Every literary critic believes he will</span>\n<span class=\"cm-string\">        outwit history and have the last word\"</span>\n\n<span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">first</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-punctuation\">...,</span> <span class=\"cm-variable\">last</span><span class=\"cm-punctuation\">]</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">text</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">split</span> <span class=\"cm-string\">\" \"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"expansion-js\">var first, last, ref, text,\n  slice = [].slice;\n\ntext = \"Every literary critic believes he will outwit history and have the last word\";\n\nref = text.split(\" \"), [first] = ref, [last] = slice.call(ref, -1);\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">first</span>, <span class=\"cm-def\">last</span>, <span class=\"cm-def\">ref</span>, <span class=\"cm-def\">text</span>,\n  <span class=\"cm-def\">slice</span> <span class=\"cm-operator\">=</span> [].<span class=\"cm-property\">slice</span>;\n\n<span class=\"cm-variable\">text</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">\"Every literary critic believes he will outwit history and have the last word\"</span>;\n\n<span class=\"cm-variable\">ref</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">text</span>.<span class=\"cm-property\">split</span>(<span class=\"cm-string\">\" \"</span>), [<span class=\"cm-variable\">first</span>] <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">ref</span>, [<span class=\"cm-variable\">last</span>] <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">slice</span>.<span class=\"cm-property\">call</span>(<span class=\"cm-variable\">ref</span>, <span class=\"cm-operator\">-</span><span class=\"cm-number\">1</span>);\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"expansion\" data-run=\"first%20+%20%22%20%22%20+%20last\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>first + &quot; &quot; + last</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Destructuring assignment is also useful when combined with class constructors to assign properties to your instance from an options object passed to the constructor.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"constructor_destructuring\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"constructor_destructuring-coffee\">class Person\n  constructor: (options) ->\n    {@name, @age, @height = 'average'} = options\n\ntim = new Person name: 'Tim', age: 4\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">class</span> <span class=\"cm-variable\">Person</span>\n  <span class=\"cm-variable\">constructor</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">options</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n    <span class=\"cm-punctuation\">{</span><span class=\"cm-property\">@name</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-property\">@age</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-property\">@height</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-string\">'average'</span><span class=\"cm-punctuation\">}</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">options</span>\n\n<span class=\"cm-variable\">tim</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-keyword\">new</span> <span class=\"cm-variable\">Person</span> <span class=\"cm-variable\">name</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-string\">'Tim'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">age</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-number\">4</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"constructor_destructuring-js\">var Person, tim;\n\nPerson = class Person {\n  constructor(options) {\n    ({name: this.name, age: this.age, height: this.height = 'average'} = options);\n  }\n\n};\n\ntim = new Person({\n  name: 'Tim',\n  age: 4\n});\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">Person</span>, <span class=\"cm-def\">tim</span>;\n\n<span class=\"cm-variable\">Person</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">class</span> <span class=\"cm-def\">Person</span> {\n  <span class=\"cm-property\">constructor</span>(<span class=\"cm-def\">options</span>) {\n    ({<span class=\"cm-property\">name</span>: <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">name</span>, <span class=\"cm-property\">age</span>: <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">age</span>, <span class=\"cm-property\">height</span>: <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">height</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string\">'average'</span>} <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">options</span>);\n  }\n\n};\n\n<span class=\"cm-variable\">tim</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">new</span> <span class=\"cm-variable\">Person</span>({\n  <span class=\"cm-property\">name</span>: <span class=\"cm-string\">'Tim'</span>,\n  <span class=\"cm-property\">age</span>: <span class=\"cm-number\">4</span>\n});\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"constructor_destructuring\" data-run=\"tim.age%20+%20%22%20%22%20+%20tim.height\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>tim.age + &quot; &quot; + tim.height</button>\n    </div>\n  </div>\n  \n</aside>\n<p>The above example also demonstrates that if properties are missing in the destructured object or array, you can, just like in JavaScript, provide defaults. Note though that unlike with the existential operator, the default is only applied with the value is missing or <code>undefined</code>—<a href=\"#breaking-changes-default-values\">passing <code>null</code> will set a value of <code>null</code></a>, not the default.</p>\n\n        </section>\n        <section id=\"fat-arrow\">\n          <h2>Bound (Fat Arrow) Functions</h2>\n<p>In JavaScript, the <code>this</code> keyword is dynamically scoped to mean the object that the current function is attached to. If you pass a function as a callback or attach it to a different object, the original value of <code>this</code> will be lost. If you’re not familiar with this behavior, <a href=\"https://web.archive.org/web/20150316122013/http://www.digital-web.com/articles/scope_in_javascript\">this Digital Web article</a> gives a good overview of the quirks.</p>\n<p>The fat arrow <code>=&gt;</code> can be used to both define a function, and to bind it to the current value of <code>this</code>, right on the spot. This is helpful when using callback-based libraries like Prototype or jQuery, for creating iterator functions to pass to <code>each</code>, or event-handler functions to use with <code>on</code>. Functions created with the fat arrow are able to access properties of the <code>this</code> where they’re defined.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"fat_arrow\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"fat_arrow-coffee\">Account = (customer, cart) ->\n  @customer = customer\n  @cart = cart\n\n  $('.shopping_cart').on 'click', (event) =>\n    @customer.purchase @cart\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">Account</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">customer</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">cart</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-property\">@customer</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">customer</span>\n  <span class=\"cm-property\">@cart</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">cart</span>\n\n  <span class=\"cm-variable\">$</span><span class=\"cm-punctuation\">(</span><span class=\"cm-string\">'.shopping_cart'</span><span class=\"cm-punctuation\">).</span><span class=\"cm-atom\">on</span> <span class=\"cm-string\">'click'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">event</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">=></span>\n    <span class=\"cm-property\">@customer</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">purchase</span> <span class=\"cm-property\">@cart</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"fat_arrow-js\">var Account;\n\nAccount = function(customer, cart) {\n  this.customer = customer;\n  this.cart = cart;\n  return $('.shopping_cart').on('click', (event) => {\n    return this.customer.purchase(this.cart);\n  });\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">Account</span>;\n\n<span class=\"cm-variable\">Account</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">customer</span>, <span class=\"cm-def\">cart</span>) {\n  <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">customer</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">customer</span>;\n  <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">cart</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">cart</span>;\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">$</span>(<span class=\"cm-string\">'.shopping_cart'</span>).<span class=\"cm-property\">on</span>(<span class=\"cm-string\">'click'</span>, (<span class=\"cm-def\">event</span>) <span class=\"cm-operator\">=></span> {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">customer</span>.<span class=\"cm-property\">purchase</span>(<span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">cart</span>);\n  });\n};\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p>If we had used <code>-&gt;</code> in the callback above, <code>@customer</code> would have referred to the undefined “customer” property of the DOM element, and trying to call <code>purchase()</code> on it would have raised an exception.</p>\n<p>The fat arrow was one of the most popular features of CoffeeScript, and ES2015 <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions\">adopted it</a>; so CoffeeScript 2 compiles <code>=&gt;</code> to ES <code>=&gt;</code>.</p>\n\n        </section>\n        <section id=\"generators\">\n          <h2>Generator Functions</h2>\n<p>CoffeeScript supports ES2015 <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*\">generator functions</a> through the <code>yield</code> keyword. There’s no <code>function*(){}</code> nonsense — a generator in CoffeeScript is simply a function that yields.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"generators\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"generators-coffee\">perfectSquares = ->\n  num = 0\n  loop\n    num += 1\n    yield num * num\n  return\n\nwindow.ps or= perfectSquares()\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">perfectSquares</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">num</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">0</span>\n  <span class=\"cm-keyword\">loop</span>\n    <span class=\"cm-variable\">num</span> <span class=\"cm-operator\">+=</span> <span class=\"cm-number\">1</span>\n    <span class=\"cm-variable\">yield</span> <span class=\"cm-variable\">num</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable\">num</span>\n<span class=\"cm-dedent\">  </span><span class=\"cm-keyword\">return</span>\n\n<span class=\"cm-variable\">window</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">ps</span> <span class=\"cm-operator\">or=</span> <span class=\"cm-variable\">perfectSquares</span><span class=\"cm-punctuation\">()</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"generators-js\">var perfectSquares;\n\nperfectSquares = function*() {\n  var num;\n  num = 0;\n  while (true) {\n    num += 1;\n    yield num * num;\n  }\n};\n\nwindow.ps || (window.ps = perfectSquares());\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">perfectSquares</span>;\n\n<span class=\"cm-variable\">perfectSquares</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function*</span>() {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">num</span>;\n  <span class=\"cm-variable-2\">num</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">0</span>;\n  <span class=\"cm-keyword\">while</span> (<span class=\"cm-atom\">true</span>) {\n    <span class=\"cm-variable-2\">num</span> <span class=\"cm-operator\">+=</span> <span class=\"cm-number\">1</span>;\n    <span class=\"cm-keyword\">yield</span> <span class=\"cm-variable-2\">num</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable-2\">num</span>;\n  }\n};\n\n<span class=\"cm-variable\">window</span>.<span class=\"cm-property\">ps</span> <span class=\"cm-operator\">||</span> (<span class=\"cm-variable\">window</span>.<span class=\"cm-property\">ps</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">perfectSquares</span>());\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"generators\" data-run=\"ps.next%28%29.value\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>ps.next().value</button>\n    </div>\n  </div>\n  \n</aside>\n<p><code>yield*</code> is called <code>yield from</code>, and <code>yield return</code> may be used if you need to force a generator that doesn’t yield.</p>\n<div id=\"generator-iteration\" class=\"bookmark\"></div>\n<p>You can iterate over a generator function using <code>for…from</code>.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"generator_iteration\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"generator_iteration-coffee\">fibonacci = ->\n  [previous, current] = [1, 1]\n  loop\n    [previous, current] = [current, previous + current]\n    yield current\n  return\n\ngetFibonacciNumbers = (length) ->\n  results = [1]\n  for n from fibonacci()\n    results.push n\n    break if results.length is length\n  results\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">fibonacci</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">previous</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">current</span><span class=\"cm-punctuation\">]</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-number\">1</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">1</span><span class=\"cm-punctuation\">]</span>\n  <span class=\"cm-keyword\">loop</span>\n    <span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">previous</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">current</span><span class=\"cm-punctuation\">]</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">current</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">previous</span> <span class=\"cm-operator\">+</span> <span class=\"cm-variable\">current</span><span class=\"cm-punctuation\">]</span>\n    <span class=\"cm-variable\">yield</span> <span class=\"cm-variable\">current</span>\n<span class=\"cm-dedent\">  </span><span class=\"cm-keyword\">return</span>\n\n<span class=\"cm-variable\">getFibonacciNumbers</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">length</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">results</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-number\">1</span><span class=\"cm-punctuation\">]</span>\n  <span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">n</span> <span class=\"cm-variable\">from</span> <span class=\"cm-variable\">fibonacci</span><span class=\"cm-punctuation\">()</span>\n    <span class=\"cm-variable\">results</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">push</span> <span class=\"cm-variable\">n</span>\n    <span class=\"cm-keyword\">break</span> <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">results</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">length</span> <span class=\"cm-operator\">is</span> <span class=\"cm-variable\">length</span>\n<span class=\"cm-dedent\">  </span><span class=\"cm-variable\">results</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"generator_iteration-js\">var fibonacci, getFibonacciNumbers;\n\nfibonacci = function*() {\n  var current, previous;\n  [previous, current] = [1, 1];\n  while (true) {\n    [previous, current] = [current, previous + current];\n    yield current;\n  }\n};\n\ngetFibonacciNumbers = function(length) {\n  var n, results;\n  results = [1];\n  for (n of fibonacci()) {\n    results.push(n);\n    if (results.length === length) {\n      break;\n    }\n  }\n  return results;\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">fibonacci</span>, <span class=\"cm-def\">getFibonacciNumbers</span>;\n\n<span class=\"cm-variable\">fibonacci</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function*</span>() {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">current</span>, <span class=\"cm-def\">previous</span>;\n  [<span class=\"cm-variable-2\">previous</span>, <span class=\"cm-variable-2\">current</span>] <span class=\"cm-operator\">=</span> [<span class=\"cm-number\">1</span>, <span class=\"cm-number\">1</span>];\n  <span class=\"cm-keyword\">while</span> (<span class=\"cm-atom\">true</span>) {\n    [<span class=\"cm-variable-2\">previous</span>, <span class=\"cm-variable-2\">current</span>] <span class=\"cm-operator\">=</span> [<span class=\"cm-variable-2\">current</span>, <span class=\"cm-variable-2\">previous</span> <span class=\"cm-operator\">+</span> <span class=\"cm-variable-2\">current</span>];\n    <span class=\"cm-keyword\">yield</span> <span class=\"cm-variable-2\">current</span>;\n  }\n};\n\n<span class=\"cm-variable\">getFibonacciNumbers</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">length</span>) {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">n</span>, <span class=\"cm-def\">results</span>;\n  <span class=\"cm-variable-2\">results</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-number\">1</span>];\n  <span class=\"cm-keyword\">for</span> (<span class=\"cm-variable-2\">n</span> <span class=\"cm-keyword\">of</span> <span class=\"cm-variable\">fibonacci</span>()) {\n    <span class=\"cm-variable-2\">results</span>.<span class=\"cm-property\">push</span>(<span class=\"cm-variable-2\">n</span>);\n    <span class=\"cm-keyword\">if</span> (<span class=\"cm-variable-2\">results</span>.<span class=\"cm-property\">length</span> <span class=\"cm-operator\">===</span> <span class=\"cm-variable-2\">length</span>) {\n      <span class=\"cm-keyword\">break</span>;\n    }\n  }\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">results</span>;\n};\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"generator_iteration\" data-run=\"getFibonacciNumbers%2810%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>getFibonacciNumbers(10)</button>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"async-functions\">\n          <h2>Async Functions</h2>\n<p>ES2017’s <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function\">async functions</a> are supported through the <code>await</code> keyword. Like with generators, there’s no need for an <code>async</code> keyword; an async function in CoffeeScript is simply a function that awaits.</p>\n<p>Similar to how <code>yield return</code> forces a generator, <code>await return</code> may be used to force a function to be async.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"async\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"async-coffee\"># Your browser must support async/await and speech synthesis\n# to run this example.\n\nsleep = (ms) ->\n  new Promise (resolve) ->\n    window.setTimeout resolve, ms\n\nsay = (text) ->\n  window.speechSynthesis.cancel()\n  window.speechSynthesis.speak new SpeechSynthesisUtterance text\n\ncountdown = (seconds) ->\n  for i in [seconds..1]\n    say i\n    await sleep 1000 # wait one second\n  say \"Blastoff!\"\n\ncountdown 3\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\"># Your browser must support async/await and speech synthesis</span>\n<span class=\"cm-comment\"># to run this example.</span>\n\n<span class=\"cm-variable\">sleep</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">ms</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-keyword\">new</span> <span class=\"cm-variable\">Promise</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">resolve</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n    <span class=\"cm-variable\">window</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">setTimeout</span> <span class=\"cm-variable\">resolve</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">ms</span>\n\n<span class=\"cm-variable\">say</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">text</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">window</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">speechSynthesis</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">cancel</span><span class=\"cm-punctuation\">()</span>\n  <span class=\"cm-variable\">window</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">speechSynthesis</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">speak</span> <span class=\"cm-keyword\">new</span> <span class=\"cm-variable\">SpeechSynthesisUtterance</span> <span class=\"cm-variable\">text</span>\n\n<span class=\"cm-variable\">countdown</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">seconds</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">i</span> <span class=\"cm-operator\">in</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">seconds</span><span class=\"cm-punctuation\">..</span><span class=\"cm-number\">1</span><span class=\"cm-punctuation\">]</span>\n    <span class=\"cm-variable\">say</span> <span class=\"cm-variable\">i</span>\n    <span class=\"cm-variable\">await</span> <span class=\"cm-variable\">sleep</span> <span class=\"cm-number\">1000</span> <span class=\"cm-comment\"># wait one second</span>\n<span class=\"cm-dedent\">  </span><span class=\"cm-variable\">say</span> <span class=\"cm-string\">\"Blastoff!\"</span>\n\n<span class=\"cm-variable\">countdown</span> <span class=\"cm-number\">3</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"async-js\">// Your browser must support async/await and speech synthesis\n// to run this example.\nvar countdown, say, sleep;\n\nsleep = function(ms) {\n  return new Promise(function(resolve) {\n    return window.setTimeout(resolve, ms);\n  });\n};\n\nsay = function(text) {\n  window.speechSynthesis.cancel();\n  return window.speechSynthesis.speak(new SpeechSynthesisUtterance(text));\n};\n\ncountdown = async function(seconds) {\n  var i, j, ref;\n  for (i = j = ref = seconds; (ref <= 1 ? j <= 1 : j >= 1); i = ref <= 1 ? ++j : --j) {\n    say(i);\n    await sleep(1000); // wait one second\n  }\n  return say(\"Blastoff!\");\n};\n\ncountdown(3);\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\">// Your browser must support async/await and speech synthesis</span>\n<span class=\"cm-comment\">// to run this example.</span>\n<span class=\"cm-keyword\">var</span> <span class=\"cm-def\">countdown</span>, <span class=\"cm-def\">say</span>, <span class=\"cm-def\">sleep</span>;\n\n<span class=\"cm-variable\">sleep</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">ms</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-keyword\">new</span> <span class=\"cm-variable\">Promise</span>(<span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">resolve</span>) {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">window</span>.<span class=\"cm-property\">setTimeout</span>(<span class=\"cm-variable-2\">resolve</span>, <span class=\"cm-variable-2\">ms</span>);\n  });\n};\n\n<span class=\"cm-variable\">say</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">text</span>) {\n  <span class=\"cm-variable\">window</span>.<span class=\"cm-property\">speechSynthesis</span>.<span class=\"cm-property\">cancel</span>();\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">window</span>.<span class=\"cm-property\">speechSynthesis</span>.<span class=\"cm-property\">speak</span>(<span class=\"cm-keyword\">new</span> <span class=\"cm-variable\">SpeechSynthesisUtterance</span>(<span class=\"cm-variable-2\">text</span>));\n};\n\n<span class=\"cm-variable\">countdown</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">async</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">seconds</span>) {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">i</span>, <span class=\"cm-def\">j</span>, <span class=\"cm-def\">ref</span>;\n  <span class=\"cm-keyword\">for</span> (<span class=\"cm-variable-2\">i</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">j</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">ref</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">seconds</span>; (<span class=\"cm-variable-2\">ref</span> <span class=\"cm-operator\">&lt;=</span> <span class=\"cm-number\">1</span> <span class=\"cm-operator\">?</span> <span class=\"cm-variable-2\">j</span> <span class=\"cm-operator\">&lt;=</span> <span class=\"cm-number\">1</span> : <span class=\"cm-variable-2\">j</span> <span class=\"cm-operator\">>=</span> <span class=\"cm-number\">1</span>); <span class=\"cm-variable-2\">i</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">ref</span> <span class=\"cm-operator\">&lt;=</span> <span class=\"cm-number\">1</span> <span class=\"cm-operator\">?</span> <span class=\"cm-operator\">++</span><span class=\"cm-variable-2\">j</span> : <span class=\"cm-operator\">--</span><span class=\"cm-variable-2\">j</span>) {\n    <span class=\"cm-variable\">say</span>(<span class=\"cm-variable-2\">i</span>);\n    <span class=\"cm-keyword\">await</span> <span class=\"cm-variable\">sleep</span>(<span class=\"cm-number\">1000</span>); <span class=\"cm-comment\">// wait one second</span>\n  }\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">say</span>(<span class=\"cm-string\">\"Blastoff!\"</span>);\n};\n\n<span class=\"cm-variable\">countdown</span>(<span class=\"cm-number\">3</span>);\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"async\" data-run=\"true\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small></button>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"classes\">\n          <h2>Classes</h2>\n<p>CoffeeScript 1 provided the <code>class</code> and <code>extends</code> keywords as syntactic sugar for working with prototypal functions. With ES2015, JavaScript has adopted those keywords; so CoffeeScript 2 compiles its <code>class</code> and <code>extends</code> keywords to ES2015 classes.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"classes\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"classes-coffee\">class Animal\n  constructor: (@name) ->\n\n  move: (meters) ->\n    alert @name + \" moved #{meters}m.\"\n\nclass Snake extends Animal\n  move: ->\n    alert \"Slithering...\"\n    super 5\n\nclass Horse extends Animal\n  move: ->\n    alert \"Galloping...\"\n    super 45\n\nsam = new Snake \"Sammy the Python\"\ntom = new Horse \"Tommy the Palomino\"\n\nsam.move()\ntom.move()\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">class</span> <span class=\"cm-variable\">Animal</span>\n  <span class=\"cm-variable\">constructor</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-property\">@name</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n\n<span class=\"cm-dedent\">  </span><span class=\"cm-variable\">move</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">meters</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n    <span class=\"cm-variable\">alert</span> <span class=\"cm-property\">@name</span> <span class=\"cm-operator\">+</span> <span class=\"cm-string\">\" moved #{meters}m.\"</span>\n\n<span class=\"cm-keyword\">class</span> <span class=\"cm-variable\">Snake</span> <span class=\"cm-keyword\">extends</span> <span class=\"cm-variable\">Animal</span>\n  <span class=\"cm-variable\">move</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-operator\">-></span>\n    <span class=\"cm-variable\">alert</span> <span class=\"cm-string\">\"Slithering...\"</span>\n    <span class=\"cm-variable\">super</span> <span class=\"cm-number\">5</span>\n\n<span class=\"cm-keyword\">class</span> <span class=\"cm-variable\">Horse</span> <span class=\"cm-keyword\">extends</span> <span class=\"cm-variable\">Animal</span>\n  <span class=\"cm-variable\">move</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-operator\">-></span>\n    <span class=\"cm-variable\">alert</span> <span class=\"cm-string\">\"Galloping...\"</span>\n    <span class=\"cm-variable\">super</span> <span class=\"cm-number\">45</span>\n\n<span class=\"cm-variable\">sam</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-keyword\">new</span> <span class=\"cm-variable\">Snake</span> <span class=\"cm-string\">\"Sammy the Python\"</span>\n<span class=\"cm-variable\">tom</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-keyword\">new</span> <span class=\"cm-variable\">Horse</span> <span class=\"cm-string\">\"Tommy the Palomino\"</span>\n\n<span class=\"cm-variable\">sam</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">move</span><span class=\"cm-punctuation\">()</span>\n<span class=\"cm-variable\">tom</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">move</span><span class=\"cm-punctuation\">()</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"classes-js\">var Animal, Horse, Snake, sam, tom;\n\nAnimal = class Animal {\n  constructor(name) {\n    this.name = name;\n  }\n\n  move(meters) {\n    return alert(this.name + ` moved ${meters}m.`);\n  }\n\n};\n\nSnake = class Snake extends Animal {\n  move() {\n    alert(\"Slithering...\");\n    return super.move(5);\n  }\n\n};\n\nHorse = class Horse extends Animal {\n  move() {\n    alert(\"Galloping...\");\n    return super.move(45);\n  }\n\n};\n\nsam = new Snake(\"Sammy the Python\");\n\ntom = new Horse(\"Tommy the Palomino\");\n\nsam.move();\n\ntom.move();\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">Animal</span>, <span class=\"cm-def\">Horse</span>, <span class=\"cm-def\">Snake</span>, <span class=\"cm-def\">sam</span>, <span class=\"cm-def\">tom</span>;\n\n<span class=\"cm-variable\">Animal</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">class</span> <span class=\"cm-def\">Animal</span> {\n  <span class=\"cm-property\">constructor</span>(<span class=\"cm-def\">name</span>) {\n    <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">name</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">name</span>;\n  }\n\n  <span class=\"cm-property\">move</span>(<span class=\"cm-def\">meters</span>) {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">alert</span>(<span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">name</span> <span class=\"cm-operator\">+</span> <span class=\"cm-string-2\">` moved ${</span><span class=\"cm-variable-2\">meters</span><span class=\"cm-string-2\">}m.`</span>);\n  }\n\n};\n\n<span class=\"cm-variable\">Snake</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">class</span> <span class=\"cm-def\">Snake</span> <span class=\"cm-keyword\">extends</span> <span class=\"cm-variable\">Animal</span> {\n  <span class=\"cm-property\">move</span>() {\n    <span class=\"cm-variable\">alert</span>(<span class=\"cm-string\">\"Slithering...\"</span>);\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-keyword\">super</span>.<span class=\"cm-property\">move</span>(<span class=\"cm-number\">5</span>);\n  }\n\n};\n\n<span class=\"cm-variable\">Horse</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">class</span> <span class=\"cm-def\">Horse</span> <span class=\"cm-keyword\">extends</span> <span class=\"cm-variable\">Animal</span> {\n  <span class=\"cm-property\">move</span>() {\n    <span class=\"cm-variable\">alert</span>(<span class=\"cm-string\">\"Galloping...\"</span>);\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-keyword\">super</span>.<span class=\"cm-property\">move</span>(<span class=\"cm-number\">45</span>);\n  }\n\n};\n\n<span class=\"cm-variable\">sam</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">new</span> <span class=\"cm-variable\">Snake</span>(<span class=\"cm-string\">\"Sammy the Python\"</span>);\n\n<span class=\"cm-variable\">tom</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">new</span> <span class=\"cm-variable\">Horse</span>(<span class=\"cm-string\">\"Tommy the Palomino\"</span>);\n\n<span class=\"cm-variable\">sam</span>.<span class=\"cm-property\">move</span>();\n\n<span class=\"cm-variable\">tom</span>.<span class=\"cm-property\">move</span>();\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"classes\" data-run=\"true\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small></button>\n    </div>\n  </div>\n  \n</aside>\n<p>Static methods can be defined using <code>@</code> before the method name:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"static\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"static-coffee\">class Teenager\n  @say: (speech) ->\n    words = speech.split ' '\n    fillers = ['uh', 'um', 'like', 'actually', 'so', 'maybe']\n    output = []\n    for word, index in words\n      output.push word\n      output.push fillers[Math.floor(Math.random() * fillers.length)] unless index is words.length - 1\n    output.join ', '\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">class</span> <span class=\"cm-variable\">Teenager</span>\n  <span class=\"cm-property\">@say</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">speech</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n    <span class=\"cm-variable\">words</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">speech</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">split</span> <span class=\"cm-string\">' '</span>\n    <span class=\"cm-variable\">fillers</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-string\">'uh'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'um'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'like'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'actually'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'so'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'maybe'</span><span class=\"cm-punctuation\">]</span>\n    <span class=\"cm-variable\">output</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">[]</span>\n    <span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">word</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">index</span> <span class=\"cm-operator\">in</span> <span class=\"cm-variable\">words</span>\n      <span class=\"cm-variable\">output</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">push</span> <span class=\"cm-variable\">word</span>\n      <span class=\"cm-variable\">output</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">push</span> <span class=\"cm-variable\">fillers</span><span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">Math</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">floor</span><span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">Math</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">random</span><span class=\"cm-punctuation\">()</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable\">fillers</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">length</span><span class=\"cm-punctuation\">)]</span> <span class=\"cm-keyword\">unless</span> <span class=\"cm-variable\">index</span> <span class=\"cm-operator\">is</span> <span class=\"cm-variable\">words</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">length</span> <span class=\"cm-operator\">-</span> <span class=\"cm-number\">1</span>\n<span class=\"cm-dedent\">    </span><span class=\"cm-variable\">output</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">join</span> <span class=\"cm-string\">', '</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"static-js\">var Teenager;\n\nTeenager = class Teenager {\n  static say(speech) {\n    var fillers, i, index, len, output, word, words;\n    words = speech.split(' ');\n    fillers = ['uh', 'um', 'like', 'actually', 'so', 'maybe'];\n    output = [];\n    for (index = i = 0, len = words.length; i < len; index = ++i) {\n      word = words[index];\n      output.push(word);\n      if (index !== words.length - 1) {\n        output.push(fillers[Math.floor(Math.random() * fillers.length)]);\n      }\n    }\n    return output.join(', ');\n  }\n\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">Teenager</span>;\n\n<span class=\"cm-variable\">Teenager</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">class</span> <span class=\"cm-def\">Teenager</span> {\n  <span class=\"cm-keyword\">static</span> <span class=\"cm-property\">say</span>(<span class=\"cm-def\">speech</span>) {\n    <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">fillers</span>, <span class=\"cm-def\">i</span>, <span class=\"cm-def\">index</span>, <span class=\"cm-def\">len</span>, <span class=\"cm-def\">output</span>, <span class=\"cm-def\">word</span>, <span class=\"cm-def\">words</span>;\n    <span class=\"cm-variable-2\">words</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">speech</span>.<span class=\"cm-property\">split</span>(<span class=\"cm-string\">' '</span>);\n    <span class=\"cm-variable-2\">fillers</span> <span class=\"cm-operator\">=</span> [<span class=\"cm-string\">'uh'</span>, <span class=\"cm-string\">'um'</span>, <span class=\"cm-string\">'like'</span>, <span class=\"cm-string\">'actually'</span>, <span class=\"cm-string\">'so'</span>, <span class=\"cm-string\">'maybe'</span>];\n    <span class=\"cm-variable-2\">output</span> <span class=\"cm-operator\">=</span> [];\n    <span class=\"cm-keyword\">for</span> (<span class=\"cm-variable-2\">index</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">i</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">0</span>, <span class=\"cm-variable-2\">len</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">words</span>.<span class=\"cm-property\">length</span>; <span class=\"cm-variable-2\">i</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-variable-2\">len</span>; <span class=\"cm-variable-2\">index</span> <span class=\"cm-operator\">=</span> <span class=\"cm-operator\">++</span><span class=\"cm-variable-2\">i</span>) {\n      <span class=\"cm-variable-2\">word</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">words</span>[<span class=\"cm-variable-2\">index</span>];\n      <span class=\"cm-variable-2\">output</span>.<span class=\"cm-property\">push</span>(<span class=\"cm-variable-2\">word</span>);\n      <span class=\"cm-keyword\">if</span> (<span class=\"cm-variable-2\">index</span> <span class=\"cm-operator\">!==</span> <span class=\"cm-variable-2\">words</span>.<span class=\"cm-property\">length</span> <span class=\"cm-operator\">-</span> <span class=\"cm-number\">1</span>) {\n        <span class=\"cm-variable-2\">output</span>.<span class=\"cm-property\">push</span>(<span class=\"cm-variable-2\">fillers</span>[<span class=\"cm-variable\">Math</span>.<span class=\"cm-property\">floor</span>(<span class=\"cm-variable\">Math</span>.<span class=\"cm-property\">random</span>() <span class=\"cm-operator\">*</span> <span class=\"cm-variable-2\">fillers</span>.<span class=\"cm-property\">length</span>)]);\n      }\n    }\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">output</span>.<span class=\"cm-property\">join</span>(<span class=\"cm-string\">', '</span>);\n  }\n\n};\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"static\" data-run=\"Teenager.say%28%22Are%20we%20there%20yet%3F%22%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>Teenager.say(&quot;Are we there yet?&quot;)</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Finally, class definitions are blocks of executable code, which make for interesting metaprogramming possibilities. In the context of a class definition, <code>this</code> is the class object itself; therefore, you can assign static properties by using <code>@property: value</code>.</p>\n\n        </section>\n        <section id=\"prototypal-inheritance\">\n          <h2>Prototypal Inheritance</h2>\n<p>In addition to supporting ES2015 classes, CoffeeScript provides a shortcut for working with prototypes. The <code>::</code> operator gives you quick access to an object’s prototype:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"prototypes\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"prototypes-coffee\">String::dasherize = ->\n  this.replace /_/g, \"-\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">String</span><span class=\"cm-punctuation\">::</span><span class=\"cm-variable\">dasherize</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-keyword\">this</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">replace</span> <span class=\"cm-string-2\">/_/</span><span class=\"cm-variable\">g</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">\"-\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"prototypes-js\">String.prototype.dasherize = function() {\n  return this.replace(/_/g, \"-\");\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">String</span>.<span class=\"cm-property\">prototype</span>.<span class=\"cm-property\">dasherize</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>() {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">replace</span>(<span class=\"cm-string-2\">/_/g</span>, <span class=\"cm-string\">\"-\"</span>);\n};\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"prototypes\" data-run=\"%22one_two%22.dasherize%28%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>&quot;one_two&quot;.dasherize()</button>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"switch\">\n          <h2>Switch/When/Else</h2>\n<p><code>switch</code> statements in JavaScript are a bit awkward. You need to remember to <code>break</code> at the end of every <code>case</code> statement to avoid accidentally falling through to the default case. CoffeeScript prevents accidental fall-through, and can convert the <code>switch</code> into a returnable, assignable expression. The format is: <code>switch</code> condition, <code>when</code> clauses, <code>else</code> the default case.</p>\n<p>As in Ruby, <code>switch</code> statements in CoffeeScript can take multiple values for each <code>when</code> clause. If any of the values match, the clause runs.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"switch\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"switch-coffee\">switch day\n  when \"Mon\" then go work\n  when \"Tue\" then go relax\n  when \"Thu\" then go iceFishing\n  when \"Fri\", \"Sat\"\n    if day is bingoDay\n      go bingo\n      go dancing\n  when \"Sun\" then go church\n  else go work\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">switch</span> <span class=\"cm-variable\">day</span>\n  <span class=\"cm-keyword\">when</span> <span class=\"cm-string\">\"Mon\"</span> <span class=\"cm-keyword\">then</span> <span class=\"cm-variable\">go</span> <span class=\"cm-variable\">work</span>\n  <span class=\"cm-keyword\">when</span> <span class=\"cm-string\">\"Tue\"</span> <span class=\"cm-keyword\">then</span> <span class=\"cm-variable\">go</span> <span class=\"cm-variable\">relax</span>\n  <span class=\"cm-keyword\">when</span> <span class=\"cm-string\">\"Thu\"</span> <span class=\"cm-keyword\">then</span> <span class=\"cm-variable\">go</span> <span class=\"cm-variable\">iceFishing</span>\n  <span class=\"cm-keyword\">when</span> <span class=\"cm-string\">\"Fri\"</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">\"Sat\"</span>\n<span class=\"cm-indent\">    </span><span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">day</span> <span class=\"cm-operator\">is</span> <span class=\"cm-variable\">bingoDay</span>\n      <span class=\"cm-variable\">go</span> <span class=\"cm-variable\">bingo</span>\n      <span class=\"cm-variable\">go</span> <span class=\"cm-variable\">dancing</span>\n<span class=\"cm-dedent\">  </span><span class=\"cm-keyword\">when</span> <span class=\"cm-string\">\"Sun\"</span> <span class=\"cm-keyword\">then</span> <span class=\"cm-variable\">go</span> <span class=\"cm-variable\">church</span>\n  <span class=\"cm-keyword\">else</span> <span class=\"cm-variable\">go</span> <span class=\"cm-variable\">work</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"switch-js\">switch (day) {\n  case \"Mon\":\n    go(work);\n    break;\n  case \"Tue\":\n    go(relax);\n    break;\n  case \"Thu\":\n    go(iceFishing);\n    break;\n  case \"Fri\":\n  case \"Sat\":\n    if (day === bingoDay) {\n      go(bingo);\n      go(dancing);\n    }\n    break;\n  case \"Sun\":\n    go(church);\n    break;\n  default:\n    go(work);\n}\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">switch</span> (<span class=\"cm-variable\">day</span>) {\n  <span class=\"cm-keyword\">case</span> <span class=\"cm-string\">\"Mon\"</span>:\n    <span class=\"cm-variable\">go</span>(<span class=\"cm-variable\">work</span>);\n    <span class=\"cm-keyword\">break</span>;\n  <span class=\"cm-keyword\">case</span> <span class=\"cm-string\">\"Tue\"</span>:\n    <span class=\"cm-variable\">go</span>(<span class=\"cm-variable\">relax</span>);\n    <span class=\"cm-keyword\">break</span>;\n  <span class=\"cm-keyword\">case</span> <span class=\"cm-string\">\"Thu\"</span>:\n    <span class=\"cm-variable\">go</span>(<span class=\"cm-variable\">iceFishing</span>);\n    <span class=\"cm-keyword\">break</span>;\n  <span class=\"cm-keyword\">case</span> <span class=\"cm-string\">\"Fri\"</span>:\n  <span class=\"cm-keyword\">case</span> <span class=\"cm-string\">\"Sat\"</span>:\n    <span class=\"cm-keyword\">if</span> (<span class=\"cm-variable\">day</span> <span class=\"cm-operator\">===</span> <span class=\"cm-variable\">bingoDay</span>) {\n      <span class=\"cm-variable\">go</span>(<span class=\"cm-variable\">bingo</span>);\n      <span class=\"cm-variable\">go</span>(<span class=\"cm-variable\">dancing</span>);\n    }\n    <span class=\"cm-keyword\">break</span>;\n  <span class=\"cm-keyword\">case</span> <span class=\"cm-string\">\"Sun\"</span>:\n    <span class=\"cm-variable\">go</span>(<span class=\"cm-variable\">church</span>);\n    <span class=\"cm-keyword\">break</span>;\n  <span class=\"cm-keyword\">default</span>:\n    <span class=\"cm-variable\">go</span>(<span class=\"cm-variable\">work</span>);\n}\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p><code>switch</code> statements can also be used without a control expression, turning them in to a cleaner alternative to <code>if</code>/<code>else</code> chains.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"switch_with_no_expression\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"switch_with_no_expression-coffee\">score = 76\ngrade = switch\n  when score < 60 then 'F'\n  when score < 70 then 'D'\n  when score < 80 then 'C'\n  when score < 90 then 'B'\n  else 'A'\n# grade == 'C'\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">score</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">76</span>\n<span class=\"cm-variable\">grade</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-keyword\">switch</span>\n  <span class=\"cm-keyword\">when</span> <span class=\"cm-variable\">score</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-number\">60</span> <span class=\"cm-keyword\">then</span> <span class=\"cm-string\">'F'</span>\n  <span class=\"cm-keyword\">when</span> <span class=\"cm-variable\">score</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-number\">70</span> <span class=\"cm-keyword\">then</span> <span class=\"cm-string\">'D'</span>\n  <span class=\"cm-keyword\">when</span> <span class=\"cm-variable\">score</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-number\">80</span> <span class=\"cm-keyword\">then</span> <span class=\"cm-string\">'C'</span>\n  <span class=\"cm-keyword\">when</span> <span class=\"cm-variable\">score</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-number\">90</span> <span class=\"cm-keyword\">then</span> <span class=\"cm-string\">'B'</span>\n  <span class=\"cm-keyword\">else</span> <span class=\"cm-string\">'A'</span>\n<span class=\"cm-comment\"># grade == 'C'</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"switch_with_no_expression-js\">var grade, score;\n\nscore = 76;\n\ngrade = (function() {\n  switch (false) {\n    case !(score < 60):\n      return 'F';\n    case !(score < 70):\n      return 'D';\n    case !(score < 80):\n      return 'C';\n    case !(score < 90):\n      return 'B';\n    default:\n      return 'A';\n  }\n})();\n\n// grade == 'C'\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">grade</span>, <span class=\"cm-def\">score</span>;\n\n<span class=\"cm-variable\">score</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">76</span>;\n\n<span class=\"cm-variable\">grade</span> <span class=\"cm-operator\">=</span> (<span class=\"cm-keyword\">function</span>() {\n  <span class=\"cm-keyword\">switch</span> (<span class=\"cm-atom\">false</span>) {\n    <span class=\"cm-keyword\">case</span> <span class=\"cm-operator\">!</span>(<span class=\"cm-variable\">score</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-number\">60</span>):\n      <span class=\"cm-keyword\">return</span> <span class=\"cm-string\">'F'</span>;\n    <span class=\"cm-keyword\">case</span> <span class=\"cm-operator\">!</span>(<span class=\"cm-variable\">score</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-number\">70</span>):\n      <span class=\"cm-keyword\">return</span> <span class=\"cm-string\">'D'</span>;\n    <span class=\"cm-keyword\">case</span> <span class=\"cm-operator\">!</span>(<span class=\"cm-variable\">score</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-number\">80</span>):\n      <span class=\"cm-keyword\">return</span> <span class=\"cm-string\">'C'</span>;\n    <span class=\"cm-keyword\">case</span> <span class=\"cm-operator\">!</span>(<span class=\"cm-variable\">score</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-number\">90</span>):\n      <span class=\"cm-keyword\">return</span> <span class=\"cm-string\">'B'</span>;\n    <span class=\"cm-keyword\">default</span>:\n      <span class=\"cm-keyword\">return</span> <span class=\"cm-string\">'A'</span>;\n  }\n})();\n\n<span class=\"cm-comment\">// grade == 'C'</span>\n</pre>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"try-catch\">\n          <h2>Try/Catch/Finally</h2>\n<p><code>try</code> expressions have the same semantics as <code>try</code> statements in JavaScript, though in CoffeeScript, you may omit <em>both</em> the catch and finally parts. The catch part may also omit the error parameter if it is not needed.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"try\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"try-coffee\">try\n  allHellBreaksLoose()\n  catsAndDogsLivingTogether()\ncatch error\n  print error\nfinally\n  cleanUp()\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">try</span>\n  <span class=\"cm-variable\">allHellBreaksLoose</span><span class=\"cm-punctuation\">()</span>\n  <span class=\"cm-variable\">catsAndDogsLivingTogether</span><span class=\"cm-punctuation\">()</span>\n<span class=\"cm-keyword\">catch</span> <span class=\"cm-variable\">error</span>\n  <span class=\"cm-variable\">print</span> <span class=\"cm-variable\">error</span>\n<span class=\"cm-keyword\">finally</span>\n  <span class=\"cm-variable\">cleanUp</span><span class=\"cm-punctuation\">()</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"try-js\">var error;\n\ntry {\n  allHellBreaksLoose();\n  catsAndDogsLivingTogether();\n} catch (error1) {\n  error = error1;\n  print(error);\n} finally {\n  cleanUp();\n}\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">error</span>;\n\n<span class=\"cm-keyword\">try</span> {\n  <span class=\"cm-variable\">allHellBreaksLoose</span>();\n  <span class=\"cm-variable\">catsAndDogsLivingTogether</span>();\n} <span class=\"cm-keyword\">catch</span> (<span class=\"cm-def\">error1</span>) {\n  <span class=\"cm-variable\">error</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">error1</span>;\n  <span class=\"cm-variable\">print</span>(<span class=\"cm-variable\">error</span>);\n} <span class=\"cm-keyword\">finally</span> {\n  <span class=\"cm-variable\">cleanUp</span>();\n}\n</pre>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"comparisons\">\n          <h2>Chained Comparisons</h2>\n<p>CoffeeScript borrows <a href=\"https://docs.python.org/3/reference/expressions.html#not-in\">chained comparisons</a> from Python — making it easy to test if a value falls within a certain range.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"comparisons\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"comparisons-coffee\">cholesterol = 127\n\nhealthy = 200 > cholesterol > 60\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">cholesterol</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">127</span>\n\n<span class=\"cm-variable\">healthy</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">200</span> <span class=\"cm-operator\">></span> <span class=\"cm-variable\">cholesterol</span> <span class=\"cm-operator\">></span> <span class=\"cm-number\">60</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"comparisons-js\">var cholesterol, healthy;\n\ncholesterol = 127;\n\nhealthy = (200 > cholesterol && cholesterol > 60);\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">cholesterol</span>, <span class=\"cm-def\">healthy</span>;\n\n<span class=\"cm-variable\">cholesterol</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">127</span>;\n\n<span class=\"cm-variable\">healthy</span> <span class=\"cm-operator\">=</span> (<span class=\"cm-number\">200</span> <span class=\"cm-operator\">></span> <span class=\"cm-variable\">cholesterol</span> <span class=\"cm-operator\">&amp;&amp;</span> <span class=\"cm-variable\">cholesterol</span> <span class=\"cm-operator\">></span> <span class=\"cm-number\">60</span>);\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"comparisons\" data-run=\"healthy\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>healthy</button>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"regexes\">\n          <h2>Block Regular Expressions</h2>\n<p>Similar to block strings and comments, CoffeeScript supports block regexes — extended regular expressions that ignore internal whitespace and can contain comments and interpolation. Modeled after Perl’s <code>/x</code> modifier, CoffeeScript’s block regexes are delimited by <code>///</code> and go a long way towards making complex regular expressions readable. To quote from the CoffeeScript source:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"heregexes\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"heregexes-coffee\">NUMBER     = ///\n  ^ 0b[01]+    |              # binary\n  ^ 0o[0-7]+   |              # octal\n  ^ 0x[\\da-f]+ |              # hex\n  ^ \\d*\\.?\\d+ (?:e[+-]?\\d+)?  # decimal\n///i\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">NUMBER</span>     <span class=\"cm-punctuation\">=</span> <span class=\"cm-string-2\">///</span>\n<span class=\"cm-indent\">  </span><span class=\"cm-operator\">^</span> <span class=\"cm-number\">0</span><span class=\"cm-variable\">b</span><span class=\"cm-punctuation\">[</span><span class=\"cm-error\">0</span><span class=\"cm-number\">1</span><span class=\"cm-punctuation\">]</span><span class=\"cm-operator\">+</span>    <span class=\"cm-operator\">|</span>              <span class=\"cm-comment\"># binary</span>\n  <span class=\"cm-operator\">^</span> <span class=\"cm-number\">0</span><span class=\"cm-variable\">o</span><span class=\"cm-punctuation\">[</span><span class=\"cm-number\">0-7</span><span class=\"cm-punctuation\">]</span><span class=\"cm-operator\">+</span>   <span class=\"cm-operator\">|</span>              <span class=\"cm-comment\"># octal</span>\n  <span class=\"cm-operator\">^</span> <span class=\"cm-error\">0</span><span class=\"cm-variable\">x</span><span class=\"cm-punctuation\">[</span><span class=\"cm-error\">\\</span><span class=\"cm-variable\">da</span><span class=\"cm-operator\">-</span><span class=\"cm-variable\">f</span><span class=\"cm-punctuation\">]</span><span class=\"cm-operator\">+</span> <span class=\"cm-operator\">|</span>              <span class=\"cm-comment\"># hex</span>\n  <span class=\"cm-operator\">^</span> <span class=\"cm-error\">\\</span><span class=\"cm-variable\">d</span><span class=\"cm-operator\">*</span><span class=\"cm-error\">\\</span><span class=\"cm-punctuation\">.</span><span class=\"cm-operator\">?</span><span class=\"cm-error\">\\</span><span class=\"cm-variable\">d</span><span class=\"cm-operator\">+</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-operator\">?</span><span class=\"cm-punctuation\">:</span><span class=\"cm-variable\">e</span><span class=\"cm-punctuation\">[</span><span class=\"cm-operator\">+-</span><span class=\"cm-punctuation\">]</span><span class=\"cm-operator\">?</span><span class=\"cm-error\">\\</span><span class=\"cm-variable\">d</span><span class=\"cm-operator\">+</span><span class=\"cm-punctuation\">)</span><span class=\"cm-operator\">?</span>  <span class=\"cm-comment\"># decimal</span>\n<span class=\"cm-string-2\">///i</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"heregexes-js\">var NUMBER;\n\nNUMBER = /^0b[01]+|^0o[0-7]+|^0x[\\da-f]+|^\\d*\\.?\\d+(?:e[+-]?\\d+)?/i; // binary\n// octal\n// hex\n// decimal\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">NUMBER</span>;\n\n<span class=\"cm-variable\">NUMBER</span> <span class=\"cm-operator\">=</span> <span class=\"cm-string-2\">/^0b[01]+|^0o[0-7]+|^0x[\\da-f]+|^\\d*\\.?\\d+(?:e[+-]?\\d+)?/i</span>; <span class=\"cm-comment\">// binary</span>\n<span class=\"cm-comment\">// octal</span>\n<span class=\"cm-comment\">// hex</span>\n<span class=\"cm-comment\">// decimal</span>\n</pre>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"tagged-template-literals\">\n          <h2>Tagged Template Literals</h2>\n<p>CoffeeScript supports <a href=\"https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals#Tagged_template_literals\">ES2015 tagged template literals</a>, which enable customized string interpolation. If you immediately prefix a string with a function name (no space between the two), CoffeeScript will output this “function plus string” combination as an ES2015 tagged template literal, which will <a href=\"https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals#Tagged_template_literals\">behave accordingly</a>: the function is called, with the parameters being the input text and expression parts that make up the interpolated string. The function can then assemble these parts into an output string, providing custom string interpolation.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"tagged_template_literals\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"tagged_template_literals-coffee\">upperCaseExpr = (textParts, expressions...) ->\n  textParts.reduce (text, textPart, i) ->\n    text + expressions[i - 1].toUpperCase() + textPart\n\ngreet = (name, adjective) ->\n  upperCaseExpr\"\"\"\n               Hi #{name}. You look #{adjective}!\n               \"\"\"\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">upperCaseExpr</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">textParts</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">expressions</span><span class=\"cm-punctuation\">...)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">textParts</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">reduce</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">text</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">textPart</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">i</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n    <span class=\"cm-variable\">text</span> <span class=\"cm-operator\">+</span> <span class=\"cm-variable\">expressions</span><span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">i</span> <span class=\"cm-operator\">-</span> <span class=\"cm-number\">1</span><span class=\"cm-punctuation\">].</span><span class=\"cm-property\">toUpperCase</span><span class=\"cm-punctuation\">()</span> <span class=\"cm-operator\">+</span> <span class=\"cm-variable\">textPart</span>\n\n<span class=\"cm-variable\">greet</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">name</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">adjective</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">upperCaseExpr</span><span class=\"cm-string\">\"\"\"</span>\n<span class=\"cm-string\">               Hi #{name}. You look #{adjective}!</span>\n<span class=\"cm-string\">               \"\"\"</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"tagged_template_literals-js\">var greet, upperCaseExpr;\n\nupperCaseExpr = function(textParts, ...expressions) {\n  return textParts.reduce(function(text, textPart, i) {\n    return text + expressions[i - 1].toUpperCase() + textPart;\n  });\n};\n\ngreet = function(name, adjective) {\n  return upperCaseExpr`Hi ${name}. You look ${adjective}!`;\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">greet</span>, <span class=\"cm-def\">upperCaseExpr</span>;\n\n<span class=\"cm-variable\">upperCaseExpr</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">textParts</span>, <span class=\"cm-meta\">...</span><span class=\"cm-def\">expressions</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">textParts</span>.<span class=\"cm-property\">reduce</span>(<span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">text</span>, <span class=\"cm-def\">textPart</span>, <span class=\"cm-def\">i</span>) {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">text</span> <span class=\"cm-operator\">+</span> <span class=\"cm-variable-2\">expressions</span>[<span class=\"cm-variable-2\">i</span> <span class=\"cm-operator\">-</span> <span class=\"cm-number\">1</span>].<span class=\"cm-property\">toUpperCase</span>() <span class=\"cm-operator\">+</span> <span class=\"cm-variable-2\">textPart</span>;\n  });\n};\n\n<span class=\"cm-variable\">greet</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">name</span>, <span class=\"cm-def\">adjective</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">upperCaseExpr</span><span class=\"cm-string-2\">`Hi ${</span><span class=\"cm-variable-2\">name</span><span class=\"cm-string-2\">}. You look ${</span><span class=\"cm-variable-2\">adjective</span><span class=\"cm-string-2\">}!`</span>;\n};\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"tagged_template_literals\" data-run=\"greet%28%22greg%22%2C%20%22awesome%22%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>greet(&quot;greg&quot;, &quot;awesome&quot;)</button>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"modules\">\n          <h2>Modules</h2>\n<p><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules\">ES2015 modules</a> are supported in CoffeeScript, with very similar <code>import</code> and <code>export</code> syntax:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"modules\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"modules-coffee\">import './local-file.js' # Must be the filename of the generated file\nimport 'package'\n\nimport _ from 'underscore'\nimport * as underscore from 'underscore'\n\nimport { now } from 'underscore'\nimport { now as currentTimestamp } from 'underscore'\nimport { first, last } from 'underscore'\nimport utilityBelt, { each } from 'underscore'\n\nimport dates from './calendar.json' assert { type: 'json' }\n\nexport default Math\nexport square = (x) -> x * x\nexport class Mathematics\n  least: (x, y) -> if x < y then x else y\n\nexport { sqrt }\nexport { sqrt as squareRoot }\nexport { Mathematics as default, sqrt as squareRoot }\n\nexport * from 'underscore'\nexport { max, min } from 'underscore'\nexport { version } from './package.json' assert { type: 'json' }\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">import</span> <span class=\"cm-string\">'./local-file.js'</span> <span class=\"cm-comment\"># Must be the filename of the generated file</span>\n<span class=\"cm-variable\">import</span> <span class=\"cm-string\">'package'</span>\n\n<span class=\"cm-variable\">import</span> <span class=\"cm-variable\">_</span> <span class=\"cm-variable\">from</span> <span class=\"cm-string\">'underscore'</span>\n<span class=\"cm-variable\">import</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable\">as</span> <span class=\"cm-variable\">underscore</span> <span class=\"cm-variable\">from</span> <span class=\"cm-string\">'underscore'</span>\n\n<span class=\"cm-variable\">import</span> <span class=\"cm-punctuation\">{</span> <span class=\"cm-variable\">now</span> <span class=\"cm-punctuation\">}</span> <span class=\"cm-variable\">from</span> <span class=\"cm-string\">'underscore'</span>\n<span class=\"cm-variable\">import</span> <span class=\"cm-punctuation\">{</span> <span class=\"cm-variable\">now</span> <span class=\"cm-variable\">as</span> <span class=\"cm-variable\">currentTimestamp</span> <span class=\"cm-punctuation\">}</span> <span class=\"cm-variable\">from</span> <span class=\"cm-string\">'underscore'</span>\n<span class=\"cm-variable\">import</span> <span class=\"cm-punctuation\">{</span> <span class=\"cm-variable\">first</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">last</span> <span class=\"cm-punctuation\">}</span> <span class=\"cm-variable\">from</span> <span class=\"cm-string\">'underscore'</span>\n<span class=\"cm-variable\">import</span> <span class=\"cm-variable\">utilityBelt</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-punctuation\">{</span> <span class=\"cm-variable\">each</span> <span class=\"cm-punctuation\">}</span> <span class=\"cm-variable\">from</span> <span class=\"cm-string\">'underscore'</span>\n\n<span class=\"cm-variable\">import</span> <span class=\"cm-variable\">dates</span> <span class=\"cm-variable\">from</span> <span class=\"cm-string\">'./calendar.json'</span> <span class=\"cm-variable\">assert</span> <span class=\"cm-punctuation\">{</span> <span class=\"cm-variable\">type</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-string\">'json'</span> <span class=\"cm-punctuation\">}</span>\n\n<span class=\"cm-variable\">export</span> <span class=\"cm-variable\">default</span> <span class=\"cm-variable\">Math</span>\n<span class=\"cm-variable\">export</span> <span class=\"cm-variable\">square</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">x</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span> <span class=\"cm-variable\">x</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable\">x</span>\n<span class=\"cm-variable\">export</span> <span class=\"cm-keyword\">class</span> <span class=\"cm-variable\">Mathematics</span>\n  <span class=\"cm-variable\">least</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">x</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">y</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span> <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">x</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-variable\">y</span> <span class=\"cm-keyword\">then</span> <span class=\"cm-variable\">x</span> <span class=\"cm-keyword\">else</span> <span class=\"cm-variable\">y</span>\n\n<span class=\"cm-variable\">export</span> <span class=\"cm-punctuation\">{</span> <span class=\"cm-variable\">sqrt</span> <span class=\"cm-punctuation\">}</span>\n<span class=\"cm-variable\">export</span> <span class=\"cm-punctuation\">{</span> <span class=\"cm-variable\">sqrt</span> <span class=\"cm-variable\">as</span> <span class=\"cm-variable\">squareRoot</span> <span class=\"cm-punctuation\">}</span>\n<span class=\"cm-variable\">export</span> <span class=\"cm-punctuation\">{</span> <span class=\"cm-variable\">Mathematics</span> <span class=\"cm-variable\">as</span> <span class=\"cm-variable\">default</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">sqrt</span> <span class=\"cm-variable\">as</span> <span class=\"cm-variable\">squareRoot</span> <span class=\"cm-punctuation\">}</span>\n\n<span class=\"cm-variable\">export</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable\">from</span> <span class=\"cm-string\">'underscore'</span>\n<span class=\"cm-variable\">export</span> <span class=\"cm-punctuation\">{</span> <span class=\"cm-variable\">max</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">min</span> <span class=\"cm-punctuation\">}</span> <span class=\"cm-variable\">from</span> <span class=\"cm-string\">'underscore'</span>\n<span class=\"cm-variable\">export</span> <span class=\"cm-punctuation\">{</span> <span class=\"cm-variable\">version</span> <span class=\"cm-punctuation\">}</span> <span class=\"cm-variable\">from</span> <span class=\"cm-string\">'./package.json'</span> <span class=\"cm-variable\">assert</span> <span class=\"cm-punctuation\">{</span> <span class=\"cm-variable\">type</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-string\">'json'</span> <span class=\"cm-punctuation\">}</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"modules-js\">import './local-file.js';\n\nimport 'package';\n\nimport _ from 'underscore';\n\nimport * as underscore from 'underscore';\n\nimport {\n  now\n} from 'underscore';\n\nimport {\n  now as currentTimestamp\n} from 'underscore';\n\nimport {\n  first,\n  last\n} from 'underscore';\n\nimport utilityBelt, {\n  each\n} from 'underscore';\n\nimport dates from './calendar.json' assert {\n  type: 'json'\n};\n\nexport default Math;\n\nexport var square = function(x) {\n  return x * x;\n};\n\nexport var Mathematics = class Mathematics {\n  least(x, y) {\n    if (x < y) {\n      return x;\n    } else {\n      return y;\n    }\n  }\n\n};\n\nexport {\n  sqrt\n};\n\nexport {\n  sqrt as squareRoot\n};\n\nexport {\n  Mathematics as default,\n  sqrt as squareRoot\n};\n\nexport * from 'underscore';\n\nexport {\n  max,\n  min\n} from 'underscore';\n\nexport {\n  version\n} from './package.json' assert {\n    type: 'json'\n  };\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">import</span> <span class=\"cm-string\">'./local-file.js'</span>;\n\n<span class=\"cm-keyword\">import</span> <span class=\"cm-string\">'package'</span>;\n\n<span class=\"cm-keyword\">import</span> <span class=\"cm-def\">_</span> <span class=\"cm-keyword\">from</span> <span class=\"cm-string\">'underscore'</span>;\n\n<span class=\"cm-keyword\">import</span> <span class=\"cm-keyword\">*</span> <span class=\"cm-keyword\">as</span> <span class=\"cm-def\">underscore</span> <span class=\"cm-keyword\">from</span> <span class=\"cm-string\">'underscore'</span>;\n\n<span class=\"cm-keyword\">import</span> {\n  <span class=\"cm-def\">now</span>\n} <span class=\"cm-keyword\">from</span> <span class=\"cm-string\">'underscore'</span>;\n\n<span class=\"cm-keyword\">import</span> {\n  <span class=\"cm-def\">now</span> <span class=\"cm-keyword\">as</span> <span class=\"cm-def\">currentTimestamp</span>\n} <span class=\"cm-keyword\">from</span> <span class=\"cm-string\">'underscore'</span>;\n\n<span class=\"cm-keyword\">import</span> {\n  <span class=\"cm-def\">first</span>,\n  <span class=\"cm-def\">last</span>\n} <span class=\"cm-keyword\">from</span> <span class=\"cm-string\">'underscore'</span>;\n\n<span class=\"cm-keyword\">import</span> <span class=\"cm-def\">utilityBelt</span>, {\n  <span class=\"cm-def\">each</span>\n} <span class=\"cm-keyword\">from</span> <span class=\"cm-string\">'underscore'</span>;\n\n<span class=\"cm-keyword\">import</span> <span class=\"cm-def\">dates</span> <span class=\"cm-keyword\">from</span> <span class=\"cm-string\">'./calendar.json'</span> <span class=\"cm-variable\">assert</span> {\n  <span class=\"cm-variable\">type</span>: <span class=\"cm-string\">'json'</span>\n};\n\n<span class=\"cm-keyword\">export</span> <span class=\"cm-keyword\">default</span> <span class=\"cm-variable\">Math</span>;\n\n<span class=\"cm-keyword\">export</span> <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">square</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">x</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">x</span> <span class=\"cm-operator\">*</span> <span class=\"cm-variable-2\">x</span>;\n};\n\n<span class=\"cm-keyword\">export</span> <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">Mathematics</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">class</span> <span class=\"cm-def\">Mathematics</span> {\n  <span class=\"cm-property\">least</span>(<span class=\"cm-def\">x</span>, <span class=\"cm-def\">y</span>) {\n    <span class=\"cm-keyword\">if</span> (<span class=\"cm-variable-2\">x</span> <span class=\"cm-operator\">&lt;</span> <span class=\"cm-variable-2\">y</span>) {\n      <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">x</span>;\n    } <span class=\"cm-keyword\">else</span> {\n      <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">y</span>;\n    }\n  }\n\n};\n\n<span class=\"cm-keyword\">export</span> {\n  <span class=\"cm-variable\">sqrt</span>\n};\n\n<span class=\"cm-keyword\">export</span> {\n  <span class=\"cm-variable\">sqrt</span> <span class=\"cm-keyword\">as</span> <span class=\"cm-variable\">squareRoot</span>\n};\n\n<span class=\"cm-keyword\">export</span> {\n  <span class=\"cm-variable\">Mathematics</span> <span class=\"cm-keyword\">as</span> <span class=\"cm-keyword\">default</span>,\n  <span class=\"cm-variable\">sqrt</span> <span class=\"cm-variable\">as</span> <span class=\"cm-variable\">squareRoot</span>\n};\n\n<span class=\"cm-keyword\">export</span> <span class=\"cm-keyword\">*</span> <span class=\"cm-keyword\">from</span> <span class=\"cm-string\">'underscore'</span>;\n\n<span class=\"cm-keyword\">export</span> {\n  <span class=\"cm-variable\">max</span>,\n  <span class=\"cm-variable\">min</span>\n} <span class=\"cm-keyword\">from</span> <span class=\"cm-string\">'underscore'</span>;\n\n<span class=\"cm-keyword\">export</span> {\n  <span class=\"cm-variable\">version</span>\n} <span class=\"cm-keyword\">from</span> <span class=\"cm-string\">'./package.json'</span> <span class=\"cm-variable\">assert</span> {\n    <span class=\"cm-variable\">type</span>: <span class=\"cm-string\">'json'</span>\n  };\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<div id=\"dynamic-import\" class=\"bookmark\"></div>\n<p><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports\">Dynamic import</a> is also supported, with mandatory parentheses:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"dynamic_import\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"dynamic_import-coffee\"># Your browser must support dynamic import to run this example.\n\ndo ->\n  { run } = await import('./browser-compiler-modern/coffeescript.js')\n  run '''\n    if 5 < new Date().getHours() < 9\n      alert 'Time to make the coffee!'\n    else\n      alert 'Time to get some work done.'\n  '''\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\"># Your browser must support dynamic import to run this example.</span>\n\n<span class=\"cm-keyword\">do</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-punctuation\">{</span> <span class=\"cm-variable\">run</span> <span class=\"cm-punctuation\">}</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">await</span> <span class=\"cm-variable\">import</span><span class=\"cm-punctuation\">(</span><span class=\"cm-string\">'./browser-compiler-modern/coffeescript.js'</span><span class=\"cm-punctuation\">)</span>\n  <span class=\"cm-variable\">run</span> <span class=\"cm-string\">'''</span>\n<span class=\"cm-string\">    if 5 &lt; new Date().getHours() &lt; 9</span>\n<span class=\"cm-string\">      alert 'Time to make the coffee!'</span>\n<span class=\"cm-string\">    else</span>\n<span class=\"cm-string\">      alert 'Time to get some work done.'</span>\n<span class=\"cm-string\">  '''</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"dynamic_import-js\">// Your browser must support dynamic import to run this example.\n(async function() {\n  var run;\n  ({run} = (await import('./browser-compiler-modern/coffeescript.js')));\n  return run(`if 5 < new Date().getHours() < 9\n  alert 'Time to make the coffee!'\nelse\n  alert 'Time to get some work done.'`);\n})();\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\">// Your browser must support dynamic import to run this example.</span>\n(<span class=\"cm-keyword\">async</span> <span class=\"cm-keyword\">function</span>() {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">run</span>;\n  ({<span class=\"cm-property\">run</span>} <span class=\"cm-operator\">=</span> (<span class=\"cm-keyword\">await</span> <span class=\"cm-keyword\">import</span>(<span class=\"cm-string\">'./browser-compiler-modern/coffeescript.js'</span>)));\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">run</span>(<span class=\"cm-string-2\">`if 5 &lt; new Date().getHours() &lt; 9</span>\n  <span class=\"cm-string-2\">alert 'Time to make the coffee!'</span>\n<span class=\"cm-string-2\">else</span>\n  <span class=\"cm-string-2\">alert 'Time to get some work done.'`</span>);\n})();\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"dynamic_import\" data-run=\"true\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small></button>\n    </div>\n  </div>\n  \n</aside>\n<div id=\"modules-note\" class=\"bookmark\"></div>\n<p>Note that the CoffeeScript compiler <strong>does not resolve modules</strong>; writing an <code>import</code> or <code>export</code> statement in CoffeeScript will produce an <code>import</code> or <code>export</code> statement in the resulting output. Such statements can be run by all modern browsers (when the script is referenced via <code>&lt;script type=&quot;module&quot;&gt;</code>) and <a href=\"https://nodejs.org/api/esm.html#esm_enabling\">by Node.js</a> when the output <code>.js</code> files are in a folder where the nearest parent <code>package.json</code> file contains <code>&quot;type&quot;: &quot;module&quot;</code>. Because the runtime is evaluating the generated output, the <code>import</code> statements must reference the output files; so if <code>file.coffee</code> is output as <code>file.js</code>, it needs to be referenced as <code>file.js</code> in the <code>import</code> statement, with the <code>.js</code> extension included.</p>\n<p>Also, any file with an <code>import</code> or <code>export</code> statement will be output without a <a href=\"#lexical-scope\">top-level function safety wrapper</a>; in other words, importing or exporting modules will automatically trigger <a href=\"#usage\">bare</a> mode for that file. This is because per the ES2015 spec, <code>import</code> or <code>export</code> statements must occur at the topmost scope.</p>\n\n        </section>\n        <section id=\"embedded\">\n          <h2>Embedded JavaScript</h2>\n<p>Hopefully, you’ll never need to use it, but if you ever need to intersperse snippets of JavaScript within your CoffeeScript, you can use backticks to pass it straight through.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"embedded\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"embedded-coffee\">hi = `function() {\n  return [document.title, \"Hello JavaScript\"].join(\": \");\n}`\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">hi</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">`</span><span class=\"cm-variable\">function</span><span class=\"cm-punctuation\">()</span> <span class=\"cm-punctuation\">{</span>\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">document</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">title</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">\"Hello JavaScript\"</span><span class=\"cm-punctuation\">].</span><span class=\"cm-property\">join</span><span class=\"cm-punctuation\">(</span><span class=\"cm-string\">\": \"</span><span class=\"cm-punctuation\">);</span>\n<span class=\"cm-punctuation\">}`</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"embedded-js\">var hi;\n\nhi = function() {\n  return [document.title, \"Hello JavaScript\"].join(\": \");\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">hi</span>;\n\n<span class=\"cm-variable\">hi</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>() {\n  <span class=\"cm-keyword\">return</span> [<span class=\"cm-variable\">document</span>.<span class=\"cm-property\">title</span>, <span class=\"cm-string\">\"Hello JavaScript\"</span>].<span class=\"cm-property\">join</span>(<span class=\"cm-string\">\": \"</span>);\n};\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"embedded\" data-run=\"hi%28%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>hi()</button>\n    </div>\n  </div>\n  \n</aside>\n<p>Escape backticks with backslashes: <code> \\`​</code> becomes <code> `​</code>.</p>\n<p>Escape backslashes before backticks with more backslashes: <code> \\\\\\`​</code> becomes <code> \\`​</code>.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"embedded_escaped\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"embedded_escaped-coffee\">markdown = `function () {\n  return \\`In Markdown, write code like \\\\\\`this\\\\\\`\\`;\n}`\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">markdown</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">`</span><span class=\"cm-variable\">function</span> <span class=\"cm-punctuation\">()</span> <span class=\"cm-punctuation\">{</span>\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-error\">\\</span><span class=\"cm-punctuation\">`</span><span class=\"cm-variable\">In</span> <span class=\"cm-variable\">Markdown</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">write</span> <span class=\"cm-variable\">code</span> <span class=\"cm-variable\">like</span> <span class=\"cm-error\">\\\\\\</span><span class=\"cm-punctuation\">`</span><span class=\"cm-keyword\">this</span><span class=\"cm-error\">\\\\\\</span><span class=\"cm-punctuation\">`</span><span class=\"cm-error\">\\</span><span class=\"cm-punctuation\">`;</span>\n<span class=\"cm-punctuation\">}`</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"embedded_escaped-js\">var markdown;\n\nmarkdown = function () {\n  return `In Markdown, write code like \\`this\\``;\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">markdown</span>;\n\n<span class=\"cm-variable\">markdown</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span> () {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-string-2\">`In Markdown, write code like \\`this\\``</span>;\n};\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"embedded_escaped\" data-run=\"markdown%28%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>markdown()</button>\n    </div>\n  </div>\n  \n</aside>\n<p>You can also embed blocks of JavaScript using triple backticks. That’s easier than escaping backticks, if you need them inside your JavaScript block.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"embedded_block\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"embedded_block-coffee\">```\nfunction time() {\n  return `The time is ${new Date().toLocaleTimeString()}`;\n}\n```\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-punctuation\">```</span>\n<span class=\"cm-variable\">function</span> <span class=\"cm-variable\">time</span><span class=\"cm-punctuation\">()</span> <span class=\"cm-punctuation\">{</span>\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-punctuation\">`</span><span class=\"cm-variable\">The</span> <span class=\"cm-variable\">time</span> <span class=\"cm-operator\">is</span> <span class=\"cm-variable\">$</span><span class=\"cm-punctuation\">{</span><span class=\"cm-keyword\">new</span> <span class=\"cm-variable\">Date</span><span class=\"cm-punctuation\">().</span><span class=\"cm-property\">toLocaleTimeString</span><span class=\"cm-punctuation\">()}`;</span>\n<span class=\"cm-punctuation\">}</span>\n<span class=\"cm-punctuation\">```</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"embedded_block-js\">\nfunction time() {\n  return `The time is ${new Date().toLocaleTimeString()}`;\n}\n;\n\n</textarea>\n      <pre class=\"placeholder-code\">\n<span class=\"cm-keyword\">function</span> <span class=\"cm-def\">time</span>() {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-string-2\">`The time is ${</span><span class=\"cm-keyword\">new</span> <span class=\"cm-variable\">Date</span>().<span class=\"cm-property\">toLocaleTimeString</span>()<span class=\"cm-string-2\">}`</span>;\n}\n;\n\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"embedded_block\" data-run=\"time%28%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>time()</button>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"jsx\">\n          <h2>JSX</h2>\n<p><a href=\"https://facebook.github.io/react/docs/introducing-jsx.html\">JSX</a> is JavaScript containing interspersed XML elements. While conceived for <a href=\"https://facebook.github.io/react/\">React</a>, it is not specific to any particular library or framework.</p>\n<p>CoffeeScript supports interspersed XML elements, without the need for separate plugins or special settings. The XML elements will be compiled as such, outputting JSX that could be parsed like any normal JSX file, for example by <a href=\"https://babeljs.io/docs/plugins/transform-react-jsx/\">Babel with the React JSX transform</a>. CoffeeScript does <em>not</em> output <code>React.createElement</code> calls or any code specific to React or any other framework. It is up to you to attach another step in your build chain to convert this JSX to whatever function calls you wish the XML elements to compile to.</p>\n<p>Just like in JSX and HTML, denote XML tags using <code>&lt;</code> and <code>&gt;</code>. You can interpolate CoffeeScript code inside a tag using <code>{</code> and <code>}</code>. To avoid compiler errors, when using <code>&lt;</code> and <code>&gt;</code> to mean “less than” or “greater than,” you should wrap the operators in spaces to distinguish them from XML tags. So <code>i &lt; len</code>, not <code>i&lt;len</code>. The compiler tries to be forgiving when it can be sure what you intend, but always putting spaces around the “less than” and “greater than” operators will remove ambiguity.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"jsx\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"jsx-coffee\">renderStarRating = ({ rating, maxStars }) ->\n  <aside title={\"Rating: #{rating} of #{maxStars} stars\"}>\n    {for wholeStar in [0...Math.floor(rating)]\n      <Star className=\"wholeStar\" key={wholeStar} />}\n    {if rating % 1 isnt 0\n      <Star className=\"halfStar\" />}\n    {for emptyStar in [Math.ceil(rating)...maxStars]\n      <Star className=\"emptyStar\" key={emptyStar} />}\n  </aside>\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">renderStarRating</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">({</span> <span class=\"cm-variable\">rating</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">maxStars</span> <span class=\"cm-punctuation\">})</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-operator\">&lt;</span><span class=\"cm-variable\">aside</span> <span class=\"cm-variable\">title</span><span class=\"cm-punctuation\">={</span><span class=\"cm-string\">\"Rating: #{rating} of #{maxStars} stars\"</span><span class=\"cm-punctuation\">}</span><span class=\"cm-operator\">></span>\n<span class=\"cm-indent\">    </span><span class=\"cm-punctuation\">{</span><span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">wholeStar</span> <span class=\"cm-operator\">in</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-number\">0</span><span class=\"cm-punctuation\">...</span><span class=\"cm-variable\">Math</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">floor</span><span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">rating</span><span class=\"cm-punctuation\">)]</span>\n<span class=\"cm-dedent\">      </span><span class=\"cm-operator\">&lt;</span><span class=\"cm-variable\">Star</span> <span class=\"cm-variable\">className</span><span class=\"cm-punctuation\">=</span><span class=\"cm-string\">\"wholeStar\"</span> <span class=\"cm-variable\">key</span><span class=\"cm-punctuation\">={</span><span class=\"cm-variable\">wholeStar</span><span class=\"cm-punctuation\">}</span> <span class=\"cm-operator\">/></span><span class=\"cm-punctuation\">}</span>\n    <span class=\"cm-punctuation\">{</span><span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">rating</span> <span class=\"cm-operator\">%</span> <span class=\"cm-number\">1</span> <span class=\"cm-operator\">isnt</span> <span class=\"cm-number\">0</span>\n<span class=\"cm-dedent\">      </span><span class=\"cm-operator\">&lt;</span><span class=\"cm-variable\">Star</span> <span class=\"cm-variable\">className</span><span class=\"cm-punctuation\">=</span><span class=\"cm-string\">\"halfStar\"</span> <span class=\"cm-operator\">/></span><span class=\"cm-punctuation\">}</span>\n    <span class=\"cm-punctuation\">{</span><span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">emptyStar</span> <span class=\"cm-operator\">in</span> <span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">Math</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">ceil</span><span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">rating</span><span class=\"cm-punctuation\">)...</span><span class=\"cm-variable\">maxStars</span><span class=\"cm-punctuation\">]</span>\n<span class=\"cm-dedent\">      </span><span class=\"cm-operator\">&lt;</span><span class=\"cm-variable\">Star</span> <span class=\"cm-variable\">className</span><span class=\"cm-punctuation\">=</span><span class=\"cm-string\">\"emptyStar\"</span> <span class=\"cm-variable\">key</span><span class=\"cm-punctuation\">={</span><span class=\"cm-variable\">emptyStar</span><span class=\"cm-punctuation\">}</span> <span class=\"cm-operator\">/></span><span class=\"cm-punctuation\">}</span>\n<span class=\"cm-dedent\">  </span><span class=\"cm-operator\">&lt;/</span><span class=\"cm-variable\">aside</span><span class=\"cm-operator\">></span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"jsx-js\">var renderStarRating;\n\nrenderStarRating = function({rating, maxStars}) {\n  var emptyStar, wholeStar;\n  return <aside title={`Rating: ${rating} of ${maxStars} stars`}>\n    {(function() {\n    var i, ref, results;\n    results = [];\n    for (wholeStar = i = 0, ref = Math.floor(rating); (0 <= ref ? i < ref : i > ref); wholeStar = 0 <= ref ? ++i : --i) {\n      results.push(<Star className=\"wholeStar\" key={wholeStar} />);\n    }\n    return results;\n  })()}\n    {rating % 1 !== 0 ? <Star className=\"halfStar\" /> : void 0}\n    {(function() {\n    var i, ref, ref1, results;\n    results = [];\n    for (emptyStar = i = ref = Math.ceil(rating), ref1 = maxStars; (ref <= ref1 ? i < ref1 : i > ref1); emptyStar = ref <= ref1 ? ++i : --i) {\n      results.push(<Star className=\"emptyStar\" key={emptyStar} />);\n    }\n    return results;\n  })()}\n  </aside>;\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">renderStarRating</span>;\n\n<span class=\"cm-variable\">renderStarRating</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>({<span class=\"cm-def\">rating</span>, <span class=\"cm-def\">maxStars</span>}) {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">emptyStar</span>, <span class=\"cm-def\">wholeStar</span>;\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-operator\">&lt;</span><span class=\"cm-variable\">aside</span> <span class=\"cm-variable\">title</span><span class=\"cm-operator\">=</span>{<span class=\"cm-string-2\">`Rating: ${</span><span class=\"cm-variable-2\">rating</span>} <span class=\"cm-variable\">of</span> <span class=\"cm-variable\">$</span>{<span class=\"cm-variable-2\">maxStars</span>} <span class=\"cm-variable\">stars</span><span class=\"cm-string-2\">`}></span>\n    <span class=\"cm-string-2\">{(function() {</span>\n    <span class=\"cm-string-2\">var i, ref, results;</span>\n    <span class=\"cm-string-2\">results = [];</span>\n    <span class=\"cm-string-2\">for (wholeStar = i = 0, ref = Math.floor(rating); (0 &lt;= ref ? i &lt; ref : i > ref); wholeStar = 0 &lt;= ref ? ++i : --i) {</span>\n      <span class=\"cm-string-2\">results.push(&lt;Star className=\"wholeStar\" key={wholeStar} />);</span>\n    <span class=\"cm-string-2\">}</span>\n    <span class=\"cm-string-2\">return results;</span>\n  <span class=\"cm-string-2\">})()}</span>\n    <span class=\"cm-string-2\">{rating % 1 !== 0 ? &lt;Star className=\"halfStar\" /> : void 0}</span>\n    <span class=\"cm-string-2\">{(function() {</span>\n    <span class=\"cm-string-2\">var i, ref, ref1, results;</span>\n    <span class=\"cm-string-2\">results = [];</span>\n    <span class=\"cm-string-2\">for (emptyStar = i = ref = Math.ceil(rating), ref1 = maxStars; (ref &lt;= ref1 ? i &lt; ref1 : i > ref1); emptyStar = ref &lt;= ref1 ? ++i : --i) {</span>\n      <span class=\"cm-string-2\">results.push(&lt;Star className=\"emptyStar\" key={emptyStar} />);</span>\n    <span class=\"cm-string-2\">}</span>\n    <span class=\"cm-string-2\">return results;</span>\n  <span class=\"cm-string-2\">})()}</span>\n  <span class=\"cm-string-2\">&lt;/aside>;</span>\n<span class=\"cm-string-2\">};</span>\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p>Older plugins or forks of CoffeeScript supported JSX syntax and referred to it as CSX or CJSX. They also often used a <code>.cjsx</code> file extension, but this is no longer necessary; regular <code>.coffee</code> will do.</p>\n\n        </section>\n      </section>\n      <section id=\"type-annotations\">\n        <h2>Type Annotations</h2>\n<p>Static type checking can be achieved in CoffeeScript by using <a href=\"https://flow.org/\">Flow</a>’s <a href=\"https://flow.org/en/docs/types/comments/\">Comment Types syntax</a>:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"type_annotations\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"type_annotations-coffee\"># @flow\n\n###::\ntype Obj = {\n  num: number,\n};\n###\n\nfn = (str ###: string ###, obj ###: Obj ###) ###: string ### ->\n  str + obj.num\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\"># @flow</span>\n\n<span class=\"cm-comment\">###::</span>\n<span class=\"cm-comment\">type Obj = {</span>\n<span class=\"cm-comment\">  num: number,</span>\n<span class=\"cm-comment\">};</span>\n<span class=\"cm-comment\">###</span>\n\n<span class=\"cm-variable\">fn</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">str</span> <span class=\"cm-comment\">###: string ###</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">obj</span> <span class=\"cm-comment\">###: Obj ###</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-comment\">###: string ###</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">str</span> <span class=\"cm-operator\">+</span> <span class=\"cm-variable\">obj</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">num</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"type_annotations-js\">// @flow\n/*::\ntype Obj = {\n  num: number,\n};\n*/\nvar fn;\n\nfn = function(str/*: string */, obj/*: Obj */)/*: string */ {\n  return str + obj.num;\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\">// @flow</span>\n<span class=\"cm-comment\">/*::</span>\n<span class=\"cm-comment\">type Obj = {</span>\n<span class=\"cm-comment\">  num: number,</span>\n<span class=\"cm-comment\">};</span>\n<span class=\"cm-comment\">*/</span>\n<span class=\"cm-keyword\">var</span> <span class=\"cm-def\">fn</span>;\n\n<span class=\"cm-variable\">fn</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">str</span><span class=\"cm-comment\">/*: string */</span>, <span class=\"cm-def\">obj</span><span class=\"cm-comment\">/*: Obj */</span>)<span class=\"cm-comment\">/*: string */</span> {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">str</span> <span class=\"cm-operator\">+</span> <span class=\"cm-variable-2\">obj</span>.<span class=\"cm-property\">num</span>;\n};\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p>CoffeeScript does not do any type checking itself; the JavaScript output you see above needs to get passed to Flow for it to validate your code. We expect most people will use a <a href=\"#es2015plus-output\">build tool</a> for this, but here’s how to do it the simplest way possible using the <a href=\"#cli\">CoffeeScript</a> and <a href=\"https://flow.org/en/docs/usage/\">Flow</a> command-line tools, assuming you’ve already <a href=\"https://flow.org/en/docs/install/\">installed Flow</a> and the <a href=\"#installation\">latest CoffeeScript</a> in your project folder:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\">coffee --bare --no-header --compile app.coffee &amp;&amp; npm run flow\n</code></pre>\n</blockquote><p><code>--bare</code> and <code>--no-header</code> are important because Flow requires the first line of the file to be the comment <code>// @flow</code>. If you configure your build chain to compile CoffeeScript and pass the result to Flow in-memory, you can get better performance than this example; and a proper build tool should be able to watch your CoffeeScript files and recompile and type-check them for you on save.</p>\n<p>If you know of another way to achieve static type checking with CoffeeScript, please <a href=\"https://github.com/jashkenas/coffeescript/issues/new\">create an issue</a> and let us know.</p>\n\n      </section>\n      <section id=\"literate\">\n        <h2>Literate CoffeeScript</h2>\n<p>Besides being used as an ordinary programming language, CoffeeScript may also be written in “literate” mode. If you name your file with a <code>.litcoffee</code> extension, you can write it as a Markdown document — a document that also happens to be executable CoffeeScript code. The compiler will treat any indented blocks (Markdown’s way of indicating source code) as executable code, and ignore the rest as comments. Code blocks must also be separated from comments by at least one blank line.</p>\n<p>Just for kicks, a little bit of the compiler is currently implemented in this fashion: See it <a href=\"https://gist.github.com/jashkenas/3fc3c1a8b1009c00d9df\">as a document</a>, <a href=\"https://raw.githubusercontent.com/jashkenas/coffeescript/master/src/scope.litcoffee\">raw</a>, and <a href=\"http://cl.ly/LxEu\">properly highlighted in a text editor</a>.</p>\n<p>A few caveats:</p>\n<ul>\n<li>Code blocks need to maintain consistent indentation relative to each other. When the compiler parses your Literate CoffeeScript file, it first discards all the non-code block lines and then parses the remainder as a regular CoffeeScript file. Therefore the code blocks need to be written as if the comment lines don’t exist, with consistent indentation (including whether they are indented with tabs or spaces).</li>\n<li>Along those lines, code blocks within list items or blockquotes are not treated as executable code. Since list items and blockquotes imply their own indentation, it would be ambiguous how to treat indentation between successive code blocks when some are within these other blocks and some are not.</li>\n<li>List items can be at most only one paragraph long. The second paragraph of a list item would be indented after a blank line, and therefore indistinguishable from a code block.</li>\n</ul>\n\n      </section>\n      <section id=\"source-maps\">\n        <h2>Source Maps</h2>\n<p>CoffeeScript includes support for generating source maps, a way to tell your JavaScript engine what part of your CoffeeScript program matches up with the code being evaluated. Browsers that support it can automatically use source maps to show your original source code in the debugger. To generate source maps alongside your JavaScript files, pass the <code>--map</code> or <code>-m</code> flag to the compiler.</p>\n<p>For a full introduction to source maps, how they work, and how to hook them up in your browser, read the <a href=\"https://www.html5rocks.com/en/tutorials/developertools/sourcemaps/\">HTML5 Tutorial</a>.</p>\n\n      </section>\n      <section id=\"cake\">\n        <h2>Cake, and Cakefiles</h2>\n<p>CoffeeScript includes a (very) simple build system similar to <a href=\"http://www.gnu.org/software/make/\">Make</a> and <a href=\"http://rake.rubyforge.org/\">Rake</a>. Naturally, it’s called Cake, and is used for the tasks that build and test the CoffeeScript language itself. Tasks are defined in a file named <code>Cakefile</code>, and can be invoked by running <code>cake [task]</code> from within the directory. To print a list of all the tasks and options, just type <code>cake</code>.</p>\n<p>Task definitions are written in CoffeeScript, so you can put arbitrary code in your Cakefile. Define a task with a name, a long description, and the function to invoke when the task is run. If your task takes a command-line option, you can define the option with short and long flags, and it will be made available in the <code>options</code> object. Here’s a task that uses the Node.js API to rebuild CoffeeScript’s parser:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"cake_tasks\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"cake_tasks-coffee\">fs = require 'fs'\n\noption '-o', '--output [DIR]', 'directory for compiled code'\n\ntask 'build:parser', 'rebuild the Jison parser', (options) ->\n  require 'jison'\n  code = require('./lib/grammar').parser.generate()\n  dir  = options.output or 'lib'\n  fs.writeFile \"#{dir}/parser.js\", code\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">fs</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">require</span> <span class=\"cm-string\">'fs'</span>\n\n<span class=\"cm-variable\">option</span> <span class=\"cm-string\">'-o'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'--output [DIR]'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'directory for compiled code'</span>\n\n<span class=\"cm-variable\">task</span> <span class=\"cm-string\">'build:parser'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'rebuild the Jison parser'</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">options</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">require</span> <span class=\"cm-string\">'jison'</span>\n  <span class=\"cm-variable\">code</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">require</span><span class=\"cm-punctuation\">(</span><span class=\"cm-string\">'./lib/grammar'</span><span class=\"cm-punctuation\">).</span><span class=\"cm-property\">parser</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">generate</span><span class=\"cm-punctuation\">()</span>\n  <span class=\"cm-variable\">dir</span>  <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">options</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">output</span> <span class=\"cm-operator\">or</span> <span class=\"cm-string\">'lib'</span>\n  <span class=\"cm-variable\">fs</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">writeFile</span> <span class=\"cm-string\">\"#{dir}/parser.js\"</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">code</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"cake_tasks-js\">var fs;\n\nfs = require('fs');\n\noption('-o', '--output [DIR]', 'directory for compiled code');\n\ntask('build:parser', 'rebuild the Jison parser', function(options) {\n  var code, dir;\n  require('jison');\n  code = require('./lib/grammar').parser.generate();\n  dir = options.output || 'lib';\n  return fs.writeFile(`${dir}/parser.js`, code);\n});\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">fs</span>;\n\n<span class=\"cm-variable\">fs</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">require</span>(<span class=\"cm-string\">'fs'</span>);\n\n<span class=\"cm-variable\">option</span>(<span class=\"cm-string\">'-o'</span>, <span class=\"cm-string\">'--output [DIR]'</span>, <span class=\"cm-string\">'directory for compiled code'</span>);\n\n<span class=\"cm-variable\">task</span>(<span class=\"cm-string\">'build:parser'</span>, <span class=\"cm-string\">'rebuild the Jison parser'</span>, <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">options</span>) {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">code</span>, <span class=\"cm-def\">dir</span>;\n  <span class=\"cm-variable\">require</span>(<span class=\"cm-string\">'jison'</span>);\n  <span class=\"cm-variable-2\">code</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable\">require</span>(<span class=\"cm-string\">'./lib/grammar'</span>).<span class=\"cm-property\">parser</span>.<span class=\"cm-property\">generate</span>();\n  <span class=\"cm-variable-2\">dir</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">options</span>.<span class=\"cm-property\">output</span> <span class=\"cm-operator\">||</span> <span class=\"cm-string\">'lib'</span>;\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">fs</span>.<span class=\"cm-property\">writeFile</span>(<span class=\"cm-string-2\">`${</span><span class=\"cm-variable-2\">dir</span><span class=\"cm-string-2\">}/parser.js`</span>, <span class=\"cm-variable-2\">code</span>);\n});\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p>If you need to invoke one task before another — for example, running <code>build</code> before <code>test</code>, you can use the <code>invoke</code> function: <code>invoke 'build'</code>. Cake tasks are a minimal way to expose your CoffeeScript functions to the command line, so <a href=\"/v2/annotated-source/cake.html\">don’t expect any fanciness built-in</a>. If you need dependencies, or async callbacks, it’s best to put them in your code itself — not the cake task.</p>\n\n      </section>\n      <section id=\"scripts\">\n        <h2><code>&quot;text/coffeescript&quot;</code> Script Tags</h2>\n<p>While it’s not recommended for serious use, CoffeeScripts may be included directly within the browser using <code>&lt;script type=&quot;text/coffeescript&quot;&gt;</code> tags. The source includes a compressed and minified version of the compiler (<a href=\"/v2/browser-compiler-legacy/coffeescript.js\">Download current version here, 77k when gzipped</a>) as <code>docs/v2/browser-compiler-legacy/coffeescript.js</code>. Include this file on a page with inline CoffeeScript tags, and it will compile and evaluate them in order.</p>\n<p>The usual caveats about CoffeeScript apply — your inline scripts will run within a closure wrapper, so if you want to expose global variables or functions, attach them to the <code>window</code> object.</p>\n\n      </section>\n      <section id=\"integrations\">\n        <h2>Integrations</h2>\n<p>CoffeeScript is part of the vast JavaScript ecosystem, and many libraries help integrate CoffeeScript with JavaScript. Major projects, especially projects updated to work with CoffeeScript 2, are listed here; more can be found in the <a href=\"https://github.com/jashkenas/coffeescript/wiki\">wiki pages</a>. If there’s a project that you feel should be added to this section, please open an issue or <a href=\"https://github.com/jashkenas/coffeescript/wiki/%5BHowTo%5D-Update-the-docs\">pull request</a>. Projects are listed in alphabetical order by category.</p>\n\n        <section id=\"build-tools\">\n          <h3>Build Tools</h3>\n<ul>\n<li>\n<p><a href=\"http://browserify.org\">Browserify</a> with <a href=\"https://github.com/jnordberg/coffeeify\">coffeeify</a></p>\n</li>\n<li>\n<p><a href=\"https://gruntjs.com\">Grunt</a> with <a href=\"https://github.com/gruntjs/grunt-contrib-coffee\">grunt-contrib-coffee</a></p>\n</li>\n<li>\n<p><a href=\"https://gulpjs.com\">Gulp</a> with <a href=\"https://github.com/gulp-community/gulp-coffee\">gulp-coffee</a></p>\n</li>\n<li>\n<p><a href=\"https://parceljs.org\">Parcel</a> with <a href=\"https://github.com/parcel-bundler/parcel/tree/v2/packages/transformers/coffeescript\">transformer-coffeescript</a></p>\n</li>\n<li>\n<p><a href=\"https://rollupjs.org\">Rollup</a> with <a href=\"https://github.com/lautis/rollup-plugin-coffee-script\">rollup-plugin-coffee-script</a></p>\n</li>\n<li>\n<p><a href=\"https://webpack.js.org\">Webpack</a> with <a href=\"https://github.com/webpack-contrib/coffee-loader\">coffee-loader</a></p>\n</li>\n</ul>\n\n        </section>\n        <section id=\"code-editors\">\n          <h3>Code Editors</h3>\n<ul>\n<li>\n<p><a href=\"https://atom.io\">Atom</a> <a href=\"https://atom.io/packages/search?q=coffeescript\">packages</a></p>\n</li>\n<li>\n<p><a href=\"https://sublimetext.com\">Sublime Text</a> <a href=\"https://packagecontrol.io/search/coffeescript\">packages</a></p>\n</li>\n<li>\n<p><a href=\"https://code.visualstudio.com\">Visual Studio Code</a> <a href=\"https://marketplace.visualstudio.com/search?target=VSCode&amp;term=coffeescript\">extensions</a></p>\n</li>\n</ul>\n\n        </section>\n        <section id=\"frameworks\">\n          <h3>Frameworks</h3>\n<ul>\n<li>\n<p><a href=\"https://emberjs.com\">Ember</a>\nwith <a href=\"https://github.com/kimroen/ember-cli-coffeescript\">ember-cli-coffeescript</a></p>\n</li>\n<li>\n<p><a href=\"https://meteor.com\">Meteor</a> with <a href=\"https://atmospherejs.com/meteor/coffeescript-compiler\">coffeescript-compiler</a></p>\n</li>\n</ul>\n\n        </section>\n        <section id=\"linters-and-formatting\">\n          <h3>Linters and Formatting</h3>\n<ul>\n<li>\n<p><a href=\"https://coffeelint.github.io/\">CoffeeLint</a></p>\n</li>\n<li>\n<p><a href=\"https://eslint.org\">ESLint</a> with <a href=\"https://github.com/helixbass/eslint-plugin-coffee\">eslint-plugin-coffee</a></p>\n</li>\n<li>\n<p><a href=\"https://prettier.io\">Prettier</a> with <a href=\"https://github.com/helixbass/prettier-plugin-coffeescript\">prettier-plugin-coffeescript</a></p>\n</li>\n</ul>\n\n        </section>\n        <section id=\"testing\">\n          <h3>Testing</h3>\n<ul>\n<li><a href=\"https://jestjs.io\">Jest</a> with <a href=\"https://github.com/danielbayley/jest-preset-coffeescript\">jest-preset-coffeescript</a></li>\n</ul>\n\n        </section>\n      </section>\n      <section id=\"resources\">\n        <h2>Resources</h2>\n<ul>\n<li><a href=\"https://github.com/jashkenas/coffeescript/\">CoffeeScript on GitHub</a></li>\n<li><a href=\"https://github.com/jashkenas/coffeescript/issues\">CoffeeScript Issues</a><br>\nBug reports, feature proposals, and ideas for changes to the language belong here.</li>\n<li><a href=\"https://groups.google.com/forum/#!forum/coffeescript\">CoffeeScript Google Group</a><br>\nIf you’d like to ask a question, the mailing list is a good place to get help.</li>\n<li><a href=\"https://github.com/jashkenas/coffeescript/wiki\">The CoffeeScript Wiki</a><br>\nIf you’ve ever learned a neat CoffeeScript tip or trick, or ran into a gotcha — share it on the wiki.</li>\n<li><a href=\"https://github.com/jashkenas/coffeescript/wiki/FAQ\">The FAQ</a><br>\nPerhaps your CoffeeScript-related question has been asked before. Check the FAQ first.</li>\n<li><a href=\"http://js2.coffee/\">JS2Coffee</a><br>\nIs a very well done reverse JavaScript-to-CoffeeScript compiler. It’s not going to be perfect (infer what your JavaScript classes are, when you need bound functions, and so on…) — but it’s a great starting point for converting simple scripts.</li>\n<li><a href=\"https://github.com/jashkenas/coffeescript/tree/master/documentation/site\">High-Rez Logo</a><br>\nThe CoffeeScript logo is available in SVG for use in presentations.</li>\n</ul>\n\n        <section id=\"books\">\n          <h2>Books</h2>\n<p>There are a number of excellent resources to help you get started with CoffeeScript, some of which are freely available online.</p>\n<ul>\n<li><a href=\"http://arcturo.github.io/library/coffeescript/\">The Little Book on CoffeeScript</a> is a brief 5-chapter introduction to CoffeeScript, written with great clarity and precision by <a href=\"http://alexmaccaw.co.uk/\">Alex MacCaw</a>.</li>\n<li><a href=\"http://autotelicum.github.io/Smooth-CoffeeScript/\">Smooth CoffeeScript</a> is a reimagination of the excellent book <a href=\"http://eloquentjavascript.net/\">Eloquent JavaScript</a>, as if it had been written in CoffeeScript instead. Covers language features as well as the functional and object oriented programming styles. By <a href=\"https://github.com/autotelicum\">E. Hoigaard</a>.</li>\n<li><a href=\"http://pragprog.com/book/tbcoffee/coffeescript\">CoffeeScript: Accelerated JavaScript Development</a> is <a href=\"http://trevorburnham.com/\">Trevor Burnham</a>’s thorough introduction to the language. By the end of the book, you’ll have built a fast-paced multiplayer word game, writing both the client-side and Node.js portions in CoffeeScript.</li>\n<li><a href=\"https://www.packtpub.com/web-development/coffeescript-programming-jquery-rails-and-nodejs\">CoffeeScript Programming with jQuery, Rails, and Node.js</a> is a new book by Michael Erasmus that covers CoffeeScript with an eye towards real-world usage both in the browser (jQuery) and on the server-side (Rails, Node).</li>\n<li><a href=\"https://leanpub.com/coffeescript-ristretto/read\">CoffeeScript Ristretto</a> is a deep dive into CoffeeScript’s semantics from simple functions up through closures, higher-order functions, objects, classes, combinators, and decorators. By <a href=\"http://braythwayt.com/\">Reg Braithwaite</a>.</li>\n<li><a href=\"https://efendibooks.com/minibooks/testing-with-coffeescript\">Testing with CoffeeScript</a> is a succinct and freely downloadable guide to building testable applications with CoffeeScript and Jasmine.</li>\n<li><a href=\"https://www.packtpub.com/web-development/coffeescript-application-development\">CoffeeScript Application Development</a> from Packt, introduces CoffeeScript while walking through the process of building a demonstration web application. A <a href=\"https://www.packtpub.com/web-development/coffeescript-application-development-cookbook\">CoffeeScript Application Development Coookbook</a> with over 90 “recipes” is also available.</li>\n<li><a href=\"https://www.manning.com/books/coffeescript-in-action\">CoffeeScript in Action</a> from Manning Publications, covers CoffeeScript syntax, composition techniques and application development.</li>\n<li><a href=\"https://www.dpunkt.de/buecher/4021/coffeescript.html\">CoffeeScript: Die Alternative zu JavaScript</a> from dpunkt.verlag, is the first CoffeeScript book in Deutsch.</li>\n</ul>\n\n        </section>\n        <section id=\"screencasts\">\n          <h2>Screencasts</h2>\n<ul>\n<li><a href=\"http://coffeescript.codeschool.com/\">A Sip of CoffeeScript</a> is a <a href=\"https://www.codeschool.com\">Code School Course</a> which combines 6 screencasts with in-browser coding to make learning fun. The first level is free to try out.</li>\n<li><a href=\"https://www.pluralsight.com/courses/meet-coffeescript\">Meet CoffeeScript</a> is a 75-minute long screencast by PeepCode, now <a href=\"https://www.pluralsight.com/\">PluralSight</a>. Highly memorable for its animations which demonstrate transforming CoffeeScript into the equivalent JS.</li>\n<li>If you’re looking for less of a time commitment, RailsCasts’ <a href=\"http://railscasts.com/episodes/267-coffeescript-basics\">CoffeeScript Basics</a> should have you covered, hitting all of the important notes about CoffeeScript in 11 minutes.</li>\n</ul>\n\n        </section>\n        <section id=\"examples\">\n          <h2>Examples</h2>\n<p>The <a href=\"https://github.com/trending?l=coffeescript&amp;since=monthly\">best list of open-source CoffeeScript examples</a> can be found on GitHub. But just to throw out a few more:</p>\n<ul>\n<li><strong>GitHub</strong>’s <a href=\"https://hubot.github.com/\">Hubot</a>, a friendly IRC robot that can perform any number of useful and useless tasks.</li>\n<li><strong>sstephenson</strong>’s <a href=\"http://pow.cx/\">Pow</a>, a zero-configuration Rack server, with comprehensive annotated source.</li>\n<li><strong>technoweenie</strong>’s <a href=\"https://github.com/technoweenie/coffee-resque\">Coffee-Resque</a>, a port of <a href=\"https://github.com/defunkt/resque\">Resque</a> for Node.js.</li>\n<li><strong>stephank</strong>’s <a href=\"https://github.com/stephank/orona\">Orona</a>, a remake of the Bolo tank game for modern browsers.</li>\n<li><strong>GitHub</strong>’s <a href=\"https://atom.io/\">Atom</a>, a hackable text editor built on web technologies.</li>\n<li><strong>Basecamp</strong>’s <a href=\"https://trix-editor.org/\">Trix</a>, a rich text editor for web apps.</li>\n</ul>\n\n        </section>\n        <section id=\"chat\">\n          <h2>Web Chat (IRC)</h2>\n<p>Quick help and advice can often be found in the CoffeeScript IRC room <code>#coffeescript</code> on <code>irc.freenode.net</code>, which you can <a href=\"http://webchat.freenode.net/?channels=coffeescript\">join via your web browser</a>.</p>\n\n        </section>\n        <section id=\"annotated-source\">\n          <h2>Annotated Source</h2>\n<p>You can browse the CoffeeScript 2.7.0 source in readable, annotated form <a href=\"annotated-source/\">here</a>. You can also jump directly to a particular source file:</p>\n<ul>\n<li><a href=\"annotated-source/grammar.html\">Grammar Rules — src/grammar</a></li>\n<li><a href=\"annotated-source/lexer.html\">Lexing Tokens — src/lexer</a></li>\n<li><a href=\"annotated-source/rewriter.html\">The Rewriter — src/rewriter</a></li>\n<li><a href=\"annotated-source/nodes.html\">The Syntax Tree — src/nodes</a></li>\n<li><a href=\"annotated-source/scope.html\">Lexical Scope — src/scope</a></li>\n<li><a href=\"annotated-source/helpers.html\">Helpers &amp; Utility Functions — src/helpers</a></li>\n<li><a href=\"annotated-source/coffeescript.html\">The CoffeeScript Module — src/coffeescript</a></li>\n<li><a href=\"annotated-source/cake.html\">Cake &amp; Cakefiles — src/cake</a></li>\n<li><a href=\"annotated-source/command.html\">“coffee” Command-Line Utility — src/command</a></li>\n<li><a href=\"annotated-source/optparse.html\">Option Parsing — src/optparse</a></li>\n<li><a href=\"annotated-source/repl.html\">Interactive REPL — src/repl</a></li>\n<li><a href=\"annotated-source/sourcemap.html\">Source Maps — src/sourcemap</a></li>\n</ul>\n\n        </section>\n        <section id=\"contributing\">\n          <h2>Contributing</h2>\n<p>Contributions are welcome! Feel free to fork <a href=\"https://github.com/jashkenas/coffeescript\">the repo</a> and submit a pull request.</p>\n<p><a href=\"#unsupported\">Some features of ECMAScript are intentionally unsupported</a>. Please review both the open and closed <a href=\"https://github.com/jashkenas/coffeescript/issues\">issues on GitHub</a> to see if the feature you’re looking for has already been discussed. As a general rule, we don’t support ECMAScript syntax for features that aren’t yet finalized (at Stage 4 in the <a href=\"https://github.com/tc39/proposals\">proposal approval process</a>) or implemented in major browsers and/or Node (which can sometimes happen for features in Stage 3). Any Stage 3 features that CoffeeScript chooses to support should be considered experimental, subject to breaking changes or removal until the feature reaches Stage 4.</p>\n<p>For more resources on adding to CoffeeScript, please see <a href=\"https://github.com/jashkenas/coffeescript/wiki/%5BHowto%5D-Hacking-on-the-CoffeeScript-Compiler\">the Wiki</a>, especially <a href=\"https://github.com/jashkenas/coffeescript/wiki/%5BHowTo%5D-How-parsing-works\">How The Parser Works</a>.</p>\n<p>There are several things you can do to increase your odds of having your pull request accepted:</p>\n<ul>\n<li>Create tests! Any pull request should probably include basic tests to verify you didn’t break anything, or future changes won’t break your code.</li>\n<li>Follow the style of the rest of the CoffeeScript codebase.</li>\n<li>Ensure any ECMAScript syntax is mature (at Stage 4, or at Stage 3 with support in major browsers or runtimes).</li>\n<li>Add only features that have broad utility, rather than a feature aimed at a specific use case or framework.</li>\n</ul>\n<p>Of course, it’s entirely possible that you have a great addition, but it doesn’t fit within these constraints. Feel free to roll your own solution; you will have <a href=\"https://github.com/jashkenas/coffeescript/wiki/In-The-Wild\">plenty of company</a>.</p>\n\n        </section>\n      </section>\n      <section id=\"unsupported\">\n        <h2>Unsupported ECMAScript Features</h2>\n<p>There are a few ECMAScript features that CoffeeScript intentionally doesn’t support.</p>\n\n        <section id=\"unsupported-let-const\">\n          <h3><code>let</code> and <code>const</code>: block-scoped and reassignment-protected variables</h3>\n<p>When CoffeeScript was designed, <code>var</code> was <a href=\"https://github.com/jashkenas/coffeescript/issues/238#issuecomment-153502\">intentionally omitted</a>. This was to spare developers the mental housekeeping of needing to worry about variable <em>declaration</em> (<code>var foo</code>) as opposed to variable <em>assignment</em> (<code>foo = 1</code>). The CoffeeScript compiler automatically takes care of declaration for you, by generating <code>var</code> statements at the top of every function scope. This makes it impossible to accidentally declare a global variable.</p>\n<p><code>let</code> and <code>const</code> add a useful ability to JavaScript in that you can use them to declare variables within a <em>block</em> scope, for example within an <code>if</code> statement body or a <code>for</code> loop body, whereas <code>var</code> always declares variables in the scope of an entire function. When CoffeeScript 2 was designed, there was much discussion of whether this functionality was useful enough to outweigh the simplicity offered by never needing to consider variable declaration in CoffeeScript. In the end, it was decided that the simplicity was more valued. In CoffeeScript there remains only one type of variable.</p>\n<p>Keep in mind that <code>const</code> only protects you from <em>reassigning</em> a variable; it doesn’t prevent the variable’s value from changing, the way constants usually do in other languages:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-js\"><span class=\"keyword\">const</span> obj = {<span class=\"attr\">foo</span>: <span class=\"string\">&#x27;bar&#x27;</span>};\nobj.<span class=\"property\">foo</span> = <span class=\"string\">&#x27;baz&#x27;</span>; <span class=\"comment\">// Allowed!</span>\nobj = {}; <span class=\"comment\">// Throws error</span>\n</code></pre>\n</blockquote>\n        </section>\n        <section id=\"unsupported-named-functions\">\n          <h3>Named functions and function declarations</h3>\n<p>Newcomers to CoffeeScript often wonder how to generate the JavaScript <code>function foo() {}</code>, as opposed to the <code>foo = function() {}</code> that CoffeeScript produces. The first form is a <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function\">function declaration</a>, and the second is a <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function\">function expression</a>. As stated above, in CoffeeScript <a href=\"#expressions\">everything is an expression</a>, so naturally we favor the expression form. Supporting only one variant helps avoid confusing bugs that can arise from the <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function#Function_declaration_hoisting\">subtle differences between the two forms</a>.</p>\n<p>Technically, <code>foo = function() {}</code> is creating an anonymous function that gets assigned to a variable named <code>foo</code>. Some very early versions of CoffeeScript named this function, e.g. <code>foo = function foo() {}</code>, but this was dropped because of compatibility issues with Internet Explorer. For a while this annoyed people, as these functions would be unnamed in stack traces; but modern JavaScript runtimes <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\">infer the names of such anonymous functions</a> from the names of the variables to which they’re assigned. Given that this is the case, it’s simplest to just preserve the current behavior.</p>\n\n        </section>\n        <section id=\"unsupported-get-set\">\n          <h3><code>get</code> and <code>set</code> keyword shorthand syntax</h3>\n<p><code>get</code> and <code>set</code>, as keywords preceding functions or class methods, are intentionally unimplemented in CoffeeScript.</p>\n<p>This is to avoid grammatical ambiguity, since in CoffeeScript such a construct looks identical to a function call (e.g. <code>get(function foo() {})</code>); and because there is an <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\">alternate syntax</a> that is slightly more verbose but just as effective:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"get_set\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"get_set-coffee\">screen =\n  width: 1200\n  ratio: 16/9\n\nObject.defineProperty screen, 'height',\n  get: ->\n    this.width / this.ratio\n  set: (val) ->\n    this.width = val * this.ratio\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">screen</span> <span class=\"cm-punctuation\">=</span>\n<span class=\"cm-indent\">  </span><span class=\"cm-variable\">width</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-number\">1200</span>\n  <span class=\"cm-variable\">ratio</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-number\">16</span><span class=\"cm-operator\">/</span><span class=\"cm-number\">9</span>\n\n<span class=\"cm-variable\">Object</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">defineProperty</span> <span class=\"cm-variable\">screen</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-string\">'height'</span><span class=\"cm-punctuation\">,</span>\n<span class=\"cm-indent\">  </span><span class=\"cm-variable\">get</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-operator\">-></span>\n    <span class=\"cm-keyword\">this</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">width</span> <span class=\"cm-operator\">/</span> <span class=\"cm-keyword\">this</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">ratio</span>\n<span class=\"cm-dedent\">  </span><span class=\"cm-variable\">set</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">val</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n    <span class=\"cm-keyword\">this</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">width</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">val</span> <span class=\"cm-operator\">*</span> <span class=\"cm-keyword\">this</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">ratio</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"get_set-js\">var screen;\n\nscreen = {\n  width: 1200,\n  ratio: 16 / 9\n};\n\nObject.defineProperty(screen, 'height', {\n  get: function() {\n    return this.width / this.ratio;\n  },\n  set: function(val) {\n    return this.width = val * this.ratio;\n  }\n});\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">screen</span>;\n\n<span class=\"cm-variable\">screen</span> <span class=\"cm-operator\">=</span> {\n  <span class=\"cm-property\">width</span>: <span class=\"cm-number\">1200</span>,\n  <span class=\"cm-property\">ratio</span>: <span class=\"cm-number\">16</span> <span class=\"cm-operator\">/</span> <span class=\"cm-number\">9</span>\n};\n\n<span class=\"cm-variable\">Object</span>.<span class=\"cm-property\">defineProperty</span>(<span class=\"cm-variable\">screen</span>, <span class=\"cm-string\">'height'</span>, {\n  <span class=\"cm-property\">get</span>: <span class=\"cm-keyword\">function</span>() {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">width</span> <span class=\"cm-operator\">/</span> <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">ratio</span>;\n  },\n  <span class=\"cm-property\">set</span>: <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">val</span>) {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">width</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">val</span> <span class=\"cm-operator\">*</span> <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">ratio</span>;\n  }\n});\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"get_set\" data-run=\"screen.height\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>screen.height</button>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n      </section>\n      <section id=\"breaking-changes\">\n        <h2>Breaking Changes From CoffeeScript 1.x to 2</h2>\n<p>CoffeeScript 2 aims to output as much idiomatic ES2015+ syntax as possible with as few breaking changes from CoffeeScript 1.x as possible. Some breaking changes, unfortunately, were unavoidable.</p>\n\n        <section id=\"breaking-changes-fat-arrow\">\n          <h3>Bound (fat arrow) functions</h3>\n<p>In CoffeeScript 1.x, <code>=&gt;</code> compiled to a regular <code>function</code> but with references to <code>this</code>/<code>@</code> rewritten to use the outer scope’s <code>this</code>, or with the inner function bound to the outer scope via <code>.bind</code> (hence the name “bound function”). In CoffeeScript 2, <code>=&gt;</code> compiles to <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions\">ES2015’s <code>=&gt;</code></a>, which behaves slightly differently. The largest difference is that in ES2015, <code>=&gt;</code> functions lack an <code>arguments</code> object:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"breaking_change_fat_arrow\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"breaking_change_fat_arrow-coffee\">outer = ->\n  inner = => Array.from arguments\n  inner()\n\nouter(1, 2)  # Returns '' in CoffeeScript 1.x, '1, 2' in CoffeeScript 2\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">outer</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">inner</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-operator\">=></span> <span class=\"cm-variable\">Array</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">from</span> <span class=\"cm-variable\">arguments</span>\n  <span class=\"cm-variable\">inner</span><span class=\"cm-punctuation\">()</span>\n\n<span class=\"cm-variable\">outer</span><span class=\"cm-punctuation\">(</span><span class=\"cm-number\">1</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-number\">2</span><span class=\"cm-punctuation\">)</span>  <span class=\"cm-comment\"># Returns '' in CoffeeScript 1.x, '1, 2' in CoffeeScript 2</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"breaking_change_fat_arrow-js\">var outer;\n\nouter = function() {\n  var inner;\n  inner = () => {\n    return Array.from(arguments);\n  };\n  return inner();\n};\n\nouter(1, 2); // Returns '' in CoffeeScript 1.x, '1, 2' in CoffeeScript 2\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">outer</span>;\n\n<span class=\"cm-variable\">outer</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>() {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">inner</span>;\n  <span class=\"cm-variable-2\">inner</span> <span class=\"cm-operator\">=</span> () <span class=\"cm-operator\">=></span> {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">Array</span>.<span class=\"cm-property\">from</span>(<span class=\"cm-variable-2\">arguments</span>);\n  };\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">inner</span>();\n};\n\n<span class=\"cm-variable\">outer</span>(<span class=\"cm-number\">1</span>, <span class=\"cm-number\">2</span>); <span class=\"cm-comment\">// Returns '' in CoffeeScript 1.x, '1, 2' in CoffeeScript 2</span>\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"breaking_change_fat_arrow\" data-run=\"outer%281%2C%202%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>outer(1, 2)</button>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"breaking-changes-default-values\">\n          <h3>Default values for function parameters and destructured elements</h3>\n<p>Per the <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Default_parameters\">ES2015 spec regarding function default parameters</a> and <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Default_values\">destructuring default values</a>, default values are only applied when a value is missing or <code>undefined</code>. In CoffeeScript 1.x, the default value would be applied in those cases but also if the  value was <code>null</code>.</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"breaking_change_function_parameter_default_values\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"breaking_change_function_parameter_default_values-coffee\">f = (a = 1) -> a\n\nf(null)  # Returns 1 in CoffeeScript 1.x, null in CoffeeScript 2\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">f</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">a</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">1</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span> <span class=\"cm-variable\">a</span>\n\n<span class=\"cm-variable\">f</span><span class=\"cm-punctuation\">(</span><span class=\"cm-atom\">null</span><span class=\"cm-punctuation\">)</span>  <span class=\"cm-comment\"># Returns 1 in CoffeeScript 1.x, null in CoffeeScript 2</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"breaking_change_function_parameter_default_values-js\">var f;\n\nf = function(a = 1) {\n  return a;\n};\n\nf(null); // Returns 1 in CoffeeScript 1.x, null in CoffeeScript 2\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">f</span>;\n\n<span class=\"cm-variable\">f</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">a</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">1</span>) {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">a</span>;\n};\n\n<span class=\"cm-variable\">f</span>(<span class=\"cm-atom\">null</span>); <span class=\"cm-comment\">// Returns 1 in CoffeeScript 1.x, null in CoffeeScript 2</span>\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"breaking_change_function_parameter_default_values\" data-run=\"f%28null%29\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>f(null)</button>\n    </div>\n  </div>\n  \n</aside>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"breaking_change_destructuring_default_values\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"breaking_change_destructuring_default_values-coffee\">{a = 1} = {a: null}\n\na  # Equals 1 in CoffeeScript 1.x, null in CoffeeScript 2\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-punctuation\">{</span><span class=\"cm-variable\">a</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-number\">1</span><span class=\"cm-punctuation\">}</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">{</span><span class=\"cm-variable\">a</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-atom\">null</span><span class=\"cm-punctuation\">}</span>\n\n<span class=\"cm-variable\">a</span>  <span class=\"cm-comment\"># Equals 1 in CoffeeScript 1.x, null in CoffeeScript 2</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"breaking_change_destructuring_default_values-js\">var a;\n\n({a = 1} = {\n  a: null\n});\n\na; // Equals 1 in CoffeeScript 1.x, null in CoffeeScript 2\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">a</span>;\n\n({<span class=\"cm-property\">a</span> <span class=\"cm-operator\">=</span> <span class=\"cm-number\">1</span>} <span class=\"cm-operator\">=</span> {\n  <span class=\"cm-property\">a</span>: <span class=\"cm-atom\">null</span>\n});\n\n<span class=\"cm-variable\">a</span>; <span class=\"cm-comment\">// Equals 1 in CoffeeScript 1.x, null in CoffeeScript 2</span>\n</pre>\n    </div>\n  </div>\n  \n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"breaking_change_destructuring_default_values\" data-run=\"a\"><small><svg class=\"play-button\" viewBox=\"0 0 24 24\">\n\t<path d=\"M2.56-0.01v24.02L21.44 11.98 2.56-0.01z\"></path>\n</svg>\n</small>a</button>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"breaking-changes-bound-generator-functions\">\n          <h3>Bound generator functions</h3>\n<p>Bound generator functions, a.k.a. generator arrow functions, <a href=\"http://stackoverflow.com/questions/27661306/can-i-use-es6s-arrow-function-syntax-with-generators-arrow-notation\">aren’t allowed in ECMAScript</a>. You can write <code>function*</code> or <code>=&gt;</code>, but not both. Therefore, CoffeeScript code like this:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-coffee\"><span class=\"function\"><span class=\"title\">f</span> = =&gt;</span> <span class=\"keyword\">yield</span> this\n<span class=\"comment\"># Throws a compiler error</span>\n</code></pre>\n</blockquote><p>Needs to be rewritten the old-fashioned way:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"breaking_change_bound_generator_function\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"breaking_change_bound_generator_function-coffee\">self = this\nf = -> yield self\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-variable\">self</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-keyword\">this</span>\n<span class=\"cm-variable\">f</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-operator\">-></span> <span class=\"cm-variable\">yield</span> <span class=\"cm-variable\">self</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"breaking_change_bound_generator_function-js\">var f, self;\n\nself = this;\n\nf = function*() {\n  return (yield self);\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">f</span>, <span class=\"cm-def\">self</span>;\n\n<span class=\"cm-variable\">self</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">this</span>;\n\n<span class=\"cm-variable\">f</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function*</span>() {\n  <span class=\"cm-keyword\">return</span> (<span class=\"cm-keyword\">yield</span> <span class=\"cm-variable\">self</span>);\n};\n</pre>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"breaking-changes-classes\">\n          <h3>Classes are compiled to ES2015 classes</h3>\n<p>ES2015 classes and their methods have some restrictions beyond those on regular functions.</p>\n<p>Class constructors can’t be invoked without <code>new</code>:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-coffee\">(<span class=\"keyword\">class</span>)()\n<span class=\"comment\"># Throws a TypeError at runtime</span>\n</code></pre>\n</blockquote><p>ES2015 classes don’t allow bound (fat arrow) methods. The CoffeeScript compiler goes through some contortions to preserve support for them, but one thing that can’t be accommodated is calling a bound method before it is bound:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-coffee\"><span class=\"keyword\">class</span> <span class=\"title class_\">Base</span>\n  constructor: <span class=\"function\">-&gt;</span>\n    @onClick()      <span class=\"comment\"># This works</span>\n    clickHandler = @onClick\n    clickHandler()  <span class=\"comment\"># This throws a runtime error</span>\n\n<span class=\"keyword\">class</span> <span class=\"title class_\">Component</span> <span class=\"keyword\">extends</span> <span class=\"title class_ inherited__\">Base</span>\n  onClick: <span class=\"function\">=&gt;</span>\n    console.log <span class=\"string\">&#x27;Clicked!&#x27;</span>, @\n</code></pre>\n</blockquote><p>Class methods can’t be used with <code>new</code> (uncommon):</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-coffee\"><span class=\"keyword\">class</span> <span class=\"title class_\">Namespace</span>\n  @Klass = <span class=\"function\">-&gt;</span>\n<span class=\"keyword\">new</span> Namespace.Klass  <span class=\"comment\"># Throws a TypeError at runtime</span>\n</code></pre>\n</blockquote><p>Due to the hoisting required to compile to ES2015 classes, dynamic keys in class methods can’t use values from the executable class body unless the methods are assigned in prototype style.</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-coffee\"><span class=\"keyword\">class</span> <span class=\"title class_\">A</span>\n  name = <span class=\"string\">&#x27;method&#x27;</span>\n  <span class=\"string\">&quot;<span class=\"subst\">#{name}</span>&quot;</span>: <span class=\"function\">-&gt;</span>   <span class=\"comment\"># This method will be named &#x27;undefined&#x27;</span>\n  @::[name] = <span class=\"function\">-&gt;</span>  <span class=\"comment\"># This will work; assigns to `A.prototype.method`</span>\n</code></pre>\n</blockquote>\n        </section>\n        <section id=\"breaking-changes-super-this\">\n          <h3><code>super</code> and <code>this</code></h3>\n<p>In the constructor of a derived class (a class that <code>extends</code> another class), <code>this</code> cannot be used before calling <code>super</code>:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-coffee\"><span class=\"keyword\">class</span> <span class=\"title class_\">B</span> <span class=\"keyword\">extends</span> <span class=\"title class_ inherited__\">A</span>\n  constructor: <span class=\"function\">-&gt;</span> this  <span class=\"comment\"># Throws a compiler error</span>\n</code></pre>\n</blockquote><p>This also means you cannot pass a reference to <code>this</code> as an argument to <code>super</code> in the constructor of a derived class:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-coffee\"><span class=\"keyword\">class</span> <span class=\"title class_\">B</span> <span class=\"keyword\">extends</span> <span class=\"title class_ inherited__\">A</span>\n  constructor: <span class=\"function\"><span class=\"params\">(@arg)</span> -&gt;</span>\n    super @arg  <span class=\"comment\"># Throws a compiler error</span>\n</code></pre>\n</blockquote><p>This is a limitation of ES2015 classes. As a workaround, assign to <code>this</code> after the <code>super</code> call:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"breaking_change_super_this\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"breaking_change_super_this-coffee\">class B extends A\n  constructor: (arg) ->\n    super arg\n    @arg = arg\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">class</span> <span class=\"cm-variable\">B</span> <span class=\"cm-keyword\">extends</span> <span class=\"cm-variable\">A</span>\n  <span class=\"cm-variable\">constructor</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">arg</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n    <span class=\"cm-variable\">super</span> <span class=\"cm-variable\">arg</span>\n    <span class=\"cm-property\">@arg</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">arg</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"breaking_change_super_this-js\">var B;\n\nB = class B extends A {\n  constructor(arg) {\n    super(arg);\n    this.arg = arg;\n  }\n\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">B</span>;\n\n<span class=\"cm-variable\">B</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">class</span> <span class=\"cm-def\">B</span> <span class=\"cm-keyword\">extends</span> <span class=\"cm-variable\">A</span> {\n  <span class=\"cm-property\">constructor</span>(<span class=\"cm-def\">arg</span>) {\n    <span class=\"cm-keyword\">super</span>(<span class=\"cm-variable-2\">arg</span>);\n    <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">arg</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">arg</span>;\n  }\n\n};\n</pre>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"breaking-changes-super-extends\">\n          <h3><code>super</code> and <code>extends</code></h3>\n<p>Due to a syntax clash with <code>super</code> with accessors, “bare” <code>super</code> (the keyword <code>super</code> without parentheses) no longer compiles to a super call forwarding all arguments.</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-coffee\"><span class=\"keyword\">class</span> <span class=\"title class_\">B</span> <span class=\"keyword\">extends</span> <span class=\"title class_ inherited__\">A</span>\n  foo: <span class=\"function\">-&gt;</span> super\n  <span class=\"comment\"># Throws a compiler error</span>\n</code></pre>\n</blockquote><p>Arguments can be forwarded explicitly using splats:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"breaking_change_super_with_arguments\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"breaking_change_super_with_arguments-coffee\">class B extends A\n  foo: -> super arguments...\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">class</span> <span class=\"cm-variable\">B</span> <span class=\"cm-keyword\">extends</span> <span class=\"cm-variable\">A</span>\n  <span class=\"cm-variable\">foo</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-operator\">-></span> <span class=\"cm-variable\">super</span> <span class=\"cm-variable\">arguments</span><span class=\"cm-punctuation\">...</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"breaking_change_super_with_arguments-js\">var B;\n\nB = class B extends A {\n  foo() {\n    return super.foo(...arguments);\n  }\n\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">B</span>;\n\n<span class=\"cm-variable\">B</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">class</span> <span class=\"cm-def\">B</span> <span class=\"cm-keyword\">extends</span> <span class=\"cm-variable\">A</span> {\n  <span class=\"cm-property\">foo</span>() {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-keyword\">super</span>.<span class=\"cm-property\">foo</span>(<span class=\"cm-meta\">...</span><span class=\"cm-variable-2\">arguments</span>);\n  }\n\n};\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p>Or if you know that the parent function doesn’t require arguments, just call <code>super()</code>:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"breaking_change_super_without_arguments\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"breaking_change_super_without_arguments-coffee\">class B extends A\n  foo: -> super()\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">class</span> <span class=\"cm-variable\">B</span> <span class=\"cm-keyword\">extends</span> <span class=\"cm-variable\">A</span>\n  <span class=\"cm-variable\">foo</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-operator\">-></span> <span class=\"cm-variable\">super</span><span class=\"cm-punctuation\">()</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"breaking_change_super_without_arguments-js\">var B;\n\nB = class B extends A {\n  foo() {\n    return super.foo();\n  }\n\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">B</span>;\n\n<span class=\"cm-variable\">B</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">class</span> <span class=\"cm-def\">B</span> <span class=\"cm-keyword\">extends</span> <span class=\"cm-variable\">A</span> {\n  <span class=\"cm-property\">foo</span>() {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-keyword\">super</span>.<span class=\"cm-property\">foo</span>();\n  }\n\n};\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p>CoffeeScript 1.x allowed the <code>extends</code> keyword to set up prototypal inheritance between functions, and <code>super</code> could be used manually prototype-assigned functions:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-coffee\"><span class=\"function\"><span class=\"title\">A</span> = -&gt;</span>\n<span class=\"function\"><span class=\"title\">B</span> = -&gt;</span>\nB <span class=\"keyword\">extends</span> A\nB.prototype.foo = <span class=\"function\">-&gt;</span> super arguments...\n<span class=\"comment\"># Last two lines each throw compiler errors in CoffeeScript 2</span>\n</code></pre>\n</blockquote><p>Due to the switch to ES2015 <code>extends</code> and <code>super</code>, using these keywords for prototypal functions are no longer supported. The above case could be refactored to:</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"breaking_change_super_in_non-class_methods_refactor_with_apply\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"breaking_change_super_in_non-class_methods_refactor_with_apply-coffee\"># Helper functions\nhasProp = {}.hasOwnProperty\nextend = (child, parent) ->\n  ctor = ->\n    @constructor = child\n    return\n  for key of parent\n    if hasProp.call(parent, key)\n      child[key] = parent[key]\n  ctor.prototype = parent.prototype\n  child.prototype = new ctor\n  child\n\n\nA = ->\nB = ->\nextend B, A\nB.prototype.foo = -> A::foo.apply this, arguments\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\"># Helper functions</span>\n<span class=\"cm-variable\">hasProp</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">{}.</span><span class=\"cm-property\">hasOwnProperty</span>\n<span class=\"cm-variable\">extend</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">child</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">parent</span><span class=\"cm-punctuation\">)</span> <span class=\"cm-operator\">-></span>\n  <span class=\"cm-variable\">ctor</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-operator\">-></span>\n    <span class=\"cm-property\">@constructor</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">child</span>\n    <span class=\"cm-keyword\">return</span>\n  <span class=\"cm-keyword\">for</span> <span class=\"cm-variable\">key</span> <span class=\"cm-keyword\">of</span> <span class=\"cm-variable\">parent</span>\n    <span class=\"cm-keyword\">if</span> <span class=\"cm-variable\">hasProp</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">call</span><span class=\"cm-punctuation\">(</span><span class=\"cm-variable\">parent</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">key</span><span class=\"cm-punctuation\">)</span>\n      <span class=\"cm-variable\">child</span><span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">key</span><span class=\"cm-punctuation\">]</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">parent</span><span class=\"cm-punctuation\">[</span><span class=\"cm-variable\">key</span><span class=\"cm-punctuation\">]</span>\n<span class=\"cm-dedent\">  </span><span class=\"cm-variable\">ctor</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">prototype</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-variable\">parent</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">prototype</span>\n  <span class=\"cm-variable\">child</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">prototype</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-keyword\">new</span> <span class=\"cm-variable\">ctor</span>\n  <span class=\"cm-variable\">child</span>\n\n\n<span class=\"cm-variable\">A</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-operator\">-></span>\n<span class=\"cm-variable\">B</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-operator\">-></span>\n<span class=\"cm-variable\">extend</span> <span class=\"cm-variable\">B</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">A</span>\n<span class=\"cm-variable\">B</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">prototype</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">foo</span> <span class=\"cm-punctuation\">=</span> <span class=\"cm-operator\">-></span> <span class=\"cm-variable\">A</span><span class=\"cm-punctuation\">::</span><span class=\"cm-variable\">foo</span><span class=\"cm-punctuation\">.</span><span class=\"cm-property\">apply</span> <span class=\"cm-keyword\">this</span><span class=\"cm-punctuation\">,</span> <span class=\"cm-variable\">arguments</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"breaking_change_super_in_non-class_methods_refactor_with_apply-js\">// Helper functions\nvar A, B, extend, hasProp;\n\nhasProp = {}.hasOwnProperty;\n\nextend = function(child, parent) {\n  var ctor, key;\n  ctor = function() {\n    this.constructor = child;\n  };\n  for (key in parent) {\n    if (hasProp.call(parent, key)) {\n      child[key] = parent[key];\n    }\n  }\n  ctor.prototype = parent.prototype;\n  child.prototype = new ctor();\n  return child;\n};\n\nA = function() {};\n\nB = function() {};\n\nextend(B, A);\n\nB.prototype.foo = function() {\n  return A.prototype.foo.apply(this, arguments);\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-comment\">// Helper functions</span>\n<span class=\"cm-keyword\">var</span> <span class=\"cm-def\">A</span>, <span class=\"cm-def\">B</span>, <span class=\"cm-def\">extend</span>, <span class=\"cm-def\">hasProp</span>;\n\n<span class=\"cm-variable\">hasProp</span> <span class=\"cm-operator\">=</span> {}.<span class=\"cm-property\">hasOwnProperty</span>;\n\n<span class=\"cm-variable\">extend</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>(<span class=\"cm-def\">child</span>, <span class=\"cm-def\">parent</span>) {\n  <span class=\"cm-keyword\">var</span> <span class=\"cm-def\">ctor</span>, <span class=\"cm-def\">key</span>;\n  <span class=\"cm-variable-2\">ctor</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>() {\n    <span class=\"cm-keyword\">this</span>.<span class=\"cm-property\">constructor</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">child</span>;\n  };\n  <span class=\"cm-keyword\">for</span> (<span class=\"cm-variable-2\">key</span> <span class=\"cm-keyword\">in</span> <span class=\"cm-variable-2\">parent</span>) {\n    <span class=\"cm-keyword\">if</span> (<span class=\"cm-variable\">hasProp</span>.<span class=\"cm-property\">call</span>(<span class=\"cm-variable-2\">parent</span>, <span class=\"cm-variable-2\">key</span>)) {\n      <span class=\"cm-variable-2\">child</span>[<span class=\"cm-variable-2\">key</span>] <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">parent</span>[<span class=\"cm-variable-2\">key</span>];\n    }\n  }\n  <span class=\"cm-variable-2\">ctor</span>.<span class=\"cm-property\">prototype</span> <span class=\"cm-operator\">=</span> <span class=\"cm-variable-2\">parent</span>.<span class=\"cm-property\">prototype</span>;\n  <span class=\"cm-variable-2\">child</span>.<span class=\"cm-property\">prototype</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">new</span> <span class=\"cm-variable-2\">ctor</span>();\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable-2\">child</span>;\n};\n\n<span class=\"cm-variable\">A</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>() {};\n\n<span class=\"cm-variable\">B</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>() {};\n\n<span class=\"cm-variable\">extend</span>(<span class=\"cm-variable\">B</span>, <span class=\"cm-variable\">A</span>);\n\n<span class=\"cm-variable\">B</span>.<span class=\"cm-property\">prototype</span>.<span class=\"cm-property\">foo</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">function</span>() {\n  <span class=\"cm-keyword\">return</span> <span class=\"cm-variable\">A</span>.<span class=\"cm-property\">prototype</span>.<span class=\"cm-property\">foo</span>.<span class=\"cm-property\">apply</span>(<span class=\"cm-keyword\">this</span>, <span class=\"cm-variable-2\">arguments</span>);\n};\n</pre>\n    </div>\n  </div>\n  \n</aside>\n<p>or</p>\n<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"breaking_change_super_in_non-class_methods_refactor_with_class\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"breaking_change_super_in_non-class_methods_refactor_with_class-coffee\">class A\nclass B extends A\n  foo: -> super arguments...\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">class</span> <span class=\"cm-variable\">A</span>\n<span class=\"cm-keyword\">class</span> <span class=\"cm-variable\">B</span> <span class=\"cm-keyword\">extends</span> <span class=\"cm-variable\">A</span>\n  <span class=\"cm-variable\">foo</span><span class=\"cm-punctuation\">:</span> <span class=\"cm-operator\">-></span> <span class=\"cm-variable\">super</span> <span class=\"cm-variable\">arguments</span><span class=\"cm-punctuation\">...</span>\n</pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"breaking_change_super_in_non-class_methods_refactor_with_class-js\">var A, B;\n\nA = class A {};\n\nB = class B extends A {\n  foo() {\n    return super.foo(...arguments);\n  }\n\n};\n</textarea>\n      <pre class=\"placeholder-code\"><span class=\"cm-keyword\">var</span> <span class=\"cm-def\">A</span>, <span class=\"cm-def\">B</span>;\n\n<span class=\"cm-variable\">A</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">class</span> <span class=\"cm-def\">A</span> {};\n\n<span class=\"cm-variable\">B</span> <span class=\"cm-operator\">=</span> <span class=\"cm-keyword\">class</span> <span class=\"cm-def\">B</span> <span class=\"cm-keyword\">extends</span> <span class=\"cm-variable\">A</span> {\n  <span class=\"cm-property\">foo</span>() {\n    <span class=\"cm-keyword\">return</span> <span class=\"cm-keyword\">super</span>.<span class=\"cm-property\">foo</span>(<span class=\"cm-meta\">...</span><span class=\"cm-variable-2\">arguments</span>);\n  }\n\n};\n</pre>\n    </div>\n  </div>\n  \n</aside>\n\n        </section>\n        <section id=\"breaking-changes-jsx-and-the-less-than-and-greater-than-operators\">\n          <h3>JSX and the <code>&lt;</code> and <code>&gt;</code> operators</h3>\n<p>With the addition of <a href=\"#jsx\">JSX</a>, the <code>&lt;</code> and <code>&gt;</code> characters serve as both the “less than” and “greater than” operators and as the delimiters for XML tags, like <code>&lt;div&gt;</code>. For best results, in general you should always wrap the operators in spaces to distinguish them from XML tags: <code>i &lt; len</code>, not <code>i&lt;len</code>. The compiler tries to be forgiving when it can be sure what you intend, but always putting spaces around the “less than” and “greater than” operators will remove ambiguity.</p>\n\n        </section>\n        <section id=\"breaking-changes-literate-coffeescript\">\n          <h3>Literate CoffeeScript parsing</h3>\n<p>CoffeeScript 2’s parsing of Literate CoffeeScript has been refactored to now be more careful about not treating indented lists as code blocks; but this means that all code blocks (unless they are to be interpreted as comments) must be separated by at least one blank line from lists.</p>\n<p>Code blocks should also now maintain a consistent indentation level—so an indentation of one tab (or whatever you consider to be a tab stop, like 2 spaces or 4 spaces) should be treated as your code’s “left margin,” with all code in the file relative to that column.</p>\n<p>Code blocks that you want to be part of the commentary, and not executed, must have at least one line (ideally the first line of the block) completely unindented.</p>\n\n        </section>\n        <section id=\"breaking-changes-argument-parsing-and-shebang-lines\">\n          <h3>Argument parsing and shebang (<code>#!</code>) lines</h3>\n<p>In CoffeeScript 1.x, <code>--</code> was required after the path and filename of the script to be run, but before any arguments passed to that script. This convention is now deprecated. So instead of:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\">coffee [options] path/to/script.coffee -- [args]\n</code></pre>\n</blockquote><p>Now you would just type:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\">coffee [options] path/to/script.coffee [args]\n</code></pre>\n</blockquote><p>The deprecated version will still work, but it will print a warning before running the script.</p>\n<p>On non-Windows platforms, a <code>.coffee</code> file can be made executable by adding a shebang (<code>#!</code>) line at the top of the file and marking the file as executable. For example:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-coffee\"><span class=\"comment\">#!/usr/bin/env coffee</span>\n\nx = <span class=\"number\">2</span> + <span class=\"number\">2</span>\nconsole.log x\n</code></pre>\n</blockquote><p>If this were saved as <code>executable.coffee</code>, it could be made executable and run:</p>\n<blockquote class=\"uneditable-code-block\"><pre><code class=\"language-bash\">▶ <span class=\"built_in\">chmod</span> +x ./executable.coffee\n▶ ./executable.coffee\n4\n</code></pre>\n</blockquote><p>In CoffeeScript 1.x, this used to fail when trying to pass arguments to the script. Some users on OS X worked around the problem by using <code>#!/usr/bin/env coffee --</code> as the first line of the file. That didn’t work on Linux, however, which cannot parse shebang lines with more than a single argument. While such scripts will still run on OS X, CoffeeScript will now display a warning before compiling or evaluating files that begin with a too-long shebang line. Now that CoffeeScript 2 supports passing arguments without needing <code>--</code>, we recommend simply changing the shebang lines in such scripts to just <code>#!/usr/bin/env coffee</code>.</p>\n\n        </section>\n      </section>\n      <section id=\"changelog\">\n        <h2>Changelog</h2>\n\n        <section id=\"2.7.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.6.1...2.7.0\">2.7.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2022-04-23\">2022-04-23</time></span>\n</h3><ul>\n<li>The <a href=\"https://github.com/tc39/proposal-import-assertions\">import assertions syntax</a> is now supported. This allows statements like <code>export { version } from './package.json' assert { type: 'json' }</code> or expressions like <code>import('./calendar.json', { assert { type: 'json' } })</code>.</li>\n<li>CoffeeScript no longer always patches Node’s error stack traces. This patching, where the line and column numbers are adjusted to match the source CoffeeScript rather than the generated JavaScript, caused conflicts with other libraries and is unnecessary when Node’s new <a href=\"https://nodejs.org/docs/latest/api/cli.html#--enable-source-maps\"><code>--enable-source-maps</code> flag</a> is passed. The patching will now occur only when <code>--enable-source-maps</code> is not set, no other library has already patched the stack traces, and <code>require('coffeescript/register')</code> is used. The patching can be enabled explicitly via <code>require('coffeescript').patchStackTrace()</code> or <code>import { patchStackTrace } from 'coffeescript'; patchStackTrace()</code>.</li>\n<li>Bugfix for an issue where block (triple-quoted) strings weren’t getting transpiled correctly into a JSX expression container wrapping the template literal (such as <code>&lt;div a={`...`} /&gt;</code>).</li>\n<li>Bugfixes for line continuations not behaving as expected for a nonempty first line of an explicit <code>[</code> array or <code>{</code> object literal.</li>\n</ul>\n\n        </section>\n        <section id=\"2.6.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.6.0...2.6.1\">2.6.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2021-10-03\">2021-10-03</time></span>\n</h3><ul>\n<li>The <code>coffeescript</code> package itself now supports named exports when used by ES modules in Node.js; or in other words, <code>import { compile } from 'coffeescript'</code> now works, rather than only <code>import CoffeeScript from 'coffeescript'</code>.</li>\n<li>Bugfix for a stack overflow error when compiling large files in non-bare mode.</li>\n</ul>\n\n        </section>\n        <section id=\"2.6.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.5.1...2.6.0\">2.6.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2021-09-19\">2021-09-19</time></span>\n</h3><ul>\n<li>The syntax <code>import.meta</code>, including <code>import.meta.url</code>, is now supported.</li>\n<li>The <code>await</code> keyword is now supported outside of functions (in other words, at the top level). <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await#top_level_await\">Note that JavaScript runtimes only support this for ES modules.</a></li>\n<li>Bugfix for a <code>for</code> comprehension at the end of an <code>unless</code> or <code>until</code> line.</li>\n</ul>\n\n        </section>\n        <section id=\"2.5.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.5.0...2.5.1\">2.5.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2020-01-31\">2020-01-31</time></span>\n</h3><ul>\n<li>Object splats can now include prototype shorthands, such as <code>a = {b::c...}</code>; and soaks, such as <code>a = {b?.c..., d?()...}</code>.</li>\n<li>Bugfix for regression in 2.5.0 where compilation became much slower for files with Windows-style line endings.</li>\n<li>Bugfix for an implicit object after a line continuation keyword like <code>or</code> inside a larger implicit object.</li>\n</ul>\n\n        </section>\n        <section id=\"2.5.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.4.1...2.5.0\">2.5.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2019-12-31\">2019-12-31</time></span>\n</h3><ul>\n<li>The compiler now supports a new <code>ast</code> option, available via <code>--ast</code> on the command line or <code>ast</code> via the Node API. This option outputs an “abstract syntax tree,” or a JSON-like representation of the input CoffeeScript source code. This AST follows <a href=\"https://github.com/babel/babel/blob/master/packages/babel-parser/ast/spec.md\">Babel’s spec</a> as closely as possible, for compatibility with tools that work with JavaScript source code. Two tools that use this new AST output are <a href=\"https://github.com/helixbass/eslint-plugin-coffee\"><code>eslint-plugin-coffee</code></a>, a plugin to lint CoffeeScript via <a href=\"https://eslint.org/\">ESLint</a>; and <a href=\"https://github.com/helixbass/prettier-plugin-coffeescript\"><code>prettier-plugin-coffeescript</code></a>, a plugin to reformat CoffeeScript source code via <a href=\"https://prettier.io/\">Prettier</a>. <em>The structure and properties of CoffeeScript’s AST are not final and may undergo breaking changes between CoffeeScript versions; please <a href=\"https://github.com/jashkenas/coffeescript/issues\">open an issue</a> if you are interested in creating new integrations.</em></li>\n<li><a href=\"https://github.com/tc39/proposal-numeric-separator\">Numeric separators</a> are now supported in CoffeeScript, following the same syntax as JavaScript: <code>1_234_567</code>.</li>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt\"><code>BigInt</code> numbers</a> are now supported in CoffeeScript, following the same syntax as JavaScript: <code>42n</code>.</li>\n<li><code>'''</code> and <code>&quot;&quot;&quot;</code> strings are now output as more readable JavaScript template literals, or backtick (<code>`</code>) strings, with actual newlines rather than <code>\\n</code> escape sequences.</li>\n<li>Classes can now contain computed properties, e.g. <code>[someVar]: -&gt;</code> or <code>@[anotherVar]: -&gt;</code>.</li>\n<li>JSX tags can now contain XML-style namespaces, e.g. <code>&lt;image xlink:href=&quot;data:image/png&quot; /&gt;</code> or <code>&lt;Something:Tag&gt;&lt;/Something:Tag&gt;</code>.</li>\n<li>Bugfixes for comments after colons not appearing the output; reserved words mistakenly being disallowed as JSX attributes; indented leading elisions in multiline arrays; and invalid location data in source maps.</li>\n</ul>\n\n        </section>\n        <section id=\"2.4.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.4.0...2.4.1\">2.4.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2019-04-08\">2019-04-08</time></span>\n</h3><ul>\n<li>Both the <a href=\"/browser-compiler-legacy/coffeescript.js\">traditional ES5</a> and <a href=\"/browser-compiler-modern/coffeescript.js\">modern ES module</a> versions of the CoffeeScript browser compiler are now published to NPM, enabling the browser compilers’ use via services that provide NPM modules’ code available via public CDN. The traditional version is referenced via the <code>package.json</code> <code>&quot;browser&quot;</code> field, and the ES module version via the <code>&quot;module&quot;</code> field.</li>\n</ul>\n\n        </section>\n        <section id=\"2.4.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.3.2...2.4.0\">2.4.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2019-03-29\">2019-03-29</time></span>\n</h3><ul>\n<li>Dynamic <code>import()</code> expressions are now supported. The parentheses are always required, to distinguish from <code>import</code> statements. See <a href=\"#dynamic-import\">Modules</a>. Note that as of this writing, the JavaScript feature itself is still Stage 3; if it changes before being fully standardized, it may change in CoffeeScript too. Using <code>import()</code> before its upstream <a href=\"https://github.com/tc39/proposal-dynamic-import\">ECMAScript proposal</a> is finalized should be considered provisional, subject to breaking changes if the proposal changes or is rejected. We have also revised our <a href=\"#contributing\">policy</a> on Stage 3 ECMAScript features, to support them when the features are <a href=\"https://caniuse.com/#feat=es6-module-dynamic-import\">shipped</a> in significant runtimes such as major browsers or Node.js.</li>\n<li>There are now two browser versions of the CoffeeScript compiler: the traditional one that’s been published for years, and a new <a href=\"/browser-compiler-modern/coffeescript.js\">ES module version</a> that can be used via <code>import</code>. If your browser supports it, it is in effect on this page. A reference to the ES module browser compiler is in the <code>package.json</code> <code>&quot;module&quot;</code> field.</li>\n<li>The Node API now exposes the previously private <code>registerCompiled</code> method, to allow plugins that use the <code>coffeescript</code> package to take advantage of CoffeeScript’s internal caching.</li>\n<li>Bugfixes for commas in strings in block arrays, a reference to <code>@</code> not being maintained in a <code>do</code> block in a class, and function default parameters should no longer be wrapped by extraneous parentheses.</li>\n</ul>\n\n        </section>\n        <section id=\"2.3.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.3.1...2.3.2\">2.3.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2018-09-19\">2018-09-19</time></span>\n</h3><ul>\n<li>Babel 7 is now supported. With version 7, the Babel team moved from <code>babel-core</code> on NPM to <code>@babel/core</code>. Now the CoffeeScript <code>--transpile</code> option will first search for <code>@babel/core</code> (Babel versions 7 and above) and then search for <code>babel-core</code> (versions 6 and below) to try to find an installed version of Babel to use for transpilation.</li>\n<li>The syntax <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new.target\"><code>new.target</code></a> is now supported.</li>\n<li>You can now follow the keyword <code>yield</code> with an indented object, like has already been allowed for <code>return</code> and other keywords.</li>\n<li>Previously, any comments inside a JSX tag or attribute would cause interpolation braces (<code>{</code> and <code>}</code>) to be output. This is only necessary for line (<code>#</code>, or <code>//</code> in JavaScript) comments, not here (<code>###</code>, or <code>/* */</code>) comments; so now the compiler checks if all the comments that would trigger the braces are here comments, and if so it doesn’t generate the unnecessary interpolation braces.</li>\n</ul>\n\n        </section>\n        <section id=\"2.3.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.3.0...2.3.1\">2.3.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2018-05-21\">2018-05-21</time></span>\n</h3><ul>\n<li>Returning a JSX tag that is adjacent to another JSX tag, as opposed to returning a root JSX tag or fragment, is invalid JSX syntax. Babel throws an error on this, and now the CoffeeScript compiler does too.</li>\n<li>Invalid indentation inside a JSX interpolation (the middle of <code>&lt;tag&gt;{ ... }&lt;/tag&gt;</code>) now throws an error.</li>\n<li>The browser compiler, used in <a href=\"https://coffeescript.org/#try\">Try CoffeeScript</a> and similar web-based CoffeeScript editors, now evaluates code in a global scope rather than the scope of the browser compiler. This improves performance of code executed via the browser compiler.</li>\n<li>Syntax cleanup: it is now possible for an implicit function call to take a body-less class as an argument, and <code>?::</code> now behaves identically to <code>::</code> with regard to implying a line continuation.</li>\n</ul>\n\n        </section>\n        <section id=\"2.3.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.2.4...2.3.0\">2.3.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2018-04-29\">2018-04-29</time></span>\n</h3><ul>\n<li>This release adds support for all the new features and syntaxes in ES2018 that weren’t already possible in CoffeeScript. For all of the below features, make sure that you <a href=\"#transpilation\">transpile</a> unless you know that your target runtime(s) support each feature.</li>\n<li>Asynchronous iterators are now supported. You can now <code>yield</code> an <code>await</code> call, e.g. <code>do -&gt; until file.EOF then yield await file.readLine()</code>.</li>\n<li>Object splats/destructuring, a.k.a. object rest/spread syntax, has been standardized as part of ES2018 and therefore this release removes the polyfill that had previously been supporting this syntax. Code like <code>{a, b, rest...} = obj</code> now outputs more or less just like it appears, rather than being converted into an <code>Object.assign</code> call. Note that there are <a href=\"https://developers.google.com/web/updates/2017/06/object-rest-spread\">some subtle differences</a> between the <code>Object.assign</code> polyfill and the native implementation.</li>\n<li>The exponentiation operator, <code>**</code>, and exponentiation assignment operator <code>**=</code> are new to JavaScript in ES2018. Now code like <code>a ** 3</code> is output as it appears, rather than being converted into <code>Math.pow(a, 3)</code> as it was before.</li>\n<li>The <code>s</code> (dotAll) flag is now supported in regular expressions.</li>\n</ul>\n\n        </section>\n        <section id=\"2.2.4\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.2.3...2.2.4\">2.2.4</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2018-03-29\">2018-03-29</time></span>\n</h3><ul>\n<li>When the <code>by</code> value in a <code>for</code> loop is a literal number, e.g. <code>for x in [2..1] by -1</code>, fewer checks are necessary to determine if the loop is in range.</li>\n<li>Bugfix for regression in 2.2.0 where a statement inside parentheses, e.g. <code>(fn(); break) while condition</code>, was compiling. Pure statements like <code>break</code> or <code>return</code> cannot turn a parenthesized block into an expression, and should throw an error.</li>\n</ul>\n\n        </section>\n        <section id=\"2.2.3\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.2.2...2.2.3\">2.2.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2018-03-11\">2018-03-11</time></span>\n</h3><ul>\n<li>Bugfix for object destructuring with an empty array as a key’s value: <code>{ key: [] } = obj</code>.</li>\n<li>Bugfix for array destructuring onto targets attached to <code>this</code>: <code>[ @most... , @penultimate, @last ] = arr</code>.</li>\n</ul>\n\n        </section>\n        <section id=\"2.2.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.2.1...2.2.2\">2.2.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2018-02-21\">2018-02-21</time></span>\n</h3><ul>\n<li>Bugfix for regression in 2.2.0 where a range with a <code>by</code> (step) value that increments or decrements in the opposite direction as the range was returning an array containing the first value of the range, whereas it should be returning an empty array. In other words, <code>x for x in [2..1] by 1</code> should equal <code>[]</code>, not <code>[2]</code> (because the step value is positive 1, counting up, whereas the range goes from 2 to 1, counting down).</li>\n<li>Bugfixes for allowing backslashes in <code>import</code> and <code>export</code> statements and lines that trigger the start of an indented block, like an <code>if</code> statement.</li>\n</ul>\n\n        </section>\n        <section id=\"2.2.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.2.0...2.2.1\">2.2.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2018-02-06\">2018-02-06</time></span>\n</h3><ul>\n<li>Bugfix for regression in 2.2.0 involving an error thrown by the compiler in certain cases when using destructuring with a splat or expansion in an array.</li>\n<li>Bugfix for regression in 2.2.0 where in certain cases a range iterator variable was declared in the global scope.</li>\n</ul>\n\n        </section>\n        <section id=\"2.2.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.1.1...2.2.0\">2.2.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2018-02-01\">2018-02-01</time></span>\n</h3><ul>\n<li>This release fixes <em>all</em> currently open bugs, dating as far back as 2014, 2012 and 2011.</li>\n<li><strong>Potential breaking change:</strong> An inline <code>if</code> or <code>switch</code> statement with an ambiguous <code>else</code>, such as <code>if no then if yes then alert 1 else alert 2</code>, now compiles where the <code>else</code> always corresponds to the closest open <code>then</code>. Previously the behavior of an ambiguous <code>else</code> was unpredictable. If your code has any <code>if … then</code> or <code>switch … then</code> statements with multiple <code>then</code>s (and one or more <code>else</code>s) the compiled output might be different now, unless you had resolved ambiguity via parentheses. We made this change because the previous behavior was inconsistent and basically a bug: depending on what grammar was where, for example if there was an inline function or something that implied a block, the <code>else</code> might bind to an earlier <code>then</code> rather than a later <code>then</code>. Now an <code>else</code> essentially closes a block opened by a <code>then</code>, similar to closing an open parenthesis.</li>\n<li>When a required <code>then</code> is missing, the error more accurately points out the location of the mistake.</li>\n<li>An error is thrown when the <code>coffee</code> command is run in an environment that doesn’t support some ES2015 JavaScript features that the CoffeeScript compiler itself requires. This can happen if CoffeeScript is installed in Node older than version 6.</li>\n<li>Destructuring with a non-final splat/spread, e.g. <code>[open, contents..., close] = tag.split('')</code> is now output using ES2015 rest syntax.</li>\n<li>Functions named <code>get</code> or <code>set</code> can be used without parentheses in more cases, including when attached to <code>this</code> or <code>@</code> or <code>?.</code>; or when the first argument is an implicit object, e.g. <code>@set key: 'val'</code>.</li>\n<li>Statements such as <code>break</code> can now be used inside parentheses, e.g. <code>(doSomething(); break) while condition</code> or <code>(pick(key); break) for key of obj</code>.</li>\n<li>Bugfix for assigning to a property attached to <code>this</code>/<code>@</code> in destructuring, e.g. <code>({@prop = yes, @otherProp = no}) -&gt;</code>.</li>\n<li>Bugfix for incorrect errors being thrown about calling <code>super</code> with a parameter attached to <code>this</code> when said parameter is in a lower scope, e.g. <code>class Child extends Parent then constructor: -&gt; super(-&gt; @prop)</code>.</li>\n<li>Bugfix to prevent a possible infinite loop when a <code>for</code> loop is given a variable to step by, e.g. <code>for x in [1..3] by step</code> (as opposed to <code>by 0.5</code> or some other primitive numeric value).</li>\n<li>Bugfix to no longer declare iterator variables twice when evaluating a range, e.g. <code>end = 3; fn [0..end]</code>.</li>\n<li>Bugfix for incorrect scope of variables in chained calls, e.g. <code>start(x = 3).then(-&gt; x = 4)</code>.</li>\n<li>Bugfix for incorrect scope of variables in a function passed to <code>do</code>, e.g. <code>for [1..3] then masked = 10; do -&gt; alert masked</code>.</li>\n<li>Bugfix to no longer throw a syntax error for a trailing comma in a function call, e.g. <code>fn arg1, arg2,</code>.</li>\n<li>Bugfix for an expression in a property access, e.g. <code>a[!b in c..]</code>.</li>\n<li>Bugfix to allow a line continuation backslash (<code>\\</code>) at any point in a <code>for</code> line.</li>\n</ul>\n\n        </section>\n        <section id=\"2.1.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.1.0...2.1.1\">2.1.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-12-29\">2017-12-29</time></span>\n</h3><ul>\n<li>Bugfix to set the correct context for executable class bodies. So in <code>class @B extends @A then @property = 1</code>, the <code>@</code> in <code>@property</code> now refers to the class, not the global object.</li>\n<li>Bugfix where anonymous classes were getting created using the same automatic variable name. They now each receive unique names, so as not to override each other.</li>\n</ul>\n\n        </section>\n        <section id=\"2.1.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.0.3...2.1.0\">2.1.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-12-10\">2017-12-10</time></span>\n</h3><ul>\n<li>Computed property keys in object literals are now supported: <code>obj = { ['key' + i]: 42 }</code>, or <code>obj = [Symbol.iterator]: -&gt; yield i++</code>.</li>\n<li>Skipping of array elements, a.k.a. elision, is now supported: <code>arr = [a, , b]</code>, or <code>[, protocol] = url.match /^(.*):\\/\\//</code>.</li>\n<li><a href=\"https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html\">JSX fragments syntax</a> is now supported.</li>\n<li>Bugfix where <code>///</code> within a <code>#</code> line comment inside a <code>///</code> block regex was erroneously closing the regex, rather than being treated as part of the comment.</li>\n<li>Bugfix for incorrect output for object rest destructuring inside array destructuring.</li>\n</ul>\n\n        </section>\n        <section id=\"2.0.3\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.0.2...2.0.3\">2.0.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-11-26\">2017-11-26</time></span>\n</h3><ul>\n<li>Bugfix for <code>export default</code> followed by an implicit object that contains an explicit object, for example <code>exportedMember: { obj... }</code>.</li>\n<li>Bugfix for <code>key, val of obj</code> after an implicit object member, e.g. <code>foo: bar for key, val of obj</code>.</li>\n<li>Bugfix for combining array and object destructuring, e.g. <code>[ ..., {a, b} ] = arr</code>.</li>\n<li>Bugfix for an edge case where it was possible to create a bound (<code>=&gt;</code>) generator function, which should throw an error as such functions aren’t allowed in ES2015.</li>\n<li>Bugfix for source maps: <code>.map</code> files should always have the same base filename as the requested output filename. So <code>coffee --map --output foo.js test.coffee</code> should generate <code>foo.js</code> and <code>foo.js.map</code>.</li>\n<li>Bugfix for incorrect source maps generated when using <code>--transpile</code> with <code>--map</code> for multiple input files.</li>\n<li>Bugfix for comments at the beginning or end of input into the REPL (<code>coffee --interactive</code>).</li>\n</ul>\n\n        </section>\n        <section id=\"2.0.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.0.1...2.0.2\">2.0.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-10-26\">2017-10-26</time></span>\n</h3><ul>\n<li><code>--transpile</code> now also applies to <code>require</code>d or <code>import</code>ed CoffeeScript files.</li>\n<li><code>--transpile</code> can be used with the REPL: <code>coffee --interactive --transpile</code>.</li>\n<li>Improvements to comments output that should now cover all of the <a href=\"https://flow.org/en/docs/types/comments/\">Flow comment-based syntax</a>. Inline <code>###</code> comments near <a href=\"https://flow.org/en/docs/types/variables/\">variable</a> initial assignments are now output in the variable declaration statement, and <code>###</code> comments near a <a href=\"https://flow.org/en/docs/types/generics/\">class and method names</a> are now output where Flow expects them.</li>\n<li>Importing CoffeeScript keywords is now allowed, so long as they’re aliased: <code>import { and as andFn } from 'lib'</code>. (You could also do <code>import lib from 'lib'</code> and then reference <code>lib.and</code>.)</li>\n<li>Calls to functions named <code>get</code> and <code>set</code> no longer throw an error when given a bracketless object literal as an argument: <code>obj.set propertyName: propertyValue</code>.</li>\n<li>In the constructor of a derived class (a class that <code>extends</code> another class), you cannot call <code>super</code> with an argument that references <code>this</code>: <code>class Child extends Parent then constructor: (@arg) -&gt; super(@arg)</code>. This isn’t allowed in JavaScript, and now the CoffeeScript compiler will throw an error. Instead, assign to <code>this</code> after calling <code>super</code>: <code>(arg) -&gt; super(arg); @arg = arg</code>.</li>\n<li>Bugfix for incorrect output when backticked statements and hoisted expressions were both in the same class body. This allows a backticked line like <code>`field = 3`</code>, for people using the experimental <a href=\"https://github.com/tc39/proposal-class-fields\">class fields</a> syntax, in the same class along with traditional class body expressions like <code>prop: 3</code> that CoffeeScript outputs as part of the class prototype.</li>\n<li>Bugfix for comments not output before a complex <code>?</code> operation, e.g. <code>@a ? b</code>.</li>\n<li>All tests now pass in Windows.</li>\n</ul>\n\n        </section>\n        <section id=\"2.0.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.0.0...2.0.1\">2.0.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-09-26\">2017-09-26</time></span>\n</h3><ul>\n<li><code>babel-core</code> is no longer listed in <code>package.json</code>, even as an <code>optionalDependency</code>, to avoid it being automatically installed for most users. If you wish to use <code>--transpile</code>, simply install <code>babel-core</code> manually. See <a href=\"#transpilation\">Transpilation</a>.</li>\n<li><code>--transpile</code> now relies on Babel to find its options, i.e. the <code>.babelrc</code> file in the path of the file(s) being compiled. (Previously the CoffeeScript compiler was duplicating this logic, so nothing has changed from a user’s perspective.) This provides automatic support for additional ways to pass options to Babel in future versions, such as the <code>.babelrc.js</code> file coming in Babel 7.</li>\n<li>Backticked expressions in a class body, outside any class methods, are now output in the JavaScript class body itself. This allows for passing through experimental JavaScript syntax like the <a href=\"https://github.com/tc39/proposal-class-fields\">class fields proposal</a>, assuming your <a href=\"https://babeljs.io/docs/plugins/transform-class-properties/\">transpiler supports it</a>.</li>\n</ul>\n\n        </section>\n        <section id=\"2.0.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.0.0-beta5...2.0.0\">2.0.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-09-18\">2017-09-18</time></span>\n</h3><ul>\n<li>Added <code>--transpile</code> flag or <code>transpile</code> Node API option to tell the CoffeeScript compiler to pipe its output through Babel before saving or returning it; see <a href=\"#transpilation\">Transpilation</a>. Also changed the <code>-t</code> short flag to refer to <code>--transpile</code> instead of <code>--tokens</code>.</li>\n<li>Always populate source maps’ <code>sourcesContent</code> property.</li>\n<li>Bugfixes for destructuring and for comments in JSX.</li>\n<li><em>Note that these are only the changes between 2.0.0-beta5 and 2.0.0. See below for all changes since 1.x.</em></li>\n</ul>\n\n        </section>\n        <section id=\"2.0.0-beta5\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.0.0-beta4...2.0.0-beta5\">2.0.0-beta5</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-09-02\">2017-09-02</time></span>\n</h3><ul>\n<li>Node 6 is now supported, and we will try to maintain that as the minimum required version for CoffeeScript 2 via the <code>coffee</code> command or Node API. Older versions of Node, or non-evergreen browsers, can compile via the <a href=\"./browser-compiler-legacy/coffeescript.js\">legacy browser compiler</a>.</li>\n<li>The command line <code>--output</code> flag now allows you to specify an output filename, not just an output folder.</li>\n<li>The command line <code>--require</code> flag now properly handles filenames or module names that are invalid identifiers (like an NPM module with a hyphen in the name).</li>\n<li><code>Object.assign</code>, output when object destructuring is used, is polyfilled using the same polyfill that Babel outputs. This means that polyfills shouldn’t be required unless support for Internet Explorer 8 or below is desired (or your own code uses a feature that requires a polyfill). See <a href=\"#es2015plus-output\">ES2015+ Output</a>.</li>\n<li>A string or JSX interpolation that contains only a comment (<code>&quot;a#{### comment ###}b&quot;</code> or <code>&lt;div&gt;{### comment ###}&lt;/div&gt;</code>) is now output (<code>`a${/* comment */}b`</code>)</li>\n<li>Interpolated strings (ES2015 template literals) that contain quotation marks no longer have the quotation marks escaped: <code>`say &quot;${message}&quot;`</code></li>\n<li>It is now possible to chain after a function literal (for example, to define a function and then call <code>.call</code> on it).</li>\n<li>The results of the async tests are included in the output when you run <code>cake test</code>.</li>\n<li>Bugfixes for object destructuring; expansions in function parameters; generated reference variables in function parameters; chained functions after <code>do</code>; splats after existential operator soaks in arrays (<code>[a?.b...]</code>); trailing <code>if</code> with splat in arrays or function parameters (<code>[a if b...]</code>); attempting to <code>throw</code> an <code>if</code>, <code>for</code>, <code>switch</code>, <code>while</code> or other invalid construct.</li>\n<li>Bugfixes for syntactical edge cases: semicolons after <code>=</code> and other “mid-expression” tokens; spaces after <code>::</code>; and scripts that begin with <code>:</code> or <code>*</code>.</li>\n<li>Bugfixes for source maps generated via the Node API; and stack trace line numbers when compiling CoffeeScript via the Node API from within a <code>.coffee</code> file.</li>\n</ul>\n\n        </section>\n        <section id=\"2.0.0-beta4\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.0.0-beta3...2.0.0-beta4\">2.0.0-beta4</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-08-03\">2017-08-03</time></span>\n</h3><ul>\n<li>This release includes <a href=\"#1.12.7\">all the changes from 1.12.6 to 1.12.7</a>.</li>\n<li><a href=\"#comments\">Line comments</a> (starting with <code>#</code>) are now output in the generated JavaScript.</li>\n<li><a href=\"#comments\">Block comments</a> (delimited by <code>###</code>) are now allowed anywhere, including inline where they previously weren’t possible. This provides support for <a href=\"#type-annotations\">static type annotations</a> using Flow’s comments-based syntax.</li>\n<li>Spread syntax (<code>...</code> for objects) is now supported in JSX tags: <code>&lt;div {props...} /&gt;</code>.</li>\n<li>Argument parsing for scripts run via <code>coffee</code> is improved. See <a href=\"#breaking-changes-argument-parsing-and-shebang-lines\">breaking changes</a>.</li>\n<li>CLI: Propagate <code>SIGINT</code> and <code>SIGTERM</code> signals when node is forked.</li>\n<li><code>await</code> in the REPL is now allowed without requiring a wrapper function.</li>\n<li><code>do super</code> is now allowed, and other accesses of <code>super</code> like <code>super.x.y</code> or <code>super['x'].y</code> now work.</li>\n<li>Splat/spread syntax triple dots are now allowed on either the left or the right (so <code>props...</code> or <code>...props</code> are both valid).</li>\n<li>Tagged template literals are recognized as callable functions.</li>\n<li>Bugfixes for object spread syntax in nested properties.</li>\n<li>Bugfixes for destructured function parameter default values.</li>\n</ul>\n\n        </section>\n        <section id=\"2.0.0-beta3\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.0.0-beta2...2.0.0-beta3\">2.0.0-beta3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-06-30\">2017-06-30</time></span>\n</h3><ul>\n<li><a href=\"#jsx\">JSX</a> is now supported.</li>\n<li><a href=\"#object-spread\">Object rest/spread properties</a> are now supported.</li>\n<li>Bound (fat arrow) methods are once again supported in classes; though an error will be thrown if you attempt to call the method before it is bound. See <a href=\"#breaking-changes-classes\">breaking changes for classes</a>.</li>\n<li>The REPL no longer warns about assigning to <code>_</code>.</li>\n<li>Bugfixes for destructured nested default values and issues related to chaining or continuing expressions across multiple lines.</li>\n</ul>\n\n        </section>\n        <section id=\"2.0.0-beta2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.0.0-beta1...2.0.0-beta2\">2.0.0-beta2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-05-16\">2017-05-16</time></span>\n</h3><ul>\n<li>This release includes <a href=\"#1.12.6\">all the changes from 1.12.5 to 1.12.6</a>.</li>\n<li>Bound (fat arrow) methods in classes must be declared in the class constructor, after <code>super()</code> if the class is extending a parent class. See <a href=\"#breaking-changes-classes\">breaking changes for classes</a>.</li>\n<li>All unnecessary utility helper functions have been removed, including the polyfills for <code>indexOf</code> and <code>bind</code>.</li>\n<li>The <code>extends</code> keyword now only works in the context of classes; it cannot be used to extend a function prototype. See <a href=\"#breaking-changes-super-extends\">breaking changes for <code>extends</code></a>.</li>\n<li>Literate CoffeeScript is now parsed entirely based on indentation, similar to the 1.x implementation; there is no longer a dependency for parsing Markdown. See <a href=\"#breaking-changes-literate-coffeescript\">breaking changes for Literate CoffeeScript parsing</a>.</li>\n<li>JavaScript reserved words used as properties are no longer wrapped in quotes.</li>\n<li><code>require('coffeescript')</code> should now work in non-Node environments such as the builds created by Webpack or Browserify. This provides a more convenient way to include the browser compiler in builds intending to run in a browser environment.</li>\n<li>Unreachable <code>break</code> statements are no longer added after <code>switch</code> cases that <code>throw</code> exceptions.</li>\n<li>The browser compiler is now compiled using Babili and transpiled down to Babel’s <code>env</code> preset (should be safe for use in all browsers in current use, not just evergreen versions).</li>\n<li>Calling functions <code>@get</code> or <code>@set</code> no longer throws an error about required parentheses. (Bare <code>get</code> or <code>set</code>, not attached to an object or <code>@</code>, <a href=\"#unsupported-get-set\">still intentionally throws a compiler error</a>.)</li>\n<li>If <code>$XDG_CACHE_HOME</code> is set, the REPL <code>.coffee_history</code> file is saved there.</li>\n</ul>\n\n        </section>\n        <section id=\"2.0.0-beta1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/2.0.0-alpha1...2.0.0-beta1\">2.0.0-beta1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-04-14\">2017-04-14</time></span>\n</h3><ul>\n<li>Initial beta release of CoffeeScript 2. No further breaking changes are anticipated.</li>\n<li>Destructured objects and arrays now output using ES2015+ syntax whenever possible.</li>\n<li>Literate CoffeeScript now has much better support for parsing Markdown, thanks to using <a href=\"https://github.com/markdown-it/markdown-it\">Markdown-It</a> to detect Markdown sections rather than just looking at indentation.</li>\n<li>Calling a function named <code>get</code> or <code>set</code> now requires parentheses, to disambiguate from the <code>get</code> or <code>set</code> keywords (which are <a href=\"#unsupported-get-set\">disallowed</a>).</li>\n<li>The compiler now requires Node 7.6+, the first version of Node to support asynchronous functions without requiring a flag.</li>\n</ul>\n\n        </section>\n        <section id=\"2.0.0-alpha1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.4...2.0.0-alpha1\">2.0.0-alpha1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-02-21\">2017-02-21</time></span>\n</h3><ul>\n<li>Initial alpha release of CoffeeScript 2. The CoffeeScript compiler now outputs ES2015+ syntax whenever possible. See <a href=\"#breaking-changes\">breaking changes</a>.</li>\n<li>Classes are output using ES2015 <code>class</code> and <code>extends</code> keywords.</li>\n<li>Added support for <code>async</code>/<code>await</code>.</li>\n<li>Bound (arrow) functions now output as <code>=&gt;</code> functions.</li>\n<li>Function parameters with default values now use ES2015 default values syntax.</li>\n<li>Splat function parameters now use ES2015 spread syntax.</li>\n<li>Computed properties now use ES2015 syntax.</li>\n<li>Interpolated strings (template literals) now use ES2015 backtick syntax.</li>\n<li>Improved support for recognizing Markdown in Literate CoffeeScript files.</li>\n<li>Mixing tabs and spaces in indentation is now disallowed.</li>\n<li>Browser compiler is now minified using the Google Closure Compiler (JavaScript version).</li>\n<li>Node 7+ required for CoffeeScript 2.</li>\n</ul>\n\n        </section>\n        <section id=\"1.12.7\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.6...1.12.7\">1.12.7</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-07-16\">2017-07-16</time></span>\n</h3><ul>\n<li>Fix regressions in 1.12.6 related to chained function calls and indented <code>return</code> and <code>throw</code> arguments.</li>\n<li>The REPL no longer warns about assigning to <code>_</code>.</li>\n</ul>\n\n        </section>\n        <section id=\"1.12.6\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.5...1.12.6\">1.12.6</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-05-15\">2017-05-15</time></span>\n</h3><ul>\n<li>The <code>return</code> and <code>export</code> keywords can now accept implicit objects (defined by indentation, without needing braces).</li>\n<li>Support Unicode code point escapes (e.g. <code>\\u{1F4A9}</code>).</li>\n<li>The <code>coffee</code> command now first looks to see if CoffeeScript is installed under <code>node_modules</code> in the current folder, and executes the <code>coffee</code> binary there if so; or otherwise it runs the globally installed one. This allows you to have one version of CoffeeScript installed globally and a different one installed locally for a particular project. (Likewise for the <code>cake</code> command.)</li>\n<li>Bugfixes for chained function calls not closing implicit objects or ternaries.</li>\n<li>Bugfixes for incorrect code generated by the <code>?</code> operator within a termary <code>if</code> statement.</li>\n<li>Fixed some tests, and failing tests now result in a nonzero exit code.</li>\n</ul>\n\n        </section>\n        <section id=\"1.12.5\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.4...1.12.5\">1.12.5</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-04-10\">2017-04-10</time></span>\n</h3><ul>\n<li>Better handling of <code>default</code>, <code>from</code>, <code>as</code> and <code>*</code> within <code>import</code> and <code>export</code> statements. You can now import or export a member named <code>default</code> and the compiler won’t interpret it as the <code>default</code> keyword.</li>\n<li>Fixed a bug where invalid octal escape sequences weren’t throwing errors in the compiler.</li>\n</ul>\n\n        </section>\n        <section id=\"1.12.4\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.3...1.12.4\">1.12.4</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-02-18\">2017-02-18</time></span>\n</h3><ul>\n<li>The <code>cake</code> commands have been updated, with new <code>watch</code> options for most tasks. Clone the <a href=\"https://github.com/jashkenas/coffeescript\">CoffeeScript repo</a> and run <code>cake</code> at the root of the repo to see the options.</li>\n<li>Fixed a bug where <code>export</code>ing a referenced variable was preventing the variable from being declared.</li>\n<li>Fixed a bug where the <code>coffee</code> command wasn’t working for a <code>.litcoffee</code> file.</li>\n<li>Bugfixes related to tokens and location data, for better source maps and improved compatibility with downstream tools.</li>\n</ul>\n\n        </section>\n        <section id=\"1.12.3\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.2...1.12.3\">1.12.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2017-01-24\">2017-01-24</time></span>\n</h3><ul>\n<li><code>@</code> values can now be used as indices in <code>for</code> expressions. This loosens the compilation of <code>for</code> expressions to allow the index variable to be an <code>@</code> value, e.g. <code>do @visit for @node, @index in nodes</code>. Within <code>@visit</code>, the index of the current node (<code>@node</code>) would be available as <code>@index</code>.</li>\n<li>CoffeeScript’s patched <code>Error.prepareStackTrace</code> has been restored, with some revisions that should prevent the erroneous exceptions that were making life difficult for some downstream projects. This fixes the incorrect line numbers in stack traces since 1.12.2.</li>\n<li>The <code>//=</code> operator’s output now wraps parentheses around the right operand, like the other assignment operators.</li>\n</ul>\n\n        </section>\n        <section id=\"1.12.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.1...1.12.2\">1.12.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2016-12-16\">2016-12-16</time></span>\n</h3><ul>\n<li>The browser compiler can once again be built unminified via <code>MINIFY=false cake build:browser</code>.</li>\n<li>The error-prone patched version of <code>Error.prepareStackTrace</code> has been removed.</li>\n<li>Command completion in the REPL (pressing tab to get suggestions) has been fixed for Node 6.9.1+.</li>\n<li>The <a href=\"/v2/test.html\">browser-based tests</a> now include all the tests as the Node-based version.</li>\n</ul>\n\n        </section>\n        <section id=\"1.12.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.12.0...1.12.1\">1.12.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2016-12-07\">2016-12-07</time></span>\n</h3><ul>\n<li>You can now import a module member named <code>default</code>, e.g. <code>import { default } from 'lib'</code>. Though like in ES2015, you cannot import an entire module and name it <code>default</code> (so <code>import default from 'lib'</code> is not allowed).</li>\n<li>Fix regression where <code>from</code> as a variable name was breaking <code>for</code> loop declarations. For the record, <code>from</code> is not a reserved word in CoffeeScript; you may use it for variable names. <code>from</code> behaves like a keyword within the context of <code>import</code> and <code>export</code> statements, and in the declaration of a <code>for</code> loop; though you should also be able to use variables named <code>from</code> in those contexts, and the compiler should be able to tell the difference.</li>\n</ul>\n\n        </section>\n        <section id=\"1.12.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.11.1...1.12.0\">1.12.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2016-12-04\">2016-12-04</time></span>\n</h3><ul>\n<li>CoffeeScript now supports ES2015 <a href=\"#tagged-template-literals\">tagged template literals</a>. Note that using tagged template literals in your code makes you responsible for ensuring that either your runtime supports tagged template literals or that you transpile the output JavaScript further to a version your target runtime(s) support.</li>\n<li>CoffeeScript now provides a <a href=\"#generator-iteration\"><code>for…from</code></a> syntax for outputting ES2015 <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of\"><code>for…of</code></a>. (Sorry they couldn’t match, but we came up with <code>for…of</code> first for something else.) This allows iterating over generators or any other iterable object. Note that using <code>for…from</code> in your code makes you responsible for ensuring that either your runtime supports <code>for…of</code> or that you transpile the output JavaScript further to a version your target runtime(s) support.</li>\n<li>Triple backticks (<code> ```​</code>) allow the creation of embedded JavaScript blocks where escaping single backticks is not required, which should improve interoperability with ES2015 template literals and with Markdown.</li>\n<li>Within single-backtick embedded JavaScript, backticks can now be escaped via <code> \\`​</code>.</li>\n<li>The browser tests now run in the browser again, and are accessible <a href=\"/v2/test.html\">here</a> if you would like to test your browser.</li>\n<li>CoffeeScript-only keywords in ES2015 <code>import</code>s and <code>export</code>s are now ignored.</li>\n<li>The compiler now throws an error on trying to export an anonymous class.</li>\n<li>Bugfixes related to tokens and location data, for better source maps and improved compatibility with downstream tools.</li>\n</ul>\n\n        </section>\n        <section id=\"1.11.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.11.0...1.11.1\">1.11.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2016-10-02\">2016-10-02</time></span>\n</h3><ul>\n<li>Bugfix for shorthand object syntax after interpolated keys.</li>\n<li>Bugfix for indentation-stripping in <code>&quot;&quot;&quot;</code> strings.</li>\n<li>Bugfix for not being able to use the name “arguments” for a prototype property of class.</li>\n<li>Correctly compile large hexadecimal numbers literals to <code>2e308</code> (just like all other large number literals do).</li>\n</ul>\n\n        </section>\n        <section id=\"1.11.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.10.0...1.11.0\">1.11.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2016-09-24\">2016-09-24</time></span>\n</h3><ul>\n<li>CoffeeScript now supports ES2015 <a href=\"#modules\"><code>import</code> and <code>export</code> syntax</a>.</li>\n<li>Added the <code>-M, --inline-map</code> flag to the compiler, allowing you embed the source map directly into the output JavaScript, rather than as a separate file.</li>\n<li>A bunch of fixes for <code>yield</code>:\n<ul>\n<li><code>yield return</code> can no longer mistakenly be used as an expression.</li>\n<li><code>yield</code> now mirrors <code>return</code> in that it can be used stand-alone as well as with expressions. Where you previously wrote <code>yield undefined</code>, you may now write simply <code>yield</code>. However, this means also inheriting the same syntax limitations that <code>return</code> has, so these examples no longer compile:<blockquote class=\"uneditable-code-block\"><pre><code>doubles = -&gt;\n  yield for i in [1..3]\n    i * 2\nsix = -&gt;\n  yield\n    2 * 3\n</code></pre>\n</blockquote></li>\n<li>The JavaScript output is a bit nicer, with unnecessary parentheses and spaces, double indentation and double semicolons around <code>yield</code> no longer present.</li>\n</ul>\n</li>\n<li><code>&amp;&amp;=</code>, <code>||=</code>, <code>and=</code> and <code>or=</code> no longer accidentally allow a space before the equals sign.</li>\n<li>Improved several error messages.</li>\n<li>Just like <code>undefined</code> compiles to <code>void 0</code>, <code>NaN</code> now compiles into <code>0/0</code> and <code>Infinity</code> into <code>2e308</code>.</li>\n<li>Bugfix for renamed destructured parameters with defaults. <code>({a: b = 1}) -&gt;</code> no longer crashes the compiler.</li>\n<li>Improved the internal representation of a CoffeeScript program. This is only noticeable to tools that use <code>CoffeeScript.tokens</code> or <code>CoffeeScript.nodes</code>. Such tools need to update to take account for changed or added tokens and nodes.</li>\n<li>Several minor bug fixes, including:\n<ul>\n<li>The caught error in <code>catch</code> blocks is no longer declared unnecessarily, and no longer mistakenly named <code>undefined</code> for <code>catch</code>-less <code>try</code> blocks.</li>\n<li>Unassignable parameter destructuring no longer crashes the compiler.</li>\n<li>Source maps are now used correctly for errors thrown from .coffee.md files.</li>\n<li><code>coffee -e 'throw null'</code> no longer crashes.</li>\n<li>The REPL no longer crashes when using <code>.exit</code> to exit it.</li>\n<li>Invalid JavaScript is no longer output when lots of <code>for</code> loops are used in the same scope.</li>\n<li>A unicode issue when using stdin with the CLI.</li>\n</ul>\n</li>\n</ul>\n\n        </section>\n        <section id=\"1.10.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.9.3...1.10.0\">1.10.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2015-09-03\">2015-09-03</time></span>\n</h3><ul>\n<li>CoffeeScript now supports ES2015-style destructuring defaults.</li>\n<li><code>(offsetHeight: height) -&gt;</code> no longer compiles. That syntax was accidental and partly broken. Use <code>({offsetHeight: height}) -&gt;</code> instead. Object destructuring always requires braces.</li>\n<li>Several minor bug fixes, including:\n<ul>\n<li>A bug where the REPL would sometimes report valid code as invalid, based on what you had typed earlier.</li>\n<li>A problem with multiple JS contexts in the jest test framework.</li>\n<li>An error in io.js where strict mode is set on internal modules.</li>\n<li>A variable name clash for the caught error in <code>catch</code> blocks.</li>\n</ul>\n</li>\n</ul>\n\n        </section>\n        <section id=\"1.9.3\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.9.2...1.9.3\">1.9.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2015-05-27\">2015-05-27</time></span>\n</h3><ul>\n<li>Bugfix for interpolation in the first key of an object literal in an implicit call.</li>\n<li>Fixed broken error messages in the REPL, as well as a few minor bugs with the REPL.</li>\n<li>Fixed source mappings for tokens at the beginning of lines when compiling with the <code>--bare</code> option. This has the nice side effect of generating smaller source maps.</li>\n<li>Slight formatting improvement of compiled block comments.</li>\n<li>Better error messages for <code>on</code>, <code>off</code>, <code>yes</code> and <code>no</code>.</li>\n</ul>\n\n        </section>\n        <section id=\"1.9.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.9.1...1.9.2\">1.9.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2015-04-15\">2015-04-15</time></span>\n</h3><ul>\n<li>Fixed a <strong>watch</strong> mode error introduced in 1.9.1 when compiling multiple files with the same filename.</li>\n<li>Bugfix for <code>yield</code> around expressions containing <code>this</code>.</li>\n<li>Added a Ruby-style <code>-r</code> option to the REPL, which allows requiring a module before execution with <code>--eval</code> or <code>--interactive</code>.</li>\n<li>In <code>&lt;script type=&quot;text/coffeescript&quot;&gt;</code> tags, to avoid possible duplicate browser requests for .coffee files, you can now use the <code>data-src</code> attribute instead of <code>src</code>.</li>\n<li>Minor bug fixes for IE8, strict ES5 regular expressions and Browserify.</li>\n</ul>\n\n        </section>\n        <section id=\"1.9.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.9.0...1.9.1\">1.9.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2015-02-18\">2015-02-18</time></span>\n</h3><ul>\n<li>Interpolation now works in object literal keys (again). You can use this to dynamically name properties.</li>\n<li>Internal compiler variable names no longer start with underscores. This makes the generated JavaScript a bit prettier, and also fixes an issue with the completely broken and ungodly way that AngularJS “parses” function arguments.</li>\n<li>Fixed a few <code>yield</code>-related edge cases with <code>yield return</code> and <code>yield throw</code>.</li>\n<li>Minor bug fixes and various improvements to compiler error messages.</li>\n</ul>\n\n        </section>\n        <section id=\"1.9.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.8.0...1.9.0\">1.9.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2015-01-29\">2015-01-29</time></span>\n</h3><ul>\n<li>CoffeeScript now supports ES2015 generators. A generator is simply a function that <code>yield</code>s.</li>\n<li>More robust parsing and improved error messages for strings and regexes — especially with respect to interpolation.</li>\n<li>Changed strategy for the generation of internal compiler variable names. Note that this means that <code>@example</code> function parameters are no longer available as naked <code>example</code> variables within the function body.</li>\n<li>Fixed REPL compatibility with latest versions of Node and Io.js.</li>\n<li>Various minor bug fixes.</li>\n</ul>\n\n        </section>\n        <section id=\"1.8.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.7.1...1.8.0\">1.8.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2014-08-26\">2014-08-26</time></span>\n</h3><ul>\n<li>The <code>--join</code> option of the CLI is now deprecated.</li>\n<li>Source maps now use <code>.js.map</code> as file extension, instead of just <code>.map</code>.</li>\n<li>The CLI now exits with the exit code 1 when it fails to write a file to disk.</li>\n<li>The compiler no longer crashes on unterminated, single-quoted strings.</li>\n<li>Fixed location data for string interpolations, which made source maps out of sync.</li>\n<li>The error marker in error messages is now correctly positioned if the code is indented with tabs.</li>\n<li>Fixed a slight formatting error in CoffeeScript’s source map-patched stack traces.</li>\n<li>The <code>%%</code> operator now coerces its right operand only once.</li>\n<li>It is now possible to require CoffeeScript files from Cakefiles without having to register the compiler first.</li>\n<li>The CoffeeScript REPL is now exported and can be required using <code>require 'coffeescript/repl'</code>.</li>\n<li>Fixes for the REPL in Node 0.11.</li>\n</ul>\n\n        </section>\n        <section id=\"1.7.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.7.0...1.7.1\">1.7.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2014-01-29\">2014-01-29</time></span>\n</h3><ul>\n<li>Fixed a typo that broke node module lookup when running a script directly with the <code>coffee</code> binary.</li>\n</ul>\n\n        </section>\n        <section id=\"1.7.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.6.3...1.7.0\">1.7.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2014-01-28\">2014-01-28</time></span>\n</h3><ul>\n<li>When requiring CoffeeScript files in Node you must now explicitly register the compiler. This can be done with <code>require 'coffeescript/register'</code> or <code>CoffeeScript.register()</code>. Also for configuration such as Mocha’s, use <strong>coffeescript/register</strong>.</li>\n<li>Improved error messages, source maps and stack traces. Source maps now use the updated <code>//#</code> syntax.</li>\n<li>Leading <code>.</code> now closes all open calls, allowing for simpler chaining syntax.</li>\n<li>Added <code>**</code>, <code>//</code> and <code>%%</code> operators and <code>...</code> expansion in parameter lists and destructuring expressions.</li>\n<li>Multiline strings are now joined by a single space and ignore all indentation. A backslash at the end of a line can denote the amount of whitespace between lines, in both strings and heredocs. Backslashes correctly escape whitespace in block regexes.</li>\n<li>Closing brackets can now be indented and therefore no longer cause unexpected error.</li>\n<li>Several breaking compilation fixes. Non-callable literals (strings, numbers etc.) don’t compile in a call now and multiple postfix conditionals compile properly. Postfix conditionals and loops always bind object literals. Conditional assignment compiles properly in subexpressions. <code>super</code> is disallowed outside of methods and works correctly inside <code>for</code> loops.</li>\n<li>Formatting of compiled block comments has been improved.</li>\n<li>No more <code>-p</code> folders on Windows.</li>\n<li>The <code>options</code> object passed to CoffeeScript is no longer mutated.</li>\n</ul>\n\n        </section>\n        <section id=\"1.6.3\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.6.2...1.6.3\">1.6.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2013-06-02\">2013-06-02</time></span>\n</h3><ul>\n<li>The CoffeeScript REPL now remembers your history between sessions. Just like a proper REPL should.</li>\n<li>You can now use <code>require</code> in Node to load <code>.coffee.md</code> Literate CoffeeScript files. In the browser, <code>text/literate-coffeescript</code> script tags.</li>\n<li>The old <code>coffee --lint</code> command has been removed. It was useful while originally working on the compiler, but has been surpassed by JSHint. You may now use <code>-l</code> to pass literate files in over <strong>stdio</strong>.</li>\n<li>Bugfixes for Windows path separators, <code>catch</code> without naming the error, and executable-class-bodies-with- prototypal-property-attachment.</li>\n</ul>\n\n        </section>\n        <section id=\"1.6.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.6.1...1.6.2\">1.6.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2013-03-18\">2013-03-18</time></span>\n</h3><ul>\n<li>Source maps have been used to provide automatic line-mapping when running CoffeeScript directly via the <code>coffee</code> command, and for automatic line-mapping when running CoffeeScript directly in the browser. Also, to provide better error messages for semantic errors thrown by the compiler — <a href=\"http://cl.ly/NdOA\">with colors, even</a>.</li>\n<li>Improved support for mixed literate/vanilla-style CoffeeScript projects, and generating source maps for both at the same time.</li>\n<li>Fixes for <strong>1.6.x</strong> regressions with overriding inherited bound functions, and for Windows file path management.</li>\n<li>The <code>coffee</code> command can now correctly <code>fork()</code> both <code>.coffee</code> and <code>.js</code> files. (Requires Node.js 0.9+)</li>\n</ul>\n\n        </section>\n        <section id=\"1.6.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.5.0...1.6.1\">1.6.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2013-03-05\">2013-03-05</time></span>\n</h3><ul>\n<li>First release of <a href=\"#source-maps\">source maps</a>. Pass the <code>--map</code> flag to the compiler, and off you go. Direct all your thanks over to <a href=\"https://github.com/jwalton\">Jason Walton</a>.</li>\n<li>Fixed a 1.5.0 regression with multiple implicit calls against an indented implicit object. Combinations of implicit function calls and implicit objects should generally be parsed better now — but it still isn’t good <em>style</em> to nest them too heavily.</li>\n<li><code>.coffee.md</code> is now also supported as a Literate CoffeeScript file extension, for existing tooling. <code>.litcoffee</code> remains the canonical one.</li>\n<li>Several minor fixes surrounding member properties, bound methods and <code>super</code> in class declarations.</li>\n</ul>\n\n        </section>\n        <section id=\"1.5.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.4.0...1.5.0\">1.5.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2013-02-25\">2013-02-25</time></span>\n</h3><ul>\n<li>First release of <a href=\"#literate\">Literate CoffeeScript</a>.</li>\n<li>The CoffeeScript REPL is now based on the Node.js REPL, and should work better and more familiarly.</li>\n<li>Returning explicit values from constructors is now forbidden. If you want to return an arbitrary value, use a function, not a constructor.</li>\n<li>You can now loop over an array backwards, without having to manually deal with the indexes: <code>for item in list by -1</code></li>\n<li>Source locations are now preserved in the CoffeeScript AST, although source maps are not yet being emitted.</li>\n</ul>\n\n        </section>\n        <section id=\"1.4.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.3.3...1.4.0\">1.4.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2012-10-23\">2012-10-23</time></span>\n</h3><ul>\n<li>The CoffeeScript compiler now strips Microsoft’s UTF-8 BOM if it exists, allowing you to compile BOM-borked source files.</li>\n<li>Fix Node/compiler deprecation warnings by removing <code>registerExtension</code>, and moving from <code>path.exists</code> to <code>fs.exists</code>.</li>\n<li>Small tweaks to splat compilation, backticks, slicing, and the error for duplicate keys in object literals.</li>\n</ul>\n\n        </section>\n        <section id=\"1.3.3\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.3.1...1.3.3\">1.3.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2012-05-15\">2012-05-15</time></span>\n</h3><ul>\n<li>Due to the new semantics of JavaScript’s strict mode, CoffeeScript no longer guarantees that constructor functions have names in all runtimes. See <a href=\"https://github.com/jashkenas/coffeescript/issues/2052\">#2052</a> for discussion.</li>\n<li>Inside of a nested function inside of an instance method, it’s now possible to call <code>super</code> more reliably (walks recursively up).</li>\n<li>Named loop variables no longer have different scoping heuristics than other local variables. (Reverts #643)</li>\n<li>Fix for splats nested within the LHS of destructuring assignment.</li>\n<li>Corrections to our compile time strict mode forbidding of octal literals.</li>\n</ul>\n\n        </section>\n        <section id=\"1.3.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.2.0...1.3.1\">1.3.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2012-04-10\">2012-04-10</time></span>\n</h3><ul>\n<li>CoffeeScript now enforces all of JavaScript’s <strong>Strict Mode</strong> early syntax errors at compile time. This includes old-style octal literals, duplicate property names in object literals, duplicate parameters in a function definition, deleting naked variables, setting the value of <code>eval</code> or <code>arguments</code>, and more. See a full discussion at <a href=\"https://github.com/jashkenas/coffeescript/issues/1547\">#1547</a>.</li>\n<li>The REPL now has a handy new multi-line mode for entering large blocks of code. It’s useful when copy-and-pasting examples into the REPL. Enter multi-line mode with <code>Ctrl-V</code>. You may also now pipe input directly into the REPL.</li>\n<li>CoffeeScript now prints a <code>Generated by CoffeeScript VERSION</code> header at the top of each compiled file.</li>\n<li>Conditional assignment of previously undefined variables <code>a or= b</code> is now considered a syntax error.</li>\n<li>A tweak to the semantics of <code>do</code>, which can now be used to more easily simulate a namespace: <code>do (x = 1, y = 2) -&gt; …</code></li>\n<li>Loop indices are now mutable within a loop iteration, and immutable between them.</li>\n<li>Both endpoints of a slice are now allowed to be omitted for consistency, effectively creating a shallow copy of the list.</li>\n<li>Additional tweaks and improvements to <code>coffee --watch</code> under Node’s “new” file watching API. Watch will now beep by default if you introduce a syntax error into a watched script. We also now ignore hidden directories by default when watching recursively.</li>\n</ul>\n\n        </section>\n        <section id=\"1.2.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.1.3...1.2.0\">1.2.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2011-12-18\">2011-12-18</time></span>\n</h3><ul>\n<li>Multiple improvements to <code>coffee --watch</code> and <code>--join</code>. You may now use both together, as well as add and remove files and directories within a <code>--watch</code>’d folder.</li>\n<li>The <code>throw</code> statement can now be used as part of an expression.</li>\n<li>Block comments at the top of the file will now appear outside of the safety closure wrapper.</li>\n<li>Fixed a number of minor 1.1.3 regressions having to do with trailing operators and unfinished lines, and a more major 1.1.3 regression that caused bound functions <em>within</em> bound class functions to have the incorrect <code>this</code>.</li>\n</ul>\n\n        </section>\n        <section id=\"1.1.3\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.1.2...1.1.3\">1.1.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2011-11-08\">2011-11-08</time></span>\n</h3><ul>\n<li>Ahh, whitespace. CoffeeScript’s compiled JS now tries to space things out and keep it readable, as you can see in the examples on this page.</li>\n<li>You can now call <code>super</code> in class level methods in class bodies, and bound class methods now preserve their correct context.</li>\n<li>JavaScript has always supported octal numbers <code>010 is 8</code>, and hexadecimal numbers <code>0xf is 15</code>, but CoffeeScript now also supports binary numbers: <code>0b10 is 2</code>.</li>\n<li>The CoffeeScript module has been nested under a subdirectory to make it easier to <code>require</code> individual components separately, without having to use <strong>npm</strong>. For example, after adding the CoffeeScript folder to your path: <code>require('coffeescript/lexer')</code></li>\n<li>There’s a new “link” feature in Try CoffeeScript on this webpage. Use it to get a shareable permalink for your example script.</li>\n<li>The <code>coffee --watch</code> feature now only works on Node.js 0.6.0 and higher, but now also works properly on Windows.</li>\n<li>Lots of small bug fixes from <strong><a href=\"https://github.com/michaelficarra\">@michaelficarra</a></strong>, <strong><a href=\"https://github.com/geraldalewis\">@geraldalewis</a></strong>, <strong><a href=\"https://github.com/satyr\">@satyr</a></strong>, and <strong><a href=\"https://github.com/trevorburnham\">@trevorburnham</a></strong>.</li>\n</ul>\n\n        </section>\n        <section id=\"1.1.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.1.1...1.1.2\">1.1.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2011-08-04\">2011-08-04</time></span>\n</h3><p>Fixes for block comment formatting, <code>?=</code> compilation, implicit calls against control structures, implicit invocation of a try/catch block, variadic arguments leaking from local scope, line numbers in syntax errors following heregexes, property access on parenthesized number literals, bound class methods and super with reserved names, a REPL overhaul, consecutive compiled semicolons, block comments in implicitly called objects, and a Chrome bug.</p>\n\n        </section>\n        <section id=\"1.1.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.1.0...1.1.1\">1.1.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2011-05-10\">2011-05-10</time></span>\n</h3><p>Bugfix release for classes with external constructor functions, see issue #1182.</p>\n\n        </section>\n        <section id=\"1.1.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.0.1...1.1.0\">1.1.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2011-05-01\">2011-05-01</time></span>\n</h3><p>When running via the <code>coffee</code> executable, <code>process.argv</code> and friends now report <code>coffee</code> instead of <code>node</code>. Better compatibility with <strong>Node.js 0.4.x</strong> module lookup changes. The output in the REPL is now colorized, like Node’s is. Giving your concatenated CoffeeScripts a name when using <code>--join</code> is now mandatory. Fix for lexing compound division <code>/=</code> as a regex accidentally. All <code>text/coffeescript</code> tags should now execute in the order they’re included. Fixed an issue with extended subclasses using external constructor functions. Fixed an edge-case infinite loop in <code>addImplicitParentheses</code>. Fixed exponential slowdown with long chains of function calls. Globals no longer leak into the CoffeeScript REPL. Splatted parameters are declared local to the function.</p>\n\n        </section>\n        <section id=\"1.0.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/1.0.0...1.0.1\">1.0.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2011-01-31\">2011-01-31</time></span>\n</h3><p>Fixed a lexer bug with Unicode identifiers. Updated REPL for compatibility with Node.js 0.3.7. Fixed requiring relative paths in the REPL. Trailing <code>return</code> and <code>return undefined</code> are now optimized away. Stopped requiring the core Node.js <code>util</code> module for back-compatibility with Node.js 0.2.5. Fixed a case where a conditional <code>return</code> would cause fallthrough in a <code>switch</code> statement. Optimized empty objects in destructuring assignment.</p>\n\n        </section>\n        <section id=\"1.0.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.6...1.0.0\">1.0.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-12-24\">2010-12-24</time></span>\n</h3><p>CoffeeScript loops no longer try to preserve block scope when functions are being generated within the loop body. Instead, you can use the <code>do</code> keyword to create a convenient closure wrapper. Added a <code>--nodejs</code> flag for passing through options directly to the <code>node</code> executable. Better behavior around the use of pure statements within expressions. Fixed inclusive slicing through <code>-1</code>, for all browsers, and splicing with arbitrary expressions as endpoints.</p>\n\n        </section>\n        <section id=\"0.9.6\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.5...0.9.6\">0.9.6</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-12-06\">2010-12-06</time></span>\n</h3><p>The REPL now properly formats stacktraces, and stays alive through asynchronous exceptions. Using <code>--watch</code> now prints timestamps as files are compiled. Fixed some accidentally-leaking variables within plucked closure-loops. Constructors now maintain their declaration location within a class body. Dynamic object keys were removed. Nested classes are now supported. Fixes execution context for naked splatted functions. Bugfix for inversion of chained comparisons. Chained class instantiation now works properly with splats.</p>\n\n        </section>\n        <section id=\"0.9.5\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.4...0.9.5\">0.9.5</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-11-21\">2010-11-21</time></span>\n</h3><p>0.9.5 should be considered the first release candidate for CoffeeScript 1.0. There have been a large number of internal changes since the previous release, many contributed from <strong>satyr</strong>’s <a href=\"https://github.com/satyr/coco\">Coco</a> dialect of CoffeeScript. Heregexes (extended regexes) were added. Functions can now have default arguments. Class bodies are now executable code. Improved syntax errors for invalid CoffeeScript. <code>undefined</code> now works like <code>null</code>, and cannot be assigned a new value. There was a precedence change with respect to single-line comprehensions: <code>result = i for i in list</code>\nused to parse as <code>result = (i for i in list)</code> by default … it now parses as\n<code>(result = i) for i in list</code>.</p>\n\n        </section>\n        <section id=\"0.9.4\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.3...0.9.4\">0.9.4</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-09-21\">2010-09-21</time></span>\n</h3><p>CoffeeScript now uses appropriately-named temporary variables, and recycles their references after use. Added <code>require.extensions</code> support for <strong>Node.js 0.3</strong>. Loading CoffeeScript in the browser now adds just a single <code>CoffeeScript</code> object to global scope. Fixes for implicit object and block comment edge cases.</p>\n\n        </section>\n        <section id=\"0.9.3\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.2...0.9.3\">0.9.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-09-16\">2010-09-16</time></span>\n</h3><p>CoffeeScript <code>switch</code> statements now compile into JS <code>switch</code> statements — they previously compiled into <code>if/else</code> chains for JavaScript 1.3 compatibility. Soaking a function invocation is now supported. Users of the RubyMine editor should now be able to use <code>--watch</code> mode.</p>\n\n        </section>\n        <section id=\"0.9.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.1...0.9.2\">0.9.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-08-23\">2010-08-23</time></span>\n</h3><p>Specifying the start and end of a range literal is now optional, eg. <code>array[3..]</code>. You can now say <code>a not instanceof b</code>. Fixed important bugs with nested significant and non-significant indentation (Issue #637). Added a <code>--require</code> flag that allows you to hook into the <code>coffee</code> command. Added a custom <code>jsl.conf</code> file for our preferred JavaScriptLint setup. Sped up Jison grammar compilation time by flattening rules for operations. Block comments can now be used with JavaScript-minifier-friendly syntax. Added JavaScript’s compound assignment bitwise operators. Bugfixes to implicit object literals with leading number and string keys, as the subject of implicit calls, and as part of compound assignment.</p>\n\n        </section>\n        <section id=\"0.9.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.9.0...0.9.1\">0.9.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-08-11\">2010-08-11</time></span>\n</h3><p>Bugfix release for <strong>0.9.1</strong>. Greatly improves the handling of mixed implicit objects, implicit function calls, and implicit indentation. String and regex interpolation is now strictly <code>#{ … }</code> (Ruby style). The compiler now takes a <code>--require</code> flag, which specifies scripts to run before compilation.</p>\n\n        </section>\n        <section id=\"0.9.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.7.2...0.9.0\">0.9.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-08-04\">2010-08-04</time></span>\n</h3><p>The CoffeeScript <strong>0.9</strong> series is considered to be a release candidate for <strong>1.0</strong>; let’s give her a shakedown cruise. <strong>0.9.0</strong> introduces a massive backwards-incompatible change: Assignment now uses <code>=</code>, and object literals use <code>:</code>, as in JavaScript. This allows us to have implicit object literals, and YAML-style object definitions. Half assignments are removed, in favor of <code>+=</code>, <code>or=</code>, and friends. Interpolation now uses a hash mark <code>#</code> instead of the dollar sign <code>$</code> — because dollar signs may be part of a valid JS identifier. Downwards range comprehensions are now safe again, and are optimized to straight for loops when created with integer endpoints. A fast, unguarded form of object comprehension was added: <code>for all key, value of object</code>. Mentioning the <code>super</code> keyword with no arguments now forwards all arguments passed to the function, as in Ruby. If you extend class <code>B</code> from parent class <code>A</code>, if <code>A</code> has an <code>extended</code> method defined, it will be called, passing in <code>B</code> — this enables static inheritance, among other things. Cleaner output for functions bound with the fat arrow. <code>@variables</code> can now be used in parameter lists, with the parameter being automatically set as a property on the object — useful in constructors and setter functions. Constructor functions can now take splats.</p>\n\n        </section>\n        <section id=\"0.7.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.7.1...0.7.2\">0.7.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-07-12\">2010-07-12</time></span>\n</h3><p>Quick bugfix (right after 0.7.1) for a problem that prevented <code>coffee</code> command-line options from being parsed in some circumstances.</p>\n\n        </section>\n        <section id=\"0.7.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.7.0...0.7.1\">0.7.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-07-11\">2010-07-11</time></span>\n</h3><p>Block-style comments are now passed through and printed as JavaScript block comments – making them useful for licenses and copyright headers. Better support for running coffee scripts standalone via hashbangs. Improved syntax errors for tokens that are not in the grammar.</p>\n\n        </section>\n        <section id=\"0.7.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.6.2...0.7.0\">0.7.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-06-28\">2010-06-28</time></span>\n</h3><p>Official CoffeeScript variable style is now camelCase, as in JavaScript. Reserved words are now allowed as object keys, and will be quoted for you. Range comprehensions now generate cleaner code, but you have to specify <code>by -1</code> if you’d like to iterate downward. Reporting of syntax errors is greatly improved from the previous release. Running <code>coffee</code> with no arguments now launches the REPL, with Readline support. The <code>&lt;-</code> bind operator has been removed from CoffeeScript. The <code>loop</code> keyword was added, which is equivalent to a <code>while true</code> loop. Comprehensions that contain closures will now close over their variables, like the semantics of a <code>forEach</code>. You can now use bound function in class definitions (bound to the instance). For consistency, <code>a in b</code> is now an array presence check, and <code>a of b</code> is an object-key check. Comments are no longer passed through to the generated JavaScript.</p>\n\n        </section>\n        <section id=\"0.6.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.6.1...0.6.2\">0.6.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-05-15\">2010-05-15</time></span>\n</h3><p>The <code>coffee</code> command will now preserve directory structure when compiling a directory full of scripts. Fixed two omissions that were preventing the CoffeeScript compiler from running live within Internet Explorer. There’s now a syntax for block comments, similar in spirit to CoffeeScript’s heredocs. ECMA Harmony DRY-style pattern matching is now supported, where the name of the property is the same as the name of the value: <code>{name, length}: func</code>. Pattern matching is now allowed within comprehension variables. <code>unless</code> is now allowed in block form. <code>until</code> loops were added, as the inverse of <code>while</code> loops. <code>switch</code> statements are now allowed without switch object clauses. Compatible with Node.js <strong>v0.1.95</strong>.</p>\n\n        </section>\n        <section id=\"0.6.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.6.0...0.6.1\">0.6.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-04-12\">2010-04-12</time></span>\n</h3><p>Upgraded CoffeeScript for compatibility with the new Node.js <strong>v0.1.90</strong> series.</p>\n\n        </section>\n        <section id=\"0.6.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.6...0.6.0\">0.6.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-04-03\">2010-04-03</time></span>\n</h3><p>Trailing commas are now allowed, a-la Python. Static properties may be assigned directly within class definitions, using <code>@property</code> notation.</p>\n\n        </section>\n        <section id=\"0.5.6\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.5...0.5.6\">0.5.6</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-03-23\">2010-03-23</time></span>\n</h3><p>Interpolation can now be used within regular expressions and heredocs, as well as strings. Added the <code>&lt;-</code> bind operator. Allowing assignment to half-expressions instead of special <code>||=</code>-style operators. The arguments object is no longer automatically converted into an array. After requiring <code>coffeescript</code>, Node.js can now directly load <code>.coffee</code> files, thanks to <strong>registerExtension</strong>. Multiple splats can now be used in function calls, arrays, and pattern matching.</p>\n\n        </section>\n        <section id=\"0.5.5\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.4...0.5.5\">0.5.5</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-03-08\">2010-03-08</time></span>\n</h3><p>String interpolation, contributed by <a href=\"https://github.com/StanAngeloff\">Stan Angeloff</a>. Since <code>--run</code> has been the default since <strong>0.5.3</strong>, updating <code>--stdio</code> and <code>--eval</code> to run by default, pass <code>--compile</code> as well if you’d like to print the result.</p>\n\n        </section>\n        <section id=\"0.5.4\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.3...0.5.4\">0.5.4</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-03-03\">2010-03-03</time></span>\n</h3><p>Bugfix that corrects the Node.js global constants <code>__filename</code> and <code>__dirname</code>. Tweaks for more flexible parsing of nested function literals and improperly-indented comments. Updates for the latest Node.js API.</p>\n\n        </section>\n        <section id=\"0.5.3\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.2...0.5.3\">0.5.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-02-27\">2010-02-27</time></span>\n</h3><p>CoffeeScript now has a syntax for defining classes. Many of the core components (Nodes, Lexer, Rewriter, Scope, Optparse) are using them. Cakefiles can use <code>optparse.coffee</code> to define options for tasks. <code>--run</code> is now the default flag for the <code>coffee</code> command, use <code>--compile</code> to save JavaScripts. Bugfix for an ambiguity between RegExp literals and chained divisions.</p>\n\n        </section>\n        <section id=\"0.5.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.1...0.5.2\">0.5.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-02-25\">2010-02-25</time></span>\n</h3><p>Added a compressed version of the compiler for inclusion in web pages as\n<code>/v2/browser-compiler-legacy/coffeescript.js</code>. It’ll automatically run any script tags with type <code>text/coffeescript</code> for you. Added a <code>--stdio</code> option to the <code>coffee</code> command, for piped-in compiles.</p>\n\n        </section>\n        <section id=\"0.5.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.5.0...0.5.1\">0.5.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-02-24\">2010-02-24</time></span>\n</h3><p>Improvements to null soaking with the existential operator, including soaks on indexed properties. Added conditions to <code>while</code> loops, so you can use them as filters with <code>when</code>, in the same manner as comprehensions.</p>\n\n        </section>\n        <section id=\"0.5.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.3.2...0.5.0\">0.5.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-02-21\">2010-02-21</time></span>\n</h3><p>CoffeeScript 0.5.0 is a major release, While there are no language changes, the Ruby compiler has been removed in favor of a self-hosting compiler written in pure CoffeeScript.</p>\n\n        </section>\n        <section id=\"0.3.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.3.0...0.3.2\">0.3.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-02-08\">2010-02-08</time></span>\n</h3><p><code>@property</code> is now a shorthand for <code>this.property</code>.\nSwitched the default JavaScript engine from Narwhal to Node.js. Pass the <code>--narwhal</code> flag if you’d like to continue using it.</p>\n\n        </section>\n        <section id=\"0.3.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.6...0.3.0\">0.3.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-26\">2010-01-26</time></span>\n</h3><p>CoffeeScript 0.3 includes major syntax changes:\nThe function symbol was changed to <code>-&gt;</code>, and the bound function symbol is now <code>=&gt;</code>.\nParameter lists in function definitions must now be wrapped in parentheses.\nAdded property soaking, with the <code>?.</code> operator.\nMade parentheses optional, when invoking functions with arguments.\nRemoved the obsolete block literal syntax.</p>\n\n        </section>\n        <section id=\"0.2.6\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.5...0.2.6\">0.2.6</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-17\">2010-01-17</time></span>\n</h3><p>Added Python-style chained comparisons, the conditional existence operator <code>?=</code>, and some examples from <em>Beautiful Code</em>. Bugfixes relating to statement-to-expression conversion, arguments-to-array conversion, and the TextMate syntax highlighter.</p>\n\n        </section>\n        <section id=\"0.2.5\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.4...0.2.5\">0.2.5</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-13\">2010-01-13</time></span>\n</h3><p>The conditions in switch statements can now take multiple values at once — If any of them are true, the case will run. Added the long arrow <code>==&gt;</code>, which defines and immediately binds a function to <code>this</code>. While loops can now be used as expressions, in the same way that comprehensions can. Splats can be used within pattern matches to soak up the rest of an array.</p>\n\n        </section>\n        <section id=\"0.2.4\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.3...0.2.4\">0.2.4</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-12\">2010-01-12</time></span>\n</h3><p>Added ECMAScript Harmony style destructuring assignment, for dealing with extracting values from nested arrays and objects. Added indentation-sensitive heredocs for nicely formatted strings or chunks of code.</p>\n\n        </section>\n        <section id=\"0.2.3\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.2...0.2.3\">0.2.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-11\">2010-01-11</time></span>\n</h3><p>Axed the unsatisfactory <code>ino</code> keyword, replacing it with <code>of</code> for object comprehensions. They now look like: <code>for prop, value of object</code>.</p>\n\n        </section>\n        <section id=\"0.2.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.1...0.2.2\">0.2.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-10\">2010-01-10</time></span>\n</h3><p>When performing a comprehension over an object, use <code>ino</code>, instead of <code>in</code>, which helps us generate smaller, more efficient code at compile time.\nAdded <code>::</code> as a shorthand for saying <code>.prototype.</code>\nThe “splat” symbol has been changed from a prefix asterisk <code>*</code>, to a postfix ellipsis <code>...</code>\nAdded JavaScript’s <code>in</code> operator, empty <code>return</code> statements, and empty <code>while</code> loops.\nConstructor functions that start with capital letters now include a safety check to make sure that the new instance of the object is returned.\nThe <code>extends</code> keyword now functions identically to <code>goog.inherits</code> in Google’s Closure Library.</p>\n\n        </section>\n        <section id=\"0.2.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.2.0...0.2.1\">0.2.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-05\">2010-01-05</time></span>\n</h3><p>Arguments objects are now converted into real arrays when referenced.</p>\n\n        </section>\n        <section id=\"0.2.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.6...0.2.0\">0.2.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2010-01-05\">2010-01-05</time></span>\n</h3><p>Major release. Significant whitespace. Better statement-to-expression conversion. Splats. Splice literals. Object comprehensions. Blocks. The existential operator. Many thanks to all the folks who posted issues, with special thanks to <a href=\"https://github.com/liamoc\">Liam O’Connor-Davis</a> for whitespace and expression help.</p>\n\n        </section>\n        <section id=\"0.1.6\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.5...0.1.6\">0.1.6</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-27\">2009-12-27</time></span>\n</h3><p>Bugfix for running <code>coffee --interactive</code> and <code>--run</code> from outside of the CoffeeScript directory. Bugfix for nested function/if-statements.</p>\n\n        </section>\n        <section id=\"0.1.5\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.4...0.1.5\">0.1.5</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-26\">2009-12-26</time></span>\n</h3><p>Array slice literals and array comprehensions can now both take Ruby-style ranges to specify the start and end. JavaScript variable declaration is now pushed up to the top of the scope, making all assignment statements into expressions. You can use <code>\\</code> to escape newlines. The <code>coffeescript</code> command is now called <code>coffee</code>.</p>\n\n        </section>\n        <section id=\"0.1.4\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.3...0.1.4\">0.1.4</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-25\">2009-12-25</time></span>\n</h3><p>The official CoffeeScript extension is now <code>.coffee</code> instead of <code>.cs</code>, which properly belongs to <a href=\"https://en.wikipedia.org/wiki/C_Sharp_(programming_language)\">C#</a>. Due to popular demand, you can now also use <code>=</code> to assign. Unlike JavaScript, <code>=</code> can also be used within object literals, interchangeably with <code>:</code>. Made a grammatical fix for chained function calls like <code>func(1)(2)(3)(4)</code>. Inheritance and super no longer use <code>__proto__</code>, so they should be IE-compatible now.</p>\n\n        </section>\n        <section id=\"0.1.3\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.2...0.1.3\">0.1.3</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-25\">2009-12-25</time></span>\n</h3><p>The <code>coffee</code> command now includes <code>--interactive</code>, which launches an interactive CoffeeScript session, and <code>--run</code>, which directly compiles and executes a script. Both options depend on a working installation of Narwhal. The <code>aint</code> keyword has been replaced by <code>isnt</code>, which goes together a little smoother with <code>is</code>. Quoted strings are now allowed as identifiers within object literals: eg. <code>{&quot;5+5&quot;: 10}</code>. All assignment operators now use a colon: <code>+:</code>, <code>-:</code>, <code>*:</code>, etc.</p>\n\n        </section>\n        <section id=\"0.1.2\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.1...0.1.2\">0.1.2</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-24\">2009-12-24</time></span>\n</h3><p>Fixed a bug with calling <code>super()</code> through more than one level of inheritance, with the re-addition of the <code>extends</code> keyword. Added experimental <a href=\"http://narwhaljs.org/\">Narwhal</a> support (as a Tusk package), contributed by <a href=\"http://blog.tlrobinson.net/\">Tom Robinson</a>, including <strong>bin/cs</strong> as a CoffeeScript REPL and interpreter. New <code>--no-wrap</code> option to suppress the safety function wrapper.</p>\n\n        </section>\n        <section id=\"0.1.1\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/0.1.0...0.1.1\">0.1.1</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-24\">2009-12-24</time></span>\n</h3><p>Added <code>instanceof</code> and <code>typeof</code> as operators.</p>\n\n        </section>\n        <section id=\"0.1.0\">\n          <h3><a href=\"https://github.com/jashkenas/coffeescript/compare/8e9d637985d2dc9b44922076ad54ffef7fa8e9c2...0.1.0\">0.1.0</a>\n  <span class=\"timestamp\"> &mdash; <time datetime=\"2009-12-24\">2009-12-24</time></span>\n</h3><p>Initial CoffeeScript release.</p>\n\n        </section>\n      </section>\n    </main>\n  </div>\n</div>\n\n\n<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\" integrity=\"sha384-tsQFqpEReu7ZLhBV2VZlAu7zcOV+rXbYlF2cqB8txI/8aZajjp4Bqd+V6D5IgvKT\" crossorigin=\"anonymous\"></script>\n<script src=\"https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js\" integrity=\"sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm\" crossorigin=\"anonymous\"></script>\n<script src=\"https://cdn.jsdelivr.net/combine/npm/codemirror@5.37.0/lib/codemirror.js,npm/codemirror@5.37.0/mode/coffeescript/coffeescript.js,npm/codemirror@5.37.0/addon/lint/coffeescript-lint.js,npm/codemirror@5.37.0/mode/javascript/javascript.js\"></script>\n\n<script nomodule src=\"./browser-compiler-legacy/coffeescript.js\"></script>\n<script nomodule>\n(function(){window.location.origin||(window.location.origin=\"\".concat(window.location.protocol,\"//\").concat(window.location.hostname)),window.GA_TRACKING_ID=\"UA-106156830-1\",null==window.dataLayer&&(window.dataLayer=[]),window.gtag=function(){window.dataLayer.push(arguments)},window.gtag(\"js\",new Date),window.gtag(\"config\",window.GA_TRACKING_ID),$(document).ready(function(){var clearHash,closeTry,editors,initializeEditor,initializeScrollspyFromHash,initializeTryEditors,lastCompilationElapsedTime,previousHash,replaceState,textareas,toggleSidebar,toggleTry,_Mathround=Math.round;if(CoffeeScript.patchStackTrace(),$(\"time\").each(function(index,el){var date,formattedDate;return date=el.dateTime||$(el).text(),formattedDate=new Date(date).toLocaleDateString(void 0,{year:\"numeric\",month:\"long\",day:\"numeric\"}),$(el).text(formattedDate.toString())}),toggleSidebar=function(){return $(\".navbar-toggler, .sidebar\").toggleClass(\"show\")},$(\"[data-toggle=\\\"offcanvas\\\"]\").click(toggleSidebar),$(\"[data-action=\\\"sidebar-nav\\\"]\").click(function(event){return $(\".navbar-toggler\").is(\":visible\")&&(event.preventDefault(),toggleSidebar(),setTimeout(function(){return window.location=event.target.href},260)),gtag(\"event\",\"sidebar_navigate\",{event_category:\"navigation\",event_label:event.target.href.replace(window.location.origin,\"\")})}),$(\".main\").scrollspy({target:\"#contents\",offset:_Mathround($(\"main\").css(\"padding-top\").replace(\"px\",\"\"))}),initializeScrollspyFromHash=function(hash){return $(\"#contents a.active[href!='\".concat(hash,\"']\")).removeClass(\"show\")},$(\".main\").on(\"activate.bs.scrollspy\",function(event,target){var $target;if($(\"#contents a.active[href!='\".concat(target.relatedTarget,\"']\")).removeClass(\"show\"),$target=$(\"#contents a[href='\".concat(target.relatedTarget,\"']\")),$target.prop(\"href\")!==\"\".concat(window.location.origin,\"/#try\"))return replaceState($target.prop(\"href\")),gtag(\"config\",GA_TRACKING_ID,{page_path:$target.prop(\"href\").replace(window.location.origin,\"\")})}),textareas=[],editors=[],lastCompilationElapsedTime=200,$(\"textarea\").each(function(index){return textareas[index]=this,$(this).data(\"index\",index)}),initializeEditor=function($textarea){var editor,index,mode,pending;if(index=$textarea.data(\"index\"),mode=$textarea.hasClass(\"javascript-output\")?\"javascript\":\"coffeescript\",editors[index]=editor=CodeMirror.fromTextArea($textarea[0],{mode:mode,theme:\"twilight\",indentUnit:2,tabSize:2,lineWrapping:!0,lineNumbers:!1,inputStyle:\"contenteditable\",readOnly:\"coffeescript\"!==mode,viewportMargin:2e308}),\"coffeescript\"===mode)return pending=null,editor.on(\"change\",function(){return clearTimeout(pending),pending=setTimeout(function(){var coffee,exception,js,lastCompilationStartTime,link,output,_Mathmax=Math.max;lastCompilationStartTime=Date.now();try{if(coffee=editor.getValue(),0===index&&$(\"#try\").hasClass(\"show\")){$(\"#try\").hasClass(\"show\")&&(link=\"try:\".concat(encodeURIComponent(coffee)),replaceState(\"\".concat(window.location.href.split(\"#\")[0],\"#\").concat(link)));try{null!=window.localStorage&&window.localStorage.setItem(\"tryCoffeeScriptCode\",coffee)}catch(error){exception=error}}js=CoffeeScript.compile(coffee,{bare:!0,inlineMap:!0}),output=js.replace(/(\\n\\/\\/# [^\\n]*){2}$/,\"\"),lastCompilationElapsedTime=_Mathmax(200,Date.now()-lastCompilationStartTime)}catch(error){exception=error,output=\"\".concat(exception)}return editors[index+1].js=js,editors[index+1].setValue(output),gtag(\"event\",\"edit_code\",{event_category:\"engagement\",event_label:$textarea.closest(\"[data-example]\").data(\"example\")})},lastCompilationElapsedTime)}),editor.addKeyMap({Tab:function Tab(cm){return cm.somethingSelected()?cm.indentSelection(\"add\"):/^\\t/m.test(cm.getValue())?cm.execCommand(\"insertTab\"):cm.execCommand(\"insertSoftTab\")},\"Shift-Tab\":function ShiftTab(cm){return cm.indentSelection(\"subtract\")},Enter:function Enter(cm){return cm.options.indentWithTabs=/^\\t/m.test(cm.getValue()),cm.execCommand(\"newlineAndIndent\")}})},$(\".placeholder-code\").one(\"mouseover\",function(){var $siblingColumn,$textarea;return $textarea=$(this).prev(\"textarea\"),$(this).remove(),initializeEditor($textarea),$siblingColumn=$($textarea.parent().siblings()[0]),$siblingColumn.children(\".placeholder-code\").remove(),initializeEditor($($siblingColumn.children(\"textarea\")[0]))}),initializeTryEditors=function(){return initializeEditor($(\"#try-coffeescript-coffee\")),initializeEditor($(\"#try-coffeescript-js\"))},$(\"[data-action=\\\"run-code-example\\\"]\").click(function(){var index,js,ref,run;return run=$(this).data(\"run\"),index=$(\"#\".concat($(this).data(\"example\"),\"-js\")).data(\"index\"),js=(null==(ref=editors[index])?void 0:ref.js)?editors[index].js:$(textareas[index]).val(),!0!==run&&(js=\"\".concat(js,\"\\nalert(\").concat(unescape(run),\");\")),window.eval(js),gtag(\"event\",\"run_code\",{event_category:\"engagement\",event_label:$(this).closest(\"[data-example]\").data(\"example\")})}),previousHash=null,toggleTry=function(checkLocalStorage){var coffee,exception;if($(\"#try, #try-link\").toggleClass(\"show\"),!$(\"#try\").hasClass(\"show\"))return previousHash?replaceState(previousHash):clearHash();if(window.location.hash&&(previousHash=window.location.hash),0===$(\"#try .CodeMirror\").length&&initializeTryEditors(),checkLocalStorage&&null!=window.localStorage)try{return coffee=window.localStorage.getItem(\"tryCoffeeScriptCode\"),null==coffee?replaceState(\"#try\"):editors[0].setValue(coffee)}catch(error){return exception=error,replaceState(\"#try\")}else return replaceState(\"#try\")},closeTry=function(){return $(\"#try, #try-link\").removeClass(\"show\"),previousHash?replaceState(previousHash):clearHash()},$(\"[data-toggle=\\\"try\\\"]\").click(function(event){return event.preventDefault(),toggleTry(!0)}),$(\"[data-close=\\\"try\\\"]\").click(closeTry),$(\"[data-action=\\\"scroll-to-top\\\"]\").click(function(){if(!$(\"#try\").hasClass(\"show\"))return $(\".main\")[0].scrollTop=0,setTimeout(clearHash,10)}),clearHash=function(){return window.history.replaceState({},document.title,window.location.pathname)},replaceState=function(newURL){return 0===(null==newURL?void 0:newURL.indexOf(\"#\"))&&(newURL=\"\".concat(window.location.pathname).concat(newURL)),window.history.replaceState({},document.title,newURL||\"\")},$(window).on(\"hashchange\",function(){if(\"\"===window.location.hash)return clearHash()}),null!=window.location.hash){if(\"#try\"===window.location.hash)return toggleTry(!0);if(0===window.location.hash.indexOf(\"#try\"))return 0===$(\"#try .CodeMirror\").length&&initializeTryEditors(),editors[0].setValue(decodeURIComponent(window.location.hash.slice(5))),toggleTry(!1);if(\"\"===window.location.hash)return clearHash();if(initializeScrollspyFromHash(window.location.hash),1<window.location.hash.length)return document.getElementById(window.location.hash.slice(1).replace(/try:.*/,\"\")).scrollIntoView()}})}).call(this);\n</script>\n<script type=\"module\">\nimport CoffeeScript from './browser-compiler-modern/coffeescript.js';\n(function(){window.location.origin||(window.location.origin=\"\".concat(window.location.protocol,\"//\").concat(window.location.hostname)),window.GA_TRACKING_ID=\"UA-106156830-1\",null==window.dataLayer&&(window.dataLayer=[]),window.gtag=function(){window.dataLayer.push(arguments)},window.gtag(\"js\",new Date),window.gtag(\"config\",window.GA_TRACKING_ID),$(document).ready(function(){var clearHash,closeTry,editors,initializeEditor,initializeScrollspyFromHash,initializeTryEditors,lastCompilationElapsedTime,previousHash,replaceState,textareas,toggleSidebar,toggleTry,_Mathround=Math.round;if(CoffeeScript.patchStackTrace(),$(\"time\").each(function(index,el){var date,formattedDate;return date=el.dateTime||$(el).text(),formattedDate=new Date(date).toLocaleDateString(void 0,{year:\"numeric\",month:\"long\",day:\"numeric\"}),$(el).text(formattedDate.toString())}),toggleSidebar=function(){return $(\".navbar-toggler, .sidebar\").toggleClass(\"show\")},$(\"[data-toggle=\\\"offcanvas\\\"]\").click(toggleSidebar),$(\"[data-action=\\\"sidebar-nav\\\"]\").click(function(event){return $(\".navbar-toggler\").is(\":visible\")&&(event.preventDefault(),toggleSidebar(),setTimeout(function(){return window.location=event.target.href},260)),gtag(\"event\",\"sidebar_navigate\",{event_category:\"navigation\",event_label:event.target.href.replace(window.location.origin,\"\")})}),$(\".main\").scrollspy({target:\"#contents\",offset:_Mathround($(\"main\").css(\"padding-top\").replace(\"px\",\"\"))}),initializeScrollspyFromHash=function(hash){return $(\"#contents a.active[href!='\".concat(hash,\"']\")).removeClass(\"show\")},$(\".main\").on(\"activate.bs.scrollspy\",function(event,target){var $target;if($(\"#contents a.active[href!='\".concat(target.relatedTarget,\"']\")).removeClass(\"show\"),$target=$(\"#contents a[href='\".concat(target.relatedTarget,\"']\")),$target.prop(\"href\")!==\"\".concat(window.location.origin,\"/#try\"))return replaceState($target.prop(\"href\")),gtag(\"config\",GA_TRACKING_ID,{page_path:$target.prop(\"href\").replace(window.location.origin,\"\")})}),textareas=[],editors=[],lastCompilationElapsedTime=200,$(\"textarea\").each(function(index){return textareas[index]=this,$(this).data(\"index\",index)}),initializeEditor=function($textarea){var editor,index,mode,pending;if(index=$textarea.data(\"index\"),mode=$textarea.hasClass(\"javascript-output\")?\"javascript\":\"coffeescript\",editors[index]=editor=CodeMirror.fromTextArea($textarea[0],{mode:mode,theme:\"twilight\",indentUnit:2,tabSize:2,lineWrapping:!0,lineNumbers:!1,inputStyle:\"contenteditable\",readOnly:\"coffeescript\"!==mode,viewportMargin:2e308}),\"coffeescript\"===mode)return pending=null,editor.on(\"change\",function(){return clearTimeout(pending),pending=setTimeout(function(){var coffee,exception,js,lastCompilationStartTime,link,output,_Mathmax=Math.max;lastCompilationStartTime=Date.now();try{if(coffee=editor.getValue(),0===index&&$(\"#try\").hasClass(\"show\")){$(\"#try\").hasClass(\"show\")&&(link=\"try:\".concat(encodeURIComponent(coffee)),replaceState(\"\".concat(window.location.href.split(\"#\")[0],\"#\").concat(link)));try{null!=window.localStorage&&window.localStorage.setItem(\"tryCoffeeScriptCode\",coffee)}catch(error){exception=error}}js=CoffeeScript.compile(coffee,{bare:!0,inlineMap:!0}),output=js.replace(/(\\n\\/\\/# [^\\n]*){2}$/,\"\"),lastCompilationElapsedTime=_Mathmax(200,Date.now()-lastCompilationStartTime)}catch(error){exception=error,output=\"\".concat(exception)}return editors[index+1].js=js,editors[index+1].setValue(output),gtag(\"event\",\"edit_code\",{event_category:\"engagement\",event_label:$textarea.closest(\"[data-example]\").data(\"example\")})},lastCompilationElapsedTime)}),editor.addKeyMap({Tab:function Tab(cm){return cm.somethingSelected()?cm.indentSelection(\"add\"):/^\\t/m.test(cm.getValue())?cm.execCommand(\"insertTab\"):cm.execCommand(\"insertSoftTab\")},\"Shift-Tab\":function ShiftTab(cm){return cm.indentSelection(\"subtract\")},Enter:function Enter(cm){return cm.options.indentWithTabs=/^\\t/m.test(cm.getValue()),cm.execCommand(\"newlineAndIndent\")}})},$(\".placeholder-code\").one(\"mouseover\",function(){var $siblingColumn,$textarea;return $textarea=$(this).prev(\"textarea\"),$(this).remove(),initializeEditor($textarea),$siblingColumn=$($textarea.parent().siblings()[0]),$siblingColumn.children(\".placeholder-code\").remove(),initializeEditor($($siblingColumn.children(\"textarea\")[0]))}),initializeTryEditors=function(){return initializeEditor($(\"#try-coffeescript-coffee\")),initializeEditor($(\"#try-coffeescript-js\"))},$(\"[data-action=\\\"run-code-example\\\"]\").click(function(){var index,js,ref,run;return run=$(this).data(\"run\"),index=$(\"#\".concat($(this).data(\"example\"),\"-js\")).data(\"index\"),js=(null==(ref=editors[index])?void 0:ref.js)?editors[index].js:$(textareas[index]).val(),!0!==run&&(js=\"\".concat(js,\"\\nalert(\").concat(unescape(run),\");\")),window.eval(js),gtag(\"event\",\"run_code\",{event_category:\"engagement\",event_label:$(this).closest(\"[data-example]\").data(\"example\")})}),previousHash=null,toggleTry=function(checkLocalStorage){var coffee,exception;if($(\"#try, #try-link\").toggleClass(\"show\"),!$(\"#try\").hasClass(\"show\"))return previousHash?replaceState(previousHash):clearHash();if(window.location.hash&&(previousHash=window.location.hash),0===$(\"#try .CodeMirror\").length&&initializeTryEditors(),checkLocalStorage&&null!=window.localStorage)try{return coffee=window.localStorage.getItem(\"tryCoffeeScriptCode\"),null==coffee?replaceState(\"#try\"):editors[0].setValue(coffee)}catch(error){return exception=error,replaceState(\"#try\")}else return replaceState(\"#try\")},closeTry=function(){return $(\"#try, #try-link\").removeClass(\"show\"),previousHash?replaceState(previousHash):clearHash()},$(\"[data-toggle=\\\"try\\\"]\").click(function(event){return event.preventDefault(),toggleTry(!0)}),$(\"[data-close=\\\"try\\\"]\").click(closeTry),$(\"[data-action=\\\"scroll-to-top\\\"]\").click(function(){if(!$(\"#try\").hasClass(\"show\"))return $(\".main\")[0].scrollTop=0,setTimeout(clearHash,10)}),clearHash=function(){return window.history.replaceState({},document.title,window.location.pathname)},replaceState=function(newURL){return 0===(null==newURL?void 0:newURL.indexOf(\"#\"))&&(newURL=\"\".concat(window.location.pathname).concat(newURL)),window.history.replaceState({},document.title,newURL||\"\")},$(window).on(\"hashchange\",function(){if(\"\"===window.location.hash)return clearHash()}),null!=window.location.hash){if(\"#try\"===window.location.hash)return toggleTry(!0);if(0===window.location.hash.indexOf(\"#try\"))return 0===$(\"#try .CodeMirror\").length&&initializeTryEditors(),editors[0].setValue(decodeURIComponent(window.location.hash.slice(5))),toggleTry(!1);if(\"\"===window.location.hash)return clearHash();if(initializeScrollspyFromHash(window.location.hash),1<window.location.hash.length)return document.getElementById(window.location.hash.slice(1).replace(/try:.*/,\"\")).scrollIntoView()}})}).call(this);\n</script>\n\n<script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-106156830-1\"></script>\n\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/test.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n  <title>CoffeeScript Test Suite</title>\n  <script nomodule src=\"browser-compiler-legacy/coffeescript.js\"></script>\n  <script type=\"module\">\n    import CoffeeScript from './browser-compiler-modern/coffeescript.js';\n    window.CoffeeScript = CoffeeScript;\n    window.addEventListener('DOMContentLoaded', CoffeeScript.runScripts, false);\n  </script>\n  <script src=\"https://cdn.jsdelivr.net/underscorejs/1.8.3/underscore-min.js\"></script>\n  <style>\n    body, pre {\n      font-family: Consolas, Menlo, Monaco, monospace;\n    }\n    body {\n      margin: 1em;\n    }\n    h1 {\n      font-size: 1.3em;\n    }\n    div {\n      margin: 0.6em;\n    }\n    .good {\n      color: #22b24c\n    }\n    .bad {\n      color: #eb6864\n    }\n    .subtle {\n      font-size: 0.7em;\n      color: #999999\n    }\n  </style>\n</head>\n<body>\n\n<h1>CoffeeScript Test Suite</h1>\n\n<pre id=\"stdout\"></pre>\n\n<script type=\"text/coffeescript\">\n@testingBrowser = yes\n@global = window\n@bold = @red = @green = @reset = ''\nstdout = document.getElementById 'stdout'\nstart = new Date\n@currentFile = ''\n@passedTests = failedTests = total = done = 0\n\nsay = (msg, className, id) ->\n  div = document.createElement 'div'\n  div.className = className if className?\n  div.id = id if id?\n  div.appendChild document.createTextNode msg\n  stdout.appendChild div\n  msg\n\nasyncTests = []\nonFail = (description, fn, err) ->\n  failures.push\n    error: err\n    description: description\n    source: fn.toString() if fn.toString?\n\n@test = (description, fn) ->\n  ++total\n  try\n    result = fn.call(fn)\n    if result instanceof Promise # An async test.\n      asyncTests.push result\n      result.then ->\n        passedTests++\n      .catch (err) ->\n        onFail description, fn, err\n    else\n      passedTests++\n  catch err\n    onFail description, fn, err\n\n@failures =\n  push: (failure) -> # Match function called by regular tests\n    ++failedTests\n    say \"#{failure.description}:\", 'bad'\n    say failure.source, 'subtle' if failure.source?\n    say failure.error, 'bad'\n    console.error failure.error\n\n@ok = (good, msg = 'Error') ->\n  throw Error msg unless good\n\n# Polyfill Node assert’s fail\n@fail = ->\n  ok no\n\n# Polyfill Node assert’s deepEqual with Underscore’s isEqual\n@deepEqual = (a, b) ->\n  ok _.isEqual(a, b), \"Expected #{JSON.stringify a} to deep equal #{JSON.stringify b}\"\n\n# See [http://wiki.ecmascript.org/doku.php?id=harmony:egal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\negal = (a, b) ->\n  if a is b\n    a isnt 0 or 1/a is 1/b\n  else\n    a isnt a and b isnt b\n\n# A recursive functional equivalence helper; uses egal for testing equivalence.\narrayEgal = (a, b) ->\n  if egal a, b then yes\n  else if a instanceof Array and b instanceof Array\n    return no unless a.length is b.length\n    return no for el, idx in a when not arrayEgal el, b[idx]\n    yes\n\ndiffOutput = (expectedOutput, actualOutput) ->\n  expectedOutputLines = expectedOutput.split '\\n'\n  actualOutputLines = actualOutput.split '\\n'\n  for line, i in actualOutputLines\n    if line isnt expectedOutputLines[i]\n      actualOutputLines[i] = \"#{yellow}#{line}#{reset}\"\n  \"\"\"Expected generated JavaScript to be:\n  #{reset}#{expectedOutput}#{red}\n    but instead it was:\n  #{reset}#{actualOutputLines.join '\\n'}#{red}\"\"\"\n\n@eq = (a, b, msg) ->\n  ok egal(a, b), msg or\n  \"Expected #{reset}#{a}#{red} to equal #{reset}#{b}#{red}\"\n\n@arrayEq = (a, b, msg) ->\n  ok arrayEgal(a, b), msg or\n  \"Expected #{reset}#{a}#{red} to deep equal #{reset}#{b}#{red}\"\n\n@eqJS = (input, expectedOutput, msg) ->\n  actualOutput = CoffeeScript.compile input, bare: yes\n  .replace /^\\s+|\\s+$/g, '' # Trim leading/trailing whitespace.\n  ok egal(expectedOutput, actualOutput), msg or diffOutput expectedOutput, actualOutput\n\n@isWindows = -> process.platform is 'win32'\n\n@inspect = (obj) ->\n  if global.testingBrowser\n    JSON.stringify obj, null, 2\n  else\n    require('util').inspect obj,\n      depth: 10\n      colors: if process.env.NODE_DISABLE_COLORS then no else yes\n\n# Helpers to get AST nodes for a string of code.\n@getAstRoot = getAstRoot = (code) ->\n  CoffeeScript.compile code, ast: yes\n\n# The root node is always a `File` node, so for brevity in the tests return its\n# children from `program.body`.\ngetAstExpressions = (code) ->\n  ast = getAstRoot code\n  ast.program.body\n\n# Many tests want just the root node.\n@getAstExpression = (code) ->\n  expressionStatementAst = getAstExpressions(code)[0]\n  ok expressionStatementAst.type is 'ExpressionStatement', 'Expected ExpressionStatement AST wrapper'\n  expressionStatementAst.expression\n\n@getAstStatement = (code) ->\n  statement = getAstExpressions(code)[0]\n  ok statement.type isnt 'ExpressionStatement', \"Didn't expect ExpressionStatement AST wrapper\"\n  statement\n\n@getAstExpressionOrStatement = (code) ->\n  expressionAst = getAstExpressions(code)[0]\n  return expressionAst unless expressionAst.type is 'ExpressionStatement'\n  expressionAst.expression\n\n@throwsCompileError = (code, compileOpts, args...) ->\n  throws -> CoffeeScript.compile code, compileOpts, args...\n  throws -> CoffeeScript.compile code, Object.assign({}, (compileOpts ? {}), ast: yes), args...\n\n@doesNotThrowCompileError = (code, compileOpts, args...) ->\n  doesNotThrow -> CoffeeScript.compile code, compileOpts, args...\n  doesNotThrow -> CoffeeScript.compile code, Object.assign({}, (compileOpts ? {}), ast: yes), args...\n\n\n@doesNotThrow = (fn) ->\n  fn()\n  ok yes\n\n@throws = (fun, err, msg) ->\n  try\n    fun()\n  catch e\n    if err\n      if typeof err is 'function' and e instanceof err # Handle comparing exceptions\n        ok yes\n      else if e.toString().indexOf('[stdin]') is 0 # Handle comparing error messages\n        ok err e\n      else if err instanceof RegExp\n        ok err.test e\n      else\n        eq e, err\n    else\n      ok yes\n    return\n  ok no\n\n\n# Run the tests\nfor test in document.getElementsByClassName 'test'\n  say '\\u2714 ' + test.id\n  options = {}\n  options.filename = currentFile = test.id\n  options.literate = yes if test.type is 'text/x-literate-coffeescript'\n  CoffeeScript.run test.innerHTML, options\n\n# Finish up\ndone = ->\n  yay = passedTests is total and not failedTests\n  sec = (new Date - start) / 1000\n  msg = \"passed #{passedTests} tests in #{sec.toFixed 2} seconds\"\n  msg = \"failed #{total - passedTests} tests and #{msg}\" unless yay\n  say msg, (if yay then 'good' else 'bad'), 'result'\n\n  gtag 'event', 'tests_complete',\n    event_category: 'tests'\n    event_label: if yay then 'passed' else 'failed'\n    value: if yay then passedTests else total - passedTests\n  gtag 'event', 'tests_report',\n    event_category: 'tests'\n    event_label: msg\n  gtag 'event', 'timing_complete',\n    name: 'tests_run'\n    value: sec * 1000\n\nPromise.all(asyncTests).then(done).catch(done)\n</script>\n\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"abstract_syntax_tree\">\n# Astract Syntax Tree generation\n# ------------------------------\n\n# Recursively compare all values of enumerable properties of `expected` with\n# those of `actual`. Use `looseArray` helper function to skip array length\n# comparison.\ndeepStrictIncludeExpectedProperties = (actual, expected) ->\n  eq actual.length, expected.length if expected instanceof Array and not expected.loose\n  for key, val of expected\n    if val? and typeof val is 'object'\n      fail \"Property #{reset}#{key}#{red} expected, but was missing\" unless actual[key]\n      deepStrictIncludeExpectedProperties actual[key], val\n    else\n      eq actual[key], val, \"\"\"\n        Property #{reset}#{key}#{red}: expected #{reset}#{actual[key]}#{red} to equal #{reset}#{val}#{red}\n          Expected AST output to include:\n          #{reset}#{inspect expected}#{red}\n          but instead it was:\n          #{reset}#{inspect actual}#{red}\n      \"\"\"\n  actual\n\n# Flag array for loose comparison. See reference to `.loose` in\n# `deepStrictIncludeExpectedProperties` above.\nlooseArray = (arr) ->\n  Object.defineProperty arr, 'loose',\n    value: yes\n    enumerable: no\n  arr\n\ntestAgainstExpected = (ast, expected) ->\n  if expected?\n    deepStrictIncludeExpectedProperties ast, expected\n  else\n    # Convenience for creating new tests; call `testExpression` with no second\n    # parameter to see what the current AST generation is for your input code.\n    console.log inspect ast\n\ntestExpression = (code, expected) ->\n  ast = getAstExpression code\n  testAgainstExpected ast, expected\n\ntestStatement = (code, expected) ->\n  ast = getAstStatement code\n  testAgainstExpected ast, expected\n\ntestComments = (code, expected) ->\n  ast = getAstRoot code\n  testAgainstExpected ast.comments, expected\n\ntest 'Confirm functionality of `deepStrictIncludeExpectedProperties`', ->\n  actual =\n    name: 'Name'\n    a:\n      b: 1\n      c: 2\n    x: [1, 2, 3]\n\n  check = (message, test, expected) ->\n    test (-> deepStrictIncludeExpectedProperties actual, expected), null, message\n\n  check 'Expected property does not match', throws,\n    name: '\"Name\"'\n\n  check 'Array length mismatch', throws,\n    x: [1, 2]\n\n  check 'Skip array length check', doesNotThrow,\n    x: looseArray [\n      1\n      2\n    ]\n\n  check 'Array length matches', doesNotThrow,\n    x: [1, 2, 3]\n\n  check 'Array prop mismatch', throws,\n    x: [3, 2, 1]\n\n  check 'Partial object comparison', doesNotThrow,\n    a:\n      c: 2\n    forbidden: undefined\n\n  check 'Actual has forbidden prop', throws,\n    a:\n      b: 1\n      c: undefined\n\n  check 'Check prop for existence only', doesNotThrow,\n    name: {}\n    a: {}\n    x: {}\n\n  check 'Prop is missing', throws,\n    missingProp: {}\n\n# Shorthand helpers for common AST patterns.\n\nEMPTY_BLOCK =\n  type: 'BlockStatement'\n  body: []\n  directives: []\n\nID = (name, additionalProperties = {}) ->\n  Object.assign({\n    type: 'Identifier'\n    name\n  }, additionalProperties)\n\nNUMBER = (value) -> {\n  type: 'NumericLiteral'\n  value\n}\n\nSTRING = (value) -> {\n  type: 'StringLiteral'\n  value\n}\n\n# Check each node type in the same order as they appear in `nodes.coffee`.\n# For nodes that have equivalents in Babel’s AST spec, we’re checking that\n# the type and properties match. When relevant, also check that values of\n# properties are as expected.\n\ntest \"AST as expected for Block node\", ->\n  deepStrictIncludeExpectedProperties CoffeeScript.compile('a', ast: yes),\n    type: 'File'\n    program:\n      type: 'Program'\n      # sourceType: 'module'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n      ]\n      directives: []\n    comments: []\n\n  deepStrictIncludeExpectedProperties CoffeeScript.compile('# comment', ast: yes),\n    type: 'File'\n    program:\n      type: 'Program'\n      body: []\n      directives: []\n    comments: [\n      type: 'CommentLine'\n      value: ' comment'\n    ]\n\n  deepStrictIncludeExpectedProperties CoffeeScript.compile('', ast: yes),\n    type: 'File'\n    program:\n      type: 'Program'\n      body: []\n      directives: []\n\n  deepStrictIncludeExpectedProperties CoffeeScript.compile(' ', ast: yes),\n    type: 'File'\n    program:\n      type: 'Program'\n      body: []\n      directives: []\n\ntest \"AST as expected for NumberLiteral node\", ->\n  testExpression '42',\n    type: 'NumericLiteral'\n    value: 42\n    extra:\n      rawValue: 42\n      raw: '42'\n\n  testExpression '0xE1',\n    type: 'NumericLiteral'\n    value: 225\n    extra:\n      rawValue: 225\n      raw: '0xE1'\n\n  testExpression '10_000',\n    type: 'NumericLiteral'\n    value: 10000\n    extra:\n      rawValue: 10000\n      raw: '10_000'\n\n  testExpression '1_2.34_5e6_7',\n    type: 'NumericLiteral'\n    value: 12.345e67\n    extra:\n      rawValue: 12.345e67\n      raw: '1_2.34_5e6_7'\n\n  testExpression '0o7_7_7',\n    type: 'NumericLiteral'\n    value: 0o777\n    extra:\n      rawValue: 0o777\n      raw: '0o7_7_7'\n\n  testExpression '42n',\n    type: 'BigIntLiteral'\n    value: '42'\n    extra:\n      rawValue: '42'\n      raw: '42n'\n\n  testExpression '2e3_08',\n    type: 'NumericLiteral'\n    value: Infinity\n    extra:\n      rawValue: Infinity\n      raw: '2e3_08'\n\ntest \"AST as expected for InfinityLiteral node\", ->\n  testExpression 'Infinity',\n    type: 'Identifier'\n    name: 'Infinity'\n\n  testExpression '2e308',\n    type: 'NumericLiteral'\n    value: Infinity\n    extra:\n      raw: '2e308'\n      rawValue: Infinity\n\ntest \"AST as expected for NaNLiteral node\", ->\n  testExpression 'NaN',\n    type: 'Identifier'\n    name: 'NaN'\n\ntest \"AST as expected for StringLiteral node\", ->\n  # Just a standalone string literal would be treated as a directive,\n  # so embed the string literal in an enclosing expression (e.g. a call).\n  testExpression 'a \"string cheese\"',\n    type: 'CallExpression'\n    arguments: [\n      type: 'StringLiteral'\n      value: 'string cheese'\n      extra:\n        raw: '\"string cheese\"'\n    ]\n\n  testExpression \"b 'cheese string'\",\n    type: 'CallExpression'\n    arguments: [\n      type: 'StringLiteral'\n      value: 'cheese string'\n      extra:\n        raw: \"'cheese string'\"\n    ]\n\n  testExpression \"'''heredoc'''\",\n    type: 'TemplateLiteral'\n    expressions: []\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: 'heredoc'\n      tail: yes\n    ]\n    quote: \"'''\"\n\ntest \"AST as expected for PassthroughLiteral node\", ->\n  code = 'const CONSTANT = \"unreassignable!\"'\n  testExpression \"`#{code}`\",\n    type: 'PassthroughLiteral'\n    value: code\n    here: no\n\n  code = '\\nconst CONSTANT = \"unreassignable!\"\\n'\n  testExpression \"```#{code}```\",\n    type: 'PassthroughLiteral'\n    value: code\n    here: yes\n\n  testExpression \"``\",\n    type: 'PassthroughLiteral'\n    value: ''\n    here: no\n\n  # escaped backticks\n  testExpression \"`\\\\`abc\\\\``\",\n    type: 'PassthroughLiteral'\n    value: '\\\\`abc\\\\`'\n    here: no\n\ntest \"AST as expected for IdentifierLiteral node\", ->\n  testExpression 'id',\n    type: 'Identifier'\n    name: 'id'\n\ntest \"AST as expected for JSXTag node\", ->\n  testExpression '<CSXY />',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'CSXY'\n      attributes: []\n      selfClosing: yes\n    closingElement: null\n    children: []\n\n  testExpression '<div></div>',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n    children: []\n\n  testExpression '<A.B />',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXMemberExpression'\n        object:\n          type: 'JSXIdentifier'\n          name: 'A'\n        property:\n          type: 'JSXIdentifier'\n          name: 'B'\n      attributes: []\n      selfClosing: yes\n    closingElement: null\n    children: []\n\n  testExpression '<Tag.Name.Here></Tag.Name.Here>',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXMemberExpression'\n        object:\n          type: 'JSXMemberExpression'\n          object:\n            type: 'JSXIdentifier'\n            name: 'Tag'\n          property:\n            type: 'JSXIdentifier'\n            name: 'Name'\n        property:\n          type: 'JSXIdentifier'\n          name: 'Here'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXMemberExpression'\n        object:\n          type: 'JSXMemberExpression'\n          object:\n            type: 'JSXIdentifier'\n            name: 'Tag'\n          property:\n            type: 'JSXIdentifier'\n            name: 'Name'\n        property:\n          type: 'JSXIdentifier'\n          name: 'Here'\n    children: []\n\n  testExpression '<></>',\n    type: 'JSXFragment'\n    openingFragment:\n      type: 'JSXOpeningFragment'\n    closingFragment:\n      type: 'JSXClosingFragment'\n    children: []\n\n  testExpression '<div a b=\"c\" d={e} {...f} />',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n      attributes: [\n        type: 'JSXAttribute'\n        name:\n          type: 'JSXIdentifier'\n          name: 'a'\n      ,\n        type: 'JSXAttribute'\n        name:\n          type: 'JSXIdentifier'\n          name: 'b'\n        value:\n          type: 'StringLiteral'\n          value: 'c'\n      ,\n        type: 'JSXAttribute'\n        name:\n          type: 'JSXIdentifier'\n          name: 'd'\n        value:\n          type: 'JSXExpressionContainer'\n          expression:\n            type: 'Identifier'\n            name: 'e'\n      ,\n        type: 'JSXSpreadAttribute'\n        argument:\n          type: 'Identifier'\n          name: 'f'\n        postfix: no\n      ]\n      selfClosing: yes\n    closingElement: null\n    children: []\n\n  testExpression '<div {f...} />',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      attributes: [\n        type: 'JSXSpreadAttribute'\n        argument:\n          type: 'Identifier'\n          name: 'f'\n        postfix: yes\n      ]\n\n  testExpression '<div>abc</div>',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n    children: [\n      type: 'JSXText'\n      extra:\n        raw: 'abc'\n      value: 'abc'\n    ]\n\n  testExpression '''\n    <a>\n      {b}\n      <c />\n    </a>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'a'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'a'\n    children: [\n      type: 'JSXText'\n      extra:\n        raw: '\\n  '\n      value: '\\n  '\n    ,\n      type: 'JSXExpressionContainer'\n      expression: ID 'b'\n    ,\n      type: 'JSXText'\n      extra:\n        raw: '\\n  '\n      value: '\\n  '\n    ,\n      type: 'JSXElement'\n      openingElement:\n        type: 'JSXOpeningElement'\n        name:\n          type: 'JSXIdentifier'\n          name: 'c'\n        selfClosing: true\n      closingElement: null\n      children: []\n    ,\n      type: 'JSXText'\n      extra:\n        raw: '\\n'\n      value: '\\n'\n    ]\n\n  testExpression '<>abc{}</>',\n    type: 'JSXFragment'\n    openingFragment:\n      type: 'JSXOpeningFragment'\n    closingFragment:\n      type: 'JSXClosingFragment'\n    children: [\n      type: 'JSXText'\n      extra:\n        raw: 'abc'\n      value: 'abc'\n    ,\n      type: 'JSXExpressionContainer'\n      expression:\n        type: 'JSXEmptyExpression'\n    ]\n\n  testExpression '''\n    <a>{<b />}</a>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'a'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'a'\n    children: [\n      type: 'JSXExpressionContainer'\n      expression:\n        type: 'JSXElement'\n        openingElement:\n          type: 'JSXOpeningElement'\n          name:\n            type: 'JSXIdentifier'\n            name: 'b'\n          selfClosing: true\n        closingElement: null\n        children: []\n    ]\n\n  testExpression '''\n    <div>{\n      # comment\n    }</div>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n    children: [\n      type: 'JSXExpressionContainer'\n      expression:\n        type: 'JSXEmptyExpression'\n    ]\n\n  testExpression '''\n    <div>{### here ###}</div>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n    children: [\n      type: 'JSXExpressionContainer'\n      expression:\n        type: 'JSXEmptyExpression'\n    ]\n\n  testExpression '<div:a b:c />',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXNamespacedName'\n        namespace:\n          type: 'JSXIdentifier'\n          name: 'div'\n        name:\n          type: 'JSXIdentifier'\n          name: 'a'\n      attributes: [\n        type: 'JSXAttribute'\n        name:\n          type: 'JSXNamespacedName'\n          namespace:\n            type: 'JSXIdentifier'\n            name: 'b'\n          name:\n            type: 'JSXIdentifier'\n            name: 'c'\n      ]\n      selfClosing: yes\n\n  testExpression '''\n    <div:a>\n      {b}\n    </div:a>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXNamespacedName'\n        namespace:\n          type: 'JSXIdentifier'\n          name: 'div'\n        name:\n          type: 'JSXIdentifier'\n          name: 'a'\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXNamespacedName'\n        namespace:\n          type: 'JSXIdentifier'\n          name: 'div'\n        name:\n          type: 'JSXIdentifier'\n          name: 'a'\n\n  testExpression '''\n    <div b={\n      c\n      d\n    } />\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      attributes: [\n        value:\n          type: 'JSXExpressionContainer'\n          expression:\n            type: 'BlockStatement'\n            body: [\n              type: 'ExpressionStatement'\n            ,\n              type: 'ExpressionStatement'\n              expression:\n                returns: yes\n            ]\n      ]\n\ntest \"AST as expected for ComputedPropertyName node\", ->\n  testExpression '[fn]: ->',\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key:\n        type: 'Identifier'\n        name: 'fn'\n      value:\n        type: 'FunctionExpression'\n      computed: yes\n      shorthand: no\n      method: no\n    ]\n    implicit: yes\n\n  testExpression '[a]: b',\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key:\n        type: 'Identifier'\n        name: 'a'\n      value:\n        type: 'Identifier'\n        name: 'b'\n      computed: yes\n      shorthand: no\n      method: no\n    ]\n    implicit: yes\n\ntest \"AST as expected for StatementLiteral node\", ->\n  testStatement 'break',\n    type: 'BreakStatement'\n\n  testStatement 'continue',\n    type: 'ContinueStatement'\n\n  testStatement 'debugger',\n    type: 'DebuggerStatement'\n\ntest \"AST as expected for ThisLiteral node\", ->\n  testExpression 'this',\n    type: 'ThisExpression'\n    shorthand: no\n\n  testExpression '@',\n    type: 'ThisExpression'\n    shorthand: yes\n\n  testExpression '@b',\n    type: 'MemberExpression'\n    object:\n      type: 'ThisExpression'\n      shorthand: yes\n    property: ID 'b'\n\n  testExpression 'this.b',\n    type: 'MemberExpression'\n    object:\n      type: 'ThisExpression'\n      shorthand: no\n    property: ID 'b'\n\ntest \"AST as expected for UndefinedLiteral node\", ->\n  testExpression 'undefined',\n    type: 'Identifier'\n    name: 'undefined'\n\ntest \"AST as expected for NullLiteral node\", ->\n  testExpression 'null',\n    type: 'NullLiteral'\n\ntest \"AST as expected for BooleanLiteral node\", ->\n  testExpression 'true',\n    type: 'BooleanLiteral'\n    value: true\n    name: 'true'\n\n  testExpression 'off',\n    type: 'BooleanLiteral'\n    value: false\n    name: 'off'\n\n  testExpression 'yes',\n    type: 'BooleanLiteral'\n    value: true\n    name: 'yes'\n\ntest \"AST as expected for Return node\", ->\n  testStatement 'return no',\n    type: 'ReturnStatement'\n    argument:\n      type: 'BooleanLiteral'\n\n  testExpression '''\n    (a, b) ->\n      return a + b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ReturnStatement'\n        argument:\n          type: 'BinaryExpression'\n      ]\n\n  testExpression '-> return',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ReturnStatement'\n        argument: null\n      ]\n\ntest \"AST as expected for YieldReturn node\", ->\n  testExpression '-> yield return 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'YieldExpression'\n          argument:\n            type: 'ReturnStatement'\n            argument: NUMBER 1\n          delegate: no\n      ]\n\ntest \"AST as expected for AwaitReturn node\", ->\n  testExpression '-> await return 2',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AwaitExpression'\n          argument:\n            type: 'ReturnStatement'\n            argument: NUMBER 2\n      ]\n\ntest \"AST as expected for Call node\", ->\n  testExpression 'fn()',\n    type: 'CallExpression'\n    callee:\n      type: 'Identifier'\n      name: 'fn'\n    arguments: []\n    optional: no\n    implicit: no\n    returns: undefined\n\n  testExpression 'new Date()',\n    type: 'NewExpression'\n    callee:\n      type: 'Identifier'\n      name: 'Date'\n    arguments: []\n    optional: no\n    implicit: no\n\n  testExpression 'new Date?()',\n    type: 'NewExpression'\n    callee:\n      type: 'Identifier'\n      name: 'Date'\n    arguments: []\n    optional: yes\n    implicit: no\n\n  testExpression 'new Old',\n    type: 'NewExpression'\n    callee:\n      type: 'Identifier'\n      name: 'Old'\n    arguments: []\n    optional: no\n    implicit: no\n\n  testExpression 'new Old(1)',\n    type: 'NewExpression'\n    callee:\n      type: 'Identifier'\n      name: 'Old'\n    arguments: [\n      type: 'NumericLiteral'\n      value: 1\n    ]\n    optional: no\n    implicit: no\n\n  testExpression 'new Old 1',\n    type: 'NewExpression'\n    callee:\n      type: 'Identifier'\n      name: 'Old'\n    arguments: [\n      type: 'NumericLiteral'\n      value: 1\n    ]\n    optional: no\n    implicit: yes\n\n  testExpression 'maybe?()',\n    type: 'OptionalCallExpression'\n    optional: yes\n    implicit: no\n\n  testExpression 'maybe?(1 + 1)',\n    type: 'OptionalCallExpression'\n    arguments: [\n      type: 'BinaryExpression'\n    ]\n    optional: yes\n    implicit: no\n\n  testExpression 'maybe? 1 + 1',\n    type: 'OptionalCallExpression'\n    arguments: [\n      type: 'BinaryExpression'\n    ]\n    optional: yes\n    implicit: yes\n\n  testExpression 'goDo this, that',\n    type: 'CallExpression'\n    arguments: [\n      type: 'ThisExpression'\n    ,\n      type: 'Identifier'\n      name: 'that'\n    ]\n    implicit: yes\n    optional: no\n\n  testExpression 'a?().b',\n    type: 'OptionalMemberExpression'\n    object:\n      type: 'OptionalCallExpression'\n      optional: yes\n    optional: no\n\n  testExpression 'a?.b.c()',\n    type: 'OptionalCallExpression'\n    callee:\n      type: 'OptionalMemberExpression'\n      object:\n        type: 'OptionalMemberExpression'\n        optional: yes\n      optional: no\n    optional: no\n\n  testExpression 'a?.b?()',\n    type: 'OptionalCallExpression'\n    callee:\n      type: 'OptionalMemberExpression'\n      optional: yes\n    optional: yes\n\n  testExpression 'a?().b?()',\n    type: 'OptionalCallExpression'\n    callee:\n      type: 'OptionalMemberExpression'\n      optional: no\n      object:\n        type: 'OptionalCallExpression'\n        optional: yes\n    optional: yes\n\n  testExpression 'a().b?()',\n    type: 'OptionalCallExpression'\n    callee:\n      type: 'MemberExpression'\n      optional: no\n      object:\n        type: 'CallExpression'\n        optional: no\n    optional: yes\n\n  testExpression 'a?().b()',\n    type: 'OptionalCallExpression'\n    callee:\n      type: 'OptionalMemberExpression'\n      optional: no\n      object:\n        type: 'OptionalCallExpression'\n        optional: yes\n    optional: no\n\ntest \"AST as expected for SuperCall node\", ->\n  testStatement 'class child extends parent then constructor: -> super()',\n    type: 'ClassDeclaration'\n    body:\n      type: 'ClassBody'\n      body: [\n        body:\n          type: 'BlockStatement'\n          body: [\n            type: 'ExpressionStatement'\n            expression:\n              type: 'CallExpression'\n              callee:\n                type: 'Super'\n          ]\n      ]\n\ntest \"AST as expected for Super node\", ->\n  testStatement 'class child extends parent then func: -> super.prop',\n    type: 'ClassDeclaration'\n    body:\n      type: 'ClassBody'\n      body: [\n        body:\n          type: 'BlockStatement'\n          body: [\n            type: 'ExpressionStatement'\n            expression:\n              type: 'MemberExpression'\n              object:\n                type: 'Super'\n              property: ID 'prop'\n              computed: no\n          ]\n      ]\n\n  testStatement '''\n    class child extends parent\n      func: ->\n        super[prop]()\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      type: 'ClassBody'\n      body: [\n        body:\n          type: 'BlockStatement'\n          body: [\n            type: 'ExpressionStatement'\n            expression:\n              type: 'CallExpression'\n              callee:\n                type: 'MemberExpression'\n                object:\n                  type: 'Super'\n                property: ID 'prop'\n                computed: yes\n          ]\n      ]\n\ntest \"AST as expected for RegexWithInterpolations node\", ->\n  testExpression '///^#{flavor}script$///',\n    type: 'InterpolatedRegExpLiteral'\n    interpolatedPattern:\n      type: 'TemplateLiteral'\n      expressions: [\n        ID 'flavor'\n      ]\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: '^'\n        tail: no\n      ,\n        type: 'TemplateElement'\n        value:\n          raw: 'script$'\n        tail: yes\n      ]\n      quote: '///'\n    flags: ''\n\n  testExpression '''\n    ///\n      a\n      #{b}///ig\n  ''',\n    type: 'InterpolatedRegExpLiteral'\n    interpolatedPattern:\n      type: 'TemplateLiteral'\n      expressions: [\n        ID 'b'\n      ]\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: '\\n  a\\n  '\n        tail: no\n      ,\n        type: 'TemplateElement'\n        value:\n          raw: ''\n        tail: yes\n      ]\n      quote: '///'\n    flags: 'ig'\n\n  testExpression '''\n    ///\n      a # first\n      #{b} ### second ###\n    ///ig\n  ''',\n    type: 'InterpolatedRegExpLiteral'\n    interpolatedPattern:\n      type: 'TemplateLiteral'\n      expressions: [\n        ID 'b'\n      ]\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: '\\n  a # first\\n  '\n        tail: no\n      ,\n        type: 'TemplateElement'\n        value:\n          raw: ' ### second ###\\n'\n        tail: yes\n      ]\n      quote: '///'\n    flags: 'ig'\n    comments: [\n      type: 'CommentLine'\n      value: ' first'\n    ,\n      type: 'CommentBlock'\n      value: ' second '\n    ]\n\ntest \"AST as expected for TaggedTemplateCall node\", ->\n  testExpression 'func\"tagged\"',\n    type: 'TaggedTemplateExpression'\n    tag: ID 'func'\n    quasi:\n      type: 'TemplateLiteral'\n      expressions: []\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: 'tagged'\n        tail: yes\n      ]\n\n  testExpression 'a\"b#{c}\"',\n    type: 'TaggedTemplateExpression'\n    tag: ID 'a'\n    quasi:\n      type: 'TemplateLiteral'\n      expressions: [\n        ID 'c'\n      ]\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: 'b'\n        tail: no\n      ,\n        type: 'TemplateElement'\n        value:\n          raw: ''\n        tail: yes\n      ]\n\n  testExpression '''\n    a\"\"\"\n      b#{c}\n    \"\"\"\n  ''',\n    type: 'TaggedTemplateExpression'\n    tag: ID 'a'\n    quasi:\n      type: 'TemplateLiteral'\n      expressions: [\n        ID 'c'\n      ]\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: '\\n  b'\n        tail: no\n      ,\n        type: 'TemplateElement'\n        value:\n          raw: '\\n'\n        tail: yes\n      ]\n\n  testExpression \"\"\"\n    a'''\n      b\n    '''\n  \"\"\",\n    type: 'TaggedTemplateExpression'\n    tag: ID 'a'\n    quasi:\n      type: 'TemplateLiteral'\n      expressions: []\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: '\\n  b\\n'\n        tail: yes\n      ]\n\ntest \"AST as expected for Access node\", ->\n  testExpression 'obj.prop',\n    type: 'MemberExpression'\n    object:\n      type: 'Identifier'\n      name: 'obj'\n    property:\n      type: 'Identifier'\n      name: 'prop'\n    computed: no\n    optional: no\n    shorthand: no\n\n  testExpression 'obj?.prop',\n    type: 'OptionalMemberExpression'\n    object:\n      type: 'Identifier'\n      name: 'obj'\n    property:\n      type: 'Identifier'\n      name: 'prop'\n    computed: no\n    optional: yes\n    shorthand: no\n\n  testExpression 'a::b',\n    type: 'MemberExpression'\n    object:\n      type: 'MemberExpression'\n      object:\n        type: 'Identifier'\n        name: 'a'\n      property:\n        type: 'Identifier'\n        name: 'prototype'\n      computed: no\n      optional: no\n      shorthand: yes\n    property:\n      type: 'Identifier'\n      name: 'b'\n    computed: no\n    optional: no\n    shorthand: no\n\n  testExpression 'a.prototype.b',\n    type: 'MemberExpression'\n    object:\n      type: 'MemberExpression'\n      object:\n        type: 'Identifier'\n        name: 'a'\n      property:\n        type: 'Identifier'\n        name: 'prototype'\n      computed: no\n      optional: no\n      shorthand: no\n    property:\n      type: 'Identifier'\n      name: 'b'\n    computed: no\n    optional: no\n    shorthand: no\n\n  testExpression 'a?.b.c',\n    type: 'OptionalMemberExpression'\n    object:\n      type: 'OptionalMemberExpression'\n      object:\n        type: 'Identifier'\n        name: 'a'\n      property:\n        type: 'Identifier'\n        name: 'b'\n      computed: no\n      optional: yes\n      shorthand: no\n    property:\n      type: 'Identifier'\n      name: 'c'\n    computed: no\n    optional: no\n    shorthand: no\n\ntest \"AST as expected for Index node\", ->\n  testExpression 'a[b]',\n    type: 'MemberExpression'\n    object:\n      type: 'Identifier'\n      name: 'a'\n    property:\n      type: 'Identifier'\n      name: 'b'\n    computed: yes\n    optional: no\n    shorthand: no\n\n  testExpression 'a?[b]',\n    type: 'OptionalMemberExpression'\n    object:\n      type: 'Identifier'\n      name: 'a'\n    property:\n      type: 'Identifier'\n      name: 'b'\n    computed: yes\n    optional: yes\n    shorthand: no\n\n  testExpression 'a::[b]',\n    type: 'MemberExpression'\n    object:\n      type: 'MemberExpression'\n      object:\n        type: 'Identifier'\n        name: 'a'\n      property:\n        type: 'Identifier'\n        name: 'prototype'\n      computed: no\n      optional: no\n      shorthand: yes\n    property:\n      type: 'Identifier'\n      name: 'b'\n    computed: yes\n    optional: no\n    shorthand: no\n\n  testExpression 'a[b][3]',\n    type: 'MemberExpression'\n    object:\n      type: 'MemberExpression'\n      object:\n        type: 'Identifier'\n        name: 'a'\n      property:\n        type: 'Identifier'\n        name: 'b'\n      computed: yes\n      optional: no\n      shorthand: no\n    property:\n      type: 'NumericLiteral'\n      value: 3\n    computed: yes\n    optional: no\n    shorthand: no\n\n  testExpression 'a[if b then c]',\n    type: 'MemberExpression'\n    object: ID 'a'\n    property:\n      type: 'ConditionalExpression'\n      test: ID 'b'\n      consequent: ID 'c'\n    computed: yes\n    optional: no\n    shorthand: no\n\ntest \"AST as expected for Range node\", ->\n  testExpression '[x..y]',\n    type: 'Range'\n    exclusive: no\n    from:\n      name: 'x'\n    to:\n      name: 'y'\n\n  testExpression '[4...2]',\n    type: 'Range'\n    exclusive: yes\n    from:\n      value: 4\n    to:\n      value: 2\n\ntest \"AST as expected for Slice node\", ->\n  testExpression 'x[..y]',\n    property:\n      type: 'Range'\n      exclusive: no\n      from: null\n      to:\n        name: 'y'\n\n  testExpression 'x[y...]',\n    property:\n      type: 'Range'\n      exclusive: yes\n      from:\n        name: 'y'\n      to: null\n\n  testExpression 'x[...]',\n    property:\n      type: 'Range'\n      exclusive: yes\n      from: null\n      to: null\n\n  testExpression '\"abc\"[...2]',\n    type: 'MemberExpression'\n    property:\n      type: 'Range'\n      from: null\n      to:\n        type: 'NumericLiteral'\n        value: 2\n      exclusive: yes\n    computed: yes\n    optional: no\n    shorthand: no\n\n  testExpression 'x[...][a..][b...][..c][...d]',\n    type: 'MemberExpression'\n    object:\n      type: 'MemberExpression'\n      object:\n        type: 'MemberExpression'\n        object:\n          type: 'MemberExpression'\n          object:\n            type: 'MemberExpression'\n            property:\n              type: 'Range'\n              from: null\n              to: null\n              exclusive: yes\n          property:\n            type: 'Range'\n            from:\n              name: 'a'\n            to: null\n            exclusive: no\n        property:\n          type: 'Range'\n          from:\n            name: 'b'\n          to: null\n          exclusive: yes\n      property:\n        type: 'Range'\n        from: null\n        to:\n          name: 'c'\n        exclusive: no\n    property:\n      type: 'Range'\n      from: null\n      to:\n        name: 'd'\n      exclusive: yes\n\ntest \"AST as expected for Obj node\", ->\n  testExpression \"{a: 1, b, [c], @d, [e()]: f, 'g': 2, ...h, i...}\",\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key:\n        type: 'Identifier'\n        name: 'a'\n      value:\n        type: 'NumericLiteral'\n        value: 1\n      computed: no\n      shorthand: no\n    ,\n      type: 'ObjectProperty'\n      key:\n        type: 'Identifier'\n        name: 'b'\n      value:\n        type: 'Identifier'\n        name: 'b'\n      computed: no\n      shorthand: yes\n    ,\n      type: 'ObjectProperty'\n      key:\n        type: 'Identifier'\n        name: 'c'\n      value:\n        type: 'Identifier'\n        name: 'c'\n      computed: yes\n      shorthand: yes\n    ,\n      type: 'ObjectProperty'\n      key:\n        type: 'MemberExpression'\n        object:\n          type: 'ThisExpression'\n        property:\n          type: 'Identifier'\n          name: 'd'\n      value:\n        type: 'MemberExpression'\n        object:\n          type: 'ThisExpression'\n        property:\n          type: 'Identifier'\n          name: 'd'\n      computed: no\n      shorthand: yes\n    ,\n      type: 'ObjectProperty'\n      key:\n        type: 'CallExpression'\n        callee:\n          type: 'Identifier'\n          name: 'e'\n        arguments: []\n      value:\n        type: 'Identifier'\n        name: 'f'\n      computed: yes\n      shorthand: no\n    ,\n      type: 'ObjectProperty'\n      key:\n        type: 'StringLiteral'\n        value: 'g'\n      value:\n        type: 'NumericLiteral'\n        value: 2\n      computed: no\n      shorthand: no\n    ,\n      type: 'SpreadElement'\n      argument:\n        type: 'Identifier'\n        name: 'h'\n      postfix: no\n    ,\n      type: 'SpreadElement'\n      argument:\n        type: 'Identifier'\n        name: 'i'\n      postfix: yes\n    ]\n    implicit: no\n\n  testExpression 'a: 1',\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key:\n        type: 'Identifier'\n        name: 'a'\n      value:\n        type: 'NumericLiteral'\n        value: 1\n      shorthand: no\n      computed: no\n    ]\n    implicit: yes\n\n  testExpression '''\n    a:\n      if b then c\n  ''',\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key: ID 'a'\n      value:\n        type: 'ConditionalExpression'\n        test: ID 'b'\n        consequent: ID 'c'\n    ]\n    implicit: yes\n\n  testExpression '''\n    a:\n      c if b\n  ''',\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key: ID 'a'\n      value:\n        type: 'ConditionalExpression'\n        test: ID 'b'\n        consequent: ID 'c'\n    ]\n    implicit: yes\n\n  testExpression '\"#{a}\": 1',\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key:\n        type: 'TemplateLiteral'\n        expressions: [\n          ID 'a'\n        ]\n      value:\n        type: 'NumericLiteral'\n        value: 1\n      shorthand: no\n      computed: yes\n    ]\n    implicit: yes\n\ntest \"AST as expected for Arr node\", ->\n  testExpression '[]',\n    type: 'ArrayExpression'\n    elements: []\n\n  testExpression '[3, tables, !1]',\n    type: 'ArrayExpression'\n    elements: [\n      {value: 3}\n      {name: 'tables'}\n      {operator: '!'}\n    ]\n\ntest \"AST as expected for Class node\", ->\n  testStatement 'class Klass',\n    type: 'ClassDeclaration'\n    id: ID 'Klass', declaration: yes\n    superClass: null\n    body:\n      type: 'ClassBody'\n      body: []\n\n  testStatement 'class child extends parent',\n    type: 'ClassDeclaration'\n    id: ID 'child', declaration: yes\n    superClass: ID 'parent', declaration: no\n    body:\n      type: 'ClassBody'\n      body: []\n\n  testStatement 'class Klass then constructor: -> @a = 1',\n    type: 'ClassDeclaration'\n    id: ID 'Klass', declaration: yes\n    superClass: null\n    body:\n      type: 'ClassBody'\n      body: [\n        type: 'ClassMethod'\n        static: no\n        key: ID 'constructor', declaration: no\n        computed: no\n        kind: 'constructor'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body:\n          type: 'BlockStatement'\n          body: [\n            type: 'ExpressionStatement'\n            expression:\n              type: 'AssignmentExpression'\n              returns: undefined\n          ]\n        bound: no\n      ]\n\n  testExpression '''\n    a = class A\n      b: ->\n        c\n      d: =>\n        e\n  ''',\n    type: 'AssignmentExpression'\n    right:\n      type: 'ClassExpression'\n      id: ID 'A', declaration: yes\n      superClass: null\n      body:\n        type: 'ClassBody'\n        body: [\n          type: 'ClassMethod'\n          static: no\n          key: ID 'b'\n          computed: no\n          kind: 'method'\n          id: null\n          generator: no\n          async: no\n          params: []\n          body:\n            type: 'BlockStatement'\n            body: [\n              type: 'ExpressionStatement'\n              expression: ID 'c', returns: yes\n            ]\n          operator: ':'\n          bound: no\n        ,\n          type: 'ClassMethod'\n          static: no\n          key: ID 'd'\n          computed: no\n          kind: 'method'\n          id: null\n          generator: no\n          async: no\n          params: []\n          body:\n            type: 'BlockStatement'\n            body: [\n              type: 'ExpressionStatement'\n              expression: ID 'e'\n            ]\n          operator: ':'\n          bound: yes\n        ]\n\n  testStatement '''\n    class A\n      @b: ->\n      @c = =>\n      @d: 1\n      @e = 2\n      j = 5\n      A.f = 3\n      A.g = ->\n      this.h = ->\n      this.i = 4\n  ''',\n    type: 'ClassDeclaration'\n    id: ID 'A', declaration: yes\n    superClass: null\n    body:\n      type: 'ClassBody'\n      body: [\n        type: 'ClassMethod'\n        static: yes\n        key: ID 'b'\n        computed: no\n        kind: 'method'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        operator: ':'\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: yes\n        bound: no\n      ,\n        type: 'ClassMethod'\n        static: yes\n        key: ID 'c'\n        computed: no\n        kind: 'method'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        operator: '='\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: yes\n        bound: yes\n      ,\n        type: 'ClassProperty'\n        static: yes\n        key: ID 'd'\n        computed: no\n        value: NUMBER 1\n        operator: ':'\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: yes\n      ,\n        type: 'ClassProperty'\n        static: yes\n        key: ID 'e'\n        computed: no\n        value: NUMBER 2\n        operator: '='\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: yes\n      ,\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left: ID 'j', declaration: yes\n          right: NUMBER 5\n      ,\n        type: 'ClassProperty'\n        static: yes\n        key: ID 'f'\n        computed: no\n        value: NUMBER 3\n        operator: '='\n        staticClassName: ID 'A'\n      ,\n        type: 'ClassMethod'\n        static: yes\n        key: ID 'g'\n        computed: no\n        kind: 'method'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        operator: '='\n        staticClassName: ID 'A'\n        bound: no\n      ,\n        type: 'ClassMethod'\n        static: yes\n        key: ID 'h'\n        computed: no\n        kind: 'method'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        operator: '='\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: no\n        bound: no\n      ,\n        type: 'ClassProperty'\n        static: yes\n        key: ID 'i'\n        computed: no\n        value: NUMBER 4\n        operator: '='\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: no\n      ]\n\n  testStatement '''\n    class A\n      b: 1\n      [c]: 2\n      [d]: ->\n      @[e]: ->\n      @[f]: 3\n  ''',\n    type: 'ClassDeclaration'\n    id: ID 'A', declaration: yes\n    superClass: null\n    body:\n      type: 'ClassBody'\n      body: [\n        type: 'ClassPrototypeProperty'\n        key: ID 'b', declaration: no\n        value: NUMBER 1\n        computed: no\n      ,\n        type: 'ClassPrototypeProperty'\n        key: ID 'c'\n        value: NUMBER 2\n        computed: yes\n      ,\n        type: 'ClassMethod'\n        static: no\n        key: ID 'd'\n        computed: yes\n        kind: 'method'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        operator: ':'\n        bound: no\n      ,\n        type: 'ClassMethod'\n        static: yes\n        key: ID 'e'\n        computed: yes\n        kind: 'method'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        operator: ':'\n        bound: no\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: yes\n      ,\n        type: 'ClassProperty'\n        static: yes\n        key: ID 'f'\n        computed: yes\n        value: NUMBER 3\n        operator: ':'\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: yes\n      ]\n\n  testStatement '''\n    class A\n      @[b] = ->\n      \"#{c}\": ->\n      @[d] = 1\n      [e]: 2\n      \"#{f}\": 3\n      @[g]: 4\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      body: [\n        type: 'ClassMethod'\n        computed: yes\n      ,\n        type: 'ClassMethod'\n        computed: yes\n      ,\n        type: 'ClassProperty'\n        computed: yes\n      ,\n        type: 'ClassPrototypeProperty'\n        computed: yes\n      ,\n        type: 'ClassPrototypeProperty'\n        computed: yes\n      ,\n        type: 'ClassProperty'\n        computed: yes\n      ]\n\n  testStatement '''\n    class A.b\n  ''',\n    type: 'ClassDeclaration'\n    id:\n      type: 'MemberExpression'\n      object: ID 'A', declaration: no\n      property: ID 'b', declaration: no\n\n  testStatement '''\n    class A\n      'constructor': ->\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      type: 'ClassBody'\n      body: [\n        type: 'ClassMethod'\n        static: no\n        key:\n          type: 'StringLiteral'\n        computed: no\n        kind: 'constructor'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        bound: no\n      ]\n\n\ntest \"AST as expected for ModuleDeclaration node\", ->\n  testStatement 'export {X}',\n    type: 'ExportNamedDeclaration'\n    declaration: null\n    specifiers: [\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'X'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'X'\n        declaration: no\n    ]\n    source: null\n    exportKind: 'value'\n\n  testStatement 'import X from \".\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      type: 'ImportDefaultSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'X'\n        declaration: no\n    ]\n    importKind: 'value'\n    source:\n      type: 'StringLiteral'\n      value: '.'\n\n  testStatement 'import X from \".\" assert { type: \"json\" }',\n    type: 'ImportDeclaration'\n    specifiers: [\n      type: 'ImportDefaultSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'X'\n        declaration: no\n    ]\n    importKind: 'value'\n    source:\n      type: 'StringLiteral'\n      value: '.'\n    assertions: [\n      type: 'ImportAttribute'\n      key:\n        type: 'Identifier'\n        name: 'type'\n      value:\n        type: 'StringLiteral'\n        value: 'json'\n        extra:\n          raw: '\"json\"'\n    ]\n\ntest \"AST as expected for ImportDeclaration node\", ->\n  testStatement 'import React, {Component} from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      type: 'ImportDefaultSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'React'\n        declaration: no\n    ,\n      type: 'ImportSpecifier'\n      imported:\n        type: 'Identifier'\n        name: 'Component'\n        declaration: no\n      importKind: null\n      local:\n        type: 'Identifier'\n        name: 'Component'\n        declaration: no\n    ]\n    importKind: 'value'\n    source:\n      type: 'StringLiteral'\n      value: 'react'\n      extra:\n        raw: '\"react\"'\n\ntest \"AST as expected for ExportNamedDeclaration node\", ->\n  testStatement 'export {}',\n    type: 'ExportNamedDeclaration'\n    declaration: null\n    specifiers: []\n    source: null\n    exportKind: 'value'\n\n  testStatement 'export fn = ->',\n    type: 'ExportNamedDeclaration'\n    declaration:\n      type: 'AssignmentExpression'\n      left:\n        type: 'Identifier'\n        declaration: yes\n      right:\n        type: 'FunctionExpression'\n    specifiers: []\n    source: null\n    exportKind: 'value'\n\n  testStatement 'export class A',\n    type: 'ExportNamedDeclaration'\n    declaration:\n      type: 'ClassDeclaration'\n      id: ID 'A', declaration: yes\n      superClass: null\n      body:\n        type: 'ClassBody'\n        body: []\n    specifiers: []\n    source: null\n    exportKind: 'value'\n\n  testStatement 'export {x as y, z as default}',\n    type: 'ExportNamedDeclaration'\n    declaration: null\n    specifiers: [\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'x'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'y'\n        declaration: no\n    ,\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'z'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'default'\n        declaration: no\n    ]\n    source: null\n    exportKind: 'value'\n\n  testStatement 'export {default, default as b} from \"./abc\"',\n    type: 'ExportNamedDeclaration'\n    declaration: null\n    specifiers: [\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'default'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'default'\n        declaration: no\n    ,\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'default'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'b'\n        declaration: no\n    ]\n    source:\n      type: 'StringLiteral'\n      value: './abc'\n      extra:\n        raw: '\"./abc\"'\n    exportKind: 'value'\n\ntest \"AST as expected for ExportDefaultDeclaration node\", ->\n  testStatement 'export default class',\n    type: 'ExportDefaultDeclaration'\n    declaration:\n      type: 'ClassDeclaration'\n\n  testStatement 'export default \"abc\"',\n    type: 'ExportDefaultDeclaration'\n    declaration:\n      type: 'StringLiteral'\n      value: 'abc'\n      extra:\n        raw: '\"abc\"'\n\n  testStatement 'export default a = b',\n    type: 'ExportDefaultDeclaration'\n    declaration:\n      type: 'AssignmentExpression'\n      left: ID 'a', declaration: yes\n      right: ID 'b', declaration: no\n\ntest \"AST as expected for ExportAllDeclaration node\", ->\n  testStatement 'export * from \"module-name\"',\n    type: 'ExportAllDeclaration'\n    source:\n      type: 'StringLiteral'\n      value: 'module-name'\n      extra:\n        raw: '\"module-name\"'\n    exportKind: 'value'\n\n  testStatement 'export * from \"module-name\" assert { type: \"json\" }',\n    type: 'ExportAllDeclaration'\n    source:\n      type: 'StringLiteral'\n      value: 'module-name'\n      extra:\n        raw: '\"module-name\"'\n    assertions: [\n      type: 'ImportAttribute'\n      key:\n        type: 'Identifier'\n        name: 'type'\n      value:\n        type: 'StringLiteral'\n        value: 'json'\n        extra:\n          raw: '\"json\"'\n    ]\n    exportKind: 'value'\n\ntest \"AST as expected for ExportSpecifierList node\", ->\n  testStatement 'export {a, b, c}',\n    type: 'ExportNamedDeclaration'\n    declaration: null\n    specifiers: [\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'a'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'a'\n        declaration: no\n    ,\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'b'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'b'\n        declaration: no\n    ,\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'c'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'c'\n        declaration: no\n    ]\n\ntest \"AST as expected for ImportDefaultSpecifier node\", ->\n  testStatement 'import React from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      type: 'ImportDefaultSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'React'\n        declaration: no\n    ]\n    importKind: 'value'\n    source:\n      type: 'StringLiteral'\n      value: 'react'\n\ntest \"AST as expected for ImportNamespaceSpecifier node\", ->\n  testStatement 'import * as React from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      type: 'ImportNamespaceSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'React'\n        declaration: no\n    ]\n    importKind: 'value'\n    source:\n      type: 'StringLiteral'\n      value: 'react'\n\n  testStatement 'import React, * as ReactStar from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      type: 'ImportDefaultSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'React'\n        declaration: no\n    ,\n      type: 'ImportNamespaceSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'ReactStar'\n        declaration: no\n    ]\n    importKind: 'value'\n    source:\n      type: 'StringLiteral'\n      value: 'react'\n\ntest \"AST as expected for Assign node\", ->\n  testExpression 'a = b',\n    type: 'AssignmentExpression'\n    left:\n      type: 'Identifier'\n      name: 'a'\n      declaration: yes\n    right:\n      type: 'Identifier'\n      name: 'b'\n      declaration: no\n    operator: '='\n\n  testExpression 'a += b',\n    type: 'AssignmentExpression'\n    left:\n      type: 'Identifier'\n      name: 'a'\n      declaration: no\n    right:\n      type: 'Identifier'\n      name: 'b'\n      declaration: no\n    operator: '+='\n\n  testExpression '[@a = 2, {b: {c = 3} = {}, d...}, ...e] = f',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ArrayPattern'\n      elements: [\n        type: 'AssignmentPattern'\n        left:\n          type: 'MemberExpression'\n          object:\n            type: 'ThisExpression'\n          property:\n            name: 'a'\n            declaration: no\n        right:\n          type: 'NumericLiteral'\n      ,\n        type: 'ObjectPattern'\n        properties: [\n          type: 'ObjectProperty'\n          key:\n            name: 'b'\n            declaration: no\n          value:\n            type: 'AssignmentPattern'\n            left:\n              type: 'ObjectPattern'\n              properties: [\n                type: 'ObjectProperty'\n                key:\n                  name: 'c'\n                value:\n                  type: 'AssignmentPattern'\n                  left:\n                    name: 'c'\n                    declaration: yes\n                  right:\n                    value: 3\n                shorthand: yes\n              ]\n            right:\n              type: 'ObjectExpression'\n              properties: []\n        ,\n          type: 'RestElement'\n          argument:\n            name: 'd'\n            declaration: yes\n          postfix: yes\n        ]\n      ,\n        type: 'RestElement'\n        argument:\n          name: 'e'\n          declaration: yes\n        postfix: no\n      ]\n    right:\n      name: 'f'\n\n  testExpression '{a: [...b]} = c',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'ObjectProperty'\n        key:\n          name: 'a'\n          declaration: no\n        value:\n          type: 'ArrayPattern'\n          elements: [\n            type: 'RestElement'\n            argument:\n              name: 'b'\n              declaration: yes\n          ]\n      ]\n    right:\n      name: 'c'\n      declaration: no\n\n  testExpression '(a = 1; a ?= b)',\n    type: 'SequenceExpression'\n    expressions: [\n      type: 'AssignmentExpression'\n    ,\n      type: 'AssignmentExpression'\n      left:\n        type: 'Identifier'\n        name: 'a'\n        declaration: no\n      right:\n        type: 'Identifier'\n        name: 'b'\n        declaration: no\n      operator: '?='\n    ]\n\n  testExpression '[a..., b] = c',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ArrayPattern'\n      elements: [\n        type: 'RestElement'\n        argument: ID 'a', declaration: yes\n        postfix: yes\n      ,\n        ID 'b'\n      ]\n    right:\n      ID 'c'\n\n  testExpression '[] = c',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ArrayPattern'\n      elements: []\n    right:\n      ID 'c'\n\n  testExpression '{{a...}...} = b',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'RestElement'\n        argument:\n          type: 'ObjectPattern'\n          properties: [\n            type: 'RestElement'\n            argument: ID 'a'\n          ]\n        postfix: yes\n      ]\n    right: ID 'b'\n\n  testExpression '{a..., b} = c',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'RestElement'\n        argument: ID 'a'\n        postfix: yes\n      ,\n        type: 'ObjectProperty'\n      ]\n    right: ID 'c'\n\n  testExpression '{a.b...} = c',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'RestElement'\n        argument:\n          type: 'MemberExpression'\n        postfix: yes\n      ]\n    right: ID 'c'\n\n  testExpression '{{a}...} = b',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'RestElement'\n        argument:\n          type: 'ObjectPattern'\n          properties: [\n            type: 'ObjectProperty'\n            shorthand: yes\n          ]\n        postfix: yes\n      ]\n    right: ID 'b'\n\n  testExpression '[u, [v, ...w, x], ...{...y}, z] = a',\n    left:\n      type: 'ArrayPattern'\n\n  testExpression '{...{a: [...b, c]}} = d',\n    left:\n      type: 'ObjectPattern'\n\n  testExpression '{\"#{a}\": b} = c',\n    left:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'ObjectProperty'\n        key:\n          type: 'TemplateLiteral'\n          expressions: [\n            ID 'a'\n          ]\n        computed: yes\n      ]\n\ntest \"AST as expected for Code node\", ->\n  testExpression '=>',\n    type: 'ArrowFunctionExpression'\n    params: []\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n    hasIndentedBody: no\n\n  testExpression '''\n    (a, b = 1) ->\n      c\n      d()\n  ''',\n    type: 'FunctionExpression'\n    params: [\n      type: 'Identifier'\n      name: 'a'\n      declaration: no\n    ,\n      type: 'AssignmentPattern'\n      left:\n        type: 'Identifier'\n        name: 'b'\n        declaration: no\n      right:\n        type: 'NumericLiteral'\n        value: 1\n    ]\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n          name: 'c'\n      ,\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n          returns: yes\n      ]\n      directives: []\n    generator: no\n    async: no\n    id: null\n    hasIndentedBody: yes\n\n  testExpression '({a}) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'ObjectPattern'\n      properties: [\n        type: 'ObjectProperty'\n        key: ID 'a', declaration: no\n        value: ID 'a', declaration: no\n        shorthand: yes\n      ]\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '([a]) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'ArrayPattern'\n      elements: [\n        ID 'a', declaration: no\n      ]\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '({a = 1} = {}) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'AssignmentPattern'\n      left:\n        type: 'ObjectPattern'\n        properties: [\n          type: 'ObjectProperty'\n          key: ID 'a', declaration: no\n          value:\n            type: 'AssignmentPattern'\n            left: ID 'a', declaration: no\n            right: NUMBER(1)\n          shorthand: yes\n        ]\n      right:\n        type: 'ObjectExpression'\n        properties: []\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '([a = 1] = []) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'AssignmentPattern'\n      left:\n        type: 'ArrayPattern'\n        elements: [\n          type: 'AssignmentPattern'\n          left: ID 'a', declaration: no\n          right: NUMBER(1)\n        ]\n      right:\n        type: 'ArrayExpression'\n        elements: []\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '() ->',\n    type: 'FunctionExpression'\n    params: []\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '(@a) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'MemberExpression'\n      object:\n        type: 'ThisExpression'\n        shorthand: yes\n      property: ID 'a', declaration: no\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '(@a = 1) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'AssignmentPattern'\n      left:\n        type: 'MemberExpression'\n      right: NUMBER 1\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '({@a}) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'ObjectPattern'\n      properties: [\n        type: 'ObjectProperty'\n        key:\n          type: 'MemberExpression'\n        value:\n          type: 'MemberExpression'\n        shorthand: yes\n        computed: no\n      ]\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '({[a]}) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'ObjectPattern'\n      properties: [\n        type: 'ObjectProperty'\n        key:   ID 'a', declaration: no\n        value: ID 'a', declaration: no\n        shorthand: yes\n        computed: yes\n      ]\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '(...a) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'RestElement'\n      argument: ID 'a', declaration: no\n      postfix: no\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '(a...) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'RestElement'\n      argument: ID 'a'\n      postfix: yes\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '(..., a) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'RestElement'\n      argument: null\n    ,\n      ID 'a'\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '-> a',\n    type: 'FunctionExpression'\n    params: []\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'a', returns: yes\n      ]\n    generator: no\n    async: no\n    id: null\n    hasIndentedBody: no\n\n  testExpression '-> await 3',\n    type: 'FunctionExpression'\n    params: []\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AwaitExpression'\n          argument: NUMBER 3\n          returns: yes\n      ]\n    generator: no\n    async: yes\n    id: null\n\n  testExpression '-> yield 4',\n    type: 'FunctionExpression'\n    params: []\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'YieldExpression'\n          argument: NUMBER 4\n          delegate: no\n      ]\n    generator: yes\n    async: no\n    id: null\n\n  testExpression '-> yield',\n    type: 'FunctionExpression'\n    params: []\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'YieldExpression'\n          argument: null\n          delegate: no\n      ]\n    generator: yes\n    async: no\n    id: null\n\n  testExpression '(a) -> a = 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left:\n            ID 'a', declaration: no\n      ]\n\n  testExpression '(...a) -> a = 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left:\n            ID 'a', declaration: no\n      ]\n\n  testExpression '({a}) -> a = 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left:\n            ID 'a', declaration: no\n      ]\n\n  testExpression '([a]) -> a = 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left:\n            ID 'a', declaration: no\n      ]\n\n  testExpression '(a = 1) -> a = 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left:\n            ID 'a', declaration: no\n      ]\n    generator: no\n    async: no\n    id: null\n\n  testExpression '({a} = 1) -> a = 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left:\n            ID 'a', declaration: no\n      ]\n    generator: no\n    async: no\n    id: null\n\ntest \"AST as expected for Splat node\", ->\n  testExpression '[a...]',\n    type: 'ArrayExpression'\n    elements: [\n      type: 'SpreadElement'\n      argument:\n        type: 'Identifier'\n        name: 'a'\n        declaration: no\n      postfix: yes\n    ]\n\n  testExpression '[b, ...c]',\n    type: 'ArrayExpression'\n    elements: [\n      name: 'b'\n      declaration: no\n    ,\n      type: 'SpreadElement'\n      argument:\n        type: 'Identifier'\n        name: 'c'\n        declaration: no\n      postfix: no\n    ]\n\ntest \"AST as expected for Expansion node\", ->\n  testExpression '(..., b) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'RestElement'\n      argument: null\n    ,\n      ID 'b'\n    ]\n\n  testExpression '[..., b] = c',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ArrayPattern'\n      elements: [\n        type: 'RestElement'\n        argument: null\n      ,\n        type: 'Identifier'\n      ]\n\ntest \"AST as expected for Elision node\", ->\n  testExpression '[,,,a,,,b]',\n    type: 'ArrayExpression'\n    elements: [\n      null, null, null\n      name: 'a'\n      null, null\n      name: 'b'\n    ]\n\n  testExpression '[,,,a,,,b] = \"asdfqwer\"',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ArrayPattern'\n      elements: [\n        null, null, null\n      ,\n        type: 'Identifier'\n        name: 'a'\n      ,\n        null, null\n      ,\n        type: 'Identifier'\n        name: 'b'\n      ]\n    right:\n      type: 'StringLiteral'\n      value: 'asdfqwer'\n\ntest \"AST as expected for While node\", ->\n  testStatement 'loop 1',\n    type: 'WhileStatement'\n    test:\n      type: 'BooleanLiteral'\n      value: true\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: NUMBER 1\n      ]\n    guard: null\n    inverted: no\n    postfix: no\n    loop: yes\n\n  testStatement 'while 1 < 2 then',\n    type: 'WhileStatement'\n    test:\n      type: 'BinaryExpression'\n    body:\n      type: 'BlockStatement'\n      body: []\n    guard: null\n    inverted: no\n    postfix: no\n    loop: no\n\n  testStatement 'while 1 < 2 then fn()',\n    type: 'WhileStatement'\n    test:\n      type: 'BinaryExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n      ]\n    guard: null\n    inverted: no\n    postfix: no\n    loop: no\n\n  testStatement '''\n    x() until y\n  ''',\n    type: 'WhileStatement'\n    test: ID 'y'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n          returns: undefined\n      ]\n    guard: null\n    inverted: yes\n    postfix: yes\n    loop: no\n\n  testStatement '''\n    until x when y\n      z++\n  ''',\n    type: 'WhileStatement'\n    test: ID 'x'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'UpdateExpression'\n      ]\n    guard: ID 'y'\n    inverted: yes\n    postfix: no\n    loop: no\n\n  testStatement '''\n    x while y when z\n  ''',\n    type: 'WhileStatement'\n    test: ID 'y'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'x'\n      ]\n    guard: ID 'z'\n    inverted: no\n    postfix: yes\n    loop: no\n\n  testStatement '''\n    loop\n      a()\n      b++\n  ''',\n    type: 'WhileStatement'\n    test:\n      type: 'BooleanLiteral'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n      ,\n        type: 'ExpressionStatement'\n        expression:\n          type: 'UpdateExpression'\n      ]\n    guard: null\n    inverted: no\n    postfix: no\n    loop: yes\n\n  testExpression '''\n    x = (z() while y)\n  ''',\n    type: 'AssignmentExpression'\n    right:\n      type: 'WhileStatement'\n      body:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n          expression:\n            type: 'CallExpression'\n            returns: yes\n        ]\n\ntest \"AST as expected for Op node\", ->\n  testExpression 'a <= 2',\n    type: 'BinaryExpression'\n    operator: '<='\n    left:\n      type: 'Identifier'\n      name: 'a'\n    right:\n      type: 'NumericLiteral'\n      value: 2\n\n  testExpression 'a is 2',\n    type: 'BinaryExpression'\n    operator: 'is'\n    left:\n      type: 'Identifier'\n      name: 'a'\n    right:\n      type: 'NumericLiteral'\n      value: 2\n\n  testExpression 'a // 2',\n    type: 'BinaryExpression'\n    operator: '//'\n    left:\n      type: 'Identifier'\n      name: 'a'\n    right:\n      type: 'NumericLiteral'\n      value: 2\n\n  testExpression 'a << 2',\n    type: 'BinaryExpression'\n    operator: '<<'\n    left:\n      type: 'Identifier'\n      name: 'a'\n    right:\n      type: 'NumericLiteral'\n      value: 2\n\n  testExpression 'typeof x',\n    type: 'UnaryExpression'\n    operator: 'typeof'\n    prefix: yes\n    argument:\n      type: 'Identifier'\n      name: 'x'\n\n  testExpression 'delete x.y',\n    type: 'UnaryExpression'\n    operator: 'delete'\n    prefix: yes\n    argument:\n      type: 'MemberExpression'\n\n  testExpression 'do x',\n    type: 'UnaryExpression'\n    operator: 'do'\n    prefix: yes\n    argument:\n      type: 'Identifier'\n      name: 'x'\n\n  testExpression 'do ->',\n    type: 'UnaryExpression'\n    operator: 'do'\n    prefix: yes\n    argument:\n      type: 'FunctionExpression'\n\n  testExpression '!x',\n    type: 'UnaryExpression'\n    operator: '!'\n    prefix: yes\n    argument:\n      type: 'Identifier'\n      name: 'x'\n\n  testExpression 'not x',\n    type: 'UnaryExpression'\n    operator: 'not'\n    prefix: yes\n    argument:\n      type: 'Identifier'\n      name: 'x'\n\n  testExpression '--x',\n    type: 'UpdateExpression'\n    operator: '--'\n    prefix: yes\n    argument:\n      type: 'Identifier'\n      name: 'x'\n\n  testExpression 'x++',\n    type: 'UpdateExpression'\n    operator: '++'\n    prefix: no\n    argument:\n      type: 'Identifier'\n      name: 'x'\n\n  testExpression 'x && y',\n    type: 'LogicalExpression'\n    operator: '&&'\n    left:\n      type: 'Identifier'\n      name: 'x'\n    right:\n      type: 'Identifier'\n      name: 'y'\n\n  testExpression 'x or y',\n    type: 'LogicalExpression'\n    operator: 'or'\n    left:\n      type: 'Identifier'\n      name: 'x'\n    right:\n      type: 'Identifier'\n      name: 'y'\n\n  testExpression 'x ? y',\n    type: 'LogicalExpression'\n    operator: '?'\n    left:\n      type: 'Identifier'\n      name: 'x'\n    right:\n      type: 'Identifier'\n      name: 'y'\n\n  testExpression 'x in y',\n    type: 'BinaryExpression'\n    operator: 'in'\n    left:\n      type: 'Identifier'\n      name: 'x'\n    right:\n      type: 'Identifier'\n      name: 'y'\n\n  testExpression 'x not in y',\n    type: 'BinaryExpression'\n    operator: 'not in'\n    left:\n      type: 'Identifier'\n      name: 'x'\n    right:\n      type: 'Identifier'\n      name: 'y'\n\n  testExpression 'x + y * z',\n    type: 'BinaryExpression'\n    operator: '+'\n    left:\n      type: 'Identifier'\n      name: 'x'\n    right:\n      type: 'BinaryExpression'\n      operator: '*'\n      left:\n        type: 'Identifier'\n        name: 'y'\n      right:\n        type: 'Identifier'\n        name: 'z'\n\n  testExpression '(x + y) * z',\n    type: 'BinaryExpression'\n    operator: '*'\n    left:\n      type: 'BinaryExpression'\n      operator: '+'\n      left:\n        type: 'Identifier'\n        name: 'x'\n      right:\n        type: 'Identifier'\n        name: 'y'\n    right:\n      type: 'Identifier'\n      name: 'z'\n\ntest \"AST as expected for Try node\", ->\n  testStatement 'try cappuccino',\n    type: 'TryStatement'\n    block:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n          name: 'cappuccino'\n      ]\n    handler: null\n    finalizer: null\n\n  testStatement '''\n    try\n      x = 1\n      y()\n    catch e\n      d()\n    finally\n      f + g\n  ''',\n    type: 'TryStatement'\n    block:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n      ,\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n      ]\n    handler:\n      type: 'CatchClause'\n      param:\n        type: 'Identifier'\n        name: 'e'\n        declaration: yes\n      body:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n          expression:\n            type: 'CallExpression'\n        ]\n    finalizer:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'BinaryExpression'\n      ]\n\n  testStatement '''\n    try\n    catch\n    finally\n  ''',\n    type: 'TryStatement'\n    block:\n      type: 'BlockStatement'\n      body: []\n    handler:\n      type: 'CatchClause'\n      param: null\n      body:\n        type: 'BlockStatement'\n        body: []\n    finalizer:\n      type: 'BlockStatement'\n      body: []\n\n  testStatement '''\n    try\n    catch {e}\n      f\n  ''',\n    type: 'TryStatement'\n    block:\n      type: 'BlockStatement'\n      body: []\n    handler:\n      type: 'CatchClause'\n      param:\n        type: 'ObjectPattern'\n        properties: [\n          type: 'ObjectProperty'\n          key: ID 'e', declaration: no\n          value: ID 'e', declaration: yes\n        ]\n      body:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n        ]\n    finalizer: null\n\ntest \"AST as expected for Throw node\", ->\n  testStatement 'throw new BallError \"catch\"',\n    type: 'ThrowStatement'\n    argument:\n      type: 'NewExpression'\n\ntest \"AST as expected for Existence node\", ->\n  testExpression 'Ghosts?',\n    type: 'UnaryExpression',\n    argument:\n      name: 'Ghosts'\n    operator: '?'\n    prefix: no\n\ntest \"AST as expected for Parens node\", ->\n  testExpression '(hmmmmm)',\n    type: 'Identifier'\n    name: 'hmmmmm'\n\n  testExpression '(a + b) / c',\n    type: 'BinaryExpression'\n    operator: '/'\n    left:\n      type: 'BinaryExpression'\n      operator: '+'\n      left: ID 'a'\n      right: ID 'b'\n    right: ID 'c'\n\n  testExpression '(((1)))',\n    type: 'NumericLiteral'\n    value: 1\n\ntest \"AST as expected for StringWithInterpolations node\", ->\n  testExpression '\"a#{b}c\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      ID 'b'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: 'a'\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: 'c'\n      tail: yes\n    ]\n    quote: '\"'\n\n  testExpression '\"\"\"a#{b}c\"\"\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      ID 'b'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: 'a'\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: 'c'\n      tail: yes\n    ]\n    quote: '\"\"\"'\n\n  testExpression '\"#{b}\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      ID 'b'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: yes\n    ]\n    quote: '\"'\n\n  testExpression '''\n    \" a\n      #{b}\n      c\n    \"\n  ''',\n    type: 'TemplateLiteral'\n    expressions: [\n      ID 'b'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: ' a\\n  '\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: '\\n  c\\n'\n      tail: yes\n    ]\n    quote: '\"'\n\n  testExpression '''\n    \"\"\"\n      a\n        b#{\n        c\n      }d\n    \"\"\"\n  ''',\n    type: 'TemplateLiteral'\n    expressions: [\n      ID 'c'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: '\\n  a\\n    b'\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: 'd\\n'\n      tail: yes\n    ]\n    quote: '\"\"\"'\n\n  # empty interpolation\n  testExpression '\"#{}\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      type: 'EmptyInterpolation'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: yes\n    ]\n    quote: '\"'\n\n  testExpression '''\n    \"#{\n      # comment\n     }\"\n    ''',\n    type: 'TemplateLiteral'\n    expressions: [\n      type: 'EmptyInterpolation'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: yes\n    ]\n    quote: '\"'\n\n  testExpression '\"#{ ### here ### }\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      type: 'EmptyInterpolation'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: yes\n    ]\n    quote: '\"'\n\n  testExpression '''\n    a \"#{\n      b\n      c\n    }\"\n  ''',\n    type: 'CallExpression'\n    arguments: [\n      type: 'TemplateLiteral'\n      expressions: [\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n        ,\n          type: 'ExpressionStatement'\n          expression:\n            returns: yes\n        ]\n      ]\n    ]\n\ntest \"AST as expected for For node\", ->\n  testStatement 'for x, i in arr when x? then return',\n    type: 'For'\n    name: ID 'x', declaration: yes\n    index: ID 'i', declaration: yes\n    guard:\n      type: 'UnaryExpression'\n    source: ID 'arr', declaration: no\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ReturnStatement'\n      ]\n    style: 'in'\n    own: no\n    postfix: no\n    await: no\n    step: null\n\n  testStatement 'for k, v of obj then return',\n    type: 'For'\n    name: ID 'v', declaration: yes\n    index: ID 'k', declaration: yes\n    guard: null\n    source: ID 'obj', declaration: no\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ReturnStatement'\n      ]\n    style: 'of'\n    own: no\n    postfix: no\n    await: no\n    step: null\n\n  testStatement 'for x from iterable then',\n    type: 'For'\n    name: ID 'x', declaration: yes\n    index: null\n    guard: null\n    body: EMPTY_BLOCK\n    source: ID 'iterable', declaration: no\n    style: 'from'\n    own: no\n    postfix: no\n    await: no\n    step: null\n\n  testStatement 'for i in [0...42] by step when not (i % 2) then',\n    type: 'For'\n    name: ID 'i', declaration: yes\n    index: null\n    body: EMPTY_BLOCK\n    source:\n      type: 'Range'\n    guard:\n      type: 'UnaryExpression'\n    step: ID 'step', declaration: no\n    style: 'in'\n    own: no\n    postfix: no\n    await: no\n\n  testExpression 'a = (x for x in y)',\n    type: 'AssignmentExpression'\n    right:\n      type: 'For'\n      name: ID 'x', declaration: yes\n      index: null\n      body:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n          expression: ID 'x', declaration: no, returns: yes\n        ]\n      source: ID 'y', declaration: no\n      guard: null\n      step: null\n      style: 'in'\n      own: no\n      postfix: yes\n      await: no\n\n  testStatement 'x for [0...1]',\n    type: 'For'\n    name: null\n    index: null\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'x', declaration: no, returns: undefined\n      ]\n    source:\n      type: 'Range'\n    guard: null\n    step: null\n    style: 'range'\n    own: no\n    postfix: yes\n    await: no\n\n  testStatement '''\n    for own x, y of z\n      c()\n      d\n  ''',\n    type: 'For'\n    name: ID 'y', declaration: yes\n    index: ID 'x', declaration: yes\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n          returns: undefined\n      ,\n        type: 'ExpressionStatement'\n        expression: ID 'd', declaration: no, returns: undefined\n      ]\n    source: ID 'z', declaration: no\n    guard: null\n    step: null\n    style: 'of'\n    own: yes\n    postfix: no\n    await: no\n\n  testExpression '''\n    ->\n      for await x from y\n        z\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'For'\n        name: ID 'x', declaration: yes\n        index: null\n        body:\n          type: 'BlockStatement'\n          body: [\n            type: 'ExpressionStatement'\n            expression: ID 'z', declaration: no, returns: yes\n          ]\n        source: ID 'y', declaration: no\n        guard: null\n        step: null\n        style: 'from'\n        own: no\n        postfix: no\n        await: yes\n      ]\n\n  testStatement '''\n    for {x} in y\n      z\n  ''',\n    type: 'For'\n    name:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'ObjectProperty'\n        key: ID 'x', declaration: no\n        value: ID 'x', declaration: yes\n        shorthand: yes\n        computed: no\n      ]\n    index: null\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'z'\n      ]\n    source: ID 'y'\n    guard: null\n    step: null\n    style: 'in'\n    postfix: no\n    await: no\n\n  testStatement '''\n    for [x] in y\n      z\n  ''',\n    type: 'For'\n    name:\n      type: 'ArrayPattern'\n      elements: [\n        ID 'x', declaration: yes\n      ]\n    index: null\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'z'\n      ]\n    source: ID 'y'\n    guard: null\n    step: null\n    style: 'in'\n    postfix: no\n    await: no\n\n  testStatement '''\n    for [x..., y] in z\n      y()\n  ''',\n    type: 'For'\n    name:\n      type: 'ArrayPattern'\n\ntest \"AST as expected for Switch node\", ->\n  testStatement '''\n    switch x\n      when a then a\n      when b, c then c\n      else 42\n  ''',\n    type: 'SwitchStatement'\n    discriminant:\n      type: 'Identifier'\n      name: 'x'\n    cases: [\n      type: 'SwitchCase'\n      test:\n        type: 'Identifier'\n        name: 'a'\n      consequent: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n          name: 'a'\n      ]\n      trailing: yes\n    ,\n      type: 'SwitchCase'\n      test:\n        type: 'Identifier'\n        name: 'b'\n      consequent: []\n      trailing: no\n    ,\n      type: 'SwitchCase'\n      test:\n        type: 'Identifier'\n        name: 'c'\n      consequent: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n          name: 'c'\n      ]\n      trailing: yes\n    ,\n      type: 'SwitchCase'\n      test: null\n      consequent: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'NumericLiteral'\n          value: 42\n      ]\n    ]\n\n  testStatement '''\n    switch\n      when some(condition)\n        doSomething()\n        andThenSomethingElse\n  ''',\n    type: 'SwitchStatement'\n    discriminant: null\n    cases: [\n      type: 'SwitchCase'\n      test:\n        type: 'CallExpression'\n      consequent: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n      ,\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n      ]\n      trailing: yes\n    ]\n\n  testStatement '''\n    switch a\n      when 1, 2, 3, 4\n        b\n      else\n        c\n        d\n  ''',\n    type: 'SwitchStatement'\n    discriminant:\n      type: 'Identifier'\n    cases: [\n      type: 'SwitchCase'\n      test:\n        type: 'NumericLiteral'\n        value: 1\n      consequent: []\n      trailing: no\n    ,\n      type: 'SwitchCase'\n      test:\n        type: 'NumericLiteral'\n        value: 2\n      consequent: []\n      trailing: no\n    ,\n      type: 'SwitchCase'\n      test:\n        type: 'NumericLiteral'\n        value: 3\n      consequent: []\n      trailing: no\n    ,\n      type: 'SwitchCase'\n      test:\n        type: 'NumericLiteral'\n        value: 4\n      consequent: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n      ]\n      trailing: yes\n    ,\n      type: 'SwitchCase'\n      test: null\n      consequent: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n      ,\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n      ]\n    ]\n\ntest \"AST as expected for If node\", ->\n  testStatement 'if maybe then yes',\n    type: 'IfStatement'\n    test: ID 'maybe'\n    consequent:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'BooleanLiteral'\n      ]\n    alternate: null\n    postfix: no\n    inverted: no\n\n  testStatement 'yes if maybe',\n    type: 'IfStatement'\n    test: ID 'maybe'\n    consequent:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'BooleanLiteral'\n      ]\n    alternate: null\n    postfix: yes\n    inverted: no\n\n  testStatement 'unless x then x else if y then y else z',\n    type: 'IfStatement'\n    test: ID 'x'\n    consequent:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'x'\n      ]\n    alternate:\n      type: 'IfStatement'\n      test: ID 'y'\n      consequent:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n          expression: ID 'y'\n        ]\n      alternate:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n          expression: ID 'z'\n        ]\n      postfix: no\n      inverted: no\n    postfix: no\n    inverted: yes\n\n  testStatement '''\n    if a\n      b\n    else\n      if c\n        d\n  ''',\n    type: 'IfStatement'\n    test: ID 'a'\n    consequent:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'b'\n      ]\n    alternate:\n      type: 'BlockStatement'\n      body: [\n        type: 'IfStatement'\n        test: ID 'c'\n        consequent:\n          type: 'BlockStatement'\n          body: [\n            type: 'ExpressionStatement'\n            expression: ID 'd'\n          ]\n        alternate: null\n        postfix: no\n        inverted: no\n      ]\n    postfix: no\n    inverted: no\n\n  testExpression '''\n    a =\n      if b then c else if d then e\n  ''',\n    type: 'AssignmentExpression'\n    right:\n      type: 'ConditionalExpression'\n      test: ID 'b'\n      consequent: ID 'c'\n      alternate:\n        type: 'ConditionalExpression'\n        test: ID 'd'\n        consequent: ID 'e'\n        alternate: null\n        postfix: no\n        inverted: no\n      postfix: no\n      inverted: no\n\n  testExpression '''\n    f(\n      if b\n        c\n        d\n    )\n  ''',\n    type: 'CallExpression'\n    arguments: [\n      type: 'ConditionalExpression'\n      test: ID 'b'\n      consequent:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n          expression:\n            ID 'c'\n        ,\n          type: 'ExpressionStatement'\n          expression:\n            ID 'd'\n        ]\n      alternate: null\n      postfix: no\n      inverted: no\n    ]\n\n  testStatement 'a unless b',\n    type: 'IfStatement'\n    test: ID 'b'\n    consequent:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'a'\n      ]\n    alternate: null\n    postfix: yes\n    inverted: yes\n\n  testExpression '''\n    f(\n      if b\n        c\n      else\n        d\n    )\n  ''',\n      type: 'CallExpression'\n      arguments: [\n        type: 'ConditionalExpression'\n        test: ID 'b'\n        consequent: ID 'c'\n        alternate: ID 'd'\n        postfix: no\n        inverted: no\n      ]\n\ntest \"AST as expected for `new.target` MetaProperty node\", ->\n  testExpression '''\n    -> new.target\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'MetaProperty'\n          meta: ID 'new'\n          property: ID 'target'\n      ]\n\n  testExpression '''\n    -> new.target.name\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'MemberExpression'\n          object:\n            type: 'MetaProperty'\n            meta: ID 'new'\n            property: ID 'target'\n          property: ID 'name'\n          computed: no\n      ]\n\ntest \"AST as expected for `import.meta` MetaProperty node\", ->\n  testExpression '''\n    import.meta\n  ''',\n    type: 'MetaProperty'\n    meta: ID 'import'\n    property: ID 'meta'\n\n  testExpression '''\n    import.meta.name\n  ''',\n    type: 'MemberExpression'\n    object:\n      type: 'MetaProperty'\n      meta: ID 'import'\n      property: ID 'meta'\n    property: ID 'name'\n    computed: no\n\ntest \"AST as expected for dynamic import\", ->\n  testExpression '''\n    import('a')\n  ''',\n    type: 'CallExpression'\n    callee:\n      type: 'Import'\n    arguments: [STRING 'a']\n\ntest \"AST as expected for RegexLiteral node\", ->\n  testExpression '/a/ig',\n    type: 'RegExpLiteral'\n    pattern: 'a'\n    originalPattern: 'a'\n    flags: 'ig'\n    delimiter: '/'\n    value: undefined\n    extra:\n      raw: \"/a/ig\"\n      originalRaw: \"/a/ig\"\n      rawValue: undefined\n\n  testExpression '''\n    ///\n      a\n    ///i\n  ''',\n    type: 'RegExpLiteral'\n    pattern: 'a'\n    originalPattern: '\\n  a\\n'\n    flags: 'i'\n    delimiter: '///'\n    value: undefined\n    extra:\n      raw: \"/a/i\"\n      originalRaw: \"///\\n  a\\n///i\"\n      rawValue: undefined\n\n  testExpression '/a\\\\w\\\\u1111\\\\u{11111}/',\n    type: 'RegExpLiteral'\n    pattern: 'a\\\\w\\\\u1111\\\\ud804\\\\udd11'\n    originalPattern: 'a\\\\w\\\\u1111\\\\u{11111}'\n    flags: ''\n    delimiter: '/'\n    value: undefined\n    extra:\n      raw: \"/a\\\\w\\\\u1111\\\\ud804\\\\udd11/\"\n      originalRaw: \"/a\\\\w\\\\u1111\\\\u{11111}/\"\n      rawValue: undefined\n\n  testExpression '''\n    ///\n      a\n      \\\\w\\\\u1111\\\\u{11111}\n    ///\n  ''',\n    type: 'RegExpLiteral'\n    pattern: 'a\\\\w\\\\u1111\\\\ud804\\\\udd11'\n    originalPattern: '\\n  a\\n  \\\\w\\\\u1111\\\\u{11111}\\n'\n    flags: ''\n    delimiter: '///'\n    value: undefined\n    extra:\n      raw: \"/a\\\\w\\\\u1111\\\\ud804\\\\udd11/\"\n      originalRaw: \"///\\n  a\\n  \\\\w\\\\u1111\\\\u{11111}\\n///\"\n      rawValue: undefined\n\n  testExpression '''\n    ///\n      /\n      (.+)\n      /\n    ///\n  ''',\n    type: 'RegExpLiteral'\n    pattern: '\\\\/(.+)\\\\/'\n    originalPattern: '\\n  /\\n  (.+)\\n  /\\n'\n    flags: ''\n    delimiter: '///'\n    value: undefined\n    extra:\n      raw: \"/\\\\/(.+)\\\\//\"\n      originalRaw: \"///\\n  /\\n  (.+)\\n  /\\n///\"\n      rawValue: undefined\n\n  testExpression '''\n    ///\n      a # first\n      b ### second ###\n    ///\n  ''',\n    type: 'RegExpLiteral'\n    pattern: 'ab'\n    originalPattern: '\\n  a # first\\n  b ### second ###\\n'\n    comments: [\n      type: 'CommentLine'\n      value: ' first'\n    ,\n      type: 'CommentBlock'\n      value: ' second '\n    ]\n\ntest \"AST as expected for directives\", ->\n  deepStrictIncludeExpectedProperties CoffeeScript.compile('''\n    'directive 1'\n    'use strict'\n    f()\n  ''', ast: yes),\n    type: 'File'\n    program:\n      type: 'Program'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n      ]\n      directives: [\n        type: 'Directive'\n        value:\n          type: 'DirectiveLiteral'\n          value: 'directive 1'\n          extra:\n            raw: \"'directive 1'\"\n      ,\n        type: 'Directive'\n        value:\n          type: 'DirectiveLiteral'\n          value: 'use strict'\n          extra:\n            raw: \"'use strict'\"\n      ]\n\n  testExpression '''\n    ->\n      'use strict'\n      f()\n      'not a directive'\n      g\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n      ,\n        type: 'ExpressionStatement'\n        expression: STRING 'not a directive'\n      ,\n        type: 'ExpressionStatement'\n        expression: ID 'g'\n      ]\n      directives: [\n        type: 'Directive'\n        value:\n          type: 'DirectiveLiteral'\n          value: 'use strict'\n          extra:\n            raw: \"'use strict'\"\n      ]\n\n  testExpression '''\n    ->\n      \"not a directive because it's implicitly returned\"\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: STRING \"not a directive because it's implicitly returned\"\n      ]\n      directives: []\n\n  deepStrictIncludeExpectedProperties CoffeeScript.compile('''\n    'use strict'\n  ''', ast: yes),\n    type: 'File'\n    program:\n      type: 'Program'\n      body: []\n      directives: [\n        type: 'Directive'\n        value:\n          type: 'DirectiveLiteral'\n          value: 'use strict'\n          extra:\n            raw: \"'use strict'\"\n      ]\n\n  testStatement '''\n    class A\n      'classes can have directives too'\n      a: ->\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      type: 'ClassBody'\n      body: [\n        type: 'ClassMethod'\n      ]\n      directives: [\n        type: 'Directive'\n        value:\n          type: 'DirectiveLiteral'\n          value: 'classes can have directives too'\n      ]\n\n  testStatement '''\n    if a\n      \"but other blocks can't\"\n      b\n  ''',\n    type: 'IfStatement'\n    consequent:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: STRING \"but other blocks can't\"\n      ,\n        type: 'ExpressionStatement'\n        expression: ID 'b'\n      ]\n      directives: []\n\n  testExpression '''\n    ->\n      \"\"\"not a directive\"\"\"\n      b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'TemplateLiteral'\n      ,\n        type: 'ExpressionStatement'\n        expression: ID 'b'\n      ]\n      directives: []\n\n  testExpression '''\n    ->\n      # leading comment\n      'use strict'\n      b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'b'\n      ]\n      directives: [\n        type: 'Directive'\n        value:\n          type: 'DirectiveLiteral'\n          value: 'use strict'\n          extra:\n            raw: \"'use strict'\"\n      ]\n\ntest \"AST as expected for comments\", ->\n  testComments '''\n    a # simple line comment\n  ''', [\n    type: 'CommentLine'\n    value: ' simple line comment'\n  ]\n\n  testComments '''\n    a ### simple here comment ###\n  ''', [\n    type: 'CommentBlock'\n    value: ' simple here comment '\n  ]\n\n  testComments '''\n    # just a line comment\n  ''', [\n    type: 'CommentLine'\n    value: ' just a line comment'\n  ]\n\n  testComments '''\n    ### just a here comment ###\n  ''', [\n    type: 'CommentBlock'\n    value: ' just a here comment '\n  ]\n\n  testComments '''\n    \"#{\n      # empty interpolation line comment\n     }\"\n  ''', [\n    type: 'CommentLine'\n    value: ' empty interpolation line comment'\n  ]\n\n  testComments '''\n    \"#{\n      ### empty interpolation block comment ###\n     }\"\n  ''', [\n    type: 'CommentBlock'\n    value: ' empty interpolation block comment '\n  ]\n\n  testComments '''\n    # multiple line comments\n    # on consecutive lines\n  ''', [\n    type: 'CommentLine'\n    value: ' multiple line comments'\n  ,\n    type: 'CommentLine'\n    value: ' on consecutive lines'\n  ]\n\n  testComments '''\n    # multiple line comments\n\n    # with blank line\n  ''', [\n    type: 'CommentLine'\n    value: ' multiple line comments'\n  ,\n    type: 'CommentLine'\n    value: ' with blank line'\n  ]\n\n  testComments '''\n    #no whitespace line comment\n  ''', [\n    type: 'CommentLine'\n    value: 'no whitespace line comment'\n  ]\n\n  testComments '''\n    ###no whitespace here comment###\n  ''', [\n    type: 'CommentBlock'\n    value: 'no whitespace here comment'\n  ]\n\n  testComments '''\n    ###\n    # multiline\n    # here comment\n    ###\n  ''', [\n    type: 'CommentBlock'\n    value: '\\n# multiline\\n# here comment\\n'\n  ]\n\n  testComments '''\n    if b\n      ###\n      # multiline\n      # indented here comment\n      ###\n      c\n  ''', [\n    type: 'CommentBlock'\n    value: '\\n  # multiline\\n  # indented here comment\\n  '\n  ]\n\n  testComments '''\n    if foo\n      ;\n      ### empty ###\n  ''', [\n    type: 'CommentBlock'\n    value: ' empty '\n  ]\n\ntest \"AST as expected for chained comparisons\", ->\n  testExpression '''\n    a < b < c\n  ''',\n    type: 'ChainedComparison'\n    operands: [\n      ID 'a'\n      ID 'b'\n      ID 'c'\n    ]\n    operators: [\n      '<'\n      '<'\n    ]\n\n  testExpression '''\n    a isnt b is c isnt d\n  ''',\n    type: 'ChainedComparison'\n    operands: [\n      ID 'a'\n      ID 'b'\n      ID 'c'\n      ID 'd'\n    ]\n    operators: [\n      'isnt'\n      'is'\n      'isnt'\n    ]\n\n  testExpression '''\n    a >= b < c\n  ''',\n    type: 'ChainedComparison'\n    operands: [\n      ID 'a'\n      ID 'b'\n      ID 'c'\n    ]\n    operators: [\n      '>='\n      '<'\n    ]\n\ntest \"AST as expected for Sequence\", ->\n  testExpression '''\n    (a; b)\n  ''',\n    type: 'SequenceExpression'\n    expressions: [\n      ID 'a'\n      ID 'b'\n    ]\n\n  testExpression '''\n    (a; b)\"\"\n  ''',\n    type: 'TaggedTemplateExpression'\n    tag:\n      type: 'SequenceExpression'\n      expressions: [\n        ID 'a'\n        ID 'b'\n      ]\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"abstract_syntax_tree_location_data\">\n# Astract Syntax Tree location data\n# ---------------------------------\n\ntestAstLocationData = (code, expected) ->\n  testAstNodeLocationData getAstExpressionOrStatement(code), expected\n\ntestAstRootLocationData = (code, expected) ->\n  testAstNodeLocationData getAstRoot(code), expected\n\ntestAstNodeLocationData = (node, expected, path = '') ->\n  extendPath = (additionalPath) ->\n    return additionalPath unless path\n    \"#{path}.#{additionalPath}\"\n  ok node?, \"Missing expected node at '#{path}'\"\n  testSingleNodeLocationData node, expected, path if expected.range?\n  for own key, expectedChild of expected when key not in ['start', 'end', 'range', 'loc']\n    if Array.isArray expectedChild\n      ok Array.isArray(node[key]), \"Missing expected array at '#{extendPath key}'\"\n      for expectedItem, index in expectedChild when expectedItem?\n        testAstNodeLocationData node[key][index], expectedItem, extendPath \"#{key}[#{index}]\"\n    else if typeof expectedChild is 'object'\n      testAstNodeLocationData node[key], expectedChild, extendPath(key)\n\ntestSingleNodeLocationData = (node, expected, path = '') ->\n  # Even though it’s not part of the location data, check the type to ensure\n  # that we’re testing the node we think we are.\n  if expected.type?\n    eq node.type, expected.type, \\\n      \"Expected AST node type #{reset}#{node.type}#{red} to equal #{reset}#{expected.type}#{red}\"\n\n  eq node.start, expected.start, \\\n    \"Expected #{path}.start: #{reset}#{node.start}#{red} to equal #{reset}#{expected.start}#{red}\"\n  eq node.end, expected.end, \\\n    \"Expected #{path}.end: #{reset}#{node.end}#{red} to equal #{reset}#{expected.end}#{red}\"\n  arrayEq node.range, expected.range, \\\n    \"Expected #{path}.range: #{reset}#{JSON.stringify node.range}#{red} to equal #{reset}#{JSON.stringify expected.range}#{red}\"\n  eq node.loc.start.line, expected.loc.start.line, \\\n    \"Expected #{path}.loc.start.line: #{reset}#{node.loc.start.line}#{red} to equal #{reset}#{expected.loc.start.line}#{red}\"\n  eq node.loc.start.column, expected.loc.start.column, \\\n    \"Expected #{path}.loc.start.column: #{reset}#{node.loc.start.column}#{red} to equal #{reset}#{expected.loc.start.column}#{red}\"\n  eq node.loc.end.line, expected.loc.end.line, \\\n    \"Expected #{path}.loc.end.line: #{reset}#{node.loc.end.line}#{red} to equal #{reset}#{expected.loc.end.line}#{red}\"\n  eq node.loc.end.column, expected.loc.end.column, \\\n    \"Expected #{path}.loc.end.column: #{reset}#{node.loc.end.column}#{red} to equal #{reset}#{expected.loc.end.column}#{red}\"\n\ntestAstCommentsLocationData = (code, expected) ->\n  testAstNodeLocationData getAstRoot(code).comments, expected\n\nif require?\n  {mergeAstLocationData, mergeLocationData} = require './../lib/coffeescript/nodes'\n\n  test \"the `mergeAstLocationData` helper accepts `justLeading` and `justEnding` options\", ->\n    first =\n      range: [4, 5]\n      start: 4\n      end: 5\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    second =\n      range: [1, 10]\n      start: 1\n      end: 10\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 2\n          column: 2\n    testSingleNodeLocationData mergeAstLocationData(first, second), second\n    testSingleNodeLocationData mergeAstLocationData(first, second, justLeading: yes),\n      range: [1, 5]\n      start: 1\n      end: 5\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 5\n    testSingleNodeLocationData mergeAstLocationData(first, second, justEnding: yes),\n      range: [4, 10]\n      start: 4\n      end: 10\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 2\n          column: 2\n\n  test \"the `mergeLocationData` helper accepts `justLeading` and `justEnding` options\", ->\n    testLocationData = (node, expected) ->\n      arrayEq node.range, expected.range\n      for field in ['first_line', 'first_column', 'last_line', 'last_column']\n        eq node[field], expected[field]\n\n    first =\n      range: [4, 5]\n      first_line: 0\n      first_column: 4\n      last_line: 0\n      last_column: 4\n    second =\n      range: [1, 10]\n      first_line: 0\n      first_column: 1\n      last_line: 1\n      last_column: 2\n\n    testLocationData mergeLocationData(first, second), second\n    testLocationData mergeLocationData(first, second, justLeading: yes),\n      range: [1, 5]\n      first_line: 0\n      first_column: 1\n      last_line: 0\n      last_column: 4\n    testLocationData mergeLocationData(first, second, justEnding: yes),\n      range: [4, 10]\n      first_line: 0\n      first_column: 4\n      last_line: 1\n      last_column: 2\n\ntest \"AST location data as expected for NumberLiteral node\", ->\n  testAstLocationData '42',\n    type: 'NumericLiteral'\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 2\n\ntest \"AST location data as expected for InfinityLiteral node\", ->\n  testAstLocationData 'Infinity',\n    type: 'Identifier'\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData '2e308',\n    type: 'NumericLiteral'\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\ntest \"AST location data as expected for NaNLiteral node\", ->\n  testAstLocationData 'NaN',\n    type: 'Identifier'\n    start: 0\n    end: 3\n    range: [0, 3]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 3\n\ntest \"AST location data as expected for IdentifierLiteral node\", ->\n  testAstLocationData 'id',\n    type: 'Identifier'\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 2\n\ntest \"AST location data as expected for StatementLiteral node\", ->\n  testAstLocationData 'break',\n    type: 'BreakStatement'\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData 'continue',\n    type: 'ContinueStatement'\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData 'debugger',\n    type: 'DebuggerStatement'\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\ntest \"AST location data as expected for ThisLiteral node\", ->\n  testAstLocationData 'this',\n    type: 'ThisExpression'\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\ntest \"AST location data as expected for UndefinedLiteral node\", ->\n  testAstLocationData 'undefined',\n    type: 'Identifier'\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\ntest \"AST location data as expected for NullLiteral node\", ->\n  testAstLocationData 'null',\n    type: 'NullLiteral'\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\ntest \"AST location data as expected for BooleanLiteral node\", ->\n  testAstLocationData 'true',\n    type: 'BooleanLiteral'\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\ntest \"AST location data as expected for Access node\", ->\n  testAstLocationData 'obj.prop',\n    type: 'MemberExpression'\n    object:\n      start: 0\n      end: 3\n      range: [0, 3]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 3\n    property:\n      start: 4\n      end: 8\n      range: [4, 8]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 8\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData 'a::b',\n    type: 'MemberExpression'\n    object:\n      object:\n        start: 0\n        end: 1\n        range: [0, 1]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 1\n      property:\n        start: 1\n        end: 3\n        range: [1, 3]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 3\n    property:\n      start: 3\n      end: 4\n      range: [3, 4]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 4\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\n  testAstLocationData '''\n    (\n      obj\n    ).prop\n  ''',\n    type: 'MemberExpression'\n    object:\n      start: 4\n      end: 7\n      range: [4, 7]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 5\n    property:\n      start: 10\n      end: 14\n      range: [10, 14]\n      loc:\n        start:\n          line: 3\n          column: 2\n        end:\n          line: 3\n          column: 6\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 6\n\ntest \"AST location data as expected for Index node\", ->\n  testAstLocationData 'a[b]',\n    type: 'MemberExpression'\n    object:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    property:\n      start: 2\n      end: 3\n      range: [2, 3]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 3\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\n  testAstLocationData 'a?[b][3]',\n    type: 'OptionalMemberExpression'\n    object:\n      object:\n        start: 0\n        end: 1\n        range: [0, 1]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 1\n      property:\n        start: 3\n        end: 4\n        range: [3, 4]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 4\n      start: 0\n      end: 5\n      range: [0, 5]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 5\n    property:\n      start: 6\n      end: 7\n      range: [6, 7]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 7\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\ntest \"AST location data as expected for Parens node\", ->\n  testAstLocationData '(hmmmmm)',\n    type: 'Identifier'\n    start: 1\n    end: 7\n    range: [1, 7]\n    loc:\n      start:\n        line: 1\n        column: 1\n      end:\n        line: 1\n        column: 7\n\n  testAstLocationData '(((1)))',\n    type: 'NumericLiteral'\n    start: 3\n    end: 4\n    range: [3, 4]\n    loc:\n      start:\n        line: 1\n        column: 3\n      end:\n        line: 1\n        column: 4\n\ntest \"AST location data as expected for Op node\", ->\n  testAstLocationData '1 <= 2',\n    type: 'BinaryExpression'\n    left:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    right:\n      start: 5\n      end: 6\n      range: [5, 6]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 6\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData '!x',\n    type: 'UnaryExpression'\n    argument:\n      start: 1\n      end: 2\n      range: [1, 2]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 2\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 2\n\n  testAstLocationData 'not x',\n    type: 'UnaryExpression'\n    argument:\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData 'x++',\n    type: 'UpdateExpression'\n    argument:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    start: 0\n    end: 3\n    range: [0, 3]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 3\n\n  testAstLocationData '(x + y) * z',\n    type: 'BinaryExpression'\n    left:\n      left:\n        start: 1\n        end: 2\n        range: [1, 2]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 2\n      right:\n        start: 5\n        end: 6\n        range: [5, 6]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 6\n      start: 1\n      end: 6\n      range: [1, 6]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 6\n    right:\n      start: 10\n      end: 11\n      range: [10, 11]\n      loc:\n        start:\n          line: 1\n          column: 10\n        end:\n          line: 1\n          column: 11\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\ntest \"AST location data as expected for Call node\", ->\n  testAstLocationData 'fn()',\n    type: 'CallExpression'\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n    callee:\n      start: 0\n      end: 2\n      range: [0, 2]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 2\n\n  testAstLocationData 'new Date()',\n    type: 'NewExpression'\n    start: 0\n    end: 10\n    range: [0, 10]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 10\n    callee:\n      start: 4\n      end: 8\n      range: [4, 8]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 8\n\n  testAstLocationData '''\n    new Old(\n      1\n    )\n  ''',\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 1\n    type: 'NewExpression'\n    arguments: [\n      start: 11\n      end: 12\n      range: [11, 12]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 3\n    ]\n\n  testAstLocationData 'maybe? 1 + 1',\n    type: 'OptionalCallExpression'\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 12\n    arguments: [\n      start: 7\n      end: 12\n      range: [7, 12]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 12\n    ]\n\n  testAstLocationData '''\n    goDo(this,\n      that)\n  ''',\n    type: 'CallExpression'\n    start: 0\n    end: 18\n    range: [0, 18]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 7\n    arguments: [\n      start: 5\n      end: 9\n      range: [5, 9]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 9\n    ,\n      start: 13\n      end: 17\n      range: [13, 17]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 6\n    ]\n\n  testAstLocationData 'new Old',\n    type: 'NewExpression'\n    callee:\n      start: 4\n      end: 7\n      range: [4, 7]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 7\n    start: 0\n    end: 7\n    range: [0, 7]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 7\n\ntest \"AST location data as expected for SuperCall node\", ->\n  testAstLocationData 'class child extends parent then constructor: -> super()',\n    type: 'ClassDeclaration'\n    body:\n      body: [\n        body:\n          body: [\n            expression:\n              callee:\n                start: 48\n                end: 53\n                range: [48, 53]\n                loc:\n                  start:\n                    line: 1\n                    column: 48\n                  end:\n                    line: 1\n                    column: 53\n              start: 48\n              end: 55\n              range: [48, 55]\n              loc:\n                start:\n                  line: 1\n                  column: 48\n                end:\n                  line: 1\n                  column: 55\n          ]\n      ]\n    start: 0\n    end: 55\n    range: [0, 55]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 55\n\ntest \"AST location data as expected for Super node\", ->\n  testAstLocationData '''\n    class child extends parent\n      func: ->\n        super[prop]()\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      body: [\n        body:\n          body: [\n            expression:\n              callee:\n                object:\n                  start: 42\n                  end: 47\n                  range: [42, 47]\n                  loc:\n                    start:\n                      line: 3\n                      column: 4\n                    end:\n                      line: 3\n                      column: 9\n                property:\n                  start: 48\n                  end: 52\n                  range: [48, 52]\n                  loc:\n                    start:\n                      line: 3\n                      column: 10\n                    end:\n                      line: 3\n                      column: 14\n                start: 42\n                end: 53\n                range: [42, 53]\n                loc:\n                  start:\n                    line: 3\n                    column: 4\n                  end:\n                    line: 3\n                    column: 15\n              start: 42\n              end: 55\n              range: [42, 55]\n              loc:\n                start:\n                  line: 3\n                  column: 4\n                end:\n                  line: 3\n                  column: 17\n          ]\n      ]\n    start: 0\n    end: 55\n    range: [0, 55]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 17\n\ntest \"AST location data as expected for Range node\", ->\n  testAstLocationData '[x..y]',\n    type: 'Range'\n    from:\n      start: 1\n      end: 2\n      range: [1, 2]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 2\n    to:\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData '[4...2]',\n    type: 'Range'\n    from:\n      start: 1\n      end: 2\n      range: [1, 2]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 2\n    to:\n      start: 5\n      end: 6\n      range: [5, 6]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 6\n    start: 0\n    end: 7\n    range: [0, 7]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 7\n\ntest \"AST location data as expected for Slice node\", ->\n  testAstLocationData 'x[..y]',\n    property:\n      to:\n        start: 4\n        end: 5\n        range: [4, 5]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 1\n            column: 5\n      start: 2\n      end: 5\n      range: [2, 5]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData 'x[y...z]',\n    property:\n      start: 2\n      end: 7\n      range: [2, 7]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 7\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData 'x[...]',\n    property:\n      start: 2\n      end: 5\n      range: [2, 5]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\ntest \"AST location data as expected for Splat node\", ->\n  testAstLocationData '[a...]',\n    type: 'ArrayExpression'\n    elements: [\n      argument:\n        start: 1\n        end: 2\n        range: [1, 2]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 2\n      start: 1\n      end: 5\n      range: [1, 5]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 5\n    ]\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData '[b, ...c]',\n    type: 'ArrayExpression'\n    elements: [\n      {}\n    ,\n      argument:\n        start: 7\n        end: 8\n        range: [7, 8]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 8\n      start: 4\n      end: 8\n      range: [4, 8]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 8\n    ]\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\ntest \"AST location data as expected for Elision node\", ->\n  testAstLocationData '[,,,a,, ,b]',\n    type: 'ArrayExpression'\n    elements: [\n      null,,,\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    ,,,\n      start: 9\n      end: 10\n      range: [9, 10]\n      loc:\n        start:\n          line: 1\n          column: 9\n        end:\n          line: 1\n          column: 10\n    ]\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\ntest \"AST location data as expected for ModuleDeclaration node\", ->\n  testAstLocationData 'export {X}',\n    type: 'ExportNamedDeclaration'\n    specifiers: [\n      local:\n        start: 8\n        end: 9\n        range: [8, 9]\n        loc:\n          start:\n            line: 1\n            column: 8\n          end:\n            line: 1\n            column: 9\n      exported:\n        start: 8\n        end: 9\n        range: [8, 9]\n        loc:\n          start:\n            line: 1\n            column: 8\n          end:\n            line: 1\n            column: 9\n      start: 8\n      end: 9\n      range: [8, 9]\n      loc:\n        start:\n          line: 1\n          column: 8\n        end:\n          line: 1\n          column: 9\n    ]\n    start: 0\n    end: 10\n    range: [0, 10]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 10\n\n  testAstLocationData 'import X from \".\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      start: 7\n      end: 8\n      range: [7, 8]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 8\n    ]\n    source:\n      start: 14\n      end: 17\n      range: [14, 17]\n      loc:\n        start:\n          line: 1\n          column: 14\n        end:\n          line: 1\n          column: 17\n    start: 0\n    end: 17\n    range: [0, 17]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 17\n\ntest \"AST location data as expected for ImportDeclaration node\", ->\n  testAstLocationData '''\n    import React, {\n      Component\n    } from \"react\"\n  ''',\n    type: 'ImportDeclaration'\n    specifiers: [\n      start: 7\n      end: 12\n      range: [7, 12]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 12\n    ,\n      imported:\n        start: 18\n        end: 27\n        range: [18, 27]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 11\n      start: 18\n      end: 27\n      range: [18, 27]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 11\n    ]\n    source:\n      start: 35\n      end: 42\n      range: [35, 42]\n      loc:\n        start:\n          line: 3\n          column: 7\n        end:\n          line: 3\n          column: 14\n    start: 0\n    end: 42\n    range: [0, 42]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 14\n\ntest \"AST location data as expected for ExportNamedDeclaration node\", ->\n  testAstLocationData 'export {}',\n    type: 'ExportNamedDeclaration'\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\n  testAstLocationData 'export fn = ->',\n    type: 'ExportNamedDeclaration'\n    declaration:\n      left:\n        start: 7\n        end: 9\n        range: [7, 9]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 9\n      right:\n        start: 12\n        end: 14\n        range: [12, 14]\n        loc:\n          start:\n            line: 1\n            column: 12\n          end:\n            line: 1\n            column: 14\n      start: 7\n      end: 14\n      range: [7, 14]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 14\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 14\n\n  testAstLocationData 'export class A',\n    type: 'ExportNamedDeclaration'\n    declaration:\n      id:\n        start: 13\n        end: 14\n        range: [13, 14]\n        loc:\n          start:\n            line: 1\n            column: 13\n          end:\n            line: 1\n            column: 14\n      start: 7\n      end: 14\n      range: [7, 14]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 14\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 14\n\n  testAstLocationData '''\n    export {\n      x as y\n      z as default\n      }\n  ''',\n    type: 'ExportNamedDeclaration'\n    specifiers: [\n      local:\n        start: 11\n        end: 12\n        range: [11, 12]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 3\n      exported:\n        start: 16\n        end: 17\n        range: [16, 17]\n        loc:\n          start:\n            line: 2\n            column: 7\n          end:\n            line: 2\n            column: 8\n      start: 11\n      end: 17\n      range: [11, 17]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 8\n    ,\n      local:\n        start: 20\n        end: 21\n        range: [20, 21]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 3\n      exported:\n        start: 25\n        end: 32\n        range: [25, 32]\n        loc:\n          start:\n            line: 3\n            column: 7\n          end:\n            line: 3\n            column: 14\n      start: 20\n      end: 32\n      range: [20, 32]\n      loc:\n        start:\n          line: 3\n          column: 2\n        end:\n          line: 3\n          column: 14\n    ]\n    start: 0\n    end: 36\n    range: [0, 36]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n\n  testAstLocationData 'export {default, default as b} from \"./abc\"',\n    type: 'ExportNamedDeclaration'\n    specifiers: [\n      local:\n        start: 8\n        end: 15\n        range: [8, 15]\n        loc:\n          start:\n            line: 1\n            column: 8\n          end:\n            line: 1\n            column: 15\n      start: 8\n      end: 15\n      range: [8, 15]\n      loc:\n        start:\n          line: 1\n          column: 8\n        end:\n          line: 1\n          column: 15\n    ,\n      local:\n        start: 17\n        end: 24\n        range: [17, 24]\n        loc:\n          start:\n            line: 1\n            column: 17\n          end:\n            line: 1\n            column: 24\n      exported:\n        start: 28\n        end: 29\n        range: [28, 29]\n        loc:\n          start:\n            line: 1\n            column: 28\n          end:\n            line: 1\n            column: 29\n      start: 17\n      end: 29\n      range: [17, 29]\n      loc:\n        start:\n          line: 1\n          column: 17\n        end:\n          line: 1\n          column: 29\n    ]\n    source:\n      start: 36\n      end: 43\n      range: [36, 43]\n      loc:\n        start:\n          line: 1\n          column: 36\n        end:\n          line: 1\n          column: 43\n    start: 0\n    end: 43\n    range: [0, 43]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 43\n\ntest \"AST location data as expected for ExportDefaultDeclaration node\", ->\n  testAstLocationData 'export default class',\n    type: 'ExportDefaultDeclaration'\n    declaration:\n      start: 15\n      end: 20\n      range: [15, 20]\n      loc:\n        start:\n          line: 1\n          column: 15\n        end:\n          line: 1\n          column: 20\n    start: 0\n    end: 20\n    range: [0, 20]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 20\n\n  testAstLocationData 'export default \"abc\"',\n    type: 'ExportDefaultDeclaration'\n    declaration:\n      start: 15\n      end: 20\n      range: [15, 20]\n      loc:\n        start:\n          line: 1\n          column: 15\n        end:\n          line: 1\n          column: 20\n    start: 0\n    end: 20\n    range: [0, 20]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 20\n\ntest \"AST location data as expected for ExportAllDeclaration node\", ->\n  testAstLocationData 'export * from \"module-name\"',\n    type: 'ExportAllDeclaration'\n    source:\n      start: 14\n      end: 27\n      range: [14, 27]\n      loc:\n        start:\n          line: 1\n          column: 14\n        end:\n          line: 1\n          column: 27\n    start: 0\n    end: 27\n    range: [0, 27]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 27\n\ntest \"AST location data as expected for ImportDefaultSpecifier node\", ->\n  testAstLocationData 'import React from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      start: 7\n      end: 12\n      range: [7, 12]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 12\n    ]\n    source:\n      start: 18\n      end: 25\n      range: [18, 25]\n      loc:\n        start:\n          line: 1\n          column: 18\n        end:\n          line: 1\n          column: 25\n    start: 0\n    end: 25\n    range: [0, 25]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 25\n\ntest \"AST location data as expected for ImportNamespaceSpecifier node\", ->\n  testAstLocationData 'import * as React from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      start: 7\n      end: 17\n      range: [7, 17]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 17\n    ]\n    source:\n      start: 23\n      end: 30\n      range: [23, 30]\n      loc:\n        start:\n          line: 1\n          column: 23\n        end:\n          line: 1\n          column: 30\n    start: 0\n    end: 30\n    range: [0, 30]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 30\n\n  testAstLocationData 'import React, * as ReactStar from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      start: 7\n      end: 12\n      range: [7, 12]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 12\n    ,\n      local:\n        start: 19\n        end: 28\n        range: [19, 28]\n        loc:\n          start:\n            line: 1\n            column: 19\n          end:\n            line: 1\n            column: 28\n      start: 14\n      end: 28\n      range: [14, 28]\n      loc:\n        start:\n          line: 1\n          column: 14\n        end:\n          line: 1\n          column: 28\n    ]\n    source:\n      start: 34\n      end: 41\n      range: [34, 41]\n      loc:\n        start:\n          line: 1\n          column: 34\n        end:\n          line: 1\n          column: 41\n    start: 0\n    end: 41\n    range: [0, 41]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 41\n\ntest \"AST location data as expected for Obj node\", ->\n  testAstLocationData \"{a: 1, b, [c], @d, [e()]: f, 'g': 2, ...h, i...}\",\n    type: 'ObjectExpression'\n    properties: [\n      key:\n        start: 1\n        end: 2\n        range: [1, 2]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 2\n      value:\n        start: 4\n        end: 5\n        range: [4, 5]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 1\n            column: 5\n      start: 1\n      end: 5\n      range: [1, 5]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 5\n    ,\n      key:\n        start: 7\n        end: 8\n        range: [7, 8]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 8\n      value:\n        start: 7\n        end: 8\n        range: [7, 8]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 8\n      start: 7\n      end: 8\n      range: [7, 8]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 8\n    ,\n      key:\n        start: 11\n        end: 12\n        range: [11, 12]\n        loc:\n          start:\n            line: 1\n            column: 11\n          end:\n            line: 1\n            column: 12\n      value:\n        start: 11\n        end: 12\n        range: [11, 12]\n        loc:\n          start:\n            line: 1\n            column: 11\n          end:\n            line: 1\n            column: 12\n      start: 10\n      end: 13\n      range: [10, 13]\n      loc:\n        start:\n          line: 1\n          column: 10\n        end:\n          line: 1\n          column: 13\n    ,\n      key:\n        object:\n          start: 15\n          end: 16\n          range: [15, 16]\n          loc:\n            start:\n              line: 1\n              column: 15\n            end:\n              line: 1\n              column: 16\n        property:\n          start: 16\n          end: 17\n          range: [16, 17]\n          loc:\n            start:\n              line: 1\n              column: 16\n            end:\n              line: 1\n              column: 17\n        start: 15\n        end: 17\n        range: [15, 17]\n        loc:\n          start:\n            line: 1\n            column: 15\n          end:\n            line: 1\n            column: 17\n      value:\n        object:\n          start: 15\n          end: 16\n          range: [15, 16]\n          loc:\n            start:\n              line: 1\n              column: 15\n            end:\n              line: 1\n              column: 16\n        property:\n          start: 16\n          end: 17\n          range: [16, 17]\n          loc:\n            start:\n              line: 1\n              column: 16\n            end:\n              line: 1\n              column: 17\n        start: 15\n        end: 17\n        range: [15, 17]\n        loc:\n          start:\n            line: 1\n            column: 15\n          end:\n            line: 1\n            column: 17\n      start: 15\n      end: 17\n      range: [15, 17]\n      loc:\n        start:\n          line: 1\n          column: 15\n        end:\n          line: 1\n          column: 17\n    ,\n      key:\n        start: 20\n        end: 23\n        range: [20, 23]\n        loc:\n          start:\n            line: 1\n            column: 20\n          end:\n            line: 1\n            column: 23\n      value:\n        start: 26\n        end: 27\n        range: [26, 27]\n        loc:\n          start:\n            line: 1\n            column: 26\n          end:\n            line: 1\n            column: 27\n      start: 19\n      end: 27\n      range: [19, 27]\n      loc:\n        start:\n          line: 1\n          column: 19\n        end:\n          line: 1\n          column: 27\n    ,\n      key:\n        start: 29\n        end: 32\n        range: [29, 32]\n        loc:\n          start:\n            line: 1\n            column: 29\n          end:\n            line: 1\n            column: 32\n      value:\n        start: 34\n        end: 35\n        range: [34, 35]\n        loc:\n          start:\n            line: 1\n            column: 34\n          end:\n            line: 1\n            column: 35\n      start: 29\n      end: 35\n      range: [29, 35]\n      loc:\n        start:\n          line: 1\n          column: 29\n        end:\n          line: 1\n          column: 35\n    ,\n      argument:\n        start: 40\n        end: 41\n        range: [40, 41]\n        loc:\n          start:\n            line: 1\n            column: 40\n          end:\n            line: 1\n            column: 41\n      start: 37\n      end: 41\n      range: [37, 41]\n      loc:\n        start:\n          line: 1\n          column: 37\n        end:\n          line: 1\n          column: 41\n    ,\n      argument:\n        start: 43\n        end: 44\n        range: [43, 44]\n        loc:\n          start:\n            line: 1\n            column: 43\n          end:\n            line: 1\n            column: 44\n      start: 43\n      end: 47\n      range: [43, 47]\n      loc:\n        start:\n          line: 1\n          column: 43\n        end:\n          line: 1\n          column: 47\n    ]\n    start: 0\n    end: 48\n    range: [0, 48]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 48\n\n  testAstLocationData 'a: 1',\n    type: 'ObjectExpression'\n    properties: [\n      key:\n        start: 0\n        end: 1\n        range: [0, 1]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 1\n      value:\n        start: 3\n        end: 4\n        range: [3, 4]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 4\n      start: 0\n      end: 4\n      range: [0, 4]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 4\n    ]\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\ntest \"AST location data as expected for Assign node\", ->\n  testAstLocationData 'a = b',\n    type: 'AssignmentExpression'\n    left:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    right:\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData 'a += b',\n    type: 'AssignmentExpression'\n    left:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    right:\n      start: 5\n      end: 6\n      range: [5, 6]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 6\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData '{a: [...b]} = c',\n    type: 'AssignmentExpression'\n    left:\n      properties: [\n        type: 'ObjectProperty'\n        key:\n          start: 1\n          end: 2\n          range: [1, 2]\n          loc:\n            start:\n              line: 1\n              column: 1\n            end:\n              line: 1\n              column: 2\n        value:\n          elements: [\n            start: 5\n            end: 9\n            range: [5, 9]\n            loc:\n              start:\n                line: 1\n                column: 5\n              end:\n                line: 1\n                column: 9\n          ]\n          start: 4\n          end: 10\n          range: [4, 10]\n          loc:\n            start:\n              line: 1\n              column: 4\n            end:\n              line: 1\n              column: 10\n        start: 1\n        end: 10\n        range: [1, 10]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 10\n      ]\n      start: 0\n      end: 11\n      range: [0, 11]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 11\n    right:\n      start: 14\n      end: 15\n      range: [14, 15]\n      loc:\n        start:\n          line: 1\n          column: 14\n        end:\n          line: 1\n          column: 15\n    start: 0\n    end: 15\n    range: [0, 15]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 15\n\ntest \"AST location data as expected for Expansion node\", ->\n  testAstLocationData '[..., b] = c',\n    type: 'AssignmentExpression'\n    left:\n      elements: [\n        start: 1\n        end: 4\n        range: [1, 4]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 4\n      ]\n      start: 0\n      end: 8\n      range: [0, 8]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 8\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 12\n\ntest \"AST location data as expected for Throw node\", ->\n  testAstLocationData 'throw new BallError \"catch\"',\n    type: 'ThrowStatement'\n    argument:\n      start: 6\n      end: 27\n      range: [6, 27]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 27\n    start: 0\n    end: 27\n    range: [0, 27]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 27\n\ntest \"AST location data as expected for Existence node\", ->\n  testAstLocationData 'Ghosts?',\n    type: 'UnaryExpression'\n    argument:\n      start: 0\n      end: 6\n      range: [0, 6]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 6\n    start: 0\n    end: 7\n    range: [0, 7]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 7\n\ntest \"AST location data as expected for JSXTag node\", ->\n  testAstLocationData '<CSXY />',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        start: 1\n        end: 5\n        range: [1, 5]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 5\n      start: 0\n      end: 8\n      range: [0, 8]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 8\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData '<div></div>',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        start: 1\n        end: 4\n        range: [1, 4]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 4\n      start: 0\n      end: 5\n      range: [0, 5]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 5\n    closingElement:\n      name:\n        start: 7\n        end: 10\n        range: [7, 10]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 10\n      start: 5\n      end: 11\n      range: [5, 11]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 11\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\n  testAstLocationData '<A.B />',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        object:\n          start: 1\n          end: 2\n          range: [1, 2]\n          loc:\n            start:\n              line: 1\n              column: 1\n            end:\n              line: 1\n              column: 2\n        property:\n          start: 3\n          end: 4\n          range: [3, 4]\n          loc:\n            start:\n              line: 1\n              column: 3\n            end:\n              line: 1\n              column: 4\n        start: 1\n        end: 4\n        range: [1, 4]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 4\n      start: 0\n      end: 7\n      range: [0, 7]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 7\n    start: 0\n    end: 7\n    range: [0, 7]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 7\n\n  testAstLocationData '<Tag.Name.Here></Tag.Name.Here>',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        object:\n          object:\n            start: 1\n            end: 4\n            range: [1, 4]\n            loc:\n              start:\n                line: 1\n                column: 1\n              end:\n                line: 1\n                column: 4\n          property:\n            start: 5\n            end: 9\n            range: [5, 9]\n            loc:\n              start:\n                line: 1\n                column: 5\n              end:\n                line: 1\n                column: 9\n          start: 1\n          end: 9\n          range: [1, 9]\n          loc:\n            start:\n              line: 1\n              column: 1\n            end:\n              line: 1\n              column: 9\n        property:\n          start: 10\n          end: 14\n          range: [10, 14]\n          loc:\n            start:\n              line: 1\n              column: 10\n            end:\n              line: 1\n              column: 14\n        start: 1\n        end: 14\n        range: [1, 14]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 14\n      start: 0\n      end: 15\n      range: [0, 15]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 15\n    closingElement:\n      name:\n        object:\n          object:\n            start: 17\n            end: 20\n            range: [17, 20]\n            loc:\n              start:\n                line: 1\n                column: 17\n              end:\n                line: 1\n                column: 20\n          property:\n            start: 21\n            end: 25\n            range: [21, 25]\n            loc:\n              start:\n                line: 1\n                column: 21\n              end:\n                line: 1\n                column: 25\n          start: 17\n          end: 25\n          range: [17, 25]\n          loc:\n            start:\n              line: 1\n              column: 17\n            end:\n              line: 1\n              column: 25\n        property:\n          start: 26\n          end: 30\n          range: [26, 30]\n          loc:\n            start:\n              line: 1\n              column: 26\n            end:\n              line: 1\n              column: 30\n        start: 17\n        end: 30\n        range: [17, 30]\n        loc:\n          start:\n            line: 1\n            column: 17\n          end:\n            line: 1\n            column: 30\n      start: 15\n      end: 31\n      range: [15, 31]\n      loc:\n        start:\n          line: 1\n          column: 15\n        end:\n          line: 1\n          column: 31\n    start: 0\n    end: 31\n    range: [0, 31]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 31\n\n  testAstLocationData '<></>',\n    type: 'JSXFragment'\n    openingFragment:\n      start: 0\n      end: 2\n      range: [0, 2]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 2\n    closingFragment:\n      start: 2\n      end: 5\n      range: [2, 5]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData '''\n    <div\n      a\n      b=\"c\"\n      d={e}\n      {...f}\n    />\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        start: 1\n        end: 4\n        range: [1, 4]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 4\n      attributes: [\n        name:\n          start: 7\n          end: 8\n          range: [7, 8]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 3\n        start: 7\n        end: 8\n        range: [7, 8]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 3\n      ,\n        name:\n          start: 11\n          end: 12\n          range: [11, 12]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 3\n        value:\n          start: 13\n          end: 16\n          range: [13, 16]\n          loc:\n            start:\n              line: 3\n              column: 4\n            end:\n              line: 3\n              column: 7\n        start: 11\n        end: 16\n        range: [11, 16]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 7\n      ,\n        name:\n          start: 19\n          end: 20\n          range: [19, 20]\n          loc:\n            start:\n              line: 4\n              column: 2\n            end:\n              line: 4\n              column: 3\n        value:\n          expression:\n            start: 22\n            end: 23\n            range: [22, 23]\n            loc:\n              start:\n                line: 4\n                column: 5\n              end:\n                line: 4\n                column: 6\n          start: 21\n          end: 24\n          range: [21, 24]\n          loc:\n            start:\n              line: 4\n              column: 4\n            end:\n              line: 4\n              column: 7\n        start: 19\n        end: 24\n        range: [19, 24]\n        loc:\n          start:\n            line: 4\n            column: 2\n          end:\n            line: 4\n            column: 7\n      ,\n        argument:\n          start: 31\n          end: 32\n          range: [31, 32]\n          loc:\n            start:\n              line: 5\n              column: 6\n            end:\n              line: 5\n              column: 7\n        start: 27\n        end: 33\n        range: [27, 33]\n        loc:\n          start:\n            line: 5\n            column: 2\n          end:\n            line: 5\n            column: 8\n      ]\n      start: 0\n      end: 36\n      range: [0, 36]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 6\n          column: 2\n    start: 0\n    end: 36\n    range: [0, 36]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 6\n        column: 2\n\n  testAstLocationData '<div {f...} />',\n    type: 'JSXElement'\n    openingElement:\n      attributes: [\n        argument:\n          start: 6\n          end: 7\n          range: [6, 7]\n          loc:\n            start:\n              line: 1\n              column: 6\n            end:\n              line: 1\n              column: 7\n        start: 5\n        end: 11\n        range: [5, 11]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 11\n      ]\n\n  testAstLocationData '<div>abc</div>',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        start: 1\n        end: 4\n        range: [1, 4]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 4\n      start: 0\n      end: 5\n      range: [0, 5]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 5\n    closingElement:\n      name:\n        start: 10\n        end: 13\n        range: [10, 13]\n        loc:\n          start:\n            line: 1\n            column: 10\n          end:\n            line: 1\n            column: 13\n      start: 8\n      end: 14\n      range: [8, 14]\n      loc:\n        start:\n          line: 1\n          column: 8\n        end:\n          line: 1\n          column: 14\n    children: [\n      start: 5\n      end: 8\n      range: [5, 8]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 8\n    ]\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 14\n\n  testAstLocationData '''\n    <a>\n      {b}\n      <c />\n    </a>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        start: 1\n        end: 2\n        range: [1, 2]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 2\n      start: 0\n      end: 3\n      range: [0, 3]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 3\n    closingElement:\n      name:\n        start: 20\n        end: 21\n        range: [20, 21]\n        loc:\n          start:\n            line: 4\n            column: 2\n          end:\n            line: 4\n            column: 3\n      start: 18\n      end: 22\n      range: [18, 22]\n      loc:\n        start:\n          line: 4\n          column: 0\n        end:\n          line: 4\n          column: 4\n    children: [\n      start: 3\n      end: 6\n      range: [3, 6]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 2\n          column: 2\n    ,\n      expression:\n        start: 7\n        end: 8\n        range: [7, 8]\n        loc:\n          start:\n            line: 2\n            column: 3\n          end:\n            line: 2\n            column: 4\n      start: 6\n      end: 9\n      range: [6, 9]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 5\n    ,\n      start: 9\n      end: 12\n      range: [9, 12]\n      loc:\n        start:\n          line: 2\n          column: 5\n        end:\n          line: 3\n          column: 2\n    ,\n      start: 12\n      end: 17\n      range: [12, 17]\n      loc:\n        start:\n          line: 3\n          column: 2\n        end:\n          line: 3\n          column: 7\n    ,\n      start: 17\n      end: 18\n      range: [17, 18]\n      loc:\n        start:\n          line: 3\n          column: 7\n        end:\n          line: 4\n          column: 0\n    ]\n    start: 0\n    end: 22\n    range: [0, 22]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 4\n\n  testAstLocationData '<>abc{}</>',\n    type: 'JSXFragment'\n    openingFragment:\n      start: 0\n      end: 2\n      range: [0, 2]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 2\n    closingFragment:\n      start: 7\n      end: 10\n      range: [7, 10]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 10\n    children: [\n      start: 2\n      end: 5\n      range: [2, 5]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 5\n    ,\n      expression:\n        start: 6\n        end: 6\n        range: [6, 6]\n        loc:\n          start:\n            line: 1\n            column: 6\n          end:\n            line: 1\n            column: 6\n      start: 5\n      end: 7\n      range: [5, 7]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 7\n    ]\n    start: 0\n    end: 10\n    range: [0, 10]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 10\n\n  testAstLocationData '''\n    <a>{<b />}</a>\n  ''',\n    type: 'JSXElement'\n    children: [\n      expression:\n        start: 4\n        end: 9\n        range: [4, 9]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 1\n            column: 9\n      start: 3\n      end: 10\n      range: [3, 10]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 10\n    ]\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 14\n\n  testAstLocationData '''\n    <div>{\n      # comment\n    }</div>\n  ''',\n    type: 'JSXElement'\n    children: [\n      expression:\n        start: 6\n        end: 19\n        range: [6, 19]\n        loc:\n          start:\n            line: 1\n            column: 6\n          end:\n            line: 3\n            column: 0\n      start: 5\n      end: 20\n      range: [5, 20]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 3\n          column: 1\n    ]\n    start: 0\n    end: 26\n    range: [0, 26]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 7\n\n  testAstLocationData '''\n    <div>{### here ###}</div>\n  ''',\n    type: 'JSXElement'\n    children: [\n      expression:\n        start: 6\n        end: 18\n        range: [6, 18]\n        loc:\n          start:\n            line: 1\n            column: 6\n          end:\n            line: 1\n            column: 18\n      start: 5\n      end: 19\n      range: [5, 19]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 19\n    ]\n    start: 0\n    end: 25\n    range: [0, 25]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 25\n\n  testAstLocationData '<div:a b:c />',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        namespace:\n          start: 1\n          end: 4\n          range: [1, 4]\n          loc:\n            start:\n              line: 1\n              column: 1\n            end:\n              line: 1\n              column: 4\n        name:\n          start: 5\n          end: 6\n          range: [5, 6]\n          loc:\n            start:\n              line: 1\n              column: 5\n            end:\n              line: 1\n              column: 6\n        start: 1\n        end: 6\n        range: [1, 6]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 6\n      attributes: [\n        name:\n          namespace:\n            start: 7\n            end: 8\n            range: [7, 8]\n            loc:\n              start:\n                line: 1\n                column: 7\n              end:\n                line: 1\n                column: 8\n          name:\n            start: 9\n            end: 10\n            range: [9, 10]\n            loc:\n              start:\n                line: 1\n                column: 9\n              end:\n                line: 1\n                column: 10\n          start: 7\n          end: 10\n          range: [7, 10]\n          loc:\n            start:\n              line: 1\n              column: 7\n            end:\n              line: 1\n              column: 10\n        start: 7\n        end: 10\n        range: [7, 10]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 10\n      ]\n      start: 0\n      end: 13\n      range: [0, 13]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 13\n    start: 0\n    end: 13\n    range: [0, 13]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 13\n\n  testAstLocationData '''\n    <div:a>\n      {b}\n    </div:a>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        namespace:\n          start: 1\n          end: 4\n          range: [1, 4]\n          loc:\n            start:\n              line: 1\n              column: 1\n            end:\n              line: 1\n              column: 4\n        name:\n          start: 5\n          end: 6\n          range: [5, 6]\n          loc:\n            start:\n              line: 1\n              column: 5\n            end:\n              line: 1\n              column: 6\n        start: 1\n        end: 6\n        range: [1, 6]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 6\n      start: 0\n      end: 7\n      range: [0, 7]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 7\n    closingElement:\n      name:\n        namespace:\n          start: 16\n          end: 19\n          range: [16, 19]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 5\n        name:\n          start: 20\n          end: 21\n          range: [20, 21]\n          loc:\n            start:\n              line: 3\n              column: 6\n            end:\n              line: 3\n              column: 7\n        start: 16\n        end: 21\n        range: [16, 21]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 7\n      start: 14\n      end: 22\n      range: [14, 22]\n      loc:\n        start:\n          line: 3\n          column: 0\n        end:\n          line: 3\n          column: 8\n    start: 0\n    end: 22\n    range: [0, 22]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 8\n\n  testAstLocationData '''\n    <div.a>\n      {b}\n    </div.a>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        object:\n          start: 1\n          end: 4\n          range: [1, 4]\n          loc:\n            start:\n              line: 1\n              column: 1\n            end:\n              line: 1\n              column: 4\n        property:\n          start: 5\n          end: 6\n          range: [5, 6]\n          loc:\n            start:\n              line: 1\n              column: 5\n            end:\n              line: 1\n              column: 6\n        start: 1\n        end: 6\n        range: [1, 6]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 6\n      start: 0\n      end: 7\n      range: [0, 7]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 7\n    closingElement:\n      name:\n        object:\n          start: 16\n          end: 19\n          range: [16, 19]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 5\n        property:\n          start: 20\n          end: 21\n          range: [20, 21]\n          loc:\n            start:\n              line: 3\n              column: 6\n            end:\n              line: 3\n              column: 7\n        start: 16\n        end: 21\n        range: [16, 21]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 7\n      start: 14\n      end: 22\n      range: [14, 22]\n      loc:\n        start:\n          line: 3\n          column: 0\n        end:\n          line: 3\n          column: 8\n    start: 0\n    end: 22\n    range: [0, 22]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 8\n\ntest \"AST as expected for Try node\", ->\n  testAstLocationData 'try cappuccino',\n    type: 'TryStatement'\n    block:\n      type: 'BlockStatement'\n      body: [\n        expression:\n          start: 4\n          end: 14\n          range: [4, 14]\n          loc:\n            start:\n              line: 1\n              column: 4\n            end:\n              line: 1\n              column: 14\n        start: 4\n        end: 14\n        range: [4, 14]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 1\n            column: 14\n      ]\n      start: 3\n      end: 14\n      range: [3, 14]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 14\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 14\n\n  testAstLocationData '''\n    try\n      x = 1\n      y()\n    catch e\n      d()\n    finally\n      f + g\n  ''',\n    type: 'TryStatement'\n    block:\n      type: 'BlockStatement'\n      body: [\n        expression:\n          start: 6\n          end: 11\n          range: [6, 11]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 7\n        start: 6\n        end: 11\n        range: [6, 11]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 7\n      ,\n        expression:\n          start: 14\n          end: 17\n          range: [14, 17]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 5\n        start: 14\n        end: 17\n        range: [14, 17]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 5\n      ]\n      start: 4\n      end: 17\n      range: [4, 17]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 5\n    handler:\n      param:\n        start: 24\n        end: 25\n        range: [24, 25]\n        loc:\n          start:\n            line: 4\n            column: 6\n          end:\n            line: 4\n            column: 7\n      body:\n        body: [\n          start: 28\n          end: 31\n          range: [28, 31]\n          loc:\n            start:\n              line: 5\n              column: 2\n            end:\n              line: 5\n              column: 5\n        ]\n        start: 26\n        end: 31\n        range: [26, 31]\n        loc:\n          start:\n            line: 5\n            column: 0\n          end:\n            line: 5\n            column: 5\n      start: 18\n      end: 31\n      range: [18, 31]\n      loc:\n        start:\n          line: 4\n          column: 0\n        end:\n          line: 5\n          column: 5\n    finalizer:\n      body: [\n        expression:\n          start: 42\n          end: 47\n          range: [42, 47]\n          loc:\n            start:\n              line: 7\n              column: 2\n            end:\n              line: 7\n              column: 7\n        start: 42\n        end: 47\n        range: [42, 47]\n        loc:\n          start:\n            line: 7\n            column: 2\n          end:\n            line: 7\n            column: 7\n      ]\n      start: 32\n      end: 47\n      range: [32, 47]\n      loc:\n        start:\n          line: 6\n          column: 0\n        end:\n          line: 7\n          column: 7\n    start: 0\n    end: 47\n    range: [0, 47]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 7\n        column: 7\n\n  testAstLocationData '''\n    try\n    catch {e}\n      f\n  ''',\n    type: 'TryStatement'\n    handler:\n      param:\n        start: 10\n        end: 13\n        range: [10, 13]\n        loc:\n          start:\n            line: 2\n            column: 6\n          end:\n            line: 2\n            column: 9\n      body:\n        start: 14\n        end: 17\n        range: [14, 17]\n        loc:\n          start:\n            line: 3\n            column: 0\n          end:\n            line: 3\n            column: 3\n      start: 4\n      end: 17\n      range: [4, 17]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 3\n\ntest \"AST location data as expected for Root node\", ->\n  testAstRootLocationData '1\\n2',\n    type: 'File'\n    program:\n      start: 0\n      end: 3\n      range: [0, 3]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 2\n          column: 1\n    start: 0\n    end: 3\n    range: [0, 3]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 1\n\n  testAstRootLocationData 'a = 1\\nb',\n    type: 'File'\n    program:\n      start: 0\n      end: 7\n      range: [0, 7]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 2\n          column: 1\n    start: 0\n    end: 7\n    range: [0, 7]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 1\n\n  testAstRootLocationData 'a = 1\\nb\\n\\n',\n    type: 'File'\n    program:\n      start: 0\n      end: 9\n      range: [0, 9]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 4\n          column: 0\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 0\n\n  testAstRootLocationData 'a = 1\\n\\n# Comment',\n    type: 'File'\n    program:\n      start: 0\n      end: 16\n      range: [0, 16]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 3\n          column: 9\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 9\n\n  testAstRootLocationData 'a = 1\\n\\n# Comment\\n',\n    type: 'File'\n    program:\n      start: 0\n      end: 17\n      range: [0, 17]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 4\n          column: 0\n    start: 0\n    end: 17\n    range: [0, 17]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 0\n\n  testAstRootLocationData '''\n    # comment\n    \"use strict\"\n  ''',\n    type: 'File'\n    program:\n      start: 0\n      end: 22\n      range: [0, 22]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 2\n          column: 12\n    start: 0\n    end: 22\n    range: [0, 22]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 12\n\n  testAstRootLocationData ' \\n',\n    type: 'File'\n    program:\n      start: 0\n      end: 2\n      range: [0, 2]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 2\n          column: 0\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 0\n\n  testAstRootLocationData '\\n',\n    type: 'File'\n    program:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 2\n          column: 0\n    start: 0\n    end: 1\n    range: [0, 1]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 0\n\n  testAstRootLocationData '',\n    type: 'File'\n    program:\n      start: 0\n      end: 0\n      range: [0, 0]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 0\n    start: 0\n    end: 0\n    range: [0, 0]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 0\n\n  testAstRootLocationData ' ',\n    type: 'File'\n    program:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    start: 0\n    end: 1\n    range: [0, 1]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 1\n\ntest \"AST location data as expected for Switch node\", ->\n  testAstLocationData '''\n    switch x\n      when a then a\n      when b, c then c\n      else 42\n  ''',\n    type: 'SwitchStatement'\n    discriminant:\n      start: 7\n      end: 8\n      range: [7, 8]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 8\n    cases: [\n      test:\n        start: 16\n        end: 17\n        range: [16, 17]\n        loc:\n          start:\n            line: 2\n            column: 7\n          end:\n            line: 2\n            column: 8\n      consequent: [\n        expression:\n          start: 23\n          end: 24\n          range: [23, 24]\n          loc:\n            start:\n              line: 2\n              column: 14\n            end:\n              line: 2\n              column: 15\n        start: 23\n        end: 24\n        range: [23, 24]\n        loc:\n          start:\n            line: 2\n            column: 14\n          end:\n            line: 2\n            column: 15\n      ]\n      start: 11\n      end: 24\n      range: [11, 24]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 15\n    ,\n      test:\n        start: 32\n        end: 33\n        range: [32, 33]\n        loc:\n          start:\n            line: 3\n            column: 7\n          end:\n            line: 3\n            column: 8\n      start: 27\n      end: 33\n      range: [27, 33]\n      loc:\n        start:\n          line: 3\n          column: 2\n        end:\n          line: 3\n          column: 8\n    ,\n      test:\n        start: 35\n        end: 36\n        range: [35, 36]\n        loc:\n          start:\n            line: 3\n            column: 10\n          end:\n            line: 3\n            column: 11\n      consequent: [\n        expression:\n          start: 42\n          end: 43\n          range: [42, 43]\n          loc:\n            start:\n              line: 3\n              column: 17\n            end:\n              line: 3\n              column: 18\n        start: 42\n        end: 43\n        range: [42, 43]\n        loc:\n          start:\n            line: 3\n            column: 17\n          end:\n            line: 3\n            column: 18\n      ]\n      start: 35\n      end: 43\n      range: [35, 43]\n      loc:\n        start:\n          line: 3\n          column: 10\n        end:\n          line: 3\n          column: 18\n    ,\n      consequent: [\n        expression:\n          start: 51\n          end: 53\n          range: [51, 53]\n          loc:\n            start:\n              line: 4\n              column: 7\n            end:\n              line: 4\n              column: 9\n        start: 51\n        end: 53\n        range: [51, 53]\n        loc:\n          start:\n            line: 4\n            column: 7\n          end:\n            line: 4\n            column: 9\n      ]\n      start: 46\n      end: 53\n      range: [46, 53]\n      loc:\n        start:\n          line: 4\n          column: 2\n        end:\n          line: 4\n          column: 9\n    ,\n    ]\n    start: 0\n    end: 53\n    range: [0, 53]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 9\n\n  testAstLocationData '''\n    switch\n      when some(condition)\n        doSomething()\n        andThenSomethingElse\n  ''',\n    type: 'SwitchStatement'\n    cases: [\n      test:\n        start: 14\n        end: 29\n        range: [14, 29]\n        loc:\n          start:\n            line: 2\n            column: 7\n          end:\n            line: 2\n            column: 22\n      consequent: [\n        expression:\n          start: 34\n          end: 47\n          range: [34, 47]\n          loc:\n            start:\n              line: 3\n              column: 4\n            end:\n              line: 3\n              column: 17\n        start: 34\n        end: 47\n        range: [34, 47]\n        loc:\n          start:\n            line: 3\n            column: 4\n          end:\n            line: 3\n            column: 17\n      ,\n        expression:\n          start: 52\n          end: 72\n          range: [52, 72]\n          loc:\n            start:\n              line: 4\n              column: 4\n            end:\n              line: 4\n              column: 24\n      ]\n    ]\ntest \"AST location data as expected for Code node\", ->\n  testAstLocationData '''\n    (a) ->\n      b\n      c()\n  ''',\n    type: 'FunctionExpression'\n    params: [\n      start: 1\n      end: 2\n      range: [1, 2]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 2\n    ]\n    body:\n      body: [\n        start: 9\n        end: 10\n        range: [9, 10]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 3\n      ,\n        start: 13\n        end: 16\n        range: [13, 16]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 5\n      ]\n      start: 7\n      end: 16\n      range: [7, 16]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 5\n\n  testAstLocationData '''\n    -> a\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 2\n      end: 4\n      range: [2, 4]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 4\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\n  testAstLocationData '''\n    (\n      a,\n      [\n        b\n        c\n      ]\n    ) ->\n      d\n  ''',\n    type: 'FunctionExpression'\n    params: [\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 3\n    ,\n      elements: [\n        start: 15\n        end: 16\n        range: [15, 16]\n        loc:\n          start:\n            line: 4\n            column: 4\n          end:\n            line: 4\n            column: 5\n      ,\n        start: 21\n        end: 22\n        range: [21, 22]\n        loc:\n          start:\n            line: 5\n            column: 4\n          end:\n            line: 5\n            column: 5\n      ]\n      start: 9\n      end: 26\n      range: [9, 26]\n      loc:\n        start:\n          line: 3\n          column: 2\n        end:\n          line: 6\n          column: 3\n    ]\n    start: 0\n    end: 35\n    range: [0, 35]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 8\n        column: 3\n\n  testAstLocationData '''\n    ->\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 2\n      end: 2\n      range: [2, 2]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 2\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 2\n\n  testAstLocationData '''\n    (a...) ->\n  ''',\n    type: 'FunctionExpression'\n    params: [\n      argument:\n        start: 1\n        end: 2\n        range: [1, 2]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 2\n      start: 1\n      end: 5\n      range: [1, 5]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 5\n    ]\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\n  testAstLocationData '''\n    (...a) ->\n  ''',\n    type: 'FunctionExpression'\n    params: [\n      argument:\n        start: 4\n        end: 5\n        range: [4, 5]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 1\n            column: 5\n      start: 1\n      end: 5\n      range: [1, 5]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 5\n    ]\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\ntest \"AST location data as expected for Return node\", ->\n  testAstLocationData 'return no',\n    type: 'ReturnStatement'\n    argument:\n      start: 7\n      end: 9\n      range: [7, 9]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 9\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\n  testAstLocationData '''\n    (a, b) ->\n      return a + b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        argument:\n          start: 19\n          end: 24\n          range: [19, 24]\n          loc:\n            start:\n              line: 2\n              column: 9\n            end:\n              line: 2\n              column: 14\n        start: 12\n        end: 24\n        range: [12, 24]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 14\n      ]\n      start: 10\n      end: 24\n      range: [10, 24]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 14\n    start: 0\n    end: 24\n    range: [0, 24]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 14\n\n  testAstLocationData '-> return',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        start: 3\n        end: 9\n        range: [3, 9]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 9\n      ]\n      start: 2\n      end: 9\n      range: [2, 9]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 9\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\ntest \"AST as expected for YieldReturn node\", ->\n  testAstLocationData '-> yield return 1',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        expression:\n          argument:\n            argument:\n              start: 16\n              end: 17\n              range: [16, 17]\n              loc:\n                start:\n                  line: 1\n                  column: 16\n                end:\n                  line: 1\n                  column: 17\n            start: 9\n            end: 17\n            range: [9, 17]\n            loc:\n              start:\n                line: 1\n                column: 9\n              end:\n                line: 1\n                column: 17\n          start: 3\n          end: 17\n          range: [3, 17]\n          loc:\n            start:\n              line: 1\n              column: 3\n            end:\n              line: 1\n              column: 17\n        start: 3\n        end: 17\n        range: [3, 17]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 17\n      ]\n      start: 2\n      end: 17\n      range: [2, 17]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 17\n    start: 0\n    end: 17\n    range: [0, 17]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 17\n\n  testAstLocationData '-> yield return',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        expression:\n          argument:\n            start: 9\n            end: 15\n            range: [9, 15]\n            loc:\n              start:\n                line: 1\n                column: 9\n              end:\n                line: 1\n                column: 15\n          start: 3\n          end: 15\n          range: [3, 15]\n          loc:\n            start:\n              line: 1\n              column: 3\n            end:\n              line: 1\n              column: 15\n        start: 3\n        end: 15\n        range: [3, 15]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 15\n      ]\n      start: 2\n      end: 15\n      range: [2, 15]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 15\n    start: 0\n    end: 15\n    range: [0, 15]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 15\n\ntest \"AST as expected for AwaitReturn node\", ->\n  testAstLocationData '-> await return 1',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        expression:\n          argument:\n            argument:\n              start: 16\n              end: 17\n              range: [16, 17]\n              loc:\n                start:\n                  line: 1\n                  column: 16\n                end:\n                  line: 1\n                  column: 17\n            start: 9\n            end: 17\n            range: [9, 17]\n            loc:\n              start:\n                line: 1\n                column: 9\n              end:\n                line: 1\n                column: 17\n          start: 3\n          end: 17\n          range: [3, 17]\n          loc:\n            start:\n              line: 1\n              column: 3\n            end:\n              line: 1\n              column: 17\n        start: 3\n        end: 17\n        range: [3, 17]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 17\n      ]\n      start: 2\n      end: 17\n      range: [2, 17]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 17\n    start: 0\n    end: 17\n    range: [0, 17]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 17\n\n  testAstLocationData '-> await return',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        expression:\n          argument:\n            start: 9\n            end: 15\n            range: [9, 15]\n            loc:\n              start:\n                line: 1\n                column: 9\n              end:\n                line: 1\n                column: 15\n          start: 3\n          end: 15\n          range: [3, 15]\n          loc:\n            start:\n              line: 1\n              column: 3\n            end:\n              line: 1\n              column: 15\n        start: 3\n        end: 15\n        range: [3, 15]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 15\n      ]\n      start: 2\n      end: 15\n      range: [2, 15]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 15\n    start: 0\n    end: 15\n    range: [0, 15]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 15\n\ntest \"AST as expected for If node\", ->\n  testAstLocationData 'if maybe then yes',\n    type: 'IfStatement'\n    test:\n      start: 3\n      end: 8\n      range: [3, 8]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 8\n    consequent:\n      body: [\n        expression:\n          start: 14\n          end: 17\n          range: [14, 17]\n          loc:\n            start:\n              line: 1\n              column: 14\n            end:\n              line: 1\n              column: 17\n        start: 14\n        end: 17\n        range: [14, 17]\n        loc:\n          start:\n            line: 1\n            column: 14\n          end:\n            line: 1\n            column: 17\n      ]\n      start: 9\n      end: 17\n      range: [9, 17]\n      loc:\n        start:\n          line: 1\n          column: 9\n        end:\n          line: 1\n          column: 17\n    start: 0\n    end: 17\n    range: [0, 17]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 17\n\n  testAstLocationData 'yes if maybe',\n    type: 'IfStatement'\n    test:\n      start: 7\n      end: 12\n      range: [7, 12]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 12\n    consequent:\n      body: [\n        expression:\n          start: 0\n          end: 3\n          range: [0, 3]\n          loc:\n            start:\n              line: 1\n              column: 0\n            end:\n              line: 1\n              column: 3\n        start: 0\n        end: 3\n        range: [0, 3]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 3\n      ]\n      start: 0\n      end: 3\n      range: [0, 3]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 3\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 12\n\n  testAstLocationData 'unless x then x else if y then y else z',\n    type: 'IfStatement'\n    test:\n      start: 7\n      end: 8\n      range: [7, 8]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 8\n    consequent:\n      body: [\n        expression:\n          start: 14\n          end: 15\n          range: [14, 15]\n          loc:\n            start:\n              line: 1\n              column: 14\n            end:\n              line: 1\n              column: 15\n        start: 14\n        end: 15\n        range: [14, 15]\n        loc:\n          start:\n            line: 1\n            column: 14\n          end:\n            line: 1\n            column: 15\n      ]\n      start: 9\n      end: 15\n      range: [9, 15]\n      loc:\n        start:\n          line: 1\n          column: 9\n        end:\n          line: 1\n          column: 15\n    alternate:\n      test:\n        start: 24\n        end: 25\n        range: [24, 25]\n        loc:\n          start:\n            line: 1\n            column: 24\n          end:\n            line: 1\n            column: 25\n      consequent:\n        body: [\n          expression:\n            start: 31\n            end: 32\n            range: [31, 32]\n            loc:\n              start:\n                line: 1\n                column: 31\n              end:\n                line: 1\n                column: 32\n          start: 31\n          end: 32\n          range: [31, 32]\n          loc:\n            start:\n              line: 1\n              column: 31\n            end:\n              line: 1\n              column: 32\n        ]\n        start: 26\n        end: 32\n        range: [26, 32]\n        loc:\n          start:\n            line: 1\n            column: 26\n          end:\n            line: 1\n            column: 32\n      alternate:\n        body: [\n          expression:\n            start: 38\n            end: 39\n            range: [38, 39]\n            loc:\n              start:\n                line: 1\n                column: 38\n              end:\n                line: 1\n                column: 39\n          start: 38\n          end: 39\n          range: [38, 39]\n          loc:\n            start:\n              line: 1\n              column: 38\n            end:\n              line: 1\n              column: 39\n        ]\n        start: 37\n        end: 39\n        range: [37, 39]\n        loc:\n          start:\n            line: 1\n            column: 37\n          end:\n            line: 1\n            column: 39\n      start: 21\n      end: 39\n      range: [21, 39]\n      loc:\n        start:\n          line: 1\n          column: 21\n        end:\n          line: 1\n          column: 39\n    start: 0\n    end: 39\n    range: [0, 39]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 39\n\n  testAstLocationData '''\n    if a\n      b\n    else\n      if c\n        d\n  ''',\n    type: 'IfStatement'\n    test:\n      start: 3\n      end: 4\n      range: [3, 4]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 4\n    consequent:\n      body: [\n        expression:\n          start: 7\n          end: 8\n          range: [7, 8]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 3\n        start: 7\n        end: 8\n        range: [7, 8]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 3\n      ]\n      start: 5\n      end: 8\n      range: [5, 8]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 3\n    alternate:\n      body: [\n        test:\n          start: 19\n          end: 20\n          range: [19, 20]\n          loc:\n            start:\n              line: 4\n              column: 5\n            end:\n              line: 4\n              column: 6\n        consequent:\n          body: [\n            expression:\n              start: 25\n              end: 26\n              range: [25, 26]\n              loc:\n                start:\n                  line: 5\n                  column: 4\n                end:\n                  line: 5\n                  column: 5\n            start: 25\n            end: 26\n            range: [25, 26]\n            loc:\n              start:\n                line: 5\n                column: 4\n              end:\n                line: 5\n                column: 5\n          ]\n          start: 21\n          end: 26\n          range: [21, 26]\n          loc:\n            start:\n              line: 5\n              column: 0\n            end:\n              line: 5\n              column: 5\n        start: 16\n        end: 26\n        range: [16, 26]\n        loc:\n          start:\n            line: 4\n            column: 2\n          end:\n            line: 5\n            column: 5\n      ]\n      start: 14\n      end: 26\n      range: [14, 26]\n      loc:\n        start:\n          line: 4\n          column: 0\n        end:\n          line: 5\n          column: 5\n    start: 0\n    end: 26\n    range: [0, 26]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 5\n        column: 5\n\n  testAstLocationData '''\n    a =\n      if b then c else if d then e\n  ''',\n    type: 'AssignmentExpression'\n    right:\n      test:\n        start: 9\n        end: 10\n        range: [9, 10]\n        loc:\n          start:\n            line: 2\n            column: 5\n          end:\n            line: 2\n            column: 6\n      consequent:\n        start: 16\n        end: 17\n        range: [16, 17]\n        loc:\n          start:\n            line: 2\n            column: 12\n          end:\n            line: 2\n            column: 13\n      alternate:\n        test:\n          start: 26\n          end: 27\n          range: [26, 27]\n          loc:\n            start:\n              line: 2\n              column: 22\n            end:\n              line: 2\n              column: 23\n        consequent:\n          start: 33\n          end: 34\n          range: [33, 34]\n          loc:\n            start:\n              line: 2\n              column: 29\n            end:\n              line: 2\n              column: 30\n        start: 23\n        end: 34\n        range: [23, 34]\n        loc:\n          start:\n            line: 2\n            column: 19\n          end:\n            line: 2\n            column: 30\n      start: 6\n      end: 34\n      range: [6, 34]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 30\n    start: 0\n    end: 34\n    range: [0, 34]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 30\n\n  testAstLocationData '''\n    f(\n      if b\n        c\n        d\n    )\n  ''',\n    type: 'CallExpression'\n    arguments: [\n      test:\n        start: 8\n        end: 9\n        range: [8, 9]\n        loc:\n          start:\n            line: 2\n            column: 5\n          end:\n            line: 2\n            column: 6\n      consequent:\n        body: [\n          expression:\n            start: 14\n            end: 15\n            range: [14, 15]\n            loc:\n              start:\n                line: 3\n                column: 4\n              end:\n                line: 3\n                column: 5\n          start: 14\n          end: 15\n          range: [14, 15]\n          loc:\n            start:\n              line: 3\n              column: 4\n            end:\n              line: 3\n              column: 5\n        ,\n          expression:\n            start: 20\n            end: 21\n            range: [20, 21]\n            loc:\n              start:\n                line: 4\n                column: 4\n              end:\n                line: 4\n                column: 5\n          start: 20\n          end: 21\n          range: [20, 21]\n          loc:\n            start:\n              line: 4\n              column: 4\n            end:\n              line: 4\n              column: 5\n        ]\n        start: 10\n        end: 21\n        range: [10, 21]\n        loc:\n          start:\n            line: 3\n            column: 0\n          end:\n            line: 4\n            column: 5\n    ]\n    start: 0\n    end: 23\n    range: [0, 23]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 5\n        column: 1\n\ntest \"AST as expected for While node\", ->\n  testAstLocationData 'loop 1',\n    type: 'WhileStatement'\n    test:\n      start: 0\n      end: 4\n      range: [0, 4]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 4\n    body:\n      body: [\n        expression:\n          start: 5\n          end: 6\n          range: [5, 6]\n          loc:\n            start:\n              line: 1\n              column: 5\n            end:\n              line: 1\n              column: 6\n        start: 5\n        end: 6\n        range: [5, 6]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 6\n      ]\n      start: 5\n      end: 6\n      range: [5, 6]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 6\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData 'while 1 < 2 then',\n    type: 'WhileStatement'\n    test:\n      start: 6\n      end: 11\n      range: [6, 11]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 11\n    body:\n      start: 12\n      end: 16\n      range: [12, 16]\n      loc:\n        start:\n          line: 1\n          column: 12\n        end:\n          line: 1\n          column: 16\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 16\n\n  testAstLocationData 'while 1 < 2 then fn()',\n    type: 'WhileStatement'\n    test:\n      start: 6\n      end: 11\n      range: [6, 11]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 11\n    body:\n      body: [\n        expression:\n          start: 17\n          end: 21\n          range: [17, 21]\n          loc:\n            start:\n              line: 1\n              column: 17\n            end:\n              line: 1\n              column: 21\n        start: 17\n        end: 21\n        range: [17, 21]\n        loc:\n          start:\n            line: 1\n            column: 17\n          end:\n            line: 1\n            column: 21\n      ]\n      start: 12\n      end: 21\n      range: [12, 21]\n      loc:\n        start:\n          line: 1\n          column: 12\n        end:\n          line: 1\n          column: 21\n    start: 0\n    end: 21\n    range: [0, 21]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 21\n\n\n  testAstLocationData '''\n    x() until y\n  ''',\n    type: 'WhileStatement'\n    test:\n      start: 10\n      end: 11\n      range: [10, 11]\n      loc:\n        start:\n          line: 1\n          column: 10\n        end:\n          line: 1\n          column: 11\n    body:\n      body: [\n        expression:\n          start: 0\n          end: 3\n          range: [0, 3]\n          loc:\n            start:\n              line: 1\n              column: 0\n            end:\n              line: 1\n              column: 3\n        start: 0\n        end: 3\n        range: [0, 3]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 3\n      ]\n      start: 0\n      end: 3\n      range: [0, 3]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 3\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\n  testAstLocationData '''\n    until x when y\n      z++\n  ''',\n    type: 'WhileStatement'\n    test:\n      start: 6\n      end: 7\n      range: [6, 7]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 7\n    body:\n      body: [\n        expression:\n          start: 17\n          end: 20\n          range: [17, 20]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 5\n        start: 17\n        end: 20\n        range: [17, 20]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 5\n      ]\n      start: 15\n      end: 20\n      range: [15, 20]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 5\n    guard:\n      start: 13\n      end: 14\n      range: [13, 14]\n      loc:\n        start:\n          line: 1\n          column: 13\n        end:\n          line: 1\n          column: 14\n    start: 0\n    end: 20\n    range: [0, 20]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 5\n\n  testAstLocationData '''\n    x while y when z\n  ''',\n    type: 'WhileStatement'\n    test:\n      start: 8\n      end: 9\n      range: [8, 9]\n      loc:\n        start:\n          line: 1\n          column: 8\n        end:\n          line: 1\n          column: 9\n    body:\n      body: [\n        expression:\n          start: 0\n          end: 1\n          range: [0, 1]\n          loc:\n            start:\n              line: 1\n              column: 0\n            end:\n              line: 1\n              column: 1\n        start: 0\n        end: 1\n        range: [0, 1]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 1\n      ]\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    guard:\n      start: 15\n      end: 16\n      range: [15, 16]\n      loc:\n        start:\n          line: 1\n          column: 15\n        end:\n          line: 1\n          column: 16\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 16\n\n  testAstLocationData '''\n    loop\n      a()\n      b++\n  ''',\n    type: 'WhileStatement'\n    test:\n      start: 0\n      end: 4\n      range: [0, 4]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 4\n    body:\n      body: [\n        expression:\n          start: 7\n          end: 10\n          range: [7, 10]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 5\n        start: 7\n        end: 10\n        range: [7, 10]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 5\n      ,\n        expression:\n          start: 13\n          end: 16\n          range: [13, 16]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 5\n        start: 13\n        end: 16\n        range: [13, 16]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 5\n      ]\n      start: 5\n      end: 16\n      range: [5, 16]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 5\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 5\n\ntest \"AST location data as expected for `new.target` MetaProperty node\", ->\n  testAstLocationData '''\n    -> new.target\n  ''',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        expression:\n          meta:\n            start: 3\n            end: 6\n            range: [3, 6]\n            loc:\n              start:\n                line: 1\n                column: 3\n              end:\n                line: 1\n                column: 6\n          property:\n            start: 7\n            end: 13\n            range: [7, 13]\n            loc:\n              start:\n                line: 1\n                column: 7\n              end:\n                line: 1\n                column: 13\n          start: 3\n          end: 13\n          range: [3, 13]\n          loc:\n            start:\n              line: 1\n              column: 3\n            end:\n              line: 1\n              column: 13\n      ]\n    start: 0\n    end: 13\n    range: [0, 13]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 13\n\ntest \"AST location data as expected for `import.meta` MetaProperty node\", ->\n  testAstLocationData '''\n    import.meta\n  ''',\n    type: 'MetaProperty'\n    meta:\n      start: 0\n      end: 6\n      range: [0, 6]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 6\n    property:\n      start: 7\n      end: 11\n      range: [7, 11]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 11\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\ntest \"AST location data as expected for For node\", ->\n  testAstLocationData 'for x, i in arr when x? then return',\n    type: 'For'\n    name:\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    index:\n      start: 7\n      end: 8\n      range: [7, 8]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 8\n    guard:\n      start: 21\n      end: 23\n      range: [21, 23]\n      loc:\n        start:\n          line: 1\n          column: 21\n        end:\n          line: 1\n          column: 23\n    source:\n      start: 12\n      end: 15\n      range: [12, 15]\n      loc:\n        start:\n          line: 1\n          column: 12\n        end:\n          line: 1\n          column: 15\n    body:\n      body: [\n        start: 29\n        end: 35\n        range: [29, 35]\n        loc:\n          start:\n            line: 1\n            column: 29\n          end:\n            line: 1\n            column: 35\n      ]\n      start: 24\n      end: 35\n      range: [24, 35]\n      loc:\n        start:\n          line: 1\n          column: 24\n        end:\n          line: 1\n          column: 35\n    start: 0\n    end: 35\n    range: [0, 35]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 35\n\n  testAstLocationData 'a = (x for x in y)',\n    type: 'AssignmentExpression'\n    right:\n      name:\n        start: 11\n        end: 12\n        range: [11, 12]\n        loc:\n          start:\n            line: 1\n            column: 11\n          end:\n            line: 1\n            column: 12\n      body:\n        start: 5\n        end: 6\n        range: [5, 6]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 6\n      source:\n        start: 16\n        end: 17\n        range: [16, 17]\n        loc:\n          start:\n            line: 1\n            column: 16\n          end:\n            line: 1\n            column: 17\n      start: 5\n      end: 17\n      range: [5, 17]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 17\n    start: 0\n    end: 18\n    range: [0, 18]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 18\n\n  testAstLocationData 'x for [0...1]',\n    type: 'For'\n    body:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    source:\n      start: 6\n      end: 13\n      range: [6, 13]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 13\n    start: 0\n    end: 13\n    range: [0, 13]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 13\n\n  testAstLocationData '''\n    for own x, y of z\n      c()\n      d\n  ''',\n    type: 'For'\n    name:\n      start: 11\n      end: 12\n      range: [11, 12]\n      loc:\n        start:\n          line: 1\n          column: 11\n        end:\n          line: 1\n          column: 12\n    index:\n      start: 8\n      end: 9\n      range: [8, 9]\n      loc:\n        start:\n          line: 1\n          column: 8\n        end:\n          line: 1\n          column: 9\n    body:\n      body: [\n        start: 20\n        end: 23\n        range: [20, 23]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 5\n      ,\n        start: 26\n        end: 27\n        range: [26, 27]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 3\n      ]\n      start: 18\n      end: 27\n      range: [18, 27]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 3\n    source:\n      start: 16\n      end: 17\n      range: [16, 17]\n      loc:\n        start:\n          line: 1\n          column: 16\n        end:\n          line: 1\n          column: 17\n    start: 0\n    end: 27\n    range: [0, 27]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  testAstLocationData '''\n    ->\n      for await x from y\n        z\n  ''',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        name:\n          start: 15\n          end: 16\n          range: [15, 16]\n          loc:\n            start:\n              line: 2\n              column: 12\n            end:\n              line: 2\n              column: 13\n        body:\n          body: [\n            start: 28\n            end: 29\n            range: [28, 29]\n            loc:\n              start:\n                line: 3\n                column: 4\n              end:\n                line: 3\n                column: 5\n          ]\n          start: 24\n          end: 29\n          range: [24, 29]\n          loc:\n            start:\n              line: 3\n              column: 0\n            end:\n              line: 3\n              column: 5\n        source:\n          start: 22\n          end: 23\n          range: [22, 23]\n          loc:\n            start:\n              line: 2\n              column: 19\n            end:\n              line: 2\n              column: 20\n        start: 5\n        end: 29\n        range: [5, 29]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 3\n            column: 5\n      ]\n      start: 3\n      end: 29\n      range: [3, 29]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 5\n    start: 0\n    end: 29\n    range: [0, 29]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 5\n\n  testAstLocationData '''\n    for {x} in y\n      z\n  ''',\n    type: 'For'\n    name:\n      properties: [\n        start: 5\n        end: 6\n        range: [5, 6]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 6\n      ]\n      start: 4\n      end: 7\n      range: [4, 7]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 7\n    body:\n      body: [\n        start: 15\n        end: 16\n        range: [15, 16]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 3\n      ]\n      start: 13\n      end: 16\n      range: [13, 16]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 3\n    source:\n      start: 11\n      end: 12\n      range: [11, 12]\n      loc:\n        start:\n          line: 1\n          column: 11\n        end:\n          line: 1\n          column: 12\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 3\n\ntest \"AST location data as expected for StringWithInterpolations node\", ->\n  testAstLocationData '\"a#{b}c\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    ]\n    quasis: [\n      start: 1\n      end: 2\n      range: [1, 2]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 2\n    ,\n      start: 6\n      end: 7\n      range: [6, 7]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 7\n    ]\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData '\"\"\"a#{b}c\"\"\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 6\n      end: 7\n      range: [6, 7]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 7\n    ]\n    quasis: [\n      start: 3\n      end: 4\n      range: [3, 4]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 4\n    ,\n      start: 8\n      end: 9\n      range: [8, 9]\n      loc:\n        start:\n          line: 1\n          column: 8\n        end:\n          line: 1\n          column: 9\n    ]\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 12\n\n  testAstLocationData '\"#{b}\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 3\n      end: 4\n      range: [3, 4]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 4\n    ]\n    quasis: [\n      start: 1\n      end: 1\n      range: [1, 1]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 1\n    ,\n      start: 5\n      end: 5\n      range: [5, 5]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 5\n    ]\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData '''\n    \" a\n      #{b}\n      c\n    \"\n  ''',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 8\n      end: 9\n      range: [8, 9]\n      loc:\n        start:\n          line: 2\n          column: 4\n        end:\n          line: 2\n          column: 5\n    ]\n    quasis: [\n      start: 1\n      end: 6\n      range: [1, 6]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 2\n          column: 2\n    ,\n      start: 10\n      end: 15\n      range: [10, 15]\n      loc:\n        start:\n          line: 2\n          column: 6\n        end:\n          line: 4\n          column: 0\n    ]\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 1\n\n  testAstLocationData '''\n    \"\"\"\n      a\n        b#{\n        c\n      }d\n    \"\"\"\n  ''',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 20\n      end: 21\n      range: [20, 21]\n      loc:\n        start:\n          line: 4\n          column: 4\n        end:\n          line: 4\n          column: 5\n    ]\n    quasis: [\n      start: 3\n      end: 13\n      range: [3, 13]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 3\n          column: 5\n    ,\n      start: 25\n      end: 27\n      range: [25, 27]\n      loc:\n        start:\n          line: 5\n          column: 3\n        end:\n          line: 6\n          column: 0\n    ]\n    start: 0\n    end: 30\n    range: [0, 30]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 6\n        column: 3\n\n  # empty interpolation\n  testAstLocationData '\"#{}\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 3\n      end: 3\n      range: [3, 3]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 3\n    ]\n    quasis: [\n      start: 1\n      end: 1\n      range: [1, 1]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 1\n    ,\n      start: 4\n      end: 4\n      range: [4, 4]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 4\n    ]\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData '''\n    \"#{\n      # comment\n     }\"\n    ''',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 3\n      end: 17\n      range: [3, 17]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 3\n          column: 1\n    ]\n    quasis: [\n      start: 1\n      end: 1\n      range: [1, 1]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 1\n    ,\n      start: 18\n      end: 18\n      range: [18, 18]\n      loc:\n        start:\n          line: 3\n          column: 2\n        end:\n          line: 3\n          column: 2\n    ]\n    start: 0\n    end: 19\n    range: [0, 19]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  testAstLocationData '\"#{ ### here ### }\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 3\n      end: 17\n      range: [3, 17]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 17\n    ]\n    quasis: [\n      start: 1\n      end: 1\n      range: [1, 1]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 1\n    ,\n      start: 18\n      end: 18\n      range: [18, 18]\n      loc:\n        start:\n          line: 1\n          column: 18\n        end:\n          line: 1\n          column: 18\n    ]\n    start: 0\n    end: 19\n    range: [0, 19]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 19\n\ntest \"AST location data as expected for dynamic import\", ->\n  testAstLocationData '''\n    import('a')\n  ''',\n    type: 'CallExpression'\n    callee:\n      start: 0\n      end: 6\n      range: [0, 6]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 6\n    arguments: [\n      start: 7\n      end: 10\n      range: [7, 10]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 10\n    ]\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\ntest \"AST location data as expected for RegexWithInterpolations node\", ->\n  testAstLocationData '///^#{flavor}script$///',\n    type: 'InterpolatedRegExpLiteral'\n    interpolatedPattern:\n      expressions: [\n        start: 6\n        end: 12\n        range: [6, 12]\n        loc:\n          start:\n            line: 1\n            column: 6\n          end:\n            line: 1\n            column: 12\n      ]\n      quasis: [\n        start: 3\n        end: 4\n        range: [3, 4]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 4\n      ,\n        start: 13\n        end: 20\n        range: [13, 20]\n        loc:\n          start:\n            line: 1\n            column: 13\n          end:\n            line: 1\n            column: 20\n      ]\n      start: 0\n      end: 23\n      range: [0, 23]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 23\n    start: 0\n    end: 23\n    range: [0, 23]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 23\n\n  testAstLocationData '''\n    ///\n      a\n      #{b}///ig\n  ''',\n    type: 'InterpolatedRegExpLiteral'\n    interpolatedPattern:\n      expressions: [\n        start: 12\n        end: 13\n        range: [12, 13]\n        loc:\n          start:\n            line: 3\n            column: 4\n          end:\n            line: 3\n            column: 5\n      ]\n      quasis: [\n        start: 3\n        end: 10\n        range: [3, 10]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 3\n            column: 2\n      ,\n        start: 14\n        end: 14\n        range: [14, 14]\n        loc:\n          start:\n            line: 3\n            column: 6\n          end:\n            line: 3\n            column: 6\n      ]\n      start: 0\n      end: 17\n      range: [0, 17]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 3\n          column: 9\n    start: 0\n    end: 19\n    range: [0, 19]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 11\n\n  testAstLocationData '''\n    ///\n      a # first\n      #{b} ### second ###\n    ///ig\n  ''',\n    type: 'InterpolatedRegExpLiteral'\n    comments: [\n      start: 8\n      end: 15\n      range: [8, 15]\n      loc:\n        start:\n          line: 2\n          column: 4\n        end:\n          line: 2\n          column: 11\n    ,\n      start: 23\n      end: 37\n      range: [23, 37]\n      loc:\n        start:\n          line: 3\n          column: 7\n        end:\n          line: 3\n          column: 21\n    ]\n\ntest \"AST location data as expected for RegexLiteral node\", ->\n  testAstLocationData '/a/ig',\n    type: 'RegExpLiteral'\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData '''\n    ///\n      a\n    ///i\n  ''',\n    type: 'RegExpLiteral'\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 4\n\n  testAstLocationData '/a\\\\w\\\\u1111\\\\u{11111}/',\n    type: 'RegExpLiteral'\n    start: 0\n    end: 20\n    range: [0, 20]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 20\n\n  testAstLocationData '''\n    ///\n      a\n      \\\\w\\\\u1111\\\\u{11111}\n    ///\n  ''',\n    type: 'RegExpLiteral'\n    start: 0\n    end: 31\n    range: [0, 31]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n\n  testAstLocationData '''\n    ///\n      /\n      (.+)\n      /\n    ///\n  ''',\n    type: 'RegExpLiteral'\n    start: 0\n    end: 22\n    range: [0, 22]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 5\n        column: 3\n\n  testAstLocationData '''\n    ///\n      a # first\n      b ### second ###\n    ///\n  ''',\n    type: 'RegExpLiteral'\n    comments: [\n      start: 8\n      end: 15\n      range: [8, 15]\n      loc:\n        start:\n          line: 2\n          column: 4\n        end:\n          line: 2\n          column: 11\n    ,\n      start: 20\n      end: 34\n      range: [20, 34]\n      loc:\n        start:\n          line: 3\n          column: 4\n        end:\n          line: 3\n          column: 18\n    ]\n    start: 0\n    end: 38\n    range: [0, 38]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n\ntest \"AST location data as expected for TaggedTemplateCall node\", ->\n  testAstLocationData 'func\"tagged\"',\n    type: 'TaggedTemplateExpression'\n    tag:\n      start: 0\n      end: 4\n      range: [0, 4]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 4\n    quasi:\n      quasis: [\n        start: 5\n        end: 11\n        range: [5, 11]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 11\n      ]\n      start: 4\n      end: 12\n      range: [4, 12]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 12\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 12\n\n  testAstLocationData 'a\"b#{c}\"',\n    type: 'TaggedTemplateExpression'\n    tag:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    quasi:\n      expressions: [\n        start: 5\n        end: 6\n        range: [5, 6]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 6\n      ]\n      quasis: [\n        start: 2\n        end: 3\n        range: [2, 3]\n        loc:\n          start:\n            line: 1\n            column: 2\n          end:\n            line: 1\n            column: 3\n      ,\n        start: 7\n        end: 7\n        range: [7, 7]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 7\n      ]\n      start: 1\n      end: 8\n      range: [1, 8]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 8\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData '''\n    a\"\"\"\n      b#{c}\n    \"\"\"\n  ''',\n    type: 'TaggedTemplateExpression'\n    tag:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    quasi:\n      expressions: [\n        start: 10\n        end: 11\n        range: [10, 11]\n        loc:\n          start:\n            line: 2\n            column: 5\n          end:\n            line: 2\n            column: 6\n      ]\n      quasis: [\n        start: 4\n        end: 8\n        range: [4, 8]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 2\n            column: 3\n      ,\n        start: 12\n        end: 13\n        range: [12, 13]\n        loc:\n          start:\n            line: 2\n            column: 7\n          end:\n            line: 3\n            column: 0\n      ]\n      start: 1\n      end: 16\n      range: [1, 16]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 3\n          column: 3\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  testAstLocationData \"\"\"\n    a'''\n      b\n    '''\n  \"\"\",\n    type: 'TaggedTemplateExpression'\n    tag:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    quasi:\n      quasis: [\n        start: 4\n        end: 9\n        range: [4, 9]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 3\n            column: 0\n      ]\n      start: 1\n      end: 12\n      range: [1, 12]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 3\n          column: 3\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\ntest \"AST location data as expected for Class node\", ->\n  testAstLocationData 'class Klass',\n    type: 'ClassDeclaration'\n    id:\n      start: 6\n      end: 11\n      range: [6, 11]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 11\n    body:\n      start: 11\n      end: 11\n      range: [11, 11]\n      loc:\n        start:\n          line: 1\n          column: 11\n        end:\n          line: 1\n          column: 11\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\n  testAstLocationData 'class child extends parent',\n    type: 'ClassDeclaration'\n    id:\n      start: 6\n      end: 11\n      range: [6, 11]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 11\n    superClass:\n      start: 20\n      end: 26\n      range: [20, 26]\n      loc:\n        start:\n          line: 1\n          column: 20\n        end:\n          line: 1\n          column: 26\n    body:\n      start: 26\n      end: 26\n      range: [26, 26]\n      loc:\n        start:\n          line: 1\n          column: 26\n        end:\n          line: 1\n          column: 26\n    start: 0\n    end: 26\n    range: [0, 26]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 26\n\n  testAstLocationData 'class Klass then constructor: ->',\n    type: 'ClassDeclaration'\n    id:\n      start: 6\n      end: 11\n      range: [6, 11]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 11\n    body:\n      body: [\n        key:\n          start: 17\n          end: 28\n          range: [17, 28]\n          loc:\n            start:\n              line: 1\n              column: 17\n            end:\n              line: 1\n              column: 28\n        start: 17\n        end: 32\n        range: [17, 32]\n        loc:\n          start:\n            line: 1\n            column: 17\n          end:\n            line: 1\n            column: 32\n      ]\n      start: 12\n      end: 32\n      range: [12, 32]\n      loc:\n        start:\n          line: 1\n          column: 12\n        end:\n          line: 1\n          column: 32\n    start: 0\n    end: 32\n    range: [0, 32]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 32\n\n  testAstLocationData '''\n    a = class A\n      b: ->\n        c\n  ''',\n    type: 'AssignmentExpression'\n    right:\n      id:\n        start: 10\n        end: 11\n        range: [10, 11]\n        loc:\n          start:\n            line: 1\n            column: 10\n          end:\n            line: 1\n            column: 11\n      body:\n        body: [\n          key:\n            start: 14\n            end: 15\n            range: [14, 15]\n            loc:\n              start:\n                line: 2\n                column: 2\n              end:\n                line: 2\n                column: 3\n          body:\n            body: [\n              start: 24\n              end: 25\n              range: [24, 25]\n              loc:\n                start:\n                  line: 3\n                  column: 4\n                end:\n                  line: 3\n                  column: 5\n            ]\n            start: 20\n            end: 25\n            range: [20, 25]\n            loc:\n              start:\n                line: 3\n                column: 0\n              end:\n                line: 3\n                column: 5\n          start: 14\n          end: 25\n          range: [14, 25]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 3\n              column: 5\n        ]\n        start: 12\n        end: 25\n        range: [12, 25]\n        loc:\n          start:\n            line: 2\n            column: 0\n          end:\n            line: 3\n            column: 5\n      start: 4\n      end: 25\n      range: [4, 25]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 3\n          column: 5\n    start: 0\n    end: 25\n    range: [0, 25]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 5\n\n  testAstLocationData '''\n    class A\n      @b: ->\n      @c = ->\n      @d: 1\n      @e = 2\n      A.f = 3\n      A.g = ->\n      this.h = ->\n      this.i = 4\n  ''',\n    type: 'ClassDeclaration'\n    id:\n      start: 6\n      end: 7\n      range: [6, 7]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 7\n    body:\n      body: [\n        key:\n          start: 11\n          end: 12\n          range: [11, 12]\n          loc:\n            start:\n              line: 2\n              column: 3\n            end:\n              line: 2\n              column: 4\n        staticClassName:\n          start: 10\n          end: 11\n          range: [10, 11]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 3\n        start: 10\n        end: 16\n        range: [10, 16]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 8\n      ,\n        key:\n          start: 20\n          end: 21\n          range: [20, 21]\n          loc:\n            start:\n              line: 3\n              column: 3\n            end:\n              line: 3\n              column: 4\n        staticClassName:\n          start: 19\n          end: 20\n          range: [19, 20]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 3\n        start: 19\n        end: 26\n        range: [19, 26]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 9\n      ,\n        key:\n          start: 30\n          end: 31\n          range: [30, 31]\n          loc:\n            start:\n              line: 4\n              column: 3\n            end:\n              line: 4\n              column: 4\n        staticClassName:\n          start: 29\n          end: 30\n          range: [29, 30]\n          loc:\n            start:\n              line: 4\n              column: 2\n            end:\n              line: 4\n              column: 3\n        value:\n          start: 33\n          end: 34\n          range: [33, 34]\n          loc:\n            start:\n              line: 4\n              column: 6\n            end:\n              line: 4\n              column: 7\n        start: 29\n        end: 34\n        range: [29, 34]\n        loc:\n          start:\n            line: 4\n            column: 2\n          end:\n            line: 4\n            column: 7\n      ,\n        key:\n          start: 38\n          end: 39\n          range: [38, 39]\n          loc:\n            start:\n              line: 5\n              column: 3\n            end:\n              line: 5\n              column: 4\n        staticClassName:\n          start: 37\n          end: 38\n          range: [37, 38]\n          loc:\n            start:\n              line: 5\n              column: 2\n            end:\n              line: 5\n              column: 3\n        value:\n          start: 42\n          end: 43\n          range: [42, 43]\n          loc:\n            start:\n              line: 5\n              column: 7\n            end:\n              line: 5\n              column: 8\n        start: 37\n        end: 43\n        range: [37, 43]\n        loc:\n          start:\n            line: 5\n            column: 2\n          end:\n            line: 5\n            column: 8\n      ,\n        key:\n          start: 48\n          end: 49\n          range: [48, 49]\n          loc:\n            start:\n              line: 6\n              column: 4\n            end:\n              line: 6\n              column: 5\n        staticClassName:\n          start: 46\n          end: 47\n          range: [46, 47]\n          loc:\n            start:\n              line: 6\n              column: 2\n            end:\n              line: 6\n              column: 3\n        value:\n          start: 52\n          end: 53\n          range: [52, 53]\n          loc:\n            start:\n              line: 6\n              column: 8\n            end:\n              line: 6\n              column: 9\n        start: 46\n        end: 53\n        range: [46, 53]\n        loc:\n          start:\n            line: 6\n            column: 2\n          end:\n            line: 6\n            column: 9\n      ,\n        key:\n          start: 58\n          end: 59\n          range: [58, 59]\n          loc:\n            start:\n              line: 7\n              column: 4\n            end:\n              line: 7\n              column: 5\n        staticClassName:\n          start: 56\n          end: 57\n          range: [56, 57]\n          loc:\n            start:\n              line: 7\n              column: 2\n            end:\n              line: 7\n              column: 3\n        start: 56\n        end: 64\n        range: [56, 64]\n        loc:\n          start:\n            line: 7\n            column: 2\n          end:\n            line: 7\n            column: 10\n      ,\n        key:\n          start: 72\n          end: 73\n          range: [72, 73]\n          loc:\n            start:\n              line: 8\n              column: 7\n            end:\n              line: 8\n              column: 8\n        staticClassName:\n          start: 67\n          end: 71\n          range: [67, 71]\n          loc:\n            start:\n              line: 8\n              column: 2\n            end:\n              line: 8\n              column: 6\n        start: 67\n        end: 78\n        range: [67, 78]\n        loc:\n          start:\n            line: 8\n            column: 2\n          end:\n            line: 8\n            column: 13\n      ,\n        key:\n          start: 86\n          end: 87\n          range: [86, 87]\n          loc:\n            start:\n              line: 9\n              column: 7\n            end:\n              line: 9\n              column: 8\n        staticClassName:\n          start: 81\n          end: 85\n          range: [81, 85]\n          loc:\n            start:\n              line: 9\n              column: 2\n            end:\n              line: 9\n              column: 6\n        value:\n          start: 90\n          end: 91\n          range: [90, 91]\n          loc:\n            start:\n              line: 9\n              column: 11\n            end:\n              line: 9\n              column: 12\n        start: 81\n        end: 91\n        range: [81, 91]\n        loc:\n          start:\n            line: 9\n            column: 2\n          end:\n            line: 9\n            column: 12\n      ]\n      start: 8\n      end: 91\n      range: [8, 91]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 9\n          column: 12\n    start: 0\n    end: 91\n    range: [0, 91]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 9\n        column: 12\n\n  testAstLocationData '''\n    class A\n      b: 1\n      [c]: 2\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      body: [\n        key:\n          start: 10\n          end: 11\n          range: [10, 11]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 3\n        value:\n          start: 13\n          end: 14\n          range: [13, 14]\n          loc:\n            start:\n              line: 2\n              column: 5\n            end:\n              line: 2\n              column: 6\n        start: 10\n        end: 14\n        range: [10, 14]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 6\n      ,\n        key:\n          start: 18\n          end: 19\n          range: [18, 19]\n          loc:\n            start:\n              line: 3\n              column: 3\n            end:\n              line: 3\n              column: 4\n        value:\n          start: 22\n          end: 23\n          range: [22, 23]\n          loc:\n            start:\n              line: 3\n              column: 7\n            end:\n              line: 3\n              column: 8\n        start: 17\n        end: 23\n        range: [17, 23]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 8\n      ]\n      start: 8\n      end: 23\n      range: [8, 23]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 8\n    start: 0\n    end: 23\n    range: [0, 23]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 8\n\n  testAstLocationData '''\n    class A\n      @[b]: 1\n      @[c]: ->\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      body: [\n        key:\n          start: 12\n          end: 13\n          range: [12, 13]\n          loc:\n            start:\n              line: 2\n              column: 4\n            end:\n              line: 2\n              column: 5\n        staticClassName:\n          start: 10\n          end: 11\n          range: [10, 11]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 3\n        value:\n          start: 16\n          end: 17\n          range: [16, 17]\n          loc:\n            start:\n              line: 2\n              column: 8\n            end:\n              line: 2\n              column: 9\n        start: 10\n        end: 17\n        range: [10, 17]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 9\n      ,\n        key:\n          start: 22\n          end: 23\n          range: [22, 23]\n          loc:\n            start:\n              line: 3\n              column: 4\n            end:\n              line: 3\n              column: 5\n        staticClassName:\n          start: 20\n          end: 21\n          range: [20, 21]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 3\n        start: 20\n        end: 28\n        range: [20, 28]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 10\n      ]\n      start: 8\n      end: 28\n      range: [8, 28]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 10\n    start: 0\n    end: 28\n    range: [0, 28]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 10\n\n  testAstLocationData '''\n    class A\n      b = 1\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      body: [\n        expression:\n          left:\n            start: 10\n            end: 11\n            range: [10, 11]\n            loc:\n              start:\n                line: 2\n                column: 2\n              end:\n                line: 2\n                column: 3\n          right:\n            start: 14\n            end: 15\n            range: [14, 15]\n            loc:\n              start:\n                line: 2\n                column: 6\n              end:\n                line: 2\n                column: 7\n          start: 10\n          end: 15\n          range: [10, 15]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 7\n        start: 10\n        end: 15\n        range: [10, 15]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 7\n      ]\n      start: 8\n      end: 15\n      range: [8, 15]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 7\n    start: 0\n    end: 15\n    range: [0, 15]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 7\n\ntest \"AST location data as expected for directives\", ->\n  testAstRootLocationData '''\n    'directive 1'\n    'use strict'\n    f()\n  ''',\n    type: 'File'\n    program:\n      body: [\n        start: 27\n        end: 30\n        range: [27, 30]\n        loc:\n          start:\n            line: 3\n            column: 0\n          end:\n            line: 3\n            column: 3\n      ]\n      directives: [\n        start: 0\n        end: 13\n        range: [0, 13]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 13\n      ,\n        start: 14\n        end: 26\n        range: [14, 26]\n        loc:\n          start:\n            line: 2\n            column: 0\n          end:\n            line: 2\n            column: 12\n      ]\n      start: 0\n      end: 30\n      range: [0, 30]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 3\n          column: 3\n    start: 0\n    end: 30\n    range: [0, 30]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  testAstRootLocationData '''\n    'use strict'\n  ''',\n    type: 'File'\n    program:\n      directives: [\n        start: 0\n        end: 12\n        range: [0, 12]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 12\n      ]\n      start: 0\n      end: 12\n      range: [0, 12]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 12\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 12\n\n  testAstLocationData '''\n    ->\n      'use strict'\n      f()\n      'not a directive'\n      g\n  ''',\n    type: 'FunctionExpression'\n    body:\n      directives: [\n        value:\n          start: 5\n          end: 17\n          range: [5, 17]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 14\n        start: 5\n        end: 17\n        range: [5, 17]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 14\n      ]\n      start: 3\n      end: 47\n      range: [3, 47]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 5\n          column: 3\n    start: 0\n    end: 47\n    range: [0, 47]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 5\n        column: 3\n\n  testAstLocationData '''\n    class A\n      'classes can have directives too'\n      a: ->\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      directives: [\n        start: 10\n        end: 43\n        range: [10, 43]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 35\n      ]\n      start: 8\n      end: 51\n      range: [8, 51]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 7\n    start: 0\n    end: 51\n    range: [0, 51]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 7\n\ntest \"AST location data as expected for PassthroughLiteral node\", ->\n  testAstLocationData \"`abc`\",\n    type: 'PassthroughLiteral'\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  code = '\\nconst CONSTANT = \"unreassignable!\"\\n'\n  testAstLocationData \"\"\"\n    ```\n      abc\n    ```\n  \"\"\",\n    type: 'PassthroughLiteral'\n    start: 0\n    end: 13\n    range: [0, 13]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  testAstLocationData \"``\",\n    type: 'PassthroughLiteral'\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 2\n\ntest \"AST location data as expected for comments\", ->\n  testAstCommentsLocationData '''\n    a # simple line comment\n  ''', [\n    start: 2\n    end: 23\n    range: [2, 23]\n    loc:\n      start:\n        line: 1\n        column: 2\n      end:\n        line: 1\n        column: 23\n  ]\n\n  testAstCommentsLocationData '''\n    a ### simple here comment ###\n  ''', [\n    start: 2\n    end: 29\n    range: [2, 29]\n    loc:\n      start:\n        line: 1\n        column: 2\n      end:\n        line: 1\n        column: 29\n  ]\n\n  testAstCommentsLocationData '''\n    # just a line comment\n  ''', [\n    start: 0\n    end: 21\n    range: [0, 21]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 21\n  ]\n\n  testAstCommentsLocationData '''\n    ### just a here comment ###\n  ''', [\n    start: 0\n    end: 27\n    range: [0, 27]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 27\n  ]\n\n  testAstCommentsLocationData '''\n    \"#{\n      # empty interpolation line comment\n     }\"\n  ''', [\n    start: 6\n    end: 40\n    range: [6, 40]\n    loc:\n      start:\n        line: 2\n        column: 2\n      end:\n        line: 2\n        column: 36\n  ]\n\n  testAstCommentsLocationData '''\n    \"#{\n      ### empty interpolation block comment ###\n     }\"\n  ''', [\n    start: 6\n    end: 47\n    range: [6, 47]\n    loc:\n      start:\n        line: 2\n        column: 2\n      end:\n        line: 2\n        column: 43\n  ]\n\n  testAstCommentsLocationData '''\n    # multiple line comments\n    # on consecutive lines\n  ''', [\n    start: 0\n    end: 24\n    range: [0, 24]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 24\n  ,\n    start: 25\n    end: 47\n    range: [25, 47]\n    loc:\n      start:\n        line: 2\n        column: 0\n      end:\n        line: 2\n        column: 22\n  ]\n\n  testAstCommentsLocationData '''\n    # multiple line comments\n\n    # with blank line\n  ''', [\n    start: 0\n    end: 24\n    range: [0, 24]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 24\n  ,\n    start: 26\n    end: 43\n    range: [26, 43]\n    loc:\n      start:\n        line: 3\n        column: 0\n      end:\n        line: 3\n        column: 17\n  ]\n\n  testAstCommentsLocationData '''\n    #no whitespace line comment\n  ''', [\n    start: 0\n    end: 27\n    range: [0, 27]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 27\n  ]\n\n  testAstCommentsLocationData '''\n    ###no whitespace here comment###\n  ''', [\n    start: 0\n    end: 32\n    range: [0, 32]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 32\n  ]\n\n  testAstCommentsLocationData '''\n    ###\n    # multiline\n    # here comment\n    ###\n  ''', [\n    start: 0\n    end: 34\n    range: [0, 34]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n  ]\n\n  testAstCommentsLocationData '''\n    if b\n      ###\n      # multiline\n      # indented here comment\n      ###\n      c\n  ''', [\n    start: 7\n    end: 56\n    range: [7, 56]\n    loc:\n      start:\n        line: 2\n        column: 2\n      end:\n        line: 5\n        column: 5\n  ]\n\ntest \"AST location data as expected for chained comparisons\", ->\n  testAstLocationData '''\n    a >= b < c\n  ''',\n    type: 'ChainedComparison'\n    operands: [\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    ,\n      start: 5\n      end: 6\n      range: [5, 6]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 6\n    ,\n      start: 9\n      end: 10\n      range: [9, 10]\n      loc:\n        start:\n          line: 1\n          column: 9\n        end:\n          line: 1\n          column: 10\n    ]\n    start: 0\n    end: 10\n    range: [0, 10]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 10\n\ntest \"AST location data as expected for Sequence\", ->\n  testAstLocationData '''\n    (a; b)\n  ''',\n    type: 'SequenceExpression'\n    expressions: [\n      start: 1\n      end: 2\n      range: [1, 2]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 2\n    ,\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    ]\n    start: 1\n    end: 5\n    range: [1, 5]\n    loc:\n      start:\n        line: 1\n        column: 1\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData '''\n    (a; b)\"\"\n  ''',\n    type: 'TaggedTemplateExpression'\n    tag:\n      expressions: [\n        start: 1\n        end: 2\n        range: [1, 2]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 2\n      ,\n        start: 4\n        end: 5\n        range: [4, 5]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 1\n            column: 5\n      ]\n      start: 1\n      end: 5\n      range: [1, 5]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\ntest \"AST location data as expected for blocks with comments\", ->\n  # trailing indented comment\n  testAstLocationData '''\n    ->\n      a\n      # b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 3\n      end: 12\n      range: [3, 12]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 5\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 5\n\n  testAstLocationData '''\n    if a\n      b\n      ### c ###\n  ''',\n    type: 'IfStatement'\n    consequent:\n      start: 5\n      end: 20\n      range: [5, 20]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 11\n    start: 0\n    end: 20\n    range: [0, 20]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 11\n\n  # trailing non-indented comment\n  testAstLocationData '''\n    ->\n      a\n    # b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 3\n      end: 6\n      range: [3, 6]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 3\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 3\n\n  testAstLocationData '''\n    if a\n      b\n    ### c ###\n  ''',\n    type: 'IfStatement'\n    consequent:\n      start: 5\n      end: 8\n      range: [5, 8]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 3\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 3\n\n  # multiple trailing indented comments\n  testAstLocationData '''\n    class A\n      a: ->\n      # b\n      #comment\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      start: 8\n      end: 32\n      range: [8, 32]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 4\n          column: 10\n    start: 0\n    end: 32\n    range: [0, 32]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 10\n\n  testAstLocationData '''\n    a = ->\n      c\n      # b\n      ### comment ###\n  ''',\n    type: 'AssignmentExpression'\n    right:\n      start: 4\n      end: 34\n      range: [4, 34]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 4\n          column: 17\n    start: 0\n    end: 34\n    range: [0, 34]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 17\n\n  # multiple trailing comments, some indented\n  testAstLocationData '''\n    class A\n      a: ->\n      # b\n    #comment\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      start: 8\n      end: 21\n      range: [8, 21]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 5\n    start: 0\n    end: 21\n    range: [0, 21]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 5\n\n  # leading indented comment\n  testAstLocationData '''\n    ->\n      # a\n      b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 3\n      end: 12\n      range: [3, 12]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 3\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  testAstLocationData '''\n    if a\n      ### b ###\n      c\n  ''',\n    type: 'IfStatement'\n    consequent:\n      start: 5\n      end: 20\n      range: [5, 20]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 3\n    start: 0\n    end: 20\n    range: [0, 20]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  # multiple leading indented comments\n  testAstLocationData '''\n    ->\n      # a\n      # b\n      c\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 3\n      end: 18\n      range: [3, 18]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 4\n          column: 3\n    start: 0\n    end: 18\n    range: [0, 18]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n\n  testAstLocationData '''\n    if a\n      ### b ###\n      # c\n      d\n  ''',\n    type: 'IfStatement'\n    consequent:\n      start: 5\n      end: 26\n      range: [5, 26]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 4\n          column: 3\n    start: 0\n    end: 26\n    range: [0, 26]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n\n  # just a comment\n  testAstLocationData '''\n    ->\n      # a\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 3\n      end: 8\n      range: [3, 8]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 5\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 5\n\n  testAstLocationData '''\n    if a\n      ### b ###\n    else\n      c\n  ''',\n    type: 'IfStatement'\n    consequent:\n      start: 5\n      end: 16\n      range: [5, 16]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 11\n    start: 0\n    end: 25\n    range: [0, 25]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n\n  # just a non-indented comment\n  testAstLocationData '''\n    ->\n    # a\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 2\n      end: 2\n      range: [2, 2]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 2\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 2\n\n  # nested dedented comment\n  testAstLocationData '''\n    switch a\n      when b\n        c\n      # d\n  ''',\n    type: 'SwitchStatement'\n    cases: [\n      start: 11\n      end: 23\n      range: [11, 23]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 3\n          column: 5\n    ]\n    start: 0\n    end: 29\n    range: [0, 29]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 5\n\n  # trailing implicit call in condition followed by indented comment\n  testAstLocationData '''\n    if a b\n      # c\n      d\n  ''',\n    type: 'IfStatement'\n    test:\n      start: 3\n      end: 6\n      range: [3, 6]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 6\n    consequent:\n      start: 7\n      end: 16\n      range: [7, 16]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 3\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\ntest \"AST location data as expected for heregex comments\", ->\n  code = '''\n    ///\n      a # b\n    ///\n  '''\n\n  testAstLocationData code,\n    type: 'RegExpLiteral'\n    start: 0\n    end: 15\n    range: [0, 15]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  eq getAstRoot(code).comments.length, 0\n\ntest \"AST location data as expected with carriage returns\", ->\n  code = '''\n    a =\\r\n    \"#{\\r\n      b\\r\n    }\"\n  '''\n\n  testAstLocationData code,\n    type: 'AssignmentExpression'\n    right:\n      expressions: [\n        start: 12\n        end: 13\n        range: [12, 13]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 3\n      ]\n      quasis: [\n        start: 6\n        end: 6\n        range: [6, 6]\n        loc:\n          start:\n            line: 2\n            column: 1\n          end:\n            line: 2\n            column: 1\n      ,\n        start: 16\n        end: 16\n        range: [16, 16]\n        loc:\n          start:\n            line: 4\n            column: 1\n          end:\n            line: 4\n            column: 1\n      ]\n      start: 5\n      end: 17\n      range: [5, 17]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 4\n          column: 2\n    start: 0\n    end: 17\n    range: [0, 17]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 2\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"argument_parsing\">\nreturn unless require?\n{buildCSOptionParser} = require '../lib/coffeescript/command'\n\noptionParser = buildCSOptionParser()\n\nsameOptions = (opts1, opts2, msg) ->\n  ownKeys = Object.keys(opts1).sort()\n  otherKeys = Object.keys(opts2).sort()\n  arrayEq ownKeys, otherKeys, msg\n  for k in ownKeys\n    arrayEq opts1[k], opts2[k], msg\n  yes\n\ntest \"combined options are not split after initial file name\", ->\n  argv = ['some-file.coffee', '-bc']\n  parsed = optionParser.parse argv\n  expected = arguments: ['some-file.coffee', '-bc']\n  sameOptions parsed, expected\n\n  argv = ['some-file.litcoffee', '-bc']\n  parsed = optionParser.parse argv\n  expected = arguments: ['some-file.litcoffee', '-bc']\n  sameOptions parsed, expected\n\n  argv = ['-c', 'some-file.coffee', '-bc']\n  parsed = optionParser.parse argv\n  expected =\n    compile: yes\n    arguments: ['some-file.coffee', '-bc']\n  sameOptions parsed, expected\n\n  argv = ['-bc', 'some-file.coffee', '-bc']\n  parsed = optionParser.parse argv\n  expected =\n    bare: yes\n    compile: yes\n    arguments: ['some-file.coffee', '-bc']\n  sameOptions parsed, expected\n\ntest \"combined options are not split after a '--', which is discarded\", ->\n  argv = ['--', '-bc']\n  parsed = optionParser.parse argv\n  expected =\n    doubleDashed: yes\n    arguments: ['-bc']\n  sameOptions parsed, expected\n\n  argv = ['-bc', '--', '-bc']\n  parsed = optionParser.parse argv\n  expected =\n    bare: yes\n    compile: yes\n    doubleDashed: yes\n    arguments: ['-bc']\n  sameOptions parsed, expected\n\ntest \"options are not split after any '--'\", ->\n  argv = ['--', '--', '-bc']\n  parsed = optionParser.parse argv\n  expected =\n    doubleDashed: yes\n    arguments: ['--', '-bc']\n  sameOptions parsed, expected\n\n  argv = ['--', 'some-file.coffee', '--', 'arg']\n  parsed = optionParser.parse argv\n  expected =\n    doubleDashed: yes\n    arguments: ['some-file.coffee', '--', 'arg']\n  sameOptions parsed, expected\n\n  argv = ['--', 'arg', 'some-file.coffee', '--', '-bc']\n  parsed = optionParser.parse argv\n  expected =\n    doubleDashed: yes\n    arguments: ['arg', 'some-file.coffee', '--', '-bc']\n  sameOptions parsed, expected\n\ntest \"any non-option argument stops argument parsing\", ->\n  argv = ['arg', '-bc']\n  parsed = optionParser.parse argv\n  expected = arguments: ['arg', '-bc']\n  sameOptions parsed, expected\n\ntest \"later '--' are not removed\", ->\n  argv = ['some-file.coffee', '--', '-bc']\n  parsed = optionParser.parse argv\n  expected = arguments: ['some-file.coffee', '--', '-bc']\n  sameOptions parsed, expected\n\ntest \"throw on invalid options\", ->\n  argv = ['-k']\n  throws -> optionParser.parse argv\n\n  argv = ['-ck']\n  throws (-> optionParser.parse argv), /multi-flag/\n\n  argv = ['-kc']\n  throws (-> optionParser.parse argv), /multi-flag/\n\n  argv = ['-oc']\n  throws (-> optionParser.parse argv), /needs an argument/\n\n  argv = ['-o']\n  throws (-> optionParser.parse argv), /value required/\n\n  argv = ['-co']\n  throws (-> optionParser.parse argv), /value required/\n\n  # Check if all flags in a multi-flag are recognized before checking if flags\n  # before the last need arguments.\n  argv = ['-ok']\n  throws (-> optionParser.parse argv), /unrecognized option/\n\ntest \"has expected help text\", ->\n  ok optionParser.help() is '''\n\nUsage: coffee [options] path/to/script.coffee [args]\n\nIf called without options, `coffee` will run your script.\n\n      --ast          generate an abstract syntax tree of nodes\n  -b, --bare         compile without a top-level function wrapper\n  -c, --compile      compile to JavaScript and save as .js files\n  -e, --eval         pass a string from the command line as input\n  -h, --help         display this help message\n  -i, --interactive  run an interactive CoffeeScript REPL\n  -j, --join         concatenate the source CoffeeScript before compiling\n  -l, --literate     treat stdio as literate style coffeescript\n  -m, --map          generate source map and save as .js.map files\n  -M, --inline-map   generate source map and include it directly in output\n  -n, --nodes        print out the parse tree that the parser produces\n      --nodejs       pass options directly to the \"node\" binary\n      --no-header    suppress the \"Generated by\" header\n  -o, --output       set the output path or path/filename for compiled JavaScript\n  -p, --print        print out the compiled JavaScript\n  -r, --require      require the given module before eval or REPL\n  -s, --stdio        listen for and compile scripts over stdio\n  -t, --transpile    pipe generated JavaScript through Babel\n      --tokens       print out the tokens that the lexer/rewriter produce\n  -v, --version      display the version number\n  -w, --watch        watch scripts for changes and rerun commands\n\n  '''\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"arrays\">\n# Array Literals\n# --------------\n\n# * Array Literals\n# * Splats in Array Literals\n\n# TODO: add indexing and method invocation tests: [1][0] is 1, [].toString()\n\ntest \"trailing commas\", ->\n  trailingComma = [1, 2, 3,]\n  ok (trailingComma[0] is 1) and (trailingComma[2] is 3) and (trailingComma.length is 3)\n\n  trailingComma = [\n    1, 2, 3,\n    4, 5, 6\n    7, 8, 9,\n  ]\n  (sum = (sum or 0) + n) for n in trailingComma\n\n  a = [((x) -> x), ((x) -> x * x)]\n  ok a.length is 2\n\ntest \"incorrect indentation without commas\", ->\n  result = [['a']\n   {b: 'c'}]\n  ok result[0][0] is 'a'\n  ok result[1]['b'] is 'c'\n\n# Elisions\ntest \"array elisions\", ->\n  eq [,1].length, 2\n  eq [,,1,2,,].length, 5\n  arr = [1,,2]\n  eq arr.length, 3\n  eq arr[1], undefined\n  eq [,,].length, 2\n\ntest \"array elisions indentation and commas\", ->\n  arr1 = [\n    , 1, 2, , , 3,\n    4, 5, 6\n    , , 8, 9,\n  ]\n  eq arr1.length, 12\n  eq arr1[5], 3\n  eq arr1[9], undefined\n  arr2 = [, , 1,\n    2, , 3,\n    , 4, 5\n    6\n    , , ,\n  ]\n  eq arr2.length, 12\n  eq arr2[8], 5\n  eq arr2[1], undefined\n\ntest \"array elisions destructuring\", ->\n  arr = [1,2,3,4,5,6,7,8,9]\n  [,a] = arr\n  [,,,b] = arr\n  arrayEq [a,b], [2,4]\n  [,a,,b,,c,,,d] = arr\n  arrayEq [a,b,c,d], [2,4,6,9]\n  [\n    ,e,\n    ,f,\n    ,g,\n    ,,h] = arr\n  arrayEq [e,f,g,h], [2,4,6,9]\n\ntest \"array elisions destructuring with splats and expansions\", ->\n  arr = [1,2,3,4,5,6,7,8,9]\n  [,a,,,b...] = arr\n  arrayEq [a,b], [2,[5,6,7,8,9]]\n  [,c,...,,d,,e] = arr\n  arrayEq [c,d,e], [2,7,9]\n  [...,f,,,g,,,] = arr\n  arrayEq [f,g], [4,7]\n\ntest \"array elisions as function parameters\", ->\n  arr = [1,2,3,4,5,6,7,8,9]\n  foo = ([,a]) -> a\n  a = foo arr\n  eq a, 2\n  foo = ([,,,a]) -> a\n  a = foo arr\n  eq a, 4\n  foo = ([,a,,b,,c,,,d]) -> [a,b,c,d]\n  [a,b,c,d] = foo arr\n  arrayEq [a,b,c,d], [2,4,6,9]\n\ntest \"array elisions nested destructuring\", ->\n  arr = [\n    1,\n    [2,3, [4,5,6, [7,8,9] ] ]\n  ]\n  [,a] = arr\n  arrayEq a[2][3], [7,8,9]\n  [,[,,[,b,,[,,c]]]] = arr\n  eq b, 5\n  eq c, 9\n  aobj = [\n    {},\n    {x: 2},\n    {},\n    [\n      {},\n      {},\n      {z:1, w:[1,2,4], p:3, q:4}\n      {},\n      {}\n    ]\n  ]\n  [,d,,[,,{w}]] = aobj\n  deepEqual d, {x:2}\n  arrayEq w, [1,2,4]\n\ntest \"#5112: array elisions not detected inside strings\", ->\n  arr = [\n    str: \", #{3}\"\n  ]\n  eq arr[0].str, ', 3'\n\n# Splats in Array Literals\n\ntest \"array splat expansions with assignments\", ->\n  nums = [1, 2, 3]\n  list = [a = 0, nums..., b = 4]\n  eq 0, a\n  eq 4, b\n  arrayEq [0,1,2,3,4], list\n\n\ntest \"mixed shorthand objects in array lists\", ->\n  arr = [\n    a:1\n    'b'\n    c:1\n  ]\n  ok arr.length is 3\n  ok arr[2].c is 1\n\n  arr = [b: 1, a: 2, 100]\n  eq arr[1], 100\n\n  arr = [a:0, b:1, (1 + 1)]\n  eq arr[1], 2\n\n  arr = [a:1, 'a', b:1, 'b']\n  eq arr.length, 4\n  eq arr[2].b, 1\n  eq arr[3], 'b'\n\ntest \"array splats with nested arrays\", ->\n  nonce = {}\n  a = [nonce]\n  list = [1, 2, a...]\n  eq list[0], 1\n  eq list[2], nonce\n\n  a = [[nonce]]\n  list = [1, 2, a...]\n  arrayEq list, [1, 2, [nonce]]\n\ntest \"#4260: splat after existential operator soak\", ->\n  a = {b: [3]}\n  foo = (a) -> [a]\n  arrayEq [a?.b...], [3]\n  arrayEq [c?.b ? []...], []\n  arrayEq [...a?.b], [3]\n  arrayEq [...c?.b ? []], []\n  arrayEq foo(a?.b...), [3]\n  arrayEq foo(...a?.b), [3]\n  arrayEq foo(c?.b ? []...), [undefined]\n  arrayEq foo(...c?.b ? []), [undefined]\n  e = yes\n  f = null\n  arrayEq [(a if e)?.b...], [3]\n  arrayEq [(a if f)?.b ? []...], []\n  arrayEq [...(a if e)?.b], [3]\n  arrayEq [...(a if f)?.b ? []], []\n  arrayEq foo((a if e)?.b...), [3]\n  arrayEq foo(...(a if e)?.b), [3]\n  arrayEq foo((a if f)?.b ? []...), [undefined]\n  arrayEq foo(...(a if f)?.b ? []), [undefined]\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  arrayEq [... a?.b], [3]\n  arrayEq [... c?.b ? []], []\n  arrayEq [a?.b ...], [3]\n  arrayEq [(a if e)?.b ...], [3]\n  arrayEq foo(a?.b ...), [3]\n  arrayEq foo(... a?.b), [3]\n\ntest \"#1349: trailing if after splat\", ->\n  a = [3]\n  b = yes\n  c = null\n  foo = (a) -> [a]\n  arrayEq [a if b...], [3]\n  arrayEq [(a if c) ? []...], []\n  arrayEq [...a if b], [3]\n  arrayEq [...(a if c) ? []], []\n  arrayEq foo((a if b)...), [3]\n  arrayEq foo(...(a if b)), [3]\n  arrayEq foo((a if c) ? []...), [undefined]\n  arrayEq foo(...(a if c) ? []), [undefined]\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  arrayEq [... a if b], [3]\n  arrayEq [a if b ...], [3]\n\ntest \"#1274: `[] = a()` compiles to `false` instead of `a()`\", ->\n  a = false\n  fn = -> a = true\n  [] = fn()\n  ok a\n\ntest \"#3194: string interpolation in array\", ->\n  arr = [ \"a\"\n          key: 'value'\n        ]\n  eq 2, arr.length\n  eq 'a', arr[0]\n  eq 'value', arr[1].key\n\n  b = 'b'\n  arr = [ \"a#{b}\"\n          key: 'value'\n        ]\n  eq 2, arr.length\n  eq 'ab', arr[0]\n  eq 'value', arr[1].key\n\ntest \"regex interpolation in array\", ->\n  arr = [ /a/\n          key: 'value'\n        ]\n  eq 2, arr.length\n  eq 'a', arr[0].source\n  eq 'value', arr[1].key\n\n  b = 'b'\n  arr = [ ///a#{b}///\n          key: 'value'\n        ]\n  eq 2, arr.length\n  eq 'ab', arr[0].source\n  eq 'value', arr[1].key\n\ntest \"splat extraction from generators\", ->\n  gen = ->\n    yield 1\n    yield 2\n    yield 3\n  arrayEq [ gen()... ], [ 1, 2, 3 ]\n\ntest \"for-from loops over Array\", ->\n  array1 = [50, 30, 70, 20]\n  array2 = []\n  for x from array1\n    array2.push(x)\n  arrayEq array1, array2\n\n  array1 = [[20, 30], [40, 50]]\n  array2 = []\n  for [a, b] from array1\n    array2.push(b)\n    array2.push(a)\n  arrayEq array2, [30, 20, 50, 40]\n\n  array1 = [{a: 10, b: 20, c: 30}, {a: 40, b: 50, c: 60}]\n  array2 = []\n  for {a: a, b, c: d} from array1\n    array2.push([a, b, d])\n  arrayEq array2, [[10, 20, 30], [40, 50, 60]]\n\n  array1 = [[10, 20, 30, 40, 50]]\n  for [a, b..., c] from array1\n    eq 10, a\n    arrayEq [20, 30, 40], b\n    eq 50, c\n\ntest \"for-from comprehensions over Array\", ->\n  array1 = (x + 10 for x from [10, 20, 30])\n  ok array1.join(' ') is '20 30 40'\n\n  array2 = (x for x from [30, 41, 57] when x %% 3 is 0)\n  ok array2.join(' ') is '30 57'\n\n  array1 = (b + 5 for [a, b] from [[20, 30], [40, 50]])\n  ok array1.join(' ') is '35 55'\n\n  array2 = (a + b for [a, b] from [[10, 20], [30, 40], [50, 60]] when a + b >= 70)\n  ok array2.join(' ') is '70 110'\n\ntest \"#5201: simple indented elisions\", ->\n  arr1 = [\n    ,\n    1,\n    2,\n    ,\n    ,\n    3,\n    4,\n    5,\n    6\n    ,\n    ,\n    8,\n    9,\n  ]\n  eq arr1.length, 12\n  eq arr1[5], 3\n  eq arr1[9], undefined\n\n  arr2 = [\n    ,\n    ,\n    1,\n    2,\n    ,\n    3,\n    ,\n    4,\n    5\n    6\n    ,\n    ,\n    ,\n  ]\n  eq arr2.length, 12\n  eq arr2[8], 5\n  eq arr2[1], undefined\n\n  arr3 = [\n    ,\n    ,\n    ,\n  ]\n  eq arr3.length, 3\n\n  arr4 = [, , ,]\n  eq arr4.length, 3\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"assignment\">\n# Assignment\n# ----------\n\n# * Assignment\n# * Compound Assignment\n# * Destructuring Assignment\n# * Context Property (@) Assignment\n# * Existential Assignment (?=)\n# * Assignment to variables similar to generated variables\n\ntest \"context property assignment (using @)\", ->\n  nonce = {}\n  addMethod = ->\n    @method = -> nonce\n    this\n  eq nonce, addMethod.call({}).method()\n\ntest \"unassignable values\", ->\n  nonce = {}\n  for nonref in ['', '\"\"', '0', 'f()'].concat CoffeeScript.RESERVED\n    eq nonce, (try CoffeeScript.compile \"#{nonref} = v\" catch e then nonce)\n\n# Compound Assignment\n\ntest \"boolean operators\", ->\n  nonce = {}\n\n  a  = 0\n  a or= nonce\n  eq nonce, a\n\n  b  = 1\n  b or= nonce\n  eq 1, b\n\n  c = 0\n  c and= nonce\n  eq 0, c\n\n  d = 1\n  d and= nonce\n  eq nonce, d\n\n  # ensure that RHS is treated as a group\n  e = f = false\n  e and= f or true\n  eq false, e\n\ntest \"compound assignment as a sub expression\", ->\n  [a, b, c] = [1, 2, 3]\n  eq 6, (a + b += c)\n  eq 1, a\n  eq 5, b\n  eq 3, c\n\n# *note: this test could still use refactoring*\ntest \"compound assignment should be careful about caching variables\", ->\n  count = 0\n  list = []\n\n  list[++count] or= 1\n  eq 1, list[1]\n  eq 1, count\n\n  list[++count] ?= 2\n  eq 2, list[2]\n  eq 2, count\n\n  list[count++] and= 6\n  eq 6, list[2]\n  eq 3, count\n\n  base = ->\n    ++count\n    base\n\n  base().four or= 4\n  eq 4, base.four\n  eq 4, count\n\n  base().five ?= 5\n  eq 5, base.five\n  eq 5, count\n\n  eq 5, base().five ?= 6\n  eq 6, count\n\ntest \"compound assignment with implicit objects\", ->\n  obj = undefined\n  obj ?=\n    one: 1\n\n  eq 1, obj.one\n\n  obj and=\n    two: 2\n\n  eq undefined, obj.one\n  eq         2, obj.two\n\ntest \"compound assignment (math operators)\", ->\n  num = 10\n  num -= 5\n  eq 5, num\n\n  num *= 10\n  eq 50, num\n\n  num /= 10\n  eq 5, num\n\n  num %= 3\n  eq 2, num\n\ntest \"more compound assignment\", ->\n  a = {}\n  val = undefined\n  val ||= a\n  val ||= true\n  eq a, val\n\n  b = {}\n  val &&= true\n  eq val, true\n  val &&= b\n  eq b, val\n\n  c = {}\n  val = null\n  val ?= c\n  val ?= true\n  eq c, val\n\ntest \"#1192: assignment starting with object literals\", ->\n  doesNotThrow (-> CoffeeScript.run \"{}.p = 0\")\n  doesNotThrow (-> CoffeeScript.run \"{}.p++\")\n  doesNotThrow (-> CoffeeScript.run \"{}[0] = 1\")\n  doesNotThrow (-> CoffeeScript.run \"\"\"{a: 1, 'b', \"#{1}\": 2}.p = 0\"\"\")\n  doesNotThrow (-> CoffeeScript.run \"{a:{0:{}}}.a[0] = 0\")\n\n\n# Destructuring Assignment\n\ntest \"empty destructuring assignment\", ->\n  {} = {}\n  [] = []\n\ntest \"chained destructuring assignments\", ->\n  [a] = {0: b} = {'0': c} = [nonce={}]\n  eq nonce, a\n  eq nonce, b\n  eq nonce, c\n\ntest \"variable swapping to verify caching of RHS values when appropriate\", ->\n  a = nonceA = {}\n  b = nonceB = {}\n  c = nonceC = {}\n  [a, b, c] = [b, c, a]\n  eq nonceB, a\n  eq nonceC, b\n  eq nonceA, c\n  [a, b, c] = [b, c, a]\n  eq nonceC, a\n  eq nonceA, b\n  eq nonceB, c\n  fn = ->\n    [a, b, c] = [b, c, a]\n  arrayEq [nonceA,nonceB,nonceC], fn()\n  eq nonceA, a\n  eq nonceB, b\n  eq nonceC, c\n\ntest \"#713: destructuring assignment should return right-hand-side value\", ->\n  nonces = [nonceA={},nonceB={}]\n  eq nonces, [a, b] = [c, d] = nonces\n  eq nonceA, a\n  eq nonceA, c\n  eq nonceB, b\n  eq nonceB, d\n\ntest \"#4787 destructuring of objects within arrays\", ->\n  arr = [1, {a:1, b:2}]\n  [...,{a, b}] = arr\n  eq a, 1\n  eq b, arr[1].b\n  deepEqual {a, b}, arr[1]\n\ntest \"destructuring assignment with splats\", ->\n  a = {}; b = {}; c = {}; d = {}; e = {}\n  [x,y...,z] = [a,b,c,d,e]\n  eq a, x\n  arrayEq [b,c,d], y\n  eq e, z\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  [x,y ...,z] = [a,b,c,d,e]\n  eq a, x\n  arrayEq [b,c,d], y\n  eq e, z\n\ntest \"deep destructuring assignment with splats\", ->\n  a={}; b={}; c={}; d={}; e={}; f={}; g={}; h={}; i={}\n  [u, [v, w..., x], y..., z] = [a, [b, c, d, e], f, g, h, i]\n  eq a, u\n  eq b, v\n  arrayEq [c,d], w\n  eq e, x\n  arrayEq [f,g,h], y\n  eq i, z\n\ntest \"destructuring assignment with objects\", ->\n  a={}; b={}; c={}\n  obj = {a,b,c}\n  {a:x, b:y, c:z} = obj\n  eq a, x\n  eq b, y\n  eq c, z\n\ntest \"deep destructuring assignment with objects\", ->\n  a={}; b={}; c={}; d={}\n  obj = {\n    a\n    b: {\n      'c': {\n        d: [\n          b\n          {e: c, f: d}\n        ]\n      }\n    }\n  }\n  {a: w, 'b': {c: d: [x, {'f': z, e: y}]}} = obj\n  eq a, w\n  eq b, x\n  eq c, y\n  eq d, z\n\ntest \"destructuring assignment with objects and splats\", ->\n  a={}; b={}; c={}; d={}\n  obj = a: b: [a, b, c, d]\n  {a: b: [y, z...]} = obj\n  eq a, y\n  arrayEq [b,c,d], z\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  {a: b: [y, z ...]} = obj\n  eq a, y\n  arrayEq [b,c,d], z\n\ntest \"destructuring assignment against an expression\", ->\n  a={}; b={}\n  [y, z] = if true then [a, b] else [b, a]\n  eq a, y\n  eq b, z\n\ntest \"bracket insertion when necessary\", ->\n  [a] = [0] ? [1]\n  eq a, 0\n\n# for implicit destructuring assignment in comprehensions, see the comprehension tests\n\ntest \"destructuring assignment with context (@) properties\", ->\n  a={}; b={}; c={}; d={}; e={}\n  obj =\n    fn: () ->\n      local = [a, {b, c}, d, e]\n      [@a, {b: @b, c: @c}, @d, @e] = local\n  eq undefined, obj[key] for key in ['a','b','c','d','e']\n  obj.fn()\n  eq a, obj.a\n  eq b, obj.b\n  eq c, obj.c\n  eq d, obj.d\n  eq e, obj.e\n\ntest \"#1024: destructure empty assignments to produce javascript-like results\", ->\n  eq 2 * [] = 3 + 5, 16\n\ntest \"#1005: invalid identifiers allowed on LHS of destructuring assignment\", ->\n  disallowed = ['eval', 'arguments'].concat CoffeeScript.RESERVED\n  throwsCompileError \"[#{disallowed.join ', '}] = x\", null, null, 'all disallowed'\n  throwsCompileError \"[#{disallowed.join '..., '}...] = x\", null, null, 'all disallowed as splats'\n  t = tSplat = null\n  for v in disallowed when v isnt 'class' # `class` by itself is an expression\n    throwsCompileError t, null, null, t = \"[#{v}] = x\"\n    throwsCompileError tSplat, null, null, tSplat = \"[#{v}...] = x\"\n  for v in disallowed\n    doesNotThrowCompileError \"[a.#{v}] = x\"\n    doesNotThrowCompileError \"[a.#{v}...] = x\"\n    doesNotThrowCompileError \"[@#{v}] = x\"\n    doesNotThrowCompileError \"[@#{v}...] = x\"\n\ntest \"#2055: destructuring assignment with `new`\", ->\n  {length} = new Array\n  eq 0, length\n\ntest \"#156: destructuring with expansion\", ->\n  array = [1..5]\n  [first, ..., last] = array\n  eq 1, first\n  eq 5, last\n  [..., lastButOne, last] = array\n  eq 4, lastButOne\n  eq 5, last\n  [first, second, ..., last] = array\n  eq 2, second\n  [..., last] = 'strings as well -> x'\n  eq 'x', last\n  throwsCompileError \"[1, ..., 3]\",        null, null, \"prohibit expansion outside of assignment\"\n  throwsCompileError \"[..., a, b...] = c\", null, null, \"prohibit expansion and a splat\"\n  throwsCompileError \"[...] = c\",          null, null, \"prohibit lone expansion\"\n\ntest \"destructuring with dynamic keys\", ->\n  {\"#{'a'}\": a, \"\"\"#{'b'}\"\"\": b, c} = {a: 1, b: 2, c: 3}\n  eq 1, a\n  eq 2, b\n  eq 3, c\n  throwsCompileError '{\"#{a}\"} = b'\n\ntest \"simple array destructuring defaults\", ->\n  [a = 1] = []\n  eq 1, a\n  [a = 2] = [undefined]\n  eq 2, a\n  [a = 3] = [null]\n  eq null, a # Breaking change in CS2: per ES2015, default values are applied for `undefined` but not for `null`.\n  [a = 4] = [0]\n  eq 0, a\n  arr = [a = 5]\n  eq 5, a\n  arrayEq [5], arr\n\ntest \"simple object destructuring defaults\", ->\n  {b = 1} = {}\n  eq b, 1\n  {b = 2} = {b: undefined}\n  eq b, 2\n  {b = 3} = {b: null}\n  eq b, null # Breaking change in CS2: per ES2015, default values are applied for `undefined` but not for `null`.\n  {b = 4} = {b: 0}\n  eq b, 0\n\n  {b: c = 1} = {}\n  eq c, 1\n  {b: c = 2} = {b: undefined}\n  eq c, 2\n  {b: c = 3} = {b: null}\n  eq c, null # Breaking change in CS2: per ES2015, default values are applied for `undefined` but not for `null`.\n  {b: c = 4} = {b: 0}\n  eq c, 0\n\ntest \"multiple array destructuring defaults\", ->\n  [a = 1, b = 2, c] = [undefined, 12, 13]\n  eq a, 1\n  eq b, 12\n  eq c, 13\n  [a, b = 2, c = 3] = [undefined, 12, 13]\n  eq a, undefined\n  eq b, 12\n  eq c, 13\n  [a = 1, b, c = 3] = [11, 12]\n  eq a, 11\n  eq b, 12\n  eq c, 3\n\ntest \"multiple object destructuring defaults\", ->\n  {a = 1, b: bb = 2, 'c': c = 3, \"#{0}\": d = 4} = {\"#{'b'}\": 12}\n  eq a, 1\n  eq bb, 12\n  eq c, 3\n  eq d, 4\n\ntest \"array destructuring defaults with splats\", ->\n  [..., a = 9] = []\n  eq a, 9\n  [..., b = 9] = [19]\n  eq b, 19\n\ntest \"deep destructuring assignment with defaults\", ->\n  [a, [{b = 1, c = 3}] = [c: 2]] = [0]\n  eq a, 0\n  eq b, 1\n  eq c, 2\n\ntest \"destructuring assignment with context (@) properties and defaults\", ->\n  a={}; b={}; c={}; d={}; e={}\n  obj =\n    fn: () ->\n      local = [a, {b, c: undefined}, d]\n      [@a, {b: @b = b, @c = c}, @d, @e = e] = local\n  eq undefined, obj[key] for key in ['a','b','c','d','e']\n  obj.fn()\n  eq a, obj.a\n  eq b, obj.b\n  eq c, obj.c\n  eq d, obj.d\n  eq e, obj.e\n\ntest \"destructuring assignment with defaults single evaluation\", ->\n  callCount = 0\n  fn = -> callCount++\n  [a = fn()] = []\n  eq 0, a\n  eq 1, callCount\n  [a = fn()] = [10]\n  eq 10, a\n  eq 1, callCount\n  {a = fn(), b: c = fn()} = {a: 20, b: undefined}\n  eq 20, a\n  eq c, 1\n  eq callCount, 2\n\n\n# Existential Assignment\n\ntest \"existential assignment\", ->\n  nonce = {}\n  a = false\n  a ?= nonce\n  eq false, a\n  b = undefined\n  b ?= nonce\n  eq nonce, b\n  c = null\n  c ?= nonce\n  eq nonce, c\n\ntest \"#1627: prohibit conditional assignment of undefined variables\", ->\n  throwsCompileError \"x ?= 10\",        null, null, \"prohibit (x ?= 10)\"\n  throwsCompileError \"x ||= 10\",       null, null, \"prohibit (x ||= 10)\"\n  throwsCompileError \"x or= 10\",       null, null, \"prohibit (x or= 10)\"\n  throwsCompileError \"do -> x ?= 10\",  null, null, \"prohibit (do -> x ?= 10)\"\n  throwsCompileError \"do -> x ||= 10\", null, null, \"prohibit (do -> x ||= 10)\"\n  throwsCompileError \"do -> x or= 10\", null, null, \"prohibit (do -> x or= 10)\"\n  doesNotThrowCompileError \"x = null; x ?= 10\",        null, \"allow (x = null; x ?= 10)\"\n  doesNotThrowCompileError \"x = null; x ||= 10\",       null, \"allow (x = null; x ||= 10)\"\n  doesNotThrowCompileError \"x = null; x or= 10\",       null, \"allow (x = null; x or= 10)\"\n  doesNotThrowCompileError \"x = null; do -> x ?= 10\",  null, \"allow (x = null; do -> x ?= 10)\"\n  doesNotThrowCompileError \"x = null; do -> x ||= 10\", null, \"allow (x = null; do -> x ||= 10)\"\n  doesNotThrowCompileError \"x = null; do -> x or= 10\", null, \"allow (x = null; do -> x or= 10)\"\n\n  throwsCompileError \"-> -> -> x ?= 10\", null, null, \"prohibit (-> -> -> x ?= 10)\"\n  doesNotThrowCompileError \"x = null; -> -> -> x ?= 10\", null, \"allow (x = null; -> -> -> x ?= 10)\"\n\ntest \"more existential assignment\", ->\n  global.temp ?= 0\n  eq global.temp, 0\n  global.temp or= 100\n  eq global.temp, 100\n  delete global.temp\n\ntest \"#1348, #1216: existential assignment compilation\", ->\n  nonce = {}\n  a = nonce\n  b = (a ?= 0)\n  eq nonce, b\n  #the first ?= compiles into a statement; the second ?= compiles to a ternary expression\n  eq a ?= b ?= 1, nonce\n\n  if a then a ?= 2 else a = 3\n  eq a, nonce\n\ntest \"#1591, #1101: splatted expressions in destructuring assignment must be assignable\", ->\n  nonce = {}\n  for nonref in ['', '\"\"', '0', 'f()', '(->)'].concat CoffeeScript.RESERVED\n    eq nonce, (try CoffeeScript.compile \"[#{nonref}...] = v\" catch e then nonce)\n\ntest \"#1643: splatted accesses in destructuring assignments should not be declared as variables\", ->\n  nonce = {}\n  accesses = ['o.a', 'o[\"a\"]', '(o.a)', '(o.a).a', '@o.a', 'C::a', 'f().a', 'o?.a', 'o?.a.b', 'f?().a']\n  for access in accesses\n    for i,j in [1,2,3] #position can matter\n      code =\n        \"\"\"\n        nonce = {}; nonce2 = {}; nonce3 = {};\n        @o = o = new (class C then a:{}); f = -> o\n        [#{new Array(i).join('x,')}#{access}...] = [#{new Array(i).join('0,')}nonce, nonce2, nonce3]\n        unless #{access}[0] is nonce and #{access}[1] is nonce2 and #{access}[2] is nonce3 then throw new Error('[...]')\n        \"\"\"\n      eq nonce, unless (try CoffeeScript.run code, bare: true catch e then true) then nonce\n  # subpatterns like `[[a]...]` and `[{a}...]`\n  subpatterns = ['[sub, sub2, sub3]', '{0: sub, 1: sub2, 2: sub3}']\n  for subpattern in subpatterns\n    for i,j in [1,2,3]\n      code =\n        \"\"\"\n        nonce = {}; nonce2 = {}; nonce3 = {};\n        [#{new Array(i).join('x,')}#{subpattern}...] = [#{new Array(i).join('0,')}nonce, nonce2, nonce3]\n        unless sub is nonce and sub2 is nonce2 and sub3 is nonce3 then throw new Error('[sub...]')\n        \"\"\"\n      eq nonce, unless (try CoffeeScript.run code, bare: true catch e then true) then nonce\n\ntest \"#1838: Regression with variable assignment\", ->\n  name =\n  'dave'\n\n  eq name, 'dave'\n\ntest '#2211: splats in destructured parameters', ->\n  doesNotThrowCompileError '([a...]) ->'\n  doesNotThrowCompileError '([a...],b) ->'\n  doesNotThrowCompileError '([a...],[b...]) ->'\n  throwsCompileError '([a...,[a...]]) ->'\n  doesNotThrowCompileError '([a...,[b...]]) ->'\n\ntest '#2213: invocations within destructured parameters', ->\n  throwsCompileError '([a()])->'\n  throwsCompileError '([a:b()])->'\n  throwsCompileError '([a:b.c()])->'\n  throwsCompileError '({a()})->'\n  throwsCompileError '({a:b()})->'\n  throwsCompileError '({a:b.c()})->'\n\ntest '#2532: compound assignment with terminator', ->\n  doesNotThrowCompileError \"\"\"\n  a = \"hello\"\n  a +=\n  \"\n  world\n  !\n  \"\n  \"\"\"\n\ntest \"#2613: parens on LHS of destructuring\", ->\n  a = {}\n  [(a).b] = [1, 2, 3]\n  eq a.b, 1\n\ntest \"#2181: conditional assignment as a subexpression\", ->\n  a = false\n  false && a or= true\n  eq false, a\n  eq false, not a or= true\n\ntest \"#1500: Assignment to variables similar to generated variables\", ->\n  len = 0\n  x = ((results = null; n) for n in [1, 2, 3])\n  arrayEq [1, 2, 3], x\n  eq 0, len\n\n  for x in [1, 2, 3]\n    f = ->\n      i = 0\n    f()\n    eq 'undefined', typeof i\n\n  ref = 2\n  x = ref * 2 ? 1\n  eq x, 4\n  eq 'undefined', typeof ref1\n\n  x = {}\n  base = -> x\n  name = -1\n  base()[-name] ?= 2\n  eq x[1], 2\n  eq base(), x\n  eq name, -1\n\n  f = (@a, a) -> [@a, a]\n  arrayEq [1, 2], f.call scope = {}, 1, 2\n  eq 1, scope.a\n\n  try throw 'foo'\n  catch error\n    eq error, 'foo'\n\n  eq error, 'foo'\n\n  doesNotThrowCompileError '(@slice...) ->'\n\ntest \"Assignment to variables similar to helper functions\", ->\n  f = (slice...) -> slice\n  arrayEq [1, 2, 3], f 1, 2, 3\n  eq 'undefined', typeof slice1\n\n  class A\n  class B extends A\n    extend = 3\n    hasProp = 4\n    value: 5\n    method: (bind, bind1) => [bind, bind1, extend, hasProp, @value]\n  {method} = new B\n  arrayEq [1, 2, 3, 4, 5], method 1, 2\n\n  modulo = -1 %% 3\n  eq 2, modulo\n\n  indexOf = [1, 2, 3]\n  ok 2 in indexOf\n\ntest \"#4566: destructuring with nested default values\", ->\n  {a: {b = 1}} = a: {}\n  eq 1, b\n\n  {c: {d} = {}} = c: d: 3\n  eq 3, d\n\n  {e: {f = 5} = {}} = {}\n  eq 5, f\n\ntest \"#4878: Compile error when using destructuring with a splat or expansion in an array\", ->\n  arr = ['a', 'b', 'c', 'd']\n\n  f1 = (list) ->\n    [first, ..., last] = list\n\n  f2 = (list) ->\n    [first..., last] = list\n\n  f3 = (list) ->\n    ([first, ...] = list); first\n\n  f4 = (list) ->\n    ([first, rest...] = list); rest\n\n  arrayEq f1(arr), arr\n  arrayEq f2(arr), arr\n  arrayEq f3(arr), 'a'\n  arrayEq f4(arr), ['b', 'c', 'd']\n\n  foo = (list) ->\n    ret =\n      if list?.length > 0\n        [first, ..., last] = list\n        [first, last]\n      else\n        []\n\n  arrayEq foo(arr), ['a', 'd']\n\n  bar = (list) ->\n    ret =\n      if list?.length > 0\n        [first, rest...] = list\n        [first, rest]\n      else\n        []\n\n  arrayEq bar(arr), ['a', ['b', 'c', 'd']]\n\ntest \"destructuring assignment with an empty array in object\", ->\n  obj =\n    a1: [1, 2]\n    b1: 3\n\n  {a1:[], b1} = obj\n  eq 'undefined', typeof a1\n  eq b1, 3\n\n  obj =\n    a2:\n      b2: [1, 2]\n    c2: 3\n\n  {a2: {b2:[]}, c2} = obj\n  eq 'undefined', typeof b2\n  eq c2, 3\n\ntest \"#5004: array destructuring with accessors\", ->\n  obj =\n    arr: ['a', 'b', 'c', 'd']\n    list: {}\n    f1: ->\n      [@first, @rest...] = @arr\n    f2: ->\n      [@second, @third..., @last] = @rest\n    f3: ->\n      [@list.a, @list.middle..., @list.d] = @arr\n\n  obj.f1()\n  eq obj.first, 'a'\n  arrayEq obj.rest, ['b', 'c', 'd']\n\n  obj.f2()\n  eq obj.second, 'b'\n  arrayEq obj.third, ['c']\n  eq obj.last, 'd'\n\n  obj.f3()\n  eq obj.list.a, 'a'\n  arrayEq obj.list.middle, ['b', 'c']\n  eq obj.list.d, 'd'\n\n  [obj.list.middle..., d] = obj.arr\n  eq d, 'd'\n  arrayEq obj.list.middle, ['a', 'b', 'c']\n\ntest \"#4884: destructured object splat\", ->\n  [{length}...] = [1, 2, 3]\n  eq length, 3\n  [{length: len}...] = [1, 2, 3]\n  eq len, 3\n  [{length}..., three] = [1, 2, 3]\n  eq length, 2\n  eq three, 3\n  [{length: len}..., three] = [1, 2, 3]\n  eq len, 2\n  eq three, 3\n  x = [{length}..., three] = [1, 2, 3]\n  eq length, 2\n  eq three, 3\n  eq x[2], 3\n  x = [{length: len}..., three] = [1, 2, 3]\n  eq len, 2\n  eq three, 3\n  eq x[2], 3\n\ntest \"#4884: destructured array splat\", ->\n  [[one, two, three]...] = [1, 2, 3]\n  eq one, 1\n  eq two, 2\n  eq three, 3\n  [[one, two]..., three] = [1, 2, 3]\n  eq one, 1\n  eq two, 2\n  eq three, 3\n  x = [[one, two]..., three] = [1, 2, 3]\n  eq one, 1\n  eq two, 2\n  eq three, 3\n  eq x[2], 3\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"async\">\n# Functions that contain the `await` keyword will compile into async functions,\n# supported by Node 7.6+, Chrome 55+, Firefox 52+, Safari 10.1+ and Edge.\n# But runtimes that don’t support the `await` keyword will throw an error just\n# from parsing this file, even without executing it, even if we put\n# `return unless try new Function 'async () => {}'` at the top of this file.\n# Therefore we need to prevent runtimes which will choke on such code from\n# parsing it, which is handled in `Cakefile`.\n\n\n# This is always fulfilled.\nwinning = (val) -> Promise.resolve val\n\n# This is always rejected.\nfailing = (val) -> Promise.reject new Error val\n\n\ntest \"async as argument\", ->\n  ok ->\n    await winning()\n\ntest \"explicit async\", ->\n  a = do ->\n    await return 5\n  eq a.constructor, Promise\n  a.then (val) ->\n    eq val, 5\n\ntest \"implicit async\", ->\n  a = do ->\n    x = await winning(5)\n    y = await winning(4)\n    z = await winning(3)\n    [x, y, z]\n\n  eq a.constructor, Promise\n\ntest \"async return value (implicit)\", ->\n  out = null\n  a = ->\n    x = await winning(5)\n    y = await winning(4)\n    z = await winning(3)\n    [x, y, z]\n\n  b = do ->\n    out = await a()\n\n  b.then ->\n    arrayEq out, [5, 4, 3]\n\ntest \"async return value (explicit)\", ->\n  out = null\n  a = ->\n    await return [5, 2, 3]\n\n  b = do ->\n    out = await a()\n\n  b.then ->\n    arrayEq out, [5, 2, 3]\n\n\ntest \"async parameters\", ->\n  [out1, out2] = [null, null]\n  a = (a, [b, c])->\n    arr = [a]\n    arr.push b\n    arr.push c\n    await return arr\n\n  b = (a, b, c = 5)->\n    arr = [a]\n    arr.push b\n    arr.push c\n    await return arr\n\n  c = do ->\n    out1 = await a(5, [4, 3])\n    out2 = await b(4, 4)\n\n  c.then ->\n    arrayEq out1, [5, 4, 3]\n    arrayEq out2, [4, 4, 5]\n\ntest \"async `this` scoping\", ->\n  bnd = null\n  ubnd = null\n  nst = null\n  obj =\n    bound: ->\n      return do =>\n        await return this\n    unbound: ->\n      return do ->\n        await return this\n    nested: ->\n      return do =>\n        await do =>\n          await do =>\n            await return this\n\n  promise = do ->\n    bnd = await obj.bound()\n    ubnd = await obj.unbound()\n    nst = await obj.nested()\n\n  promise.then ->\n    eq bnd, obj\n    ok ubnd isnt obj\n    eq nst, obj\n\ntest \"await precedence\", ->\n  out = null\n\n  fn = (win, fail) ->\n    win(3)\n\n  promise = do ->\n    # assert precedence between unary (new) and power (**) operators\n    out = 1 + await new Promise(fn) ** 2\n\n  promise.then ->\n    eq out, 10\n\ntest \"`await` inside IIFEs\", ->\n  [x, y, z] = new Array(3)\n\n  a = do ->\n    x = switch (4)  # switch 4\n      when 2\n        await winning(1)\n      when 4\n        await winning(5)\n      when 7\n        await winning(2)\n\n    y = try\n      text = \"this should be caught\"\n      throw new Error(text)\n      await winning(1)\n    catch e\n      await winning(4)\n\n    z = for i in [0..5]\n      a = i * i\n      await winning(a)\n\n  a.then ->\n    eq x, 5\n    eq y, 4\n\n    arrayEq z, [0, 1, 4, 9, 16, 25]\n\ntest \"error handling\", ->\n  res = null\n  val = 0\n  a = ->\n    try\n      await failing(\"fail\")\n    catch e\n      val = 7  # to assure the catch block runs\n      return e\n\n  b = do ->\n    res = await a()\n\n  b.then ->\n    eq val, 7\n\n    ok res.message?\n    eq res.message, \"fail\"\n\ntest \"await expression evaluates to argument if not A+\", ->\n  eq(await 4, 4)\n\n\ntest \"implicit call with `await`\", ->\n  addOne = (arg) -> arg + 1\n\n  a = addOne await 3\n  eq a, 4\n\ntest \"async methods in classes\", ->\n  class Base\n    @static: ->\n      await 1\n    method: ->\n      await 2\n\n  eq await Base.static(), 1\n  eq await new Base().method(), 2\n\n  class Child extends Base\n    @static: -> super()\n    method: -> super()\n\n  eq await Child.static(), 1\n  eq await new Child().method(), 2\n\ntest \"#3199: await multiline implicit object\", ->\n  do ->\n    y =\n      if no then await\n        type: 'a'\n        msg: 'b'\n    eq undefined, y\n\ntest \"top-level await\", ->\n  eqJS 'await null', 'await null;'\n\ntest \"top-level wrapper has correct async attribute\", ->\n  starts = (code, prefix) ->\n    compiled = CoffeeScript.compile code\n    unless compiled.startsWith prefix\n      fail \"\"\"Expected generated JavaScript to start with:\n        #{reset}#{prefix}#{red}\n        but instead it was:\n        #{reset}#{compiled}#{red}\"\"\"\n  starts 'await null', '(async function'\n  starts 'do -> await null', '(function'\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"async_iterators\">\n# This is always fulfilled.\nwinLater = (val, ms) ->\n  new Promise (resolve) -> setTimeout (-> resolve val), ms\n\n# This is always rejected.\nfailLater = (val, ms) ->\n  new Promise (resolve, reject) -> setTimeout (-> reject new Error val), ms\n\ncreateAsyncIterable = (syncIterable) ->\n  for elem in syncIterable\n    yield await winLater elem, 50\n\ntest \"async iteration\", ->\n  foo = (x for await x from createAsyncIterable [1,2,3])\n  arrayEq foo, [1, 2, 3]\n\ntest \"async generator functions\", ->\n  foo = (val) ->\n    yield await winLater val + 1, 50\n\n  bar = (val) ->\n    yield await failLater val - 1, 50\n\n  a = await foo(41).next()\n  eq a.value, 42\n\n  try\n    b = do -> await bar(41).next()\n    b.catch (err) ->\n      eq \"40\", err.message\n  catch err\n    ok no\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"booleans\">\n# Boolean Literals\n# ----------------\n\n# TODO: add method invocation tests: true.toString() is \"true\"\n\ntest \"#764 Booleans should be indexable\", ->\n  toString = Boolean::toString\n\n  eq toString, true['toString']\n  eq toString, false['toString']\n  eq toString, yes['toString']\n  eq toString, no['toString']\n  eq toString, on['toString']\n  eq toString, off['toString']\n\n  eq toString, true.toString\n  eq toString, false.toString\n  eq toString, yes.toString\n  eq toString, no.toString\n  eq toString, on.toString\n  eq toString, off.toString\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"classes\">\n# Classes\n# -------\n\n# * Class Definition\n# * Class Instantiation\n# * Inheritance and Super\n# * ES2015+ Class Interoperability\n\ntest \"classes with a four-level inheritance chain\", ->\n\n  class Base\n    func: (string) ->\n      \"zero/#{string}\"\n\n    @static: (string) ->\n      \"static/#{string}\"\n\n  class FirstChild extends Base\n    func: (string) ->\n      super('one/') + string\n\n  SecondChild = class extends FirstChild\n    func: (string) ->\n      super('two/') + string\n\n  thirdCtor = ->\n    @array = [1, 2, 3]\n\n  class ThirdChild extends SecondChild\n    constructor: ->\n      super()\n      thirdCtor.call this\n\n    # Gratuitous comment for testing.\n    func: (string) ->\n      super('three/') + string\n\n  result = (new ThirdChild).func 'four'\n\n  ok result is 'zero/one/two/three/four'\n  ok Base.static('word') is 'static/word'\n\n  ok (new ThirdChild).array.join(' ') is '1 2 3'\n\n\ntest \"constructors with inheritance and super\", ->\n\n  identity = (f) -> f\n\n  class TopClass\n    constructor: (arg) ->\n      @prop = 'top-' + arg\n\n  class SuperClass extends TopClass\n    constructor: (arg) ->\n      identity super 'super-' + arg\n\n  class SubClass extends SuperClass\n    constructor: ->\n      identity super 'sub'\n\n  ok (new SubClass).prop is 'top-super-sub'\n\n\ntest \"'super' with accessors\", ->\n  class Base\n    m: -> 4\n    n: -> 5\n    o: -> 6\n\n  name = 'o'\n  class A extends Base\n    m: -> super()\n    n: -> super.n()\n    \"#{name}\": -> super()\n    p: -> super[name]()\n\n  a = new A\n  eq 4, a.m()\n  eq 5, a.n()\n  eq 6, a.o()\n  eq 6, a.p()\n\n\ntest \"soaked 'super' invocation\", ->\n  class Base\n    method: -> 2\n\n  class A extends Base\n    method: -> super?()\n    noMethod: -> super?()\n\n  a = new A\n  eq 2, a.method()\n  eq undefined, a.noMethod()\n\n  name = 'noMethod'\n  class B extends Base\n    \"#{'method'}\": -> super?()\n    \"#{'noMethod'}\": -> super?() ? super['method']()\n\n  b = new B\n  eq 2, b.method()\n  eq 2, b.noMethod()\n\ntest \"'@' referring to the current instance, and not being coerced into a call\", ->\n\n  class ClassName\n    amI: ->\n      @ instanceof ClassName\n\n  obj = new ClassName\n  ok obj.amI()\n\n\ntest \"super() calls in constructors of classes that are defined as object properties\", ->\n\n  class Hive\n    constructor: (name) -> @name = name\n\n  class Hive.Bee extends Hive\n    constructor: (name) -> super name\n\n  maya = new Hive.Bee 'Maya'\n  ok maya.name is 'Maya'\n\n\ntest \"classes with JS-keyword properties\", ->\n\n  class Class\n    class: 'class'\n    name: -> @class\n\n  instance = new Class\n  ok instance.class is 'class'\n  ok instance.name() is 'class'\n\n\ntest \"Classes with methods that are pre-bound to the instance, or statically, to the class\", ->\n\n  class Dog\n    constructor: (name) ->\n      @name = name\n\n    bark: =>\n      \"#{@name} woofs!\"\n\n    @static = =>\n      new this('Dog')\n\n  spark = new Dog('Spark')\n  fido  = new Dog('Fido')\n  fido.bark = spark.bark\n\n  ok fido.bark() is 'Spark woofs!'\n\n  obj = func: Dog.static\n\n  ok obj.func().name is 'Dog'\n\n\ntest \"a bound function in a bound function\", ->\n\n  class Mini\n    num: 10\n    generate: =>\n      for i in [1..3]\n        =>\n          @num\n\n  m = new Mini\n  eq (func() for func in m.generate()).join(' '), '10 10 10'\n\n\ntest \"contructor called with varargs\", ->\n\n  class Connection\n    constructor: (one, two, three) ->\n      [@one, @two, @three] = [one, two, three]\n\n    out: ->\n      \"#{@one}-#{@two}-#{@three}\"\n\n  list = [3, 2, 1]\n  conn = new Connection list...\n  ok conn instanceof Connection\n  ok conn.out() is '3-2-1'\n\n\ntest \"calling super and passing along all arguments\", ->\n\n  class Parent\n    method: (args...) -> @args = args\n\n  class Child extends Parent\n    method: -> super arguments...\n\n  c = new Child\n  c.method 1, 2, 3, 4\n  ok c.args.join(' ') is '1 2 3 4'\n\n\ntest \"classes wrapped in decorators\", ->\n\n  func = (klass) ->\n    klass::prop = 'value'\n    klass\n\n  func class Test\n    prop2: 'value2'\n\n  ok (new Test).prop  is 'value'\n  ok (new Test).prop2 is 'value2'\n\n\ntest \"anonymous classes\", ->\n\n  obj =\n    klass: class\n      method: -> 'value'\n\n  instance = new obj.klass\n  ok instance.method() is 'value'\n\n\ntest \"Implicit objects as static properties\", ->\n\n  class Static\n    @static =\n      one: 1\n      two: 2\n\n  ok Static.static.one is 1\n  ok Static.static.two is 2\n\n\ntest \"nothing classes\", ->\n\n  c = class\n  ok c instanceof Function\n\n\ntest \"classes with static-level implicit objects\", ->\n\n  class A\n    @static = one: 1\n    two: 2\n\n  class B\n    @static = one: 1,\n    two: 2\n\n  eq A.static.one, 1\n  eq A.static.two, undefined\n  eq (new A).two, 2\n\n  eq B.static.one, 1\n  eq B.static.two, 2\n  eq (new B).two, undefined\n\n\ntest \"classes with value'd constructors\", ->\n\n  counter = 0\n  classMaker = ->\n    inner = ++counter\n    ->\n      @value = inner\n      @\n\n  class One\n    constructor: classMaker()\n\n  class Two\n    constructor: classMaker()\n\n  eq (new One).value, 1\n  eq (new Two).value, 2\n  eq (new One).value, 1\n  eq (new Two).value, 2\n\n\ntest \"executable class bodies\", ->\n\n  class A\n    if true\n      b: 'b'\n    else\n      c: 'c'\n\n  a = new A\n\n  eq a.b, 'b'\n  eq a.c, undefined\n\n\ntest \"#2502: parenthesizing inner object values\", ->\n\n  class A\n    category:  (type: 'string')\n    sections:  (type: 'number', default: 0)\n\n  eq (new A).category.type, 'string'\n\n  eq (new A).sections.default, 0\n\n\ntest \"conditional prototype property assignment\", ->\n  debug = false\n\n  class Person\n    if debug\n      age: -> 10\n    else\n      age: -> 20\n\n  eq (new Person).age(), 20\n\n\ntest \"mild metaprogramming\", ->\n\n  class Base\n    @attr: (name) ->\n      @::[name] = (val) ->\n        if arguments.length > 0\n          @[\"_#{name}\"] = val\n        else\n          @[\"_#{name}\"]\n\n  class Robot extends Base\n    @attr 'power'\n    @attr 'speed'\n\n  robby = new Robot\n\n  ok robby.power() is undefined\n\n  robby.power 11\n  robby.speed Infinity\n\n  eq robby.power(), 11\n  eq robby.speed(), Infinity\n\n\ntest \"namespaced classes do not reserve their function name in outside scope\", ->\n\n  one = {}\n  two = {}\n\n  class one.Klass\n    @label = \"one\"\n\n  class two.Klass\n    @label = \"two\"\n\n  eq typeof Klass, 'undefined'\n  eq one.Klass.label, 'one'\n  eq two.Klass.label, 'two'\n\n\ntest \"nested classes\", ->\n\n  class Outer\n    constructor: ->\n      @label = 'outer'\n\n    class @Inner\n      constructor: ->\n        @label = 'inner'\n\n  eq (new Outer).label, 'outer'\n  eq (new Outer.Inner).label, 'inner'\n\n\ntest \"variables in constructor bodies are correctly scoped\", ->\n\n  class A\n    x = 1\n    constructor: ->\n      x = 10\n      y = 20\n    y = 2\n    captured: ->\n      {x, y}\n\n  a = new A\n  eq a.captured().x, 10\n  eq a.captured().y, 2\n\n\ntest \"Issue #924: Static methods in nested classes\", ->\n\n  class A\n    @B: class\n      @c = -> 5\n\n  eq A.B.c(), 5\n\n\ntest \"`class extends this`\", ->\n\n  class A\n    func: -> 'A'\n\n  B = null\n  makeClass = ->\n    B = class extends this\n      func: -> super() + ' B'\n\n  makeClass.call A\n\n  eq (new B()).func(), 'A B'\n\n\ntest \"ensure that constructors invoked with splats return a new object\", ->\n\n  args = [1, 2, 3]\n  Type = (@args) ->\n  type = new Type args\n\n  ok type and type instanceof Type\n  ok type.args and type.args instanceof Array\n  ok v is args[i] for v, i in type.args\n\n  Type1 = (@a, @b, @c) ->\n  type1 = new Type1 args...\n\n  ok type1 instanceof   Type1\n  eq type1.constructor, Type1\n  ok type1.a is args[0] and type1.b is args[1] and type1.c is args[2]\n\n  # Ensure that constructors invoked with splats cache the function.\n  called = 0\n  get = -> if called++ then false else class Type\n  new (get()) args...\n\ntest \"`new` shouldn't add extra parens\", ->\n\n  ok new Date().constructor is Date\n\n\ntest \"`new` works against bare function\", ->\n\n  eq Date, new ->\n    Date\n\ntest \"`new` works against statement\", ->\n\n  class A\n  (new try A) instanceof A\n\ntest \"#1182: a subclass should be able to set its constructor to an external function\", ->\n  ctor = ->\n    @val = 1\n    return\n  class A\n  class B extends A\n    constructor: ctor\n  eq (new B).val, 1\n\ntest \"#1182: external constructors continued\", ->\n  ctor = ->\n  class A\n  class B extends A\n    method: ->\n    constructor: ctor\n  ok B::method\n\ntest \"#1313: misplaced __extends\", ->\n  nonce = {}\n  class A\n  class B extends A\n    prop: nonce\n    constructor: -> super()\n  eq nonce, B::prop\n\ntest \"#1182: execution order needs to be considered as well\", ->\n  counter = 0\n  makeFn = (n) -> eq n, ++counter; ->\n  class B extends (makeFn 1)\n    @B: makeFn 2\n    constructor: makeFn 3\n\ntest \"#1182: external constructors with bound functions\", ->\n  fn = ->\n    {one: 1}\n    this\n  class B\n  class A\n    constructor: fn\n    method: => this instanceof A\n  ok (new A).method.call(new B)\n\ntest \"#1372: bound class methods with reserved names\", ->\n  class C\n    delete: =>\n  ok C::delete\n\ntest \"#1380: `super` with reserved names\", ->\n  class C\n    do: -> super()\n  ok C::do\n\n  class B\n    0: -> super()\n  ok B::[0]\n\ntest \"#1464: bound class methods should keep context\", ->\n  nonce  = {}\n  nonce2 = {}\n  class C\n    constructor: (@id) ->\n    @boundStaticColon: => new this(nonce)\n    @boundStaticEqual= => new this(nonce2)\n  eq nonce,  C.boundStaticColon().id\n  eq nonce2, C.boundStaticEqual().id\n\ntest \"#1009: classes with reserved words as determined names\", -> (->\n  eq 'function', typeof (class @for)\n  ok not /\\beval\\b/.test (class @eval).toString()\n  ok not /\\barguments\\b/.test (class @arguments).toString()\n).call {}\n\ntest \"#1482: classes can extend expressions\", ->\n  id = (x) -> x\n  nonce = {}\n  class A then nonce: nonce\n  class B extends id A\n  eq nonce, (new B).nonce\n\ntest \"#1598: super works for static methods too\", ->\n\n  class Parent\n    method: ->\n      'NO'\n    @method: ->\n      'yes'\n\n  class Child extends Parent\n    @method: ->\n      'pass? ' + super()\n\n  eq Child.method(), 'pass? yes'\n\ntest \"#1842: Regression with bound functions within bound class methods\", ->\n\n  class Store\n    @bound: =>\n      do =>\n        eq this, Store\n\n  Store.bound()\n\n  # And a fancier case:\n\n  class Store\n\n    eq this, Store\n\n    @bound: =>\n      do =>\n        eq this, Store\n\n    @unbound: ->\n      eq this, Store\n\n    instance: =>\n      ok this instanceof Store\n\n  Store.bound()\n  Store.unbound()\n  (new Store).instance()\n\ntest \"#1876: Class @A extends A\", ->\n  class A\n  class @A extends A\n\n  ok (new @A) instanceof A\n\ntest \"#1813: Passing class definitions as expressions\", ->\n  ident = (x) -> x\n\n  result = ident class A then x = 1\n\n  eq result, A\n\n  result = ident class B extends A\n    x = 1\n\n  eq result, B\n\ntest \"#1966: external constructors should produce their return value\", ->\n  ctor = -> {}\n  class A then constructor: ctor\n  ok (new A) not instanceof A\n\ntest \"#1980: regression with an inherited class with static function members\", ->\n\n  class A\n\n  class B extends A\n    @static: => 'value'\n\n  eq B.static(), 'value'\n\ntest \"#1534: class then 'use strict'\", ->\n  # [14.1 Directive Prologues and the Use Strict Directive](http://es5.github.com/#x14.1)\n  nonce = {}\n  error = 'do -> ok this'\n  strictTest = \"do ->'use strict';#{error}\"\n  return unless (try CoffeeScript.run strictTest, bare: yes catch e then nonce) is nonce\n\n  throws -> CoffeeScript.run \"class then 'use strict';#{error}\", bare: yes\n  doesNotThrow -> CoffeeScript.run \"class then #{error}\", bare: yes\n  doesNotThrow -> CoffeeScript.run \"class then #{error};'use strict'\", bare: yes\n\n  # comments are ignored in the Directive Prologue\n  comments = [\"\"\"\n  class\n    ### comment ###\n    'use strict'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    ### comment 1 ###\n    ### comment 2 ###\n    'use strict'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    ### comment 1 ###\n    ### comment 2 ###\n    'use strict'\n    #{error}\n    ### comment 3 ###\"\"\"\n  ]\n  throws (-> CoffeeScript.run comment, bare: yes) for comment in comments\n\n  # [ES5 §14.1](http://es5.github.com/#x14.1) allows for other directives\n  directives = [\"\"\"\n  class\n    'directive 1'\n    'use strict'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    'use strict'\n    'directive 2'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    ### comment 1 ###\n    'directive 1'\n    'use strict'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    ### comment 1 ###\n    'directive 1'\n    ### comment 2 ###\n    'use strict'\n    #{error}\"\"\"\n  ]\n  throws (-> CoffeeScript.run directive, bare: yes) for directive in directives\n\ntest \"#2052: classes should work in strict mode\", ->\n  try\n    do ->\n      'use strict'\n      class A\n  catch e\n    ok no\n\ntest \"directives in class with extends \", ->\n  strictTest = \"\"\"\n    class extends Object\n      ### comment ###\n      'use strict'\n      do -> eq this, undefined\n  \"\"\"\n  CoffeeScript.run strictTest, bare: yes\n\ntest \"#2630: class bodies can't reference arguments\", ->\n  throwsCompileError 'class Test then arguments'\n\n  # #4320: Don't be too eager when checking, though.\n  class Test\n    arguments: 5\n  eq 5, Test::arguments\n\ntest \"#2319: fn class n extends o.p [INDENT] x = 123\", ->\n  first = ->\n\n  base = onebase: ->\n\n  first class OneKeeper extends base.onebase\n    one = 1\n    one: -> one\n\n  eq new OneKeeper().one(), 1\n\n\ntest \"#2599: other typed constructors should be inherited\", ->\n  class Base\n    constructor: -> return {}\n\n  class Derived extends Base\n\n  ok (new Derived) not instanceof Derived\n  ok (new Derived) not instanceof Base\n  ok (new Base) not instanceof Base\n\ntest \"extending native objects works with and without defining a constructor\", ->\n  class MyArray extends Array\n    method: -> 'yes!'\n\n  myArray = new MyArray\n  ok myArray instanceof MyArray\n  ok 'yes!', myArray.method()\n\n  class OverrideArray extends Array\n    constructor: -> super()\n    method: -> 'yes!'\n\n  overrideArray = new OverrideArray\n  ok overrideArray instanceof OverrideArray\n  eq 'yes!', overrideArray.method()\n\n\ntest \"#2782: non-alphanumeric-named bound functions\", ->\n  class A\n    'b:c': =>\n      'd'\n\n  eq (new A)['b:c'](), 'd'\n\n\ntest \"#2781: overriding bound functions\", ->\n  class A\n    a: ->\n        @b()\n    b: =>\n        1\n\n  class B extends A\n    b: =>\n        2\n\n  b = (new A).b\n  eq b(), 1\n\n  b = (new B).b\n  eq b(), 2\n\n\ntest \"#2791: bound function with destructured argument\", ->\n  class Foo\n    method: ({a}) => 'Bar'\n\n  eq (new Foo).method({a: 'Bar'}), 'Bar'\n\n\ntest \"#2796: ditto, ditto, ditto\", ->\n  answer = null\n\n  outsideMethod = (func) ->\n    func.call message: 'wrong!'\n\n  class Base\n    constructor: ->\n      @message = 'right!'\n      outsideMethod @echo\n\n    echo: =>\n      answer = @message\n\n  new Base\n  eq answer, 'right!'\n\ntest \"#3063: Class bodies cannot contain pure statements\", ->\n  throwsCompileError \"\"\"\n    class extends S\n      return if S.f\n      @f: => this\n  \"\"\"\n\ntest \"#2949: super in static method with reserved name\", ->\n  class Foo\n    @static: -> 'baz'\n\n  class Bar extends Foo\n    @static: -> super()\n\n  eq Bar.static(), 'baz'\n\ntest \"#3232: super in static methods (not object-assigned)\", ->\n  class Foo\n    @baz = -> true\n    @qux = -> true\n\n  class Bar extends Foo\n    @baz = -> super()\n    Bar.qux = -> super()\n\n  ok Bar.baz()\n  ok Bar.qux()\n\ntest \"#1392 calling `super` in methods defined on namespaced classes\", ->\n  class Base\n    m: -> 5\n    n: -> 4\n  namespace =\n    A: ->\n    B: ->\n  class namespace.A extends Base\n    m: -> super()\n\n  eq 5, (new namespace.A).m()\n  namespace.B::m = namespace.A::m\n  namespace.A::m = null\n  eq 5, (new namespace.B).m()\n\n  class C\n    @a: class extends Base\n      m: -> super()\n  eq 5, (new C.a).m()\n\n\ntest \"#4436 immediately instantiated named class\", ->\n  ok new class Foo\n\n\ntest \"dynamic method names\", ->\n  class A\n    \"#{name = 'm'}\": -> 1\n  eq 1, new A().m()\n\n  class B extends A\n    \"#{name = 'm'}\": -> super()\n  eq 1, new B().m()\n\n  getName = -> 'm'\n  class C\n    \"#{name = getName()}\": -> 1\n  eq 1, new C().m()\n\n\ntest \"dynamic method names and super\", ->\n  class Base\n    @m: -> 6\n    m: -> 5\n    m2: -> 4.5\n    n: -> 4\n\n  name = -> count++; 'n'\n  count = 0\n\n  m = 'm'\n  class A extends Base\n    \"#{m}\": -> super()\n    \"#{name()}\": -> super()\n\n  m = 'n'\n  eq 5, (new A).m()\n\n  eq 4, (new A).n()\n  eq 1, count\n\n  m = 'm'\n  m2 = 'm2'\n  count = 0\n  class B extends Base\n    @[name()] = -> super()\n    \"#{m}\": -> super()\n    \"#{m2}\": -> super()\n  b = new B\n  m = m2 = 'n'\n  eq 6, B.m()\n  eq 5, b.m()\n  eq 4.5, b.m2()\n  eq 1, count\n\n  class C extends B\n    m: -> super()\n  eq 5, (new C).m()\n\n# ES2015+ class interoperability\n# Based on https://github.com/balupton/es6-javascript-class-interop\n# Helper functions to generate true ES classes to extend:\ngetBasicClass = ->\n  ```\n  class BasicClass {\n    constructor (greeting) {\n      this.greeting = greeting || 'hi'\n    }\n  }\n  ```\n  BasicClass\n\ngetExtendedClass = (BaseClass) ->\n  ```\n  class ExtendedClass extends BaseClass {\n    constructor (greeting, name) {\n      super(greeting || 'hello')\n      this.name = name\n    }\n  }\n  ```\n  ExtendedClass\n\ntest \"can instantiate a basic ES class\", ->\n  BasicClass = getBasicClass()\n  i = new BasicClass 'howdy!'\n  eq i.greeting, 'howdy!'\n\ntest \"can instantiate an extended ES class\", ->\n  BasicClass = getBasicClass()\n  ExtendedClass = getExtendedClass BasicClass\n  i = new ExtendedClass 'yo', 'buddy'\n  eq i.greeting, 'yo'\n  eq i.name, 'buddy'\n\ntest \"can extend a basic ES class\", ->\n  BasicClass = getBasicClass()\n  class ExtendedClass extends BasicClass\n    constructor: (@name) ->\n      super()\n  i = new ExtendedClass 'dude'\n  eq i.name, 'dude'\n\ntest \"can extend an extended ES class\", ->\n  BasicClass = getBasicClass()\n  ExtendedClass = getExtendedClass BasicClass\n\n  class ExtendedExtendedClass extends ExtendedClass\n    constructor: (@value) ->\n      super()\n    getDoubledValue: ->\n      @value * 2\n\n  i = new ExtendedExtendedClass 7\n  eq i.getDoubledValue(), 14\n\ntest \"CoffeeScript class can be extended in ES\", ->\n  class CoffeeClass\n    constructor: (@favoriteDrink = 'latte', @size = 'grande') ->\n    getDrinkOrder: ->\n      \"#{@size} #{@favoriteDrink}\"\n\n  ```\n  class ECMAScriptClass extends CoffeeClass {\n    constructor (favoriteDrink) {\n      super(favoriteDrink);\n      this.favoriteDrink = this.favoriteDrink + ' with a dash of semicolons';\n    }\n  }\n  ```\n\n  e = new ECMAScriptClass 'coffee'\n  eq e.getDrinkOrder(), 'grande coffee with a dash of semicolons'\n\ntest \"extended CoffeeScript class can be extended in ES\", ->\n  class CoffeeClass\n    constructor: (@favoriteDrink = 'latte') ->\n\n  class CoffeeClassWithDrinkOrder extends CoffeeClass\n    constructor: (@favoriteDrink, @size = 'grande') ->\n      super()\n    getDrinkOrder: ->\n      \"#{@size} #{@favoriteDrink}\"\n\n  ```\n  class ECMAScriptClass extends CoffeeClassWithDrinkOrder {\n    constructor (favoriteDrink) {\n      super(favoriteDrink);\n      this.favoriteDrink = this.favoriteDrink + ' with a dash of semicolons';\n    }\n  }\n  ```\n\n  e = new ECMAScriptClass 'coffee'\n  eq e.getDrinkOrder(), 'grande coffee with a dash of semicolons'\n\ntest \"`this` access after `super` in extended classes\", ->\n  class Base\n\n  class Test extends Base\n    constructor: (param, @param) ->\n      eq param, nonce\n\n      result = { super: super(), @param, @method }\n      eq result.super, this\n      eq result.param, @param\n      eq result.method, @method\n      ok result.method isnt Test::method\n\n    method: =>\n\n  nonce = {}\n  new Test nonce, {}\n\ntest \"`@`-params and bound methods with multiple `super` paths (blocks)\", ->\n  nonce = {}\n\n  class Base\n    constructor: (@name) ->\n\n  class Test extends Base\n    constructor: (param, @param) ->\n      if param\n        super 'param'\n        eq @name, 'param'\n      else\n        super 'not param'\n        eq @name, 'not param'\n      eq @param, nonce\n      ok @method isnt Test::method\n    method: =>\n  new Test true, nonce\n  new Test false, nonce\n\n\ntest \"`@`-params and bound methods with multiple `super` paths (expressions)\", ->\n  nonce = {}\n\n  class Base\n    constructor: (@name) ->\n\n  class Test extends Base\n    constructor: (param, @param) ->\n      # Contrived example: force each path into an expression with inline assertions\n      if param\n        result = (\n          eq (super 'param'), @;\n          eq @name, 'param';\n          eq @param, nonce;\n          ok @method isnt Test::method\n        )\n      else\n        result = (\n          eq (super 'not param'), @;\n          eq @name, 'not param';\n          eq @param, nonce;\n          ok @method isnt Test::method\n        )\n    method: =>\n  new Test true, nonce\n  new Test false, nonce\n\ntest \"constructor super in arrow functions\", ->\n  class Test extends (class)\n    constructor: (@param) ->\n      do => super()\n      eq @param, nonce\n\n  new Test nonce = {}\n\n# TODO Some of these tests use CoffeeScript.compile and CoffeeScript.run when they could use\n# regular test mechanics.\n# TODO Some of these tests might be better placed in `test/error_messages.coffee`.\n# TODO Some of these tests are duplicates.\n\n# Ensure that we always throw if we experience more than one super()\n# call in a constructor.  This ends up being a runtime error.\n# Should be caught at compile time.\ntest \"multiple super calls\", ->\n  throwsA = \"\"\"\n  class A\n    constructor: (@drink) ->\n    make: -> \"Making a #{@drink}\"\n\n  class MultiSuper extends A\n    constructor: (drink) ->\n      super(drink)\n      super(drink)\n      @newDrink = drink\n  new MultiSuper('Late').make()\n  \"\"\"\n  throws -> CoffeeScript.run throwsA, bare: yes\n\n# Basic test to ensure we can pass @params in a constuctor and\n# inheritance works correctly\ntest \"@ params\", ->\n  class A\n    constructor: (@drink, @shots, @flavor) ->\n    make: -> \"Making a #{@flavor} #{@drink} with #{@shots} shot(s)\"\n\n  a = new A('Machiato', 2, 'chocolate')\n  eq a.make(),  \"Making a chocolate Machiato with 2 shot(s)\"\n\n  class B extends A\n  b = new B('Machiato', 2, 'chocolate')\n  eq b.make(),  \"Making a chocolate Machiato with 2 shot(s)\"\n\n# Ensure we can accept @params with default parameters in a constructor\ntest \"@ params with defaults in a constructor\", ->\n  class A\n    # Multiple @ params with defaults\n    constructor: (@drink = 'Americano', @shots = '1', @flavor = 'caramel') ->\n    make: -> \"Making a #{@flavor} #{@drink} with #{@shots} shot(s)\"\n\n  a = new A()\n  eq a.make(),  \"Making a caramel Americano with 1 shot(s)\"\n\n# Ensure we can handle default constructors with class params\ntest \"@ params with class params\", ->\n  class Beverage\n    drink: 'Americano'\n    shots: '1'\n    flavor: 'caramel'\n\n  class A\n    # Class creation as a default param with `this`\n    constructor: (@drink = new Beverage()) ->\n  a = new A()\n  eq a.drink.drink, 'Americano'\n\n  beverage = new Beverage\n  class B\n    # class costruction with a default external param\n    constructor: (@drink = beverage) ->\n\n  b = new B()\n  eq b.drink.drink, 'Americano'\n\n  class C\n    # Default constructor with anonymous empty class\n    constructor: (@meta = class) ->\n  c = new C()\n  ok c.meta instanceof Function\n\ntest \"@ params without super, including errors\", ->\n  classA = \"\"\"\n  class A\n    constructor: (@drink) ->\n    make: -> \"Making a #{@drink}\"\n  a = new A('Machiato')\n  \"\"\"\n\n  throwsB = \"\"\"\n  class B extends A\n    #implied super\n    constructor: (@drink) ->\n  b = new B('Machiato')\n  \"\"\"\n  throwsCompileError classA + throwsB, bare: yes\n\ntest \"@ params super race condition\", ->\n  classA = \"\"\"\n  class A\n    constructor: (@drink) ->\n    make: -> \"Making a #{@drink}\"\n  \"\"\"\n\n  throwsB = \"\"\"\n  class B extends A\n    constructor: (@params) ->\n\n  b = new B('Machiato')\n  \"\"\"\n  throwsCompileError classA + throwsB, bare: yes\n\n  # Race condition with @ and super\n  throwsC = \"\"\"\n  class C extends A\n    constructor: (@params) ->\n      super(@params)\n\n  c = new C('Machiato')\n  \"\"\"\n  throwsCompileError classA + throwsC, bare: yes\n\n\ntest \"@ with super call\", ->\n  class D\n    make: -> \"Making a #{@drink}\"\n\n  class E extends D\n    constructor: (@drink) ->\n      super()\n\n  e = new E('Machiato')\n  eq e.make(),  \"Making a Machiato\"\n\ntest \"@ with splats and super call\", ->\n  class A\n    make: -> \"Making a #{@drink}\"\n\n  class B extends A\n    constructor: (@drink...) ->\n      super()\n\n  B = new B('Machiato')\n  eq B.make(),  \"Making a Machiato\"\n\n\ntest \"super and external constructors\", ->\n  # external constructor with @ param is allowed\n  ctorA = (@drink) ->\n  class A\n    constructor: ctorA\n    make: -> \"Making a #{@drink}\"\n  a = new A('Machiato')\n  eq a.make(),  \"Making a Machiato\"\n\n  # External constructor with super\n  throwsC = \"\"\"\n  class B\n    constructor: (@drink) ->\n    make: -> \"Making a #{@drink}\"\n\n  ctorC = (drink) ->\n    super(drink)\n\n  class C extends B\n    constructor: ctorC\n  c = new C('Machiato')\n  \"\"\"\n  throwsCompileError throwsC, bare: yes\n\n\ntest \"bound functions without super\", ->\n  # Bound function with @\n  # Throw on compile, since bound\n  # constructors are illegal\n  throwsA = \"\"\"\n  class A\n    constructor: (drink) =>\n      @drink = drink\n\n  \"\"\"\n  throwsCompileError throwsA, bare: yes\n\ntest \"super in a bound function in a constructor\", ->\n  throwsB = \"\"\"\n  class A\n  class B extends A\n    constructor: do => super\n  \"\"\"\n  throwsCompileError throwsB, bare: yes\n\ntest \"super in a bound function\", ->\n  class A\n    constructor: (@drink) ->\n    make: -> \"Making a #{@drink}\"\n\n  class B extends A\n    make: (@flavor) =>\n      super() + \" with #{@flavor}\"\n\n  b = new B('Machiato')\n  eq b.make('vanilla'),  \"Making a Machiato with vanilla\"\n\n  # super in a bound function in a bound function\n  class C extends A\n    make: (@flavor) =>\n      func = () =>\n        super() + \" with #{@flavor}\"\n      func()\n\n  c = new C('Machiato')\n  eq c.make('vanilla'), \"Making a Machiato with vanilla\"\n\n  # bound function in a constructor\n  class D extends A\n    constructor: (drink) ->\n      super(drink)\n      x = =>\n        eq @drink,  \"Machiato\"\n      x()\n  d = new D('Machiato')\n  eq d.make(),  \"Making a Machiato\"\n\n# duplicate\ntest \"super in a try/catch\", ->\n  classA = \"\"\"\n  class A\n    constructor: (param) ->\n      throw \"\" unless param\n  \"\"\"\n\n  throwsB = \"\"\"\n  class B extends A\n      constructor: ->\n        try\n          super()\n  \"\"\"\n\n  throwsC = \"\"\"\n  ctor = ->\n    try\n      super()\n\n  class C extends A\n      constructor: ctor\n  \"\"\"\n  throws -> CoffeeScript.run classA + throwsB, bare: yes\n  throws -> CoffeeScript.run classA + throwsC, bare: yes\n\ntest \"mixed ES6 and CS6 classes with a four-level inheritance chain\", ->\n  # Extended test\n  # ES2015+ class interoperability\n\n  ```\n  class Base {\n    constructor (greeting) {\n      this.greeting = greeting || 'hi';\n    }\n    func (string) {\n      return 'zero/' + string;\n    }\n    static  staticFunc (string) {\n      return 'static/' + string;\n    }\n  }\n  ```\n\n  class FirstChild extends Base\n    func: (string) ->\n      super('one/') + string\n\n\n  ```\n  class SecondChild extends FirstChild {\n    func (string) {\n      return super.func('two/' + string);\n    }\n  }\n  ```\n\n  thirdCtor = ->\n    @array = [1, 2, 3]\n\n  class ThirdChild extends SecondChild\n    constructor: ->\n      super()\n      thirdCtor.call this\n    func: (string) ->\n      super('three/') + string\n\n  result = (new ThirdChild).func 'four'\n  ok result is 'zero/one/two/three/four'\n  ok Base.staticFunc('word') is 'static/word'\n\n# exercise extends in a nested class\ntest \"nested classes with super\", ->\n  class Outer\n    constructor: ->\n      @label = 'outer'\n\n    class @Inner\n      constructor: ->\n        @label = 'inner'\n\n    class @ExtendedInner extends @Inner\n      constructor: ->\n        tmp = super()\n        @label = tmp.label + ' extended'\n\n    @extender: () =>\n      class ExtendedSelf extends @\n        constructor: ->\n          tmp = super()\n          @label = tmp.label + ' from this'\n      new ExtendedSelf\n\n  eq (new Outer).label, 'outer'\n  eq (new Outer.Inner).label, 'inner'\n  eq (new Outer.ExtendedInner).label, 'inner extended'\n  eq (Outer.extender()).label, 'outer from this'\n\ntest \"Static methods generate 'static' keywords\", ->\n  compile = \"\"\"\n  class CheckStatic\n    constructor: (@drink) ->\n    @className: -> 'CheckStatic'\n\n  c = new CheckStatic('Machiato')\n  \"\"\"\n  result = CoffeeScript.compile compile, bare: yes\n  ok result.match(' static ')\n\ntest \"Static methods in nested classes\", ->\n  class Outer\n    @name: -> 'Outer'\n\n    class @Inner\n      @name: -> 'Inner'\n\n  eq Outer.name(), 'Outer'\n  eq Outer.Inner.name(), 'Inner'\n\n\ntest \"mixed constructors with inheritance and ES6 super\", ->\n  identity = (f) -> f\n\n  class TopClass\n    constructor: (arg) ->\n      @prop = 'top-' + arg\n\n  ```\n  class SuperClass extends TopClass {\n    constructor (arg) {\n      identity(super('super-' + arg));\n    }\n  }\n  ```\n  class SubClass extends SuperClass\n    constructor: ->\n      identity super 'sub'\n\n  ok (new SubClass).prop is 'top-super-sub'\n\ntest \"ES6 static class methods can be overriden\", ->\n  class A\n    @name: -> 'A'\n\n  class B extends A\n    @name: -> 'B'\n\n  eq A.name(), 'A'\n  eq B.name(), 'B'\n\n# If creating static by direct assignment rather than ES6 static keyword\ntest \"ES6 Static methods should set `this` to undefined // ES6 \", ->\n  class A\n    @test: ->\n      eq this, undefined\n\n# Ensure that our object prototypes work with ES6\ntest \"ES6 prototypes can be overriden\", ->\n  class A\n    className: 'classA'\n\n  ```\n  class B {\n    test () {return \"B\";};\n  }\n  ```\n  b = new B\n  a = new A\n  eq a.className, 'classA'\n  eq b.test(), 'B'\n  Object.setPrototypeOf(b, a)\n  eq b.className, 'classA'\n  # This shouldn't throw,\n  # as we only change inheritance not object construction\n  # This may be an issue with ES, rather than CS construction?\n  #eq b.test(), 'B'\n\n  class D extends B\n  B::test = () -> 'D'\n  eq (new D).test(), 'D'\n\n# TODO: implement this error check\n# test \"ES6 conformance to extending non-classes\", ->\n#   A = (@title) ->\n#     'Title: ' + @\n\n#   class B extends A\n#   b = new B('caffeinated')\n#   eq b.title, 'caffeinated'\n\n#   # Check inheritance chain\n#   A::getTitle = () -> @title\n#   eq b.getTitle(), 'caffeinated'\n\n#   throwsC = \"\"\"\n#   C = {title: 'invalid'}\n#   class D extends {}\n#   \"\"\"\n#   # This should catch on compile and message should be \"class can only extend classes and functions.\"\n#   throws -> CoffeeScript.run throwsC, bare: yes\n\n# TODO: Evaluate future compliance with \"strict mode\";\n# test \"Class function environment should be in `strict mode`, ie as if 'use strict' was in use\", ->\n#   class A\n#     # this might be a meaningless test, since these are likely to be runtime errors and different\n#     # for every browser.  Thoughts?\n#     constructor: () ->\n#       # Ivalid: prop reassignment\n#       @state = {prop: [1], prop: {a: 'a'}}\n#       # eval reassignment\n#       @badEval = eval;\n\n#   # Should throw, but doesn't\n#   a = new A\n\ntest \"only one method named constructor allowed\", ->\n  throwsA = \"\"\"\n  class A\n    constructor: (@first) ->\n    constructor: (@last) ->\n  \"\"\"\n  throwsCompileError throwsA, bare: yes\n\ntest \"If the constructor of a child class does not call super,it should return an object.\", ->\n  nonce = {}\n\n  class A\n  class B extends A\n    constructor: ->\n      return nonce\n\n  eq nonce, new B\n\n\ntest \"super can only exist in extended classes\", ->\n  throwsA = \"\"\"\n  class A\n    constructor: (@name) ->\n      super()\n  \"\"\"\n  throwsCompileError throwsA, bare: yes\n\n# --- CS1 classes compatability breaks ---\ntest \"CS6 Class extends a CS1 compiled class\", ->\n  ```\n  // Generated by CoffeeScript 1.11.1\n  var BaseCS1, ExtendedCS1,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  BaseCS1 = (function() {\n    function BaseCS1(drink) {\n      this.drink = drink;\n    }\n\n    BaseCS1.prototype.make = function() {\n      return \"making a \" + this.drink;\n    };\n\n    BaseCS1.className = function() {\n      return 'BaseCS1';\n    };\n\n    return BaseCS1;\n\n  })();\n\n  ExtendedCS1 = (function(superClass) {\n    extend(ExtendedCS1, superClass);\n\n    function ExtendedCS1(flavor) {\n      this.flavor = flavor;\n      ExtendedCS1.__super__.constructor.call(this, 'cafe ole');\n    }\n\n    ExtendedCS1.prototype.make = function() {\n      return \"making a \" + this.drink + \" with \" + this.flavor;\n    };\n\n    ExtendedCS1.className = function() {\n      return 'ExtendedCS1';\n    };\n\n    return ExtendedCS1;\n\n  })(BaseCS1);\n\n  ```\n  class B extends BaseCS1\n  eq B.className(), 'BaseCS1'\n  b = new B('machiato')\n  eq b.make(), \"making a machiato\"\n\n\ntest \"CS6 Class extends an extended CS1 compiled class\", ->\n  ```\n  // Generated by CoffeeScript 1.11.1\n  var BaseCS1, ExtendedCS1,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  BaseCS1 = (function() {\n    function BaseCS1(drink) {\n      this.drink = drink;\n    }\n\n    BaseCS1.prototype.make = function() {\n      return \"making a \" + this.drink;\n    };\n\n    BaseCS1.className = function() {\n      return 'BaseCS1';\n    };\n\n    return BaseCS1;\n\n  })();\n\n  ExtendedCS1 = (function(superClass) {\n    extend(ExtendedCS1, superClass);\n\n    function ExtendedCS1(flavor) {\n      this.flavor = flavor;\n      ExtendedCS1.__super__.constructor.call(this, 'cafe ole');\n    }\n\n    ExtendedCS1.prototype.make = function() {\n      return \"making a \" + this.drink + \" with \" + this.flavor;\n    };\n\n    ExtendedCS1.className = function() {\n      return 'ExtendedCS1';\n    };\n\n    return ExtendedCS1;\n\n  })(BaseCS1);\n\n  ```\n  class B extends ExtendedCS1\n  eq B.className(), 'ExtendedCS1'\n  b = new B('vanilla')\n  eq b.make(), \"making a cafe ole with vanilla\"\n\ntest \"CS6 Class extends a CS1 compiled class with super()\", ->\n  ```\n  // Generated by CoffeeScript 1.11.1\n  var BaseCS1, ExtendedCS1,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  BaseCS1 = (function() {\n    function BaseCS1(drink) {\n      this.drink = drink;\n    }\n\n    BaseCS1.prototype.make = function() {\n      return \"making a \" + this.drink;\n    };\n\n    BaseCS1.className = function() {\n      return 'BaseCS1';\n    };\n\n    return BaseCS1;\n\n  })();\n\n  ExtendedCS1 = (function(superClass) {\n    extend(ExtendedCS1, superClass);\n\n    function ExtendedCS1(flavor) {\n      this.flavor = flavor;\n      ExtendedCS1.__super__.constructor.call(this, 'cafe ole');\n    }\n\n    ExtendedCS1.prototype.make = function() {\n      return \"making a \" + this.drink + \" with \" + this.flavor;\n    };\n\n    ExtendedCS1.className = function() {\n      return 'ExtendedCS1';\n    };\n\n    return ExtendedCS1;\n\n  })(BaseCS1);\n\n  ```\n  class B extends ExtendedCS1\n    constructor: (@shots) ->\n      super('caramel')\n    make: () ->\n      super() + \" and #{@shots} shots of espresso\"\n\n  eq B.className(), 'ExtendedCS1'\n  b = new B('three')\n  eq b.make(), \"making a cafe ole with caramel and three shots of espresso\"\n\ntest 'Bound method called normally before binding is ok', ->\n  class Base\n    constructor: ->\n      @setProp()\n      eq @derivedBound(), 3\n\n  class Derived extends Base\n    setProp: ->\n      @prop = 3\n\n    derivedBound: =>\n      @prop\n\n  d = new Derived\n\ntest 'Bound method called as callback after super() is ok', ->\n  class Base\n\n  class Derived extends Base\n    constructor: (@prop = 3) ->\n      super()\n      f = @derivedBound\n      eq f(), 3\n\n    derivedBound: =>\n      @prop\n\n  d = new Derived\n  {derivedBound} = d\n  eq derivedBound(), 3\n\ntest 'Bound method of base class called as callback is ok', ->\n  class Base\n    constructor: (@prop = 3) ->\n      f = @baseBound\n      eq f(), 3\n\n    baseBound: =>\n      @prop\n\n  b = new Base\n  {baseBound} = b\n  eq baseBound(), 3\n\ntest 'Bound method of prop-named class called as callback is ok', ->\n  Hive = {}\n  class Hive.Bee\n    constructor: (@prop = 3) ->\n      f = @baseBound\n      eq f(), 3\n\n    baseBound: =>\n      @prop\n\n  b = new Hive.Bee\n  {baseBound} = b\n  eq baseBound(), 3\n\ntest 'Bound method of class with expression base class called as callback is ok', ->\n  calledB = no\n  B = ->\n    throw new Error if calledB\n    calledB = yes\n    class\n  class A extends B()\n    constructor: (@prop = 3) ->\n      super()\n      f = @derivedBound\n      eq f(), 3\n\n    derivedBound: =>\n      @prop\n\n  b = new A\n  {derivedBound} = b\n  eq derivedBound(), 3\n\ntest 'Bound method of class with expression class name called as callback is ok', ->\n  calledF = no\n  obj = {}\n  B = class\n  f = ->\n    throw new Error if calledF\n    calledF = yes\n    obj\n  class f().A extends B\n    constructor: (@prop = 3) ->\n      super()\n      g = @derivedBound\n      eq g(), 3\n\n    derivedBound: =>\n      @prop\n\n  a = new obj.A\n  {derivedBound} = a\n  eq derivedBound(), 3\n\ntest 'Bound method of anonymous child class called as callback is ok', ->\n  f = ->\n    B = class\n    class extends B\n      constructor: (@prop = 3) ->\n        super()\n        g = @derivedBound\n        eq g(), 3\n\n      derivedBound: =>\n        @prop\n\n  a = new (f())\n  {derivedBound} = a\n  eq derivedBound(), 3\n\ntest 'Bound method of immediately instantiated class with expression base class called as callback is ok', ->\n  calledF = no\n  obj = {}\n  B = class\n  f = ->\n    throw new Error if calledF\n    calledF = yes\n    obj\n  a = new class f().A extends B\n    constructor: (@prop = 3) ->\n      super()\n      g = @derivedBound\n      eq g(), 3\n\n    derivedBound: =>\n      @prop\n\n  {derivedBound} = a\n  eq derivedBound(), 3\n\ntest \"#4591: super.x.y, super['x'].y\", ->\n  class A\n    x:\n      y: 1\n      z: -> 2\n\n  class B extends A\n    constructor: ->\n      super()\n\n      @w = super.x.y\n      @v = super['x'].y\n      @u = super.x['y']\n      @t = super.x.z()\n      @s = super['x'].z()\n      @r = super.x['z']()\n\n  b = new B\n  eq 1, b.w\n  eq 1, b.v\n  eq 1, b.u\n  eq 2, b.t\n  eq 2, b.s\n  eq 2, b.r\n\ntest \"#4464: backticked expressions in class body\", ->\n  class A\n    `get x() { return 42; }`\n\n  class B\n    `get x() { return 42; }`\n    constructor: ->\n      @y = 84\n\n  a = new A\n  eq 42, a.x\n  b = new B\n  eq 42, b.x\n  eq 84, b.y\n\ntest \"#4724: backticked expression in a class body with hoisted member\", ->\n  class A\n    `get x() { return 42; }`\n    hoisted: 84\n\n  a = new A\n  eq 42, a.x\n  eq 84, a.hoisted\n\ntest \"#4822: nested anonymous classes use non-conflicting variable names\", ->\n  Class = class\n    @a: class\n      @b: 1\n\n  eq Class.a.b, 1\n\ntest \"#4827: executable class body wrappers have correct context\", ->\n  test = ->\n    class @A\n    class @B extends @A\n      @property = 1\n\n  o = {}\n  test.call o\n  ok typeof o.A is typeof o.B is 'function'\n\ntest \"#4868: Incorrect ‘Can’t call super with @params’ error\", ->\n  class A\n    constructor: (@func = ->) ->\n      @x = 1\n      @func()\n\n  class B extends A\n    constructor: ->\n      super -> @x = 2\n\n  a = new A\n  b = new B\n  eq 1, a.x\n  eq 2, b.x\n\n  class C\n    constructor: (@c = class) -> @c\n\n  class D extends C\n    constructor: ->\n      super class then constructor: (@a) -> @a = 3\n\n  d = new (new D).c\n  eq 3, d.a\n\ntest \"#4609: Support new.target\", ->\n  class A\n    constructor: ->\n      @calledAs = new.target.name\n\n  class B extends A\n\n  b = new B\n  eq b.calledAs, 'B'\n\n  newTarget = null\n  Foo = ->\n    newTarget = !!new.target\n\n  Foo()\n  eq newTarget, no\n\n  newTarget = null\n\n  new Foo()\n  eq newTarget, yes\n\ntest \"#5323: new.target can be the argument of a function\", ->\n  fn = (arg) -> arg\n  fn new.target\n\ntest \"#5085: Bug: @ reference to class not maintained in do block\", ->\n  thisFoo = 'initial foo'\n  thisBar = 'initial bar'\n  fn = (o) -> o.bar()\n\n  class A\n    @foo = 'foo assigned in class'\n    do => thisFoo = @foo\n    fn bar: => thisBar = @foo\n\n  eq thisFoo, 'foo assigned in class'\n  eq thisBar, 'foo assigned in class'\n\ntest \"#5204: Computed class property\", ->\n  foo = 'bar'\n  class A\n    [foo]: 'baz'\n  a = new A()\n  eq a.bar, 'baz'\n  eq A::bar, 'baz'\n\ntest \"#5204: Static computed class property\", ->\n  foo = 'bar'\n  qux = 'quux'\n  class A\n    @[foo]: 'baz'\n    @[qux]: -> 3\n  eq A.bar, 'baz'\n  eq A.quux(), 3\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"cluster\">\n# Cluster Module\n# ---------\n\nreturn if testingBrowser?\n\ncluster = require 'cluster'\n\nif cluster.isMaster\n  test \"#2737 - cluster module can spawn workers from a coffeescript process\", ->\n    cluster.once 'exit', (worker, code) ->\n      eq code, 0\n\n    cluster.fork()\nelse\n  process.exit 0\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"comments\">\n# Comments\n# --------\n\n# * Single-Line Comments\n# * Block Comments\n\n# Note: awkward spacing seen in some tests is likely intentional.\n\ntest \"comments in objects\", ->\n  obj1 = {\n  # comment\n    # comment\n      # comment\n    one: 1\n  # comment\n    two: 2\n      # comment\n  }\n\n  ok Object::hasOwnProperty.call(obj1,'one')\n  eq obj1.one, 1\n  ok Object::hasOwnProperty.call(obj1,'two')\n  eq obj1.two, 2\n\ntest \"comments in YAML-style objects\", ->\n  obj2 =\n  # comment\n    # comment\n      # comment\n    three: 3\n  # comment\n    four: 4\n      # comment\n\n  ok Object::hasOwnProperty.call(obj2,'three')\n  eq obj2.three, 3\n  ok Object::hasOwnProperty.call(obj2,'four')\n  eq obj2.four, 4\n\ntest \"comments following operators that continue lines\", ->\n  sum =\n    1 +\n    1 + # comment\n    1\n  eq 3, sum\n\ntest \"comments in functions\", ->\n  fn = ->\n  # comment\n    false\n    false   # comment\n    false\n    # comment\n\n  # comment before return\n    true\n\n  ok fn()\n\n  fn2 = -> #comment\n    fn()\n    # comment after return\n\n  ok fn2()\n\ntest \"trailing comment before an outdent\", ->\n  nonce = {}\n  fn3 = ->\n    if true\n      undefined # comment\n    nonce\n\n  eq nonce, fn3()\n\ntest \"comments in a switch\", ->\n  nonce = {}\n  result = switch nonce #comment\n    # comment\n    when false then undefined\n    # comment\n    when null #comment\n      undefined\n    else nonce # comment\n\n  eq nonce, result\n\ntest \"comment with conditional statements\", ->\n  nonce = {}\n  result = if false # comment\n    undefined\n  #comment\n  else # comment\n    nonce\n    # comment\n  eq nonce, result\n\ntest \"spaced comments with conditional statements\", ->\n  nonce = {}\n  result = if false\n    undefined\n\n  # comment\n  else if false\n    undefined\n\n  # comment\n  else\n    nonce\n\n  eq nonce, result\n\n\n# Block Comments\n\n###\n  This is a here-comment.\n  Kind of like a heredoc.\n###\n\ntest \"block comments in objects\", ->\n  a = {}\n  b = {}\n  obj = {\n    a: a\n    ###\n    block comment in object\n    ###\n    b: b\n  }\n\n  eq a, obj.a\n  eq b, obj.b\n\ntest \"block comments in YAML-style\", ->\n  a = {}\n  b = {}\n  obj =\n    a: a\n    ###\n    block comment in YAML-style\n    ###\n    b: b\n\n  eq a, obj.a\n  eq b, obj.b\n\n\ntest \"block comments in functions\", ->\n  nonce = {}\n\n  fn1 = ->\n    true\n    ###\n    false\n    ###\n\n  ok fn1()\n\n  fn2 = ->\n    ###\n    block comment in function 1\n    ###\n    nonce\n\n  eq nonce, fn2()\n\n  fn3 = ->\n    nonce\n  ###\n  block comment in function 2\n  ###\n\n  eq nonce, fn3()\n\n  fn4 = ->\n    one = ->\n      ###\n        block comment in function 3\n      ###\n      two = ->\n        three = ->\n          nonce\n\n  eq nonce, fn4()()()()\n\ntest \"block comments inside class bodies\", ->\n  class A\n    a: ->\n\n    ###\n    Comment in class body 1\n    ###\n    b: ->\n\n  ok A.prototype.b instanceof Function\n\n  class B\n    ###\n    Comment in class body 2\n    ###\n    a: ->\n    b: ->\n\n  ok B.prototype.a instanceof Function\n\ntest \"#2037: herecomments shouldn't imply line terminators\", ->\n  do (-> ### ###yes; fail)\n\ntest \"#2916: block comment before implicit call with implicit object\", ->\n  fn = (obj) -> ok obj.a\n  ### ###\n  fn\n    a: yes\n\ntest \"#3132: Format single-line block comment nicely\", ->\n  eqJS \"\"\"\n  ### Single-line block comment without additional space here => ###\"\"\",\n  \"\"\"\n  /* Single-line block comment without additional space here => */\n  \"\"\"\n\ntest \"#3132: Format multiline block comment nicely\", ->\n  eqJS \"\"\"\n  ###\n  # Multiline\n  # block\n  # comment\n  ###\"\"\",\n  \"\"\"\n  /*\n   * Multiline\n   * block\n   * comment\n   */\n  \"\"\"\n\ntest \"#3132: Format simple block comment nicely\", ->\n  eqJS \"\"\"\n  ###\n  No\n  Preceding hash\n  ###\"\"\",\n  \"\"\"\n  /*\n  No\n  Preceding hash\n  */\n  \"\"\"\n\n\ntest \"#3132: Format indented block-comment nicely\", ->\n  eqJS \"\"\"\n  fn = ->\n    ###\n    # Indented\n    Multiline\n    ###\n    1\"\"\",\n  \"\"\"\n  var fn;\n\n  fn = function() {\n    /*\n     * Indented\n    Multiline\n     */\n    return 1;\n  };\n  \"\"\"\n\n# Although adequately working, block comment-placement is not yet perfect.\n# (Considering a case where multiple variables have been declared …)\ntest \"#3132: Format jsdoc-style block-comment nicely\", ->\n  eqJS \"\"\"\n  ###*\n  # Multiline for jsdoc-\"@doctags\"\n  #\n  # @type {Function}\n  ###\n  fn = () -> 1\n  \"\"\",\n  \"\"\"\n  /**\n   * Multiline for jsdoc-\"@doctags\"\n   *\n   * @type {Function}\n   */\n  var fn;\n\n  fn = function() {\n    return 1;\n  };\"\"\"\n\n# Although adequately working, block comment-placement is not yet perfect.\n# (Considering a case where multiple variables have been declared …)\ntest \"#3132: Format hand-made (raw) jsdoc-style block-comment nicely\", ->\n  eqJS \"\"\"\n  ###*\n   * Multiline for jsdoc-\"@doctags\"\n   *\n   * @type {Function}\n  ###\n  fn = () -> 1\n  \"\"\",\n  \"\"\"\n  /**\n   * Multiline for jsdoc-\"@doctags\"\n   *\n   * @type {Function}\n   */\n  var fn;\n\n  fn = function() {\n    return 1;\n  };\"\"\"\n\n# Although adequately working, block comment-placement is not yet perfect.\n# (Considering a case where multiple variables have been declared …)\ntest \"#3132: Place block-comments nicely\", ->\n  eqJS \"\"\"\n  ###*\n  # A dummy class definition\n  #\n  # @class\n  ###\n  class DummyClass\n\n    ###*\n    # @constructor\n    ###\n    constructor: ->\n\n    ###*\n    # Singleton reference\n    #\n    # @type {DummyClass}\n    ###\n    @instance = new DummyClass()\n\n  \"\"\",\n  \"\"\"\n  /**\n   * A dummy class definition\n   *\n   * @class\n   */\n  var DummyClass;\n\n  DummyClass = (function() {\n    class DummyClass {\n      /**\n       * @constructor\n       */\n      constructor() {}\n\n    };\n\n    /**\n     * Singleton reference\n     *\n     * @type {DummyClass}\n     */\n    DummyClass.instance = new DummyClass();\n\n    return DummyClass;\n\n  }).call(this);\"\"\"\n\ntest \"#3638: Demand a whitespace after # symbol\", ->\n  eqJS \"\"\"\n  ###\n  #No\n  #whitespace\n  ###\"\"\",\n  \"\"\"\n  /*\n  #No\n  #whitespace\n   */\"\"\"\n\n\ntest \"#3761: Multiline comment at end of an object\", ->\n  anObject =\n    x: 3\n    ###\n    #Comment\n    ###\n\n  ok anObject.x is 3\n\ntest \"#4375: UTF-8 characters in comments\", ->\n  # 智に働けば角が立つ、情に掉させば流される。\n  ok yes\n\ntest \"#4290: Block comments in array literals\", ->\n  arr = [\n    ###  ###\n    3\n    ###\n      What is the meaning of life, the universe, and everything?\n    ###\n    42\n  ]\n  arrayEq arr, [3, 42]\n\ntest \"Block comments in array literals are properly indented 1\", ->\n  eqJS '''\n  arr = [\n    ### ! ###\n    3\n    42\n  ]''', '''\n  var arr;\n\n  arr = [/* ! */ 3, 42];'''\n\ntest \"Block comments in array literals are properly indented 2\", ->\n  eqJS '''\n  arr = [\n    ###  ###\n    3\n    ###\n      What is the meaning of life, the universe, and everything?\n    ###\n    42\n  ]''', '''\n  var arr;\n\n  arr = [\n    /*  */\n    3,\n    /*\n      What is the meaning of life, the universe, and everything?\n    */\n    42\n  ];'''\n\ntest \"Block comments in array literals are properly indented 3\", ->\n  eqJS '''\n  arr = [\n    ###\n      How many stooges are there?\n    ###\n    3\n    ### Who’s on first? ###\n    'Who'\n  ]''', '''\n  var arr;\n\n  arr = [\n    /*\n      How many stooges are there?\n    */\n    3,\n    /* Who’s on first? */\n    'Who'\n  ];'''\n\ntest \"Block comments in array literals are properly indented 4\", ->\n  eqJS '''\n  if yes\n    arr = [\n      1\n      ###\n        How many stooges are there?\n      ###\n      3\n      ### Who’s on first? ###\n      'Who'\n    ]''', '''\n  var arr;\n\n  if (true) {\n    arr = [\n      1,\n      /*\n        How many stooges are there?\n      */\n      3,\n      /* Who’s on first? */\n      'Who'\n    ];\n  }'''\n\ntest \"Line comments in array literals are properly indented 1\", ->\n  eqJS '''\n  arr = [\n    # How many stooges are there?\n    3\n    # Who’s on first?\n    'Who'\n  ]''', '''\n  var arr;\n\n  arr = [\n    // How many stooges are there?\n    3,\n    // Who’s on first?\n    'Who'\n  ];'''\n\ntest \"Line comments in array literals are properly indented 2\", ->\n  eqJS '''\n  arr = [\n    # How many stooges are there?\n    3\n    # Who’s on first?\n    'Who'\n    # Who?\n    {\n      firstBase: 'Who'\n      secondBase: 'What'\n      leftField: 'Why'\n    }\n  ]''', '''\n  var arr;\n\n  arr = [\n    // How many stooges are there?\n    3,\n    // Who’s on first?\n    'Who',\n    {\n      // Who?\n      firstBase: 'Who',\n      secondBase: 'What',\n      leftField: 'Why'\n    }\n  ];'''\n\ntest \"Block comments trailing their attached token are properly indented\", ->\n  eqJS '''\n  if indented\n    if indentedAgain\n      a\n      ###\n        Multiline\n        comment\n      ###\n    a\n  ''', '''\n  if (indented) {\n    if (indentedAgain) {\n      a;\n    }\n    /*\n      Multiline\n      comment\n    */\n    a;\n  }\n  '''\n\ntest \"Comments in proper order 1\", ->\n  eqJS '''\n  # 1\n  ### 2 ###\n  # 3\n  ''', '''\n  // 1\n  /* 2 */\n  // 3\n  '''\n\ntest \"Comments in proper order 2\", ->\n  eqJS '''\n  if indented\n    # 1\n    ### 2 ###\n    # 3\n    a\n  ''', '''\n  if (indented) {\n    // 1\n    /* 2 */\n    // 3\n    a;\n  }\n  '''\n\ntest \"Line comment above interpolated string\", ->\n  eqJS '''\n  if indented\n    # comment\n    \"#{1}\"\n  ''', '''\n  if (indented) {\n    // comment\n    `${1}`;\n  }'''\n\ntest \"Line comment above interpolated string object key\", ->\n  eqJS '''\n  {\n    # comment\n    \"#{1}\": 2\n  }\n  ''', '''\n  ({\n    // comment\n    [`${1}`]: 2\n  });'''\n\ntest \"Line comments in classes are properly indented\", ->\n  eqJS '''\n  class A extends B\n    # This is a fine class.\n    # I could tell you all about it, but what else do you need to know?\n    constructor: ->\n      # Something before `super`\n      super()\n\n    # This next method is a doozy!\n    # A doozy, I tell ya!\n    method: ->\n      # Whoa.\n      # Can you believe it?\n      no\n\n    ### Look out, incoming! ###\n    anotherMethod: ->\n      ### Ha! ###\n      off\n  ''', '''\n  var A;\n\n  A = class A extends B {\n    // This is a fine class.\n    // I could tell you all about it, but what else do you need to know?\n    constructor() {\n      // Something before `super`\n      super();\n    }\n\n    // This next method is a doozy!\n    // A doozy, I tell ya!\n    method() {\n      // Whoa.\n      // Can you believe it?\n      return false;\n    }\n\n    /* Look out, incoming! */\n    anotherMethod() {\n      /* Ha! */\n      return false;\n    }\n\n  };'''\n\ntest \"Line comments are properly indented\", ->\n  eqJS '''\n  # Unindented comment\n  if yes\n    # Comment indented one tab\n    1\n    if yes\n      # Comment indented two tabs\n      2\n    else\n      # Another comment indented two tabs\n      # Yet another comment indented two tabs\n      3\n  else\n    # Another comment indented one tab\n    # Yet another comment indented one tab\n    4\n\n  # Another unindented comment''', '''\n  // Unindented comment\n  if (true) {\n    // Comment indented one tab\n    1;\n    if (true) {\n      // Comment indented two tabs\n      2;\n    } else {\n      // Another comment indented two tabs\n      // Yet another comment indented two tabs\n      3;\n    }\n  } else {\n    // Another comment indented one tab\n    // Yet another comment indented one tab\n    4;\n  }\n\n  // Another unindented comment'''\n\ntest \"Line comments that trail code, followed by line comments that start a new line\", ->\n  eqJS '''\n  a = ->\n    b 1 # Trailing comment\n\n  # Comment that starts a new line\n  2\n  ''', '''\n  var a;\n\n  a = function() {\n    return b(1); // Trailing comment\n  };\n\n\n  // Comment that starts a new line\n  2;\n  '''\n\ntest \"Empty lines between comments are preserved\", ->\n  eqJS '''\n  if indented\n    # 1\n\n    # 2\n    3\n  ''', '''\n  if (indented) {\n    // 1\n\n    // 2\n    3;\n  }'''\n\ntest \"Block comment in an interpolated string\", ->\n  eqJS '\"a#{### Comment ###}b\"', '`a${/* Comment */\"\"}b`;'\n  eqJS '\"a#{### 1 ###}b#{### 2 ###}c\"', '`a${/* 1 */\"\"}b${/* 2 */\"\"}c`;'\n\ntest \"#4629: Block comment in JSX interpolation\", ->\n  eqJS '<div>{### Comment ###}</div>', '<div>{/* Comment */}</div>;'\n  eqJS '''\n  <div>\n  {###\n    Multiline\n    Comment\n  ###}\n  </div>''', '''\n  <div>\n  {/*\n    Multiline\n    Comment\n  */}\n  </div>;'''\n\ntest \"Line comment in an interpolated string\", ->\n  eqJS '''\n  \"a#{# Comment\n  1}b\"\n  ''', '''\n  `a${// Comment\n  1}b`;'''\n\ntest \"Line comments before `throw`\", ->\n  eqJS '''\n  if indented\n    1/0\n    # Uh-oh!\n    # You really shouldn’t have done that.\n    throw DivideByZeroError()\n  ''', '''\n  if (indented) {\n    1 / 0;\n    // Uh-oh!\n    // You really shouldn’t have done that.\n    throw DivideByZeroError();\n  }'''\n\ntest \"Comments before if this exists\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Comment\n  if @huh?\n    2\n  '''\n  ok js.includes '// Comment'\n\ntest \"Comment before unary (`not`)\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Comment\n  if not doubleNegative\n    dontDoIt()\n  '''\n  ok js.includes '// Comment'\n\ntest \"Comments before postfix\", ->\n  js = CoffeeScript.compile '''\n  # 1\n  2\n\n  # 3\n  return unless window?\n\n  ### 4 ###\n  return if global?\n  '''\n  ok js.includes '// 3'\n  ok js.includes '/* 4 */'\n\ntest \"Comments before assignment if\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Line comment\n  a = if b\n    3\n  else\n    4\n\n  ### Block comment ###\n  c = if d\n    5\n  '''\n  ok js.includes '// Line comment'\n  ok js.includes '/* Block comment */'\n\ntest \"Comments before for loop\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Comment\n  for drop in ocean\n    drink drop\n  '''\n  ok js.includes '// Comment'\n\ntest \"Comments after for loop\", ->\n  js = CoffeeScript.compile '''\n  for drop in ocean # Comment after source variable\n    drink drop\n  for i in [1, 2] # Comment after array literal element\n    count i\n  for key, val of {a: 1} # Comment after object literal\n    turn key\n  '''\n  ok js.includes '// Comment after source variable'\n  ok js.includes '// Comment after array literal element'\n  ok js.includes '// Comment after object literal'\n\ntest \"Comments before soak\", ->\n  js = CoffeeScript.compile '''\n  # 1\n  2\n\n  # 3\n  return unless window?.location?.hash\n\n  ### 4 ###\n  return if process?.env?.ENV\n  '''\n  ok js.includes '// 3'\n  ok js.includes '/* 4 */'\n\ntest \"Comments before splice\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Comment\n  a[1..2] = [1, 2, 3]\n  '''\n  ok js.includes '// Comment'\n\ntest \"Comments before object destructuring\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Comment before splat token\n  { x... } = { a: 1, b: 2 }\n\n  # Comment before destructured token\n  { x, y, z... } = { x: 1, y: 2, a: 3, b: 4 }\n  '''\n  ok js.includes 'Comment before splat token'\n  ok js.includes 'Comment before destructured token'\n\ntest \"Comment before splat function parameter\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Comment\n  (blah..., yadda) ->\n  '''\n  ok js.includes 'Comment'\n\ntest \"Comments before static method\", ->\n  eqJS '''\n  class Child extends Base\n    # Static method:\n    @method = ->\n  ''', '''\n  var Child;\n\n  Child = class Child extends Base {\n    // Static method:\n    static method() {}\n\n  };'''\n\ntest \"Comment before method that calls `super()`\", ->\n  eqJS '''\n  class Dismissed\n    # Before a method calling `super`\n    method: ->\n      super()\n  ''', '''\n  var Dismissed;\n\n  Dismissed = class Dismissed {\n    // Before a method calling `super`\n    method() {\n      return super.method();\n    }\n\n  };\n  '''\n\ntest \"Comment in interpolated regex\", ->\n  js = CoffeeScript.compile '''\n  1\n  ///\n    #{1}\n    # Comment\n  ///\n  '''\n  ok js.includes 'Comment'\n\ntest \"Line comment after line continuation\", ->\n  eqJS '''\n  1 + \\\\ # comment\n    2\n  ''', '''\n  1 + 2; // comment\n  '''\n\ntest \"Comments appear above scope `var` declarations\", ->\n  eqJS '''\n  # @flow\n\n  fn = (str) -> str\n  ''', '''\n  // @flow\n  var fn;\n\n  fn = function(str) {\n    return str;\n  };'''\n\ntest \"Block comments can appear with function arguments\", ->\n  eqJS '''\n  fn = (str ###: string ###, num ###: number ###) -> str + num\n  ''', '''\n  var fn;\n\n  fn = function(str/*: string */, num/*: number */) {\n    return str + num;\n  };'''\n\ntest \"Block comments can appear between function parameters and function opening brace\", ->\n  eqJS '''\n  fn = (str ###: string ###, num ###: number ###) ###: string ### ->\n    str + num\n  ''', '''\n  var fn;\n\n  fn = function(str/*: string */, num/*: number */)/*: string */ {\n    return str + num;\n  };'''\n\ntest \"Flow comment-based syntax support\", ->\n  eqJS '''\n  # @flow\n\n  fn = (str ###: string ###, num ###: number ###) ###: string ### ->\n    str + num\n  ''', '''\n  // @flow\n  var fn;\n\n  fn = function(str/*: string */, num/*: number */)/*: string */ {\n    return str + num;\n  };'''\n\ntest \"#4706: Flow comments around function parameters\", ->\n  eqJS '''\n  identity = ###::<T>### (value ###: T ###) ###: T ### ->\n    value\n  ''', '''\n  var identity;\n\n  identity = function/*::<T>*/(value/*: T */)/*: T */ {\n    return value;\n  };'''\n\ntest \"#4706: Flow comments around function parameters\", ->\n  eqJS '''\n  copy = arr.map(###:: <T> ###(item ###: T ###) ###: T ### => item)\n  ''', '''\n  var copy;\n\n  copy = arr.map(/*:: <T> */(item/*: T */)/*: T */ => {\n    return item;\n  });'''\n\ntest \"#4706: Flow comments after class name\", ->\n  eqJS '''\n  class Container ###::<T> ###\n    method: ###::<U> ### () -> true\n  ''', '''\n  var Container;\n\n  Container = class Container/*::<T> */ {\n    method/*::<U> */() {\n      return true;\n    }\n\n  };'''\n\ntest \"#4706: Identifiers with comments wrapped in parentheses remain wrapped\", ->\n  eqJS '(arr ###: Array<number> ###)', '(arr/*: Array<number> */);'\n  eqJS 'other = (arr ###: any ###)', '''\n  var other;\n\n  other = (arr/*: any */);'''\n\ntest \"#4706: Flow comments before class methods\", ->\n  eqJS '''\n  class Container\n    ###::\n    method: (number) => string;\n    method: (string) => number;\n    ###\n    method: -> true\n  ''', '''\n  var Container;\n\n  Container = class Container {\n    /*::\n    method: (number) => string;\n    method: (string) => number;\n    */\n    method() {\n      return true;\n    }\n\n  };'''\n\ntest \"#4706: Flow comments for class method params\", ->\n  eqJS '''\n  class Container\n    method: (param ###: string ###) -> true\n  ''', '''\n  var Container;\n\n  Container = class Container {\n    method(param/*: string */) {\n      return true;\n    }\n\n  };'''\n\ntest \"#4706: Flow comments for class method returns\", ->\n  eqJS '''\n  class Container\n    method: () ###: string ### -> true\n  ''', '''\n  var Container;\n\n  Container = class Container {\n    method()/*: string */ {\n      return true;\n    }\n\n  };'''\n\ntest \"#4706: Flow comments for function spread\", ->\n  eqJS '''\n  method = (...rest ###: Array<string> ###) =>\n  ''', '''\n  var method;\n\n  method = (...rest/*: Array<string> */) => {};'''\n\ntest \"#4747: Flow comments for local variable declaration\", ->\n  eqJS 'a ###: number ### = 1', '''\n  var a/*: number */;\n\n  a = 1;\n  '''\n\ntest \"#4747: Flow comments for local variable declarations\", ->\n  eqJS '''\n  a ###: number ### = 1\n  b ###: string ### = 'c'\n  ''', '''\n  var a/*: number */, b/*: string */;\n\n  a = 1;\n\n  b = 'c';\n  '''\n\ntest \"#4747: Flow comments for local variable declarations with reassignment\", ->\n  eqJS '''\n  a ###: number ### = 1\n  b ###: string ### = 'c'\n  a ### some other comment ### = 2\n  ''', '''\n  var a/*: number */, b/*: string */;\n\n  a = 1;\n\n  b = 'c';\n\n  a/* some other comment */ = 2;\n  '''\n\ntest \"#4756: Comment before ? operation\", ->\n  eqJS '''\n  do ->\n    ### Comment ###\n    @foo ? 42\n  ''', '''\n  (function() {\n    var ref;\n    /* Comment */\n    return (ref = this.foo) != null ? ref : 42;\n  })();\n  '''\n\ntest \"#5241: Comment after :\", ->\n  eqJS '''\n  return\n    a: # Comment\n      b: 1\n  ''', '''\n  return {\n    a: { // Comment\n      b: 1\n    }\n  };\n  '''\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"compilation\">\n# Compilation\n# -----------\n\n# Helper to pipe the CoffeeScript compiler’s output through a transpiler.\ntranspile = (method, code, options = {}) ->\n  # `method` should be 'compile' or 'eval' or 'run'\n  options.bare = yes\n  options.transpile =\n    # Target Internet Explorer 6, which supports no ES2015+ features.\n    presets: [['@babel/env', {targets: browsers: ['ie 6']}]]\n  CoffeeScript[method] code, options\n\n\ntest \"ensure that carriage returns don't break compilation on Windows\", ->\n  doesNotThrowCompileError 'one\\r\\ntwo', bare: on\n\ntest \"#3089 - don't mutate passed in options to compile\", ->\n  opts = {}\n  CoffeeScript.compile '1 + 1', opts\n  ok !opts.scope\n\ntest \"--bare\", ->\n  eq -1, CoffeeScript.compile('x = y', bare: on).indexOf 'function'\n  ok 'passed' is CoffeeScript.eval '\"passed\"', bare: on, filename: 'test'\n\ntest \"header (#1778)\", ->\n  header = \"// Generated by CoffeeScript #{CoffeeScript.VERSION}\\n\"\n  eq 0, CoffeeScript.compile('x = y', header: on).indexOf header\n\ntest \"header is disabled by default\", ->\n  header = \"// Generated by CoffeeScript #{CoffeeScript.VERSION}\\n\"\n  eq -1, CoffeeScript.compile('x = y').indexOf header\n\ntest \"multiple generated references\", ->\n  a = {b: []}\n  a.b[true] = -> this == a.b\n  c = 0\n  d = []\n  ok a.b[0<++c<2] d...\n\ntest \"splat on a line by itself is invalid\", ->\n  throwsCompileError \"x 'a'\\n...\\n\"\n\ntest \"Issue 750\", ->\n\n  throwsCompileError 'f(->'\n\n  throwsCompileError 'a = (break)'\n\n  throwsCompileError 'a = (return 5 for item in list)'\n\n  throwsCompileError 'a = (return 5 while condition)'\n\n  throwsCompileError 'a = for x in y\\n  return 5'\n\ntest \"Issue #986: Unicode identifiers\", ->\n  λ = 5\n  eq λ, 5\n\ntest \"#2516: Unicode spaces should not be part of identifiers\", ->\n  a = (x) -> x * 2\n  b = 3\n  eq 6, a b # U+00A0 NO-BREAK SPACE\n  eq 6, a b # U+1680 OGHAM SPACE MARK\n  eq 6, a b # U+2000 EN QUAD\n  eq 6, a b # U+2001 EM QUAD\n  eq 6, a b # U+2002 EN SPACE\n  eq 6, a b # U+2003 EM SPACE\n  eq 6, a b # U+2004 THREE-PER-EM SPACE\n  eq 6, a b # U+2005 FOUR-PER-EM SPACE\n  eq 6, a b # U+2006 SIX-PER-EM SPACE\n  eq 6, a b # U+2007 FIGURE SPACE\n  eq 6, a b # U+2008 PUNCTUATION SPACE\n  eq 6, a b # U+2009 THIN SPACE\n  eq 6, a b # U+200A HAIR SPACE\n  eq 6, a b # U+202F NARROW NO-BREAK SPACE\n  eq 6, a b # U+205F MEDIUM MATHEMATICAL SPACE\n  eq 6, a　b # U+3000 IDEOGRAPHIC SPACE\n\n  # #3560: Non-breaking space (U+00A0) (before `'c'`)\n  eq 5, {c: 5}[ 'c' ]\n\n  # A line where every space in non-breaking\n  eq 1 + 1, 2  \n\ntest \"don't accidentally stringify keywords\", ->\n  ok (-> this == 'this')() is false\n\ntest \"#1026: no if/else/else allowed\", ->\n  throwsCompileError '''\n    if a\n      b\n    else\n      c\n    else\n      d\n  '''\n\ntest \"#1050: no closing asterisk comments from within block comments\", ->\n  throwsCompileError \"### */ ###\"\n\ntest \"#1273: escaping quotes at the end of heredocs\", ->\n  throwsCompileError '\"\"\"\\\\\"\"\"' # \"\"\"\\\"\"\"\n  throwsCompileError '\"\"\"\\\\\\\\\\\\\"\"\"' # \"\"\"\\\\\\\"\"\"\n\ntest \"#1106: __proto__ compilation\", ->\n  object = eq\n  @[\"__proto__\"] = true\n  ok __proto__\n\ntest \"reference named hasOwnProperty\", ->\n  CoffeeScript.compile 'hasOwnProperty = 0; a = 1'\n\ntest \"#1055: invalid keys in real (but not work-product) objects\", ->\n  throwsCompileError \"@key: value\"\n\ntest \"#1066: interpolated strings are not implicit functions\", ->\n  throwsCompileError '\"int#{er}polated\" arg'\n\ntest \"#2846: while with empty body\", ->\n  CoffeeScript.compile 'while 1 then', {sourceMap: true}\n\ntest \"#2944: implicit call with a regex argument\", ->\n  CoffeeScript.compile 'o[key] /regex/'\n\ntest \"#3001: `own` shouldn't be allowed in a `for`-`in` loop\", ->\n  throwsCompileError \"a for own b in c\"\n\ntest \"#2994: single-line `if` requires `then`\", ->\n  throwsCompileError \"if b else x\"\n\ntest \"transpile option, for Node API CoffeeScript.compile\", ->\n  return if global.testingBrowser\n  ok transpile('compile', \"import fs from 'fs'\").includes 'require'\n\ntest \"transpile option, for Node API CoffeeScript.eval\", ->\n  return if global.testingBrowser\n  ok transpile 'eval', \"import path from 'path'; path.sep in ['/', '\\\\\\\\']\"\n\ntest \"transpile option, for Node API CoffeeScript.run\", ->\n  return if global.testingBrowser\n  doesNotThrow -> transpile 'run', \"import fs from 'fs'\"\n\ntest \"transpile option has merged source maps\", ->\n  return if global.testingBrowser\n  untranspiledOutput = CoffeeScript.compile \"import path from 'path'\\nconsole.log path.sep\", sourceMap: yes\n  transpiledOutput   = transpile 'compile', \"import path from 'path'\\nconsole.log path.sep\", sourceMap: yes\n  untranspiledOutput.v3SourceMap = JSON.parse untranspiledOutput.v3SourceMap\n  transpiledOutput.v3SourceMap   = JSON.parse transpiledOutput.v3SourceMap\n  ok untranspiledOutput.v3SourceMap.mappings isnt transpiledOutput.v3SourceMap.mappings\n  # Babel adds `'use strict';` to the top of files with the modules transform.\n  eq transpiledOutput.js.indexOf('use strict'), 1\n  # The `'use strict';` followed by two newlines results in the first two lines\n  # of the source map mappings being two blank/skipped lines.\n  eq transpiledOutput.v3SourceMap.mappings.indexOf(';;'), 0\n  # The number of lines in the transpiled code should match the number of lines\n  # in the source map.\n  eq transpiledOutput.js.split('\\n').length, transpiledOutput.v3SourceMap.mappings.split(';').length\n\ntest \"using transpile from the Node API requires an object\", ->\n  try\n    CoffeeScript.compile '', transpile: yes\n  catch exception\n    eq exception.message, 'The transpile option must be given an object with options to pass to Babel'\n\ntest \"transpile option applies to imported .coffee files\", ->\n  return if global.testingBrowser\n  doesNotThrow -> transpile 'run', \"import { getSep } from './test/importing/transpile_import'\\ngetSep()\"\n\ntest \"#3306: trailing comma in a function call in the last line\", ->\n  eqJS '''\n  foo bar,\n  ''', '''\n  foo(bar);\n  '''\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"comprehensions\">\n# Comprehensions\n# --------------\n\n# * Array Comprehensions\n# * Range Comprehensions\n# * Object Comprehensions\n# * Implicit Destructuring Assignment\n# * Comprehensions with Nonstandard Step\n\n# TODO: refactor comprehension tests\n\ntest \"Basic array comprehensions.\", ->\n\n  nums    = (n * n for n in [1, 2, 3] when n & 1)\n  results = (n * 2 for n in nums)\n\n  ok results.join(',') is '2,18'\n\n\ntest \"Basic object comprehensions.\", ->\n\n  obj   = {one: 1, two: 2, three: 3}\n  names = (prop + '!' for prop of obj)\n  odds  = (prop + '!' for prop, value of obj when value & 1)\n\n  ok names.join(' ') is \"one! two! three!\"\n  ok odds.join(' ')  is \"one! three!\"\n\n\ntest \"Basic range comprehensions.\", ->\n\n  nums = (i * 3 for i in [1..3])\n\n  negs = (x for x in [-20..-5*2])\n  negs = negs[0..2]\n\n  result = nums.concat(negs).join(', ')\n\n  ok result is '3, 6, 9, -20, -19, -18'\n\n\ntest \"With range comprehensions, you can loop in steps.\", ->\n\n  results = (x for x in [0...15] by 5)\n  ok results.join(' ') is '0 5 10'\n\n  results = (x for x in [0..100] by 10)\n  ok results.join(' ') is '0 10 20 30 40 50 60 70 80 90 100'\n\n\ntest \"And can loop downwards, with a negative step.\", ->\n\n  results = (x for x in [5..1])\n\n  ok results.join(' ') is '5 4 3 2 1'\n  ok results.join(' ') is [(10-5)..(-2+3)].join(' ')\n\n  results = (x for x in [10..1])\n  ok results.join(' ') is [10..1].join(' ')\n\n  results = (x for x in [10...0] by -2)\n  ok results.join(' ') is [10, 8, 6, 4, 2].join(' ')\n\n\ntest \"Range comprehension gymnastics.\", ->\n\n  eq \"#{i for i in [5..1]}\", '5,4,3,2,1'\n  eq \"#{i for i in [5..-5] by -5}\", '5,0,-5'\n\n  a = 6\n  b = 0\n  c = -2\n\n  eq \"#{i for i in [a..b]}\", '6,5,4,3,2,1,0'\n  eq \"#{i for i in [a..b] by c}\", '6,4,2,0'\n\n\ntest \"Multiline array comprehension with filter.\", ->\n\n  evens = for num in [1, 2, 3, 4, 5, 6] when not (num & 1)\n             num *= -1\n             num -= 2\n             num * -1\n  eq evens + '', '4,6,8'\n\n\n  test \"The in operator still works, standalone.\", ->\n\n    ok 2 of evens\n\n\ntest \"all isn't reserved.\", ->\n\n  all = 1\n\n\ntest \"Ensure that the closure wrapper preserves local variables.\", ->\n\n  obj = {}\n\n  for method in ['one', 'two', 'three'] then do (method) ->\n    obj[method] = ->\n      \"I'm \" + method\n\n  ok obj.one()   is \"I'm one\"\n  ok obj.two()   is \"I'm two\"\n  ok obj.three() is \"I'm three\"\n\n\ntest \"Index values at the end of a loop.\", ->\n\n  i = 0\n  for i in [1..3]\n    -> 'func'\n    break if false\n  ok i is 4\n\n\ntest \"Ensure that local variables are closed over for range comprehensions.\", ->\n\n  funcs = for i in [1..3]\n    do (i) ->\n      -> -i\n\n  eq (func() for func in funcs).join(' '), '-1 -2 -3'\n  ok i is 4\n\n\ntest \"Even when referenced in the filter.\", ->\n\n  list = ['one', 'two', 'three']\n\n  methods = for num, i in list when num isnt 'two' and i isnt 1\n    do (num, i) ->\n      -> num + ' ' + i\n\n  ok methods.length is 2\n  ok methods[0]() is 'one 0'\n  ok methods[1]() is 'three 2'\n\n\ntest \"Even a convoluted one.\", ->\n\n  funcs = []\n\n  for i in [1..3]\n    do (i) ->\n      x = i * 2\n      ((z)->\n        funcs.push -> z + ' ' + i\n      )(x)\n\n  ok (func() for func in funcs).join(', ') is '2 1, 4 2, 6 3'\n\n  funcs = []\n\n  results = for i in [1..3]\n    do (i) ->\n      z = (x * 3 for x in [1..i])\n      ((a, b, c) -> [a, b, c].join(' ')).apply this, z\n\n  ok results.join(', ') is '3  , 3 6 , 3 6 9'\n\n\ntest \"Naked ranges are expanded into arrays.\", ->\n\n  array = [0..10]\n  ok(num % 2 is 0 for num in array by 2)\n\n\ntest \"Nested shared scopes.\", ->\n\n  foo = ->\n    for i in [0..7]\n      do (i) ->\n        for j in [0..7]\n          do (j) ->\n            -> i + j\n\n  eq foo()[3][4](), 7\n\n\ntest \"Scoped loop pattern matching.\", ->\n\n  a = [[0], [1]]\n  funcs = []\n\n  for [v] in a\n    do (v) ->\n      funcs.push -> v\n\n  eq funcs[0](), 0\n  eq funcs[1](), 1\n\n\ntest \"Nested comprehensions.\", ->\n\n  multiLiner =\n    for x in [3..5]\n      for y in [3..5]\n        [x, y]\n\n  singleLiner =\n    (([x, y] for y in [3..5]) for x in [3..5])\n\n  ok multiLiner.length is singleLiner.length\n  ok 5 is multiLiner[2][2][1]\n  ok 5 is singleLiner[2][2][1]\n\n\ntest \"Comprehensions within parentheses.\", ->\n\n  result = null\n  store = (obj) -> result = obj\n  store (x * 2 for x in [3, 2, 1])\n\n  ok result.join(' ') is '6 4 2'\n\n\ntest \"Closure-wrapped comprehensions that refer to the 'arguments' object.\", ->\n\n  expr = ->\n    result = (item * item for item in arguments)\n\n  ok expr(2, 4, 8).join(' ') is '4 16 64'\n\n\ntest \"Fast object comprehensions over all properties, including prototypal ones.\", ->\n\n  class Cat\n    constructor: -> @name = 'Whiskers'\n    breed: 'tabby'\n    hair:  'cream'\n\n  whiskers = new Cat\n  own = (value for own key, value of whiskers)\n  all = (value for key, value of whiskers)\n\n  ok own.join(' ') is 'Whiskers'\n  ok all.sort().join(' ') is 'Whiskers cream tabby'\n\n\ntest \"Optimized range comprehensions.\", ->\n\n  exxes = ('x' for [0...10])\n  ok exxes.join(' ') is 'x x x x x x x x x x'\n\n\ntest \"#3671: Allow step in optimized range comprehensions.\", ->\n\n  exxes = ('x' for [0...10] by 2)\n  eq exxes.join(' ') , 'x x x x x'\n\n\ntest \"#3671: Disallow guard in optimized range comprehensions.\", ->\n\n  throwsCompileError \"exxes = ('x' for [0...10] when a)\"\n\n\ntest \"Loop variables should be able to reference outer variables\", ->\n  outer = 1\n  do ->\n    null for outer in [1, 2, 3]\n  eq outer, 3\n\n\ntest \"Lenient on pure statements not trying to reach out of the closure\", ->\n\n  val = for i in [1]\n    for j in [] then break\n    i\n  ok val[0] is i\n\n\ntest \"Comprehensions only wrap their last line in a closure, allowing other lines\n  to have pure expressions in them.\", ->\n\n  func = -> for i in [1]\n    break if i is 2\n    j for j in [1]\n\n  ok func()[0][0] is 1\n\n  i = 6\n  odds = while i--\n    continue unless i & 1\n    i\n\n  ok odds.join(', ') is '5, 3, 1'\n\n\ntest \"Issue #897: Ensure that plucked function variables aren't leaked.\", ->\n\n  facets = {}\n  list = ['one', 'two']\n\n  (->\n    for entity in list\n      facets[entity] = -> entity\n  )()\n\n  eq typeof entity, 'undefined'\n  eq facets['two'](), 'two'\n\n\ntest \"Issue #905. Soaks as the for loop subject.\", ->\n\n  a = {b: {c: [1, 2, 3]}}\n  for d in a.b?.c\n    e = d\n\n  eq e, 3\n\n\ntest \"Issue #948. Capturing loop variables.\", ->\n\n  funcs = []\n  list  = ->\n    [1, 2, 3]\n\n  for y in list()\n    do (y) ->\n      z = y\n      funcs.push -> \"y is #{y} and z is #{z}\"\n\n  eq funcs[1](), \"y is 2 and z is 2\"\n\n\ntest \"Cancel the comprehension if there's a jump inside the loop.\", ->\n\n  result = try\n    for i in [0...10]\n      continue if i < 5\n    i\n\n  eq result, 10\n\n\ntest \"Comprehensions over break.\", ->\n\n  arrayEq (break for [1..10]), []\n\n\ntest \"Comprehensions over continue.\", ->\n\n  arrayEq (continue for [1..10]), []\n\n\ntest \"Comprehensions over function literals.\", ->\n\n  a = 0\n  for f in [-> a = 1]\n    do (f) ->\n      do f\n\n  eq a, 1\n\n\ntest \"Comprehensions that mention arguments.\", ->\n\n  list = [arguments: 10]\n  args = for f in list\n    do (f) ->\n      f.arguments\n  eq args[0], 10\n\n\ntest \"expression conversion under explicit returns\", ->\n  nonce = {}\n  fn = ->\n    return (nonce for x in [1,2,3])\n  arrayEq [nonce,nonce,nonce], fn()\n  fn = ->\n    return [nonce for x in [1,2,3]][0]\n  arrayEq [nonce,nonce,nonce], fn()\n  fn = ->\n    return [(nonce for x in [1..3])][0]\n  arrayEq [nonce,nonce,nonce], fn()\n\n\ntest \"implicit destructuring assignment in object of objects\", ->\n  a={}; b={}; c={}\n  obj = {\n    a: { d: a },\n    b: { d: b }\n    c: { d: c }\n  }\n  result = ([y,z] for y, { d: z } of obj)\n  arrayEq [['a',a],['b',b],['c',c]], result\n\n\ntest \"implicit destructuring assignment in array of objects\", ->\n  a={}; b={}; c={}; d={}; e={}; f={}\n  arr = [\n    { a: a, b: { c: b } },\n    { a: c, b: { c: d } },\n    { a: e, b: { c: f } }\n  ]\n  result = ([y,z] for { a: y, b: { c: z } } in arr)\n  arrayEq [[a,b],[c,d],[e,f]], result\n\n\ntest \"implicit destructuring assignment in array of arrays\", ->\n  a={}; b={}; c={}; d={}; e={}; f={}\n  arr = [[a, [b]], [c, [d]], [e, [f]]]\n  result = ([y,z] for [y, [z]] in arr)\n  arrayEq [[a,b],[c,d],[e,f]], result\n\ntest \"issue #1124: don't assign a variable in two scopes\", ->\n  lista = [1, 2, 3, 4, 5]\n  listb = (_i + 1 for _i in lista)\n  arrayEq [2, 3, 4, 5, 6], listb\n\ntest \"#1326: `by` value is uncached\", ->\n  a = [0,1,2]\n  fi = gi = hi = 0\n  f = -> ++fi\n  g = -> ++gi\n  h = -> ++hi\n\n  forCompile = []\n  rangeCompileSimple = []\n\n  #exercises For.compile\n  for v, i in a by f()\n    forCompile.push i\n\n  #exercises Range.compileSimple\n  rangeCompileSimple = (i for i in [0..2] by g())\n\n  arrayEq a, forCompile\n  arrayEq a, rangeCompileSimple\n  #exercises Range.compile\n  eq \"#{i for i in [0..2] by h()}\", '0,1,2'\n\ntest \"#1669: break/continue should skip the result only for that branch\", ->\n  ns = for n in [0..99]\n    if n > 9\n      break\n    else if n & 1\n      continue\n    else\n      n\n  eq \"#{ns}\", '0,2,4,6,8'\n\n  # `else undefined` is implied.\n  ns = for n in [1..9]\n    if n % 2\n      continue unless n % 5\n      n\n  eq \"#{ns}\", \"1,,3,,,7,,9\"\n\n  # Ditto.\n  ns = for n in [1..9]\n    switch\n      when n % 2\n        continue unless n % 5\n        n\n  eq \"#{ns}\", \"1,,3,,,7,,9\"\n\ntest \"#1850: inner `for` should not be expression-ized if `return`ing\", ->\n  eq '3,4,5', do ->\n    for a in [1..9] then \\\n    for b in [1..9]\n      c = Math.sqrt a*a + b*b\n      return String [a, b, c] unless c % 1\n\ntest \"#1910: loop index should be mutable within a loop iteration and immutable between loop iterations\", ->\n  n = 1\n  iterations = 0\n  arr = [0..n]\n  for v, k in arr\n    ++iterations\n    v = k = 5\n    eq 5, k\n  eq 2, k\n  eq 2, iterations\n\n  iterations = 0\n  for v in [0..n]\n    ++iterations\n  eq 2, k\n  eq 2, iterations\n\n  arr = ([v, v + 1] for v in [0..5])\n  iterations = 0\n  for [v0, v1], k in arr when v0\n    k += 3\n    ++iterations\n  eq 6, k\n  eq 5, iterations\n\ntest \"#2007: Return object literal from comprehension\", ->\n  y = for x in [1, 2]\n    foo: \"foo\" + x\n  eq 2, y.length\n  eq \"foo1\", y[0].foo\n  eq \"foo2\", y[1].foo\n\n  x = 2\n  y = while x\n    x: --x\n  eq 2, y.length\n  eq 1, y[0].x\n  eq 0, y[1].x\n\ntest \"#2274: Allow @values as loop variables\", ->\n  obj = {\n    item: null\n    method: ->\n      for @item in [1, 2, 3]\n        null\n  }\n  eq obj.item, null\n  obj.method()\n  eq obj.item, 3\n\ntest \"#4411: Allow @values as loop indices\", ->\n  obj =\n    index: null\n    get: -> @index\n    method: ->\n      @get() for _, @index in [1, 2, 3]\n  eq obj.index, null\n  arrayEq obj.method(), [0, 1, 2]\n  eq obj.index, 3\n\ntest \"#2525, #1187, #1208, #1758, looping over an array forwards\", ->\n  list = [0, 1, 2, 3, 4]\n\n  ident = (x) -> x\n\n  arrayEq (i for i in list), list\n\n  arrayEq (index for i, index in list), list\n\n  arrayEq (i for i in list by 1), list\n\n  arrayEq (i for i in list by ident 1), list\n\n  arrayEq (i for i in list by ident(1) * 2), [0, 2, 4]\n\n  arrayEq (index for i, index in list by ident(1) * 2), [0, 2, 4]\n\ntest \"#2525, #1187, #1208, #1758, looping over an array backwards\", ->\n  list = [0, 1, 2, 3, 4]\n  backwards = [4, 3, 2, 1, 0]\n\n  ident = (x) -> x\n\n  arrayEq (i for i in list by -1), backwards\n\n  arrayEq (index for i, index in list by -1), backwards\n\n  arrayEq (i for i in list by ident -1), backwards\n\n  arrayEq (i for i in list by ident(-1) * 2), [4, 2, 0]\n\n  arrayEq (index for i, index in list by ident(-1) * 2), [4, 2, 0]\n\ntest \"splats in destructuring in comprehensions\", ->\n  list = [[0, 1, 2], [2, 3, 4], [4, 5, 6]]\n  arrayEq (seq for [rep, seq...] in list), [[1, 2], [3, 4], [5, 6]]\n\ntest \"#156: expansion in destructuring in comprehensions\", ->\n  list = [[0, 1, 2], [2, 3, 4], [4, 5, 6]]\n  arrayEq (last for [..., last] in list), [2, 4, 6]\n\ntest \"#3778: Consistently always cache for loop range boundaries and steps, even\n      if they are simple identifiers\", ->\n  a = 1; arrayEq [1, 2, 3], (for n in [1, 2, 3] by  a then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [1, 2, 3] by +a then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [a..3]          then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [+a..3]         then a = 4; n)\n  a = 3; arrayEq [1, 2, 3], (for n in [1..a]          then a = 4; n)\n  a = 3; arrayEq [1, 2, 3], (for n in [1..+a]         then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [1..3] by  a    then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [1..3] by +a    then a = 4; n)\n\ntest \"for pattern variables can linebreak/indent\", ->\n  listOfObjects = [a: 1]\n  sum = 0\n  for {\n    a\n    somethingElse\n    anotherProperty\n  } in listOfObjects\n    sum += a\n  eq a, 1\n\n  sum = 0\n  sum += a for {\n    a,\n    somethingElse,\n    anotherProperty,\n  } in listOfObjects\n  eq a, 1\n\n  listOfArrays = [[2]]\n  sum = 0\n  for [\n    a\n    nonexistentElement\n    anotherNonexistentElement\n  ] in listOfArrays\n    sum += a\n  eq a, 2\n\n  sum = 0\n  sum += a for [\n    a,\n    nonexistentElement,\n    anotherNonexistentElement\n  ] in listOfArrays\n  eq a, 2\n\ntest \"#5309: comprehension as postfix condition\", ->\n  doesNotThrowCompileError \"\"\"\n    throw new Error \"DOOM was called with a null element\" unless elm? for elm in elms\n  \"\"\"\n\ntest \"#5410: for from loops shouldn't make excess refs\", ->\n  js = CoffeeScript.compile \"\"\"\n    for x from fn()\n      alert x\n  \"\"\"\n\n  ok !js.match /ref/\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"control_flow\">\n# Control Flow\n# ------------\n\n# * Conditionals\n# * Loops\n#   * For\n#   * While\n#   * Until\n#   * Loop\n# * Switch\n# * Throw\n\n# TODO: make sure postfix forms and expression coercion are properly tested\n\n# shared identity function\nid = (_) -> if arguments.length is 1 then _ else Array::slice.call(arguments)\n\n# Conditionals\n\ntest \"basic conditionals\", ->\n  if false\n    ok false\n  else if false\n    ok false\n  else\n    ok true\n\n  if true\n    ok true\n  else if true\n    ok false\n  else\n    ok true\n\n  unless true\n    ok false\n  else unless true\n    ok false\n  else\n    ok true\n\n  unless false\n    ok true\n  else unless false\n    ok false\n  else\n    ok true\n\ntest \"single-line conditional\", ->\n  if false then ok false else ok true\n  unless false then ok true else ok false\n\ntest \"nested conditionals\", ->\n  nonce = {}\n  eq nonce, (if true\n    unless false\n      if false then false else\n        if true\n          nonce)\n\ntest \"nested single-line conditionals\", ->\n  nonce = {}\n\n  a = if false then undefined else b = if 0 then undefined else nonce\n  eq nonce, a\n  eq nonce, b\n\n  c = if false then undefined else (if 0 then undefined else nonce)\n  eq nonce, c\n\n  d = if true then id(if false then undefined else nonce)\n  eq nonce, d\n\ntest \"empty conditional bodies\", ->\n  eq undefined, (if false\n  else if false\n  else)\n\ntest \"conditional bodies containing only comments\", ->\n  eq undefined, (if true\n    ###\n    block comment\n    ###\n  else\n    # comment\n  )\n\n  eq undefined, (if false\n    # comment\n  else if true\n    ###\n    block comment\n    ###\n  else)\n\ntest \"return value of if-else is from the proper body\", ->\n  nonce = {}\n  eq nonce, if false then undefined else nonce\n\ntest \"return value of unless-else is from the proper body\", ->\n  nonce = {}\n  eq nonce, unless true then undefined else nonce\n\ntest \"assign inside the condition of a conditional statement\", ->\n  nonce = {}\n  if a = nonce then 1\n  eq nonce, a\n  1 if b = nonce\n  eq nonce, b\n\n\n# Interactions With Functions\n\ntest \"single-line function definition with single-line conditional\", ->\n  fn = -> if 1 < 0.5 then 1 else -1\n  ok fn() is -1\n\ntest \"function resturns conditional value with no `else`\", ->\n  fn = ->\n    return if false then true\n  eq undefined, fn()\n\ntest \"function returns a conditional value\", ->\n  a = {}\n  fnA = ->\n    return if false then undefined else a\n  eq a, fnA()\n\n  b = {}\n  fnB = ->\n    return unless false then b else undefined\n  eq b, fnB()\n\ntest \"passing a conditional value to a function\", ->\n  nonce = {}\n  eq nonce, id if false then undefined else nonce\n\ntest \"unmatched `then` should catch implicit calls\", ->\n  a = 0\n  trueFn = -> true\n  if trueFn undefined then a++\n  eq 1, a\n\n\n# if-to-ternary\n\ntest \"if-to-ternary with instanceof requires parentheses\", ->\n  nonce = {}\n  eq nonce, (if {} instanceof Object\n    nonce\n  else\n    undefined)\n\ntest \"if-to-ternary as part of a larger operation requires parentheses\", ->\n  ok 2, 1 + if false then 0 else 1\n\n\n# Odd Formatting\n\ntest \"if-else indented within an assignment\", ->\n  nonce = {}\n  result =\n    if false\n      undefined\n    else\n      nonce\n  eq nonce, result\n\ntest \"suppressed indentation via assignment\", ->\n  nonce = {}\n  result =\n    if      false then undefined\n    else if no    then undefined\n    else if 0     then undefined\n    else if 1 < 0 then undefined\n    else               id(\n         if false then undefined\n         else          nonce\n    )\n  eq nonce, result\n\ntest \"tight formatting with leading `then`\", ->\n  nonce = {}\n  eq nonce,\n  if true\n  then nonce\n  else undefined\n\ntest \"#738: inline function defintion\", ->\n  nonce = {}\n  fn = if true then -> nonce\n  eq nonce, fn()\n\ntest \"#748: trailing reserved identifiers\", ->\n  nonce = {}\n  obj = delete: true\n  result = if obj.delete\n    nonce\n  eq nonce, result\n\ntest 'if-else within an assignment, condition parenthesized', ->\n  result = if (1 is 1) then 'correct'\n  eq result, 'correct'\n\n  result = if ('whatever' ? no) then 'correct'\n  eq result, 'correct'\n\n  f = -> 'wrong'\n  result = if (f?()) then 'correct' else 'wrong'\n  eq result, 'correct'\n\n# Postfix\n\ntest \"#3056: multiple postfix conditionals\", ->\n  temp = 'initial'\n  temp = 'ignored' unless true if false\n  eq temp, 'initial'\n\n# Loops\n\ntest \"basic `while` loops\", ->\n\n  i = 5\n  list = while i -= 1\n    i * 2\n  ok list.join(' ') is \"8 6 4 2\"\n\n  i = 5\n  list = (i * 3 while i -= 1)\n  ok list.join(' ') is \"12 9 6 3\"\n\n  i = 5\n  func   = (num) -> i -= num\n  assert = -> ok i < 5 > 0\n  results = while func 1\n    assert()\n    i\n  ok results.join(' ') is '4 3 2 1'\n\n  i = 10\n  results = while i -= 1 when i % 2 is 0\n    i * 2\n  ok results.join(' ') is '16 12 8 4'\n\n\ntest \"Issue 759: `if` within `while` condition\", ->\n\n  2 while if 1 then 0\n\n\ntest \"assignment inside the condition of a `while` loop\", ->\n\n  nonce = {}\n  count = 1\n  a = nonce while count--\n  eq nonce, a\n  count = 1\n  while count--\n    b = nonce\n  eq nonce, b\n\n\ntest \"While over break.\", ->\n\n  i = 0\n  result = while i < 10\n    i++\n    break\n  arrayEq result, []\n\n\ntest \"While over continue.\", ->\n\n  i = 0\n  result = while i < 10\n    i++\n    continue\n  arrayEq result, []\n\n\ntest \"Basic `until`\", ->\n\n  value = false\n  i = 0\n  results = until value\n    value = true if i is 5\n    i++\n  ok i is 6\n\n\ntest \"Basic `loop`\", ->\n\n  i = 5\n  list = []\n  loop\n    i -= 1\n    break if i is 0\n    list.push i * 2\n  ok list.join(' ') is '8 6 4 2'\n\n\ntest \"break at the top level\", ->\n  for i in [1,2,3]\n    result = i\n    if i == 2\n      break\n  eq 2, result\n\ntest \"break *not* at the top level\", ->\n  someFunc = ->\n    i = 0\n    while ++i < 3\n      result = i\n      break if i > 1\n    result\n  eq 2, someFunc()\n\n# Switch\n\ntest \"basic `switch`\", ->\n\n  num = 10\n  result = switch num\n    when 5 then false\n    when 'a'\n      true\n      true\n      false\n    when 10 then true\n\n\n    # Mid-switch comment with whitespace\n    # and multi line\n    when 11 then false\n    else false\n\n  ok result\n\n\n  func = (num) ->\n    switch num\n      when 2, 4, 6\n        true\n      when 1, 3, 5\n        false\n\n  ok func(2)\n  ok func(6)\n  ok !func(3)\n  eq func(8), undefined\n\n\ntest \"Ensure that trailing switch elses don't get rewritten.\", ->\n\n  result = false\n  switch \"word\"\n    when \"one thing\"\n      doSomething()\n    else\n      result = true unless false\n\n  ok result\n\n  result = false\n  switch \"word\"\n    when \"one thing\"\n      doSomething()\n    when \"other thing\"\n      doSomething()\n    else\n      result = true unless false\n\n  ok result\n\n\ntest \"Should be able to handle switches sans-condition.\", ->\n\n  result = switch\n    when null                     then 0\n    when !1                       then 1\n    when '' not of {''}           then 2\n    when [] not instanceof Array  then 3\n    when true is false            then 4\n    when 'x' < 'y' > 'z'          then 5\n    when 'a' in ['b', 'c']        then 6\n    when 'd' in (['e', 'f'])      then 7\n    else ok\n\n  eq result, ok\n\n\ntest \"Should be able to use `@properties` within the switch clause.\", ->\n\n  obj = {\n    num: 101\n    func: ->\n      switch @num\n        when 101 then '101!'\n        else 'other'\n  }\n\n  ok obj.func() is '101!'\n\n\ntest \"Should be able to use `@properties` within the switch cases.\", ->\n\n  obj = {\n    num: 101\n    func: (yesOrNo) ->\n      result = switch yesOrNo\n        when yes then @num\n        else 'other'\n      result\n  }\n\n  ok obj.func(yes) is 101\n\n\ntest \"Switch with break as the return value of a loop.\", ->\n\n  i = 10\n  results = while i > 0\n    i--\n    switch i % 2\n      when 1 then i\n      when 0 then break\n\n  eq results.join(', '), '9, 7, 5, 3, 1'\n\n\ntest \"Issue #997. Switch doesn't fallthrough.\", ->\n\n  val = 1\n  switch true\n    when true\n      if false\n        return 5\n    else\n      val = 2\n\n  eq val, 1\n\n# Throw\n\ntest \"Throw should be usable as an expression.\", ->\n  try\n    false or throw 'up'\n    throw new Error 'failed'\n  catch e\n    ok e is 'up'\n\n\ntest \"#2555, strange function if bodies\", ->\n  success = -> ok true\n  failure = -> ok false\n\n  success() if do ->\n    yes\n\n  failure() if try\n    false\n\ntest \"#1057: `catch` or `finally` in single-line functions\", ->\n  ok do -> try throw 'up' catch then yes\n  ok do -> try yes finally 'nothing'\n\ntest \"#2367: super in for-loop\", ->\n  class Foo\n    sum: 0\n    add: (val) -> @sum += val\n\n  class Bar extends Foo\n    add: (vals...) ->\n      super val for val in vals\n      @sum\n\n  eq 10, (new Bar).add 2, 3, 5\n\ntest \"#4267: lots of for-loops in the same scope\", ->\n  # This used to include the invalid JavaScript `var do = 0`.\n  code = \"\"\"\n    do ->\n      #{Array(200).join('for [0..0] then\\n  ')}\n      true\n  \"\"\"\n  ok CoffeeScript.eval(code)\n\n# Test for issue #2342: Lexer: Inline `else` binds to wrong `if`/`switch`\ntest \"#2343: if / then / if / then / else\", ->\n  a = b = yes\n  c = e = g = no\n  d = 1\n  f = 2\n  h = 3\n  i = 4\n\n  s = ->\n    if a\n      if b\n        if c\n          d\n        else\n          if e\n            f\n          else\n            if g\n              h\n            else\n              i\n\n  t = ->\n    if a then if b\n      if c then d\n      else if e\n        f\n      else if g\n        h\n      else\n        i\n\n  u = ->\n    if a then if b\n      if c then d else if e\n        f\n      else if g\n        h\n      else i\n\n  v = ->\n    if a then if b\n      if c then d else if e then f\n      else if g then h\n      else i\n\n  w = ->\n    if a then if b\n      if c then d\n      else if e\n          f\n        else\n          if g then h\n          else i\n\n  x = -> if a then if b then if c then d else if e then f else if g then h else i\n\n  y = -> if a then if b then (if c then d else (if e then f else (if g then h else i)))\n\n  eq 4, s()\n  eq 4, t()\n  eq 4, u()\n  eq 4, v()\n  eq 4, w()\n  eq 4, x()\n  eq 4, y()\n\n  c = yes\n  eq 1, s()\n  eq 1, t()\n  eq 1, u()\n  eq 1, v()\n  eq 1, w()\n  eq 1, x()\n  eq 1, y()\n\n  b = no\n  eq undefined, s()\n  eq undefined, t()\n  eq undefined, u()\n  eq undefined, v()\n  eq undefined, w()\n  eq undefined, x()\n  eq undefined, y()\n\ntest \"#2343: if / then / if / then / else / else\", ->\n  a = b = yes\n  c = e = g = no\n  d = 1\n  f = 2\n  h = 3\n  i = 4\n  j = 5\n  k = 6\n\n  s = ->\n    if a\n      if b\n        if c\n          d\n        else\n          e\n          if e\n            f\n          else\n            if g\n              h\n            else\n              i\n      else\n        j\n    else\n      k\n\n  t = ->\n    if a\n      if b\n        if c then d\n        else if e\n          f\n        else if g\n          h\n        else\n          i\n      else\n        j\n    else\n      k\n\n  u = ->\n    if a\n      if b\n        if c then d else if e\n          f\n        else if g\n          h\n        else i\n      else j\n    else k\n\n  v = ->\n    if a\n      if b\n        if c then d else if e then f\n        else if g then h\n        else i\n      else j else k\n\n  w = ->\n    if a then if b\n        if c then d\n        else if e\n            f\n          else\n            if g then h\n            else i\n    else j else k\n\n  x = -> if a then if b then if c then d else if e then f else if g then h else i else j else k\n\n  y = -> if a then (if b then (if c then d else (if e then f else (if g then h else i))) else j) else k\n\n  eq 4, s()\n  eq 4, t()\n  eq 4, u()\n  eq 4, v()\n  eq 4, w()\n  eq 4, x()\n  eq 4, y()\n\n  c = yes\n  eq 1, s()\n  eq 1, t()\n  eq 1, u()\n  eq 1, v()\n  eq 1, w()\n  eq 1, x()\n  eq 1, y()\n\n  b = no\n  eq 5, s()\n  eq 5, t()\n  eq 5, u()\n  eq 5, v()\n  eq 5, w()\n  eq 5, x()\n  eq 5, y()\n\n  a = no\n  eq 6, s()\n  eq 6, t()\n  eq 6, u()\n  eq 6, v()\n  eq 6, w()\n  eq 6, x()\n  eq 6, y()\n\n\ntest \"#2343: switch / when / then / if / then / else\", ->\n  a = b = yes\n  c = e = g = no\n  d = 1\n  f = 2\n  h = 3\n  i = 4\n\n  s = ->\n    switch\n      when a\n        if b\n          if c\n            d\n          else\n            if e\n              f\n            else\n              if g\n                h\n              else\n                i\n\n\n  t = ->\n    switch\n      when a then if b\n        if c then d\n        else if e\n          f\n        else if g\n          h\n        else\n          i\n\n  u = ->\n    switch\n      when a then if b then if c then d\n      else if e then f\n      else if g then h else i\n\n  v = ->\n    switch\n      when a then if b then if c then d else if e then f\n      else if g then h else i\n\n  w = ->\n    switch\n      when a then if b then if c then d else if e then f\n      else if g\n        h\n      else i\n\n  x = ->\n    switch\n     when a then if b then if c then d else if e then f else if g then h else i\n\n  y = -> switch\n    when a then if b then (if c then d else (if e then f else (if g then h else i)))\n\n  eq 4, s()\n  eq 4, t()\n  eq 4, u()\n  eq 4, v()\n  eq 4, w()\n  eq 4, x()\n  eq 4, y()\n\n  c = yes\n  eq 1, s()\n  eq 1, t()\n  eq 1, u()\n  eq 1, v()\n  eq 1, w()\n  eq 1, x()\n  eq 1, y()\n\n  b = no\n  eq undefined, s()\n  eq undefined, t()\n  eq undefined, u()\n  eq undefined, v()\n  eq undefined, w()\n  eq undefined, x()\n  eq undefined, y()\n\ntest \"#2343: switch / when / then / if / then / else / else\", ->\n  a = b = yes\n  c = e = g = no\n  d = 1\n  f = 2\n  h = 3\n  i = 4\n\n  s = ->\n    switch\n      when a\n        if b\n          if c\n            d\n          else if e\n            f\n          else if g\n            h\n          else\n            i\n      else\n        0\n\n  t = ->\n    switch\n      when a\n        if b\n          if c then d\n          else if e\n            f\n          else if g\n            h\n          else i\n      else 0\n\n  u = ->\n    switch\n      when a\n        if b then if c\n            d\n          else if e\n            f\n          else if g\n            h\n          else i\n      else 0\n\n  v = ->\n    switch\n      when a\n        if b then if c then d\n        else if e\n          f\n        else if g\n          h\n        else i\n      else 0\n\n  w = ->\n    switch\n      when a\n        if b then if c then d\n        else if e then f\n        else if g then h\n        else i\n      else 0\n\n  x = ->\n    switch\n     when a\n       if b then if c then d else if e then f else if g then h else i\n     else 0\n\n  y = -> switch\n    when a\n      if b then (if c then d else (if e then f else (if g then h else i)))\n    else 0\n\n  eq 4, s()\n  eq 4, t()\n  eq 4, u()\n  eq 4, v()\n  eq 4, w()\n  eq 4, x()\n  eq 4, y()\n\n  c = yes\n  eq 1, s()\n  eq 1, t()\n  eq 1, u()\n  eq 1, v()\n  eq 1, w()\n  eq 1, x()\n  eq 1, y()\n\n  b = no\n  eq undefined, s()\n  eq undefined, t()\n  eq undefined, u()\n  eq undefined, v()\n  eq undefined, w()\n  eq undefined, x()\n  eq undefined, y()\n\n  b = yes\n  a = no\n  eq 0, s()\n  eq 0, t()\n  eq 0, u()\n  eq 0, v()\n  eq 0, w()\n  eq 0, x()\n  eq 0, y()\n\ntest \"#2343: switch / when / then / if / then / else / else / else\", ->\n  a = b = yes\n  c = e = g = no\n  d = 1\n  f = 2\n  h = 3\n  i = 4\n  j = 5\n\n  s = ->\n    switch\n      when a\n        if b\n          if c\n            d\n          else if e\n            f\n          else if g\n            h\n          else\n            i\n        else\n          j\n      else\n        0\n\n  t = ->\n    switch\n      when a\n        if b\n          if c then d\n          else if e\n            f\n          else if g\n            h\n          else i\n        else\n          j\n      else 0\n\n  u = ->\n    switch\n      when a\n        if b\n          if c\n            d\n          else if e\n            f\n          else if g\n            h\n          else i\n        else j\n      else 0\n\n  v = ->\n    switch\n      when a\n        if b\n          if c then d\n          else if e\n            f\n          else if g then h\n          else i\n        else j\n      else 0\n\n  w = ->\n    switch\n      when a\n        if b\n          if c then d\n          else if e then f\n          else if g then h\n          else i\n        else j\n      else 0\n\n  x = ->\n    switch\n     when a\n       if b then if c then d else if e then f else if g then h else i else j\n     else 0\n\n  y = -> switch\n    when a\n      if b then (if c then d else (if e then f else (if g then h else i))) else j\n    else 0\n\n  eq 4, s()\n  eq 4, t()\n  eq 4, u()\n  eq 4, v()\n  eq 4, w()\n  eq 4, x()\n  eq 4, y()\n\n  c = yes\n  eq 1, s()\n  eq 1, t()\n  eq 1, u()\n  eq 1, v()\n  eq 1, w()\n  eq 1, x()\n  eq 1, y()\n\n  b = no\n  eq 5, s()\n  eq 5, t()\n  eq 5, u()\n  eq 5, v()\n  eq 5, w()\n  eq 5, x()\n  eq 5, y()\n\n  b = yes\n  a = no\n  eq 0, s()\n  eq 0, t()\n  eq 0, u()\n  eq 0, v()\n  eq 0, w()\n  eq 0, x()\n  eq 0, y()\n\n# Test for issue #3921: Inline function without parentheses used in condition fails to compile\ntest \"#3921: `if` & `unless`\", ->\n  a = {}\n  eq a, if do -> no then undefined else a\n  a1 = undefined\n  if do -> yes\n    a1 = a\n  eq a, a1\n\n  b = {}\n  eq b, unless do -> no then b else undefined\n  b1 = undefined\n  unless do -> no\n    b1 = b\n  eq b, b1\n\n  c = 0\n  if (arg = undefined) -> yes then c++\n  eq 1, c\n  d = 0\n  if (arg = undefined) -> yes\n    d++\n  eq 1, d\n\n  answer = 'correct'\n  eq answer, if do -> 'wrong' then 'correct' else 'wrong'\n  eq answer, unless do -> no then 'correct' else 'wrong'\n  statm1 = undefined\n  if do -> 'wrong'\n    statm1 = 'correct'\n  eq answer, statm1\n  statm2 = undefined\n  unless do -> no\n    statm2 = 'correct'\n  eq answer, statm2\n\ntest \"#3921: `post if`\", ->\n  a = {}\n  eq a, a unless do -> no\n  a1 = a if do -> yes\n  eq a, a1\n\n  c = 0\n  c++ if (arg = undefined) -> yes\n  eq 1, c\n  d = 0\n  d++ if (arg = undefined) -> yes\n  eq 1, d\n\n  answer = 'correct'\n  eq answer, 'correct' if do -> 'wrong'\n  eq answer, 'correct' unless do -> not 'wrong'\n  statm1 = undefined\n  statm1 = 'correct' if do -> 'wrong'\n  eq answer, statm1\n  statm2 = undefined\n  statm2 = 'correct' unless do -> not 'wrong'\n  eq answer, statm2\n\ntest \"Issue 3921: `while` & `until`\", ->\n  i = 5\n  assert = (a) -> ok 5 > a > 0\n  result1 = while do (num = 1) -> i -= num\n    assert i\n    i\n  ok result1.join(' ') is '4 3 2 1'\n\n  j = 5\n  result2 = until do (num = 1) -> (j -= num) < 1\n    assert j\n    j\n  ok result2.join(' ') is '4 3 2 1'\n\ntest \"#3921: `switch`\", ->\n  i = 1\n  a = switch do (m = 2) -> i * m\n    when 5 then \"five\"\n    when 4 then \"four\"\n    when 3 then \"three\"\n    when 2 then \"two\"\n    when 1 then \"one\"\n    else \"none\"\n  eq \"two\", a\n\n  j = 12\n  b = switch do (m = 3) -> j / m\n    when 5 then \"five\"\n    when 4 then \"four\"\n    when 3 then \"three\"\n    when 2 then \"two\"\n    when 1 then \"one\"\n    else \"none\"\n  eq \"four\", b\n\n  k = 20\n  c = switch do (m = 4) -> k / m\n    when 5 then \"five\"\n    when 4 then \"four\"\n    when 3 then \"three\"\n    when 2 then \"two\"\n    when 1 then \"one\"\n    else \"none\"\n  eq \"five\", c\n\n# Issue #3909: backslash to break line in `for` loops throw syntax error\ntest \"#3909: backslash `for own ... of`\", ->\n\n  obj = {a: 1, b: 2, c: 3}\n  arr = ['a', 'b', 'c']\n\n  x1 \\\n    = ( key for own key of obj )\n  arrayEq x1, arr\n\n  x2 = \\\n    ( key for own key of obj )\n  arrayEq x2, arr\n\n  x3 = ( \\\n    key for own key of obj )\n  arrayEq x3, arr\n\n  x4 = ( key \\\n    for own key of obj )\n  arrayEq x4, arr\n\n  x5 = ( key for own key of \\\n    obj )\n  arrayEq x5, arr\n\n  x6 = ( key for own key of obj \\\n    )\n  arrayEq x6, arr\n\n  x7 = ( key for \\\n    own key of obj )\n  arrayEq x7, arr\n\n  x8 = ( key for own \\\n    key of obj )\n  arrayEq x8, arr\n\n  x9 = ( key for own key \\\n    of obj )\n  arrayEq x9, arr\n\n\ntest \"#3909: backslash `for ... of`\", ->\n  obj = {a: 1, b: 2, c: 3}\n  arr = ['a', 'b', 'c']\n\n  x1 \\\n    = ( key for key of obj )\n  arrayEq x1, arr\n\n  x2 = \\\n    ( key for key of obj )\n  arrayEq x2, arr\n\n  x3 = ( \\\n    key for key of obj )\n  arrayEq x3, arr\n\n  x4 = ( key \\\n    for key of obj )\n  arrayEq x4, arr\n\n  x5 = ( key for key of \\\n    obj )\n  arrayEq x5, arr\n\n  x6 = ( key for key of obj \\\n    )\n  arrayEq x6, arr\n\n  x7 = ( key for \\\n    key of obj )\n  arrayEq x7, arr\n\n  x8 = ( key for key \\\n    of obj )\n  arrayEq x8, arr\n\n\ntest \"#3909: backslash `for ... in`\", ->\n  arr = ['a', 'b', 'c']\n\n  x1 \\\n    = ( key for key in arr )\n  arrayEq x1, arr\n\n  x2 = \\\n    ( key for key in arr )\n  arrayEq x2, arr\n\n  x3 = ( \\\n    key for key in arr )\n  arrayEq x3, arr\n\n  x4 = ( key \\\n    for key in arr )\n  arrayEq x4, arr\n\n  x5 = ( key for key in \\\n    arr )\n  arrayEq x5, arr\n\n  x6 = ( key for key in arr \\\n    )\n  arrayEq x6, arr\n\n  x7 = ( key for \\\n    key in arr )\n  arrayEq x7, arr\n\n  x8 = ( key for key \\\n    in arr )\n  arrayEq x8, arr\n\ntest \"#4871: `else if` no longer output together \", ->\n   eqJS '''\n   if a then b else if c then d else if e then f else g\n   ''',\n   '''\n   if (a) {\n     b;\n   } else if (c) {\n     d;\n   } else if (e) {\n     f;\n   } else {\n     g;\n   }\n   '''\n\n   eqJS '''\n   if no\n     1\n   else if yes\n     2\n   ''',\n   '''\n   if (false) {\n     1;\n   } else if (true) {\n     2;\n   }\n   '''\n\ntest \"#4898: Lexer: backslash line continuation is inconsistent\", ->\n  if ( \\\n      false \\\n      or \\\n      true \\\n    )\n    a = 42\n\n  eq a, 42\n\n  if ( \\\n      false \\\n      or \\\n      true \\\n  )\n    b = 42\n\n  eq b, 42\n\n  if ( \\\n            false \\\n         or \\\n   true \\\n  )\n    c = 42\n\n  eq c, 42\n\n  if \\\n   false \\\n        or \\\n   true\n    d = 42\n\n  eq d, 42\n\n  if \\\n              false or \\\n  true\n    e = 42\n\n  eq e, 42\n\n  if \\\n       false or \\\n    true \\\n       then \\\n   f = 42 \\\n   else\n     f = 24\n\n  eq f, 42\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"error_messages\">\n# Error Formatting\n# ----------------\n\n# Ensure that errors of different kinds (lexer, parser and compiler) are shown\n# in a consistent way.\n\nerrCallback = (expectedErrorFormat) -> (err) ->\n  err.colorful = no\n  eq expectedErrorFormat, \"#{err}\"\n  yes\nassertErrorFormatNoAst = (code, expectedErrorFormat) ->\n  throws (-> CoffeeScript.run code), errCallback(expectedErrorFormat)\nassertErrorFormat = (code, expectedErrorFormat) ->\n  assertErrorFormatNoAst code, expectedErrorFormat\n  throws (-> CoffeeScript.compile code, ast: yes), errCallback(expectedErrorFormat)\n\ntest \"lexer errors formatting\", ->\n  assertErrorFormat '''\n    normalObject    = {}\n    insideOutObject = }{\n  ''',\n  '''\n    [stdin]:2:19: error: unmatched }\n    insideOutObject = }{\n                      ^\n  '''\n\ntest \"parser error formatting\", ->\n  assertErrorFormat '''\n    foo in bar or in baz\n  ''',\n  '''\n    [stdin]:1:15: error: unexpected in\n    foo in bar or in baz\n                  ^^\n  '''\n\ntest \"compiler error formatting\", ->\n  assertErrorFormat '''\n    evil = (foo, eval, bar) ->\n  ''',\n  '''\n    [stdin]:1:14: error: 'eval' can't be assigned\n    evil = (foo, eval, bar) ->\n                 ^^^^\n  '''\n\nif require?\n  os   = require 'os'\n  fs   = require 'fs'\n  path = require 'path'\n\n  test \"patchStackTrace line patching\", ->\n    err = new Error 'error'\n    ok err.stack.match /test[\\/\\\\]error_messages\\.coffee:\\d+:\\d+\\b/\n\n  test \"patchStackTrace stack prelude consistent with V8\", ->\n    err = new Error\n    ok err.stack.match /^Error\\n/ # Notice no colon when no message.\n\n    err = new Error 'error'\n    ok err.stack.match /^Error: error\\n/\n\n  test \"#2849: compilation error in a require()d file\", ->\n    # Create a temporary file to require().\n    tempFile = path.join os.tmpdir(), 'syntax-error.coffee'\n    ok not fs.existsSync tempFile\n    fs.writeFileSync tempFile, 'foo in bar or in baz'\n\n    try\n      assertErrorFormatNoAst \"\"\"\n        require '#{tempFile.replace /\\\\/g, '\\\\\\\\'}'\n      \"\"\",\n      \"\"\"\n        #{fs.realpathSync tempFile}:1:15: error: unexpected in\n        foo in bar or in baz\n                      ^^\n      \"\"\"\n    finally\n      fs.unlinkSync tempFile\n\n  test \"#3890: Error.prepareStackTrace doesn't throw an error if a compiled file is deleted\", ->\n    # Adapted from https://github.com/atom/coffee-cash/blob/master/spec/coffee-cash-spec.coffee\n    filePath = path.join os.tmpdir(), 'PrepareStackTraceTestFile.coffee'\n    fs.writeFileSync filePath, \"module.exports = -> throw new Error('hello world')\"\n    throwsAnError = require filePath\n    fs.unlinkSync filePath\n\n    try\n      throwsAnError()\n    catch error\n\n    eq error.message, 'hello world'\n    doesNotThrow(-> error.stack)\n    notEqual error.stack.toString().indexOf(filePath), -1, \"Expected \" + filePath + \"in stack trace: \" + error.stack.toString()\n\n  test \"#4418: stack traces for compiled files reference the correct line number\", ->\n    # The browser is already compiling other anonymous scripts (the tests)\n    # which will conflict.\n    return if global.testingBrowser\n    filePath = path.join os.tmpdir(), 'StackTraceLineNumberTestFile.coffee'\n    fileContents = \"\"\"\n      testCompiledFileStackTraceLineNumber = ->\n        # `a` on the next line is undefined and should throw a ReferenceError\n        console.log a if true\n\n      do testCompiledFileStackTraceLineNumber\n      \"\"\"\n    fs.writeFileSync filePath, fileContents\n\n    try\n      require filePath\n    catch error\n    fs.unlinkSync filePath\n\n    # Make sure the line number reported is line 3 (the original Coffee source)\n    # and not line 6 (the generated JavaScript).\n    eq /StackTraceLineNumberTestFile.coffee:(\\d)/.exec(error.stack.toString())[1], '3'\n\n\ntest \"#4418: stack traces for compiled strings reference the correct line number\", ->\n  # The browser is already compiling other anonymous scripts (the tests)\n  # which will conflict.\n  return if global.testingBrowser\n  try\n    CoffeeScript.run '''\n      testCompiledStringStackTraceLineNumber = ->\n        # `a` on the next line is undefined and should throw a ReferenceError\n        console.log a if true\n\n      do testCompiledStringStackTraceLineNumber\n      '''\n  catch error\n\n  # Make sure the line number reported is line 3 (the original Coffee source)\n  # and not line 6 (the generated JavaScript).\n  eq /testCompiledStringStackTraceLineNumber.*:(\\d):/.exec(error.stack.toString())[1], '3'\n\n\ntest \"#4558: compiling a string inside a script doesn’t screw up stack trace line number\", ->\n  # The browser is already compiling other anonymous scripts (the tests)\n  # which will conflict.\n  return if global.testingBrowser\n  try\n    CoffeeScript.run '''\n      testCompilingInsideAScriptDoesntScrewUpStackTraceLineNumber = ->\n        if require?\n          CoffeeScript = require './lib/coffeescript'\n          CoffeeScript.compile ''\n        throw new Error 'Some Error'\n\n      do testCompilingInsideAScriptDoesntScrewUpStackTraceLineNumber\n      '''\n  catch error\n\n  # Make sure the line number reported is line 5 (the original Coffee source)\n  # and not line 10 (the generated JavaScript).\n  eq /testCompilingInsideAScriptDoesntScrewUpStackTraceLineNumber.*:(\\d):/.exec(error.stack.toString())[1], '5'\n\ntest \"#1096: unexpected generated tokens\", ->\n  # Implicit ends\n  assertErrorFormat 'a:, b', '''\n    [stdin]:1:3: error: unexpected ,\n    a:, b\n      ^\n  '''\n  # Explicit ends\n  assertErrorFormat '(a:)', '''\n    [stdin]:1:4: error: unexpected )\n    (a:)\n       ^\n  '''\n  # Unexpected end of file\n  assertErrorFormat 'a:', '''\n    [stdin]:1:3: error: unexpected end of input\n    a:\n      ^\n  '''\n  assertErrorFormat 'a +', '''\n    [stdin]:1:4: error: unexpected end of input\n    a +\n       ^\n  '''\n  # Unexpected key in implicit object (an implicit object itself is _not_\n  # unexpected here)\n  assertErrorFormat '''\n    for i in [1]:\n      1\n  ''', '''\n    [stdin]:2:4: error: unexpected end of input\n      1\n       ^\n  '''\n  # Unexpected regex\n  assertErrorFormat '{/a/i: val}', '''\n    [stdin]:1:2: error: unexpected regex\n    {/a/i: val}\n     ^^^^\n  '''\n  assertErrorFormat '{///a///i: val}', '''\n    [stdin]:1:2: error: unexpected regex\n    {///a///i: val}\n     ^^^^^^^^\n  '''\n  assertErrorFormat '{///#{a}///i: val}', '''\n    [stdin]:1:2: error: unexpected regex\n    {///#{a}///i: val}\n     ^^^^^^^^^^^\n  '''\n  # Unexpected string\n  assertErrorFormat 'import foo from \"lib-#{version}\"', '''\n    [stdin]:1:17: error: the name of the module to be imported from must be an uninterpolated string\n    import foo from \"lib-#{version}\"\n                    ^^^^^^^^^^^^^^^^\n  '''\n\n  # Unexpected number\n  assertErrorFormat '\"a\"0x00Af2', '''\n    [stdin]:1:4: error: unexpected number\n    \"a\"0x00Af2\n       ^^^^^^^\n  '''\n\ntest \"#1316: unexpected end of interpolation\", ->\n  assertErrorFormat '''\n    \"#{+}\"\n  ''', '''\n    [stdin]:1:5: error: unexpected end of interpolation\n    \"#{+}\"\n        ^\n  '''\n  assertErrorFormat '''\n    \"#{++}\"\n  ''', '''\n    [stdin]:1:6: error: unexpected end of interpolation\n    \"#{++}\"\n         ^\n  '''\n  assertErrorFormat '''\n    \"#{-}\"\n  ''', '''\n    [stdin]:1:5: error: unexpected end of interpolation\n    \"#{-}\"\n        ^\n  '''\n  assertErrorFormat '''\n    \"#{--}\"\n  ''', '''\n    [stdin]:1:6: error: unexpected end of interpolation\n    \"#{--}\"\n         ^\n  '''\n  assertErrorFormat '''\n    \"#{~}\"\n  ''', '''\n    [stdin]:1:5: error: unexpected end of interpolation\n    \"#{~}\"\n        ^\n  '''\n  assertErrorFormat '''\n    \"#{!}\"\n  ''', '''\n    [stdin]:1:5: error: unexpected end of interpolation\n    \"#{!}\"\n        ^\n  '''\n  assertErrorFormat '''\n    \"#{not}\"\n  ''', '''\n    [stdin]:1:7: error: unexpected end of interpolation\n    \"#{not}\"\n          ^\n  '''\n  assertErrorFormat '''\n    \"#{5) + (4}_\"\n  ''', '''\n    [stdin]:1:5: error: unmatched )\n    \"#{5) + (4}_\"\n        ^\n  '''\n  # #2918\n  assertErrorFormat '''\n    \"#{foo.}\"\n  ''', '''\n    [stdin]:1:8: error: unexpected end of interpolation\n    \"#{foo.}\"\n           ^\n  '''\n\ntest \"#3325: implicit indentation errors\", ->\n  assertErrorFormat '''\n    i for i in a then i\n  ''', '''\n    [stdin]:1:14: error: unexpected then\n    i for i in a then i\n                 ^^^^\n  '''\n\ntest \"explicit indentation errors\", ->\n  assertErrorFormat '''\n    a = b\n      c\n  ''', '''\n    [stdin]:2:1: error: unexpected indentation\n      c\n    ^^\n  '''\n\ntest \"unclosed strings\", ->\n  assertErrorFormat '''\n    '\n  ''', '''\n    [stdin]:1:1: error: missing '\n    '\n    ^\n  '''\n  assertErrorFormat '''\n    \"\n  ''', '''\n    [stdin]:1:1: error: missing \"\n    \"\n    ^\n  '''\n  assertErrorFormat \"\"\"\n    '''\n  \"\"\", \"\"\"\n    [stdin]:1:1: error: missing '''\n    '''\n    ^^^\n  \"\"\"\n  assertErrorFormat '''\n    \"\"\"\n  ''', '''\n    [stdin]:1:1: error: missing \"\"\"\n    \"\"\"\n    ^^^\n  '''\n  assertErrorFormat '''\n    \"#{\"\n  ''', '''\n    [stdin]:1:4: error: missing \"\n    \"#{\"\n       ^\n  '''\n  assertErrorFormat '''\n    \"\"\"#{\"\n  ''', '''\n    [stdin]:1:6: error: missing \"\n    \"\"\"#{\"\n         ^\n  '''\n  assertErrorFormat '''\n    \"#{\"\"\"\n  ''', '''\n    [stdin]:1:4: error: missing \"\"\"\n    \"#{\"\"\"\n       ^^^\n  '''\n  assertErrorFormat '''\n    \"\"\"#{\"\"\"\n  ''', '''\n    [stdin]:1:6: error: missing \"\"\"\n    \"\"\"#{\"\"\"\n         ^^^\n  '''\n  assertErrorFormat '''\n    ///#{\"\"\"\n  ''', '''\n    [stdin]:1:6: error: missing \"\"\"\n    ///#{\"\"\"\n         ^^^\n  '''\n  assertErrorFormat '''\n    \"a\n      #{foo \"\"\"\n        bar\n          #{ +'12 }\n        baz\n        \"\"\"} b\"\n  ''', '''\n    [stdin]:4:11: error: missing '\n          #{ +'12 }\n              ^\n  '''\n  # https://github.com/jashkenas/coffeescript/issues/3301#issuecomment-31735168\n  assertErrorFormat '''\n    # Note the double escaping; this would be `\"\"\"a\\\"\"\"` real code.\n    \"\"\"a\\\\\"\"\"\n  ''', '''\n    [stdin]:2:1: error: missing \"\"\"\n    \"\"\"a\\\\\"\"\"\n    ^^^\n  '''\n\ntest \"unclosed heregexes\", ->\n  assertErrorFormat '''\n    ///\n  ''', '''\n    [stdin]:1:1: error: missing ///\n    ///\n    ^^^\n  '''\n  # https://github.com/jashkenas/coffeescript/issues/3301#issuecomment-31735168\n  assertErrorFormat '''\n    # Note the double escaping; this would be `///a\\///` real code.\n    ///a\\\\///\n  ''', '''\n    [stdin]:2:1: error: missing ///\n    ///a\\\\///\n    ^^^\n  '''\n\ntest \"unexpected token after string\", ->\n  # Parsing error.\n  assertErrorFormat '''\n    'foo'bar\n  ''', '''\n    [stdin]:1:6: error: unexpected identifier\n    'foo'bar\n         ^^^\n  '''\n  assertErrorFormat '''\n    \"foo\"bar\n  ''', '''\n    [stdin]:1:6: error: unexpected identifier\n    \"foo\"bar\n         ^^^\n  '''\n  # Lexing error.\n  assertErrorFormat '''\n    'foo'bar'\n  ''', '''\n    [stdin]:1:9: error: missing '\n    'foo'bar'\n            ^\n  '''\n  assertErrorFormat '''\n    \"foo\"bar\"\n  ''', '''\n    [stdin]:1:9: error: missing \"\n    \"foo\"bar\"\n            ^\n  '''\n\ntest \"#3348: Location data is wrong in interpolations with leading whitespace\", ->\n  assertErrorFormat '''\n    \"#{ * }\"\n  ''', '''\n    [stdin]:1:5: error: unexpected *\n    \"#{ * }\"\n        ^\n  '''\n\ntest \"octal escapes\", ->\n  assertErrorFormat '''\n    \"a\\\\0\\\\tb\\\\\\\\\\\\07c\"\n  ''', '''\n    [stdin]:1:10: error: octal escape sequences are not allowed \\\\07\n    \"a\\\\0\\\\tb\\\\\\\\\\\\07c\"\n      \\  \\   \\ \\ ^\\^^\n  '''\n  assertErrorFormat '''\n    \"a\n      #{b} \\\\1\"\n  ''', '''\n    [stdin]:2:8: error: octal escape sequences are not allowed \\\\1\n      #{b} \\\\1\"\n           ^\\^\n  '''\n  assertErrorFormat '''\n    /a\\\\0\\\\tb\\\\\\\\\\\\07c/\n  ''', '''\n    [stdin]:1:10: error: octal escape sequences are not allowed \\\\07\n    /a\\\\0\\\\tb\\\\\\\\\\\\07c/\n      \\  \\   \\ \\ ^\\^^\n  '''\n  assertErrorFormat '''\n    /a\\\\1\\\\tb\\\\\\\\\\\\07c/\n  ''', '''\n    [stdin]:1:10: error: octal escape sequences are not allowed \\\\07\n    /a\\\\1\\\\tb\\\\\\\\\\\\07c/\n      \\  \\   \\ \\ ^\\^^\n  '''\n  assertErrorFormat '''\n    ///a\n      #{b} \\\\01///\n  ''', '''\n    [stdin]:2:8: error: octal escape sequences are not allowed \\\\01\n      #{b} \\\\01///\n           ^\\^^\n  '''\n  # per #5211, also treat \\0[8-9] as (disallowed) octal escapes\n  assertErrorFormat '''\n    \"a\\\\0\\\\tb\\\\\\\\\\\\09c\"\n  ''', '''\n    [stdin]:1:10: error: octal escape sequences are not allowed \\\\09\n    \"a\\\\0\\\\tb\\\\\\\\\\\\09c\"\n      \\  \\   \\ \\ ^\\^^\n  '''\n  assertErrorFormat '''\n    ///a\n      #{b} \\\\08///\n  ''', '''\n    [stdin]:2:8: error: octal escape sequences are not allowed \\\\08\n      #{b} \\\\08///\n           ^\\^^\n  '''\n\ntest \"#3795: invalid escapes\", ->\n  assertErrorFormat '''\n    \"a\\\\0\\\\tb\\\\\\\\\\\\x7g\"\n  ''', '''\n    [stdin]:1:10: error: invalid escape sequence \\\\x7g\n    \"a\\\\0\\\\tb\\\\\\\\\\\\x7g\"\n      \\  \\   \\ \\ ^\\^^^\n  '''\n  assertErrorFormat '''\n    \"a\n      #{b} \\\\uA02\n     c\"\n  ''', '''\n    [stdin]:2:8: error: invalid escape sequence \\\\uA02\n      #{b} \\\\uA02\n           ^\\^^^^\n  '''\n  assertErrorFormat '''\n    /a\\\\u002space/\n  ''', '''\n    [stdin]:1:3: error: invalid escape sequence \\\\u002s\n    /a\\\\u002space/\n      ^\\^^^^^\n  '''\n  assertErrorFormat '''\n    ///a \\\\u002 0 space///\n  ''', '''\n    [stdin]:1:6: error: invalid escape sequence \\\\u002 \\n\\\n    ///a \\\\u002 0 space///\n         ^\\^^^^^\n  '''\n  assertErrorFormat '''\n    ///a\n      #{b} \\\\x0\n     c///\n  ''', '''\n    [stdin]:2:8: error: invalid escape sequence \\\\x0\n      #{b} \\\\x0\n           ^\\^^\n  '''\n  assertErrorFormat '''\n    /ab\\\\u/\n  ''', '''\n    [stdin]:1:4: error: invalid escape sequence \\\\u\n    /ab\\\\u/\n       ^\\^\n  '''\n\ntest \"illegal herecomment\", ->\n  assertErrorFormat '''\n    ###\n      Regex: /a*/g\n    ###\n  ''', '''\n    [stdin]:2:12: error: block comments cannot contain */\n      Regex: /a*/g\n               ^^\n  '''\n\ntest \"#1724: regular expressions beginning with *\", ->\n  assertErrorFormat '''\n    /* foo/\n  ''', '''\n    [stdin]:1:2: error: regular expressions cannot begin with *\n    /* foo/\n     ^\n  '''\n  assertErrorFormat '''\n    ///\n      * foo\n    ///\n  ''', '''\n    [stdin]:2:3: error: regular expressions cannot begin with *\n      * foo\n      ^\n  '''\n\ntest \"invalid regex flags\", ->\n  assertErrorFormat '''\n    /a/ii\n  ''', '''\n    [stdin]:1:4: error: invalid regular expression flags ii\n    /a/ii\n       ^^\n  '''\n  assertErrorFormat '''\n    /a/G\n  ''', '''\n    [stdin]:1:4: error: invalid regular expression flags G\n    /a/G\n       ^\n  '''\n  assertErrorFormat '''\n    /a/gimi\n  ''', '''\n    [stdin]:1:4: error: invalid regular expression flags gimi\n    /a/gimi\n       ^^^^\n  '''\n  assertErrorFormat '''\n    /a/g_\n  ''', '''\n    [stdin]:1:4: error: invalid regular expression flags g_\n    /a/g_\n       ^^\n  '''\n  assertErrorFormat '''\n    ///a///ii\n  ''', '''\n    [stdin]:1:8: error: invalid regular expression flags ii\n    ///a///ii\n           ^^\n  '''\n  doesNotThrowCompileError '/a/ymgi'\n\ntest \"missing `)`, `}`, `]`\", ->\n  assertErrorFormat '''\n    (\n  ''', '''\n    [stdin]:1:1: error: missing )\n    (\n    ^\n  '''\n  assertErrorFormat '''\n    {\n  ''', '''\n    [stdin]:1:1: error: missing }\n    {\n    ^\n  '''\n  assertErrorFormat '''\n    [\n  ''', '''\n    [stdin]:1:1: error: missing ]\n    [\n    ^\n  '''\n  assertErrorFormat '''\n    obj = {a: [1, (2+\n  ''', '''\n    [stdin]:1:15: error: missing )\n    obj = {a: [1, (2+\n                  ^\n  '''\n  assertErrorFormat '''\n    \"#{\n  ''', '''\n    [stdin]:1:3: error: missing }\n    \"#{\n      ^\n  '''\n  assertErrorFormat '''\n    \"\"\"\n      foo#{ bar \"#{1}\"\n  ''', '''\n    [stdin]:2:7: error: missing }\n      foo#{ bar \"#{1}\"\n          ^\n  '''\n\ntest \"unclosed regexes\", ->\n  assertErrorFormat '''\n    /\n  ''', '''\n    [stdin]:1:1: error: missing / (unclosed regex)\n    /\n    ^\n  '''\n  assertErrorFormat '''\n    # Note the double escaping; this would be `/a\\/` real code.\n    /a\\\\/\n  ''', '''\n    [stdin]:2:1: error: missing / (unclosed regex)\n    /a\\\\/\n    ^\n  '''\n  assertErrorFormat '''\n    /// ^\n      a #{\"\"\" \"\"#{if /[/].test \"|\" then 1 else 0}\"\" \"\"\"}\n    ///\n  ''', '''\n    [stdin]:2:18: error: missing / (unclosed regex)\n      a #{\"\"\" \"\"#{if /[/].test \"|\" then 1 else 0}\"\" \"\"\"}\n                     ^\n  '''\n\ntest \"duplicate function arguments\", ->\n  assertErrorFormat '''\n    (foo, bar, foo) ->\n  ''', '''\n    [stdin]:1:12: error: multiple parameters named 'foo'\n    (foo, bar, foo) ->\n               ^^^\n  '''\n  assertErrorFormat '''\n    (@foo, bar, @foo) ->\n  ''', '''\n    [stdin]:1:13: error: multiple parameters named '@foo'\n    (@foo, bar, @foo) ->\n                ^^^^\n  '''\n\ntest \"reserved words\", ->\n  assertErrorFormat '''\n    case\n  ''', '''\n    [stdin]:1:1: error: reserved word 'case'\n    case\n    ^^^^\n  '''\n  assertErrorFormat '''\n    case = 1\n  ''', '''\n    [stdin]:1:1: error: reserved word 'case'\n    case = 1\n    ^^^^\n  '''\n  assertErrorFormat '''\n    for = 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'for' can't be assigned\n    for = 1\n    ^^^\n  '''\n  assertErrorFormat '''\n    unless = 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'unless' can't be assigned\n    unless = 1\n    ^^^^^^\n  '''\n  assertErrorFormat '''\n    for += 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'for' can't be assigned\n    for += 1\n    ^^^\n  '''\n  assertErrorFormat '''\n    for &&= 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'for' can't be assigned\n    for &&= 1\n    ^^^\n  '''\n  # Make sure token look-behind doesn't go out of range.\n  assertErrorFormat '''\n    &&= 1\n  ''', '''\n    [stdin]:1:1: error: unexpected &&=\n    &&= 1\n    ^^^\n  '''\n  # #2306: Show unaliased name in error messages.\n  assertErrorFormat '''\n    on = 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'on' can't be assigned\n    on = 1\n    ^^\n  '''\n\ntest \"strict mode errors\", ->\n  assertErrorFormat '''\n    eval = 1\n  ''', '''\n    [stdin]:1:1: error: 'eval' can't be assigned\n    eval = 1\n    ^^^^\n  '''\n  assertErrorFormat '''\n    class eval\n  ''', '''\n    [stdin]:1:7: error: 'eval' can't be assigned\n    class eval\n          ^^^^\n  '''\n  assertErrorFormat '''\n    arguments++\n  ''', '''\n    [stdin]:1:1: error: 'arguments' can't be assigned\n    arguments++\n    ^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    --arguments\n  ''', '''\n    [stdin]:1:3: error: 'arguments' can't be assigned\n    --arguments\n      ^^^^^^^^^\n  '''\n\ntest \"invalid numbers\", ->\n  assertErrorFormat '''\n    0X0\n  ''', '''\n    [stdin]:1:2: error: radix prefix in '0X0' must be lowercase\n    0X0\n     ^\n  '''\n  assertErrorFormat '''\n    018\n  ''', '''\n    [stdin]:1:1: error: decimal literal '018' must not be prefixed with '0'\n    018\n    ^^^\n  '''\n  assertErrorFormat '''\n    010\n  ''', '''\n    [stdin]:1:1: error: octal literal '010' must be prefixed with '0o'\n    010\n    ^^^\n'''\n\n\ntest \"unexpected object keys\", ->\n  assertErrorFormat '''\n    {(a + \"b\")}\n  ''', '''\n    [stdin]:1:11: error: unexpected }\n    {(a + \"b\")}\n              ^\n  '''\n  assertErrorFormat '''\n    {(a + \"b\"): 1}\n  ''', '''\n    [stdin]:1:11: error: unexpected :\n    {(a + \"b\"): 1}\n              ^\n  '''\n  assertErrorFormat '''\n    (a + \"b\"): 1\n  ''', '''\n    [stdin]:1:10: error: unexpected :\n    (a + \"b\"): 1\n             ^\n  '''\n\ntest \"invalid object keys\", ->\n  assertErrorFormat '''\n    @a: 1\n  ''', '''\n    [stdin]:1:1: error: invalid object key\n    @a: 1\n    ^^\n  '''\n  assertErrorFormat '''\n    f\n      @a: 1\n  ''', '''\n    [stdin]:2:3: error: invalid object key\n      @a: 1\n      ^^\n  '''\n  assertErrorFormat '''\n    {a=2}\n  ''', '''\n    [stdin]:1:3: error: unexpected =\n    {a=2}\n      ^\n  '''\n  assertErrorFormat '''\n    @[a]: 1\n  ''', '''\n    [stdin]:1:1: error: invalid object key\n    @[a]: 1\n    ^^^^\n  '''\n\ntest \"invalid destructuring default target\", ->\n  assertErrorFormat '''\n    {'a' = 2} = obj\n  ''', '''\n    [stdin]:1:6: error: unexpected =\n    {'a' = 2} = obj\n         ^\n  '''\n\ntest \"#4070: lone expansion\", ->\n  assertErrorFormat '''\n    [...] = a\n  ''', '''\n    [stdin]:1:2: error: Destructuring assignment has no target\n    [...] = a\n     ^^^\n  '''\n  assertErrorFormat '''\n    [ ..., ] = a\n  ''', '''\n    [stdin]:1:3: error: Destructuring assignment has no target\n    [ ..., ] = a\n      ^^^\n  '''\n\ntest \"#3926: implicit object in parameter list\", ->\n  assertErrorFormat '''\n    (a: b) ->\n  ''', '''\n    [stdin]:1:3: error: unexpected :\n    (a: b) ->\n      ^\n  '''\n  assertErrorFormat '''\n    (one, two, {three, four: five}, key: value) ->\n  ''', '''\n    [stdin]:1:36: error: unexpected :\n    (one, two, {three, four: five}, key: value) ->\n                                       ^\n  '''\n\ntest \"#4130: unassignable in destructured param\", ->\n  assertErrorFormat '''\n    fun = ({\n      @param : null\n    }) ->\n      console.log \"Oh hello!\"\n  ''', '''\n    [stdin]:2:12: error: keyword 'null' can't be assigned\n      @param : null\n               ^^^^\n  '''\n  assertErrorFormat '''\n    ({a: null}) ->\n  ''', '''\n    [stdin]:1:6: error: keyword 'null' can't be assigned\n    ({a: null}) ->\n         ^^^^\n  '''\n  assertErrorFormat '''\n    ({a: 1}) ->\n  ''', '''\n    [stdin]:1:6: error: '1' can't be assigned\n    ({a: 1}) ->\n         ^\n  '''\n  assertErrorFormat '''\n    ({1}) ->\n  ''', '''\n    [stdin]:1:3: error: '1' can't be assigned\n    ({1}) ->\n      ^\n  '''\n  assertErrorFormat '''\n    ({a: true = 1}) ->\n  ''', '''\n    [stdin]:1:6: error: keyword 'true' can't be assigned\n    ({a: true = 1}) ->\n         ^^^^\n  '''\n\ntest \"`yield` outside of a function\", ->\n  assertErrorFormat '''\n    yield 1\n  ''', '''\n    [stdin]:1:1: error: yield can only occur inside functions\n    yield 1\n    ^^^^^^^\n  '''\n  assertErrorFormat '''\n    yield return\n  ''', '''\n    [stdin]:1:1: error: yield can only occur inside functions\n    yield return\n    ^^^^^^^^^^^^\n  '''\n\ntest \"#4097: `yield return` as an expression\", ->\n  assertErrorFormat '''\n    -> (yield return)\n  ''', '''\n    [stdin]:1:5: error: cannot use a pure statement in an expression\n    -> (yield return)\n        ^^^^^^^^^^^^\n  '''\n\ntest \"#5013: `await return` as an expression\", ->\n  assertErrorFormat '''\n    -> (await return)\n  ''', '''\n    [stdin]:1:5: error: cannot use a pure statement in an expression\n    -> (await return)\n        ^^^^^^^^^^^^\n  '''\n\ntest \"#5013: `return` as an expression\", ->\n  assertErrorFormat '''\n    -> (return)\n  ''', '''\n    [stdin]:1:5: error: cannot use a pure statement in an expression\n    -> (return)\n        ^^^^^^\n  '''\n\ntest \"#5013: `break` as an expression\", ->\n  assertErrorFormat '''\n    (b = 1; break) for b in a\n  ''', '''\n    [stdin]:1:9: error: cannot use a pure statement in an expression\n    (b = 1; break) for b in a\n            ^^^^^\n  '''\n\ntest \"#5013: `continue` as an expression\", ->\n  assertErrorFormat '''\n    (b = 1; continue) for b in a\n  ''', '''\n    [stdin]:1:9: error: cannot use a pure statement in an expression\n    (b = 1; continue) for b in a\n            ^^^^^^^^\n  '''\n\ntest \"`&&=` and `||=` with a space in-between\", ->\n  assertErrorFormat '''\n    a = 0\n    a && = 1\n  ''', '''\n    [stdin]:2:6: error: unexpected =\n    a && = 1\n         ^\n  '''\n  assertErrorFormat '''\n    a = 0\n    a and = 1\n  ''', '''\n    [stdin]:2:7: error: unexpected =\n    a and = 1\n          ^\n  '''\n  assertErrorFormat '''\n    a = 0\n    a || = 1\n  ''', '''\n    [stdin]:2:6: error: unexpected =\n    a || = 1\n         ^\n  '''\n  assertErrorFormat '''\n    a = 0\n    a or = 1\n  ''', '''\n    [stdin]:2:6: error: unexpected =\n    a or = 1\n         ^\n  '''\n\ntest \"anonymous functions cannot be exported\", ->\n  assertErrorFormat '''\n    export ->\n      console.log 'hello, world!'\n  ''', '''\n    [stdin]:1:8: error: unexpected ->\n    export ->\n           ^^\n  '''\n\ntest \"anonymous classes cannot be exported\", ->\n  assertErrorFormat '''\n    export class\n      constructor: ->\n        console.log 'hello, world!'\n  ''', '''\n    [stdin]:1:8: error: anonymous classes cannot be exported\n    export class\n           ^^^^^\n  '''\n\ntest \"unless enclosed by curly braces, only * can be aliased\", ->\n  assertErrorFormat '''\n    import foo as bar from 'lib'\n  ''', '''\n    [stdin]:1:12: error: unexpected as\n    import foo as bar from 'lib'\n               ^^\n  '''\n\ntest \"unwrapped imports must follow constrained syntax\", ->\n  assertErrorFormat '''\n    import foo, bar from 'lib'\n  ''', '''\n    [stdin]:1:13: error: unexpected identifier\n    import foo, bar from 'lib'\n                ^^^\n  '''\n  assertErrorFormat '''\n    import foo, bar, baz from 'lib'\n  ''', '''\n    [stdin]:1:13: error: unexpected identifier\n    import foo, bar, baz from 'lib'\n                ^^^\n  '''\n  assertErrorFormat '''\n    import foo, bar as baz from 'lib'\n  ''', '''\n    [stdin]:1:13: error: unexpected identifier\n    import foo, bar as baz from 'lib'\n                ^^^\n  '''\n\ntest \"cannot export * without a module to export from\", ->\n  assertErrorFormat '''\n    export *\n  ''', '''\n    [stdin]:1:9: error: unexpected end of input\n    export *\n            ^\n  '''\n\ntest \"imports and exports must be top-level\", ->\n  assertErrorFormatNoAst '''\n    if foo\n      import { bar } from 'lib'\n  ''', '''\n    [stdin]:2:3: error: import statements must be at top-level scope\n      import { bar } from 'lib'\n      ^^^^^^^^^^^^^^^^^^^^^^^^^\n  '''\n  assertErrorFormatNoAst '''\n    foo = ->\n      export { bar }\n  ''', '''\n    [stdin]:2:3: error: export statements must be at top-level scope\n      export { bar }\n      ^^^^^^^^^^^^^^\n  '''\n\ntest \"cannot import the same member more than once\", ->\n  assertErrorFormat '''\n    import { foo, foo } from 'lib'\n  ''', '''\n    [stdin]:1:15: error: 'foo' has already been declared\n    import { foo, foo } from 'lib'\n                  ^^^\n  '''\n  assertErrorFormat '''\n    import { foo, bar, foo } from 'lib'\n  ''', '''\n    [stdin]:1:20: error: 'foo' has already been declared\n    import { foo, bar, foo } from 'lib'\n                       ^^^\n  '''\n  assertErrorFormat '''\n    import { foo, bar as foo } from 'lib'\n  ''', '''\n    [stdin]:1:15: error: 'foo' has already been declared\n    import { foo, bar as foo } from 'lib'\n                  ^^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    import foo, { foo } from 'lib'\n  ''', '''\n    [stdin]:1:15: error: 'foo' has already been declared\n    import foo, { foo } from 'lib'\n                  ^^^\n  '''\n  assertErrorFormat '''\n    import foo, { bar as foo } from 'lib'\n  ''', '''\n    [stdin]:1:15: error: 'foo' has already been declared\n    import foo, { bar as foo } from 'lib'\n                  ^^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    import foo from 'libA'\n    import foo from 'libB'\n  ''', '''\n    [stdin]:2:8: error: 'foo' has already been declared\n    import foo from 'libB'\n           ^^^\n  '''\n  assertErrorFormat '''\n    import * as foo from 'libA'\n    import { foo } from 'libB'\n  ''', '''\n    [stdin]:2:10: error: 'foo' has already been declared\n    import { foo } from 'libB'\n             ^^^\n  '''\n\ntest \"imported members cannot be reassigned\", ->\n  assertErrorFormat '''\n    import { foo } from 'lib'\n    foo = 'bar'\n  ''', '''\n    [stdin]:2:1: error: 'foo' is read-only\n    foo = 'bar'\n    ^^^\n  '''\n  assertErrorFormat '''\n    import { foo } from 'lib'\n    export default foo = 'bar'\n  ''', '''\n    [stdin]:2:16: error: 'foo' is read-only\n    export default foo = 'bar'\n                   ^^^\n  '''\n  assertErrorFormat '''\n    import { foo } from 'lib'\n    export foo = 'bar'\n  ''', '''\n    [stdin]:2:8: error: 'foo' is read-only\n    export foo = 'bar'\n           ^^^\n  '''\n\ntest \"bound functions cannot be generators\", ->\n  assertErrorFormat 'f = => yield this', '''\n    [stdin]:1:8: error: yield cannot occur inside bound (fat arrow) functions\n    f = => yield this\n           ^^^^^^^^^^\n  '''\n\ntest \"#4790: bound functions cannot be generators, even when we’re creating IIFEs\", ->\n  assertErrorFormat '''\n  =>\n    for x in []\n      for y in []\n        yield z\n  ''', '''\n    [stdin]:4:7: error: yield cannot occur inside bound (fat arrow) functions\n          yield z\n          ^^^^^^^\n  '''\n\ntest \"CoffeeScript keywords cannot be used as unaliased names in import lists\", ->\n  assertErrorFormat \"\"\"\n    import { unless, baz as bar } from 'lib'\n    bar.barMethod()\n  \"\"\", '''\n    [stdin]:1:10: error: unexpected unless\n    import { unless, baz as bar } from 'lib'\n             ^^^^^^\n  '''\n\ntest \"CoffeeScript keywords cannot be used as local names in import list aliases\", ->\n  assertErrorFormat \"\"\"\n    import { bar as unless, baz as bar } from 'lib'\n    bar.barMethod()\n  \"\"\", '''\n    [stdin]:1:17: error: unexpected unless\n    import { bar as unless, baz as bar } from 'lib'\n                    ^^^^^^\n  '''\n\ntest \"cannot have `await return` outside a function\", ->\n  assertErrorFormat '''\n    await return\n  ''', '''\n    [stdin]:1:1: error: await can only occur inside functions\n    await return\n    ^^^^^^^^^^^^\n  '''\n\ntest \"indexes are not supported in for-from loops\", ->\n  assertErrorFormat \"x for x, i from [1, 2, 3]\", '''\n    [stdin]:1:10: error: cannot use index with for-from\n    x for x, i from [1, 2, 3]\n             ^\n  '''\n\ntest \"own is not supported in for-from loops\", ->\n  assertErrorFormat \"x for own x from [1, 2, 3]\", '''\n    [stdin]:1:7: error: cannot use own with for-from\n    x for own x from [1, 2, 3]\n          ^^^\n    '''\n\ntest \"tagged template literals must be called by an identifier\", ->\n  assertErrorFormat \"1''\", '''\n    [stdin]:1:1: error: literal is not a function\n    1''\n    ^\n  '''\n  assertErrorFormat '1\"\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"\"\n    ^\n  '''\n  assertErrorFormat \"1'b'\", '''\n    [stdin]:1:1: error: literal is not a function\n    1'b'\n    ^\n  '''\n  assertErrorFormat '1\"b\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"b\"\n    ^\n  '''\n  assertErrorFormat \"1'''b'''\", \"\"\"\n    [stdin]:1:1: error: literal is not a function\n    1'''b'''\n    ^\n  \"\"\"\n  assertErrorFormat '1\"\"\"b\"\"\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"\"\"b\"\"\"\n    ^\n  '''\n  assertErrorFormat '1\"#{b}\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"#{b}\"\n    ^\n  '''\n  assertErrorFormat '1\"\"\"#{b}\"\"\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"\"\"#{b}\"\"\"\n    ^\n  '''\n\ntest \"constructor functions can't be async\", ->\n  assertErrorFormat 'class then constructor: -> await x', '''\n    [stdin]:1:12: error: Class constructor may not be async\n    class then constructor: -> await x\n               ^^^^^^^^^^^\n  '''\n\ntest \"constructor functions can't be generators\", ->\n  assertErrorFormat 'class then constructor: -> yield', '''\n    [stdin]:1:12: error: Class constructor may not be a generator\n    class then constructor: -> yield\n               ^^^^^^^^^^^\n  '''\n\ntest \"non-derived constructors can't call super\", ->\n  assertErrorFormat 'class then constructor: -> super()', '''\n    [stdin]:1:28: error: 'super' is only allowed in derived class constructors\n    class then constructor: -> super()\n                               ^^^^^^^\n  '''\n\ntest \"derived constructors can't reference `this` before calling super\", ->\n  assertErrorFormat 'class extends A then constructor: -> @', '''\n    [stdin]:1:38: error: Can't reference 'this' before calling super in derived class constructors\n    class extends A then constructor: -> @\n                                         ^\n  '''\n\ntest \"derived constructors can't use @params without calling super\", ->\n  assertErrorFormat 'class extends A then constructor: (@a) ->', '''\n    [stdin]:1:36: error: Can't use @params in derived class constructors without calling super\n    class extends A then constructor: (@a) ->\n                                       ^^\n  '''\n\ntest \"derived constructors can't call super with @params\", ->\n  assertErrorFormat 'class extends A then constructor: (@a) -> super(@a)', '''\n    [stdin]:1:49: error: Can't call super with @params in derived class constructors\n    class extends A then constructor: (@a) -> super(@a)\n                                                    ^^\n  '''\n\ntest \"derived constructors can't call super with buried @params\", ->\n  assertErrorFormat 'class extends A then constructor: (@a) -> super((=> @a)())', '''\n    [stdin]:1:53: error: Can't call super with @params in derived class constructors\n    class extends A then constructor: (@a) -> super((=> @a)())\n                                                        ^^\n  '''\n\ntest \"'super' is not allowed in constructor parameter defaults\", ->\n  assertErrorFormat 'class extends A then constructor: (a = super()) ->', '''\n    [stdin]:1:40: error: 'super' is not allowed in constructor parameter defaults\n    class extends A then constructor: (a = super()) ->\n                                           ^^^^^^^\n  '''\n\ntest \"can't use pattern matches for loop indices\", ->\n  assertErrorFormat 'a for b, {c} in d', '''\n    [stdin]:1:10: error: index cannot be a pattern matching expression\n    a for b, {c} in d\n             ^^^\n  '''\n\ntest \"bare 'super' is no longer allowed\", ->\n  # TODO Improve this error message (it should at least be 'unexpected super')\n  assertErrorFormat 'class extends A then constructor: -> super', '''\n    [stdin]:1:35: error: unexpected ->\n    class extends A then constructor: -> super\n                                      ^^\n  '''\n\ntest \"soaked 'super' in constructor\", ->\n  assertErrorFormat 'class extends A then constructor: -> super?()', '''\n    [stdin]:1:38: error: Unsupported reference to 'super'\n    class extends A then constructor: -> super?()\n                                         ^^^^^\n  '''\n\ntest \"new with 'super'\", ->\n  assertErrorFormat 'class extends A then foo: -> new super()', '''\n    [stdin]:1:34: error: Unsupported reference to 'super'\n    class extends A then foo: -> new super()\n                                     ^^^^^\n  '''\n\ntest \"'super' outside method\", ->\n  assertErrorFormat 'super()', '''\n    [stdin]:1:1: error: cannot use super outside of an instance method\n    super()\n    ^^^^^\n  '''\n\ntest \"getter keyword in object\", ->\n  assertErrorFormat '''\n    obj =\n      get foo: ->\n  ''', '''\n    [stdin]:2:3: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n      get foo: ->\n      ^^^\n  '''\n\ntest \"setter keyword in object\", ->\n  assertErrorFormat '''\n    obj =\n      set foo: ->\n  ''', '''\n    [stdin]:2:3: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n      set foo: ->\n      ^^^\n  '''\n\ntest \"getter keyword in inline implicit object\", ->\n  assertErrorFormat 'obj = get foo: ->', '''\n    [stdin]:1:7: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n    obj = get foo: ->\n          ^^^\n  '''\n\ntest \"setter keyword in inline implicit object\", ->\n  assertErrorFormat 'obj = set foo: ->', '''\n    [stdin]:1:7: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n    obj = set foo: ->\n          ^^^\n  '''\n\ntest \"getter keyword in inline explicit object\", ->\n  assertErrorFormat 'obj = {get foo: ->}', '''\n    [stdin]:1:8: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n    obj = {get foo: ->}\n           ^^^\n  '''\n\ntest \"setter keyword in inline explicit object\", ->\n  assertErrorFormat 'obj = {set foo: ->}', '''\n    [stdin]:1:8: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n    obj = {set foo: ->}\n           ^^^\n  '''\n\ntest \"getter keyword in function\", ->\n  assertErrorFormat '''\n    f = ->\n      get foo: ->\n  ''', '''\n    [stdin]:2:3: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n      get foo: ->\n      ^^^\n  '''\n\ntest \"setter keyword in function\", ->\n  assertErrorFormat '''\n    f = ->\n      set foo: ->\n  ''', '''\n    [stdin]:2:3: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n      set foo: ->\n      ^^^\n  '''\n\ntest \"getter keyword in inline function\", ->\n  assertErrorFormat 'f = -> get foo: ->', '''\n    [stdin]:1:8: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n    f = -> get foo: ->\n           ^^^\n  '''\n\ntest \"setter keyword in inline function\", ->\n  assertErrorFormat 'f = -> set foo: ->', '''\n    [stdin]:1:8: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n    f = -> set foo: ->\n           ^^^\n  '''\n\ntest \"getter keyword in class\", ->\n  assertErrorFormat '''\n    class A\n      get foo: ->\n  ''', '''\n    [stdin]:2:3: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n      get foo: ->\n      ^^^\n  '''\n\ntest \"setter keyword in class\", ->\n  assertErrorFormat '''\n    class A\n      set foo: ->\n  ''', '''\n    [stdin]:2:3: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n      set foo: ->\n      ^^^\n  '''\n\ntest \"getter keyword in inline class\", ->\n  assertErrorFormat 'class A then get foo: ->', '''\n      [stdin]:1:14: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n      class A then get foo: ->\n                   ^^^\n  '''\n\ntest \"setter keyword in inline class\", ->\n  assertErrorFormat 'class A then set foo: ->', '''\n      [stdin]:1:14: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n      class A then set foo: ->\n                   ^^^\n  '''\n\ntest \"getter keyword before static method\", ->\n  assertErrorFormat '''\n    class A\n      get @foo = ->\n  ''', '''\n    [stdin]:2:3: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n      get @foo = ->\n      ^^^\n  '''\n\ntest \"setter keyword before static method\", ->\n  assertErrorFormat '''\n    class A\n      set @foo = ->\n  ''', '''\n    [stdin]:2:3: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n      set @foo = ->\n      ^^^\n  '''\n\ntest \"#4248: Unicode code point escapes\", ->\n  assertErrorFormat '''\n    \"a\n      #{b} \\\\u{G02}\n     c\"\n  ''', '''\n    [stdin]:2:8: error: invalid escape sequence \\\\u{G02}\n      #{b} \\\\u{G02}\n           ^\\^^^^^^\n  '''\n  assertErrorFormat '''\n    /a\\\\u{}b/\n  ''', '''\n    [stdin]:1:3: error: invalid escape sequence \\\\u{}\n    /a\\\\u{}b/\n      ^\\^^^\n  '''\n  assertErrorFormat '''\n    ///a \\\\u{01abc///\n  ''', '''\n    [stdin]:1:6: error: invalid escape sequence \\\\u{01abc\n    ///a \\\\u{01abc///\n         ^\\^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    /\\\\u{123} \\\\u{110000}/\n  ''', '''\n    [stdin]:1:10: error: unicode code point escapes greater than \\\\u{10ffff} are not allowed\n    /\\\\u{123} \\\\u{110000}/\n      \\       ^\\^^^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    ///abc\\\\\\\\\\\\u{123456}///u\n  ''', '''\n    [stdin]:1:9: error: unicode code point escapes greater than \\\\u{10ffff} are not allowed\n    ///abc\\\\\\\\\\\\u{123456}///u\n           \\ \\^\\^^^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    \"\"\"\n      \\\\u{123}\n      a\n        \\\\u{00110000}\n      #{ 'b' }\n    \"\"\"\n  ''', '''\n    [stdin]:4:5: error: unicode code point escapes greater than \\\\u{10ffff} are not allowed\n        \\\\u{00110000}\n        ^\\^^^^^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    '\\\\u{a}\\\\u{1111110000}'\n  ''', '''\n    [stdin]:1:7: error: unicode code point escapes greater than \\\\u{10ffff} are not allowed\n    '\\\\u{a}\\\\u{1111110000}'\n      \\    ^\\^^^^^^^^^^^^^\n  '''\n\ntest \"JSX error: non-matching tag names\", ->\n  assertErrorFormat '''\n    <div><span></div></span>\n  ''',\n  '''\n    [stdin]:1:7: error: expected corresponding JSX closing tag for span\n    <div><span></div></span>\n          ^^^^\n  '''\n\ntest \"JSX error: bare expressions not allowed\", ->\n  assertErrorFormat '''\n    <div x=3 />\n  ''',\n  '''\n    [stdin]:1:8: error: expected wrapped or quoted JSX attribute\n    <div x=3 />\n           ^\n  '''\n\ntest \"JSX error: unescaped opening tag angle bracket disallowed\", ->\n  assertErrorFormat '''\n    <Person><<</Person>\n  ''',\n  '''\n    [stdin]:1:9: error: unexpected <<\n    <Person><<</Person>\n            ^^\n  '''\n\ntest \"JSX error: ambiguous tag-like expression\", ->\n  assertErrorFormat '''\n    x = a <b > c\n  ''',\n  '''\n    [stdin]:1:10: error: missing </\n    x = a <b > c\n             ^\n  '''\n\ntest 'JSX error: invalid attributes', ->\n  assertErrorFormat '''\n    <div a=\"b\" {props} />\n  ''', '''\n    [stdin]:1:12: error: Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.\n    <div a=\"b\" {props} />\n               ^^^^^^^\n  '''\n  assertErrorFormat '''\n    <div a={b} {a:{b}} />\n  ''', '''\n    [stdin]:1:12: error: Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.\n    <div a={b} {a:{b}} />\n               ^^^^^^^\n  '''\n  assertErrorFormat '''\n    <div {\"#{a}\"} />\n  ''', '''\n    [stdin]:1:6: error: Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.\n    <div {\"#{a}\"} />\n         ^^^^^^^^\n  '''\n  assertErrorFormat '''\n    <div props... />\n  ''', '''\n    [stdin]:1:11: error: Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.\n    <div props... />\n              ^^^\n  '''\n  assertErrorFormat '''\n    <div {a:\"b\", props..., c:d()} />\n  ''', '''\n    [stdin]:1:6: error: Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.\n    <div {a:\"b\", props..., c:d()} />\n         ^^^^^^^^^^^^^^^^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    <div {props..., a, b} />\n  ''', '''\n    [stdin]:1:6: error: Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.\n    <div {props..., a, b} />\n         ^^^^^^^^^^^^^^^^\n  '''\n\ntest '#5034: JSX error: Adjacent JSX elements must be wrapped in an enclosing tag', ->\n  assertErrorFormat '''\n    render = -> (\n      <Row>a</Row>\n      <Row>b</Row>\n    )\n  ''', '''\n    [stdin]:3:3: error: Adjacent JSX elements must be wrapped in an enclosing tag\n      <Row>b</Row>\n      ^^^^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    render = -> (\n      a = \"foo\"\n      <Row>a</Row>\n      <Row>b</Row>\n    )\n  ''', '''\n    [stdin]:4:3: error: Adjacent JSX elements must be wrapped in an enclosing tag\n      <Row>b</Row>\n      ^^^^^^^^^^^^\n  '''\ntest 'Bound method called as callback before binding throws runtime error', ->\n  class Base\n    constructor: ->\n      f = @derivedBound\n      try\n        f()\n        ok no\n      catch e\n        eq e.message, 'Bound instance method accessed before binding'\n\n  class Derived extends Base\n    derivedBound: =>\n      ok no\n  d = new Derived\n\ntest \"#3845/#3446: chain after function glyph (but not inline)\", ->\n  assertErrorFormat '''\n    a -> .b\n  ''',\n  '''\n    [stdin]:1:6: error: unexpected .\n    a -> .b\n         ^\n  '''\n\ntest \"#3906: error for unusual indentation\", ->\n  assertErrorFormat '''\n    a\n      c\n     .d\n\n    e(\n     f)\n\n    g\n  ''', '''\n    [stdin]:2:1: error: unexpected indentation\n      c\n    ^^\n  '''\n\ntest \"#4283: error message for implicit call\", ->\n  assertErrorFormat '''\n    (a, b c) ->\n  ''', '''\n    [stdin]:1:5: error: unexpected implicit function call\n    (a, b c) ->\n        ^\n  '''\n\ntest \"#3199: error message for call indented non-object\", ->\n  assertErrorFormat '''\n    fn = ->\n    fn\n      1\n  ''', '''\n    [stdin]:3:1: error: unexpected indentation\n      1\n    ^^\n  '''\n\ntest \"#3199: error message for call indented comprehension\", ->\n  assertErrorFormat '''\n    fn = ->\n    fn\n      x for x in [1, 2, 3]\n  ''', '''\n    [stdin]:3:1: error: unexpected indentation\n      x for x in [1, 2, 3]\n    ^^\n  '''\n\ntest \"#3199: error message for return indented non-object\", ->\n  assertErrorFormat '''\n    return\n      1\n  ''', '''\n    [stdin]:2:3: error: unexpected number\n      1\n      ^\n  '''\n\ntest \"#3199: error message for return indented comprehension\", ->\n  assertErrorFormat '''\n    return\n      x for x in [1, 2, 3]\n  ''', '''\n    [stdin]:2:3: error: unexpected identifier\n      x for x in [1, 2, 3]\n      ^\n  '''\n\ntest \"#3199: error message for throw indented non-object\", ->\n  assertErrorFormat '''\n    throw\n      1\n  ''', '''\n    [stdin]:2:3: error: unexpected number\n      1\n      ^\n  '''\n\ntest \"#3199: error message for throw indented comprehension\", ->\n  assertErrorFormat '''\n    throw\n      x for x in [1, 2, 3]\n  ''', '''\n    [stdin]:2:3: error: unexpected identifier\n      x for x in [1, 2, 3]\n      ^\n  '''\n\ntest \"#3199: error message for yield indented non-object\", ->\n  assertErrorFormat '''\n    ->\n      yield\n        1\n  ''', '''\n    [stdin]:3:5: error: unexpected number\n        1\n        ^\n  '''\n\ntest \"#3199: error message for yield indented comprehension\", ->\n  assertErrorFormat '''\n    ->\n      yield\n        x for x in [1, 2, 3]\n  ''', '''\n    [stdin]:3:5: error: unexpected identifier\n        x for x in [1, 2, 3]\n        ^\n  '''\n\ntest \"#3199: error message for await indented non-object\", ->\n  assertErrorFormat '''\n    ->\n      await\n        1\n  ''', '''\n    [stdin]:3:5: error: unexpected number\n        1\n        ^\n  '''\n\ntest \"#3199: error message for await indented comprehension\", ->\n  assertErrorFormat '''\n    ->\n      await\n        x for x in [1, 2, 3]\n  ''', '''\n    [stdin]:3:5: error: unexpected identifier\n        x for x in [1, 2, 3]\n        ^\n  '''\n\ntest \"#3098: suppressed newline should be unsuppressed by semicolon\", ->\n  assertErrorFormat '''\n    a = ; 5\n  ''', '''\n    [stdin]:1:5: error: unexpected ;\n    a = ; 5\n        ^\n  '''\n\ntest \"#4811: '///' inside a heregex comment does not close the heregex\", ->\n  assertErrorFormat '''\n   /// .* # comment ///\n  ''', '''\n  [stdin]:1:1: error: missing ///\n  /// .* # comment ///\n  ^^^\n  '''\n\ntest \"#3933: prevent implicit calls when cotrol flow is missing `THEN`\", ->\n  assertErrorFormat '''\n    for a in b do ->\n  ''','''\n    [stdin]:1:12: error: unexpected do\n    for a in b do ->\n               ^^\n  '''\n\n  assertErrorFormat '''\n    for a in b ->\n  ''','''\n    [stdin]:1:12: error: unexpected ->\n    for a in b ->\n               ^^\n  '''\n\n  assertErrorFormat '''\n    for a in b do =>\n  ''','''\n    [stdin]:1:12: error: unexpected do\n    for a in b do =>\n               ^^\n  '''\n\n  assertErrorFormat '''\n    while a do ->\n  ''','''\n    [stdin]:1:9: error: unexpected do\n    while a do ->\n            ^^\n  '''\n\n  assertErrorFormat '''\n    until a do =>\n  ''','''\n    [stdin]:1:9: error: unexpected do\n    until a do =>\n            ^^\n  '''\n\n  assertErrorFormat '''\n    switch\n      when a ->\n  ''','''\n    [stdin]:2:10: error: unexpected ->\n      when a ->\n             ^^\n  '''\n\ntest \"`new.target` outside of a function\", ->\n  assertErrorFormat '''\n    new.target\n  ''', '''\n    [stdin]:1:1: error: new.target can only occur inside functions\n    new.target\n    ^^^^^^^^^^\n  '''\n\ntest \"`new.target` is only allowed meta property\", ->\n  assertErrorFormat '''\n    -> new.something\n  ''', '''\n    [stdin]:1:4: error: the only valid meta property for new is new.target\n    -> new.something\n       ^^^^^^^^^^^^^\n  '''\n\ntest \"`import.meta` is only allowed meta property\", ->\n  assertErrorFormat '''\n    foo = import.something\n  ''', '''\n    [stdin]:1:7: error: the only valid meta property for import is import.meta\n    foo = import.something\n          ^^^^^^^^^^^^^^^^\n  '''\n\ntest \"`new.target` cannot be assigned\", ->\n  assertErrorFormat '''\n    ->\n      new.target = b\n  ''', '''\n    [stdin]:2:14: error: unexpected =\n      new.target = b\n                 ^\n  '''\n\ntest \"#4834: dynamic import accepts either one or two arguments\", ->\n  assertErrorFormat '''\n    import()\n  ''', '''\n    [stdin]:1:1: error: import() accepts either one or two arguments\n    import()\n    ^^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    import('x', {}, 3)\n  ''', '''\n    [stdin]:1:1: error: import() accepts either one or two arguments\n    import('x', {}, 3)\n    ^^^^^^^^^^^^^^^^^^\n  '''\n\ntest \"#4834: dynamic import requires explicit call parentheses\", ->\n  assertErrorFormat '''\n    promise = import 'foo'\n  ''', '''\n    [stdin]:1:23: error: unexpected end of input\n    promise = import 'foo'\n                          ^\n  '''\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"eval\">\nif vm = require? 'vm'\n\n  test \"CoffeeScript.eval runs in the global context by default\", ->\n    global.punctuation = '!'\n    code = '''\n    global.fhqwhgads = \"global superpower#{global.punctuation}\"\n    '''\n    result = CoffeeScript.eval code\n    eq result, 'global superpower!'\n    eq fhqwhgads, 'global superpower!'\n\n  test \"CoffeeScript.eval can run in, and modify, a Script context sandbox\", ->\n    createContext = vm.Script.createContext ? vm.createContext\n    sandbox = createContext()\n    sandbox.foo = 'bar'\n    code = '''\n    global.foo = 'not bar!'\n    '''\n    result = CoffeeScript.eval code, {sandbox}\n    eq result, 'not bar!'\n    eq sandbox.foo, 'not bar!'\n\n  test \"CoffeeScript.eval can run in, but cannot modify, an ordinary object sandbox\", ->\n    sandbox = {foo: 'bar'}\n    code = '''\n    global.foo = 'not bar!'\n    '''\n    result = CoffeeScript.eval code, {sandbox}\n    eq result, 'not bar!'\n    eq sandbox.foo, 'bar'\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"exception_handling\">\n# Exception Handling\n# ------------------\n\n# shared nonce\nnonce = {}\n\n\n# Throw\n\ntest \"basic exception throwing\", ->\n  throws (-> throw 'error'), /^error$/\n\n\n# Empty Try/Catch/Finally\n\ntest \"try can exist alone\", ->\n  try\n\ntest \"try/catch with empty try, empty catch\", ->\n  try\n    # nothing\n  catch err\n    # nothing\n\ntest \"single-line try/catch with empty try, empty catch\", ->\n  try catch err\n\ntest \"try/finally with empty try, empty finally\", ->\n  try\n    # nothing\n  finally\n    # nothing\n\ntest \"single-line try/finally with empty try, empty finally\", ->\n  try finally\n\ntest \"try/catch/finally with empty try, empty catch, empty finally\", ->\n  try\n  catch err\n  finally\n\ntest \"single-line try/catch/finally with empty try, empty catch, empty finally\", ->\n  try catch err then finally\n\n\n# Try/Catch/Finally as an Expression\n\ntest \"return the result of try when no exception is thrown\", ->\n  result = try\n    nonce\n  catch err\n    undefined\n  finally\n    undefined\n  eq nonce, result\n\ntest \"single-line result of try when no exception is thrown\", ->\n  result = try nonce catch err then undefined\n  eq nonce, result\n\ntest \"return the result of catch when an exception is thrown\", ->\n  fn = ->\n    try\n      throw ->\n    catch err\n      nonce\n  doesNotThrow fn\n  eq nonce, fn()\n\ntest \"single-line result of catch when an exception is thrown\", ->\n  fn = ->\n    try throw (->) catch err then nonce\n  doesNotThrow fn\n  eq nonce, fn()\n\ntest \"optional catch\", ->\n  fn = ->\n    try throw ->\n    nonce\n  doesNotThrow fn\n  eq nonce, fn()\n\n\n# Try/Catch/Finally Interaction With Other Constructs\n\ntest \"try/catch with empty catch as last statement in a function body\", ->\n  fn = ->\n    try nonce\n    catch err\n  eq nonce, fn()\n\ntest \"#1595: try/catch with a reused variable name\", ->\n  # `catch` shouldn’t lead to broken scoping.\n  do ->\n    try\n      inner = 5\n    catch inner\n      # nothing\n  eq typeof inner, 'undefined'\n\ntest \"#2580: try/catch with destructuring the exception object\", ->\n  result = try\n    missing.object\n  catch {message}\n    message\n\n  eq message, 'missing is not defined'\n\ntest \"Try catch finally as implicit arguments\", ->\n  first = (x) -> x\n\n  foo = no\n  try\n    first try iamwhoiam() finally foo = yes\n  catch e\n  eq foo, yes\n\n  bar = no\n  try\n    first try iamwhoiam() catch e finally\n    bar = yes\n  catch e\n  eq bar, yes\n\ntest \"#2900: parameter-less catch clause\", ->\n  # `catch` should not require a parameter.\n  try\n    throw new Error 'failed'\n  catch\n    ok true\n\n  try throw new Error 'failed' catch finally ok true\n\n  ok try throw new Error 'failed' catch then true\n\ntest \"#3709: throwing an if statement\", ->\n  # `throw if` should return a closure around the `if` block, so that the\n  # output is valid JavaScript.\n  try\n    throw if no\n        new Error 'drat!'\n      else\n        new Error 'no escape!'\n  catch err\n    eq err.message, 'no escape!'\n\n  try\n    throw if yes then new Error 'huh?' else null\n  catch err\n    eq err.message, 'huh?'\n\ntest \"#3709: throwing a switch statement\", ->\n  i = 3\n  try\n    throw switch i\n      when 2\n        new Error 'not this one'\n      when 3\n        new Error 'oh no!'\n  catch err\n    eq err.message, 'oh no!'\n\ntest \"#3709: throwing a for loop\", ->\n  # `throw for` should return a closure around the `for` block, so that the\n  # output is valid JavaScript.\n  try\n    throw for i in [0..3]\n      i * 2\n  catch err\n    arrayEq err, [0, 2, 4, 6]\n\ntest \"#3709: throwing a while loop\", ->\n  i = 0\n  try\n    throw while i < 3\n      i++\n  catch err\n    eq i, 3\n\ntest \"#3789: throwing a throw\", ->\n  try\n    throw throw throw new Error 'whoa!'\n  catch err\n    eq err.message, 'whoa!'\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"exponentiation\">\n# The `**` and `**=` operators are only supported in Node 7.5+, so the tests\n# for these exponentiation operators are split out into their own file to be\n# loaded only by supported runtimes.\n\ntest \"exponentiation operator\", ->\n  eq 27, 3 ** 3\n\ntest \"exponentiation operator has higher precedence than other maths operators\", ->\n  eq 55, 1 + 3 ** 3 * 2\n  eq -4, -2 ** 2\n  eq 0, (!2) ** 2\n\ntest \"exponentiation operator is right associative\", ->\n  eq 2, 2 ** 1 ** 3\n\ntest \"exponentiation operator compound assignment\", ->\n  a = 2\n  a **= 3\n  eq 8, a\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"formatting\">\n# Formatting\n# ----------\n\n# TODO: maybe this file should be split up into their respective sections:\n#   operators -> operators\n#   array literals -> array literals\n#   string literals -> string literals\n#   function invocations -> function invocations\n\ndoesNotThrowCompileError \"a = then b\"\n\ntest \"multiple semicolon-separated statements in parentheticals\", ->\n  nonce = {}\n  eq nonce, (1; 2; nonce)\n  eq nonce, (-> return (1; 2; nonce))()\n\n# * Line Continuation\n#   * Property Accesss\n#   * Operators\n#   * Array Literals\n#   * Function Invocations\n#   * String Literals\n\n# Property Access\n\ntest \"chained accesses split on period/newline, backwards and forwards\", ->\n  str = 'abc'\n  result = str.\n    split('').\n    reverse().\n    reverse().\n    reverse()\n  arrayEq ['c','b','a'], result\n  arrayEq ['c','b','a'], str.\n    split('').\n    reverse().\n    reverse().\n    reverse()\n  result = str\n    .split('')\n    .reverse()\n    .reverse()\n    .reverse()\n  arrayEq ['c','b','a'], result\n  arrayEq ['c','b','a'],\n    str\n    .split('')\n    .reverse()\n    .reverse()\n    .reverse()\n  arrayEq ['c','b','a'],\n    str.\n    split('')\n    .reverse().\n    reverse()\n    .reverse()\n\n# Operators\n\ntest \"newline suppression for operators\", ->\n  six =\n    1 +\n    2 +\n    3\n  eq 6, six\n\ntest \"`?.` and `::` should continue lines\", ->\n  ok not (\n    Date\n    ::\n    ?.foo\n  )\n\n  ok not (\n    Date\n    ?::\n    ?.foo\n  )\n  #eq Object::toString, Date?.\n  #prototype\n  #::\n  #?.foo\n\ndoesNotThrowCompileError \"\"\"\n  oh. yes\n  oh?. true\n  oh:: return\n  \"\"\"\n\ndoesNotThrowCompileError \"\"\"\n  a?[b..]\n  a?[...b]\n  a?[b..c]\n  \"\"\"\n\ntest \"#1768: space between `::` and index is ignored\", ->\n  eq 'function', typeof String:: ['toString']\n\n# Array Literals\n\ntest \"indented array literals don't trigger whitespace rewriting\", ->\n  getArgs = -> arguments\n  result = getArgs(\n    [[[[[],\n                  []],\n                [[]]]],\n      []])\n  eq 1, result.length\n\n# Function Invocations\n\ndoesNotThrowCompileError \"\"\"\n  obj = then fn 1,\n    1: 1\n    a:\n      b: ->\n        fn c,\n          d: e\n    f: 1\n  \"\"\"\n\n# String Literals\n\ntest \"indented heredoc\", ->\n  result = ((_) -> _)(\n                \"\"\"\n                abc\n                \"\"\")\n  eq \"abc\", result\n\n# Chaining - all open calls are closed by property access starting a new line\n# * chaining after\n#   * indented argument\n#   * function block\n#   * indented object\n#\n#   * single line arguments\n#   * inline function literal\n#   * inline object literal\n#\n# * chaining inside\n#   * implicit object literal\n\ntest \"chaining after outdent\", ->\n  id = (x) -> x\n\n  # indented argument\n  ff = id parseInt \"ff\",\n    16\n  .toString()\n  eq '255', ff\n\n  # function block\n  str = 'abc'\n  zero = parseInt str.replace /\\w/, (letter) ->\n    0\n  .toString()\n  eq '0', zero\n\n  # indented object\n  a = id id\n    a: 1\n  .a\n  eq 1, a\n\ntest \"#1495, method call chaining\", ->\n  str = 'abc'\n\n  result = str.split ''\n              .join ', '\n  eq 'a, b, c', result\n\n  result = str\n  .split ''\n  .join ', '\n  eq 'a, b, c', result\n\n  eq 'a, b, c', (str\n    .split ''\n    .join ', '\n  )\n\n  eq 'abc',\n    'aaabbbccc'.replace /(\\w)\\1\\1/g, '$1$1'\n               .replace /([abc])\\1/g, '$1'\n\n  # Nested calls\n  result = [1..3]\n    .slice Math.max 0, 1\n    .concat [3]\n  arrayEq [2, 3, 3], result\n\n  # Single line function arguments\n  result = [1..6]\n    .map (x) -> x * x\n    .filter (x) -> x % 2 is 0\n    .reverse()\n  arrayEq [36, 16, 4], result\n\n  # Single line implicit objects\n  id = (x) -> x\n  result = id a: 1\n    .a\n  eq 1, result\n\n  # The parens are forced\n  result = str.split(''.\n    split ''\n    .join ''\n  ).join ', '\n  eq 'a, b, c', result\n\ntest \"chaining should not wrap spilling ternary\", ->\n  throwsCompileError \"\"\"\n    if 0 then 1 else g\n      a: 42\n    .h()\n  \"\"\"\n\ntest \"chaining should wrap calls containing spilling ternary\", ->\n  f = (x) -> h: x\n  id = (x) -> x\n  result = f if true then 42 else id\n      a: 2\n  .h\n  eq 42, result\n\ntest \"chaining should work within spilling ternary\", ->\n  f = (x) -> h: x\n  id = (x) -> x\n  result = f if false then 1 else id\n      a: 3\n      .a\n  eq 3, result.h\n\ntest \"method call chaining inside objects\", ->\n  f = (x) -> c: 42\n  result =\n    a: f 1\n    b: f a: 1\n      .c\n  eq 42, result.b\n\ntest \"#4568: refine sameLine implicit object tagging\", ->\n  condition = yes\n  fn = -> yes\n\n  x =\n    fn bar: {\n      foo: 123\n    } if not condition\n  eq x, undefined\n\n# Nested blocks caused by paren unwrapping\ntest \"#1492: Nested blocks don't cause double semicolons\", ->\n  js = CoffeeScript.compile '(0;0)'\n  eq -1, js.indexOf ';;'\n\ntest \"#1195 Ignore trailing semicolons (before newlines or as the last char in a program)\", ->\n  preNewline = (numSemicolons) ->\n    \"\"\"\n    nonce = {}; nonce2 = {}\n    f = -> nonce#{Array(numSemicolons+1).join(';')}\n    nonce2\n    unless f() is nonce then throw new Error('; before linebreak should = newline')\n    \"\"\"\n  CoffeeScript.run(preNewline(n), bare: true) for n in [1,2,3]\n\n  lastChar = '-> lastChar;'\n  doesNotThrowCompileError lastChar, bare: true\n\ntest \"#1299: Disallow token misnesting\", ->\n  try\n    CoffeeScript.compile '''\n      [{\n         ]}\n    '''\n    ok no\n  catch e\n    eq 'unmatched ]', e.message\n\ntest \"#2981: Enforce initial indentation\", ->\n  try\n    CoffeeScript.compile '  a\\nb-'\n    ok no\n  catch e\n    eq 'missing indentation', e.message\n\ntest \"'single-line' expression containing multiple lines\", ->\n  doesNotThrowCompileError \"\"\"\n    (a, b) -> if a\n      -a\n    else if b\n    then -b\n    else null\n  \"\"\"\n\ntest \"#1275: allow indentation before closing brackets\", ->\n  array = [\n      1\n      2\n      3\n    ]\n  eq array, array\n  do ->\n  (\n    a = 1\n   )\n  eq 1, a\n\ntest \"don’t allow mixing of spaces and tabs for indentation\", ->\n  try\n    CoffeeScript.compile '''\n      new Layer\n       x: 0\n      \ty: 1\n    '''\n    ok no\n  catch e\n    eq 'indentation mismatch', e.message\n\ntest \"each code block that starts at indentation 0 can use a different style\", ->\n  doesNotThrowCompileError '''\n      new Layer\n       x: 0\n       y: 1\n      new Layer\n      \tx: 0\n      \ty: 1\n    '''\n\ntest \"tabs and spaces cannot be mixed for indentation\", ->\n  try\n    CoffeeScript.compile '''\n      new Layer\n      \t x: 0\n      \t y: 1\n    '''\n    ok no\n  catch e\n    eq 'mixed indentation', e.message\n\ntest \"#4487: Handle unusual outdentation\", ->\n  a =\n    switch 1\n      when 2\n          no\n         when 3 then no\n      when 1 then yes\n  eq yes, a\n\n  b = do ->\n    if no\n      if no\n            1\n       2\n      3\n  eq b, undefined\n\ntest \"#3906: handle further indentation inside indented chain\", ->\n  eq 1, CoffeeScript.eval '''\n    z = b: -> d: 2\n    e = ->\n    f = 3\n\n    z\n        .b ->\n            c\n        .d\n\n    e(\n        f\n    )\n\n    1\n  '''\n\n  eq 1, CoffeeScript.eval '''\n    z = -> b: -> e: ->\n\n    z()\n        .b\n            c: 'd'\n        .e()\n\n    f = [\n        'g'\n    ]\n\n    1\n  '''\n\n  eq 1, CoffeeScript.eval '''\n    z = -> c: -> c: ->\n\n    z('b')\n      .c 'a',\n        {b: 'a'}\n      .c()\n    z(\n      'b'\n    )\n    1\n  '''\n\ntest \"#3199: throw multiline implicit object\", ->\n  x = do ->\n    if no then throw\n      type: 'a'\n      msg: 'b'\n  eq undefined, x\n\n  y = do ->\n    if no then return\n      type: 'a'\n      msg: 'b'\n  eq undefined, y\n\n  y = do ->\n    yield\n      type: 'a'\n      msg: 'b'\n\n    if no then yield\n      type: 'c'\n      msg: 'd'\n\n    1\n  {value, done} = y.next()\n  ok value.type is 'a' and done is no\n\n  {value, done} = y.next()\n  ok value is 1 and done is yes\n\ntest \"#4576: multiple row function chaining\", ->\n  ->\n    eq @a, 3\n  .call a: 3\n\ntest \"#4576: function chaining on separate rows\", ->\n  do ->\n    Promise\n    .resolve()\n    .then ->\n      yes\n    .then ok\n\ntest \"#3736: chaining after do IIFE\", ->\n  eq 3,\n    do ->\n      a: 3\n    .a\n\n  eq 3,\n    do (b = (c) -> c) -> a: 3\n    ?.a\n\n  b = 3\n  eq 3,\n    do (\n      b\n      {d} = {}\n    ) ->\n      a: b\n    .a\n\n  # preserve existing chaining behavior for non-IIFE `do`\n  b = c: -> 4\n  eq 4,\n    do b\n    .c\n\ntest \"#5168: allow indented property index\", ->\n  a = b: 3\n\n  eq 3, a[\n    if yes\n      'b'\n    else\n      'c'\n  ]\n\n  d = [1, 2, 3]\n  arrayEq [1, 2], d[\n    ...2\n  ]\n\n  class A\n    b: -> 3\n\n  class B extends A\n    c: ->\n      super[\n        'b'\n      ]()\n\n  eq 3, new B().c()\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"function_invocation\">\n# Function Invocation\n# -------------------\n\n# * Function Invocation\n# * Splats in Function Invocations\n# * Implicit Returns\n# * Explicit Returns\n\n# shared identity function\nid = (_) -> if arguments.length is 1 then _ else [arguments...]\n\ntest \"basic argument passing\", ->\n\n  a = {}\n  b = {}\n  c = {}\n  eq 1, (id 1)\n  eq 2, (id 1, 2)[1]\n  eq a, (id a)\n  eq c, (id a, b, c)[2]\n\n\ntest \"passing arguments on separate lines\", ->\n\n  a = {}\n  b = {}\n  c = {}\n  ok(id(\n    a\n    b\n    c\n  )[1] is b)\n  eq(0, id(\n    0\n    10\n  )[0])\n  eq(a,id(\n    a\n  ))\n  eq b,\n  (id b)\n\n\ntest \"optional parens can be used in a nested fashion\", ->\n\n  call = (func) -> func()\n  add = (a,b) -> a + b\n  result = call ->\n    inner = call ->\n      add 5, 5\n  ok result is 10\n\n\ntest \"hanging commas and semicolons in argument list\", ->\n\n  fn = () -> arguments.length\n  eq 2, fn(0,1,)\n  eq 3, fn 0, 1,\n  2\n  eq 2, fn(0, 1;)\n  # TODO: this test fails (the string compiles), but should it?\n  #throwsCompileError \"fn(0,1,;)\"\n  throwsCompileError \"fn(0,1,;;)\"\n  throwsCompileError \"fn(0, 1;,)\"\n  throwsCompileError \"fn(,0)\"\n  throwsCompileError \"fn(;0)\"\n\n\ntest \"function invocation\", ->\n\n  func = ->\n    return if true\n  eq undefined, func()\n\n  result = (\"hello\".slice) 3\n  ok result is 'lo'\n\n\ntest \"And even with strange things like this:\", ->\n\n  funcs  = [((x) -> x), ((x) -> x * x)]\n  result = funcs[1] 5\n  ok result is 25\n\n\ntest \"More fun with optional parens.\", ->\n\n  fn = (arg) -> arg\n  ok fn(fn {prop: 101}).prop is 101\n\n  okFunc = (f) -> ok(f())\n  okFunc -> true\n\n\ntest \"chained function calls\", ->\n  nonce = {}\n  identityWrap = (x) ->\n    -> x\n  eq nonce, identityWrap(identityWrap(nonce))()()\n  eq nonce, (identityWrap identityWrap nonce)()()\n\n\ntest \"Multi-blocks with optional parens.\", ->\n\n  fn = (arg) -> arg\n  result = fn( ->\n    fn ->\n      \"Wrapped\"\n  )\n  ok result()() is 'Wrapped'\n\n\ntest \"method calls\", ->\n\n  fnId = (fn) -> -> fn.apply this, arguments\n  math = {\n    add: (a, b) -> a + b\n    anonymousAdd: (a, b) -> a + b\n    fastAdd: fnId (a, b) -> a + b\n  }\n  ok math.add(5, 5) is 10\n  ok math.anonymousAdd(10, 10) is 20\n  ok math.fastAdd(20, 20) is 40\n\n\ntest \"Ensure that functions can have a trailing comma in their argument list\", ->\n\n  mult = (x, mids..., y) ->\n    x *= n for n in mids\n    x *= y\n  #ok mult(1, 2,) is 2\n  #ok mult(1, 2, 3,) is 6\n  ok mult(10, (i for i in [1..6])...) is 7200\n\n\ntest \"`@` and `this` should both be able to invoke a method\", ->\n  nonce = {}\n  fn          = (arg) -> eq nonce, arg\n  fn.withAt   = -> @ nonce\n  fn.withThis = -> this nonce\n  fn.withAt()\n  fn.withThis()\n\n\ntest \"Trying an implicit object call with a trailing function.\", ->\n\n  a = null\n  meth = (arg, obj, func) -> a = [obj.a, arg, func()].join ' '\n  meth 'apple', b: 1, a: 13, ->\n    'orange'\n  ok a is '13 apple orange'\n\n\ntest \"Ensure that empty functions don't return mistaken values.\", ->\n\n  obj =\n    func: (@param, @rest...) ->\n  ok obj.func(101, 102, 103, 104) is undefined\n  ok obj.param is 101\n  ok obj.rest.join(' ') is '102 103 104'\n\n\ntest \"Passing multiple functions without paren-wrapping is legal, and should compile.\", ->\n\n  sum = (one, two) -> one() + two()\n  result = sum ->\n    7 + 9\n  , ->\n    1 + 3\n  ok result is 20\n\n\ntest \"Implicit call with a trailing if statement as a param.\", ->\n\n  func = -> arguments[1]\n  result = func 'one', if false then 100 else 13\n  ok result is 13\n\n\ntest \"Test more function passing:\", ->\n\n  sum = (one, two) -> one() + two()\n\n  result = sum( ->\n    1 + 2\n  , ->\n    2 + 1\n  )\n  ok result is 6\n\n  sum = (a, b) -> a + b\n  result = sum(1\n  , 2)\n  ok result is 3\n\n\ntest \"Chained blocks, with proper indentation levels:\", ->\n\n  counter =\n    results: []\n    tick: (func) ->\n      @results.push func()\n      this\n  counter\n    .tick ->\n      3\n    .tick ->\n      2\n    .tick ->\n      1\n  arrayEq [3,2,1], counter.results\n\n\ntest \"This is a crazy one.\", ->\n\n  x = (obj, func) -> func obj\n  ident = (x) -> x\n  result = x {one: ident 1}, (obj) ->\n    inner = ident(obj)\n    ident inner\n  ok result.one is 1\n\n\ntest \"More paren compilation tests:\", ->\n\n  reverse = (obj) -> obj.reverse()\n  ok reverse([1, 2].concat 3).join(' ') is '3 2 1'\n\n\ntest \"Test for inline functions with parentheses and implicit calls.\", ->\n\n  combine = (func, num) -> func() * num\n  result  = combine (-> 1 + 2), 3\n  ok result is 9\n\n\ntest \"Test for calls/parens/multiline-chains.\", ->\n\n  f = (x) -> x\n  result = (f 1).toString()\n    .length\n  ok result is 1\n\n\ntest \"Test implicit calls in functions in parens:\", ->\n\n  result = ((val) ->\n    [].push val\n    val\n  )(10)\n  ok result is 10\n\n\ntest \"Ensure that chained calls with indented implicit object literals below are alright.\", ->\n\n  result = null\n  obj =\n    method: (val)  -> this\n    second: (hash) -> result = hash.three\n  obj\n    .method(\n      101\n    ).second(\n      one:\n        two: 2\n      three: 3\n    )\n  eq result, 3\n\n\ntest \"Test newline-supressed call chains with nested functions.\", ->\n\n  obj  =\n    call: -> this\n  func = ->\n    obj\n      .call ->\n        one two\n      .call ->\n        three four\n    101\n  eq func(), 101\n\n\ntest \"Implicit objects with number arguments.\", ->\n\n  func = (x, y) -> y\n  obj =\n    prop: func \"a\", 1\n  ok obj.prop is 1\n\n\ntest \"Non-spaced unary and binary operators should cause a function call.\", ->\n\n  func = (val) -> val + 1\n  ok (func +5) is 6\n  ok (func -5) is -4\n\n\ntest \"Prefix unary assignment operators are allowed in parenless calls.\", ->\n\n  func = (val) -> val + 1\n  val = 5\n  ok (func --val) is 5\n\ntest \"#855: execution context for `func arr...` should be `null`\", ->\n  contextTest = -> eq @, if window? then window else global\n  array = []\n  contextTest array\n  contextTest.apply null, array\n  contextTest array...\n\ntest \"#904: Destructuring function arguments with same-named variables in scope\", ->\n  a = b = nonce = {}\n  fn = ([a,b]) -> {a:a,b:b}\n  result = fn([c={},d={}])\n  eq c, result.a\n  eq d, result.b\n  eq nonce, a\n  eq nonce, b\n\ntest \"Simple Destructuring function arguments with same-named variables in scope\", ->\n  x = 1\n  f = ([x]) -> x\n  eq f([2]), 2\n  eq x, 1\n\ntest \"#4843: Bad output when assigning to @prop in destructuring assignment with defaults\", ->\n  works = \"maybe\"\n  drinks = \"beer\"\n  class A\n    constructor: ({@works = 'no', @drinks = 'wine'}) ->\n  a = new A {works: 'yes', drinks: 'coffee'}\n  eq a.works, 'yes'\n  eq a.drinks, 'coffee'\n\ntest \"caching base value\", ->\n\n  obj =\n    index: 0\n    0: {method: -> this is obj[0]}\n  ok obj[obj.index++].method([]...)\n\n\ntest \"passing splats to functions\", ->\n  arrayEq [0..4], id id [0..4]...\n  fn = (a, b, c..., d) -> [a, b, c, d]\n  range = [0..3]\n  [first, second, others, last] = fn range..., 4, [5...8]...\n  eq 0, first\n  eq 1, second\n  arrayEq [2..6], others\n  eq 7, last\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  arrayEq [0..4], id id [0..4] ...\n  fn = (a, b, c ..., d) -> [a, b, c, d]\n  range = [0..3]\n  [first, second, others, last] = fn range ..., 4, [5 ... 8] ...\n  eq 0, first\n  eq 1, second\n  arrayEq [2..6], others\n  eq 7, last\n\ntest \"splat variables are local to the function\", ->\n  outer = \"x\"\n  clobber = (avar, outer...) -> outer\n  clobber \"foo\", \"bar\"\n  eq \"x\", outer\n\ntest \"Issue 4631: left and right spread dots with preceding space\", ->\n  a = []\n  f = (a) -> a\n  eq yes, (f ...a) is (f ... a) is (f a...) is (f a ...) is f(a...) is f(...a) is f(a ...) is f(... a)\n\ntest \"Issue 894: Splatting against constructor-chained functions.\", ->\n\n  x = null\n  class Foo\n    bar: (y) -> x = y\n  new Foo().bar([101]...)\n  eq x, 101\n\n\ntest \"Functions with splats being called with too few arguments.\", ->\n\n  pen = null\n  method = (first, variable..., penultimate, ultimate) ->\n    pen = penultimate\n  method 1, 2, 3, 4, 5, 6, 7, 8, 9\n  ok pen is 8\n  method 1, 2, 3\n  ok pen is 2\n  method 1, 2\n  ok pen is 2\n\n\ntest \"splats with super() within classes.\", ->\n\n  class Parent\n    meth: (args...) ->\n      args\n  class Child extends Parent\n    meth: ->\n      nums = [3, 2, 1]\n      super nums...\n  ok (new Child).meth().join(' ') is '3 2 1'\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  class Parent\n    meth: (args ...) ->\n      args\n  class Child extends Parent\n    meth: ->\n      nums = [3, 2, 1]\n      super nums ...\n  ok (new Child).meth().join(' ') is '3 2 1'\n\n\ntest \"#1011: passing a splat to a method of a number\", ->\n  eq '1011', 11.toString [2]...\n  eq '1011', (31).toString [3]...\n  eq '1011', 69.0.toString [4]...\n  eq '1011', (131.0).toString [5]...\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  eq '1011', 11.toString [2] ...\n  eq '1011', (31).toString [3] ...\n  eq '1011', 69.0.toString [4] ...\n  eq '1011', (131.0).toString [5] ...\n\ntest \"splats and the `new` operator: functions that return `null` should construct their instance\", ->\n  args = []\n  child = new (constructor = -> null) args...\n  ok child instanceof constructor\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  child = new (constructor = -> null) args ...\n  ok child instanceof constructor\n\ntest \"splats and the `new` operator: functions that return functions should construct their return value\", ->\n  args = []\n  fn = ->\n  child = new (constructor = -> fn) args...\n  ok child not instanceof constructor\n  eq fn, child\n\ntest \"implicit return\", ->\n\n  eq ok, new ->\n    ok\n    ### Should `return` implicitly   ###\n    ### even with trailing comments. ###\n\n\ntest \"implicit returns with multiple branches\", ->\n  nonce = {}\n  fn = ->\n    if false\n      for a in b\n        return c if d\n    else\n      nonce\n  eq nonce, fn()\n\n\ntest \"implicit returns with switches\", ->\n  nonce = {}\n  fn = ->\n    switch nonce\n      when nonce then nonce\n      else return undefined\n  eq nonce, fn()\n\n\ntest \"preserve context when generating closure wrappers for expression conversions\", ->\n  nonce = {}\n  obj =\n    property: nonce\n    method: ->\n      this.result = if false\n        10\n      else\n        \"a\"\n        \"b\"\n        this.property\n  eq nonce, obj.method()\n  eq nonce, obj.property\n\n\ntest \"don't wrap 'pure' statements in a closure\", ->\n  nonce = {}\n  items = [0, 1, 2, 3, nonce, 4, 5]\n  fn = (items) ->\n    for item in items\n      return item if item is nonce\n  eq nonce, fn items\n\n\ntest \"usage of `new` is careful about where the invocation parens end up\", ->\n  eq 'object', typeof new try Array\n  eq 'object', typeof new do -> ->\n  a = b: ->\n  eq 'object', typeof new (do -> a).b\n\n\ntest \"implicit call against control structures\", ->\n  result = null\n  save   = (obj) -> result = obj\n\n  save switch id false\n    when true\n      'true'\n    when false\n      'false'\n\n  eq result, 'false'\n\n  save if id false\n    'false'\n  else\n    'true'\n\n  eq result, 'true'\n\n  save unless id false\n    'true'\n  else\n    'false'\n\n  eq result, 'true'\n\n  save try\n    doesnt exist\n  catch error\n    'caught'\n\n  eq result, 'caught'\n\n  save try doesnt(exist) catch error then 'caught2'\n\n  eq result, 'caught2'\n\n\ntest \"#1420: things like `(fn() ->)`; there are no words for this one\", ->\n  fn = -> (f) -> f()\n  nonce = {}\n  eq nonce, (fn() -> nonce)\n\ntest \"#1416: don't omit one 'new' when compiling 'new new'\", ->\n  nonce = {}\n  obj = new new -> -> {prop: nonce}\n  eq obj.prop, nonce\n\ntest \"#1416: don't omit one 'new' when compiling 'new new fn()()'\", ->\n  nonce = {}\n  argNonceA = {}\n  argNonceB = {}\n  fn = (a) -> (b) -> {a, b, prop: nonce}\n  obj = new new fn(argNonceA)(argNonceB)\n  eq obj.prop, nonce\n  eq obj.a, argNonceA\n  eq obj.b, argNonceB\n\ntest \"#1840: accessing the `prototype` after function invocation should compile\", ->\n  doesNotThrowCompileError 'fn()::prop'\n\n  nonce = {}\n  class Test then id: nonce\n\n  dotAccess = -> Test::\n  protoAccess = -> Test\n\n  eq dotAccess().id, nonce\n  eq protoAccess()::id, nonce\n\ntest \"#960: improved 'do'\", ->\n\n  do (nonExistent = 'one') ->\n    eq nonExistent, 'one'\n\n  overridden = 1\n  do (overridden = 2) ->\n    eq overridden, 2\n\n  two = 2\n  do (one = 1, two, three = 3) ->\n    eq one, 1\n    eq two, 2\n    eq three, 3\n\n  ret = do func = (two) ->\n    eq two, 2\n    func\n  eq ret, func\n\ntest \"#2617: implicit call before unrelated implicit object\", ->\n  pass = ->\n    true\n\n  result = if pass 1\n    one: 1\n  eq result.one, 1\n\ntest \"#2292, b: f (z),(x)\", ->\n  f = (x, y) -> y\n  one = 1\n  two = 2\n  o = b: f (one),(two)\n  eq o.b, 2\n\ntest \"#2297, Different behaviors on interpreting literal\", ->\n  foo = (x, y) -> y\n  bar =\n    baz: foo 100, on\n\n  eq bar.baz, on\n\n  qux = (x) -> x\n  quux = qux\n    corge: foo 100, true\n\n  eq quux.corge, on\n\n  xyzzy =\n    e: 1\n    f: foo\n      a: 1\n      b: 2\n    ,\n      one: 1\n      two: 2\n      three: 3\n    g:\n      a: 1\n      b: 2\n      c: foo 2,\n        one: 1\n        two: 2\n        three: 3\n      d: 3\n    four: 4\n    h: foo one: 1, two: 2, three: three: three: 3,\n      2\n\n  eq xyzzy.f.two, 2\n  eq xyzzy.g.c.three, 3\n  eq xyzzy.four, 4\n  eq xyzzy.h, 2\n\ntest \"#2715, Chained implicit calls\", ->\n  first  = (x)    -> x\n  second = (x, y) -> y\n\n  foo = first first\n    one: 1\n  eq foo.one, 1\n\n  bar = first second\n    one: 1, 2\n  eq bar, 2\n\n  baz = first second\n    one: 1,\n    2\n  eq baz, 2\n\ntest \"Implicit calls and new\", ->\n  first = (x) -> x\n  foo = (@x) ->\n  bar = first new foo first 1\n  eq bar.x, 1\n\n  third = (x, y, z) -> z\n  baz = first new foo new foo third\n        one: 1\n        two: 2\n        1\n        three: 3\n        2\n  eq baz.x.x.three, 3\n\ntest \"Loose tokens inside of explicit call lists\", ->\n  first = (x) -> x\n  second = (x, y) -> y\n  one = 1\n\n  foo = second( one\n                2)\n  eq foo, 2\n\n  bar = first( first\n               one: 1)\n  eq bar.one, 1\n\ntest \"Non-callable literals shouldn't compile\", ->\n  throwsCompileError '1(2)'\n  throwsCompileError '1 2'\n  throwsCompileError '/t/(2)'\n  throwsCompileError '/t/ 2'\n  throwsCompileError '///t///(2)'\n  throwsCompileError '///t/// 2'\n  throwsCompileError \"''(2)\"\n  throwsCompileError \"'' 2\"\n  throwsCompileError '\"\"(2)'\n  throwsCompileError '\"\" 2'\n  throwsCompileError '\"\"\"\"\"\"(2)'\n  throwsCompileError '\"\"\"\"\"\" 2'\n  throwsCompileError '{}(2)'\n  throwsCompileError '{} 2'\n  throwsCompileError '[](2)'\n  throwsCompileError '[] 2'\n  throwsCompileError '[2..9] 2'\n  throwsCompileError '[2..9](2)'\n  throwsCompileError '[1..10][2..9] 2'\n  throwsCompileError '[1..10][2..9](2)'\n\ntest \"implicit invocation with implicit object literal\", ->\n  f = (obj) -> eq 1, obj.a\n\n  f\n    a: 1\n  obj =\n    if f\n      a: 2\n    else\n      a: 1\n  eq 2, obj.a\n\n  f\n    \"a\": 1\n  obj =\n    if f\n      \"a\": 2\n    else\n      \"a\": 1\n  eq 2, obj.a\n\n  # #3935: Implicit call when the first key of an implicit object has interpolation.\n  a = 'a'\n  f\n    \"#{a}\": 1\n  obj =\n    if f\n      \"#{a}\": 2\n    else\n      \"#{a}\": 1\n  eq 2, obj.a\n\ntest \"get and set can be used as function names when not ambiguous with `get`/`set` keywords\", ->\n  get = (val) -> val\n  set = (val) -> val\n  eq 2, get(2)\n  eq 3, set(3)\n  eq 'a', get('a')\n  eq 'b', set('b')\n  eq 4, get 4\n  eq 5, set 5\n  eq 'c', get 'c'\n  eq 'd', set 'd'\n\n  @get = get\n  @set = set\n  eq 6, @get 6\n  eq 7, @set 7\n\n  get = ({val}) -> val\n  set = ({val}) -> val\n  eq 8, get({val: 8})\n  eq 9, set({val: 9})\n  eq 'e', get({val: 'e'})\n  eq 'f', set({val: 'f'})\n  eq 10, get {val: 10}\n  eq 11, set {val: 11}\n  eq 'g', get {val: 'g'}\n  eq 'h', set {val: 'h'}\n\ntest \"get and set can be used as variable and property names\", ->\n  get = 2\n  set = 3\n  eq 2, get\n  eq 3, set\n\n  {get} = {get: 4}\n  {set} = {set: 5}\n  eq 4, get\n  eq 5, set\n\ntest \"get and set can be used as class method names\", ->\n  class A\n    get: -> 2\n    set: -> 3\n\n  a = new A()\n  eq 2, a.get()\n  eq 3, a.set()\n\n  class B\n    @get = -> 4\n    @set = -> 5\n\n  eq 4, B.get()\n  eq 5, B.set()\n\ntest \"#4524: functions named get or set can be used without parentheses when attached to an object\", ->\n  obj =\n    get: (x) -> x + 2\n    set: (x) -> x + 3\n\n  class A\n    get: (x) -> x + 4\n    set: (x) -> x + 5\n\n  a = new A()\n\n  class B\n    get: (x) -> x.value + 6\n    set: (x) -> x.value + 7\n\n  b = new B()\n\n  eq 12, obj.get 10\n  eq 13, obj.set 10\n  eq 12, obj?.get 10\n  eq 13, obj?.set 10\n\n  eq 14, a.get 10\n  eq 15, a.set 10\n\n  @ten = 10\n\n  eq 12, obj.get @ten\n  eq 13, obj.set @ten\n\n  eq 14, a.get @ten\n  eq 15, a.set @ten\n\n  obj.obj = obj\n\n  eq 12, obj.obj.get @ten\n  eq 13, obj.obj.set @ten\n\n  eq 16, b.get value: 10\n  eq 17, b.set value: 10\n\n  eq 16, b.get value: @ten\n  eq 17, b.set value: @ten\n\ntest \"#4836: functions named get or set can be used without parentheses when attached to this or @\", ->\n  @get = (x) -> x + 2\n  @set = (x) -> x + 3\n  @a = 4\n\n  eq 12, this.get 10\n  eq 13, this.set 10\n  eq 12, this?.get 10\n  eq 13, this?.set 10\n  eq 6, this.get @a\n  eq 7, this.set @a\n  eq 6, this?.get @a\n  eq 7, this?.set @a\n\n  eq 12, @get 10\n  eq 13, @set 10\n  eq 12, @?.get 10\n  eq 13, @?.set 10\n  eq 6, @get @a\n  eq 7, @set @a\n  eq 6, @?.get @a\n  eq 7, @?.set @a\n\ntest \"#4852: functions named get or set can be used without parentheses when attached to this or @, with an argument of an implicit object\", ->\n  @get = ({ x }) -> x + 2\n  @set = ({ x }) -> x + 3\n\n  eq 12, @get x: 10\n  eq 13, @set x: 10\n  eq 12, @?.get x: 10\n  eq 13, @?.set x: 10\n  eq 12, this?.get x: 10\n  eq 13, this?.set x: 10\n\ntest \"#4473: variable scope in chained calls\", ->\n  obj =\n    foo: -> this\n    bar: (a) ->\n      a()\n      this\n\n  obj.foo(a = 1).bar(-> a = 2)\n  eq a, 2\n\n  obj.bar(-> b = 2).foo(b = 1)\n  eq b, 1\n\n  obj.foo(c = 1).bar(-> c = 2).foo(c = 3)\n  eq c, 3\n\n  obj.foo([d, e] = [1, 2]).bar(-> d = 4)\n  eq d, 4\n\n  obj.foo({f} = {f: 1}).bar(-> f = 5)\n  eq f, 5\n\ntest \"#5052: implicit call of class with no body\", ->\n  doesNotThrowCompileError 'f class'\n  doesNotThrowCompileError 'f class A'\n  doesNotThrowCompileError 'f class A extends B'\n\n  f = (args...) -> args\n  a = 1\n\n  [klass, shouldBeA] = f class A, a\n  eq shouldBeA, a\n\n  [shouldBeA] = f a, class A\n  eq shouldBeA, a\n\n  [obj, klass, shouldBeA] =\n    f\n      b: 1\n      class A\n      a\n  eq shouldBeA, a\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"functions\">\n# Function Literals\n# -----------------\n\n# TODO: add indexing and method invocation tests: (->)[0], (->).call()\n\n# * Function Definition\n# * Bound Function Definition\n# * Parameter List Features\n#   * Splat Parameters\n#   * Context (@) Parameters\n#   * Parameter Destructuring\n#   * Default Parameters\n\n# Function Definition\n\nx = 1\ny = {}\ny.x = -> 3\nok x is 1\nok typeof(y.x) is 'function'\nok y.x instanceof Function\nok y.x() is 3\n\n# The empty function should not cause a syntax error.\n->\n() ->\n\n# Multiple nested function declarations mixed with implicit calls should not\n# cause a syntax error.\n(one) -> (two) -> three four, (five) -> six seven, eight, (nine) ->\n\n# with multiple single-line functions on the same line.\nfunc = (x) -> (x) -> (x) -> x\nok func(1)(2)(3) is 3\n\n# Make incorrect indentation safe.\nfunc = ->\n  obj = {\n          key: 10\n        }\n  obj.key - 5\neq func(), 5\n\n# Ensure that functions with the same name don't clash with helper functions.\ndel = -> 5\nok del() is 5\n\n\n# Bound Function Definition\n\nobj =\n  bound: ->\n    (=> this)()\n  unbound: ->\n    (-> this)()\n  nested: ->\n    (=>\n      (=>\n        (=> this)()\n      )()\n    )()\neq obj, obj.bound()\nok obj isnt obj.unbound()\neq obj, obj.nested()\n\n\ntest \"even more fancy bound functions\", ->\n  obj =\n    one: ->\n      do =>\n        return this.two()\n    two: ->\n      do =>\n        do =>\n          do =>\n            return this.three\n    three: 3\n\n  eq obj.one(), 3\n\n\ntest \"arguments in bound functions inherit from parent function\", ->\n  # The `arguments` object in an ES arrow function refers to the `arguments`\n  # of the parent scope, just like `this`. In the CoffeeScript 1.x\n  # implementation of `=>`, the `arguments` object referred to the arguments\n  # of the arrow function; but per the ES2015 spec, `arguments` should refer\n  # to the parent.\n  arrayEq ((a...) -> a)([1, 2, 3]), ((a...) => a)([1, 2, 3])\n\n  parent = (a, b, c) ->\n    (bound = =>\n      [arguments[0], arguments[1], arguments[2]]\n    )()\n  arrayEq [1, 2, 3], parent(1, 2, 3)\n\n\ntest \"self-referencing functions\", ->\n  changeMe = ->\n    changeMe = 2\n\n  changeMe()\n  eq changeMe, 2\n\n\n# Parameter List Features\n\ntest \"splats\", ->\n  arrayEq [0, 1, 2], (((splat...) -> splat) 0, 1, 2)\n  arrayEq [2, 3], (((_, _1, splat...) -> splat) 0, 1, 2, 3)\n  arrayEq [0, 1], (((splat..., _, _1) -> splat) 0, 1, 2, 3)\n  arrayEq [2], (((_, _1, splat..., _2) -> splat) 0, 1, 2, 3)\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  arrayEq [0, 1, 2], (((splat ...) -> splat) 0, 1, 2)\n  arrayEq [2, 3], (((_, _1, splat ...) -> splat) 0, 1, 2, 3)\n  arrayEq [0, 1], (((splat ..., _, _1) -> splat) 0, 1, 2, 3)\n  arrayEq [2], (((_, _1, splat ..., _2) -> splat) 0, 1, 2, 3)\n\ntest \"destructured splatted parameters\", ->\n  arr = [0,1,2]\n  splatArray = ([a...]) -> a\n  splatArrayRest = ([a...],b...) -> arrayEq(a,b); b\n  arrayEq splatArray(arr), arr\n  arrayEq splatArrayRest(arr,0,1,2), arr\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  splatArray = ([a ...]) -> a\n  splatArrayRest = ([a ...],b ...) -> arrayEq(a,b); b\n\ntest \"#4884: object-destructured splatted parameters\", ->\n  f = ({length}...) -> length\n  eq f(4, 5, 6), 3\n  f = ({length: len}...) -> len\n  eq f(4, 5, 6), 3\n  f = ({length}..., last) -> [length, last]\n  arrayEq f(4, 5, 6), [2, 6]\n  f = ({length: len}..., last) -> [len, last]\n  arrayEq f(4, 5, 6), [2, 6]\n\ntest \"@-parameters: automatically assign an argument's value to a property of the context\", ->\n  nonce = {}\n\n  ((@prop) ->).call context = {}, nonce\n  eq nonce, context.prop\n\n  # Allow splats alongside the special argument\n  ((splat..., @prop) ->).apply context = {}, [0, 0, nonce]\n  eq nonce, context.prop\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  ((splat ..., @prop) ->).apply context = {}, [0, 0, nonce]\n  eq nonce, context.prop\n\n  # Allow the argument itself to be a splat\n  ((@prop...) ->).call context = {}, 0, nonce, 0\n  eq nonce, context.prop[1]\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  ((@prop ...) ->).call context = {}, 0, nonce, 0\n  eq nonce, context.prop[1]\n\n  # The argument should not be able to be referenced normally\n  code = '((@prop) -> prop).call {}'\n  doesNotThrowCompileError code\n  throws (-> CoffeeScript.run code), ReferenceError\n  code = '((@prop) -> _at_prop).call {}'\n  doesNotThrowCompileError code\n  throws (-> CoffeeScript.run code), ReferenceError\n\ntest \"@-parameters and splats with constructors\", ->\n  a = {}\n  b = {}\n  class Klass\n    constructor: (@first, splat..., @last) ->\n\n  obj = new Klass a, 0, 0, b\n  eq a, obj.first\n  eq b, obj.last\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  class Klass\n    constructor: (@first, splat ..., @last) ->\n\n  obj = new Klass a, 0, 0, b\n  eq a, obj.first\n  eq b, obj.last\n\ntest \"destructuring in function definition\", ->\n  (([{a: [b], c}]...) ->\n    eq 1, b\n    eq 2, c\n  ) {a: [1], c: 2}\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  (([{a: [b], c}] ...) ->\n    eq 1, b\n    eq 2, c\n  ) {a: [1], c: 2}\n\n  context = {}\n  (([{a: [b, c = 2], @d, e = 4}]...) ->\n    eq 1, b\n    eq 2, c\n    eq @d, 3\n    eq context.d, 3\n    eq e, 4\n  ).call context, {a: [1], d: 3}\n\n  (({a: aa = 1, b: bb = 2}) ->\n    eq 5, aa\n    eq 2, bb\n  ) {a: 5}\n\n  ajax = (url, {\n    async = true,\n    beforeSend = (->),\n    cache = true,\n    method = 'get',\n    data = {}\n  }) ->\n    {url, async, beforeSend, cache, method, data}\n\n  fn = ->\n  deepEqual ajax('/home', beforeSend: fn, method: 'post'), {\n    url: '/home', async: true, beforeSend: fn, cache: true, method: 'post', data: {}\n  }\n\ntest \"#4005: `([a = {}]..., b) ->` weirdness\", ->\n  fn = ([a = {}]..., b) -> [a, b]\n  deepEqual fn(5), [{}, 5]\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  fn = ([a = {}] ..., b) -> [a, b]\n  deepEqual fn(5), [{}, 5]\n\ntest \"default values\", ->\n  nonceA = {}\n  nonceB = {}\n  a = (_,_1,arg=nonceA) -> arg\n  eq nonceA, a()\n  eq nonceA, a(0)\n  eq nonceB, a(0,0,nonceB)\n  eq nonceA, a(0,0,undefined)\n  eq null, a(0,0,null) # Per ES2015, `null` doesn’t trigger a parameter default value\n  eq false , a(0,0,false)\n  eq nonceB, a(undefined,undefined,nonceB,undefined)\n  b = (_,arg=nonceA,_1,_2) -> arg\n  eq nonceA, b()\n  eq nonceA, b(0)\n  eq nonceB, b(0,nonceB)\n  eq nonceA, b(0,undefined)\n  eq null, b(0,null)\n  eq false , b(0,false)\n  eq nonceB, b(undefined,nonceB,undefined)\n  c = (arg=nonceA,_,_1) -> arg\n  eq nonceA, c()\n  eq      0, c(0)\n  eq nonceB, c(nonceB)\n  eq nonceA, c(undefined)\n  eq null, c(null)\n  eq false , c(false)\n  eq nonceB, c(nonceB,undefined,undefined)\n\ntest \"default values with @-parameters\", ->\n  a = {}\n  b = {}\n  obj = f: (q = a, @p = b) -> q\n  eq a, obj.f()\n  eq b, obj.p\n\ntest \"default values with splatted arguments\", ->\n  withSplats = (a = 2, b..., c = 3, d = 5) -> a * (b.length + 1) * c * d\n  eq 30, withSplats()\n  eq 15, withSplats(1)\n  eq  5, withSplats(1,1)\n  eq  1, withSplats(1,1,1)\n  eq  2, withSplats(1,1,1,1)\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  withSplats = (a = 2, b ..., c = 3, d = 5) -> a * (b.length + 1) * c * d\n  eq 30, withSplats()\n  eq 15, withSplats(1)\n  eq  5, withSplats(1,1)\n  eq  1, withSplats(1,1,1)\n  eq  2, withSplats(1,1,1,1)\n\ntest \"#156: parameter lists with expansion\", ->\n  expandArguments = (first, ..., lastButOne, last) ->\n    eq 1, first\n    eq 4, lastButOne\n    last\n  eq 5, expandArguments 1, 2, 3, 4, 5\n\n  throwsCompileError \"(..., a, b...) ->\", null, null, \"prohibit expansion and a splat\"\n  throwsCompileError \"(...) ->\",          null, null, \"prohibit lone expansion\"\n\ntest \"#156: parameter lists with expansion in array destructuring\", ->\n  expandArray = (..., [..., last]) ->\n    last\n  eq 3, expandArray 1, 2, 3, [1, 2, 3]\n\ntest \"#3502: variable definitions and expansion\", ->\n  a = b = 0\n  f = (a, ..., b) -> [a, b]\n  arrayEq [1, 5], f 1, 2, 3, 4, 5\n  eq 0, a\n  eq 0, b\n\ntest \"variable definitions and splat\", ->\n  a = b = 0\n  f = (a, middle..., b) -> [a, middle, b]\n  arrayEq [1, [2, 3, 4], 5], f 1, 2, 3, 4, 5\n  eq 0, a\n  eq 0, b\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  f = (a, middle ..., b) -> [a, middle, b]\n  arrayEq [1, [2, 3, 4], 5], f 1, 2, 3, 4, 5\n  eq 0, a\n  eq 0, b\n\ntest \"default values with function calls\", ->\n  doesNotThrowCompileError \"(x = f()) ->\"\n\ntest \"arguments vs parameters\", ->\n  doesNotThrowCompileError \"f(x) ->\"\n  f = (g) -> g()\n  eq 5, f (x) -> 5\n\ntest \"reserved keyword as parameters\", ->\n  f = (_case, @case) -> [_case, @case]\n  [a, b] = f(1, 2)\n  eq 1, a\n  eq 2, b\n\n  f = (@case, _case...) -> [@case, _case...]\n  [a, b, c] = f(1, 2, 3)\n  eq 1, a\n  eq 2, b\n  eq 3, c\n\ntest \"reserved keyword at-splat\", ->\n  f = (@case...) -> @case\n  [a, b] = f(1, 2)\n  eq 1, a\n  eq 2, b\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  f = (@case ...) -> @case\n  [a, b] = f(1, 2)\n  eq 1, a\n  eq 2, b\n\ntest \"#1574: Destructuring and a parameter named _arg\", ->\n  f = ({a, b}, _arg, _arg1) -> [a, b, _arg, _arg1]\n  arrayEq [1, 2, 3, 4], f a: 1, b: 2, 3, 4\n\ntest \"#1844: bound functions in nested comprehensions causing empty var statements\", ->\n  a = ((=>) for a in [0] for b in [0])\n  eq 1, a.length\n\ntest \"#1859: inline function bodies shouldn't modify prior postfix ifs\", ->\n  list = [1, 2, 3]\n  ok true if list.some (x) -> x is 2\n\ntest \"#2258: allow whitespace-style parameter lists in function definitions\", ->\n  func = (\n    a, b, c\n  ) -> c\n  eq func(1, 2, 3), 3\n\n  func = (\n    a\n    b\n    c\n  ) -> b\n  eq func(1, 2, 3), 2\n\ntest \"#2621: fancy destructuring in parameter lists\", ->\n  func = ({ prop1: { key1 }, prop2: { key2, key3: [a, b, c] } }) ->\n    eq(key2, 'key2')\n    eq(a, 'a')\n\n  func({prop1: {key1: 'key1'}, prop2: {key2: 'key2', key3: ['a', 'b', 'c']}})\n\ntest \"#1435 Indented property access\", ->\n  rec = -> rec: rec\n\n  eq 1, do ->\n    rec()\n      .rec ->\n        rec()\n          .rec ->\n            rec.rec()\n          .rec()\n    1\n\ntest \"#1038 Optimize trailing return statements\", ->\n  compile = (code) -> CoffeeScript.compile(code, bare: yes).trim().replace(/\\s+/g, \" \")\n\n  eq \"(function() {});\",                 compile(\"->\")\n  eq \"(function() {});\",                 compile(\"-> return\")\n  eq \"(function() { return void 0; });\", compile(\"-> undefined\")\n  eq \"(function() { return void 0; });\", compile(\"-> return undefined\")\n  eq \"(function() { foo(); });\",         compile(\"\"\"\n                                                 ->\n                                                   foo()\n                                                   return\n                                                 \"\"\")\n\ntest \"#4406 Destructured parameter default evaluation order with incrementing variable\", ->\n  i = 0\n  f = ({ a = ++i }, b = ++i) -> [a, b]\n  arrayEq f({}), [1, 2]\n\ntest \"#4406 Destructured parameter default evaluation order with generator function\", ->\n  current = 0\n  next    = -> ++current\n  foo = ({ a = next() }, b = next()) -> [ a, b ]\n  arrayEq foo({}), [1, 2]\n\ntest \"Destructured parameter with default value, that itself has a default value\", ->\n  # Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment\n  draw = ({size = 'big', coords = {x: 0, y: 0}, radius = 25} = {}) -> \"#{size}-#{coords.x}-#{coords.y}-#{radius}\"\n  output = draw\n    coords:\n      x: 18\n      y: 30\n    radius: 30\n  eq output, 'big-18-30-30'\n\ntest \"#4566: destructuring with nested default values\", ->\n  f = ({a: {b = 1}}) ->\n    b\n  eq 2, f a: b: 2\n\ntest \"#1043: comma after function glyph\", ->\n  x = (a=->, b=2) ->\n    a()\n  eq x(), undefined\n\n  f = (a) -> a()\n  g = f ->, 2\n  eq g, undefined\n  h = f(=>, 2)\n  eq h, undefined\n\ntest \"#3845/#3446: chain after function glyph\", ->\n  angular = module: -> controller: -> controller: ->\n\n  eq undefined,\n    angular.module 'foo'\n    .controller 'EmailLoginCtrl', ->\n    .controller 'EmailSignupCtrl', ->\n\n  beforeEach = (f) -> f()\n  getPromise = -> then: -> catch: ->\n\n  eq undefined,\n    beforeEach ->\n      getPromise()\n      .then (@result) =>\n      .catch (@error) =>\n\n  doThing = -> then: -> catch: (f) -> f()\n  handleError = -> 3\n  eq 3,\n    doThing()\n    .then (@result) =>\n    .catch handleError\n\ntest \"#4413: expressions in function parameters that create generated variables have those variables declared correctly\", ->\n  'use strict'\n  # We’re in strict mode because we want an error to be thrown if the generated\n  # variable (`ref`) is assigned before being declared.\n  foo = -> null\n  bar = -> 33\n  f = (a = foo() ? bar()) -> a\n  g = (a = foo() ? bar()) -> a + 1\n  eq f(), 33\n  eq g(), 34\n\ntest \"#4657: destructured array param declarations\", ->\n  a = 1\n  b = 2\n  f = ([a..., b]) ->\n  f [3, 4, 5]\n  eq a, 1\n  eq b, 2\n\ntest \"#4657: destructured array parameters\", ->\n  f = ([a..., b]) -> {a, b}\n  result = f [1, 2, 3, 4]\n  arrayEq result.a, [1, 2, 3]\n  eq result.b, 4\n\ntest \"#5128: default parameters of function in binary operation\", ->\n  foo = yes or (a, b = {}) -> null\n  eq foo, yes\n\ntest \"#5121: array end bracket after function glyph\", ->\n  a = [->]\n  eq a.length, 1\n\n  b = [c: ->]\n  eq b.length, 1\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"generators\">\n# Generators\n# -----------------\n#\n# * Generator Definition\n\ntest \"most basic generator support\", ->\n  ok -> yield\n\ntest \"empty generator\", ->\n  x = do -> yield return\n\n  y = x.next()\n  ok y.value is undefined and y.done is true\n\ntest \"generator iteration\", ->\n  x = do ->\n    yield 0\n    yield\n    yield 2\n    3\n\n  y = x.next()\n  ok y.value is 0 and y.done is false\n\n  y = x.next()\n  ok y.value is undefined and y.done is false\n\n  y = x.next()\n  ok y.value is 2 and y.done is false\n\n  y = x.next()\n  ok y.value is 3 and y.done is true\n\ntest \"last line yields are returned\", ->\n  x = do ->\n    yield 3\n  y = x.next()\n  ok y.value is 3 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"yield return can be used anywhere in the function body\", ->\n  x = do ->\n    if 2 is yield 1\n      yield return 42\n    throw new Error \"this code shouldn't be reachable\"\n\n  y = x.next()\n  ok y.value is 1 and y.done is false\n\n  y = x.next 2\n  ok y.value is 42 and y.done is true\n\ntest \"`yield from` support\", ->\n  x = do ->\n    yield from do ->\n      yield i for i in [3..4]\n\n  y = x.next()\n  ok y.value is 3 and y.done is false\n\n  y = x.next 1\n  ok y.value is 4 and y.done is false\n\n  y = x.next 2\n  arrayEq y.value, [1, 2]\n  ok y.done is true\n\ntest \"error if `yield from` occurs outside of a function\", ->\n  throwsCompileError 'yield from 1'\n\ntest \"`yield from` at the end of a function errors\", ->\n  throwsCompileError 'x = -> x = 1; yield from'\n\ntest \"yield in if statements\", ->\n  x = do -> if 1 is yield 2 then 3 else 4\n\n  y = x.next()\n  ok y.value is 2 and y.done is false\n\n  y = x.next 1\n  ok y.value is 3 and y.done is true\n\ntest \"yielding if statements\", ->\n  x = do -> yield if true then 3 else 4\n\n  y = x.next()\n  ok y.value is 3 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"yield in for loop expressions\", ->\n  x = do ->\n    y = for i in [1..3]\n      yield i * 2\n\n  z = x.next()\n  ok z.value is 2 and z.done is false\n\n  z = x.next 10\n  ok z.value is 4 and z.done is false\n\n  z = x.next 20\n  ok z.value is 6 and z.done is false\n\n  z = x.next 30\n  arrayEq z.value, [10, 20, 30]\n  ok z.done is true\n\ntest \"yield in switch expressions\", ->\n  x = do ->\n    y = switch yield 1\n      when 2 then yield 1337\n      else 1336\n\n  z = x.next()\n  ok z.value is 1 and z.done is false\n\n  z = x.next 2\n  ok z.value is 1337 and z.done is false\n\n  z = x.next 3\n  ok z.value is 3 and z.done is true\n\ntest \"yielding switch expressions\", ->\n  x = do ->\n    yield switch 1337\n      when 1337 then 1338\n      else 1336\n\n  y = x.next()\n  ok y.value is 1338 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"yield in try expressions\", ->\n  x = do ->\n    try yield 1 catch\n\n  y = x.next()\n  ok y.value is 1 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"yielding try expressions\", ->\n  x = do ->\n    yield try 1\n\n  y = x.next()\n  ok y.value is 1 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"`yield` can be thrown\", ->\n  x = do ->\n    throw yield null\n  x.next()\n  throws -> x.next new Error \"boom\"\n\ntest \"`throw` can be yielded\", ->\n  x = do ->\n    yield throw new Error \"boom\"\n  throws -> x.next()\n\ntest \"symbolic operators has precedence over the `yield`\", ->\n  symbolic   = '+ - * / << >> & | || && ^ // or and'.split ' '\n  compound   = (\"#{op}=\" for op in symbolic)\n  relations  = '< > == != <= >= is isnt'.split ' '\n\n  operators  = [symbolic..., '=', compound..., relations...]\n\n  collect = (gen) -> ref.value until (ref = gen.next()).done\n\n  values = [0, 1, 2, 3]\n  for op in operators\n    expression = \"i #{op} 2\"\n\n    yielded = CoffeeScript.eval \"(arr) ->  yield #{expression} for i in arr\"\n    mapped  = CoffeeScript.eval \"(arr) ->       (#{expression} for i in arr)\"\n\n    arrayEq mapped(values), collect yielded values\n\ntest \"yield handles 'this' correctly\", ->\n  x = ->\n    yield switch\n      when true then yield => this\n    array = for item in [1]\n      yield => this\n    yield array\n    yield if true then yield => this\n    yield try throw yield => this\n    throw yield => this\n\n  y = x.call [1, 2, 3]\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  z = y.next 123\n  ok z.value is 123 and z.done is false\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  z = y.next 42\n  arrayEq z.value, [42]\n  ok z.done is false\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  z = y.next 456\n  ok z.value is 456 and z.done is false\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  z = y.next new Error \"ignore me\"\n  ok z.value is undefined and z.done is false\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  throws -> y.next new Error \"boom\"\n\ntest \"for-from loops over generators\", ->\n  array1 = [50, 30, 70, 20]\n  gen = -> yield from array1\n\n  array2 = []\n  array3 = []\n  array4 = []\n\n  iterator = gen()\n  for x from iterator\n    array2.push(x)\n    break if x is 30\n\n  for x from iterator\n    array3.push(x)\n\n  for x from iterator\n    array4.push(x)\n\n  arrayEq array2, [50, 30]\n  # Different JS engines have different opinions on the value of array3:\n  # https://github.com/jashkenas/coffeescript/pull/4306#issuecomment-257066877\n  # As a temporary measure, either result is accepted.\n  ok array3.length is 0 or array3.join(',') is '70,20'\n  arrayEq array4, []\n\ntest \"for-from comprehensions over generators\", ->\n  gen = ->\n    yield from [30, 41, 51, 60]\n\n  iterator = gen()\n  array1 = (x for x from iterator when x %% 2 is 1)\n  array2 = (x for x from iterator)\n\n  ok array1.join(' ') is '41 51'\n  ok array2.length is 0\n\ntest \"from as an iterable variable name in a for loop declaration\", ->\n  from = [1, 2, 3]\n  out = []\n  for i from from\n    out.push i\n  arrayEq from, out\n\ntest \"from as an iterator variable name in a for loop declaration\", ->\n  a = [1, 2, 3]\n  b = []\n  for from from a\n    b.push from\n  arrayEq a, b\n\ntest \"from as a destructured object variable name in a for loop declaration\", ->\n  a = [\n      from: 1\n      to: 2\n    ,\n      from: 3\n      to: 4\n  ]\n  b = []\n  for {from, to} in a\n    b.push from\n  arrayEq b, [1, 3]\n\n  c = []\n  for {to, from} in a\n    c.push from\n  arrayEq c, [1, 3]\n\ntest \"from as a destructured, aliased object variable name in a for loop declaration\", ->\n  a = [\n      b: 1\n      c: 2\n    ,\n      b: 3\n      c: 4\n  ]\n  out = []\n\n  for {b: from} in a\n    out.push from\n  arrayEq out, [1, 3]\n\ntest \"from as a destructured array variable name in a for loop declaration\", ->\n  a = [\n    [1, 2]\n    [3, 4]\n  ]\n  b = []\n  for [from, to] from a\n    b.push from\n  arrayEq b, [1, 3]\n\ntest \"generator methods in classes\", ->\n  class Base\n    @static: ->\n      yield 1\n    method: ->\n      yield 2\n\n  arrayEq [1], Array.from Base.static()\n  arrayEq [2], Array.from new Base().method()\n\n  class Child extends Base\n    @static: -> super()\n    method: -> super()\n\n  arrayEq [1], Array.from Child.static()\n  arrayEq [2], Array.from new Child().method()\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"helpers\">\n# Helpers\n# -------\n\n# pull the helpers from `CoffeeScript.helpers` into local variables\n{starts, ends, repeat, compact, count, merge, extend, flatten, del, baseFileName} = CoffeeScript.helpers\n\n\n# `starts`\n\ntest \"the `starts` helper tests if a string starts with another string\", ->\n  ok     starts('01234', '012')\n  ok not starts('01234', '123')\n\ntest \"the `starts` helper can take an optional offset\", ->\n  ok     starts('01234', '34', 3)\n  ok not starts('01234', '01', 1)\n\n\n# `ends`\n\ntest \"the `ends` helper tests if a string ends with another string\", ->\n  ok     ends('01234', '234')\n  ok not ends('01234', '012')\n\ntest \"the `ends` helper can take an optional offset\", ->\n  ok     ends('01234', '012', 2)\n  ok not ends('01234', '234', 6)\n\n\n# `repeat`\n\ntest \"the `repeat` helper concatenates a given number of times\", ->\n  eq 'asdasdasd', repeat('asd', 3)\n\ntest \"`repeat`ing a string 0 times always returns the empty string\", ->\n  eq '', repeat('whatever', 0)\n\n\n# `compact`\n\ntest \"the `compact` helper removes falsey values from an array, preserves truthy ones\", ->\n  allValues = [1, 0, false, obj={}, [], '', ' ', -1, null, undefined, true]\n  truthyValues = [1, obj, [], ' ', -1, true]\n  arrayEq truthyValues, compact(allValues)\n\n\n# `count`\n\ntest \"the `count` helper counts the number of occurrences of a string in another string\", ->\n  eq 1/0, count('abc', '')\n  eq 0, count('abc', 'z')\n  eq 1, count('abc', 'a')\n  eq 1, count('abc', 'b')\n  eq 2, count('abcdc', 'c')\n  eq 2, count('abcdabcd','abc')\n\n\n# `merge`\n\ntest \"the `merge` helper makes a new object with all properties of the objects given as its arguments\", ->\n  ary = [0, 1, 2, 3, 4]\n  obj = {}\n  merged = merge obj, ary\n  ok merged isnt obj\n  ok merged isnt ary\n  for own key, val of ary\n    eq val, merged[key]\n\n\n# `extend`\n\ntest \"the `extend` helper performs a shallow copy\", ->\n  ary = [0, 1, 2, 3]\n  obj = {}\n  # should return the object being extended\n  eq obj, extend(obj, ary)\n  # should copy the other object's properties as well (obviously)\n  eq 2, obj[2]\n\n\n# `flatten`\n\ntest \"the `flatten` helper flattens an array\", ->\n  success = yes\n  (success and= typeof n is 'number') for n in flatten [0, [[[1]], 2], 3, [4]]\n  ok success\n\n\n# `del`\n\ntest \"the `del` helper deletes a property from an object and returns the deleted value\", ->\n  obj = [0, 1, 2]\n  eq 1, del(obj, 1)\n  ok 1 not of obj\n\n\n# `baseFileName`\n\ntest \"the `baseFileName` helper returns the file name to write to\", ->\n  ext = '.js'\n  sourceToCompiled =\n    '.coffee': ext\n    'a.coffee': 'a' + ext\n    'b.coffee': 'b' + ext\n    'coffee.coffee': 'coffee' + ext\n\n    '.litcoffee': ext\n    'a.litcoffee': 'a' + ext\n    'b.litcoffee': 'b' + ext\n    'coffee.litcoffee': 'coffee' + ext\n\n    '.lit': ext\n    'a.lit': 'a' + ext\n    'b.lit': 'b' + ext\n    'coffee.lit': 'coffee' + ext\n\n    '.coffee.md': ext\n    'a.coffee.md': 'a' + ext\n    'b.coffee.md': 'b' + ext\n    'coffee.coffee.md': 'coffee' + ext\n\n  for sourceFileName, expectedFileName of sourceToCompiled\n    name = baseFileName sourceFileName, yes\n    filename = name + ext\n    eq filename, expectedFileName\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"import_assertions\">\n# This file is running in CommonJS (in Node) or as a classic Script (in the browser tests) so it can use import() within an async function, but not at the top level; and we can’t use static import.\ntest \"dynamic import assertion\", ->\n  try\n    { default: secret } = await import('data:application/json,{\"ofLife\":42}', { assert: { type: 'json' } })\n    eq secret.ofLife, 42\n  catch exception\n    # This parses on Node 16.14.x but throws an error because JSON modules aren’t unflagged there yet; remove this try/catch once the unflagging of `--experimental-json-modules` is backported (see https://github.com/nodejs/node/pull/41736#issuecomment-1086738670)\n    unless exception.message is 'Invalid module \"data:application/json,{\"ofLife\":42}\" has an unsupported MIME type \"application/json\"'\n      throw exception\n\ntest \"assert keyword\", ->\n  assert = 1\n\n  try\n    { default: assert } = await import('data:application/json,{\"thatIAm\":42}', { assert: { type: 'json' } })\n    eq assert.thatIAm, 42\n  catch exception\n    # This parses on Node 16.14.x but throws an error because JSON modules aren’t unflagged there yet; remove this try/catch once the unflagging of `--experimental-json-modules` is backported (see https://github.com/nodejs/node/pull/41736#issuecomment-1086738670)\n    unless exception.message is 'Invalid module \"data:application/json,{\"thatIAm\":42}\" has an unsupported MIME type \"application/json\"'\n      throw exception\n\n  eqJS \"\"\"\n    import assert from 'regression-test'\n  \"\"\", \"\"\"\n    import assert from 'regression-test';\n  \"\"\"\n\ntest \"static import assertion\", ->\n  eqJS \"\"\"\n    import 'data:application/json,{\"foo\":3}' assert { type: 'json' }\n  \"\"\", \"\"\"\n    import 'data:application/json,{\"foo\":3}' assert {\n      type: 'json'\n    };\n  \"\"\"\n\n  eqJS \"\"\"\n    import secret from 'data:application/json,{\"ofLife\":42}' assert { type: 'json' }\n  \"\"\", \"\"\"\n    import secret from 'data:application/json,{\"ofLife\":42}' assert {\n      type: 'json'\n    };\n  \"\"\"\n\n  eqJS \"\"\"\n    import * as secret from 'data:application/json,{\"ofLife\":42}' assert { type: 'json' }\n  \"\"\", \"\"\"\n    import * as secret from 'data:application/json,{\"ofLife\":42}' assert {\n      type: 'json'\n    };\n  \"\"\"\n\n  # The only file types for which import assertions are currently supported are JSON (Node and browsers) and CSS (browsers), neither of which support named exports; however there’s nothing in the JavaScript grammar preventing a future supported file type from providing named exports.\n  eqJS \"\"\"\n    import { foo } from './file.unknown' assert { type: 'unknown' }\n  \"\"\", \"\"\"\n    import {\n      foo\n    } from './file.unknown' assert {\n        type: 'unknown'\n      };\n  \"\"\"\n\n  eqJS \"\"\"\n    import file, { foo } from './file.unknown' assert { type: 'unknown' }\n  \"\"\", \"\"\"\n    import file, {\n      foo\n    } from './file.unknown' assert {\n        type: 'unknown'\n      };\n  \"\"\"\n\n  eqJS \"\"\"\n    import foo from 'bar' assert {}\n  \"\"\", \"\"\"\n    import foo from 'bar' assert {};\n  \"\"\"\n\ntest \"static export with assertion\", ->\n  eqJS \"\"\"\n    export * from 'data:application/json,{\"foo\":3}' assert { type: 'json' }\n  \"\"\", \"\"\"\n    export * from 'data:application/json,{\"foo\":3}' assert {\n      type: 'json'\n    };\n  \"\"\"\n\n  eqJS \"\"\"\n    export { profile } from './user.json' assert { type: 'json' }\n  \"\"\", \"\"\"\n    export {\n      profile\n    } from './user.json' assert {\n        type: 'json'\n      };\n  \"\"\"\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"importing\">\n# Importing\n# ---------\n\nunless window? or testingBrowser?\n  test \"coffeescript modules can be imported and executed\", ->\n\n    magicKey = __filename\n    magicValue = 0xFFFF\n\n    if global[magicKey]?\n      if exports?\n        local = magicValue\n        exports.method = -> local\n    else\n      global[magicKey] = {}\n      if require?.extensions?\n        ok require(__filename).method() is magicValue\n      delete global[magicKey]\n\n  test \"javascript modules can be imported\", ->\n    magicVal = 1\n    for module in 'import.js import2 .import2 import.extension.js import.unknownextension .coffee .coffee.md'.split ' '\n      ok require(\"./importing/#{module}\").value?() is magicVal, module\n\n  test \"coffeescript modules can be imported\", ->\n    magicVal = 2\n    for module in '.import.coffee import.coffee import.extension.coffee'.split ' '\n      ok require(\"./importing/#{module}\").value?() is magicVal, module\n\n  test \"literate coffeescript modules can be imported\", ->\n    magicVal = 3\n    # Leading space intentional to check for index.coffee.md\n    for module in ' .import.coffee.md import.coffee.md import.litcoffee import.extension.coffee.md'.split ' '\n      ok require(\"./importing/#{module}\").value?() is magicVal, module\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"interpolation\">\n# Interpolation\n# -------------\n\n# * String Interpolation\n# * Regular Expression Interpolation\n\n# String Interpolation\n\n# TODO: refactor string interpolation tests\n\neq 'multiline nested \"interpolations\" work', \"\"\"multiline #{\n  \"nested #{\n    ok true\n    \"\\\"interpolations\\\"\"\n  }\"\n} work\"\"\"\n\n# Issue #923: Tricky interpolation.\neq \"#{ \"{\" }\", \"{\"\neq \"#{ '#{}}' } }\", '#{}} }'\neq \"#{\"'#{ ({a: \"b#{1}\"}['a']) }'\"}\", \"'b1'\"\n\n# Issue #1150: String interpolation regression\neq \"#{'\"/'}\",                '\"/'\neq \"#{\"/'\"}\",                \"/'\"\neq \"#{/'\"/}\",                '/\\'\"/'\neq \"#{\"'/\" + '/\"' + /\"'/}\",  '\\'//\"/\"\\'/'\neq \"#{\"'/\"}#{'/\"'}#{/\"'/}\",  '\\'//\"/\"\\'/'\neq \"#{6 / 2}\",               '3'\neq \"#{6 / 2}#{6 / 2}\",       '33' # parsed as division\neq \"#{6 + /2}#{6/ + 2}\",     '6/2}#{6/2' # parsed as a regex\neq \"#{6/2}\n    #{6/2}\",                 '3 3' # newline cannot be part of a regex, so it's division\neq \"#{/// \"'/'\"/\" ///}\",     '/\"\\'\\\\/\\'\"\\\\/\"/' # heregex, stuffed with spicy characters\neq \"#{/\\\\'/}\",               \"/\\\\\\\\'/\"\n\n# Issue #2321: Regex/division conflict in interpolation\neq \"#{4/2}/\", '2/'\ncurWidth = 4\neq \"<i style='left:#{ curWidth/2 }%;'></i>\",   \"<i style='left:2%;'></i>\"\nthrowsCompileError '''\n   \"<i style='left:#{ curWidth /2 }%;'></i>\"'''\n#                 valid regex--^^^^^^^^^^^ ^--unclosed string\neq \"<i style='left:#{ curWidth/2 }%;'></i>\",   \"<i style='left:2%;'></i>\"\neq \"<i style='left:#{ curWidth/ 2 }%;'></i>\",  \"<i style='left:2%;'></i>\"\neq \"<i style='left:#{ curWidth / 2 }%;'></i>\", \"<i style='left:2%;'></i>\"\n\nhello = 'Hello'\nworld = 'World'\nok '#{hello} #{world}!' is '#{hello} #{world}!'\nok \"#{hello} #{world}!\" is 'Hello World!'\nok \"[#{hello}#{world}]\" is '[HelloWorld]'\nok \"#{hello}##{world}\" is 'Hello#World'\nok \"Hello #{ 1 + 2 } World\" is 'Hello 3 World'\nok \"#{hello} #{ 1 + 2 } #{world}\" is \"Hello 3 World\"\nok 1 + \"#{2}px\" is '12px'\nok isNaN \"a#{2}\" * 2\nok \"#{2}\" is '2'\nok \"#{2}#{2}\" is '22'\n\n[s, t, r, i, n, g] = ['s', 't', 'r', 'i', 'n', 'g']\nok \"#{s}#{t}#{r}#{i}#{n}#{g}\" is 'string'\nok \"\\#{s}\\#{t}\\#{r}\\#{i}\\#{n}\\#{g}\" is '#{s}#{t}#{r}#{i}#{n}#{g}'\nok \"\\#{string}\" is '#{string}'\n\nok \"\\#{Escaping} first\" is '#{Escaping} first'\nok \"Escaping \\#{in} middle\" is 'Escaping #{in} middle'\nok \"Escaping \\#{last}\" is 'Escaping #{last}'\n\nok \"##\" is '##'\nok \"#{}\" is ''\nok \"#{}A#{} #{} #{}B#{}\" is 'A  B'\nok \"\\\\\\#{}\" is '\\\\#{}'\n\nok \"I won ##{20} last night.\" is 'I won #20 last night.'\nok \"I won ##{'#20'} last night.\" is 'I won ##20 last night.'\n\nok \"#{hello + world}\" is 'HelloWorld'\nok \"#{hello + ' ' + world + '!'}\" is 'Hello World!'\n\nlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\nok \"values: #{list.join(', ')}, length: #{list.length}.\" is 'values: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, length: 10.'\nok \"values: #{list.join ' '}\" is 'values: 0 1 2 3 4 5 6 7 8 9'\n\nobj = {\n  name: 'Joe'\n  hi: -> \"Hello #{@name}.\"\n  cya: -> \"Hello #{@name}.\".replace('Hello','Goodbye')\n}\nok obj.hi() is \"Hello Joe.\"\nok obj.cya() is \"Goodbye Joe.\"\n\nok \"With #{\"quotes\"}\" is 'With quotes'\nok 'With #{\"quotes\"}' is 'With #{\"quotes\"}'\n\nok \"Where is #{obj[\"name\"] + '?'}\" is 'Where is Joe?'\n\nok \"Where is #{\"the nested #{obj[\"name\"]}\"}?\" is 'Where is the nested Joe?'\nok \"Hello #{world ? \"#{hello}\"}\" is 'Hello World'\n\nok \"Hello #{\"#{\"#{obj[\"name\"]}\" + '!'}\"}\" is 'Hello Joe!'\n\na = \"\"\"\n    Hello #{ \"Joe\" }\n    \"\"\"\nok a is \"Hello Joe\"\n\na = 1\nb = 2\nc = 3\nok \"#{a}#{b}#{c}\" is '123'\n\nresult = null\nstash = (str) -> result = str\nstash \"a #{ ('aa').replace /a/g, 'b' } c\"\nok result is 'a bb c'\n\nfoo = \"hello\"\nok \"#{foo.replace(\"\\\"\", \"\")}\" is 'hello'\n\nval = 10\na = \"\"\"\n    basic heredoc #{val}\n    on two lines\n    \"\"\"\nb = '''\n    basic heredoc #{val}\n    on two lines\n    '''\nok a is \"basic heredoc 10\\non two lines\"\nok b is \"basic heredoc \\#{val}\\non two lines\"\n\neq 'multiline nested \"interpolations\" work', \"\"\"multiline #{\n  \"nested #{(->\n    ok yes\n    \"\\\"interpolations\\\"\"\n  )()}\"\n} work\"\"\"\n\neq 'function(){}', \"#{->}\".replace /\\s/g, ''\nok /^a[\\s\\S]+b$/.test \"a#{=>}b\"\nok /^a[\\s\\S]+b$/.test \"a#{ (x) -> x %% 2 }b\"\n\n# Regular Expression Interpolation\n\n# TODO: improve heregex interpolation tests\n\ntest \"heregex interpolation\", ->\n  eq /\\\\#{}\\\\\"/ + '', ///\n   #{\n     \"#{ '\\\\' }\" # normal comment\n   }\n   # regex comment\n   \\#{}\n   \\\\ \"\n  /// + ''\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"invocation_argument_parsing\">\nreturn unless require?\n\npath = require 'path'\n{ execFileSync, spawnSync } = require 'child_process'\n\n# Get the folder containing the compiled `coffee` executable and make it the\n# PATH so that `#!/usr/bin/env coffee` resolves to our locally built file.\ncoffeeBinFolder = path.dirname require.resolve '../bin/coffee'\n# For some reason, Windows requires `coffee` to be executed as `node coffee`.\ncoffeeCommand = if isWindows() then 'node coffee' else 'coffee'\nspawnOptions =\n  cwd: coffeeBinFolder\n  encoding: 'utf8'\n  env: Object.assign {}, process.env,\n    PATH: coffeeBinFolder + (if isWindows() then ';' else ':') + process.env.PATH\n  shell: isWindows()\n\nshebangScript = require.resolve './importing/shebang.coffee'\ninitialSpaceScript = require.resolve './importing/shebang_initial_space.coffee'\nextraArgsScript = require.resolve './importing/shebang_extra_args.coffee'\ninitialSpaceExtraArgsScript = require.resolve './importing/shebang_initial_space_extra_args.coffee'\n\ntest \"parse arguments for shebang scripts correctly (on *nix platforms)\", ->\n  return if isWindows()\n\n  stdout = execFileSync shebangScript, ['-abck'], spawnOptions\n  expectedArgs = ['coffee', shebangScript, '-abck']\n  realArgs = JSON.parse stdout\n  arrayEq expectedArgs, realArgs\n\n  stdout = execFileSync initialSpaceScript, ['-abck'], spawnOptions\n  expectedArgs = ['coffee', initialSpaceScript, '-abck']\n  realArgs = JSON.parse stdout\n  arrayEq expectedArgs, realArgs\n\ntest \"warn and remove -- if it is the second positional argument\", ->\n  result = spawnSync coffeeCommand, [shebangScript, '--'], spawnOptions\n  stderr = result.stderr.toString()\n  arrayEq JSON.parse(result.stdout), ['coffee', shebangScript]\n  ok stderr.match /^coffee was invoked with '--'/m\n  posArgs = stderr.match(/^The positional arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(posArgs), [shebangScript, '--']\n  ok result.status is 0\n\n  result = spawnSync coffeeCommand, ['-b', shebangScript, '--'], spawnOptions\n  stderr = result.stderr.toString()\n  arrayEq JSON.parse(result.stdout), ['coffee', shebangScript]\n  ok stderr.match /^coffee was invoked with '--'/m\n  posArgs = stderr.match(/^The positional arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(posArgs), [shebangScript, '--']\n  ok result.status is 0\n\n  result = spawnSync(\n    coffeeCommand, ['-b', shebangScript, '--', 'ANOTHER'], spawnOptions)\n  stderr = result.stderr.toString()\n  arrayEq JSON.parse(result.stdout), ['coffee', shebangScript, 'ANOTHER']\n  ok stderr.match /^coffee was invoked with '--'/m\n  posArgs = stderr.match(/^The positional arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(posArgs), [shebangScript, '--', 'ANOTHER']\n  ok result.status is 0\n\n  result = spawnSync(\n    coffeeCommand, ['--', initialSpaceScript, 'arg'], spawnOptions)\n  expectedArgs = ['coffee', initialSpaceScript, 'arg']\n  realArgs = JSON.parse result.stdout\n  arrayEq expectedArgs, realArgs\n  ok result.stderr.toString() is ''\n  ok result.status is 0\n\ntest \"warn about non-portable shebang lines\", ->\n  result = spawnSync coffeeCommand, [extraArgsScript, 'arg'], spawnOptions\n  stderr = result.stderr.toString()\n  arrayEq JSON.parse(result.stdout), ['coffee', extraArgsScript, 'arg']\n  ok stderr.match /^The script to be run begins with a shebang line with more than one/m\n  [_, firstLine, file] = stderr.match(/^The shebang line was: '([^']+)' in file '([^']+)'/m)\n  ok (firstLine is '#!/usr/bin/env coffee --')\n  ok (file is extraArgsScript)\n  args = stderr.match(/^The arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(args), ['coffee', '--']\n  ok result.status is 0\n\n  result = spawnSync coffeeCommand, [initialSpaceScript, 'arg'], spawnOptions\n  stderr = result.stderr.toString()\n  ok stderr is ''\n  arrayEq JSON.parse(result.stdout), ['coffee', initialSpaceScript, 'arg']\n  ok result.status is 0\n\n  result = spawnSync(\n    coffeeCommand, [initialSpaceExtraArgsScript, 'arg'], spawnOptions)\n  stderr = result.stderr.toString()\n  arrayEq JSON.parse(result.stdout), ['coffee', initialSpaceExtraArgsScript, 'arg']\n  ok stderr.match /^The script to be run begins with a shebang line with more than one/m\n  [_, firstLine, file] = stderr.match(/^The shebang line was: '([^']+)' in file '([^']+)'/m)\n  ok (firstLine is '#! /usr/bin/env coffee extra')\n  ok (file is initialSpaceExtraArgsScript)\n  args = stderr.match(/^The arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(args), ['coffee', 'extra']\n  ok result.status is 0\n\ntest \"both warnings will be shown at once\", ->\n  result = spawnSync(\n    coffeeCommand, [initialSpaceExtraArgsScript, '--', 'arg'], spawnOptions)\n  stderr = result.stderr.toString()\n  arrayEq JSON.parse(result.stdout), ['coffee', initialSpaceExtraArgsScript, 'arg']\n  ok stderr.match /^The script to be run begins with a shebang line with more than one/m\n  [_, firstLine, file] = stderr.match(/^The shebang line was: '([^']+)' in file '([^']+)'/m)\n  ok (firstLine is '#! /usr/bin/env coffee extra')\n  ok (file is initialSpaceExtraArgsScript)\n  args = stderr.match(/^The arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(args), ['coffee', 'extra']\n  ok stderr.match /^coffee was invoked with '--'/m\n  posArgs = stderr.match(/^The positional arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(posArgs), [initialSpaceExtraArgsScript, '--', 'arg']\n  ok result.status is 0\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"javascript_literals\">\n# JavaScript Literals\n# -------------------\n\ntest \"inline JavaScript is evaluated\", ->\n  eq '\\\\`', `\n    // Inline JS\n    \"\\\\\\\\\\`\"\n  `\n\ntest \"escaped backticks are output correctly\", ->\n  `var a = \\`2 + 2 = ${4}\\``\n  eq a, '2 + 2 = 4'\n\ntest \"backslashes before a newline don’t break JavaScript blocks\", ->\n  `var a = \\`To be, or not\\\\\n  to be.\\``\n  eq a, '''\n  To be, or not\\\\\n    to be.'''\n\ntest \"block inline JavaScript is evaluated\", ->\n  ```\n  var a = 1;\n  var b = 2;\n  ```\n  c = 3\n  ```var d = 4;```\n  eq a + b + c + d, 10\n\ntest \"block inline JavaScript containing backticks\", ->\n  ```\n  // This is a comment with `backticks`\n  var a = 42;\n  var b = `foo ${'bar'}`;\n  var c = 3;\n  var d = 'foo`bar`';\n  ```\n  eq a + c, 45\n  eq b, 'foo bar'\n  eq d, 'foo`bar`'\n\ntest \"block JavaScript can end with an escaped backtick character\", ->\n  ```var a = \\`hello\\````\n  ```\n  var b = \\`world${'!'}\\````\n  eq a, 'hello'\n  eq b, 'world!'\n\ntest \"JavaScript block only escapes backslashes followed by backticks\", ->\n  eq `'\\\\\\n'`, '\\\\\\n'\n\ntest \"escaped JavaScript blocks speed round\", ->\n  # The following has escaped backslashes because they’re required in strings, but the intent is this:\n  # `hello`                                       → hello;\n  # `\\`hello\\``                                   → `hello`;\n  # `\\`Escaping backticks in JS: \\\\\\`hello\\\\\\`\\`` → `Escaping backticks in JS: \\`hello\\``;\n  # `Single backslash: \\ `                        → Single backslash: \\ ;\n  # `Double backslash: \\\\ `                       → Double backslash: \\\\ ;\n  # `Single backslash at EOS: \\\\`                 → Single backslash at EOS: \\;\n  # `Double backslash at EOS: \\\\\\\\`               → Double backslash at EOS: \\\\;\n  for [input, output] in [\n    ['`hello`',                                               'hello;']\n    ['`\\\\`hello\\\\``',                                         '`hello`;']\n    ['`\\\\`Escaping backticks in JS: \\\\\\\\\\\\`hello\\\\\\\\\\\\`\\\\``', '`Escaping backticks in JS: \\\\`hello\\\\``;']\n    ['`Single backslash: \\\\ `',                               'Single backslash: \\\\ ;']\n    ['`Double backslash: \\\\\\\\ `',                             'Double backslash: \\\\\\\\ ;']\n    ['`Single backslash at EOS: \\\\\\\\`',                       'Single backslash at EOS: \\\\;']\n    ['`Double backslash at EOS: \\\\\\\\\\\\\\\\`',                   'Double backslash at EOS: \\\\\\\\;']\n  ]\n    eqJS input, output\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"jsx\">\n# We usually do not check the actual JS output from the compiler, but since\n# JSX is not natively supported by Node, we do it in this case.\n\ntest 'self closing', ->\n  eqJS '''\n    <div />\n  ''', '''\n    <div />;\n  '''\n\ntest 'self closing formatting', ->\n  eqJS '''\n    <div/>\n  ''', '''\n    <div />;\n  '''\n\ntest 'self closing multiline', ->\n  eqJS '''\n    <div\n    />\n  ''', '''\n    <div />;\n  '''\n\ntest 'reserved-word self closing', ->\n  eqJS '''\n    <static />\n  ''', '''\n    <static />;\n  '''\n\ntest 'regex attribute', ->\n  eqJS '''\n    <div x={/>asds/} />\n  ''', '''\n    <div x={/>asds/} />;\n  '''\n\ntest 'string attribute', ->\n  eqJS '''\n    <div x=\"a\" />\n  ''', '''\n    <div x=\"a\" />;\n  '''\n\ntest 'simple attribute', ->\n  eqJS '''\n    <div x={42} />\n  ''', '''\n    <div x={42} />;\n  '''\n\ntest 'assignment attribute', ->\n  eqJS '''\n    <div x={y = 42} />\n  ''', '''\n    var y;\n\n    <div x={y = 42} />;\n  '''\n\ntest 'object attribute', ->\n  eqJS '''\n    <div x={{y: 42}} />\n  ''', '''\n    <div x={{\n      y: 42\n    }} />;\n  '''\n\ntest 'attribute without value', ->\n  eqJS '''\n    <div checked x=\"hello\" />\n  ''', '''\n    <div checked x=\"hello\" />;\n  '''\n\ntest 'reserved-word attribute without value', ->\n  eqJS '''\n    <div static x=\"hello\" />\n  ''', '''\n    <div static x=\"hello\" />;\n  '''\n\ntest 'reserved-word attribute with value', ->\n  eqJS '''\n    <div static=\"yes\" x=\"hello\" />\n  ''', '''\n    <div static=\"yes\" x=\"hello\" />;\n  '''\n\ntest 'attribute with namespace', ->\n  eqJS '''\n    <image xlink:href=\"data:image/png\" />\n  ''', '''\n    <image xlink:href=\"data:image/png\" />;\n  '''\n\ntest 'attribute with double namespace disallowed', ->\n  throwsCompileError '<image xlink:href:tag=\"data:image/png\" />'\n\ntest 'attribute with member expression disallowed', ->\n  throwsCompileError '<image xlink.href=\"data:image/png\" />'\n\ntest 'paired', ->\n  eqJS '''\n    <div></div>\n  ''', '''\n    <div></div>;\n  '''\n\ntest 'simple content', ->\n  eqJS '''\n    <div>Hello world</div>\n  ''', '''\n    <div>Hello world</div>;\n  '''\n\ntest 'content interpolation', ->\n  eqJS '''\n    <div>Hello {42}</div>\n  ''', '''\n    <div>Hello {42}</div>;\n  '''\n\ntest 'nested tag', ->\n  eqJS '''\n    <div><span /></div>\n  ''', '''\n    <div><span /></div>;\n  '''\n\ntest 'tag inside interpolation formatting', ->\n  eqJS '''\n    <div>Hello {<span />}</div>\n  ''', '''\n    <div>Hello <span /></div>;\n  '''\n\ntest 'tag inside interpolation, tags are callable', ->\n  eqJS '''\n    <div>Hello {<span /> x}</div>\n  ''', '''\n    <div>Hello {<span />(x)}</div>;\n  '''\n\ntest 'tags inside interpolation, tags trigger implicit calls', ->\n  eqJS '''\n    <div>Hello {f <span />}</div>\n  ''', '''\n    <div>Hello {f(<span />)}</div>;\n  '''\n\ntest 'regex in interpolation', ->\n  eqJS '''\n    <div x={/>asds/}><div />{/>asdsad</}</div>\n  ''', '''\n    <div x={/>asds/}><div />{/>asdsad</}</div>;\n  '''\n\ntest 'interpolation in string attribute value', ->\n  eqJS '''\n    <div x=\"Hello #{world}\" />\n  ''', '''\n    <div x={`Hello ${world}`} />;\n  '''\n\n# Unlike in `coffee-react-transform`.\ntest 'bare numbers not allowed', ->\n  throwsCompileError '<div x=3 />'\n\ntest 'bare expressions not allowed', ->\n  throwsCompileError '<div x=y />'\n\ntest 'bare complex expressions not allowed', ->\n  throwsCompileError '<div x=f(3) />'\n\ntest 'unescaped opening tag angle bracket disallowed', ->\n  throwsCompileError '<Person><<</Person>'\n\ntest 'space around equal sign', ->\n  eqJS '''\n    <div popular = \"yes\" />\n  ''', '''\n    <div popular=\"yes\" />;\n  '''\n\n# The following tests were adopted from James Friend’s\n# [https://github.com/jsdf/coffee-react-transform](https://github.com/jsdf/coffee-react-transform).\n\ntest 'ambiguous tag-like expression', ->\n  throwsCompileError 'x = a <b > c'\n\ntest 'ambiguous tag', ->\n  eqJS '''\n    a <b > c </b>\n  ''', '''\n    a(<b> c </b>);\n  '''\n\ntest 'escaped CoffeeScript attribute', ->\n  eqJS '''\n    <Person name={if test() then 'yes' else 'no'} />\n  ''', '''\n    <Person name={test() ? 'yes' : 'no'} />;\n  '''\n\ntest 'escaped CoffeeScript attribute over multiple lines', ->\n  eqJS '''\n    <Person name={\n      if test()\n        'yes'\n      else\n        'no'\n    } />\n  ''', '''\n    <Person name={test() ? 'yes' : 'no'} />;\n  '''\n\ntest 'multiple line escaped CoffeeScript with nested JSX', ->\n  eqJS '''\n    <Person name={\n      if test()\n        'yes'\n      else\n        'no'\n    }>\n    {\n\n      for n in a\n        <div> a\n          asf\n          <li xy={\"as\"}>{ n+1 }<a /> <a /> </li>\n        </div>\n    }\n\n    </Person>\n  ''', '''\n    var n;\n\n    <Person name={test() ? 'yes' : 'no'}>\n    {(function() {\n      var i, len, results;\n      results = [];\n      for (i = 0, len = a.length; i < len; i++) {\n        n = a[i];\n        results.push(<div> a\n          asf\n          <li xy={\"as\"}>{n + 1}<a /> <a /> </li>\n        </div>);\n      }\n      return results;\n    })()}\n\n    </Person>;\n  '''\n\ntest 'nested JSX within an attribute, with object attr value', ->\n  eqJS '''\n    <Company>\n      <Person name={<NameComponent attr3={ {'a': {}, b: '{'} } />} />\n    </Company>\n  ''', '''\n    <Company>\n      <Person name={<NameComponent attr3={{\n      'a': {},\n      b: '{'\n    }} />} />\n    </Company>;\n  '''\n\ntest 'complex nesting', ->\n  eqJS '''\n    <div code={someFunc({a:{b:{}, C:'}{}{'}})} />\n  ''', '''\n    <div code={someFunc({\n      a: {\n        b: {},\n        C: '}{}{'\n      }\n    })} />;\n  '''\n\ntest 'multiline tag with nested JSX within an attribute', ->\n  eqJS '''\n    <Person\n      name={\n        name = formatName(user.name)\n        <NameComponent name={name.toUppercase()} />\n      }\n    >\n      blah blah blah\n    </Person>\n  ''', '''\n    var name;\n\n    <Person name={name = formatName(user.name), <NameComponent name={name.toUppercase()} />}>\n      blah blah blah\n    </Person>;\n  '''\n\ntest 'escaped CoffeeScript with nested object literals', ->\n  eqJS '''\n    <Person>\n      blah blah blah {\n        {'a' : {}, 'asd': 'asd'}\n      }\n    </Person>\n  ''', '''\n    <Person>\n      blah blah blah {{\n      'a': {},\n      'asd': 'asd'\n    }}\n    </Person>;\n  '''\n\ntest 'multiline tag attributes with escaped CoffeeScript', ->\n  eqJS '''\n    <Person name={if isActive() then 'active' else 'inactive'}\n    someattr='on new line' />\n  ''', '''\n    <Person name={isActive() ? 'active' : 'inactive'} someattr='on new line' />;\n  '''\n\ntest 'lots of attributes', ->\n  eqJS '''\n    <Person eyes={2} friends={getFriends()} popular = \"yes\"\n    active={ if isActive() then 'active' else 'inactive' } data-attr='works' checked check={me_out}\n    />\n  ''', '''\n    <Person eyes={2} friends={getFriends()} popular=\"yes\" active={isActive() ? 'active' : 'inactive'} data-attr='works' checked check={me_out} />;\n  '''\n\n# TODO: fix partially indented JSX\n# test 'multiline elements', ->\n#   eqJS '''\n#     <div something={\n#       do ->\n#         test = /432/gm # this is a regex\n#         6 /432/gm # this is division\n#     }\n#     >\n#     <div>\n#     <div>\n#     <div>\n#       <article name={ new Date() } number={203}\n#        range={getRange()}\n#       >\n#       </article>\n#     </div>\n#     </div>\n#     </div>\n#     </div>\n#   ''', '''\n#     bla\n#   '''\n\ntest 'complex regex', ->\n  eqJS '''\n    <Person />\n    /\\\\/\\\\/<Person \\\\/>\\\\>\\\\//\n  ''', '''\n    <Person />;\n\n    /\\\\/\\\\/<Person \\\\/>\\\\>\\\\//;\n  '''\n\ntest 'heregex', ->\n  eqJS '''\n    test = /432/gm # this is a regex\n    6 /432/gm # this is division\n    <Tag>\n    {test = /<Tag>/} this is a regex containing something which looks like a tag\n    </Tag>\n    <Person />\n    REGEX = /// ^\n      (/ (?! [\\s=] )   # comment comment <comment>comment</comment>\n      [^ [ / \\n \\\\ ]*  # comment comment\n      (?:\n        <Tag />\n        (?: \\\\[\\s\\S]   # comment comment\n          | \\[         # comment comment\n               [^ \\] \\n \\\\ ]*\n               (?: \\\\[\\s\\S] [^ \\] \\n \\\\ ]* )*\n               <Tag>tag</Tag>\n             ]\n        ) [^ [ / \\n \\\\ ]*\n      )*\n      /) ([imgy]{0,4}) (?!\\w)\n    ///\n    <Person />\n  ''', '''\n    var REGEX, test;\n\n    test = /432/gm; // this is a regex\n\n    6 / 432 / gm; // this is division\n\n    <Tag>\n    {test = /<Tag>/} this is a regex containing something which looks like a tag\n    </Tag>;\n\n    <Person />;\n\n    REGEX = /^(\\\\/(?![s=])[^[\\\\/ ]*(?:<Tag\\\\/>(?:\\\\[sS]|[[^] ]*(?:\\\\[sS][^] ]*)*<Tag>tag<\\\\/Tag>])[^[\\\\/ ]*)*\\\\/)([imgy]{0,4})(?!w)/; // comment comment <comment>comment</comment>\n    // comment comment\n    // comment comment\n    // comment comment\n\n    <Person />;\n  '''\n\ntest 'comment within JSX is not treated as comment', ->\n  eqJS '''\n    <Person>\n    # i am not a comment\n    </Person>\n  ''', '''\n    <Person>\n    # i am not a comment\n    </Person>;\n  '''\n\ntest 'comment at start of JSX escape', ->\n  eqJS '''\n    <Person>\n    {# i am a comment\n      \"i am a string\"\n    }\n    </Person>\n  ''', '''\n    <Person>\n    {// i am a comment\n    \"i am a string\"}\n    </Person>;\n  '''\n\ntest 'comment at end of JSX escape', ->\n  eqJS '''\n    <Person>\n    {\"i am a string\"\n    # i am a comment\n    }\n    </Person>\n  ''', '''\n    <Person>\n    {\"i am a string\"\n    // i am a comment\n    }\n    </Person>;\n  '''\n\ntest 'JSX comment cannot be used inside interpolation', ->\n  throwsCompileError '''\n    <Person>\n    {# i am a comment}\n    </Person>\n  '''\n\ntest 'comment syntax cannot be used inline', ->\n  throwsCompileError '''\n    <Person>{#comment inline}</Person>\n  '''\n\ntest 'string within JSX is ignored', ->\n  eqJS '''\n    <Person> \"i am not a string\" 'nor am i' </Person>\n  ''', '''\n    <Person> \"i am not a string\" 'nor am i' </Person>;\n  '''\n\ntest 'special chars within JSX are ignored', ->\n  eqJS \"\"\"\n    <Person> a,/';][' a\\''@$%^&˚¬∑˜˚∆å∂¬˚*()*&^%$>> '\"''\"'''\\'\\'m' i </Person>\n  \"\"\", \"\"\"\n    <Person> a,/';][' a''@$%^&˚¬∑˜˚∆å∂¬˚*()*&^%$>> '\"''\"'''''m' i </Person>;\n  \"\"\"\n\ntest 'html entities (name, decimal, hex) within JSX', ->\n  eqJS '''\n    <Person>  &&&&euro;  &#8364; &#x20AC;;; </Person>\n  ''', '''\n    <Person>  &&&&euro;  &#8364; &#x20AC;;; </Person>;\n  '''\n\ntest 'tag with {{}}', ->\n  eqJS '''\n    <Person name={{value: item, key, item}} />\n  ''', '''\n    <Person name={{\n      value: item,\n      key,\n      item\n    }} />;\n  '''\n\ntest 'tag with member expression', ->\n  eqJS '''\n    <Something.Tag></Something.Tag>\n  ''', '''\n    <Something.Tag></Something.Tag>;\n  '''\n\ntest 'tag with lowercase member expression', ->\n  eqJS '''\n    <something.tag></something.tag>\n  ''', '''\n    <something.tag></something.tag>;\n  '''\n\ntest 'self closing tag with member expression', ->\n  eqJS '''\n    <Something.Tag />\n  ''', '''\n    <Something.Tag />;\n  '''\n\ntest 'self closing tag with multiple member expressions', ->\n  eqJS '''\n    <Something.Tag.More />\n  ''', '''\n    <Something.Tag.More />;\n  '''\n\ntest 'tag with namespace', ->\n  eqJS '''\n    <Something:Tag></Something:Tag>\n  ''', '''\n    <Something:Tag></Something:Tag>;\n  '''\n\ntest 'tag with lowercase namespace', ->\n  eqJS '''\n    <something:tag></something:tag>\n  ''', '''\n    <something:tag></something:tag>;\n  '''\n\ntest 'self closing tag with namespace', ->\n  eqJS '''\n    <Something:Tag />\n  ''', '''\n    <Something:Tag />;\n  '''\n\ntest 'self closing tag with namespace and member expression disallowed', ->\n  throwsCompileError '''\n    <Namespace:Something.Tag />\n  '''\n\ntest 'self closing tag with spread attribute', ->\n  eqJS '''\n    <Component a={b} {x...} b=\"c\" />\n  ''', '''\n    <Component a={b} {...x} b=\"c\" />;\n  '''\n\ntest 'complex spread attribute', ->\n  eqJS '''\n    <Component {x...} a={b} {x...} b=\"c\" {$my_xtraCoolVar123...} />\n  ''', '''\n    <Component {...x} a={b} {...x} b=\"c\" {...$my_xtraCoolVar123} />;\n  '''\n\ntest 'multiline spread attribute', ->\n  eqJS '''\n    <Component {\n      x...} a={b} {x...} b=\"c\" {z...}>\n    </Component>\n  ''', '''\n    <Component {...x} a={b} {...x} b=\"c\" {...z}>\n    </Component>;\n  '''\n\ntest 'multiline tag with spread attribute', ->\n  eqJS '''\n    <Component\n      z=\"1\"\n      {x...}\n      a={b}\n      b=\"c\"\n    >\n    </Component>\n  ''', '''\n    <Component z=\"1\" {...x} a={b} b=\"c\">\n    </Component>;\n  '''\n\ntest 'multiline tag with spread attribute first', ->\n  eqJS '''\n    <Component\n      {x...}\n      z=\"1\"\n      a={b}\n      b=\"c\"\n    >\n    </Component>\n  ''', '''\n    <Component {...x} z=\"1\" a={b} b=\"c\">\n    </Component>;\n  '''\n\ntest 'complex multiline spread attribute', ->\n  eqJS '''\n    <Component\n      {y...\n      } a={b} {x...} b=\"c\" {z...}>\n      <div code={someFunc({a:{b:{}, C:'}'}})} />\n    </Component>\n  ''', '''\n    <Component {...y} a={b} {...x} b=\"c\" {...z}>\n      <div code={someFunc({\n      a: {\n        b: {},\n        C: '}'\n      }\n    })} />\n    </Component>;\n  '''\n\ntest 'self closing spread attribute on single line', ->\n  eqJS '''\n    <Component a=\"b\" c=\"d\" {@props...} />\n  ''', '''\n    <Component a=\"b\" c=\"d\" {...this.props} />;\n  '''\n\ntest 'self closing spread attribute on new line', ->\n  eqJS '''\n    <Component\n      a=\"b\"\n      c=\"d\"\n      {@props...}\n    />\n  ''', '''\n    <Component a=\"b\" c=\"d\" {...this.props} />;\n  '''\n\ntest 'self closing spread attribute on same line', ->\n  eqJS '''\n    <Component\n      a=\"b\"\n      c=\"d\"\n      {@props...} />\n  ''', '''\n    <Component a=\"b\" c=\"d\" {...this.props} />;\n  '''\n\ntest 'self closing spread attribute on next line', ->\n  eqJS '''\n    <Component\n      a=\"b\"\n      c=\"d\"\n      {@props...}\n\n    />\n  ''', '''\n    <Component a=\"b\" c=\"d\" {...this.props} />;\n  '''\n\ntest 'empty strings are not converted to true', ->\n  eqJS '''\n    <Component val=\"\" />\n  ''', '''\n    <Component val=\"\" />;\n  '''\n\ntest 'CoffeeScript @ syntax in tag name', ->\n  throwsCompileError '''\n    <@Component>\n      <Component />\n    </@Component>\n  '''\n\ntest 'hyphens in tag names', ->\n  eqJS '''\n    <paper-button className=\"button\">{text}</paper-button>\n  ''', '''\n    <paper-button className=\"button\">{text}</paper-button>;\n  '''\n\ntest 'closing tags must be closed', ->\n  throwsCompileError '''\n    <a></a\n  '''\n\n# Tests for allowing less than operator without spaces when ther is no JSX\n\ntest 'unspaced less than without JSX: identifier', ->\n  a = 3\n  div = 5\n  ok a<div\n\ntest 'unspaced less than without JSX: number', ->\n  div = 5\n  ok 3<div\n\ntest 'unspaced less than without JSX: paren', ->\n  div = 5\n  ok (3)<div\n\ntest 'unspaced less than without JSX: index', ->\n  div = 5\n  a = [3]\n  ok a[0]<div\n\ntest 'tag inside JSX works following: identifier', ->\n  eqJS '''\n    <span>a<div /></span>\n  ''', '''\n    <span>a<div /></span>;\n  '''\n\ntest 'tag inside JSX works following: number', ->\n  eqJS '''\n    <span>3<div /></span>\n  ''', '''\n    <span>3<div /></span>;\n  '''\n\ntest 'tag inside JSX works following: paren', ->\n  eqJS '''\n    <span>(3)<div /></span>\n  ''', '''\n    <span>(3)<div /></span>;\n  '''\n\ntest 'tag inside JSX works following: square bracket', ->\n  eqJS '''\n    <span>]<div /></span>\n  ''', '''\n    <span>]<div /></span>;\n  '''\n\ntest 'unspaced less than inside JSX works but is not encouraged', ->\n  eqJS '''\n      a = 3\n      div = 5\n      html = <span>{a<div}</span>\n    ''', '''\n      var a, div, html;\n\n      a = 3;\n\n      div = 5;\n\n      html = <span>{a < div}</span>;\n    '''\n\ntest 'unspaced less than before JSX works but is not encouraged', ->\n  eqJS '''\n      div = 5\n      res = 2<div\n      html = <span />\n    ''', '''\n      var div, html, res;\n\n      div = 5;\n\n      res = 2 < div;\n\n      html = <span />;\n    '''\n\ntest 'unspaced less than after JSX works but is not encouraged', ->\n  eqJS '''\n      div = 5\n      html = <span />\n      res = 2<div\n    ''', '''\n      var div, html, res;\n\n      div = 5;\n\n      html = <span />;\n\n      res = 2 < div;\n    '''\n\ntest '#4686: comments inside interpolations that also contain JSX tags', ->\n  eqJS '''\n    <div>\n      {\n        # comment\n        <div />\n      }\n    </div>\n  ''', '''\n    <div>\n      {  // comment\n    <div />}\n    </div>;\n  '''\n\ntest '#4686: comments inside interpolations that also contain JSX attributes', ->\n  eqJS '''\n    <div>\n      <div anAttr={\n        # comment\n        \"value\"\n      } />\n    </div>\n  ''', '''\n    <div>\n      {  // comment\n    <div anAttr={\"value\"} />}\n    </div>;\n  '''\n\ntest '#5086: comments inside JSX tags but outside interpolations', ->\n  eqJS '''\n    <div>\n      <div ###comment### attribute={value} />\n    </div>\n  ''', '''\n    <div>\n      <div /*comment*/attribute={value} />\n    </div>;\n  '''\n\ntest '#5086: comments inside JSX attributes but outside interpolations', ->\n  eqJS '''\n    <div>\n      <div attribute={###attr comment### value} />\n    </div>\n  ''', '''\n    <div>\n      <div attribute={/*attr comment*/value} />\n    </div>;\n  '''\n\ntest '#5086: comments inside nested JSX tags and attributes but outside interpolations', ->\n  eqJS '''\n    <div>\n      <div>\n        <div>\n          <div ###comment### attribute={###attr comment### value} />\n        </div>\n      </div>\n    </div>\n  ''', '''\n    <div>\n      <div>\n        <div>\n          <div /*comment*/attribute={/*attr comment*/value} />\n        </div>\n      </div>\n    </div>;\n  '''\n\n# https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html\ntest 'JSX fragments: empty fragment', ->\n  eqJS '''\n    <></>\n  ''', '''\n    <></>;\n  '''\n\ntest 'JSX fragments: fragment with text nodes', ->\n  eqJS '''\n    <>\n      Some text.\n      <h2>A heading</h2>\n      More text.\n      <h2>Another heading</h2>\n      Even more text.\n    </>\n  ''', '''\n    <>\n      Some text.\n      <h2>A heading</h2>\n      More text.\n      <h2>Another heading</h2>\n      Even more text.\n    </>;\n  '''\n\ntest 'JSX fragments: fragment with component nodes', ->\n  eqJS '''\n    Component = (props) =>\n      <Fragment>\n        <OtherComponent />\n        <OtherComponent />\n      </Fragment>\n  ''', '''\n    var Component;\n\n    Component = (props) => {\n      return <Fragment>\n        <OtherComponent />\n        <OtherComponent />\n      </Fragment>;\n    };\n  '''\n\ntest '#5055: JSX expression indentation bug', ->\n  eqJS '''\n    <div>\n      {someCondition &&\n        <span />\n      }\n    </div>\n  ''', '''\n    <div>\n      {someCondition && <span />}\n    </div>;\n  '''\n\n  eqJS '''\n    <div>{someString +\n         \"abc\"\n      }\n    </div>\n  ''', '''\n    <div>{someString + \"abc\"}\n    </div>;\n  '''\n\n  eqJS '''\n    <div>\n      {a ?\n      <span />\n      }\n    </div>\n  ''', '''\n    <div>\n      {typeof a !== \"undefined\" && a !== null ? a : <span />}\n    </div>;\n  '''\n\n# JSX is like XML, in that there needs to be a root element; but\n# technically, adjacent top-level elements where only the last one\n# is returned (as opposed to a fragment or root element) is permissible\n# syntax. It’s almost certainly an error, but it’s valid, so need to leave it\n# to linters to catch. https://github.com/jashkenas/coffeescript/pull/5049\ntest '“Adjacent” tags on separate lines should still compile', ->\n  eqJS '''\n    ->\n      <a />\n      <b />\n  ''', '''\n    (function() {\n      <a />;\n      return <b />;\n    });\n  '''\n\ntest '#5352: triple-quoted non-interpolated attribute values', ->\n  eqJS '''\n    <div a=\"\"\"\n      b\n      c\n    \"\"\" />\n  ''', '''\n    <div a={`b\n    c`} />;\n  '''\n\n  eqJS \"\"\"\n    <div a='''\n      b\n      c\n    ''' />\n  \"\"\", '''\n    <div a={`b\n    c`} />;\n  '''\n\n</script>\n<script type=\"text/x-literate-coffeescript\" class=\"test\" id=\"literate\">\n# Literate CoffeeScript Test\n\ncomment comment\n\n    testsCount = 0 # Track the number of tests run in this file, to make sure they all run\n\n    test \"basic literate CoffeeScript parsing\", ->\n      ok yes\n      testsCount++\n\nnow with a...\n\n    test \"broken up indentation\", ->\n\n... broken up ...\n\n      do ->\n\n... nested block.\n\n        ok yes\n        testsCount++\n\nCode must be separated from text by a blank line.\n\n    test \"code blocks must be preceded by a blank line\", ->\n\nThe next line is part of the text and will not be executed.\n      fail()\n\n      ok yes\n      testsCount++\n\nCode in `backticks is not parsed` and...\n\n    test \"comments in indented blocks work\", ->\n      do ->\n        do ->\n          # Regular comment.\n\n          ###\n            Block comment.\n          ###\n\n          ok yes\n          testsCount++\n\nRegular [Markdown](http://example.com/markdown) features, like links\nand unordered lists, are fine:\n\n  * I\n\n  * Am\n\n  * A\n\n  * List\n\n---\n\n    # keep track of whether code blocks are executed or not\n    executed = false\n\n<p>\n\nif true\n  executed = true # should not execute, this is just HTML para, not code!\n\n</p>\n\n    test \"should ignore code blocks inside HTML\", ->\n      eq executed, false\n      testsCount++\n\n---\n\n*   A list item followed by a code block:\n\n    test \"basic literate CoffeeScript parsing\", ->\n      ok yes\n      testsCount++\n\n---\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\n*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n    Suspendisse id sem consectetuer libero luctus adipiscing.\n\n---\n\nThis is [an example][id] reference-style link.\n[id]: http://example.com/  \"Optional Title Here\"\n\n---\n\n    executed = no\n\n1986. What a great season.\n\n    executed = yes\n\nand test...\n\n    test \"should recognize indented code blocks in lists with empty line as separator\", ->\n      ok executed\n      testsCount++\n\n---\n\n    executed = no\n\n1986\\. What a great season.\n           executed = yes\n\nand test...\n\n    test \"should ignore indented code in escaped list like number\", ->\n      eq executed, no\n      testsCount++\n\none last test!\n\n    test \"block quotes should render correctly\", ->\n      quote = '''\n        foo\n           and bar!\n      '''\n      eq quote, 'foo\\n   and bar!'\n      testsCount++\n\nand finally, how did we do?\n\n    test \"all spaced literate CoffeeScript tests executed\", ->\n      eq testsCount, 9\n\n</script>\n<script type=\"text/x-literate-coffeescript\" class=\"test\" id=\"literate_tabbed\">\n# Tabbed Literate CoffeeScript Test\n\ncomment comment\n\n\ttestsCount = 0 # Track the number of tests run in this file, to make sure they all run\n\n\ttest \"basic literate CoffeeScript parsing\", ->\n\t\tok yes\n\t\ttestsCount++\n\nnow with a...\n\n\ttest \"broken up indentation\", ->\n\n... broken up ...\n\n\t\tdo ->\n\n... nested block.\n\n\t\t\tok yes\n\t\t\ttestsCount++\n\nCode must be separated from text by a blank line.\n\n\ttest \"code blocks must be preceded by a blank line\", ->\n\nThe next line is part of the text and will not be executed.\n    fail()\n\n\t\tok yes\n\t\ttestsCount++\n\nCode in `backticks is not parsed` and...\n\n\ttest \"comments in indented blocks work\", ->\n\t\tdo ->\n\t\t\tdo ->\n\t\t\t\t# Regular comment.\n\n\t\t\t\t###\n\t\t\t\t\tBlock comment.\n\t\t\t\t###\n\n\t\t\t\tok yes\n\t\t\t\ttestsCount++\n\nRegular [Markdown](http://example.com/markdown) features, like links\nand unordered lists, are fine:\n\n  * I\n\n  * Am\n\n  * A\n\n  * List\n\n---\n\n\t# keep track of whether code blocks are executed or not\n\texecuted = false\n\n<p>\n\nif true\n\texecuted = true # should not execute, this is just HTML para, not code!\n\n</p>\n\n\ttest \"should ignore code blocks inside HTML\", ->\n\t\teq executed, false\n\t\ttestsCount++\n\n---\n\n*   A list item followed by a code block:\n\n\ttest \"basic literate CoffeeScript parsing\", ->\n\t\tok yes\n\t\ttestsCount++\n\n---\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\n*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n    Suspendisse id sem consectetuer libero luctus adipiscing.\n\n---\n\nThis is [an example][id] reference-style link.\n[id]: http://example.com/  \"Optional Title Here\"\n\n---\n\n\texecuted = no\n\n1986. What a great season.\n\n\texecuted = yes\n\nand test...\n\n\ttest \"should recognize indented code blocks in lists with empty line as separator\", ->\n\t\tok executed\n\t\ttestsCount++\n\n---\n\n\texecuted = no\n\n1986\\. What a great season.\n\t\t\t\texecuted = yes\n\nand test...\n\n\ttest \"should ignore indented code in escaped list like number\", ->\n\t\teq executed, no\n\t\ttestsCount++\n\none last test!\n\n\ttest \"block quotes should render correctly\", ->\n\t\tquote = '''\n\t\t\tfoo\n\t\t\t\t\tand bar!\n\t\t'''\n\t\teq quote, 'foo\\n\\t\\tand bar!'\n\t\ttestsCount++\n\nand finally, how did we do?\n\n\ttest \"all tabbed literate CoffeeScript tests executed\", ->\n\t\teq testsCount, 9\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"location\">\ntestScript = '''\nif true\n  x = 6\n  console.log \"A console #{x + 7} log\"\n\nfoo = \"bar\"\nz = /// ^ (a#{foo}) ///\n\nx = () ->\n    try\n        console.log \"foo\"\n    catch err\n        # Rewriter will generate explicit indentation here.\n\n    return null\n'''\n\ntest \"Verify location of generated tokens\", ->\n  tokens = CoffeeScript.tokens \"a = 79\"\n\n  eq tokens.length, 4\n  [aToken, equalsToken, numberToken] = tokens\n\n  eq aToken[2].first_line, 0\n  eq aToken[2].first_column, 0\n  eq aToken[2].last_line, 0\n  eq aToken[2].last_column, 0\n\n  eq equalsToken[2].first_line, 0\n  eq equalsToken[2].first_column, 2\n  eq equalsToken[2].last_line, 0\n  eq equalsToken[2].last_column, 2\n\n  eq numberToken[2].first_line, 0\n  eq numberToken[2].first_column, 4\n  eq numberToken[2].last_line, 0\n  eq numberToken[2].last_column, 5\n\ntest \"Verify location of generated tokens (with indented first line)\", ->\n  tokens = CoffeeScript.tokens \"  a = 83\"\n\n  eq tokens.length, 4\n  [aToken, equalsToken, numberToken] = tokens\n\n  eq aToken[2].first_line, 0\n  eq aToken[2].first_column, 2\n  eq aToken[2].last_line, 0\n  eq aToken[2].last_column, 2\n  eq aToken[2].range[0], 2\n  eq aToken[2].range[1], 3\n\n  eq equalsToken[2].first_line, 0\n  eq equalsToken[2].first_column, 4\n  eq equalsToken[2].last_line, 0\n  eq equalsToken[2].last_column, 4\n\n  eq numberToken[2].first_line, 0\n  eq numberToken[2].first_column, 6\n  eq numberToken[2].last_line, 0\n  eq numberToken[2].last_column, 7\n\ngetMatchingTokens = (str, wantedTokens...) ->\n  tokens = CoffeeScript.tokens str\n  matchingTokens = []\n  i = 0\n  for token in tokens\n    if token[1].replace(/^'|'$/g, '\"') is wantedTokens[i]\n      i++\n      matchingTokens.push token\n  eq wantedTokens.length, matchingTokens.length\n  matchingTokens\n\ntest 'Verify locations in string interpolation (in \"string\")', ->\n  [a, b, c] = getMatchingTokens '\"a#{b}c\"', '\"a\"', 'b', '\"c\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 1\n  eq a[2].last_line, 0\n  eq a[2].last_column, 1\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 4\n  eq b[2].last_line, 0\n  eq b[2].last_column, 4\n\n  eq c[2].first_line, 0\n  eq c[2].first_column, 6\n  eq c[2].last_line, 0\n  eq c[2].last_column, 6\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation)', ->\n  [a, b, c] = getMatchingTokens '\"#{a}b#{c}\"', 'a', '\"b\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 0\n  eq a[2].last_column, 3\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 5\n  eq b[2].last_line, 0\n  eq b[2].last_column, 5\n\n  eq c[2].first_line, 0\n  eq c[2].first_column, 8\n  eq c[2].last_line, 0\n  eq c[2].last_column, 8\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation and line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"#{a}\\nb\\n#{c}\"', 'a', '\"\\nb\\n\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 0\n  eq a[2].last_column, 3\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 5\n  eq b[2].last_line, 1\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 2\n  eq c[2].first_column, 2\n  eq c[2].last_line, 2\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\\n#{a}\\nb\\n#{c}\"', 'a', '\"\\nb\\n\"', 'c'\n\n  eq a[2].first_line, 1\n  eq a[2].first_column, 2\n  eq a[2].last_line, 1\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 1\n  eq b[2].first_column, 4\n  eq b[2].last_line, 2\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 3\n  eq c[2].first_column, 2\n  eq c[2].last_line, 3\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\\n\\n#{a}\\n\\nb\\n\\n#{c}\"', 'a', '\"\\n\\nb\\n\\n\"', 'c'\n\n  eq a[2].first_line, 2\n  eq a[2].first_column, 2\n  eq a[2].last_line, 2\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 2\n  eq b[2].first_column, 4\n  eq b[2].last_line, 5\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 6\n  eq c[2].first_column, 2\n  eq c[2].last_line, 6\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\\n\\n\\n#{a}\\n\\n\\nb\\n\\n\\n#{c}\"', 'a', '\"\\n\\n\\nb\\n\\n\\n\"', 'c'\n\n  eq a[2].first_line, 3\n  eq a[2].first_column, 2\n  eq a[2].last_line, 3\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 3\n  eq b[2].first_column, 4\n  eq b[2].last_line, 8\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 9\n  eq c[2].first_column, 2\n  eq c[2].last_line, 9\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"a\\n#{b}\\nc\"\"\"', '\"a\\n\"', 'b', '\"\\nc\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 0\n  eq a[2].last_column, 4\n\n  eq b[2].first_line, 1\n  eq b[2].first_column, 2\n  eq b[2].last_line, 1\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 1\n  eq c[2].first_column, 4\n  eq c[2].last_line, 2\n  eq c[2].last_column, 0\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", starting with a line break)', ->\n  [b, c] = getMatchingTokens '\"\"\"\\n#{b}\\nc\"\"\"', 'b', '\"\\nc\"'\n\n  eq b[2].first_line, 1\n  eq b[2].first_column, 2\n  eq b[2].last_line, 1\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 1\n  eq c[2].first_column, 4\n  eq c[2].last_line, 2\n  eq c[2].last_column, 0\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"\\n\\n#{b}\\nc\"\"\"', '\"\\n\\n\"', 'b', '\"\\nc\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 1\n  eq a[2].last_column, 0\n\n  eq b[2].first_line, 2\n  eq b[2].first_column, 2\n  eq b[2].last_line, 2\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 2\n  eq c[2].first_column, 4\n  eq c[2].last_line, 3\n  eq c[2].last_column, 0\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", multiple interpolation)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"#{a}\\nb\\n#{c}\"\"\"', 'a', '\"\\nb\\n\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 5\n  eq a[2].last_line, 0\n  eq a[2].last_column, 5\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 7\n  eq b[2].last_line, 1\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 2\n  eq c[2].first_column, 2\n  eq c[2].last_line, 2\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", multiple interpolation, and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"\\n\\n#{a}\\n\\nb\\n\\n#{c}\"\"\"', 'a', '\"\\n\\nb\\n\\n\"', 'c'\n\n  eq a[2].first_line, 2\n  eq a[2].first_column, 2\n  eq a[2].last_line, 2\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 2\n  eq b[2].first_column, 4\n  eq b[2].last_line, 5\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 6\n  eq c[2].first_column, 2\n  eq c[2].last_line, 6\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", multiple interpolation, and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"\\n\\n\\n#{a}\\n\\n\\nb\\n\\n\\n#{c}\"\"\"', 'a', '\"\\n\\n\\nb\\n\\n\\n\"', 'c'\n\n  eq a[2].first_line, 3\n  eq a[2].first_column, 2\n  eq a[2].last_line, 3\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 3\n  eq b[2].first_column, 4\n  eq b[2].last_line, 8\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 9\n  eq c[2].first_column, 2\n  eq c[2].last_line, 9\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation)', ->\n  [a, b, c] = getMatchingTokens '///#{a}b#{c}///', 'a', '\"b\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 5\n  eq a[2].last_line, 0\n  eq a[2].last_column, 5\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 7\n  eq b[2].last_line, 0\n  eq b[2].last_column, 7\n\n  eq c[2].first_line, 0\n  eq c[2].first_column, 10\n  eq c[2].last_line, 0\n  eq c[2].last_column, 10\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation)', ->\n  [a, b, c] = getMatchingTokens '///a#{b}c///', '\"a\"', 'b', '\"c\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 0\n  eq a[2].last_column, 3\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 6\n  eq b[2].last_line, 0\n  eq b[2].last_column, 6\n\n  eq c[2].first_line, 0\n  eq c[2].first_column, 8\n  eq c[2].last_line, 0\n  eq c[2].last_column, 8\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks)', ->\n  [a, b, c] = getMatchingTokens '///#{a}\\nb\\n#{c}///', 'a', '\"\\nb\\n\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 5\n  eq a[2].last_line, 0\n  eq a[2].last_column, 5\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 7\n  eq b[2].last_line, 1\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 2\n  eq c[2].first_column, 2\n  eq c[2].last_line, 2\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks)', ->\n  [a, b, c] = getMatchingTokens '///#{a}\\n\\n\\nb\\n\\n\\n#{c}///', 'a', '\"\\n\\n\\nb\\n\\n\\n\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 5\n  eq a[2].last_line, 0\n  eq a[2].last_column, 5\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 7\n  eq b[2].last_line, 5\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 6\n  eq c[2].first_column, 2\n  eq c[2].last_line, 6\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks)', ->\n  [a, b, c] = getMatchingTokens '///a\\n\\n\\n#{b}\\n\\n\\nc///', '\"a\\n\\n\\n\"', 'b', '\"\\n\\n\\nc\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 2\n  eq a[2].last_column, 0\n\n  eq b[2].first_line, 3\n  eq b[2].first_column, 2\n  eq b[2].last_line, 3\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 3\n  eq c[2].first_column, 4\n  eq c[2].last_line, 6\n  eq c[2].last_column, 0\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks and starting with linebreak)', ->\n  [a, b, c] = getMatchingTokens '///\\n#{a}\\nb\\n#{c}///', 'a', '\"\\nb\\n\"', 'c'\n\n  eq a[2].first_line, 1\n  eq a[2].first_column, 2\n  eq a[2].last_line, 1\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 1\n  eq b[2].first_column, 4\n  eq b[2].last_line, 2\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 3\n  eq c[2].first_column, 2\n  eq c[2].last_line, 3\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks and starting with linebreak)', ->\n  [a, b, c] = getMatchingTokens '///\\n\\n\\n#{a}\\n\\n\\nb\\n\\n\\n#{c}///', 'a', '\"\\n\\n\\nb\\n\\n\\n\"', 'c'\n\n  eq a[2].first_line, 3\n  eq a[2].first_column, 2\n  eq a[2].last_line, 3\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 3\n  eq b[2].first_column, 4\n  eq b[2].last_line, 8\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 9\n  eq c[2].first_column, 2\n  eq c[2].last_line, 9\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks and starting with linebreak)', ->\n  [a, b, c] = getMatchingTokens '///\\n\\n\\na\\n\\n\\n#{b}\\n\\n\\nc///', '\"\\n\\n\\na\\n\\n\\n\"', 'b', '\"\\n\\n\\nc\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 5\n  eq a[2].last_column, 0\n\n  eq b[2].first_line, 6\n  eq b[2].first_column, 2\n  eq b[2].last_line, 6\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 6\n  eq c[2].first_column, 4\n  eq c[2].last_line, 9\n  eq c[2].last_column, 0\n\ntest \"#3822: Simple string/regex start/end should include delimiters\", ->\n  [stringToken] = CoffeeScript.tokens \"'string'\"\n  eq stringToken[2].first_line, 0\n  eq stringToken[2].first_column, 0\n  eq stringToken[2].last_line, 0\n  eq stringToken[2].last_column, 7\n\n  [regexToken] = CoffeeScript.tokens \"/regex/\"\n  eq regexToken[2].first_line, 0\n  eq regexToken[2].first_column, 0\n  eq regexToken[2].last_line, 0\n  eq regexToken[2].last_column, 6\n\ntest \"#3621: Multiline regex and manual `Regex` call with interpolation should\n      result in the same tokens\", ->\n  tokensA = CoffeeScript.tokens '(RegExp(\".*#{a}[0-9]\"))'\n  tokensB = CoffeeScript.tokens '///.*#{a}[0-9]///'\n  eq tokensA.length, tokensB.length\n  for i in [0...tokensA.length] by 1\n    tokenA = tokensA[i]\n    tokenB = tokensB[i]\n    eq tokenA[0], tokenB[0] unless tokenB[0] in ['REGEX_START', 'REGEX_END']\n    eq \"#{tokenA[1]}\", \"#{tokenB[1]}\"\n    unless tokenA[0] is 'STRING_START' or tokenB[0] is 'REGEX_START'\n      eq tokenA.origin?[1], tokenB.origin?[1]\n    eq tokenA.stringEnd, tokenB.stringEnd\n\ntest \"Verify tokens have locations that are in order\", ->\n  source = '''\n    a {\n      b: ->\n        return c d,\n          if e\n            f\n    }\n    g\n  '''\n  tokens = CoffeeScript.tokens source\n  lastToken = null\n  for token in tokens\n    if lastToken\n      ok token[2].first_line >= lastToken[2].last_line\n      if token[2].first_line == lastToken[2].last_line\n        ok token[2].first_column >= lastToken[2].last_column\n    lastToken = token\n\ntest \"Verify OUTDENT tokens are located at the end of the previous token\", ->\n  source = '''\n    SomeArr = [ ->\n      if something\n        lol =\n          count: 500\n    ]\n  '''\n  tokens = CoffeeScript.tokens source\n  [..., number, curly, outdent1, outdent2, outdent3, bracket, terminator] = tokens\n  eq number[0], 'NUMBER'\n  for outdent in [outdent1, outdent2, outdent3]\n    eq outdent[0], 'OUTDENT'\n    eq outdent[2].first_line, number[2].last_line\n    eq outdent[2].first_column, number[2].last_column\n    eq outdent[2].last_line, number[2].last_line\n    eq outdent[2].last_column, number[2].last_column\n\ntest \"Verify OUTDENT and CALL_END tokens are located at the end of the previous token\", ->\n  source = '''\n    a = b {\n      c: ->\n        d e,\n          if f\n            g {},\n              if h\n                i {}\n    }\n  '''\n  tokens = CoffeeScript.tokens source\n  [..., closeCurly1, callEnd1, outdent1, outdent2, callEnd2, outdent3, outdent4,\n    callEnd3, outdent5, outdent6, closeCurly2, callEnd4, terminator] = tokens\n  eq closeCurly1[0], '}'\n  assertAtCloseCurly = (token) ->\n    eq token[2].first_line, closeCurly1[2].last_line\n    eq token[2].first_column, closeCurly1[2].last_column\n    eq token[2].last_line, closeCurly1[2].last_line\n    eq token[2].last_column, closeCurly1[2].last_column\n\n  for token in [outdent1, outdent2, outdent3, outdent4, outdent5, outdent6]\n    eq token[0], 'OUTDENT'\n    assertAtCloseCurly(token)\n  for token in [callEnd1, callEnd2, callEnd3]\n    eq token[0], 'CALL_END'\n    assertAtCloseCurly(token)\n\ntest \"Verify generated } tokens are located at the end of the previous token\", ->\n  source = '''\n    a(b, ->\n      c: () ->\n        if d\n          e\n    )\n  '''\n  tokens = CoffeeScript.tokens source\n  [..., identifier, outdent1, outdent2, closeCurly, outdent3, callEnd,\n    terminator] = tokens\n  eq identifier[0], 'IDENTIFIER'\n  assertAtIdentifier = (token) ->\n    eq token[2].first_line, identifier[2].last_line\n    eq token[2].first_column, identifier[2].last_column\n    eq token[2].last_line, identifier[2].last_line\n    eq token[2].last_column, identifier[2].last_column\n\n  for token in [outdent1, outdent2, closeCurly, outdent3]\n    assertAtIdentifier(token)\n\ntest \"Verify real CALL_END tokens have the right position\", ->\n  source = '''\n    a()\n  '''\n  tokens = CoffeeScript.tokens source\n  [identifier, callStart, callEnd, terminator] = tokens\n  startIndex = identifier[2].first_column\n  eq identifier[2].last_column, startIndex\n  eq callStart[2].first_column, startIndex + 1\n  eq callStart[2].last_column, startIndex + 1\n  eq callEnd[2].first_column, startIndex + 2\n  eq callEnd[2].last_column, startIndex + 2\n\ntest \"Verify normal heredocs have the right position\", ->\n  source = '''\n    \"\"\"\n    a\"\"\"\n  '''\n  [stringToken] = CoffeeScript.tokens source\n  eq stringToken[2].first_line, 0\n  eq stringToken[2].first_column, 0\n  eq stringToken[2].last_line, 1\n  eq stringToken[2].last_column, 3\n\ntest \"Verify heredocs ending with a newline have the right position\", ->\n  source = '''\n    \"\"\"\n    a\n    \"\"\"\n  '''\n  [stringToken] = CoffeeScript.tokens source\n  eq stringToken[2].first_line, 0\n  eq stringToken[2].first_column, 0\n  eq stringToken[2].last_line, 2\n  eq stringToken[2].last_column, 2\n\ntest \"Verify indented heredocs have the right position\", ->\n  source = '''\n    ->\n      \"\"\"\n        a\n      \"\"\"\n  '''\n  [arrow, indent, stringToken] = CoffeeScript.tokens source\n  eq stringToken[2].first_line, 1\n  eq stringToken[2].first_column, 2\n  eq stringToken[2].last_line, 3\n  eq stringToken[2].last_column, 4\n\ntest \"Verify heregexes with interpolations have the right ending position\", ->\n  source = '''\n    [a ///#{b}///g]\n  '''\n  [..., stringEnd, comma, flagsString, regexCallEnd, regexEnd, fnCallEnd,\n    arrayEnd, terminator] = CoffeeScript.tokens source\n\n  eq comma[0], ','\n  eq arrayEnd[0], ']'\n\n  assertColumn = (token, column, width = 0) ->\n    eq token[2].first_line, 0\n    eq token[2].first_column, column\n    eq token[2].last_line, 0\n    eq token[2].last_column, column\n    eq token[2].last_column_exclusive, column + width\n\n  arrayEndColumn = arrayEnd[2].first_column\n  for token in [comma]\n    assertColumn token, arrayEndColumn - 2\n  for token in [flagsString, regexCallEnd]\n    assertColumn token, arrayEndColumn - 1, 1\n  for token in [regexEnd, fnCallEnd]\n    assertColumn token, arrayEndColumn\n  assertColumn arrayEnd, arrayEndColumn, 1\n\ntest \"Verify all tokens get a location\", ->\n  doesNotThrow ->\n    tokens = CoffeeScript.tokens testScript\n    for token in tokens\n        ok !!token[2]\n\ntest 'Values with properties end up with a location that includes the properties', ->\n  source = '''\n    a.b\n    a.b.c\n    a['b']\n    a[b.c()].d\n  '''\n  {body: block} = CoffeeScript.nodes source\n  [\n    singleProperty\n    twoProperties\n    indexed\n    complexIndex\n  ] = block.expressions\n\n  eq singleProperty.locationData.first_line, 0\n  eq singleProperty.locationData.first_column, 0\n  eq singleProperty.locationData.last_line, 0\n  eq singleProperty.locationData.last_column, 2\n\n  eq twoProperties.locationData.first_line, 1\n  eq twoProperties.locationData.first_column, 0\n  eq twoProperties.locationData.last_line, 1\n  eq twoProperties.locationData.last_column, 4\n\n  eq indexed.locationData.first_line, 2\n  eq indexed.locationData.first_column, 0\n  eq indexed.locationData.last_line, 2\n  eq indexed.locationData.last_column, 5\n\n  eq complexIndex.locationData.first_line, 3\n  eq complexIndex.locationData.first_column, 0\n  eq complexIndex.locationData.last_line, 3\n  eq complexIndex.locationData.last_column, 9\n\ntest 'StringWithInterpolations::fromStringLiteral() assigns correct location to tagged template literal', ->\n  checkLocationData = (source, {stringWithInterpolationsLocationData, stringLocationData}) ->\n    {body: block} = CoffeeScript.nodes source\n    taggedTemplateLiteral = block.expressions[0].unwrap()\n    {args: [stringWithInterpolations]} = taggedTemplateLiteral\n    {body} = stringWithInterpolations\n    {expressions: [stringValue]} = body\n    string = stringValue.unwrap()\n\n    for field in ['first_line', 'first_column', 'last_line', 'last_column', 'last_line_exclusive', 'last_column_exclusive']\n      eq stringWithInterpolations.locationData[field], stringWithInterpolationsLocationData[field]\n      eq stringValue.locationData[field], stringLocationData[field]\n      eq string.locationData[field], stringLocationData[field]\n\n  checkLocationData 'a\"b\"',\n    stringWithInterpolationsLocationData:\n      first_line: 0\n      first_column: 1\n      last_line: 0\n      last_column: 3\n      last_line_exclusive: 0\n      last_column_exclusive: 4\n    stringLocationData:\n      first_line: 0\n      first_column: 2\n      last_line: 0\n      last_column: 2\n      last_line_exclusive: 0\n      last_column_exclusive: 3\n\n  checkLocationData '''\n    a\"\"\"\n      b\n    \"\"\"\n  ''',\n    stringWithInterpolationsLocationData:\n      first_line: 0\n      first_column: 1\n      last_line: 2\n      last_column: 2\n      last_line_exclusive: 2\n      last_column_exclusive: 3\n    stringLocationData:\n      first_line: 0\n      first_column: 4\n      last_line: 1\n      last_column: 3\n      last_line_exclusive: 2\n      last_column_exclusive: 0\n\n  checkLocationData '''\n    a\"\"\"b\n    \"\"\"\n  ''',\n    stringWithInterpolationsLocationData:\n      first_line: 0\n      first_column: 1\n      last_line: 1\n      last_column: 2\n      last_line_exclusive: 1\n      last_column_exclusive: 3\n    stringLocationData:\n      first_line: 0\n      first_column: 4\n      last_line: 0\n      last_column: 5\n      last_line_exclusive: 1\n      last_column_exclusive: 0\n\ntest \"Verify compound assignment operators have the right position\", ->\n  source = '''\n    a or= b\n  '''\n  [a, operatorToken] = CoffeeScript.tokens source\n  eq operatorToken[2].first_line, 0\n  eq operatorToken[2].first_column, 2\n  eq operatorToken[2].last_line, 0\n  eq operatorToken[2].last_column, 4\n  eq operatorToken[2].last_column_exclusive, 5\n  eq operatorToken[2].range[0], 2\n  eq operatorToken[2].range[1], 5\n\n  source = '''\n    a and= b\n  '''\n  [a, operatorToken] = CoffeeScript.tokens source\n  eq operatorToken[2].first_line, 0\n  eq operatorToken[2].first_column, 2\n  eq operatorToken[2].last_line, 0\n  eq operatorToken[2].last_column, 5\n  eq operatorToken[2].last_column_exclusive, 6\n  eq operatorToken[2].range[0], 2\n  eq operatorToken[2].range[1], 6\n\ntest \"Verify BOM is accounted for in location data\", ->\n  source = '''\n    \\ufeffa\n    b\n  '''\n  [aToken, terminator, bToken] = CoffeeScript.tokens source\n  eq aToken[2].first_line, 0\n  eq aToken[2].first_column, 1\n  eq aToken[2].last_line, 0\n  eq aToken[2].last_column, 1\n  eq aToken[2].last_column_exclusive, 2\n  eq aToken[2].range[0], 1\n  eq aToken[2].range[1], 2\n  eq bToken[2].first_line, 1\n  eq bToken[2].first_column, 0\n  eq bToken[2].last_line, 1\n  eq bToken[2].last_column, 0\n  eq bToken[2].last_column_exclusive, 1\n  eq bToken[2].range[0], 3\n  eq bToken[2].range[1], 4\n\ntest \"Verify carriage returns are accounted for in location data\", ->\n  source = '''\n    a\\r+\n    b\\r\\r- c\n  '''\n  [aToken, plusToken, bToken, minusToken] = CoffeeScript.tokens source\n  eq aToken[2].first_line, 0\n  eq aToken[2].first_column, 0\n  eq aToken[2].last_line, 0\n  eq aToken[2].last_column, 0\n  eq aToken[2].last_column_exclusive, 1\n  eq aToken[2].range[0], 0\n  eq aToken[2].range[1], 1\n  eq plusToken[2].first_line, 0\n  eq plusToken[2].first_column, 2\n  eq plusToken[2].last_line, 0\n  eq plusToken[2].last_column, 2\n  eq plusToken[2].last_column_exclusive, 3\n  eq plusToken[2].range[0], 2\n  eq plusToken[2].range[1], 3\n  eq bToken[2].first_line, 1\n  eq bToken[2].first_column, 0\n  eq bToken[2].last_line, 1\n  eq bToken[2].last_column, 0\n  eq bToken[2].last_column_exclusive, 1\n  eq bToken[2].range[0], 4\n  eq bToken[2].range[1], 5\n  eq minusToken[2].first_line, 1\n  eq minusToken[2].first_column, 3\n  eq minusToken[2].last_line, 1\n  eq minusToken[2].last_column, 3\n  eq minusToken[2].last_column_exclusive, 4\n  eq minusToken[2].range[0], 7\n  eq minusToken[2].range[1], 8\n\ntest \"Verify object colon location data\", ->\n  source = '''\n    a : b\n  '''\n  [implicitBraceToken, aToken, colonToken] = CoffeeScript.tokens source\n  eq colonToken[2].first_line, 0\n  eq colonToken[2].first_column, 2\n  eq colonToken[2].last_line, 0\n  eq colonToken[2].last_column, 2\n  eq colonToken[2].last_column_exclusive, 3\n  eq colonToken[2].range[0], 2\n  eq colonToken[2].range[1], 3\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"modules\">\n# Modules, a.k.a. ES2015 import/export\n# ------------------------------------\n#\n# Remember, we’re not *resolving* modules, just outputting valid ES2015 syntax.\n\n\n# This is the CoffeeScript import and export syntax, closely modeled after the ES2015 syntax\n# https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import\n# https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export\n\n# import \"module-name\"\n# import defaultMember from \"module-name\"\n# import * as name from \"module-name\"\n# import { } from \"module-name\"\n# import { member } from \"module-name\"\n# import { member as alias } from \"module-name\"\n# import { member1, member2 as alias2, … } from \"module-name\"\n# import defaultMember, * as name from \"module-name\"\n# import defaultMember, { … } from \"module-name\"\n\n# export default expression\n# export class name\n# export { }\n# export { name }\n# export { name as exportedName }\n# export { name as default }\n# export { name1, name2 as exportedName2, name3 as default, … }\n#\n# export * from \"module-name\"\n# export { … } from \"module-name\"\n#\n# As a subsitute for `export var name = …` and `export function name {}`,\n# CoffeeScript also supports:\n# export name = …\n\n# CoffeeScript also supports optional commas within `{ … }`.\n\n\n# Import statements\n\ntest \"backticked import statement\", ->\n  eqJS \"\"\"\n    if Meteor.isServer\n      `import { foo, bar as baz } from 'lib'`\"\"\",\n  \"\"\"\n    if (Meteor.isServer) {\n      import { foo, bar as baz } from 'lib';\n    }\"\"\"\n\ntest \"import an entire module for side effects only, without importing any bindings\", ->\n  eqJS \"import 'lib'\",\n  \"import 'lib';\"\n\ntest \"import default member from module, adding the member to the current scope\", ->\n  eqJS \"\"\"\n    import foo from 'lib'\n    foo.fooMethod()\"\"\",\n  \"\"\"\n    import foo from 'lib';\n\n    foo.fooMethod();\"\"\"\n\ntest \"import an entire module's contents as an alias, adding the alias to the current scope\", ->\n  eqJS \"\"\"\n    import * as foo from 'lib'\n    foo.fooMethod()\"\"\",\n  \"\"\"\n    import * as foo from 'lib';\n\n    foo.fooMethod();\"\"\"\n\ntest \"import empty object\", ->\n  eqJS \"import { } from 'lib'\",\n  \"import {} from 'lib';\"\n\ntest \"import empty object\", ->\n  eqJS \"import {} from 'lib'\",\n  \"import {} from 'lib';\"\n\ntest \"import a single member of a module, adding the member to the current scope\", ->\n  eqJS \"\"\"\n    import { foo } from 'lib'\n    foo.fooMethod()\"\"\",\n  \"\"\"\n    import {\n      foo\n    } from 'lib';\n\n    foo.fooMethod();\"\"\"\n\ntest \"import a single member of a module as an alias, adding the alias to the current scope\", ->\n  eqJS \"\"\"\n    import { foo as bar } from 'lib'\n    bar.barMethod()\"\"\",\n  \"\"\"\n    import {\n      foo as bar\n    } from 'lib';\n\n    bar.barMethod();\"\"\"\n\ntest \"import multiple members of a module, adding the members to the current scope\", ->\n  eqJS \"\"\"\n    import { foo, bar } from 'lib'\n    foo.fooMethod()\n    bar.barMethod()\"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar\n    } from 'lib';\n\n    foo.fooMethod();\n\n    bar.barMethod();\"\"\"\n\ntest \"import multiple members of a module where some are aliased, adding the members or aliases to the current scope\", ->\n  eqJS \"\"\"\n    import { foo, bar as baz } from 'lib'\n    foo.fooMethod()\n    baz.bazMethod()\"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib';\n\n    foo.fooMethod();\n\n    baz.bazMethod();\"\"\"\n\ntest \"import default member and other members of a module, adding the members to the current scope\", ->\n  eqJS \"\"\"\n    import foo, { bar, baz as qux } from 'lib'\n    foo.fooMethod()\n    bar.barMethod()\n    qux.quxMethod()\"\"\",\n  \"\"\"\n    import foo, {\n      bar,\n      baz as qux\n    } from 'lib';\n\n    foo.fooMethod();\n\n    bar.barMethod();\n\n    qux.quxMethod();\"\"\"\n\ntest \"import default member from a module as well as the entire module's contents as an alias, adding the member and alias to the current scope\", ->\n  eqJS \"\"\"\n    import foo, * as bar from 'lib'\n    foo.fooMethod()\n    bar.barMethod()\"\"\",\n  \"\"\"\n    import foo, * as bar from 'lib';\n\n    foo.fooMethod();\n\n    bar.barMethod();\"\"\"\n\ntest \"multiline simple import\", ->\n  eqJS \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib'\"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib';\"\"\"\n\ntest \"multiline complex import\", ->\n  eqJS \"\"\"\n    import foo, {\n      bar,\n      baz as qux\n    } from 'lib'\"\"\",\n  \"\"\"\n    import foo, {\n      bar,\n      baz as qux\n    } from 'lib';\"\"\"\n\ntest \"import with optional commas\", ->\n  eqJS \"import { foo, bar, } from 'lib'\",\n  \"\"\"\n    import {\n      foo,\n      bar\n    } from 'lib';\"\"\"\n\ntest \"multiline import without commas\", ->\n  eqJS \"\"\"\n    import {\n      foo\n      bar\n    } from 'lib'\"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar\n    } from 'lib';\"\"\"\n\ntest \"multiline import with optional commas\", ->\n  eqJS \"\"\"\n    import {\n      foo,\n      bar,\n    } from 'lib'\"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar\n    } from 'lib';\"\"\"\n\ntest \"a variable can be assigned after an import\", ->\n  eqJS \"\"\"\n    import { foo } from 'lib'\n    bar = 5\"\"\",\n  \"\"\"\n    var bar;\n\n    import {\n      foo\n    } from 'lib';\n\n    bar = 5;\"\"\"\n\ntest \"variables can be assigned before and after an import\", ->\n  eqJS \"\"\"\n    foo = 5\n    import { bar } from 'lib'\n    baz = 7\"\"\",\n  \"\"\"\n    var baz, foo;\n\n    foo = 5;\n\n    import {\n      bar\n    } from 'lib';\n\n    baz = 7;\"\"\"\n\n# Export statements\n\ntest \"export empty object\", ->\n  eqJS \"export { }\",\n  \"export {};\"\n\ntest \"export empty object\", ->\n  eqJS \"export {}\",\n  \"export {};\"\n\ntest \"export named members within an object\", ->\n  eqJS \"export { foo, bar }\",\n  \"\"\"\n    export {\n      foo,\n      bar\n    };\"\"\"\n\ntest \"export named members as aliases, within an object\", ->\n  eqJS \"export { foo as bar, baz as qux }\",\n  \"\"\"\n    export {\n      foo as bar,\n      baz as qux\n    };\"\"\"\n\ntest \"export named members within an object, with an optional comma\", ->\n  eqJS \"export { foo, bar, }\",\n  \"\"\"\n    export {\n      foo,\n      bar\n    };\"\"\"\n\ntest \"multiline export named members within an object\", ->\n  eqJS \"\"\"\n    export {\n      foo,\n      bar\n    }\"\"\",\n  \"\"\"\n    export {\n      foo,\n      bar\n    };\"\"\"\n\ntest \"multiline export named members within an object, with an optional comma\", ->\n  eqJS \"\"\"\n    export {\n      foo,\n      bar,\n    }\"\"\",\n  \"\"\"\n    export {\n      foo,\n      bar\n    };\"\"\"\n\ntest \"export default string\", ->\n  eqJS \"export default 'foo'\",\n  \"export default 'foo';\"\n\ntest \"export default number\", ->\n  eqJS \"export default 5\",\n  \"export default 5;\"\n\ntest \"export default object\", ->\n  eqJS \"export default { foo: 'bar', baz: 'qux' }\",\n  \"\"\"\n    export default {\n      foo: 'bar',\n      baz: 'qux'\n    };\"\"\"\n\ntest \"export default implicit object\", ->\n  eqJS \"export default foo: 'bar', baz: 'qux'\",\n  \"\"\"\n    export default {\n      foo: 'bar',\n      baz: 'qux'\n    };\"\"\"\n\ntest \"export default multiline implicit object\", ->\n  eqJS \"\"\"\n    export default\n      foo: 'bar'\n      baz: 'qux'\n    \"\"\",\n  \"\"\"\n    export default {\n      foo: 'bar',\n      baz: 'qux'\n    };\"\"\"\n\ntest \"export default multiline implicit object with internal braces\", ->\n  eqJS \"\"\"\n    export default\n      foo: yes\n      bar: {\n        baz\n      }\n      quz: no\n    \"\"\",\n  \"\"\"\n    export default {\n      foo: true,\n      bar: {baz},\n      quz: false\n    };\"\"\"\n\ntest \"export default assignment expression\", ->\n  eqJS \"export default foo = 'bar'\",\n  \"\"\"\n    var foo;\n\n    export default foo = 'bar';\"\"\"\n\ntest \"export assignment expression\", ->\n  eqJS \"export foo = 'bar'\",\n  \"export var foo = 'bar';\"\n\ntest \"export multiline assignment expression\", ->\n  eqJS \"\"\"\n    export foo =\n    'bar'\"\"\",\n    \"export var foo = 'bar';\"\n\ntest \"export multiline indented assignment expression\", ->\n  eqJS \"\"\"\n    export foo =\n      'bar'\"\"\",\n      \"export var foo = 'bar';\"\n\ntest \"export default function\", ->\n  eqJS \"export default ->\",\n  \"export default function() {};\"\n\ntest \"export default multiline function\", ->\n  eqJS \"\"\"\n    export default (foo) ->\n      console.log foo\"\"\",\n    \"\"\"\n    export default function(foo) {\n      return console.log(foo);\n    };\"\"\"\n\ntest \"export assignment function\", ->\n  eqJS \"\"\"\n    export foo = (bar) ->\n      console.log bar\"\"\",\n    \"\"\"\n    export var foo = function(bar) {\n      return console.log(bar);\n    };\"\"\"\n\ntest \"export assignment function which contains assignments in its body\", ->\n  eqJS \"\"\"\n    export foo = (bar) ->\n      baz = '!'\n      console.log bar + baz\"\"\",\n    \"\"\"\n    export var foo = function(bar) {\n      var baz;\n      baz = '!';\n      return console.log(bar + baz);\n    };\"\"\"\n\ntest \"export default predefined function\", ->\n  eqJS \"\"\"\n    foo = (bar) ->\n      console.log bar\n    export default foo\"\"\",\n  \"\"\"\n    var foo;\n\n    foo = function(bar) {\n      return console.log(bar);\n    };\n\n    export default foo;\"\"\"\n\ntest \"export default class\", ->\n  eqJS \"\"\"\n    export default class foo extends bar\n      baz: ->\n        console.log 'hello, world!'\"\"\",\n      \"\"\"\n    var foo;\n\n    export default foo = class foo extends bar {\n      baz() {\n        return console.log('hello, world!');\n      }\n\n    };\"\"\"\n\ntest \"export class\", ->\n  eqJS \"\"\"\n    export class foo\n      baz: ->\n        console.log 'hello, world!'\"\"\",\n      \"\"\"\n    export var foo = class foo {\n      baz() {\n        return console.log('hello, world!');\n      }\n\n    };\"\"\"\n\ntest \"export class that extends\", ->\n  eqJS \"\"\"\n    export class foo extends bar\n      baz: ->\n        console.log 'hello, world!'\"\"\",\n      \"\"\"\n    export var foo = class foo extends bar {\n      baz() {\n        return console.log('hello, world!');\n      }\n\n    };\"\"\"\n\ntest \"export default class that extends\", ->\n  eqJS \"\"\"\n    export default class foo extends bar\n      baz: ->\n        console.log 'hello, world!'\"\"\",\n      \"\"\"\n    var foo;\n\n    export default foo = class foo extends bar {\n      baz() {\n        return console.log('hello, world!');\n      }\n\n    };\"\"\"\n\ntest \"export default named member, within an object\", ->\n  eqJS \"export { foo as default, bar }\",\n  \"\"\"\n    export {\n      foo as default,\n      bar\n    };\"\"\"\n\n# Import and export in the same statement\n\ntest \"export an entire module's contents\", ->\n  eqJS \"export * from 'lib'\",\n  \"export * from 'lib';\"\n\ntest \"export members imported from another module\", ->\n  eqJS \"export { foo, bar } from 'lib'\",\n  \"\"\"\n    export {\n      foo,\n      bar\n    } from 'lib';\"\"\"\n\ntest \"export as aliases members imported from another module\", ->\n  eqJS \"export { foo as bar, baz as qux } from 'lib'\",\n  \"\"\"\n    export {\n      foo as bar,\n      baz as qux\n    } from 'lib';\"\"\"\n\ntest \"export list can contain CoffeeScript keywords\", ->\n  eqJS \"export { unless, and } from 'lib'\",\n  \"\"\"\n    export {\n      unless,\n      and\n    } from 'lib';\"\"\"\n\ntest \"export list can contain CoffeeScript keywords when aliasing\", ->\n  eqJS \"export { when as bar, baz as unless, and as foo, booze as not } from 'lib'\",\n  \"\"\"\n    export {\n      when as bar,\n      baz as unless,\n      and as foo,\n      booze as not\n    } from 'lib';\"\"\"\n\n\n# Edge cases\n\ntest \"multiline import with comments\", ->\n  eqJS \"\"\"\n    import {\n      foo, # Not as good as bar\n      bar as baz # I prefer qux\n    } from 'lib'\"\"\",\n  \"\"\"\n    import {\n      foo, // Not as good as bar\n      bar as baz // I prefer qux\n    } from 'lib';\"\"\"\n\ntest \"`from` not part of an import or export statement can still be assigned\", ->\n  from = 5\n  eq 5, from\n\ntest \"a variable named `from` can be assigned after an import\", ->\n  eqJS \"\"\"\n    import { foo } from 'lib'\n    from = 5\"\"\",\n  \"\"\"\n    var from;\n\n    import {\n      foo\n    } from 'lib';\n\n    from = 5;\"\"\"\n\ntest \"`from` can be assigned after a multiline import\", ->\n  eqJS \"\"\"\n    import {\n      foo\n    } from 'lib'\n    from = 5\"\"\",\n  \"\"\"\n    var from;\n\n    import {\n      foo\n    } from 'lib';\n\n    from = 5;\"\"\"\n\ntest \"`from` can be imported as a member name\", ->\n  eqJS \"import { from } from 'lib'\",\n  \"\"\"\n    import {\n      from\n    } from 'lib';\"\"\"\n\ntest \"`from` can be imported as a member name and aliased\", ->\n  eqJS \"import { from as foo } from 'lib'\",\n  \"\"\"\n    import {\n      from as foo\n    } from 'lib';\"\"\"\n\ntest \"`from` can be used as an alias name\", ->\n  eqJS \"import { foo as from } from 'lib'\",\n  \"\"\"\n    import {\n      foo as from\n    } from 'lib';\"\"\"\n\ntest \"`as` can be imported as a member name\", ->\n  eqJS \"import { as } from 'lib'\",\n  \"\"\"\n    import {\n      as\n    } from 'lib';\"\"\"\n\ntest \"`as` can be imported as a member name and aliased\", ->\n  eqJS \"import { as as foo } from 'lib'\",\n  \"\"\"\n    import {\n      as as foo\n    } from 'lib';\"\"\"\n\ntest \"`as` can be used as an alias name\", ->\n  eqJS \"import { foo as as } from 'lib'\",\n  \"\"\"\n    import {\n      foo as as\n    } from 'lib';\"\"\"\n\ntest \"CoffeeScript keywords can be used as imported names in import lists\", ->\n  eqJS \"\"\"\n    import { unless as bar, and as computedAnd } from 'lib'\n    bar.barMethod()\"\"\",\n  \"\"\"\n    import {\n      unless as bar,\n      and as computedAnd\n    } from 'lib';\n\n    bar.barMethod();\"\"\"\n\ntest \"`*` can be used in an expression on the same line as an export keyword\", ->\n  eqJS \"export foo = (x) -> x * x\",\n  \"\"\"\n    export var foo = function(x) {\n      return x * x;\n    };\"\"\"\n  eqJS \"export default foo = (x) -> x * x\",\n  \"\"\"\n    var foo;\n\n    export default foo = function(x) {\n      return x * x;\n    };\"\"\"\n\ntest \"`*` and `from` can be used in an export default expression\", ->\n  eqJS \"\"\"\n    export default foo.extend\n      bar: ->\n        from = 5\n        from = from * 3\"\"\",\n      \"\"\"\n    export default foo.extend({\n      bar: function() {\n        var from;\n        from = 5;\n        return from = from * 3;\n      }\n    });\"\"\"\n\ntest \"wrapped members can be imported multiple times if aliased\", ->\n  eqJS \"import { foo, foo as bar } from 'lib'\",\n  \"\"\"\n    import {\n      foo,\n      foo as bar\n    } from 'lib';\"\"\"\n\ntest \"default and wrapped members can be imported multiple times if aliased\", ->\n  eqJS \"import foo, { foo as bar } from 'lib'\",\n  \"\"\"\n    import foo, {\n      foo as bar\n    } from 'lib';\"\"\"\n\ntest \"import a member named default\", ->\n  eqJS \"import { default } from 'lib'\",\n  \"\"\"\n    import {\n      default\n    } from 'lib';\"\"\"\n\ntest \"import an aliased member named default\", ->\n  eqJS \"import { default as def } from 'lib'\",\n  \"\"\"\n    import {\n      default as def\n    } from 'lib';\"\"\"\n\ntest \"export a member named default\", ->\n  eqJS \"export { default }\",\n  \"\"\"\n    export {\n      default\n    };\"\"\"\n\ntest \"export an aliased member named default\", ->\n  eqJS \"export { def as default }\",\n  \"\"\"\n    export {\n      def as default\n    };\"\"\"\n\ntest \"import an imported member named default\", ->\n  eqJS \"import { default } from 'lib'\",\n  \"\"\"\n    import {\n      default\n    } from 'lib';\"\"\"\n\ntest \"import an imported aliased member named default\", ->\n  eqJS \"import { default as def } from 'lib'\",\n  \"\"\"\n    import {\n      default as def\n    } from 'lib';\"\"\"\n\ntest \"export an imported member named default\", ->\n  eqJS \"export { default } from 'lib'\",\n  \"\"\"\n    export {\n      default\n    } from 'lib';\"\"\"\n\ntest \"export an imported aliased member named default\", ->\n  eqJS \"export { default as def } from 'lib'\",\n  \"\"\"\n    export {\n      default as def\n    } from 'lib';\"\"\"\n\ntest \"#4394: export shouldn't prevent variable declarations\", ->\n  eqJS \"\"\"\n    x = 1\n    export { x }\n  \"\"\",\n  \"\"\"\n    var x;\n\n    x = 1;\n\n    export {\n      x\n    };\n  \"\"\"\n\ntest \"#4451: `default` in an export statement is only treated as a keyword when it follows `export` or `as`\", ->\n  eqJS \"export default { default: 1 }\",\n  \"\"\"\n    export default {\n      default: 1\n    };\n  \"\"\"\n\ntest \"#4491: import- and export-specific lexing should stop after import/export statement\", ->\n  eqJS \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib'\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib';\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n\n  eqJS \"\"\"\n    import { foo, bar as baz } from 'lib'\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib';\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n\n  eqJS \"\"\"\n    import * as lib from 'lib'\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\",\n  \"\"\"\n    import * as lib from 'lib';\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n\n  eqJS \"\"\"\n    export {\n      foo,\n      bar\n    }\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\",\n  \"\"\"\n    export {\n      foo,\n      bar\n    };\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n\n  eqJS \"\"\"\n    export * from 'lib'\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\",\n  \"\"\"\n    export * from 'lib';\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n\n# Issue #4874: Backslash not supported in import or export statements\ntest \"#4874: backslash `import`\", ->\n\n  eqJS \"\"\"\n    import foo \\\n        from 'lib'\n\n    foo a\n    \"\"\",\n  \"\"\"\n    import foo from 'lib';\n\n    foo(a);\n    \"\"\"\n\n  eqJS \"\"\"\n    import \\\n                    foo \\\n        from \\\n    'lib'\n\n    foo a\n    \"\"\",\n  \"\"\"\n    import foo from 'lib';\n\n    foo(a);\n    \"\"\"\n\n  eqJS \"\"\"\n    import \\\n          utilityBelt \\\n    , {\n      each\n    } from \\\n    'underscore'\n    \"\"\",\n  \"\"\"\n    import utilityBelt, {\n      each\n    } from 'underscore';\n    \"\"\"\n\ntest \"#4874: backslash `export`\", ->\n  eqJS \"\"\"\n    export \\\n      * \\\n            from \\\n      'underscore'\n    \"\"\",\n  \"\"\"\n    export * from 'underscore';\n    \"\"\"\n\n  eqJS \"\"\"\n    export \\\n        { max, min } \\\n              from \\\n      'underscore'\n  \"\"\",\n  \"\"\"\n    export {\n      max,\n      min\n    } from 'underscore';\n    \"\"\"\n\ntest \"#4834: dynamic import\", ->\n  eqJS \"\"\"\n    import('module').then ->\n  \"\"\",\n  \"\"\"\n    import('module').then(function() {});\n  \"\"\"\n\n  eqJS \"\"\"\n    foo = ->\n      bar = await import('bar')\n  \"\"\",\n  \"\"\"\n    var foo;\n\n    foo = async function() {\n      var bar;\n      return bar = (await import('bar'));\n    };\n  \"\"\"\n\n  eqJS \"\"\"\n    console.log import('foo')\n  \"\"\",\n  \"\"\"\n    console.log(import('foo'));\n  \"\"\"\n\ntest \"#5317: Support import.meta\", ->\n  eqJS \"\"\"\n    foo = import.meta\n  \"\"\",\n  \"\"\"\n    var foo;\n\n    foo = import.meta;\n  \"\"\"\n\n  eqJS \"\"\"\n    foo = import\n        .meta\n  \"\"\",\n  \"\"\"\n    var foo;\n\n    foo = import.meta;\n  \"\"\"\n\n  eqJS \"\"\"\n    foo = import.\n        meta\n  \"\"\",\n  \"\"\"\n    var foo;\n\n    foo = import.meta;\n  \"\"\"\n\n  eqJS \"\"\"\n    foo = import.meta.bar\n  \"\"\",\n  \"\"\"\n    var foo;\n\n    foo = import.meta.bar;\n  \"\"\"\n\n  eqJS \"\"\"\n    foo = import\n        .meta\n        .bar\n  \"\"\",\n  \"\"\"\n    var foo;\n\n    foo = import.meta.bar;\n  \"\"\"\n\n  eqJS \"\"\"\n    console.log import.meta.url\n  \"\"\",\n  \"\"\"\n    console.log(import.meta.url);\n  \"\"\"\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"numbers\">\n# Number Literals\n# ---------------\n\n# * Decimal Integer Literals\n# * Octal Integer Literals\n# * Hexadecimal Integer Literals\n# * Scientific Notation Integer Literals\n# * Scientific Notation Non-Integer Literals\n# * Non-Integer Literals\n# * Binary Integer Literals\n\n\n# Binary Integer Literals\n# Binary notation is understood as would be decimal notation.\n\ntest \"Parser recognises binary numbers\", ->\n  eq 4, 0b100\n\n# Decimal Integer Literals\n\ntest \"call methods directly on numbers\", ->\n  eq 4, 4.valueOf()\n  eq '11', 4.toString 3\n  eq '1000', 1_000.toString()\n\neq -1, 3 -4\n\n#764: Numbers should be indexable\neq Number::toString, 42['toString']\n\neq Number::toString, 42.toString\n\neq Number::toString, 2e308['toString'] # Infinity\n\n\n# Non-Integer Literals\n\n# Decimal number literals.\nvalue = .25 + .75\nok value is 1\nvalue = 0.0 + -.25 - -.75 + 0.0\nok value is 0.5\n\n#764: Numbers should be indexable\neq Number::toString,   4['toString']\neq Number::toString, 4.2['toString']\neq Number::toString, .42['toString']\neq Number::toString, (4)['toString']\n\neq Number::toString,   4.toString\neq Number::toString, 4.2.toString\neq Number::toString, .42.toString\neq Number::toString, (4).toString\n\ntest '#1168: leading floating point suppresses newline', ->\n  eq 1, do ->\n    1\n    .5 + 0.5\n\ntest \"Python-style octal literal notation '0o777'\", ->\n  eq 511, 0o777\n  eq 1, 0o1\n  eq 1, 0o00001\n  eq parseInt('0777', 8), 0o777\n  eq '777', 0o777.toString 8\n  eq 4, 0o4.valueOf()\n  eq Number::toString, 0o777['toString']\n  eq Number::toString, 0o777.toString\n\ntest \"#2060: Disallow uppercase radix prefixes\", ->\n  for char in ['b', 'o', 'x']\n    program = \"0#{char}0\"\n    doesNotThrowCompileError program, bare: yes\n    throwsCompileError program.toUpperCase(), bare: yes\n\ntest \"#5164: Allow lowercase and uppercase exponent notation\", ->\n  doesNotThrow -> CoffeeScript.compile \"0e0\", bare: yes\n  doesNotThrow -> CoffeeScript.compile \"0E0\", bare: yes\n\ntest \"#2224: hex literals with 0b or B or E\", ->\n  eq 176, 0x0b0\n  eq 177, 0x0B1\n  eq 225, 0xE1\n\ntest \"Infinity\", ->\n  eq Infinity, CoffeeScript.eval \"0b#{Array(1024 + 1).join('1')}\"\n  eq Infinity, CoffeeScript.eval \"0o#{Array(342 + 1).join('7')}\"\n  eq Infinity, CoffeeScript.eval \"0x#{Array(256 + 1).join('f')}\"\n  eq Infinity, CoffeeScript.eval Array(500 + 1).join('9')\n  eq Infinity, 2e308\n\ntest \"NaN\", ->\n  ok isNaN 1/NaN\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"numbers_bigint\">\n# BigInt Literals\n# ---------------\n\ntest \"BigInt exists\", ->\n  'object' is typeof BigInt\n\ntest \"Parser recognizes decimal BigInt literals\", ->\n  eq 42n, BigInt 42\n\ntest \"Parser recognizes decimal BigInt literals with separator\", ->\n  eq 1_000n, BigInt 1000\n\ntest \"Parser recognizes binary BigInt literals\", ->\n  eq 42n, 0b101010n\n\ntest \"Parser recognizes octal BigInt literals\", ->\n  eq 42n, 0o52n\n\ntest \"Parser recognizes hexadecimal BigInt literals\", ->\n  eq 42n, 0x2an\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"numeric_literal_separators\">\n# Numeric Literal Separators\n# --------------------------\n\ntest 'integer literals with separators', ->\n  eq 123_456, 123456\n  eq 12_34_56, 123456\n\ntest 'decimal literals with separators', ->\n  eq 1_2.34_5, 12.345\n  eq 1_0e1_0, 10e10\n  eq 1_2.34_5e6_7, 12.345e67\n\ntest 'hexadecimal literals with separators', ->\n  eq 0x1_2_3_4, 0x1234\n\ntest 'binary literals with separators', ->\n  eq 0b10_10, 0b1010\n\ntest 'octal literals with separators', ->\n  eq 0o7_7_7, 0o777\n\ntest 'infinity with separator', ->\n  eq 2e3_08, Infinity\n\ntest 'range with separators', ->\n  range = [10_000...10_002]\n  eq range.length, 2\n  eq range[0], 10000\n\ntest 'property access on a number', ->\n  # Somehow, `3..toFixed()` is valid JavaScript; though just `3.toFixed()`\n  # is not. CoffeeScript has long allowed code like `3.toFixed()` to compile\n  # into `3..toFixed()`.\n  eq 3.toFixed(), '3'\n  # Where this can conflict with numeric literal separators is when the\n  # property name contains an underscore.\n  Number::_23 = _23 = 'x'\n  eq 1._23, 'x'\n  ok 1._34 is undefined\n  delete Number::_23\n\ntest 'invalid decimal literal separators do not compile', ->\n  # `1._23` is a valid property access (see previous test)\n  throwsCompileError '1_.23'\n  throwsCompileError '1e_2'\n  throwsCompileError '1e2_'\n  throwsCompileError '1_'\n  throwsCompileError '1__2'\n\ntest 'invalid hexadecimal literal separators do not compile', ->\n  throwsCompileError '0x_1234'\n  throwsCompileError '0x1234_'\n  throwsCompileError '0x1__34'\n\ntest 'invalid binary literal separators do not compile', ->\n  throwsCompileError '0b_100'\n  throwsCompileError '0b100_'\n  throwsCompileError '0b1__1'\n\ntest 'invalid octal literal separators do not compile', ->\n  throwsCompileError '0o_777'\n  throwsCompileError '0o777_'\n  throwsCompileError '0o6__6'\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"object_rest_spread\">\ntest \"#4798 destructuring of objects with splat within arrays\", ->\n  arr = [1, {a:1, b:2}]\n  [...,{a, r...}] = arr\n  eq a, 1\n  deepEqual r, {b:2}\n  [b, {q...}] = arr\n  eq b, 1\n  deepEqual q, arr[1]\n  eq q.b, r.b\n  eq q.a, a\n\n  arr2 = [arr[1]]\n  [{a2...}] = arr2\n  eq a2.a, arr2[0].a\n\ntest \"destructuring assignment with objects and splats: ES2015\", ->\n  obj = {a: 1, b: 2, c: 3, d: 4, e: 5}\n  throwsCompileError \"{a, r..., s...} = x\", null, null, \"multiple rest elements are disallowed\"\n  throwsCompileError \"{a, r..., s..., b} = x\", null, null, \"multiple rest elements are disallowed\"\n  prop = \"b\"\n  {a, b, r...} = obj\n  eq a, 1\n  eq b, 2\n  eq r.e, obj.e\n  eq r.a, undefined\n  {d, c: x, r...} = obj\n  eq x, 3\n  eq d, 4\n  eq r.c, undefined\n  eq r.b, 2\n  {a, 'b': z, g = 9, r...} = obj\n  eq g, 9\n  eq z, 2\n  eq r.b, undefined\n\ntest \"destructuring assignment with splats and default values\", ->\n  obj = {}\n  c = {b: 1}\n  { a: {b} = c, d...} = obj\n\n  eq b, 1\n  deepEqual d, {}\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  {\n    a: {b} = c\n    d ...\n  } = obj\n\n  eq b, 1\n  deepEqual d, {}\n\ntest \"destructuring assignment with splat with default value\", ->\n  obj = {}\n  c = {val: 1}\n  { a: {b...} = c } = obj\n\n  deepEqual b, val: 1\n\ntest \"destructuring assignment with multiple splats in different objects\", ->\n  obj = { a: {val: 1}, b: {val: 2} }\n  { a: {a...}, b: {b...} } = obj\n  deepEqual a, val: 1\n  deepEqual b, val: 2\n\n  o = {\n    props: {\n      p: {\n        n: 1\n        m: 5\n      }\n      s: 6\n    }\n  }\n  {p: {m, q..., t = {obj...}}, r...} = o.props\n  eq m, o.props.p.m\n  deepEqual r, s: 6\n  deepEqual q, n: 1\n  deepEqual t, obj\n\n  @props = o.props\n  {p: {m}, r...} = @props\n  eq m, @props.p.m\n  deepEqual r, s: 6\n\n  {p: {m}, r...} = {o.props..., p:{m:9}}\n  eq m, 9\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  {\n    a: {\n      a ...\n    }\n    b: {\n      b ...\n    }\n  } = obj\n  deepEqual a, val: 1\n  deepEqual b, val: 2\n\ntest \"destructuring assignment with dynamic keys and splats\", ->\n  i = 0\n  foo = -> ++i\n\n  obj = {1: 'a', 2: 'b'}\n  { \"#{foo()}\": a, b... } = obj\n\n  eq a, 'a'\n  eq i, 1\n  deepEqual b, 2: 'b'\n\n# Tests from https://babeljs.io/docs/plugins/transform-object-rest-spread/.\ntest \"destructuring assignment with objects and splats: Babel tests\", ->\n  # What Babel calls “rest properties:”\n  { x, y, z... } = { x: 1, y: 2, a: 3, b: 4 }\n  eq x, 1\n  eq y, 2\n  deepEqual z, { a: 3, b: 4 }\n\n  # What Babel calls “spread properties:”\n  n = { x, y, z... }\n  deepEqual n, { x: 1, y: 2, a: 3, b: 4 }\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  { x, y, z ... } = { x: 1, y: 2, a: 3, b: 4 }\n  eq x, 1\n  eq y, 2\n  deepEqual z, { a: 3, b: 4 }\n\n  n = { x, y, z ... }\n  deepEqual n, { x: 1, y: 2, a: 3, b: 4 }\n\ntest \"deep destructuring assignment with objects: ES2015\", ->\n  a1={}; b1={}; c1={}; d1={}\n  obj = {\n    a: a1\n    b: {\n      'c': {\n        d: {\n          b1\n          e: c1\n          f: d1\n        }\n      }\n    }\n    b2: {b1, c1}\n  }\n  {a: w, b: {c: {d: {b1: bb, r1...}}}, r2...} = obj\n  eq r1.e, c1\n  eq r2.b, undefined\n  eq bb, b1\n  eq r2.b2, obj.b2\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  {a: w, b: {c: {d: {b1: bb, r1 ...}}}, r2 ...} = obj\n  eq r1.e, c1\n  eq r2.b, undefined\n  eq bb, b1\n  eq r2.b2, obj.b2\n\ntest \"deep destructuring assignment with defaults: ES2015\", ->\n  obj =\n    b: { c: 1, baz: 'qux' }\n    foo: 'bar'\n  j =\n    f: 'world'\n  i =\n    some: 'prop'\n  {\n    a...\n    b: { c, d... }\n    e: {\n      f: hello\n      g: { h... } = i\n    } = j\n  } = obj\n\n  deepEqual a, foo: 'bar'\n  eq c, 1\n  deepEqual d, baz: 'qux'\n  eq hello, 'world'\n  deepEqual h, some: 'prop'\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  {\n    a ...\n    b: {\n      c,\n      d ...\n    }\n    e: {\n      f: hello\n      g: {\n        h ...\n      } = i\n    } = j\n  } = obj\n\n  deepEqual a, foo: 'bar'\n  eq c, 1\n  deepEqual d, baz: 'qux'\n  eq hello, 'world'\n  deepEqual h, some: 'prop'\n\ntest \"object spread properties: ES2015\", ->\n  obj = {a: 1, b: 2, c: 3, d: 4, e: 5}\n  obj2 = {obj..., c:9}\n  eq obj2.c, 9\n  eq obj.a, obj2.a\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  obj2 = {\n    obj ...\n    c:9\n  }\n  eq obj2.c, 9\n  eq obj.a, obj2.a\n\n  obj2 = {obj..., a: 8, c: 9, obj...}\n  eq obj2.c, 3\n  eq obj.a, obj2.a\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  obj2 = {\n    obj ...\n    a: 8\n    c: 9\n    obj ...\n  }\n  eq obj2.c, 3\n  eq obj.a, obj2.a\n\n  obj3 = {obj..., b: 7, g: {obj2..., c: 1}}\n  eq obj3.g.c, 1\n  eq obj3.b, 7\n  deepEqual obj3.g, {obj..., c: 1}\n\n  (({a, b, r...}) ->\n    eq 1, a\n    deepEqual r, {c: 3, d: 44, e: 55}\n  ) {obj2..., d: 44, e: 55}\n\n  obj = {a: 1, b: 2, c: {d: 3, e: 4, f: {g: 5}}}\n  obj4 = {a: 10, obj.c...}\n  eq obj4.a, 10\n  eq obj4.d, 3\n  eq obj4.f.g, 5\n  deepEqual obj4.f, obj.c.f\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  (({\n    a\n    b\n    r ...\n    }) ->\n    eq 1, a\n    deepEqual r, {c: 3, d: 44, e: 55}\n  ) {\n    obj2 ...\n    d: 44\n    e: 55\n  }\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  obj4 = {\n    a: 10\n    obj.c ...\n  }\n  eq obj4.a, 10\n  eq obj4.d, 3\n  eq obj4.f.g, 5\n  deepEqual obj4.f, obj.c.f\n\n  obj5 = {obj..., ((k) -> {b: k})(99)...}\n  eq obj5.b, 99\n  deepEqual obj5.c, obj.c\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  obj5 = {\n    obj ...\n    ((k) -> {b: k})(99) ...\n  }\n  eq obj5.b, 99\n  deepEqual obj5.c, obj.c\n\n  fn = -> {c: {d: 33, e: 44, f: {g: 55}}}\n  obj6 = {obj..., fn()...}\n  eq obj6.c.d, 33\n  deepEqual obj6.c, {d: 33, e: 44, f: {g: 55}}\n\n  obj7 = {obj..., fn()..., {c: {d: 55, e: 66, f: {77}}}...}\n  eq obj7.c.d, 55\n  deepEqual obj6.c, {d: 33, e: 44, f: {g: 55}}\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  obj7 = {\n    obj ...\n    fn() ...\n    {c: {d: 55, e: 66, f: {77}}} ...\n  }\n  eq obj7.c.d, 55\n  deepEqual obj6.c, {d: 33, e: 44, f: {g: 55}}\n\n  obj =\n    a:\n      b:\n        c:\n          d:\n            e: {}\n  obj9 = {a:1, obj.a.b.c..., g:3}\n  deepEqual obj9.d, {e: {}}\n\n  a = \"a\"\n  c = \"c\"\n  obj9 = {a:1, obj[a].b[c]..., g:3}\n  deepEqual obj9.d, {e: {}}\n\n  obj9 = {a:1, obj.a[\"b\"].c[\"d\"]..., g:3}\n  deepEqual obj9[\"e\"], {}\n\ntest \"#4673: complex destructured object spread variables\", ->\n  b = c: 1\n  {{a...}...} = b\n  eq a.c, 1\n\n  d = {}\n  {d.e...} = f: 1\n  eq d.e.f, 1\n\n  {{g}...} = g: 1\n  eq g, 1\n\ntest \"rest element destructuring in function definition\", ->\n  obj = {a: 1, b: 2, c: 3, d: 4, e: 5}\n\n  (({a, b, r...}) ->\n    eq 1, a\n    eq 2, b,\n    deepEqual r, {c: 3, d: 4, e: 5}\n  ) obj\n\n  (({a: p, b, r...}, q) ->\n    eq p, 1\n    eq q, 9\n    deepEqual r, {c: 3, d: 4, e: 5}\n  ) {a:1, b:2, c:3, d:4, e:5}, 9\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  (({\n      a: p\n      b\n      r ...\n    }, q) ->\n    eq p, 1\n    eq q, 9\n    deepEqual r, {c: 3, d: 4, e: 5}\n  ) {a:1, b:2, c:3, d:4, e:5}, 9\n\n  a1={}; b1={}; c1={}; d1={}\n  obj1 = {\n    a: a1\n    b: {\n      'c': {\n        d: {\n          b1\n          e: c1\n          f: d1\n        }\n      }\n    }\n    b2: {b1, c1}\n  }\n\n  (({a: w, b: {c: {d: {b1: bb, r1...}}}, r2...}) ->\n    eq a1, w\n    eq bb, b1\n    eq r2.b, undefined\n    deepEqual r1, {e: c1, f: d1}\n    deepEqual r2.b2, {b1, c1}\n  ) obj1\n\n  b = 3\n  f = ({a, b...}) ->\n  f {}\n  eq 3, b\n\n  (({a, r...} = {}) ->\n    eq a, undefined\n    deepEqual r, {}\n  )()\n\n  (({a, r...} = {}) ->\n    eq a, 1\n    deepEqual r, {b: 2, c: 3}\n  ) {a: 1, b: 2, c: 3}\n\n  f = ({a, r...} = {}) -> [a, r]\n  deepEqual [undefined, {}], f()\n  deepEqual [1, {b: 2}], f {a: 1, b: 2}\n  deepEqual [1, {}], f {a: 1}\n\n  f = ({a, r...} = {a: 1, b: 2}) -> [a, r]\n  deepEqual [1, {b:2}], f()\n  deepEqual [2, {}], f {a:2}\n  deepEqual [3, {c:5}], f {a:3, c:5}\n\n  f = ({ a: aa = 0, b: bb = 0 }) -> [aa, bb]\n  deepEqual [0, 0], f {}\n  deepEqual [0, 42], f {b:42}\n  deepEqual [42, 0], f {a:42}\n  deepEqual [42, 43], f {a:42, b:43}\n\ntest \"#4673: complex destructured object spread variables\", ->\n  f = ({{a...}...}) ->\n    a\n  eq f(c: 1).c, 1\n\n  g = ({@y...}) ->\n    eq @y.b, 1\n  g b: 1\n\ntest \"#4834: dynamic import can technically be object spread\", ->\n  eqJS \"\"\"\n    x = {...import('module')}\n  \"\"\",\n  \"\"\"\n    var x;\n\n    x = {...import('module')};\n  \"\"\"\n\ntest \"#5168: allow indented property index\", ->\n  a = b: c: 3\n\n  eq 3, {\n    ...a[\n      if yes\n        'b'\n      else\n        'c'\n    ]\n  }.c\n\ntest \"#5291: soaks/prototype shorthands in object spread variables\", ->\n  withPrototype =\n    prototype:\n      b: {c: 1}\n  eq {withPrototype::b...}.c, 1\n  eq {...withPrototype::b}.c, 1\n\n  withSoak =\n    b:\n      c: 2\n  eq {withSoak?.b...}.c, 2\n  eq {...withSoak?.b}.c, 2\n\n  soakedCall = ->\n    b:\n      c: 3\n  eq {soakedCall?().b...}.c, 3\n  eq {...soakedCall?().b}.c, 3\n\n  assignToPrototype =\n    prototype: {}\n  {...assignToPrototype::b} = c: 4\n  eq assignToPrototype::b.c, 4\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"objects\">\n# Object Literals\n# ---------------\n\n# TODO: refactor object literal tests\n# TODO: add indexing and method invocation tests: {a}['a'] is a, {a}.a()\n\ntrailingComma = {k1: \"v1\", k2: 4, k3: (-> true),}\nok trailingComma.k3() and (trailingComma.k2 is 4) and (trailingComma.k1 is \"v1\")\n\nok {a: (num) -> num is 10 }.a 10\n\nmoe = {\n  name:  'Moe'\n  greet: (salutation) ->\n    salutation + \" \" + @name\n  hello: ->\n    @['greet'] \"Hello\"\n  10: 'number'\n}\nok moe.hello() is \"Hello Moe\"\nok moe[10] is 'number'\nmoe.hello = ->\n  this['greet'] \"Hello\"\nok moe.hello() is 'Hello Moe'\n\nobj = {\n  is:     -> yes,\n  'not':  -> no,\n}\nok obj.is()\nok not obj.not()\n\n### Top-level object literal... ###\nobj: 1\n### ...doesn't break things. ###\n\n# Object literals should be able to include keywords.\nobj = {class: 'höt'}\nobj.function = 'dog'\nok obj.class + obj.function is 'hötdog'\n\n# Implicit objects as part of chained calls.\npluck = (x) -> x.a\neq 100, pluck pluck pluck a: a: a: 100\n\n\ntest \"YAML-style object literals\", ->\n  obj =\n    a: 1\n    b: 2\n  eq 1, obj.a\n  eq 2, obj.b\n\n  config =\n    development:\n      server: 'localhost'\n      timeout: 10\n\n    production:\n      server: 'dreamboat'\n      timeout: 1000\n\n  ok config.development.server  is 'localhost'\n  ok config.production.server   is 'dreamboat'\n  ok config.development.timeout is 10\n  ok config.production.timeout  is 1000\n\nobj =\n  a: 1,\n  b: 2,\nok obj.a is 1\nok obj.b is 2\n\n# Implicit objects nesting.\nobj =\n  options:\n    value: yes\n  fn: ->\n    {}\n    null\nok obj.options.value is yes\nok obj.fn() is null\n\n# Implicit objects with wacky indentation:\nobj =\n  'reverse': (obj) ->\n    Array.prototype.reverse.call obj\n  abc: ->\n    @reverse(\n      @reverse @reverse ['a', 'b', 'c'].reverse()\n    )\n  one: [1, 2,\n    a: 'b'\n  3, 4]\n  red:\n    orange:\n          yellow:\n                  green: 'blue'\n    indigo: 'violet'\n  misdent: [[],\n  [],\n                  [],\n      []]\nok obj.abc().join(' ') is 'a b c'\nok obj.one.length is 5\nok obj.one[4] is 4\nok obj.one[2].a is 'b'\nok (key for key of obj.red).length is 2\nok obj.red.orange.yellow.green is 'blue'\nok obj.red.indigo is 'violet'\nok obj.misdent.toString() is ',,,'\n\n#542: Objects leading expression statement should be parenthesized.\n{f: -> ok yes }.f() + 1\n\n# String-keyed objects shouldn't suppress newlines.\none =\n  '>!': 3\nsix: -> 10\nok not one.six\n\n# Shorthand objects with property references.\nobj =\n  ### comment one ###\n  ### comment two ###\n  one: 1\n  two: 2\n  object: -> {@one, @two}\n  list:   -> [@one, @two]\nresult = obj.object()\neq result.one, 1\neq result.two, 2\neq result.two, obj.list()[1]\n\nthird = (a, b, c) -> c\nobj =\n  one: 'one'\n  two: third 'one', 'two', 'three'\nok obj.one is 'one'\nok obj.two is 'three'\n\ntest \"invoking functions with implicit object literals\", ->\n  generateGetter = (prop) -> (obj) -> obj[prop]\n  getA = generateGetter 'a'\n  getArgs = -> arguments\n  a = b = 30\n\n  result = getA\n    a: 10\n  eq 10, result\n\n  result = getA\n    \"a\": 20\n  eq 20, result\n\n  result = getA a,\n    b:1\n  eq undefined, result\n\n  result = getA b:1,\n  a:43\n  eq 43, result\n\n  result = getA b:1,\n    a:62\n  eq undefined, result\n\n  result = getA\n    b:1\n    a\n  eq undefined, result\n\n  result = getA\n    a:\n      b:2\n    b:1\n  eq 2, result.b\n\n  result = getArgs\n    a:1\n    b\n    c:1\n  ok result.length is 3\n  ok result[2].c is 1\n\n  result = getA b: 13, a: 42, 2\n  eq 42, result\n\n  result = getArgs a:1, (1 + 1)\n  ok result[1] is 2\n\n  result = getArgs a:1, b\n  ok result.length is 2\n  ok result[1] is 30\n\n  result = getArgs a:1, b, b:1, a\n  ok result.length is 4\n  ok result[2].b is 1\n\n  throwsCompileError \"a = b:1, c\"\n\ntest \"some weird indentation in YAML-style object literals\", ->\n  two = (a, b) -> b\n  obj = then two 1,\n    1: 1\n    a:\n      b: ->\n        fn c,\n          d: e\n    f: 1\n  eq 1, obj[1]\n\ntest \"#1274: `{} = a()` compiles to `false` instead of `a()`\", ->\n  a = false\n  fn = -> a = true\n  {} = fn()\n  ok a\n\ntest \"#1436: `for` etc. work as normal property names\", ->\n  obj = {}\n  eq no, obj.hasOwnProperty 'for'\n  obj.for = 'foo' of obj\n  eq yes, obj.hasOwnProperty 'for'\n\ntest \"#2706, Un-bracketed object as argument causes inconsistent behavior\", ->\n  foo = (x, y) -> y\n  bar = baz: yes\n\n  eq yes, foo x: 1, bar.baz\n\ntest \"#2608, Allow inline objects in arguments to be followed by more arguments\", ->\n  foo = (x, y) -> y\n\n  eq yes, foo x: 1, y: 2, yes\n\ntest \"#2308, a: b = c:1\", ->\n  foo = a: b = c: yes\n  eq b.c, yes\n  eq foo.a.c, yes\n\ntest \"#2317, a: b c: 1\", ->\n  foo = (x) -> x\n  bar = a: foo c: yes\n  eq bar.a.c, yes\n\ntest \"#1896, a: func b, {c: d}\", ->\n  first = (x) -> x\n  second = (x, y) -> y\n  third = (x, y, z) -> z\n\n  one = 1\n  two = 2\n  three = 3\n  four = 4\n\n  foo = a: second one, {c: two}\n  eq foo.a.c, two\n\n  bar = a: second one, c: two\n  eq bar.a.c, two\n\n  baz = a: second one, {c: two}, e: first first h: three\n  eq baz.a.c, two\n\n  qux = a: third one, {c: two}, e: first first h: three\n  eq qux.a.e.h, three\n\n  quux = a: third one, {c: two}, e: first(three), h: four\n  eq quux.a.e, three\n  eq quux.a.h, four\n\n  corge = a: third one, {c: two}, e: second three, h: four\n  eq corge.a.e.h, four\n\ntest \"Implicit objects, functions and arrays\", ->\n  first  = (x) -> x\n  second = (x, y) -> y\n\n  foo = [\n    1\n    one: 1\n    two: 2\n    three: 3\n    more:\n      four: 4\n      five: 5, six: 6\n    2, 3, 4\n    5]\n  eq foo[2], 2\n  eq foo[1].more.six, 6\n\n  bar = [\n    1\n    first first first second 1,\n      one: 1, twoandthree: twoandthree: two: 2, three: 3\n      2,\n    2\n    one: 1\n    two: 2\n    three: first second ->\n      no\n    , ->\n      3\n    3\n    4]\n  eq bar[2], 2\n  eq bar[1].twoandthree.twoandthree.two, 2\n  eq bar[3].three(), 3\n  eq bar[4], 3\n\ntest \"#2549, Brace-less Object Literal as a Second Operand on a New Line\", ->\n  foo = no or\n    one: 1\n    two: 2\n    three: 3\n  eq foo.one, 1\n\n  bar = yes and one: 1\n  eq bar.one, 1\n\n  baz = null ?\n    one: 1\n    two: 2\n  eq baz.two, 2\n\ntest \"#2757, Nested\", ->\n  foo =\n    bar:\n      one: 1,\n  eq foo.bar.one, 1\n\n  baz =\n    qux:\n      one: 1,\n    corge:\n      two: 2,\n      three: three: three: 3,\n    xyzzy:\n      thud:\n        four:\n          four: 4,\n      five: 5,\n\n  eq baz.qux.one, 1\n  eq baz.corge.three.three.three, 3\n  eq baz.xyzzy.thud.four.four, 4\n  eq baz.xyzzy.five, 5\n\ntest \"#1865, syntax regression 1.1.3\", ->\n  foo = (x, y) -> y\n\n  bar = a: foo (->),\n    c: yes\n  eq bar.a.c, yes\n\n  baz = a: foo (->), c: yes\n  eq baz.a.c, yes\n\n\ntest \"#1322: implicit call against implicit object with block comments\", ->\n  ((obj, arg) ->\n    eq obj.x * obj.y, 6\n    ok not arg\n  )\n    ###\n    x\n    ###\n    x: 2\n    ### y ###\n    y: 3\n\ntest \"#1513: Top level bare objs need to be wrapped in parens for unary and existence ops\", ->\n  doesNotThrow -> CoffeeScript.run \"{}?\", bare: true\n  doesNotThrow -> CoffeeScript.run \"{}.a++\", bare: true\n\ntest \"#1871: Special case for IMPLICIT_END in the middle of an implicit object\", ->\n  result = 'result'\n  ident = (x) -> x\n\n  result = ident one: 1 if false\n\n  eq result, 'result'\n\n  result = ident\n    one: 1\n    two: 2 for i in [1..3]\n\n  eq result.two.join(' '), '2 2 2'\n\ntest \"#1871: implicit object closed by IMPLICIT_END in implicit returns\", ->\n  ob = do ->\n    a: 1 if no\n  eq ob, undefined\n\n  # instead these return an object\n  func = ->\n    key:\n      i for i in [1, 2, 3]\n\n  eq func().key.join(' '), '1 2 3'\n\n  func = ->\n    key: (i for i in [1, 2, 3])\n\n  eq func().key.join(' '), '1 2 3'\n\ntest \"#1961, #1974, regression with compound assigning to an implicit object\", ->\n\n  obj = null\n\n  obj ?=\n    one: 1\n    two: 2\n\n  eq obj.two, 2\n\n  obj = null\n\n  obj or=\n    three: 3\n    four: 4\n\n  eq obj.four, 4\n\ntest \"#2207: Immediate implicit closes don't close implicit objects\", ->\n  func = ->\n    key: for i in [1, 2, 3] then i\n\n  eq func().key.join(' '), '1 2 3'\n\ntest \"#3216: For loop declaration as a value of an implicit object\", ->\n  test = [0..2]\n  ob =\n    a: for v, i in test then i\n    b: for v, i in test then i\n    c: for v in test by 1 then v\n    d: for v in test when true then v\n  arrayEq ob.a, test\n  arrayEq ob.b, test\n  arrayEq ob.c, test\n  arrayEq ob.d, test\n  byFirstKey =\n    a: for v in test by 1 then v\n  arrayEq byFirstKey.a, test\n  whenFirstKey =\n    a: for v in test when true then v\n  arrayEq whenFirstKey.a, test\n\ntest 'inline implicit object literals within multiline implicit object literals', ->\n  x =\n    a: aa: 0\n    b: 0\n  eq 0, x.b\n  eq 0, x.a.aa\n\ntest \"object keys with interpolations: simple cases\", ->\n  a = 'a'\n  obj = \"#{a}\": yes\n  eq obj.a, yes\n  obj = {\"#{a}\": yes}\n  eq obj.a, yes\n  obj = {\"#{a}\"}\n  eq obj.a, 'a'\n  obj = {\"#{5}\"}\n  eq obj[5], '5' # Note that the value is a string, just like the key.\n\ntest \"object keys with interpolations: commas in implicit object\", ->\n  obj = \"#{'a'}\": 1, b: 2\n  deepEqual obj, {a: 1, b: 2}\n  obj = a: 1, \"#{'b'}\": 2\n  deepEqual obj, {a: 1, b: 2}\n  obj = \"#{'a'}\": 1, \"#{'b'}\": 2\n  deepEqual obj, {a: 1, b: 2}\n\ntest \"object keys with interpolations: commas in explicit object\", ->\n  obj = {\"#{'a'}\": 1, b: 2}\n  deepEqual obj, {a: 1, b: 2}\n  obj = {a: 1, \"#{'b'}\": 2}\n  deepEqual obj, {a: 1, b: 2}\n  obj = {\"#{'a'}\": 1, \"#{'b'}\": 2}\n  deepEqual obj, {a: 1, b: 2}\n\ntest \"object keys with interpolations: commas after key with interpolation\", ->\n  obj = {\"#{'a'}\": yes,}\n  eq obj.a, yes\n  obj = {\n    \"#{'a'}\": 1,\n    \"#{'b'}\": 2,\n    ### herecomment ###\n    \"#{'c'}\": 3,\n  }\n  deepEqual obj, {a: 1, b: 2, c: 3}\n  obj =\n    \"#{'a'}\": 1,\n    \"#{'b'}\": 2,\n    ### herecomment ###\n    \"#{'c'}\": 3,\n  deepEqual obj, {a: 1, b: 2, c: 3}\n  obj =\n    \"#{'a'}\": 1,\n    \"#{'b'}\": 2,\n    ### herecomment ###\n    \"#{'c'}\": 3, \"#{'d'}\": 4,\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4}\n\ntest \"object keys with interpolations: key with interpolation mixed with `@prop`\", ->\n  deepEqual (-> {@a, \"#{'b'}\": 2}).call(a: 1), {a: 1, b: 2}\n\ntest \"object keys with interpolations: evaluate only once\", ->\n  count = 0\n  a = -> count++; 'a'\n  obj = {\"#{a()}\"}\n  eq obj.a, 'a'\n  eq count, 1\n\ntest \"object keys with interpolations: evaluation order\", ->\n  arr = []\n  obj =\n    a: arr.push 1\n    b: arr.push 2\n    \"#{'c'}\": arr.push 3\n    \"#{'d'}\": arr.push 4\n    e: arr.push 5\n    \"#{'f'}\": arr.push 6\n    g: arr.push 7\n  arrayEq arr, [1..7]\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7}\n\ntest \"object keys with interpolations: object starting with dynamic key\", ->\n  obj =\n    \"#{'a'}\": 1\n    b: 2\n  deepEqual obj, {a: 1, b: 2}\n\ntest \"object keys with interpolations: comments in implicit object\", ->\n  obj =\n    ### leading comment ###\n    \"#{'a'}\": 1\n\n    ### middle ###\n\n    \"#{'b'}\": 2\n    # regular comment\n    'c': 3\n    ### foo ###\n    d: 4\n    \"#{'e'}\": 5\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5}\n\n  # Comments in explicit object.\n  obj = {\n    ### leading comment ###\n    \"#{'a'}\": 1\n\n    ### middle ###\n\n    \"#{'b'}\": 2\n    # regular comment\n    'c': 3\n    ### foo ###\n    d: 4\n    \"#{'e'}\": 5\n  }\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5}\n\ntest \"object keys with interpolations: more complicated case\", ->\n  obj = {\n    \"#{'interpolated'}\":\n      \"\"\"\n        #{ '''nested''' }\n      \"\"\": 123: 456\n  }\n  deepEqual obj,\n    interpolated:\n      nested:\n        123: 456\n\ntest \"#4324: Shorthand after interpolated key\", ->\n  a = 2\n  obj = {\"#{1}\": 1, a}\n  eq 1, obj[1]\n  eq 2, obj.a\n\ntest \"computed property keys: simple cases\", ->\n  a = 'a'\n  obj = [a]: yes\n  eq obj.a, yes\n  obj = {[a]: yes}\n  eq obj.a, yes\n  obj = {[a]}\n  eq obj.a, 'a'\n  obj = {[5]}\n  eq obj[5], 5\n  obj = {['5']}\n  eq obj['5'], '5'\n\ntest \"computed property keys: commas in implicit object\", ->\n  obj = ['a']: 1, b: 2\n  deepEqual obj, {a: 1, b: 2}\n  obj = a: 1, ['b']: 2\n  deepEqual obj, {a: 1, b: 2}\n  obj = ['a']: 1, ['b']: 2\n  deepEqual obj, {a: 1, b: 2}\n\ntest \"computed property keys: commas in explicit object\", ->\n  obj = {['a']: 1, b: 2}\n  deepEqual obj, {a: 1, b: 2}\n  obj = {a: 1, ['b']: 2}\n  deepEqual obj, {a: 1, b: 2}\n  obj = {['a']: 1, ['b']: 2}\n  deepEqual obj, {a: 1, b: 2}\n\ntest \"computed property keys: commas after key with interpolation\", ->\n  obj = {['a']: yes,}\n  eq obj.a, yes\n  obj = {\n    ['a']: 1,\n    ['b']: 2,\n    ### herecomment ###\n    ['c']: 3,\n  }\n  deepEqual obj, {a: 1, b: 2, c: 3}\n  obj =\n    ['a']: 1,\n    ['b']: 2,\n    ### herecomment ###\n    ['c']: 3,\n  deepEqual obj, {a: 1, b: 2, c: 3}\n  obj =\n    ['a']: 1,\n    ['b']: 2,\n    ### herecomment ###\n    ['c']: 3, ['d']: 4,\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4}\n\ntest \"computed property keys: key with interpolation mixed with `@prop`\", ->\n  deepEqual (-> {@a, ['b']: 2}).call(a: 1), {a: 1, b: 2}\n\ntest \"computed property keys: evaluate only once\", ->\n  count = 0\n  a = -> count++; 'a'\n  obj = {[a()]}\n  eq obj.a, 'a'\n  eq count, 1\n\ntest \"computed property keys: evaluation order\", ->\n  arr = []\n  obj =\n    a: arr.push 1\n    b: arr.push 2\n    ['c']: arr.push 3\n    ['d']: arr.push 4\n    e: arr.push 5\n    ['f']: arr.push 6\n    g: arr.push 7\n  arrayEq arr, [1..7]\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7}\n\ntest \"computed property keys: object starting with dynamic key\", ->\n  obj =\n    ['a']: 1\n    b: 2\n  deepEqual obj, {a: 1, b: 2}\n\ntest \"computed property keys: comments in implicit object\", ->\n  obj =\n    ### leading comment ###\n    ['a']: 1\n\n    ### middle ###\n\n    ['b']: 2\n    # regular comment\n    'c': 3\n    ### foo ###\n    d: 4\n    ['e']: 5\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5}\n\n  obj = {\n    ### leading comment ###\n    ['a']: 1\n\n    ### middle ###\n\n    ['b']: 2\n    # regular comment\n    'c': 3\n    ### foo ###\n    d: 4\n    ['e']: 5\n  }\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5}\n\ntest \"computed property keys: more complicated case\", ->\n  obj = {\n    ['interpolated']:\n       ['nested']:\n         123: 456\n  }\n  deepEqual obj,\n    interpolated:\n      nested:\n        123: 456\n\ntest \"computed property keys: empty array as key\", ->\n  o1 = { [[]] }\n  deepEqual o1, { [[]]: [] }\n  arrayEq o1[[]], []\n  o2 = { [[]]: 1 }\n  deepEqual o2, { [[]]: 1 }\n  eq o2[[]], 1\n  o3 = [[]]: 1\n  deepEqual o3, { [[]]: 1 }\n  deepEqual o3, { [[]]: 1 }\n  eq o3[[]], 1\n  o4 = a: 1, [[]]: 2\n  deepEqual o4, { a: 1, [[]]: 2 }\n  eq o4.a, 1,\n  eq o4[[]], 2\n  o5 = { a: 1, [[]]: 2 }\n  deepEqual o5, { a: 1, [[]]: 2 }\n  eq o5.a, 1,\n  eq o5[[]], 2\n\ntest \"computed property keys: shorthand after computed property key\", ->\n  a = 2\n  obj = {[1]: 1, a}\n  eq 1, obj[1]\n  eq 2, obj.a\n\ntest \"computed property keys: shorthand computed property key\", ->\n  a = 'b'\n  o = {[a]}\n  p = {a}\n  r = {['a']}\n  eq o.b, 'b'\n  eq p.a, o.b\n  eq r.a, 'a'\n\n  foo = -> \"a\"\n  obj = { [foo()] }\n  eq obj.a, 'a'\n\ntest \"computed property keys: arrays\", ->\n  b = 'b'\n  f = (c) -> \"#{c}1\"\n  obj =\n    ['a']: [1, 2, 3]\n    [b]: [4, 5, 6]\n    [f(b)]: [7, 8, 9]\n  arrayEq obj.a, [1, 2, 3]\n  arrayEq obj.b, [4, 5, 6]\n  arrayEq obj.b1, [7, 8, 9]\n\ntest \"computed property keys: examples from developer.mozilla.org (Object initializer)\", ->\n  i = 0\n  obj =\n    ['foo' + ++i]: i\n    ['foo' + ++i]: i\n    ['foo' + ++i]: i\n  eq obj.foo1, 1\n  eq obj.foo2, 2\n  eq obj.foo3, 3\n\n  param = 'size'\n  config =\n    [param]: 12,\n    ['mobile' + param.charAt(0).toUpperCase() + param.slice(1)]: 4\n  deepEqual config, {size: 12,  mobileSize: 4}\n\ntest \"computed property keys: [Symbol.iterator]\", ->\n  obj =\n    [Symbol.iterator]: ->\n      yield \"hello\"\n      yield \"world\"\n  arrayEq [obj...], ['hello', 'world']\n\ntest \"computed property keys: Class property\", ->\n  increment_method = \"increment\"\n  decrement_method = \"decrement\"\n  class Obs\n    constructor: (@count) ->\n    [increment_method]: -> @count += 1\n    [decrement_method]: -> @count -= 1\n  ob = new Obs 2\n  eq ob.increment(), 3\n  eq ob.decrement(), 2\n\ntest \"#1263: Braceless object return\", ->\n  fn = ->\n    return\n      a: 1\n      b: 2\n      c: -> 3\n\n  obj = fn()\n  eq 1, obj.a\n  eq 2, obj.b\n  eq 3, obj.c()\n\ntest \"#4564: indent should close implicit object\", ->\n  f = (x) -> x\n\n  arrayEq ['a'],\n    for key of f a: 1\n      key\n\n  g = null\n  if f a: 1\n    g = 3\n  eq g, 3\n\n  h = null\n  if a: (i for i in [1, 2, 3])\n    h = 4\n  eq h, 4\n\ntest \"#4544: Postfix conditionals in first line of implicit object literals\", ->\n  two =\n    foo:\n      bar: 42 if yes\n      baz: 1337\n  eq 42, two.foo.bar\n  eq 1337, two.foo.baz\n\n  f = (x) -> x\n\n  three =\n    foo: f\n      bar: 42 if yes\n      baz: 1337\n  eq 42, three.foo.bar\n  eq 1337, three.foo.baz\n\n  four =\n    f\n      foo:\n        bar: 42 if yes\n      baz: 1337\n  eq 42, four.foo.bar\n  eq 1337, four.baz\n\n  x = bar: 42 if no\n  baz: 1337\n  ok not x?\n\n  # Example from #2051\n  a = null\n  _alert = (arg) -> a = arg\n  _alert\n    val3: \"works\" if true\n    val: \"hello\"\n    val2: \"all good\"\n  eq a.val2, \"all good\"\n\ntest \"#4579: Postfix for/while/until in first line of implicit object literals\", ->\n  two =\n    foo:\n      bar1: x for x in [1, 2, 3]\n      bar2: x + y for x, y in [1, 2, 3]\n      baz: 1337\n  arrayEq [1, 2, 3], two.foo.bar1\n  arrayEq [1, 3, 5], two.foo.bar2\n  eq 1337, two.foo.baz\n\n  f = (x) -> x\n\n  three =\n    foo: f\n      bar1: x + y for x, y of a: 'b', c: 'd'\n      bar2: x + 'c' for x of a: 1, b: 2\n      baz: 1337\n  arrayEq ['ab', 'cd'], three.foo.bar1\n  arrayEq ['ac', 'bc'], three.foo.bar2\n  eq 1337, three.foo.baz\n\n  four =\n    f\n      foo:\n        \"bar_#{x}\": x for x of a: 1, b: 2\n      baz: 1337\n  eq 'a', four.foo[0].bar_a\n  eq 'b', four.foo[1].bar_b\n  eq 1337, four.baz\n\n  x = bar: 42 for y in [1]\n  baz: 1337\n  eq x.bar, 42\n\n  i = 5\n  five =\n    foo:\n      bar: i while i-- > 0\n      baz: 1337\n  arrayEq [4, 3, 2, 1, 0], five.foo.bar\n  eq 1337, five.foo.baz\n\n  i = 5\n  six =\n    foo:\n      bar: i until i-- <= 0\n      baz: 1337\n  arrayEq [4, 3, 2, 1, 0], six.foo.bar\n  eq 1337, six.foo.baz\n\ntest \"#5204: not parsed as static property\", ->\n  doesNotThrowCompileError \"@ [b]: 2\"\n\ntest \"#5292: implicit object after line continuer in implicit object property value\", ->\n  a =\n    b: 0 or\n      c: 1\n  eq 1, a.b.c\n\n  # following object property\n  a =\n    b: null ?\n      c: 1\n    d: 2\n  eq 1, a.b.c\n  eq 2, a.d\n\n  # multiline nested object\n  a =\n    b: 0 or\n      c: 1\n      d: 2\n    e: 3\n  eq 1, a.b.c\n  eq 2, a.b.d\n  eq 3, a.e\n\ntest \"#5368: continuing object and array literals\", ->\n  { a\n    b: { c }\n  } = {a: 1, b: {c: 2}}\n  eq a, 1\n  eq c, 2\n\n  [d\n   e: f\n  ] = [3, {e: 4}]\n  eq d, 3\n  eq f, 4\n  A =\n    [d\n     e: f\n    ]\n  eq A[0], 3\n  eq A[1].e, 4\n\n  for obj in [\n    {a: a\n     c: c\n    }\n    {a: a\n     c\n    }\n    {a\n     c: c\n    }\n    {a\n     c\n    }\n  ]\n    eq obj.a, 1\n    eq obj.c, 2\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"operators\">\n# Operators\n# ---------\n\n# * Operators\n# * Existential Operator (Binary)\n# * Existential Operator (Unary)\n# * Aliased Operators\n# * [not] in/of\n# * Chained Comparison\n\ntest \"binary (2-ary) math operators do not require spaces\", ->\n  a = 1\n  b = -1\n  eq +1, a*-b\n  eq -1, a*+b\n  eq +1, a/-b\n  eq -1, a/+b\n\ntest \"operators should respect new lines as spaced\", ->\n  a = 123 +\n  456\n  eq 579, a\n\n  b = \"1#{2}3\" +\n  \"456\"\n  eq '123456', b\n\ntest \"multiple operators should space themselves\", ->\n  eq (+ +1), (- -1)\n\ntest \"compound operators on successive lines\", ->\n  a = 1\n  a +=\n  1\n  eq a, 2\n\ntest \"bitwise operators\", ->\n  eq  2, (10 &   3)\n  eq 11, (10 |   3)\n  eq  9, (10 ^   3)\n  eq 80, (10 <<  3)\n  eq  1, (10 >>  3)\n  eq  1, (10 >>> 3)\n  num = 10; eq  2, (num &=   3)\n  num = 10; eq 11, (num |=   3)\n  num = 10; eq  9, (num ^=   3)\n  num = 10; eq 80, (num <<=  3)\n  num = 10; eq  1, (num >>=  3)\n  num = 10; eq  1, (num >>>= 3)\n\ntest \"`instanceof`\", ->\n  ok new String instanceof String\n  ok new Boolean instanceof Boolean\n  # `instanceof` supports negation by prefixing the operator with `not`\n  ok new Number not instanceof String\n  ok new Array not instanceof Boolean\n\ntest \"use `::` operator on keywords `this` and `@`\", ->\n  nonce = {}\n  obj =\n    withAt:   -> @::prop\n    withThis: -> this::prop\n  obj.prototype = prop: nonce\n  eq nonce, obj.withAt()\n  eq nonce, obj.withThis()\n\n\n# Existential Operator (Binary)\n\ntest \"binary existential operator\", ->\n  nonce = {}\n\n  b = a ? nonce\n  eq nonce, b\n\n  a = null\n  b = undefined\n  b = a ? nonce\n  eq nonce, b\n\n  a = false\n  b = a ? nonce\n  eq false, b\n\n  a = 0\n  b = a ? nonce\n  eq 0, b\n\ntest \"binary existential operator conditionally evaluates second operand\", ->\n  i = 1\n  func = -> i -= 1\n  result = func() ? func()\n  eq result, 0\n\ntest \"binary existential operator with negative number\", ->\n  a = null ? - 1\n  eq -1, a\n\n\n# Existential Operator (Unary)\n\ntest \"postfix existential operator\", ->\n  ok (if nonexistent? then false else true)\n  defined = true\n  ok defined?\n  defined = false\n  ok defined?\n\ntest \"postfix existential operator only evaluates its operand once\", ->\n  semaphore = 0\n  fn = ->\n    ok false if semaphore\n    ++semaphore\n  ok(if fn()? then true else false)\n\ntest \"negated postfix existential operator\", ->\n  ok !nothing?.value\n\ntest \"postfix existential operator on expressions\", ->\n  eq true, (1 or 0)?, true\n\n\n# `is`,`isnt`,`==`,`!=`\n\ntest \"`==` and `is` should be interchangeable\", ->\n  a = b = 1\n  ok a is 1 and b == 1\n  ok a == b\n  ok a is b\n\ntest \"`!=` and `isnt` should be interchangeable\", ->\n  a = 0\n  b = 1\n  ok a isnt 1 and b != 0\n  ok a != b\n  ok a isnt b\n\n\n# [not] in/of\n\n# - `in` should check if an array contains a value using `indexOf`\n# - `of` should check if a property is defined on an object using `in`\ntest \"in, of\", ->\n  arr = [1]\n  ok 0 of arr\n  ok 1 in arr\n  # prefixing `not` to `in and `of` should negate them\n  ok 1 not of arr\n  ok 0 not in arr\n\ntest \"`in` should be able to operate on an array literal\", ->\n  ok 2 in [0, 1, 2, 3]\n  ok 4 not in [0, 1, 2, 3]\n  arr = [0, 1, 2, 3]\n  ok 2 in arr\n  ok 4 not in arr\n  # should cache the value used to test the array\n  arr = [0]\n  val = 0\n  ok val++ in arr\n  ok val++ not in arr\n  val = 0\n  ok val++ of arr\n  ok val++ not of arr\n\ntest \"`of` and `in` should be able to operate on instance variables\", ->\n  obj = {\n    list: [2,3]\n    in_list: (value) -> value in @list\n    not_in_list: (value) -> value not in @list\n    of_list: (value) -> value of @list\n    not_of_list: (value) -> value not of @list\n  }\n  ok obj.in_list 3\n  ok obj.not_in_list 1\n  ok obj.of_list 0\n  ok obj.not_of_list 2\n\ntest \"#???: `in` with cache and `__indexOf` should work in argument lists\", ->\n  eq 1, [Object() in Array()].length\n\ntest \"#737: `in` should have higher precedence than logical operators\", ->\n  eq 1, 1 in [1] and 1\n\ntest \"#768: `in` should preserve evaluation order\", ->\n  share = 0\n  a = -> share++ if share is 0\n  b = -> share++ if share is 1\n  c = -> share++ if share is 2\n  ok a() not in [b(),c()]\n  eq 3, share\n\ntest \"#1099: empty array after `in` should compile to `false`\", ->\n  eq 1, [5 in []].length\n  eq false, do -> return 0 in []\n\ntest \"#1354: optimized `in` checks should not happen when splats are present\", ->\n  a = [6, 9]\n  eq 9 in [3, a...], true\n\ntest \"#1100: precedence in or-test compilation of `in`\", ->\n  ok 0 in [1 and 0]\n  ok 0 in [1, 1 and 0]\n  ok not (0 in [1, 0 or 1])\n\ntest \"#1630: `in` should check `hasOwnProperty`\", ->\n  ok undefined not in length: 1\n\ntest \"#1714: lexer bug with raw range `for` followed by `in`\", ->\n  0 for [1..2]\n  ok not ('a' in ['b'])\n\n  0 for [1..2]; ok not ('a' in ['b'])\n\n  0 for [1..10] # comment ending\n  ok not ('a' in ['b'])\n\n  # lexer state (specifically @seenFor) should be reset before each compilation\n  CoffeeScript.compile \"0 for [1..2]\"\n  CoffeeScript.compile \"'a' in ['b']\"\n\ntest \"#1099: statically determined `not in []` reporting incorrect result\", ->\n  ok 0 not in []\n\ntest \"#1099: make sure expression tested gets evaluted when array is empty\", ->\n  a = 0\n  (do -> a = 1) in []\n  eq a, 1\n\n# Chained Comparison\n\ntest \"chainable operators\", ->\n  ok 100 > 10 > 1 > 0 > -1\n  ok -1 < 0 < 1 < 10 < 100\n\ntest \"`is` and `isnt` may be chained\", ->\n  ok true is not false is true is not false\n  ok 0 is 0 isnt 1 is 1\n\ntest \"different comparison operators (`>`,`<`,`is`,etc.) may be combined\", ->\n  ok 1 < 2 > 1\n  ok 10 < 20 > 2+3 is 5\n\ntest \"some chainable operators can be negated by `unless`\", ->\n  ok (true unless 0==10!=100)\n\ntest \"operator precedence: `|` lower than `<`\", ->\n  eq 1, 1 | 2 < 3 < 4\n\ntest \"preserve references\", ->\n  a = b = c = 1\n  # `a == b <= c` should become `a === b && b <= c`\n  # (this test does not seem to test for this)\n  ok a == b <= c\n\ntest \"chained operations should evaluate each value only once\", ->\n  a = 0\n  ok 1 > a++ < 1\n\ntest \"#891: incorrect inversion of chained comparisons\", ->\n  ok (true unless 0 > 1 > 2)\n  ok (true unless (this.NaN = 0/0) < 0/0 < this.NaN)\n\ntest \"#1234: Applying a splat to :: applies the splat to the wrong object\", ->\n  nonce = {}\n  class C\n    method: -> @nonce\n    nonce: nonce\n\n  arr = []\n  eq nonce, C::method arr... # should be applied to `C::`\n\ntest \"#1102: String literal prevents line continuation\", ->\n  eq \"': '\", '' +\n     \"': '\"\n\ntest \"#1703, ---x is invalid JS\", ->\n  x = 2\n  eq (- --x), -1\n\ntest \"Regression with implicit calls against an indented assignment\", ->\n  eq 1, a =\n    1\n\n  eq a, 1\n\ntest \"#2155 ... conditional assignment to a closure\", ->\n  x = null\n  func = -> x ?= (-> if true then 'hi')\n  func()\n  eq x(), 'hi'\n\ntest \"#2197: Existential existential double trouble\", ->\n  counter = 0\n  func = -> counter++\n  func()? ? 100\n  eq counter, 1\n\ntest \"#2567: Optimization of negated existential produces correct result\", ->\n  a = 1\n  ok !(!a?)\n  ok !b?\n\ntest \"#2508: Existential access of the prototype\", ->\n  eq NonExistent?::nothing, undefined\n  eq(\n    NonExistent\n    ?::nothing\n    undefined\n  )\n  ok Object?::toString\n  ok(\n    Object\n    ?::toString\n  )\n\ntest \"floor division operator\", ->\n  eq 2, 7 // 3\n  eq -3, -7 // 3\n  eq NaN, 0 // 0\n\ntest \"floor division operator compound assignment\", ->\n  a = 7\n  a //= 1 + 1\n  eq 3, a\n\ntest \"modulo operator\", ->\n  check = (a, b, expected) ->\n    eq expected, a %% b, \"expected #{a} %%%% #{b} to be #{expected}\"\n  check 0, 1, 0\n  check 0, -1, -0\n  check 1, 0, NaN\n  check 1, 2, 1\n  check 1, -2, -1\n  check 1, 3, 1\n  check 2, 3, 2\n  check 3, 3, 0\n  check 4, 3, 1\n  check -1, 3, 2\n  check -2, 3, 1\n  check -3, 3, 0\n  check -4, 3, 2\n  check 5.5, 2.5, 0.5\n  check -5.5, 2.5, 2.0\n\ntest \"modulo operator compound assignment\", ->\n  a = -2\n  a %%= 5\n  eq 3, a\n\ntest \"modulo operator converts arguments to numbers\", ->\n  eq 1, 1 %% '42'\n  eq 1, '1' %% 42\n  eq 1, '1' %% '42'\n\ntest \"#3361: Modulo operator coerces right operand once\", ->\n  count = 0\n  res = 42 %% valueOf: -> count += 1\n  eq 1, count\n  eq 0, res\n\ntest \"#3363: Modulo operator coercing order\", ->\n  count = 2\n  a = valueOf: -> count *= 2\n  b = valueOf: -> count += 1\n  eq 4, a %% b\n  eq 5, count\n\ntest \"#3598: Unary + and - coerce the operand once when it is an identifier\", ->\n  # Unary + and - do not generate `_ref`s when the operand is a number, for\n  # readability. To make sure that they do when the operand is an identifier,\n  # test that they are consistent with another unary operator as well as another\n  # complex expression.\n  # Tip: Making one of the tests temporarily fail lets you easily inspect the\n  # compiled JavaScript.\n\n  assertOneCoercion = (fn) ->\n    count = 0\n    value = valueOf: -> count++; 1\n    fn value\n    eq 1, count\n\n  eq 1, 1 ? 0\n  eq 1, +1 ? 0\n  eq -1, -1 ? 0\n  assertOneCoercion (a) ->\n    eq 1, +a ? 0\n  assertOneCoercion (a) ->\n    eq -1, -a ? 0\n  assertOneCoercion (a) ->\n    eq -2, ~a ? 0\n  assertOneCoercion (a) ->\n    eq 0.5, a / 2 ? 0\n\n  ok -2 <= 1 < 2\n  ok -2 <= +1 < 2\n  ok -2 <= -1 < 2\n  assertOneCoercion (a) ->\n    ok -2 <= +a < 2\n  assertOneCoercion (a) ->\n    ok -2 <= -a < 2\n  assertOneCoercion (a) ->\n    ok -2 <= ~a < 2\n  assertOneCoercion (a) ->\n    ok -2 <= a / 2 < 2\n\n  arrayEq [0], (n for n in [0] by 1)\n  arrayEq [0], (n for n in [0] by +1)\n  arrayEq [0], (n for n in [0] by -1)\n  assertOneCoercion (a) ->\n    arrayEq [0], (n for n in [0] by +a)\n  assertOneCoercion (a) ->\n    arrayEq [0], (n for n in [0] by -a)\n  assertOneCoercion (a) ->\n    arrayEq [0], (n for n in [0] by ~a)\n  assertOneCoercion (a) ->\n    arrayEq [0], (n for n in [0] by a * 2 / 2)\n\n  ok 1 in [0, 1]\n  ok +1 in [0, 1]\n  ok -1 in [0, -1]\n  assertOneCoercion (a) ->\n    ok +a in [0, 1]\n  assertOneCoercion (a) ->\n    ok -a in [0, -1]\n  assertOneCoercion (a) ->\n    ok ~a in [0, -2]\n  assertOneCoercion (a) ->\n    ok a / 2 in [0, 0.5]\n\ntest \"'new' target\", ->\n  nonce = {}\n  ctor  = -> nonce\n\n  eq (new ctor), nonce\n  eq (new ctor()), nonce\n\n  ok new class\n\n  ctor  = class\n  ok (new ctor) instanceof ctor\n  ok (new ctor()) instanceof ctor\n\n  # Force an executable class body\n  ctor  = class then a = 1\n  ok (new ctor) instanceof ctor\n\n  get   = -> ctor\n  ok (new get()) not instanceof ctor\n  ok (new (get())()) instanceof ctor\n\n  # classes must be called with `new`. In this case `new` applies to `get` only\n  throws -> new get()()\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"option_parser\">\n# Option Parser\n# -------------\n\n# Ensure that the OptionParser handles arguments correctly.\nreturn unless require?\n{OptionParser} = require './../lib/coffeescript/optparse'\n\nflags = [\n  ['-r', '--required [DIR]',  'desc required']\n  ['-o', '--optional',        'desc optional']\n  ['-l', '--list [FILES*]',   'desc list']\n]\n\nbanner = '''\n  banner text\n'''\n\nopt = new OptionParser flags, banner\n\ntest \"basic arguments\", ->\n  args = ['one', 'two', 'three', '-r', 'dir']\n  result = opt.parse args\n  arrayEq args, result.arguments\n  eq undefined, result.required\n\ntest \"boolean and parameterised options\", ->\n  result = opt.parse ['--optional', '-r', 'folder', 'one', 'two']\n  ok result.optional\n  eq 'folder', result.required\n  arrayEq ['one', 'two'], result.arguments\n\ntest \"list options\", ->\n  result = opt.parse ['-l', 'one.txt', '-l', 'two.txt', 'three']\n  arrayEq ['one.txt', 'two.txt'], result.list\n  arrayEq ['three'], result.arguments\n\ntest \"-- and interesting combinations\", ->\n  result = opt.parse ['-o','-r','a','-r','b','-o','--','-a','b','--c','d']\n  arrayEq ['-a', 'b', '--c', 'd'], result.arguments\n  ok result.optional\n  eq 'b', result.required\n\n  args = ['--','-o','a','-r','c','-o','--','-a','arg0','-b','arg1']\n  result = opt.parse args\n  eq undefined, result.optional\n  eq undefined, result.required\n  arrayEq args[1..], result.arguments\n\ntest \"throw if multiple flags try to use the same short or long name\", ->\n  throws -> new OptionParser [\n    ['-r', '--required [DIR]', 'required']\n    ['-r', '--long',           'switch']\n  ]\n\n  throws -> new OptionParser [\n    ['-a', '--append [STR]', 'append']\n    ['-b', '--append',       'append with -b short opt']\n  ]\n\n  throws -> new OptionParser [\n    ['--just-long', 'desc']\n    ['--just-long', 'another desc']\n  ]\n\n  throws -> new OptionParser [\n    ['-j', '--just-long', 'desc']\n    ['--just-long', 'another desc']\n  ]\n\n  throws -> new OptionParser [\n    ['--just-long',       'desc']\n    ['-j', '--just-long', 'another desc']\n  ]\n\ntest \"outputs expected help text\", ->\n  expectedBanner = '''\n\nbanner text\n\n  -r, --required     desc required\n  -o, --optional     desc optional\n  -l, --list         desc list\n\n  '''\n  ok opt.help() is expectedBanner\n\n  expected = [\n    ''\n    '  -r, --required     desc required'\n    '  -o, --optional     desc optional'\n    '  -l, --list         desc list'\n    ''\n  ].join('\\n')\n  ok new OptionParser(flags).help() is expected\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"package\">\nreturn if window? or testingBrowser?\n\n{EventEmitter}  = require 'events'\n{join}          = require 'path'\n{cwd}           = require 'process'\n{pathToFileURL} = require 'url'\n\n\npackageEntryPath = join cwd(), 'lib/coffeescript/index.js'\npackageEntryUrl  = pathToFileURL packageEntryPath\n\n\ntest \"the coffeescript package exposes all members as named exports in Node\", ->\n\n  requiredPackage = require packageEntryPath\n  requiredKeys = Object.keys requiredPackage\n\n  importedPackage = await import(packageEntryUrl)\n  importedKeys = new Set Object.keys(importedPackage)\n\n  # In `command.coffee`, CoffeeScript extends a `new EventEmitter`;\n  # we want to ignore these additional added keys.\n  eventEmitterKeys = new Set Object.getOwnPropertyNames(Object.getPrototypeOf(new EventEmitter))\n\n  for key in requiredKeys when not eventEmitterKeys.has(key)\n    # Use `eq` test so that missing keys have their names printed in the error message.\n    eq (if importedKeys.has(key) then key else undefined), key\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"parser\">\n# Parser\n# ---------\n\ntest \"operator precedence for logical operators\", ->\n  source = '''\n    a or b and c\n  '''\n  {body: block} = CoffeeScript.nodes source\n  [expression] = block.expressions\n  eq expression.first.base.value, 'a'\n  eq expression.operator, '||'\n  eq expression.second.first.base.value, 'b'\n  eq expression.second.operator, '&&'\n  eq expression.second.second.base.value, 'c'\n\ntest \"operator precedence for bitwise operators\", ->\n  source = '''\n    a | b ^ c & d\n  '''\n  {body: block} = CoffeeScript.nodes source\n  [expression] = block.expressions\n  eq expression.first.base.value, 'a'\n  eq expression.operator, '|'\n  eq expression.second.first.base.value, 'b'\n  eq expression.second.operator, '^'\n  eq expression.second.second.first.base.value, 'c'\n  eq expression.second.second.operator, '&'\n  eq expression.second.second.second.base.value, 'd'\n\ntest \"operator precedence for binary ? operator\", ->\n  source = '''\n     a ? b and c\n  '''\n  {body: block} = CoffeeScript.nodes source\n  [expression] = block.expressions\n  eq expression.first.base.value, 'a'\n  eq expression.operator, '?'\n  eq expression.second.first.base.value, 'b'\n  eq expression.second.operator, '&&'\n  eq expression.second.second.base.value, 'c'\n\ntest \"new calls have a range including the new\", ->\n  source = '''\n    a = new B().c(d)\n  '''\n  {body: block} = CoffeeScript.nodes source\n\n  assertColumnRange = (node, firstColumn, lastColumn) ->\n    eq node.locationData.first_line, 0\n    eq node.locationData.first_column, firstColumn\n    eq node.locationData.last_line, 0\n    eq node.locationData.last_column, lastColumn\n\n  [assign] = block.expressions\n  outerCall = assign.value.base\n  innerValue = outerCall.variable\n  innerCall = innerValue.base\n\n  assertColumnRange assign, 0, 15\n  assertColumnRange outerCall, 4, 15\n  assertColumnRange innerValue, 4, 12\n  assertColumnRange innerCall, 4, 10\n\ntest \"location data is properly set for nested `new`\", ->\n  source = '''\n    new new A()()\n  '''\n  {body: block} = CoffeeScript.nodes source\n\n  assertColumnRange = (node, firstColumn, lastColumn) ->\n    eq node.locationData.first_line, 0\n    eq node.locationData.first_column, firstColumn\n    eq node.locationData.last_line, 0\n    eq node.locationData.last_column, lastColumn\n\n  [{base: outerCall}] = block.expressions\n  innerCall = outerCall.variable\n\n  assertColumnRange outerCall, 0, 12\n  assertColumnRange innerCall, 4, 10\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"ranges\">\n# Range Literals\n# --------------\n\n# TODO: add indexing and method invocation tests: [1..4][0] is 1, [0...3].toString()\n\n# shared array\nshared = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\ntest \"basic inclusive ranges\", ->\n  arrayEq [1, 2, 3] , [1..3]\n  arrayEq [0, 1, 2] , [0..2]\n  arrayEq [0, 1]    , [0..1]\n  arrayEq [0]       , [0..0]\n  arrayEq [-1]      , [-1..-1]\n  arrayEq [-1, 0]   , [-1..0]\n  arrayEq [-1, 0, 1], [-1..1]\n\ntest \"basic exclusive ranges\", ->\n  arrayEq [1, 2, 3] , [1...4]\n  arrayEq [0, 1, 2] , [0...3]\n  arrayEq [0, 1]    , [0...2]\n  arrayEq [0]       , [0...1]\n  arrayEq [-1]      , [-1...0]\n  arrayEq [-1, 0]   , [-1...1]\n  arrayEq [-1, 0, 1], [-1...2]\n\n  arrayEq [], [1...1]\n  arrayEq [], [0...0]\n  arrayEq [], [-1...-1]\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  arrayEq [1, 2, 3] , [1 ... 4]\n  arrayEq [0, 1, 2] , [0 ... 3]\n  arrayEq [0, 1]    , [0 ... 2]\n  arrayEq [0]       , [0 ... 1]\n  arrayEq [-1]      , [-1 ... 0]\n  arrayEq [-1, 0]   , [-1 ... 1]\n  arrayEq [-1, 0, 1], [-1 ... 2]\n\n  arrayEq [], [1 ... 1]\n  arrayEq [], [0 ... 0]\n  arrayEq [], [-1 ... -1]\n\ntest \"downward ranges\", ->\n  arrayEq shared, [9..0].reverse()\n  arrayEq [5, 4, 3, 2] , [5..2]\n  arrayEq [2, 1, 0, -1], [2..-1]\n\n  arrayEq [3, 2, 1]  , [3..1]\n  arrayEq [2, 1, 0]  , [2..0]\n  arrayEq [1, 0]     , [1..0]\n  arrayEq [0]        , [0..0]\n  arrayEq [-1]       , [-1..-1]\n  arrayEq [0, -1]    , [0..-1]\n  arrayEq [1, 0, -1] , [1..-1]\n  arrayEq [0, -1, -2], [0..-2]\n\n  arrayEq [4, 3, 2], [4...1]\n  arrayEq [3, 2, 1], [3...0]\n  arrayEq [2, 1]   , [2...0]\n  arrayEq [1]      , [1...0]\n  arrayEq []       , [0...0]\n  arrayEq []       , [-1...-1]\n  arrayEq [0]      , [0...-1]\n  arrayEq [0, -1]  , [0...-2]\n  arrayEq [1, 0]   , [1...-1]\n  arrayEq [2, 1, 0], [2...-1]\n\ntest \"ranges with variables as enpoints\", ->\n  [a, b] = [1, 3]\n  arrayEq [1, 2, 3], [a..b]\n  arrayEq [1, 2]   , [a...b]\n  b = -2\n  arrayEq [1, 0, -1, -2], [a..b]\n  arrayEq [1, 0, -1]    , [a...b]\n\ntest \"ranges with expressions as endpoints\", ->\n  [a, b] = [1, 3]\n  arrayEq [2, 3, 4, 5, 6], [(a+1)..2*b]\n  arrayEq [2, 3, 4, 5]   , [(a+1)...2*b]\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  arrayEq [2, 3, 4, 5]   , [(a+1) ... 2*b]\n\ntest \"large ranges are generated with looping constructs\", ->\n  down = [99..0]\n  eq 100, (len = down.length)\n  eq   0, down[len - 1]\n\n  up = [0...100]\n  eq 100, (len = up.length)\n  eq  99, up[len - 1]\n\ntest \"for-from loops over ranges\", ->\n  array1 = []\n  for x from [20..30]\n    array1.push(x)\n    break if x is 25\n  arrayEq array1, [20, 21, 22, 23, 24, 25]\n\ntest \"for-from comprehensions over ranges\", ->\n  array1 = (x + 10 for x from [20..25])\n  ok array1.join(' ') is '30 31 32 33 34 35'\n\n  array2 = (x for x from [20..30] when x %% 2 == 0)\n  ok array2.join(' ') is '20 22 24 26 28 30'\n\ntest \"#1012 slices with arguments object\", ->\n  expected = [0..9]\n  argsAtStart = (-> [arguments[0]..9]) 0\n  arrayEq expected, argsAtStart\n  argsAtEnd = (-> [0..arguments[0]]) 9\n  arrayEq expected, argsAtEnd\n  argsAtBoth = (-> [arguments[0]..arguments[1]]) 0, 9\n  arrayEq expected, argsAtBoth\n\ntest \"#1409: creating large ranges outside of a function body\", ->\n  CoffeeScript.eval '[0..100]'\n\ntest \"#2047: Infinite loop possible when `for` loop with `range` uses variables\", ->\n  up = 1\n  down = -1\n  a = 1\n  b = 5\n\n  testRange = (arg) ->\n    [from, to, step, expectedResult] = arg\n    r = (x for x in [from..to] by step)\n    arrayEq r, expectedResult\n\n  testData = [\n    [1, 5, 1, [1..5]]\n    [1, 5, -1, []]\n    [1, 5, up, [1..5]]\n    [1, 5, down, []]\n\n    [a, 5, 1, [1..5]]\n    [a, 5, -1, []]\n    [a, 5, up, [1..5]]\n    [a, 5, down, []]\n\n    [1, b, 1, [1..5]]\n    [1, b, -1, []]\n    [1, b, up, [1..5]]\n    [1, b, down, []]\n\n    [a, b, 1, [1..5]]\n    [a, b, -1, []]\n    [a, b, up, [1..5]]\n    [a, b, down, []]\n\n    [5, 1, 1, []]\n    [5, 1, -1, [5..1]]\n    [5, 1, up, []]\n    [5, 1, down,  [5..1]]\n\n    [5, a, 1, []]\n    [5, a, -1, [5..1]]\n    [5, a, up, []]\n    [5, a, down, [5..1]]\n\n    [b, 1, 1, []]\n    [b, 1, -1, [5..1]]\n    [b, 1, up, []]\n    [b, 1, down, [5..1]]\n\n    [b, a, 1, []]\n    [b, a, -1, [5..1]]\n    [b, a, up, []]\n    [b, a, down, [5..1]]\n  ]\n\n  testRange d for d in testData\n\ntest \"#2047: from, to and step as variables\", ->\n  up = 1\n  down = -1\n  a = 1\n  b = 5\n\n  r = (x for x in [a..b] by up)\n  arrayEq r, [1..5]\n\n  r = (x for x in [a..b] by down)\n  arrayEq r, []\n\n  r = (x for x in [b..a] by up)\n  arrayEq r, []\n\n  r = (x for x in [b..a] by down)\n  arrayEq r, [5..1]\n\n  a = 1\n  b = -1\n  step = 0\n  r = (x for x in [b..a] by step)\n  arrayEq r, []\n\ntest \"#4884: Range not declaring var for the 'i'\", ->\n  'use strict'\n  [0..21].forEach (idx) ->\n    idx + 1\n\n  eq global.i, undefined\n\ntest \"#4889: `for` loop unexpected behavior\", ->\n  n = 1\n  result = []\n  for i in [0..n]\n    result.push i\n    for j in [(i+1)..n]\n      result.push j\n\n  arrayEq result, [0,1,1,2,1]\n\ntest \"#4889: `for` loop unexpected behavior with `by 1` on second loop\", ->\n  n = 1\n  result = []\n  for i in [0..n]\n    result.push i\n    for j in [(i+1)..n] by 1\n      result.push j\n\n  arrayEq result, [0,1,1]\n\ntest \"countdown example from docs\", ->\n  countdown = (num for num in [10..1])\n  arrayEq countdown, [10,9,8,7,6,5,4,3,2,1]\n\ntest \"counting up when the range goes down returns an empty array\", ->\n  countdown = (num for num in [10..1] by 1)\n  arrayEq countdown, []\n\ntest \"counting down when the range goes up returns an empty array\", ->\n  countup = (num for num in [1..10] by -1)\n  arrayEq countup, []\n\ntest \"counting down by too much returns just the first value\", ->\n  countdown = (num for num in [10..1] by -100)\n  arrayEq countdown, [10]\n\ntest \"counting up by too much returns just the first value\", ->\n  countup = (num for num in [1..10] by 100)\n  arrayEq countup, [1]\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"regex\">\n# Regular Expression Literals\n# ---------------------------\n\n# TODO: add method invocation tests: /regex/.toString()\n\n# * Regexen\n# * Heregexen\n\ntest \"basic regular expression literals\", ->\n  ok 'a'.match(/a/)\n  ok 'a'.match /a/\n  ok 'a'.match(/a/g)\n  ok 'a'.match /a/g\n\ntest \"division is not confused for a regular expression\", ->\n  # Any spacing around the slash is allowed when it cannot be a regex.\n  eq 2, 4 / 2 / 1\n  eq 2, 4/2/1\n  eq 2, 4/ 2 / 1\n  eq 2, 4 /2 / 1\n  eq 2, 4 / 2/ 1\n  eq 2, 4 / 2 /1\n  eq 2, 4 /2/ 1\n\n  a = (regex) -> regex.test 'a b c'\n  a.valueOf = -> 4\n  b = 2\n  g = 1\n\n  eq 2, a / b/g\n  eq 2, a/ b/g\n  eq 2, a / b/ g\n  eq 2, a\t/\tb/g # Tabs.\n  eq 2, a / b/g # Non-breaking spaces.\n  eq true, a /b/g\n  # Use parentheses to disambiguate.\n  eq true, a(/ b/g)\n  eq true, a(/ b/)\n  eq true, a (/ b/)\n  # Escape to disambiguate.\n  eq true, a /\\ b/g\n  eq false, a\t/\\\tb/g\n  eq true, a /\\ b/\n\n  obj = method: -> 2\n  two = 2\n  eq 2, (obj.method()/two + obj.method()/two)\n\n  i = 1\n  eq 2, (4)/2/i\n  eq 1, i/i/i\n\n  a = ''\n  a += ' ' until /   /.test a\n  eq a, '   '\n\n  a = if /=/.test '=' then yes else no\n  eq a, yes\n\n  a = if !/=/.test '=' then yes else no\n  eq a, no\n\n  #3182:\n  match = 'foo=bar'.match /=/\n  eq match[0], '='\n\n  #3410:\n  ok ' '.match(/ /)[0] is ' '\n\n\ntest \"division vs regex after a callable token\", ->\n  b = 2\n  g = 1\n  r = (r) -> r.test 'b'\n\n  a = 4\n  eq 2, a / b/g\n  eq 2, a/b/g\n  eq 2, a/ b/g\n  eq true, r /b/g\n  eq 2, (1 + 3) / b/g\n  eq 2, (1 + 3)/b/g\n  eq 2, (1 + 3)/ b/g\n  eq true, (r) /b/g\n  eq 2, [4][0] / b/g\n  eq 2, [4][0]/b/g\n  eq 2, [4][0]/ b/g\n  eq true, [r][0] /b/g\n  eq 0.5, 4? / b/g\n  eq 0.5, 4?/b/g\n  eq 0.5, 4?/ b/g\n  eq true, r? /b/g\n  (->\n    eq 2, @ / b/g\n    eq 2, @/b/g\n    eq 2, @/ b/g\n  ).call 4\n  (->\n    eq true, @ /b/g\n  ).call r\n  (->\n    eq 2, this / b/g\n    eq 2, this/b/g\n    eq 2, this/ b/g\n  ).call 4\n  (->\n    eq true, this /b/g\n  ).call r\n  class A\n    p: (regex) -> if regex then r regex else 4\n  class B extends A\n    p: ->\n      eq 2, super() / b/g\n      eq 2, super()/b/g\n      eq 2, super()/ b/g\n      eq true, super /b/g\n  new B().p()\n\ntest \"always division and never regex after some tokens\", ->\n  b = 2\n  g = 1\n\n  eq 2, 4 / b/g\n  eq 2, 4/b/g\n  eq 2, 4/ b/g\n  eq 2, 4 /b/g\n  eq 2, \"4\" / b/g\n  eq 2, \"4\"/b/g\n  eq 2, \"4\"/ b/g\n  eq 2, \"4\" /b/g\n  eq 20, \"4#{0}\" / b/g\n  eq 20, \"4#{0}\"/b/g\n  eq 20, \"4#{0}\"/ b/g\n  eq 20, \"4#{0}\" /b/g\n  ok isNaN /a/ / b/g\n  ok isNaN /a/i / b/g\n  ok isNaN /a//b/g\n  ok isNaN /a/i/b/g\n  ok isNaN /a// b/g\n  ok isNaN /a/i/ b/g\n  ok isNaN /a/ /b/g\n  ok isNaN /a/i /b/g\n  eq 0.5, true / b/g\n  eq 0.5, true/b/g\n  eq 0.5, true/ b/g\n  eq 0.5, true /b/g\n  eq 0, false / b/g\n  eq 0, false/b/g\n  eq 0, false/ b/g\n  eq 0, false /b/g\n  eq 0, null / b/g\n  eq 0, null/b/g\n  eq 0, null/ b/g\n  eq 0, null /b/g\n  ok isNaN undefined / b/g\n  ok isNaN undefined/b/g\n  ok isNaN undefined/ b/g\n  ok isNaN undefined /b/g\n  ok isNaN {a: 4} / b/g\n  ok isNaN {a: 4}/b/g\n  ok isNaN {a: 4}/ b/g\n  ok isNaN {a: 4} /b/g\n  o = prototype: 4\n  eq 2, o:: / b/g\n  eq 2, o::/b/g\n  eq 2, o::/ b/g\n  eq 2, o:: /b/g\n  i = 4\n  eq 2.0, i++ / b/g\n  eq 2.5, i++/b/g\n  eq 3.0, i++/ b/g\n  eq 3.5, i++ /b/g\n  eq 4.0, i-- / b/g\n  eq 3.5, i--/b/g\n  eq 3.0, i--/ b/g\n  eq 2.5, i-- /b/g\n\ntest \"compound division vs regex\", ->\n  c = 4\n  i = 2\n\n  a = 10\n  b = a /= c / i\n  eq a, 5\n\n  a = 10\n  b = a /= c /i\n  eq a, 5\n\n  a = 10\n  b = a\t/=\tc /i # Tabs.\n  eq a, 5\n\n  a = 10\n  b = a /= c /i # Non-breaking spaces.\n  eq a, 5\n\n  a = 10\n  b = a/= c /i\n  eq a, 5\n\n  a = 10\n  b = a/=c/i\n  eq a, 5\n\n  a = (regex) -> regex.test '=C '\n  b = a /=c /i\n  eq b, true\n\n  a = (regex) -> regex.test '= C '\n  # Use parentheses to disambiguate.\n  b = a(/= c /i)\n  eq b, true\n  b = a(/= c /)\n  eq b, false\n  b = a (/= c /)\n  eq b, false\n  # Escape to disambiguate.\n  b = a /\\= c /i\n  eq b, true\n  b = a /\\= c /\n  eq b, false\n\ntest \"#764: regular expressions should be indexable\", ->\n  eq /0/['source'], ///#{0}///['source']\n\ntest \"#584: slashes are allowed unescaped in character classes\", ->\n  ok /^a\\/[/]b$/.test 'a//b'\n\ntest \"does not allow to escape newlines\", ->\n  throwsCompileError '/a\\\\\\nb/'\n\n\n# Heregexe(n|s)\n\ntest \"a heregex will ignore whitespace and comments\", ->\n  eq /^I'm\\x20+[a]\\s+Heregex?\\/\\/\\//gim + '', ///\n    ^ I'm \\x20+ [a] \\s+\n    Heregex? / // # or not\n  ///gim + ''\n\ntest \"an empty heregex will compile to an empty, non-capturing group\", ->\n  eq /(?:)/ + '', ///  /// + ''\n  eq /(?:)/ + '', ////// + ''\n\ntest \"heregex starting with slashes\", ->\n  ok /////a/\\////.test ' //a// '\n\ntest '#2388: `///` in heregex interpolations', ->\n  ok ///a#{///b///}c///.test ' /a/b/c/ '\n  ws = ' \\t'\n  scan = (regex) -> regex.exec('\\t  foo')[0]\n  eq '/\\t  /', /// #{scan /// [#{ws}]* ///} /// + ''\n\ntest \"regexes are not callable\", ->\n  throwsCompileError '/a/()'\n  throwsCompileError '///a#{b}///()'\n  throwsCompileError '/a/ 1'\n  throwsCompileError '///a#{b}/// 1'\n  throwsCompileError '''\n    /a/\n       k: v\n  '''\n  throwsCompileError '''\n    ///a#{b}///\n       k: v\n  '''\n\ntest \"backreferences\", ->\n  ok /(a)(b)\\2\\1/.test 'abba'\n\ntest \"#3795: Escape otherwise invalid characters\", ->\n  ok (/ /).test '\\u2028'\n  ok (/ /).test '\\u2029'\n  ok ///\\ ///.test '\\u2028'\n  ok ///\\ ///.test '\\u2029'\n  ok ///a b///.test 'ab' # The space is U+2028.\n  ok ///a b///.test 'ab' # The space is U+2029.\n  ok ///\\0\n      1///.test '\\x001'\n\n  a = 'a'\n  ok ///#{a} b///.test 'ab' # The space is U+2028.\n  ok ///#{a} b///.test 'ab' # The space is U+2029.\n  ok ///#{a}\\ ///.test 'a\\u2028'\n  ok ///#{a}\\ ///.test 'a\\u2029'\n  ok ///#{a}\\0\n      1///.test 'a\\x001'\n\ntest \"#4248: Unicode code point escapes\", ->\n  ok /a\\u{1ab}c/u.test 'a\\u01abc'\n  ok ///#{ 'a' }\\u{000001ab}c///u.test 'a\\u{1ab}c'\n  ok ///a\\u{000001ab}c///u.test 'a\\u{1ab}c'\n  ok /a\\u{12345}c/u.test 'a\\ud808\\udf45c'\n\n  # and now without u flag\n  ok /a\\u{1ab}c/.test 'a\\u01abc'\n  ok ///#{ 'a' }\\u{000001ab}c///.test 'a\\u{1ab}c'\n  ok ///a\\u{000001ab}c///.test 'a\\u{1ab}c'\n  ok /a\\u{12345}c/.test 'a\\ud808\\udf45c'\n\n  # rewrite code point escapes unless u flag is set\n  eqJS \"\"\"\n    /\\\\u{bcdef}\\\\u{abc}/u\n  \"\"\",\n  \"\"\"\n    /\\\\u{bcdef}\\\\u{abc}/u;\n  \"\"\"\n\n  eqJS \"\"\"\n    ///#{ 'a' }\\\\u{bcdef}///\n  \"\"\",\n  \"\"\"\n    /a\\\\udab3\\\\uddef/;\n  \"\"\"\n\ntest \"#4811, heregex comments with ///\", ->\n  eqJS \"\"\"\n    ///\n      a | # comment with ///\n      b   # /// 'heregex' in comment will be consumed\n    ///\n  \"\"\",\n  \"\"\"\n   // comment with ///\n   // /// 'heregex' in comment will be consumed\n   /a|b/;\n  \"\"\"\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"regex_dotall\">\n# Regex “dotall” flag, or `s`, is only supported in Node 9+, so put tests for\n# the feature in their own file. The feature detection in `Cakefile` that\n# causes this test to load is adapted from\n# https://github.com/tc39/proposal-regexp-dotall-flag#proposed-solution.\n\ntest \"dotall flag\", ->\n  doesNotThrow -> /a.b/s.test 'a\\nb'\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"repl\">\nreturn if global.testingBrowser\n\nos = require 'os'\nfs = require 'fs'\npath = require 'path'\n\n# REPL\n# ----\nStream = require 'stream'\n\nclass MockInputStream extends Stream\n  constructor: ->\n    super()\n    @readable = true\n\n  resume: ->\n\n  emitLine: (val) ->\n    @emit 'data', Buffer.from(\"#{val}\\n\")\n\nclass MockOutputStream extends Stream\n  constructor: ->\n    super()\n    @writable = true\n    @written = []\n\n  write: (data) ->\n    # console.log 'output write', arguments\n    @written.push data\n\n  lastWrite: (fromEnd = -1) ->\n    @written[@written.length - 1 + fromEnd].replace /\\r?\\n$/, ''\n\n# Create a dummy history file\nhistoryFile = path.join os.tmpdir(), '.coffee_history_test'\nfs.writeFileSync historyFile, '1 + 2\\n'\n\ntestRepl = (desc, fn) ->\n  input = new MockInputStream\n  output = new MockOutputStream\n  repl = Repl.start {input, output, historyFile}\n  test desc, -> fn input, output, repl\n\nctrlV = { ctrl: true, name: 'v'}\n\n\ntestRepl 'reads history file', (input, output, repl) ->\n  input.emitLine repl.history[0]\n  eq '3', output.lastWrite()\n\ntestRepl \"starts with coffee prompt\", (input, output) ->\n  eq 'coffee> ', output.lastWrite(0)\n\ntestRepl \"writes eval to output\", (input, output) ->\n  input.emitLine '1+1'\n  eq '2', output.lastWrite()\n\ntestRepl \"comments are ignored\", (input, output) ->\n  input.emitLine '1 + 1 #foo'\n  eq '2', output.lastWrite()\n\ntestRepl \"output in inspect mode\", (input, output) ->\n  input.emitLine '\"1 + 1\\\\n\"'\n  eq \"'1 + 1\\\\n'\", output.lastWrite()\n\ntestRepl \"variables are saved\", (input, output) ->\n  input.emitLine \"foo = 'foo'\"\n  input.emitLine 'foobar = \"#{foo}bar\"'\n  eq \"'foobar'\", output.lastWrite()\n\ntestRepl \"empty command evaluates to undefined\", (input, output) ->\n  # A regression fixed in Node 5.11.0 broke the handling of pressing enter in\n  # the Node REPL; see https://github.com/nodejs/node/pull/6090 and\n  # https://github.com/jashkenas/coffeescript/issues/4502.\n  # Just skip this test for versions of Node < 6.\n  return if parseInt(process.versions.node.split('.')[0], 10) < 6\n  input.emitLine ''\n  eq 'undefined', output.lastWrite()\n\ntestRepl \"#4763: comment evaluates to undefined\", (input, output) ->\n  input.emitLine '# comment'\n  eq 'undefined', output.lastWrite()\n\ntestRepl \"#4763: multiple comments evaluate to undefined\", (input, output) ->\n  input.emitLine '### a ### ### b ### # c'\n  eq 'undefined', output.lastWrite()\n\ntestRepl \"ctrl-v toggles multiline prompt\", (input, output) ->\n  input.emit 'keypress', null, ctrlV\n  eq '------> ', output.lastWrite(0)\n  input.emit 'keypress', null, ctrlV\n  eq 'coffee> ', output.lastWrite(0)\n\ntestRepl \"multiline continuation changes prompt\", (input, output) ->\n  input.emit 'keypress', null, ctrlV\n  input.emitLine ''\n  eq '....... ', output.lastWrite(0)\n\ntestRepl \"evaluates multiline\", (input, output) ->\n  # Stubs. Could assert on their use.\n  output.cursorTo = (pos) ->\n  output.clearLine = ->\n\n  input.emit 'keypress', null, ctrlV\n  input.emitLine 'do ->'\n  input.emitLine '  1 + 1'\n  input.emit 'keypress', null, ctrlV\n  eq '2', output.lastWrite()\n\ntestRepl \"variables in scope are preserved\", (input, output) ->\n  input.emitLine 'a = 1'\n  input.emitLine 'do -> a = 2'\n  input.emitLine 'a'\n  eq '2', output.lastWrite()\n\ntestRepl \"existential assignment of previously declared variable\", (input, output) ->\n  input.emitLine 'a = null'\n  input.emitLine 'a ?= 42'\n  eq '42', output.lastWrite()\n\ntestRepl \"keeps running after runtime error\", (input, output) ->\n  input.emitLine 'a = b'\n  input.emitLine 'a'\n  eq 'undefined', output.lastWrite()\n\ntestRepl \"#4604: wraps an async function\", (input, output) ->\n  return unless try new Function 'async () => {}' # Feature detect support for async functions.\n  input.emitLine 'await new Promise (resolve) -> setTimeout (-> resolve 33), 10'\n  setTimeout ->\n    eq '33', output.lastWrite()\n  , 20\n\ntestRepl \"transpile REPL\", (input, output) ->\n  input.emitLine 'require(\"./test/importing/transpile_import\").getSep()'\n  eq \"'#{path.sep.replace '\\\\', '\\\\\\\\'}'\", output.lastWrite()\n\nprocess.on 'exit', ->\n  try\n    fs.unlinkSync historyFile\n  catch exception # Already deleted, nothing else to do.\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"scope\">\n# Scope\n# -----\n\n# * Variable Safety\n# * Variable Shadowing\n# * Auto-closure (`do`)\n# * Global Scope Leaks\n\ntest \"reference `arguments` inside of functions\", ->\n  sumOfArgs = ->\n    sum = (a,b) -> a + b\n    sum = 0\n    sum += num for num in arguments\n    sum\n  eq 10, sumOfArgs(0, 1, 2, 3, 4)\n\ntest \"assignment to an Object.prototype-named variable should not leak to outer scope\", ->\n  # FIXME: fails on IE\n  (->\n    constructor = 'word'\n  )()\n  ok constructor isnt 'word'\n\ntest \"siblings of splat parameters shouldn't leak to surrounding scope\", ->\n  x = 10\n  oops = (x, args...) ->\n  oops(20, 1, 2, 3)\n  eq x, 10\n\ntest \"catch statements should introduce their argument to scope\", ->\n  try throw ''\n  catch e\n    do -> e = 5\n    eq 5, e\n\ntest \"loop variable should be accessible after for-of loop\", ->\n  d = (x for x of {1:'a',2:'b'})\n  ok x in ['1','2']\n\ntest \"loop variable should be accessible after for-in loop\", ->\n  d = (x for x in [1,2])\n  eq x, 2\n\ntest \"loop variable should be accessible after for-from loop\", ->\n  d = (x for x from [1,2])\n  eq x, 2\n\nclass Array then slice: fail # needs to be global\nclass Object then hasOwnProperty: fail\ntest \"#1973: redefining Array/Object constructors shouldn't confuse __X helpers\", ->\n  arr = [1..4]\n  arrayEq [3, 4], arr[2..]\n  obj = {arr}\n  for own k of obj\n    eq arr, obj[k]\n\ntest \"#2255: global leak with splatted @-params\", ->\n  ok not x?\n  arrayEq [0], ((@x...) -> @x).call {}, 0\n  ok not x?\n\ntest \"#1183: super + fat arrows\", ->\n  dolater = (cb) -> cb()\n\n  class A\n    constructor: ->\n      @_i = 0\n    foo : (cb) ->\n      dolater =>\n        @_i += 1\n        cb()\n\n  class B extends A\n    constructor : ->\n      super()\n    foo : (cb) ->\n      dolater =>\n        dolater =>\n          @_i += 2\n          super cb\n\n  b = new B\n  b.foo => eq b._i, 3\n\ntest \"#1183: super + wrap\", ->\n  class A\n    m : -> 10\n\n  class B extends A\n    constructor : -> super()\n    m: -> r = try super()\n    m: -> r = super()\n\n  eq (new B).m(), 10\n\ntest \"#1183: super + closures\", ->\n  class A\n    constructor: ->\n      @i = 10\n    foo : -> @i\n\n  class B extends A\n    foo : ->\n      ret = switch 1\n        when 0 then 0\n        when 1 then super()\n      ret\n  eq (new B).foo(), 10\n\ntest \"#2331: bound super regression\", ->\n  class A\n    @value = 'A'\n    method: -> @constructor.value\n\n  class B extends A\n    method: => super()\n\n  eq (new B).method(), 'A'\n\ntest \"#3259: leak with @-params within destructured parameters\", ->\n  fn = ({@foo}, [@bar], [{@baz}]) ->\n    foo = bar = baz = false\n\n  fn.call {}, {foo: 'foo'}, ['bar'], [{baz: 'baz'}]\n\n  eq 'undefined', typeof foo\n  eq 'undefined', typeof bar\n  eq 'undefined', typeof baz\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"slicing_and_splicing\">\n# Slicing and Splicing\n# --------------------\n\n# * Slicing\n# * Splicing\n\n# shared array\nshared = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\n# Slicing\n\ntest \"basic slicing\", ->\n  arrayEq [7, 8, 9]   , shared[7..9]\n  arrayEq [2, 3]      , shared[2...4]\n  arrayEq [2, 3, 4, 5], shared[2...6]\n\ntest \"slicing with variables as endpoints\", ->\n  [a, b] = [1, 4]\n  arrayEq [1, 2, 3, 4], shared[a..b]\n  arrayEq [1, 2, 3]   , shared[a...b]\n\ntest \"slicing with expressions as endpoints\", ->\n  [a, b] = [1, 3]\n  arrayEq [2, 3, 4, 5, 6], shared[(a+1)..2*b]\n  arrayEq [2, 3, 4, 5]   , shared[a+1...(2*b)]\n\ntest \"unbounded slicing\", ->\n  arrayEq [7, 8, 9]   , shared[7..]\n  arrayEq [8, 9]      , shared[-2..]\n  arrayEq [9]         , shared[-1...]\n  arrayEq [0, 1, 2]   , shared[...3]\n  arrayEq [0, 1, 2, 3], shared[..-7]\n\n  arrayEq shared      , shared[..-1]\n  arrayEq shared[0..8], shared[...-1]\n\n  for a in [-shared.length..shared.length]\n    arrayEq shared[a..] , shared[a...]\n  for a in [-shared.length+1...shared.length]\n    arrayEq shared[..a][...-1] , shared[...a]\n\n  arrayEq [1, 2, 3], [1, 2, 3][..]\n\ntest \"#930, #835, #831, #746 #624: inclusive slices to -1 should slice to end\", ->\n  arrayEq shared, shared[0..-1]\n  arrayEq shared, shared[..-1]\n  arrayEq shared.slice(1,shared.length), shared[1..-1]\n\ntest \"string slicing\", ->\n  str = \"abcdefghijklmnopqrstuvwxyz\"\n  ok str[1...1] is \"\"\n  ok str[1..1] is \"b\"\n  ok str[1...5] is \"bcde\"\n  ok str[0..4] is \"abcde\"\n  ok str[-5..] is \"vwxyz\"\n\ntest \"#1722: operator precedence in unbounded slice compilation\", ->\n  list = [0..9]\n  n = 2 # some truthy number in `list`\n  arrayEq [0..n], list[..n]\n  arrayEq [0..n], list[..n or 0]\n  arrayEq [0..n], list[..if n then n else 0]\n\ntest \"#2349: inclusive slicing to numeric strings\", ->\n  arrayEq [0, 1], [0..10][..\"1\"]\n\ntest \"#4631: slicing with space before and/or after the dots\", ->\n  a = (s) -> s\n  b = [4, 5, 6]\n  c = [7, 8, 9]\n  arrayEq [2, 3, 4], shared[2 ... 5]\n  arrayEq [3, 4, 5], shared[3... 6]\n  arrayEq [4, 5, 6], shared[4 ...7]\n  arrayEq shared[(a b...)...(a c...)]  , shared[(a ...b)...(a ...c)]\n  arrayEq shared[(a b...) ... (a c...)], shared[(a ...b) ... (a ...c)]\n  arrayEq shared[(a b...)... (a c...)] , shared[(a ...b)... (a ...c)]\n  arrayEq shared[(a b...) ...(a c...)] , shared[(a ...b) ...(a ...c)]\n\n\n# Splicing\n\ntest \"basic splicing\", ->\n  ary = [0..9]\n  ary[5..9] = [0, 0, 0]\n  arrayEq [0, 1, 2, 3, 4, 0, 0, 0], ary\n\n  ary = [0..9]\n  ary[2...8] = []\n  arrayEq [0, 1, 8, 9], ary\n\ntest \"unbounded splicing\", ->\n  ary = [0..9]\n  ary[3..] = [9, 8, 7]\n  arrayEq [0, 1, 2, 9, 8, 7]. ary\n\n  ary[...3] = [7, 8, 9]\n  arrayEq [7, 8, 9, 9, 8, 7], ary\n\n  ary[..] = [1, 2, 3]\n  arrayEq [1, 2, 3], ary\n\ntest \"splicing with variables as endpoints\", ->\n  [a, b] = [1, 8]\n\n  ary = [0..9]\n  ary[a..b] = [2, 3]\n  arrayEq [0, 2, 3, 9], ary\n\n  ary = [0..9]\n  ary[a...b] = [5]\n  arrayEq [0, 5, 8, 9], ary\n\ntest \"splicing with expressions as endpoints\", ->\n  [a, b] = [1, 3]\n\n  ary = [0..9]\n  ary[ a+1 .. 2*b+1 ] = [4]\n  arrayEq [0, 1, 4, 8, 9], ary\n\n  ary = [0..9]\n  ary[a+1...2*b+1] = [4]\n  arrayEq [0, 1, 4, 7, 8, 9], ary\n\ntest \"splicing to the end, against a one-time function\", ->\n  ary = null\n  fn = ->\n    if ary\n      throw 'err'\n    else\n      ary = [1, 2, 3]\n\n  fn()[0..] = 1\n\n  arrayEq ary, [1]\n\ntest \"the return value of a splice literal should be the RHS\", ->\n  ary = [0, 0, 0]\n  eq (ary[0..1] = 2), 2\n\n  ary = [0, 0, 0]\n  eq (ary[0..] = 3), 3\n\n  arrayEq [ary[0..0] = 0], [0]\n\ntest \"#1723: operator precedence in unbounded splice compilation\", ->\n  n = 4 # some truthy number in `list`\n\n  list = [0..9]\n  list[..n] = n\n  arrayEq [n..9], list\n\n  list = [0..9]\n  list[..n or 0] = n\n  arrayEq [n..9], list\n\n  list = [0..9]\n  list[..if n then n else 0] = n\n  arrayEq [n..9], list\n\ntest \"#2953: methods on endpoints in assignment from array splice literal\", ->\n  list = [0..9]\n\n  Number.prototype.same = -> this\n  list[1.same()...9.same()] = 5\n  delete Number.prototype.same\n\n  arrayEq [0, 5, 9], list\n\ntest \"#1726: `Op` expression in property access causes unexpected results\", ->\n  a = [0..2]\n  arrayEq a, a[(!1 in a)..]\n  arrayEq a, a[!1 in a..]\n  arrayEq a[(!1 in a)..], a[(!1 in a)..]\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"soaks\">\n# Soaks\n# -----\n\n# * Soaked Property Access\n# * Soaked Method Invocation\n# * Soaked Function Invocation\n\n\n# Soaked Property Access\n\ntest \"soaked property access\", ->\n  nonce = {}\n  obj = a: b: nonce\n  eq nonce    , obj?.a.b\n  eq nonce    , obj?['a'].b\n  eq nonce    , obj.a?.b\n  eq nonce    , obj?.a?['b']\n  eq undefined, obj?.a?.non?.existent?.property\n\ntest \"soaked property access caches method calls\", ->\n  nonce ={}\n  obj = fn: -> a: nonce\n  eq nonce    , obj.fn()?.a\n  eq undefined, obj.fn()?.b\n\ntest \"soaked property access caching\", ->\n  nonce = {}\n  counter = 0\n  fn = ->\n    counter++\n    'self'\n  obj =\n    self: -> @\n    prop: nonce\n  eq nonce, obj[fn()]()[fn()]()[fn()]()?.prop\n  eq 3, counter\n\ntest \"method calls on soaked methods\", ->\n  nonce = {}\n  obj = null\n  eq undefined, obj?.a().b()\n  obj = a: -> b: -> nonce\n  eq nonce    , obj?.a().b()\n\ntest \"postfix existential operator mixes well with soaked property accesses\", ->\n  eq false, nonexistent?.property?\n\ntest \"function invocation with soaked property access\", ->\n  id = (_) -> _\n  eq undefined, id nonexistent?.method()\n\ntest \"if-to-ternary should safely parenthesize soaked property accesses\", ->\n  ok (if nonexistent?.property then false else true)\n\ntest \"#726: don't check for a property on a conditionally-referenced nonexistent thing\", ->\n  eq undefined, nonexistent?[Date()]\n\ntest \"#756: conditional assignment edge cases\", ->\n  # TODO: improve this test\n  a = null\n  ok isNaN      a?.b.c +  1\n  eq undefined, a?.b.c += 1\n  eq undefined, ++a?.b.c\n  eq undefined, delete a?.b.c\n\ntest \"operations on soaked properties\", ->\n  # TODO: improve this test\n  a = b: {c: 0}\n  eq 1,   a?.b.c +  1\n  eq 1,   a?.b.c += 1\n  eq 2,   ++a?.b.c\n  eq yes, delete a?.b.c\n\n\n# Soaked Method Invocation\n\ntest \"soaked method invocation\", ->\n  nonce = {}\n  counter = 0\n  obj =\n    self: -> @\n    increment: -> counter++; @\n  eq obj      , obj.self?()\n  eq undefined, obj.method?()\n  eq nonce    , obj.self?().property = nonce\n  eq undefined, obj.method?().property = nonce\n  eq obj      , obj.increment().increment().self?()\n  eq 2        , counter\n\ntest \"#733: conditional assignments\", ->\n  a = b: {c: null}\n  eq a.b?.c?(), undefined\n  a.b?.c or= (it) -> it\n  eq a.b?.c?(1), 1\n  eq a.b?.c?([2, 3]...), 2\n\n\n# Soaked Function Invocation\n\ntest \"soaked function invocation\", ->\n  nonce = {}\n  id = (_) -> _\n  eq nonce    , id?(nonce)\n  eq nonce    , (id? nonce)\n  eq undefined, nonexistent?(nonce)\n  eq undefined, (nonexistent? nonce)\n\ntest \"soaked function invocation with generated functions\", ->\n  nonce = {}\n  id = (_) -> _\n  maybe = (fn, arg) -> if typeof fn is 'function' then () -> fn(arg)\n  eq maybe(id, nonce)?(), nonce\n  eq (maybe id, nonce)?(), nonce\n  eq (maybe false, nonce)?(), undefined\n\ntest \"soaked constructor invocation\", ->\n  eq 42       , +new Number? 42\n  eq undefined,  new Other?  42\n\ntest \"soaked constructor invocations with caching and property access\", ->\n  semaphore = 0\n  nonce = {}\n  class C\n    constructor: ->\n      ok false if semaphore\n      semaphore++\n    prop: nonce\n  eq nonce, (new C())?.prop\n  eq 1, semaphore\n\ntest \"soaked function invocation safe on non-functions\", ->\n  eq undefined, (0)?(1)\n  eq undefined, (0)? 1, 2\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"sourcemap\">\nreturn if global.testingBrowser\n\n{spawn, fork} = require('child_process')\nSourceMap = require '../src/sourcemap'\n\nvlqEncodedValues = [\n    [1, 'C'],\n    [-1, 'D'],\n    [2, 'E'],\n    [-2, 'F'],\n    [0, 'A'],\n    [16, 'gB'],\n    [948, 'o7B']\n]\n\ntest \"encodeVlq tests\", ->\n  for pair in vlqEncodedValues\n    eq ((new SourceMap).encodeVlq pair[0]), pair[1]\n\ntest \"SourceMap tests\", ->\n  map = new SourceMap\n  map.add [0, 0], [0, 0]\n  map.add [1, 5], [2, 4]\n  map.add [1, 6], [2, 7]\n  map.add [1, 9], [2, 8]\n  map.add [3, 0], [3, 4]\n\n  testWithFilenames = map.generate {\n    sourceRoot: ''\n    sourceFiles: ['source.coffee']\n    generatedFile: 'source.js'\n  }\n\n  deepEqual testWithFilenames, {\n    version: 3\n    file: 'source.js'\n    sourceRoot: ''\n    sources: ['source.coffee']\n    names: []\n    mappings: 'AAAA;;IACK,GAAC,CAAG;IAET'\n  }\n\n  deepEqual map.generate(), {\n    version: 3\n    file: ''\n    sourceRoot: ''\n    sources: ['<anonymous>']\n    names: []\n    mappings: 'AAAA;;IACK,GAAC,CAAG;IAET'\n  }\n\n  # Look up a generated column - should get back the original source position.\n  arrayEq map.sourceLocation([2,8]), [1,9]\n\n  # Look up a point further along on the same line - should get back the same source position.\n  arrayEq map.sourceLocation([2,10]), [1,9]\n\ntest \"#3075: v3 source map fields\", ->\n  { js, v3SourceMap, sourceMap } = CoffeeScript.compile 'console.log Date.now()',\n    filename: 'tempus_fugit.coffee'\n    sourceMap: yes\n    sourceRoot: './www_root/coffee/'\n\n  v3SourceMap = JSON.parse v3SourceMap\n  arrayEq v3SourceMap.sources, ['tempus_fugit.coffee']\n  eq v3SourceMap.sourceRoot, './www_root/coffee/'\n\ntest \"node --enable-source-map built in stack trace mapping\", ->\n  new Promise (resolve, reject) ->\n    proc = fork './test/importing/error.coffee', [\n      '--enable-source-maps'\n    ], stdio: 'pipe'\n\n    err = ''\n    proc.stderr.setEncoding 'utf8'\n    proc.stderr.on 'data', (str) -> err += str\n    proc.on 'close', ->\n      try\n        match = err.match /error\\.coffee:(\\d+):(\\d+)/\n        throw new Error err unless match\n\n        [_, line, column] = match\n        equal line, 3 # Mapped source line\n        equal column, 9 # Mapped source column\n\n        resolve()\n      catch exception\n        reject exception\n\nif Number(process.versions.node.split('.')[0]) >= 14\n  test \"NODE_OPTIONS=--enable-source-maps environment variable stack trace mapping\", ->\n    new Promise (resolve, reject) ->\n      proc = fork './test/importing/error.coffee', [],\n        env:\n          NODE_OPTIONS: '--enable-source-maps'\n        stdio: 'pipe'\n\n      err = ''\n      proc.stderr.setEncoding 'utf8'\n      proc.stderr.on 'data', (str) -> err += str\n      proc.on 'close', ->\n        try\n          match = err.match /error\\.coffee:(\\d+):(\\d+)/\n          throw new Error err unless match\n\n          [_, line, column] = match\n          equal line, 3 # Mapped source line\n          equal column, 9 # Mapped source column\n\n          resolve()\n        catch exception\n          reject exception\n\n  test \"generate correct stack traces with --enable-source-maps from bin/coffee\", ->\n    new Promise (resolve, reject) ->\n      proc = fork 'test/importing/error.coffee',\n        ['--enable-source-maps'],\n        stdio: 'pipe'\n\n      err = \"\"\n      proc.stderr.setEncoding 'utf8'\n      proc.stderr.on 'data', (str) -> err += str\n      proc.on 'close', ->\n        try\n          match = err.match /error\\.coffee:(\\d+):(\\d+)/\n          throw new Error err unless match\n\n          [_, line, column] = match\n          equal line, 3 # Mapped source line\n          equal column, 9 # Mapped source column\n\n          resolve()\n        catch exception\n          reject exception\n\ntest \"don't change stack traces if another library has patched `Error.prepareStackTrace`\", ->\n  new Promise (resolve, reject) ->\n    # This uses `spawn` rather than the preferred `fork` because `fork` requires\n    # loading code in a separate file. The `--eval` here shows exactly what is\n    # executing without indirection.\n    proc = spawn 'node', [\n      '--eval', \"\"\"\n        const patchedPrepareStackTrace = Error.prepareStackTrace = function() {};\n        require('./register.js');\n        process.stdout.write(Error.prepareStackTrace === patchedPrepareStackTrace ? 'preserved' : 'overwritten');\n      \"\"\"\n    ]\n\n    out = ''\n    proc.stdout.setEncoding 'utf8'\n    proc.stdout.on 'data', (str) -> out += str\n\n    proc.on 'close', (status) ->\n      try\n        equal status, 0\n        equal out, 'preserved'\n\n        resolve()\n      catch exception\n        reject exception\n\ntest \"requiring 'CoffeeScript' doesn't change `Error.prepareStackTrace`\", ->\n  new Promise (resolve, reject) ->\n    # This uses `spawn` rather than the preferred `fork` because `fork` requires\n    # loading code in a separate file. The `--eval` here shows exactly what is\n    # executing without indirection.\n    proc = spawn 'node', [\n      '--eval', \"\"\"\n        require('./lib/coffeescript/coffeescript.js');\n        process.stdout.write(Error.prepareStackTrace === undefined ? 'unused' : 'defined');\n      \"\"\"\n    ]\n\n    out = ''\n    proc.stdout.setEncoding 'utf8'\n    proc.stdout.on 'data', (str) -> out += str\n\n    proc.on 'close', (status) ->\n      try\n        equal status, 0\n        equal out, 'unused'\n\n        resolve()\n      catch exception\n        reject exception\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"strict\">\n# Strict Early Errors\n# -------------------\n\n# The following are prohibited under ES5’s `strict` mode\n# * `Octal Integer Literals`\n# * `Octal Escape Sequences`\n# * duplicate property definitions in `Object Literal`s\n# * duplicate formal parameter\n# * `delete` operand is a variable\n# * `delete` operand is a parameter\n# * `delete` operand is `undefined`\n# * `Future Reserved Word`s as identifiers: implements, interface, let, package, private, protected, public, static, yield\n# * `eval` or `arguments` as `catch` identifier\n# * `eval` or `arguments` as formal parameter\n# * `eval` or `arguments` as function declaration identifier\n# * `eval` or `arguments` as LHS of assignment\n# * `eval` or `arguments` as the operand of a post/pre-fix inc/dec-rement expression\n\n# helper to assert that code complies with strict prohibitions\nstrict = (code, msg) ->\n  throwsCompileError code, null, null, msg ? code\nstrictOk = (code, msg) ->\n  doesNotThrowCompileError code, null, msg ? code\n\n\ntest \"octal integer literals prohibited\", ->\n  strict    '01'\n  strict    '07777'\n  # decimals with a leading '0' are also prohibited\n  strict    '09'\n  strict    '079'\n  strictOk  '`01`'\n\ntest \"octal escape sequences prohibited\", ->\n  strict    '\"\\\\1\"'\n  strict    '\"\\\\7\"'\n  strict    '\"\\\\001\"'\n  strict    '\"\\\\777\"'\n  strict    '\"_\\\\1\"'\n  strict    '\"\\\\1_\"'\n  strict    '\"_\\\\1_\"'\n  strict    '\"\\\\\\\\\\\\1\"'\n  strictOk  '\"\\\\0\"'\n  eq \"\\x00\", \"\\0\"\n  strictOk  '\"\\\\0\\\\8\"'\n  eq \"\\x008\", \"\\0\\8\"\n  strictOk  '\"\\\\8\"'\n  eq \"8\", \"\\8\"\n  strictOk  '\"\\\\\\\\1\"'\n  eq \"\\\\\" + \"1\", \"\\\\1\"\n  strictOk  '\"\\\\\\\\\\\\\\\\1\"'\n  eq \"\\\\\\\\\" + \"1\", \"\\\\\\\\1\"\n  strictOk  \"`'\\\\1'`\"\n  eq \"\\\\\" + \"1\", `\"\\\\1\"`\n\n  # Also test other string types.\n  strict           \"'\\\\\\\\\\\\1'\"\n  eq \"\\\\\\\\\" + \"1\", '\\\\\\\\1'\n  strict           \"'''\\\\\\\\\\\\1'''\"\n  eq \"\\\\\\\\\" + \"1\", '''\\\\\\\\1'''\n  strict           '\"\"\"\\\\\\\\\\\\1\"\"\"'\n  eq \"\\\\\\\\\" + \"1\", \"\"\"\\\\\\\\1\"\"\"\n\ntest \"duplicate formal parameters are prohibited\", ->\n  nonce = {}\n  # a Param can be an Identifier, ThisProperty( @-param ), Array, or Object\n  # a Param can also be a splat (...) or an assignment (param=value)\n  # the following function expressions should throw errors\n  strict '(_,_)->',          'param, param'\n  strict '(_,_...)->',       'param, param...'\n  strict '(_,_ = true)->',   'param, param='\n  strict '(@_,@_)->',        'two @params'\n  strict '(@case,@case)->',  'two @reserved'\n  strict '(_,{_})->',        'param, {param}'\n  strict '(_,{_=true})->',   'param, {param=}'\n  strict '({_,_})->',        '{param, param}'\n  strict '({_=true,_})->',   '{param=, param}'\n  strict '(_,[_])->',        'param, [param]'\n  strict '(_,[_=true])->',   'param, [param=]'\n  strict '([_,_])->',        '[param, param]'\n  strict '([_=true,_])->',   '[param=, param]'\n  strict '(_,[_]=true)->',   'param, [param]='\n  strict '(_,[_=true]=true)->', 'param, [param=]='\n  strict '(_,[@_,{_}])->',   'param, [@param, {param}]'\n  strict '(_,[_,{@_}])->',   'param, [param, {@param}]'\n  strict '(_,[_,{@_=true}])->', 'param, [param, {@param=}]'\n  strict '(_,[_,{_}])->',    'param, [param, {param}]'\n  strict '(_,[_,{__}])->',   'param, [param, {param2}]'\n  strict '(_,[__,{_}])->',   'param, [param2, {param}]'\n  strict '(__,[_,{_}])->',   'param, [param2, {param2}]'\n  strict '({0:a,1:a})->',    '{0:param,1:param}'\n  strict '(a=b=true,a)->',   'param=assignment, param'\n  strict '({a=b=true},a)->', '{param=assignment}, param'\n  # the following function expressions should **not** throw errors\n  strictOk '(_,@_)->'\n  strictOk '(@_,_...)->'\n  strictOk '(_,@_ = true)->'\n  strictOk '(@_,{_})->'\n  strictOk '({_,@_})->'\n  strictOk '({_,@_ = true})->'\n  strictOk '([_,@_])->'\n  strictOk '([_,@_ = true])->'\n  strictOk '({},_arg)->'\n  strictOk '({},{})->'\n  strictOk '([]...,_arg)->'\n  strictOk '({}...,_arg)->'\n  strictOk '({}...,[],_arg)->'\n  strictOk '([]...,{},_arg)->'\n  strictOk '(@case,_case)->'\n  strictOk '(@case,_case...)->'\n  strictOk '(@case...,_case)->'\n  strictOk '(_case,@case)->'\n  strictOk '(_case,@case...)->'\n  strictOk '({a:a})->'\n  strictOk '({a:a,a:b})->'\n\ntest \"`delete` operand restrictions\", ->\n  strict 'a = 1; delete a'\n  strictOk 'delete a' #noop\n  strict '(a) -> delete a'\n  strict '(a...) -> delete a'\n  strict '(a = 1) -> delete a'\n  strict '([a]) -> delete a'\n  strict '({a}) -> delete a'\n\ntest \"`Future Reserved Word`s, `eval` and `arguments` restrictions\", ->\n\n  access = (keyword, check = strict) ->\n    check \"#{keyword}.a = 1\"\n    check \"#{keyword}[0] = 1\"\n  assign = (keyword, check = strict) ->\n    check \"#{keyword} = 1\"\n    check \"#{keyword} += 1\"\n    check \"#{keyword} -= 1\"\n    check \"#{keyword} *= 1\"\n    check \"#{keyword} /= 1\"\n    check \"#{keyword} ?= 1\"\n  update = (keyword, check = strict) ->\n    check \"#{keyword}++\"\n    check \"++#{keyword}\"\n    check \"#{keyword}--\"\n    check \"--#{keyword}\"\n  destruct = (keyword, check = strict) ->\n    check \"{#{keyword}}\"\n    check \"o = {#{keyword}}\"\n  invoke = (keyword, check = strict) ->\n    check \"#{keyword} yes\"\n    check \"do #{keyword}\"\n  fnDecl = (keyword, check = strict) ->\n    check \"class #{keyword}\"\n  param = (keyword, check = strict) ->\n    check \"(#{keyword}) ->\"\n    check \"({#{keyword}}) ->\"\n  prop = (keyword, check = strict) ->\n    check \"a.#{keyword} = 1\"\n  tryCatch = (keyword, check = strict) ->\n    check \"try new Error catch #{keyword}\"\n\n  future = 'implements interface let package private protected public static'.split ' '\n  for keyword in future\n    access   keyword\n    assign   keyword\n    update   keyword\n    destruct keyword\n    invoke   keyword\n    fnDecl   keyword\n    param    keyword\n    prop     keyword, strictOk\n    tryCatch keyword\n\n  for keyword in ['eval', 'arguments']\n    access   keyword, strictOk\n    assign   keyword\n    update   keyword\n    destruct keyword, strictOk\n    invoke   keyword, strictOk\n    fnDecl   keyword\n    param    keyword\n    prop     keyword, strictOk\n    tryCatch keyword\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"strings\">\n# String Literals\n# ---------------\n\n# TODO: refactor string literal tests\n# TODO: add indexing and method invocation tests: \"string\"[\"toString\"] is String::toString, \"string\".toString() is \"string\"\n\n# * Strings\n# * Heredocs\n\ntest \"backslash escapes\", ->\n  eq \"\\\\/\\\\\\\\\", /\\/\\\\/.source\n\neq '(((dollars)))', '\\(\\(\\(dollars\\)\\)\\)'\neq 'one two three', \"one\n two\n three\"\neq \"four five\", 'four\n\n five'\n\ntest \"#3229, multiline strings\", ->\n  # Separate lines by default by a single space in literal strings.\n  eq 'one\n      two', 'one two'\n  eq \"one\n      two\", 'one two'\n  eq '\n        a\n        b\n    ', 'a b'\n  eq \"\n        a\n        b\n    \", 'a b'\n  eq 'one\n\n        two', 'one two'\n  eq \"one\n\n        two\", 'one two'\n  eq '\n    indentation\n      doesn\\'t\n  matter', 'indentation doesn\\'t matter'\n  eq 'trailing ws      \n    doesn\\'t matter', 'trailing ws doesn\\'t matter'\n\n  # Use backslashes at the end of a line to specify whitespace between lines.\n  eq 'a \\\n      b\\\n      c  \\\n      d', 'a bc  d'\n  eq \"a \\\n      b\\\n      c  \\\n      d\", 'a bc  d'\n  eq 'ignore  \\  \n      trailing whitespace', 'ignore  trailing whitespace'\n\n  # Backslash at the beginning of a literal string.\n  eq '\\\n      ok', 'ok'\n  eq '  \\\n      ok', '  ok'\n\n  # #1273, empty strings.\n  eq '\\\n     ', ''\n  eq '\n     ', ''\n  eq '\n          ', ''\n  eq '   ', '   '\n\n  # Same behavior in interpolated strings.\n  eq \"interpolation #{1}\n      follows #{2}  \\\n      too #{3}\\\n      !\", 'interpolation 1 follows 2  too 3!'\n  eq \"a #{\n    'string ' + \"inside\n                 interpolation\"\n    }\", \"a string inside interpolation\"\n  eq \"\n      #{1}\n     \", '1'\n\n  # Handle escaped backslashes correctly.\n  eq '\\\\', `'\\\\'`\n  eq 'escaped backslash at EOL\\\\\n      next line', 'escaped backslash at EOL\\\\ next line'\n  eq '\\\\\n      next line', '\\\\ next line'\n  eq '\\\\\n     ', '\\\\'\n  eq '\\\\\\\\\\\\\n     ', '\\\\\\\\\\\\'\n  eq \"#{1}\\\\\n      after interpolation\", '1\\\\ after interpolation'\n  eq 'escaped backslash before slash\\\\  \\\n      next line', 'escaped backslash before slash\\\\  next line'\n  eq 'triple backslash\\\\\\\n      next line', 'triple backslash\\\\next line'\n  eq 'several escaped backslashes\\\\\\\\\\\\\n      ok', 'several escaped backslashes\\\\\\\\\\\\ ok'\n  eq 'several escaped backslashes slash\\\\\\\\\\\\\\\n      ok', 'several escaped backslashes slash\\\\\\\\\\\\ok'\n  eq 'several escaped backslashes with trailing ws \\\\\\\\\\\\   \n      ok', 'several escaped backslashes with trailing ws \\\\\\\\\\\\ ok'\n\n  # Backslashes at beginning of lines.\n  eq 'first line\n      \\   backslash at BOL', 'first line \\   backslash at BOL'\n  eq 'first line\\\n      \\   backslash at BOL', 'first line\\   backslash at BOL'\n\n  # Backslashes at end of strings.\n  eq 'first line \\ ', 'first line  '\n  eq 'first line\n      second line \\\n      ', 'first line second line '\n  eq 'first line\n      second line\n      \\\n      ', 'first line second line'\n  eq 'first line\n      second line\n\n        \\\n\n      ', 'first line second line'\n\n  # Edge case.\n  eq 'lone\n\n        \\\n\n        backslash', 'lone backslash'\n\ntest \"#3249, escape newlines in heredocs with backslashes\", ->\n  # Ignore escaped newlines\n  eq '''\n    Set whitespace      \\\n       <- this is ignored\\  \n           none\n      normal indentation\n    ''', 'Set whitespace      <- this is ignorednone\\n  normal indentation'\n  eq \"\"\"\n    Set whitespace      \\\n       <- this is ignored\\  \n           none\n      normal indentation\n    \"\"\", 'Set whitespace      <- this is ignorednone\\n  normal indentation'\n\n  # Changed from #647, trailing backslash.\n  eq '''\n  Hello, World\\\n\n  ''', 'Hello, World'\n  eq '''\n    \\\\\n  ''', '\\\\'\n\n  # Backslash at the beginning of a literal string.\n  eq '''\\\n      ok''', 'ok'\n  eq '''  \\\n      ok''', '  ok'\n\n  # Same behavior in interpolated strings.\n  eq \"\"\"\n    interpolation #{1}\n      follows #{2}  \\\n        too #{3}\\\n    !\n  \"\"\", 'interpolation 1\\n  follows 2  too 3!'\n  eq \"\"\"\n\n    #{1} #{2}\n\n    \"\"\", '\\n1 2\\n'\n\n  # Handle escaped backslashes correctly.\n  eq '''\n    escaped backslash at EOL\\\\\n      next line\n  ''', 'escaped backslash at EOL\\\\\\n  next line'\n  eq '''\\\\\n\n     ''', '\\\\\\n'\n\n  # Backslashes at beginning of lines.\n  eq '''first line\n      \\   backslash at BOL''', 'first line\\n\\   backslash at BOL'\n  eq \"\"\"first line\\\n      \\   backslash at BOL\"\"\", 'first line\\   backslash at BOL'\n\n  # Backslashes at end of strings.\n  eq '''first line \\ ''', 'first line  '\n  eq '''\n    first line\n    second line \\\n  ''', 'first line\\nsecond line '\n  eq '''\n    first line\n    second line\n    \\\n  ''', 'first line\\nsecond line'\n  eq '''\n    first line\n    second line\n\n      \\\n\n  ''', 'first line\\nsecond line\\n'\n\n  # Edge cases.\n  eq '''lone\n\n          \\\n\n\n\n        backslash''', 'lone\\n\\n  backslash'\n  eq '''\\\n     ''', ''\n\ntest '#2388: `\"\"\"` in heredoc interpolations', ->\n  eq \"\"\"a heredoc #{\n      \"inside \\\n        interpolation\"\n    }\"\"\", \"a heredoc inside interpolation\"\n  eq \"\"\"a#{\"\"\"b\"\"\"}c\"\"\", 'abc'\n  eq \"\"\"#{\"\"\"\"\"\"}\"\"\", ''\n\ntest \"trailing whitespace\", ->\n  testTrailing = (str, expected) ->\n    eq CoffeeScript.eval(str.replace /\\|$/gm, ''), expected\n  testTrailing '''\"   |\n      |\n    a   |\n           |\n  \"''', 'a'\n  testTrailing \"\"\"'''   |\n      |\n    a   |\n           |\n  '''\"\"\", '  \\na   \\n       '\n\n#647\neq \"''Hello, World\\\\''\", '''\n'\\'Hello, World\\\\\\''\n'''\neq '\"\"Hello, World\\\\\"\"', \"\"\"\n\"\\\"Hello, World\\\\\\\"\"\n\"\"\"\n\ntest \"#1273, escaping quotes at the end of heredocs.\", ->\n  # \"\"\"\\\"\"\" no longer compiles\n  eq \"\"\"\\\\\"\"\", '\\\\'\n  eq \"\"\"\\\\\\\"\"\"\", '\\\\\\\"'\n\na = \"\"\"\n    basic heredoc\n    on two lines\n    \"\"\"\nok a is \"basic heredoc\\non two lines\"\n\na = '''\n    a\n      \"b\n    c\n    '''\nok a is \"a\\n  \\\"b\\nc\"\n\na = \"\"\"\na\n b\n  c\n\"\"\"\nok a is \"a\\n b\\n  c\"\n\na = '''one-liner'''\nok a is 'one-liner'\n\na = \"\"\"\n      out\n      here\n\"\"\"\nok a is \"out\\nhere\"\n\na = '''\n       a\n     b\n   c\n    '''\nok a is \"    a\\n  b\\nc\"\n\na = '''\na\n\n\nb c\n'''\nok a is \"a\\n\\n\\nb c\"\n\na = '''more\"than\"one\"quote'''\nok a is 'more\"than\"one\"quote'\n\na = '''here's an apostrophe'''\nok a is \"here's an apostrophe\"\n\na = \"\"\"\"\"surrounded by two quotes\"\\\"\"\"\"\nok a is '\"\"surrounded by two quotes\"\"'\n\na = '''''surrounded by two apostrophes'\\''''\nok a is \"''surrounded by two apostrophes''\"\n\n# The indentation detector ignores blank lines without trailing whitespace\na = \"\"\"\n    one\n    two\n\n    \"\"\"\nok a is \"one\\ntwo\\n\"\n\neq ''' line 0\n  should not be relevant\n    to the indent level\n''', ' line 0\\nshould not be relevant\\n  to the indent level'\n\neq \"\"\"\n  interpolation #{\n \"contents\"\n }\n  should not be relevant\n    to the indent level\n\"\"\", 'interpolation contents\\nshould not be relevant\\n  to the indent level'\n\neq ''' '\\\\\\' ''', \" '\\\\' \"\neq \"\"\" \"\\\\\\\" \"\"\", ' \"\\\\\" '\n\neq '''  <- keep these spaces ->  ''', '  <- keep these spaces ->  '\n\neq '''undefined''', 'undefined'\neq \"\"\"undefined\"\"\", 'undefined'\n\n\ntest \"#1046, empty string interpolations\", ->\n  eq \"#{ }\", ''\n\ntest \"strings are not callable\", ->\n  throwsCompileError '\"a\"()'\n  throwsCompileError '\"a#{b}\"()'\n  throwsCompileError '\"a\" 1'\n  throwsCompileError '\"a#{b}\" 1'\n  throwsCompileError '''\n    \"a\"\n       k: v\n  '''\n  throwsCompileError '''\n    \"a#{b}\"\n       k: v\n  '''\n\ntest \"#3795: Escape otherwise invalid characters\", ->\n  eq ' ', '\\u2028'\n  eq ' ', '\\u2029'\n  eq '\\0\\\n      1', '\\x001'\n  eq \" \", '\\u2028'\n  eq \" \", '\\u2029'\n  eq \"\\0\\\n      1\", '\\x001'\n  eq \"\\0\\\n      9\", '\\x009'\n  eq \"\\0#{}0\", '\\x000'\n  eq ''' ''', '\\u2028'\n  eq ''' ''', '\\u2029'\n  eq '''\\0\\\n      1''', '\\x001'\n  eq '''\\0\\\n      9''', '\\x009'\n  eq \"\"\"\\0#{}1\"\"\", '\\x001'\n  eq \"\"\" \"\"\", '\\u2028'\n  eq \"\"\" \"\"\", '\\u2029'\n  eq \"\"\"\\0\\\n      1\"\"\", '\\x001'\n\n  a = 'a'\n  eq \"#{a} \", 'a\\u2028'\n  eq \"#{a} \", 'a\\u2029'\n  eq \"#{a}\\0\\\n      1\", 'a\\0' + '1'\n  eq \"\"\"#{a} \"\"\", 'a\\u2028'\n  eq \"\"\"#{a} \"\"\", 'a\\u2029'\n  eq \"\"\"#{a}\\0\\\n      1\"\"\", 'a\\0' + '1'\n\ntest \"#4314: Whitespace less than or equal to stripped indentation\", ->\n  # The odd indentation is intentional here, to test 1-space indentation.\n  eq ' ', \"\"\"\n #{} #{}\n\"\"\"\n\n  eq '1 2  3   4    5     end\\na 0     b', \"\"\"\n    #{1} #{2}  #{3}   #{4}    #{5}     end\n    a #{0}     b\"\"\"\n\ntest \"#4248: Unicode code point escapes\", ->\n  eq '\\u01ab\\u00cd', '\\u{1ab}\\u{cd}'\n  eq '\\u01ab', '\\u{000001ab}'\n  eq 'a\\u01ab', \"#{ 'a' }\\u{1ab}\"\n  eq '\\u01abc', '''\\u{01ab}c'''\n  eq '\\u01abc', \"\"\"\\u{1ab}#{ 'c' }\"\"\"\n  eq '\\udab3\\uddef', '\\u{bcdef}'\n  eq '\\udab3\\uddef', '\\u{0000bcdef}'\n  eq 'a\\udab3\\uddef', \"#{ 'a' }\\u{bcdef}\"\n  eq '\\udab3\\uddefc', '''\\u{0bcdef}c'''\n  eq '\\udab3\\uddefc', \"\"\"\\u{bcdef}#{ 'c' }\"\"\"\n  eq '\\\\u{123456}', \"#{'\\\\'}#{'u{123456}'}\"\n\n  # don't rewrite code point escapes\n  eqJS \"\"\"\n    '\\\\u{bcdef}\\\\u{abc}'\n  \"\"\",\n  \"\"\"\n    '\\\\u{bcdef}\\\\u{abc}';\n  \"\"\"\n\n  eqJS \"\"\"\n    \"#{ 'a' }\\\\u{bcdef}\"\n  \"\"\",\n  \"\"\"\n    \"a\\\\u{bcdef}\";\n  \"\"\"\n\n</script>\n<script type=\"text/x-coffeescript\" class=\"test\" id=\"tagged_template_literals\">\n# Tagged template literals\n# ------------------------\n\n# NOTES:\n# A tagged template literal is a string that is passed to a prefixing function for\n# post-processing. There's a bunch of different angles that need testing:\n# - Prefixing function, which can be any form of function call:\n#   - function: func'Hello'\n#   - object property with dot notation: outerobj.obj.func'Hello'\n#   - object property with bracket notation: outerobj['obj']['func']'Hello'\n# - String form: single quotes, double quotes and block strings\n# - String is single-line or multi-line\n# - String is interpolated or not\n\nfunc = (text, expressions...) ->\n  \"text: [#{text.join '|'}] expressions: [#{expressions.join '|'}]\"\n\nouterobj =\n  obj:\n    func: func\n    f: -> func\n\n# Example use\ntest \"tagged template literal for html templating\", ->\n  html = (htmlFragments, expressions...) ->\n    htmlFragments.reduce (fullHtml, htmlFragment, i) ->\n      fullHtml + \"#{expressions[i - 1]}#{htmlFragment}\"\n\n  state =\n    name: 'Greg'\n    adjective: 'awesome'\n\n  eq \"\"\"\n      <p>\n        Hi Greg. You're looking awesome!\n      </p>\n    \"\"\",\n    html\"\"\"\n      <p>\n        Hi #{state.name}. You're looking #{state.adjective}!\n      </p>\n    \"\"\"\n\n# Simple, non-interpolated strings\ntest \"tagged template literal with a single-line single-quote string\", ->\n  eq 'text: [single-line single quotes] expressions: []',\n  func'single-line single quotes'\n\ntest \"tagged template literal with a single-line double-quote string\", ->\n  eq 'text: [single-line double quotes] expressions: []',\n  func\"single-line double quotes\"\n\ntest \"tagged template literal with a single-line single-quote block string\", ->\n  eq 'text: [single-line block string] expressions: []',\n  func'''single-line block string'''\n\ntest \"tagged template literal with a single-line double-quote block string\", ->\n  eq 'text: [single-line block string] expressions: []',\n  func\"\"\"single-line block string\"\"\"\n\ntest \"tagged template literal with a multi-line single-quote string\", ->\n  eq 'text: [multi-line single quotes] expressions: []',\n  func'multi-line\n                                                              single quotes'\n\ntest \"tagged template literal with a multi-line double-quote string\", ->\n  eq 'text: [multi-line double quotes] expressions: []',\n  func\"multi-line\n       double quotes\"\n\ntest \"tagged template literal with a multi-line single-quote block string\", ->\n  eq 'text: [multi-line\\nblock string] expressions: []',\n  func'''\n      multi-line\n      block string\n      '''\n\ntest \"tagged template literal with a multi-line double-quote block string\", ->\n  eq 'text: [multi-line\\nblock string] expressions: []',\n  func\"\"\"\n      multi-line\n      block string\n      \"\"\"\n\n# Interpolated strings with expressions\ntest \"tagged template literal with a single-line double-quote interpolated string\", ->\n  eq 'text: [single-line | double quotes | interpolation] expressions: [36|42]',\n  func\"single-line #{6 * 6} double quotes #{6 * 7} interpolation\"\n\ntest \"tagged template literal with a single-line double-quote block interpolated string\", ->\n  eq 'text: [single-line | block string | interpolation] expressions: [incredible|48]',\n  func\"\"\"single-line #{'incredible'} block string #{6 * 8} interpolation\"\"\"\n\ntest \"tagged template literal with a multi-line double-quote interpolated string\", ->\n  eq 'text: [multi-line | double quotes | interpolation] expressions: [2|awesome]',\n  func\"multi-line #{4/2}\n       double quotes #{'awesome'} interpolation\"\n\ntest \"tagged template literal with a multi-line double-quote block interpolated string\", ->\n  eq 'text: [multi-line |\\nblock string |] expressions: [/abc/|32]',\n  func\"\"\"\n      multi-line #{/abc/}\n      block string #{2 * 16}\n      \"\"\"\n\n\n# Tagged template literal must use a callable function\ntest \"tagged template literal dot notation recognized as a callable function\", ->\n  eq 'text: [dot notation] expressions: []',\n  outerobj.obj.func'dot notation'\n\ntest \"tagged template literal bracket notation recognized as a callable function\", ->\n  eq 'text: [bracket notation] expressions: []',\n  outerobj['obj']['func']'bracket notation'\n\ntest \"tagged template literal mixed dot and bracket notation recognized as a callable function\", ->\n  eq 'text: [mixed notation] expressions: []',\n  outerobj['obj'].func'mixed notation'\n\n\n# Edge cases\ntest \"tagged template literal with an empty string\", ->\n  eq 'text: [] expressions: []',\n  func''\n\ntest \"tagged template literal with an empty interpolated string\", ->\n  eq 'text: [] expressions: []',\n  func\"#{}\"\n\ntest \"tagged template literal as single interpolated expression\", ->\n  eq 'text: [|] expressions: [3]',\n  func\"#{3}\"\n\ntest \"tagged template literal with an interpolated string that itself contains an interpolated string\", ->\n  eq 'text: [inner | string] expressions: [interpolated]',\n  func\"inner #{\"#{'inter'}polated\"} string\"\n\ntest \"tagged template literal with an interpolated string that contains a tagged template literal\", ->\n  eq 'text: [inner tagged | literal] expressions: [text: [|] expressions: [template]]',\n  func\"inner tagged #{func\"#{'template'}\"} literal\"\n\ntest \"tagged template literal with backticks\", ->\n  eq 'text: [ES template literals look like this: `foo bar`] expressions: []',\n  func\"ES template literals look like this: `foo bar`\"\n\ntest \"tagged template literal with escaped backticks\", ->\n  eq 'text: [ES template literals look like this: \\\\`foo bar\\\\`] expressions: []',\n  func\"ES template literals look like this: \\\\`foo bar\\\\`\"\n\ntest \"tagged template literal with unnecessarily escaped backticks\", ->\n  eq 'text: [ES template literals look like this: `foo bar`] expressions: []',\n  func\"ES template literals look like this: \\`foo bar\\`\"\n\ntest \"tagged template literal with ES interpolation\", ->\n  eq 'text: [ES template literals also look like this: `3 + 5 = ${3+5}`] expressions: []',\n  func\"ES template literals also look like this: `3 + 5 = ${3+5}`\"\n\ntest \"tagged template literal with both ES and CoffeeScript interpolation\", ->\n  eq \"text: [ES template literals also look like this: `3 + 5 = ${3+5}` which equals |] expressions: [8]\",\n  func\"ES template literals also look like this: `3 + 5 = ${3+5}` which equals #{3+5}\"\n\ntest \"tagged template literal with escaped ES interpolation\", ->\n  eq 'text: [ES template literals also look like this: `3 + 5 = \\\\${3+5}`] expressions: []',\n  func\"ES template literals also look like this: `3 + 5 = \\\\${3+5}`\"\n\ntest \"tagged template literal with unnecessarily escaped ES interpolation\", ->\n  eq 'text: [ES template literals also look like this: `3 + 5 = ${3+5}`] expressions: []',\n  func\"ES template literals also look like this: `3 + 5 = \\${3+5}`\"\n\ntest \"tagged template literal special escaping\", ->\n  eq 'text: [` ` \\\\` \\\\` \\\\\\\\` $ { ${ ${ \\\\${ \\\\${ \\\\\\\\${ | ` ${] expressions: [1]',\n  func\"` \\` \\\\` \\\\\\` \\\\\\\\` $ { ${ \\${ \\\\${ \\\\\\${ \\\\\\\\${ #{1} ` ${\"\n\ntest '#4467: tagged template literal call recognized as a callable function', ->\n  eq 'text: [dot notation] expressions: []',\n  outerobj.obj.f()'dot notation'\n\n\n</script>\n\n\n<script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-106156830-1\"></script>\n<script>\n  window.GA_TRACKING_ID = 'UA-106156830-1';\n  window.dataLayer = window.dataLayer || [];\n  function gtag(){dataLayer.push(arguments)};\n  gtag('js', new Date());\n  gtag('config', GA_TRACKING_ID);\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "documentation/examples/aliases.coffee",
    "content": "launch() if ignition is on\n\nvolume = 10 if band isnt SpinalTap\n\nletTheWildRumpusBegin() unless answer is no\n\nif car.speed < limit then accelerate()\n\nwinner = yes if pick in [47, 92, 13]\n\nprint inspect \"My name is #{@name}\"\n"
  },
  {
    "path": "documentation/examples/array_comprehensions.coffee",
    "content": "# Eat lunch.\neat = (food) -> \"#{food} eaten.\"\neat food for food in ['toast', 'cheese', 'wine']\n\n# Fine five course dining.\ncourses = ['greens', 'caviar', 'truffles', 'roast', 'cake']\nmenu = (i, dish) -> \"Menu Item #{i}: #{dish}\" \nmenu i + 1, dish for dish, i in courses\n\n# Health conscious meal.\nfoods = ['broccoli', 'spinach', 'chocolate']\neat food for food in foods when food isnt 'chocolate'\n"
  },
  {
    "path": "documentation/examples/array_spread.coffee",
    "content": "popular  = ['pepperoni', 'sausage', 'cheese']\nunwanted = ['anchovies', 'olives']\n\nall = [popular..., unwanted..., 'mushrooms']\n"
  },
  {
    "path": "documentation/examples/async.coffee",
    "content": "# Your browser must support async/await and speech synthesis\n# to run this example.\n\nsleep = (ms) ->\n  new Promise (resolve) ->\n    window.setTimeout resolve, ms\n\nsay = (text) ->\n  window.speechSynthesis.cancel()\n  window.speechSynthesis.speak new SpeechSynthesisUtterance text\n\ncountdown = (seconds) ->\n  for i in [seconds..1]\n    say i\n    await sleep 1000 # wait one second\n  say \"Blastoff!\"\n\ncountdown 3\n"
  },
  {
    "path": "documentation/examples/breaking_change_bound_generator_function.coffee",
    "content": "self = this\nf = -> yield self\n"
  },
  {
    "path": "documentation/examples/breaking_change_destructuring_default_values.coffee",
    "content": "{a = 1} = {a: null}\n\na  # Equals 1 in CoffeeScript 1.x, null in CoffeeScript 2\n"
  },
  {
    "path": "documentation/examples/breaking_change_fat_arrow.coffee",
    "content": "outer = ->\n  inner = => Array.from arguments\n  inner()\n\nouter(1, 2)  # Returns '' in CoffeeScript 1.x, '1, 2' in CoffeeScript 2\n"
  },
  {
    "path": "documentation/examples/breaking_change_function_parameter_default_values.coffee",
    "content": "f = (a = 1) -> a\n\nf(null)  # Returns 1 in CoffeeScript 1.x, null in CoffeeScript 2\n"
  },
  {
    "path": "documentation/examples/breaking_change_super_in_non-class_methods_refactor_with_apply.coffee",
    "content": "# Helper functions\nhasProp = {}.hasOwnProperty\nextend = (child, parent) ->\n  ctor = ->\n    @constructor = child\n    return\n  for key of parent\n    if hasProp.call(parent, key)\n      child[key] = parent[key]\n  ctor.prototype = parent.prototype\n  child.prototype = new ctor\n  child\n\n\nA = ->\nB = ->\nextend B, A\nB.prototype.foo = -> A::foo.apply this, arguments\n"
  },
  {
    "path": "documentation/examples/breaking_change_super_in_non-class_methods_refactor_with_class.coffee",
    "content": "class A\nclass B extends A\n  foo: -> super arguments...\n"
  },
  {
    "path": "documentation/examples/breaking_change_super_this.coffee",
    "content": "class B extends A\n  constructor: (arg) ->\n    super arg\n    @arg = arg\n"
  },
  {
    "path": "documentation/examples/breaking_change_super_with_arguments.coffee",
    "content": "class B extends A\n  foo: -> super arguments...\n"
  },
  {
    "path": "documentation/examples/breaking_change_super_without_arguments.coffee",
    "content": "class B extends A\n  foo: -> super()\n"
  },
  {
    "path": "documentation/examples/cake_tasks.coffee",
    "content": "fs = require 'fs'\n\noption '-o', '--output [DIR]', 'directory for compiled code'\n\ntask 'build:parser', 'rebuild the Jison parser', (options) ->\n  require 'jison'\n  code = require('./lib/grammar').parser.generate()\n  dir  = options.output or 'lib'\n  fs.writeFile \"#{dir}/parser.js\", code\n"
  },
  {
    "path": "documentation/examples/chaining.coffee",
    "content": "$ 'body'\n.click (e) ->\n  $ '.box'\n  .fadeIn 'fast'\n  .addClass 'show'\n.css 'background', 'white'\n"
  },
  {
    "path": "documentation/examples/classes.coffee",
    "content": "class Animal\n  constructor: (@name) ->\n\n  move: (meters) ->\n    alert @name + \" moved #{meters}m.\"\n\nclass Snake extends Animal\n  move: ->\n    alert \"Slithering...\"\n    super 5\n\nclass Horse extends Animal\n  move: ->\n    alert \"Galloping...\"\n    super 45\n\nsam = new Snake \"Sammy the Python\"\ntom = new Horse \"Tommy the Palomino\"\n\nsam.move()\ntom.move()\n"
  },
  {
    "path": "documentation/examples/comment.coffee",
    "content": "###\nFortune Cookie Reader v1.0\nReleased under the MIT License\n###\n\nsayFortune = (fortune) ->\n  console.log fortune # in bed!\n"
  },
  {
    "path": "documentation/examples/comparisons.coffee",
    "content": "cholesterol = 127\n\nhealthy = 200 > cholesterol > 60\n"
  },
  {
    "path": "documentation/examples/conditionals.coffee",
    "content": "mood = greatlyImproved if singing\n\nif happy and knowsIt\n  clapsHands()\n  chaChaCha()\nelse\n  showIt()\n\ndate = if friday then sue else jill\n"
  },
  {
    "path": "documentation/examples/constructor_destructuring.coffee",
    "content": "class Person\n  constructor: (options) ->\n    {@name, @age, @height = 'average'} = options\n\ntim = new Person name: 'Tim', age: 4\n"
  },
  {
    "path": "documentation/examples/default_args.coffee",
    "content": "fill = (container, liquid = \"coffee\") ->\n  \"Filling the #{container} with #{liquid}...\"\n"
  },
  {
    "path": "documentation/examples/do.coffee",
    "content": "for filename in list\n  do (filename) ->\n    if filename not in ['.DS_Store', 'Thumbs.db', 'ehthumbs.db']\n      fs.readFile filename, (err, contents) ->\n        compile filename, contents.toString()\n"
  },
  {
    "path": "documentation/examples/dynamic_import.coffee",
    "content": "# Your browser must support dynamic import to run this example.\n\ndo ->\n  { run } = await import('./browser-compiler-modern/coffeescript.js')\n  run '''\n    if 5 < new Date().getHours() < 9\n      alert 'Time to make the coffee!'\n    else\n      alert 'Time to get some work done.'\n  '''\n"
  },
  {
    "path": "documentation/examples/embedded.coffee",
    "content": "hi = `function() {\n  return [document.title, \"Hello JavaScript\"].join(\": \");\n}`\n"
  },
  {
    "path": "documentation/examples/embedded_block.coffee",
    "content": "```\nfunction time() {\n  return `The time is ${new Date().toLocaleTimeString()}`;\n}\n```\n"
  },
  {
    "path": "documentation/examples/embedded_escaped.coffee",
    "content": "markdown = `function () {\n  return \\`In Markdown, write code like \\\\\\`this\\\\\\`\\`;\n}`\n"
  },
  {
    "path": "documentation/examples/existence.coffee",
    "content": "solipsism = true if mind? and not world?\n\nspeed = 0\nspeed ?= 15\n\nfootprints = yeti ? \"bear\"\n"
  },
  {
    "path": "documentation/examples/existence_declared.coffee",
    "content": "major = 'Computer Science'\n\nunless major?\n  signUpForClass 'Introduction to Wines'\n"
  },
  {
    "path": "documentation/examples/existence_undeclared.coffee",
    "content": "if window?\n  environment = 'browser (probably)'\n"
  },
  {
    "path": "documentation/examples/expansion.coffee",
    "content": "text = \"Every literary critic believes he will\n        outwit history and have the last word\"\n\n[first, ..., last] = text.split \" \"\n"
  },
  {
    "path": "documentation/examples/expressions.coffee",
    "content": "grade = (student) ->\n  if student.excellentWork\n    \"A+\"\n  else if student.okayStuff\n    if student.triedHard then \"B\" else \"B-\"\n  else\n    \"C\"\n\neldest = if 24 > 21 then \"Liz\" else \"Ike\"\n"
  },
  {
    "path": "documentation/examples/expressions_assignment.coffee",
    "content": "six = (one = 1) + (two = 2) + (three = 3)\n"
  },
  {
    "path": "documentation/examples/expressions_comprehension.coffee",
    "content": "# The first ten global properties.\n\nglobals = (name for name of window)[0...10]\n"
  },
  {
    "path": "documentation/examples/expressions_try.coffee",
    "content": "alert(\n  try\n    nonexistent / undefined\n  catch error\n    \"And the error is ... #{error}\"\n)\n"
  },
  {
    "path": "documentation/examples/fat_arrow.coffee",
    "content": "Account = (customer, cart) ->\n  @customer = customer\n  @cart = cart\n\n  $('.shopping_cart').on 'click', (event) =>\n    @customer.purchase @cart\n"
  },
  {
    "path": "documentation/examples/functions.coffee",
    "content": "square = (x) -> x * x\ncube   = (x) -> square(x) * x\n"
  },
  {
    "path": "documentation/examples/generator_iteration.coffee",
    "content": "fibonacci = ->\n  [previous, current] = [1, 1]\n  loop\n    [previous, current] = [current, previous + current]\n    yield current\n  return\n\ngetFibonacciNumbers = (length) ->\n  results = [1]\n  for n from fibonacci()\n    results.push n\n    break if results.length is length\n  results\n"
  },
  {
    "path": "documentation/examples/generators.coffee",
    "content": "perfectSquares = ->\n  num = 0\n  loop\n    num += 1\n    yield num * num\n  return\n\nwindow.ps or= perfectSquares()\n"
  },
  {
    "path": "documentation/examples/get_set.coffee",
    "content": "screen =\n  width: 1200\n  ratio: 16/9\n\nObject.defineProperty screen, 'height',\n  get: ->\n    this.width / this.ratio\n  set: (val) ->\n    this.width = val * this.ratio\n"
  },
  {
    "path": "documentation/examples/heredocs.coffee",
    "content": "html = \"\"\"\n       <strong>\n         cup of coffeescript\n       </strong>\n       \"\"\"\n"
  },
  {
    "path": "documentation/examples/heregexes.coffee",
    "content": "NUMBER     = ///\n  ^ 0b[01]+    |              # binary\n  ^ 0o[0-7]+   |              # octal\n  ^ 0x[\\da-f]+ |              # hex\n  ^ \\d*\\.?\\d+ (?:e[+-]?\\d+)?  # decimal\n///i\n"
  },
  {
    "path": "documentation/examples/interpolation.coffee",
    "content": "author = \"Wittgenstein\"\nquote  = \"A picture is a fact. -- #{ author }\"\n\nsentence = \"#{ 22 / 7 } is a decent approximation of π\"\n"
  },
  {
    "path": "documentation/examples/jsx.coffee",
    "content": "renderStarRating = ({ rating, maxStars }) ->\n  <aside title={\"Rating: #{rating} of #{maxStars} stars\"}>\n    {for wholeStar in [0...Math.floor(rating)]\n      <Star className=\"wholeStar\" key={wholeStar} />}\n    {if rating % 1 isnt 0\n      <Star className=\"halfStar\" />}\n    {for emptyStar in [Math.ceil(rating)...maxStars]\n      <Star className=\"emptyStar\" key={emptyStar} />}\n  </aside>\n"
  },
  {
    "path": "documentation/examples/modules.coffee",
    "content": "import './local-file.js' # Must be the filename of the generated file\nimport 'package'\n\nimport _ from 'underscore'\nimport * as underscore from 'underscore'\n\nimport { now } from 'underscore'\nimport { now as currentTimestamp } from 'underscore'\nimport { first, last } from 'underscore'\nimport utilityBelt, { each } from 'underscore'\n\nimport dates from './calendar.json' assert { type: 'json' }\n\nexport default Math\nexport square = (x) -> x * x\nexport class Mathematics\n  least: (x, y) -> if x < y then x else y\n\nexport { sqrt }\nexport { sqrt as squareRoot }\nexport { Mathematics as default, sqrt as squareRoot }\n\nexport * from 'underscore'\nexport { max, min } from 'underscore'\nexport { version } from './package.json' assert { type: 'json' }\n"
  },
  {
    "path": "documentation/examples/modulo.coffee",
    "content": "-7 % 5 == -2 # The remainder of 7 / 5\n-7 %% 5 == 3 # n %% 5 is always between 0 and 4\n\ntabs.selectTabAtIndex((tabs.currentIndex - count) %% tabs.length)\n"
  },
  {
    "path": "documentation/examples/multiple_return_values.coffee",
    "content": "weatherReport = (location) ->\n  # Make an Ajax request to fetch the weather...\n  [location, 72, \"Mostly Sunny\"]\n\n[city, temp, forecast] = weatherReport \"Berkeley, CA\"\n"
  },
  {
    "path": "documentation/examples/object_comprehensions.coffee",
    "content": "yearsOld = max: 10, ida: 9, tim: 11\n\nages = for child, age of yearsOld\n  \"#{child} is #{age}\"\n"
  },
  {
    "path": "documentation/examples/object_extraction.coffee",
    "content": "futurists =\n  sculptor: \"Umberto Boccioni\"\n  painter:  \"Vladimir Burliuk\"\n  poet:\n    name:   \"F.T. Marinetti\"\n    address: [\n      \"Via Roma 42R\"\n      \"Bellagio, Italy 22021\"\n    ]\n\n{sculptor} = futurists\n\n{poet: {name, address: [street, city]}} = futurists\n"
  },
  {
    "path": "documentation/examples/object_spread.coffee",
    "content": "user =\n  name: 'Werner Heisenberg'\n  occupation: 'theoretical physicist'\n\ncurrentUser = { user..., status: 'Uncertain' }\n"
  },
  {
    "path": "documentation/examples/objects_and_arrays.coffee",
    "content": "song = [\"do\", \"re\", \"mi\", \"fa\", \"so\"]\n\nsingers = {Jagger: \"Rock\", Elvis: \"Roll\"}\n\nbitlist = [\n  1, 0, 1\n  0, 0, 1\n  1, 1, 0\n]\n\nkids =\n  brother:\n    name: \"Max\"\n    age:  11\n  sister:\n    name: \"Ida\"\n    age:  9\n"
  },
  {
    "path": "documentation/examples/objects_reserved.coffee",
    "content": "$('.account').prop class: 'active'\n\nlog object.class\n"
  },
  {
    "path": "documentation/examples/objects_shorthand.coffee",
    "content": "name = \"Michelangelo\"\nmask = \"orange\"\nweapon = \"nunchuks\"\nturtle = {name, mask, weapon}\noutput = \"#{turtle.name} wears an #{turtle.mask} mask. Watch out for his #{turtle.weapon}!\"\n"
  },
  {
    "path": "documentation/examples/overview.coffee",
    "content": "# Assignment:\nnumber   = 42\nopposite = true\n\n# Conditions:\nnumber = -42 if opposite\n\n# Functions:\nsquare = (x) -> x * x\n\n# Arrays:\nlist = [1, 2, 3, 4, 5]\n\n# Objects:\nmath =\n  root:   Math.sqrt\n  square: square\n  cube:   (x) -> x * square x\n\n# Splats:\nrace = (winner, runners...) ->\n  print winner, runners\n\n# Existence:\nalert \"I knew it!\" if elvis?\n\n# Array comprehensions:\ncubes = (math.cube num for num in list)\n"
  },
  {
    "path": "documentation/examples/parallel_assignment.coffee",
    "content": "theBait   = 1000\ntheSwitch = 0\n\n[theBait, theSwitch] = [theSwitch, theBait]\n"
  },
  {
    "path": "documentation/examples/patterns_and_splats.coffee",
    "content": "tag = \"<impossible>\"\n\n[open, contents..., close] = tag.split(\"\")\n"
  },
  {
    "path": "documentation/examples/prototypes.coffee",
    "content": "String::dasherize = ->\n  this.replace /_/g, \"-\"\n"
  },
  {
    "path": "documentation/examples/range_comprehensions.coffee",
    "content": "countdown = (num for num in [10..1])\n"
  },
  {
    "path": "documentation/examples/scope.coffee",
    "content": "outer = 1\nchangeNumbers = ->\n  inner = -1\n  outer = 10\ninner = changeNumbers()\n"
  },
  {
    "path": "documentation/examples/slices.coffee",
    "content": "numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]\n\nstart   = numbers[0..2]\n\nmiddle  = numbers[3...-2]\n\nend     = numbers[-2..]\n\ncopy    = numbers[..]\n"
  },
  {
    "path": "documentation/examples/soaks.coffee",
    "content": "zip = lottery.drawWinner?().address?.zipcode\n"
  },
  {
    "path": "documentation/examples/splats.coffee",
    "content": "gold = silver = rest = \"unknown\"\n\nawardMedals = (first, second, others...) ->\n  gold   = first\n  silver = second\n  rest   = others\n\ncontenders = [\n  \"Michael Phelps\"\n  \"Liu Xiang\"\n  \"Yao Ming\"\n  \"Allyson Felix\"\n  \"Shawn Johnson\"\n  \"Roman Sebrle\"\n  \"Guo Jingjing\"\n  \"Tyson Gay\"\n  \"Asafa Powell\"\n  \"Usain Bolt\"\n]\n\nawardMedals contenders...\n\nalert \"\"\"\nGold: #{gold}\nSilver: #{silver}\nThe Field: #{rest.join ', '}\n\"\"\"\n"
  },
  {
    "path": "documentation/examples/splices.coffee",
    "content": "numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\nnumbers[3..6] = [-3, -4, -5, -6]\n"
  },
  {
    "path": "documentation/examples/static.coffee",
    "content": "class Teenager\n  @say: (speech) ->\n    words = speech.split ' '\n    fillers = ['uh', 'um', 'like', 'actually', 'so', 'maybe']\n    output = []\n    for word, index in words\n      output.push word\n      output.push fillers[Math.floor(Math.random() * fillers.length)] unless index is words.length - 1\n    output.join ', '\n"
  },
  {
    "path": "documentation/examples/strings.coffee",
    "content": "mobyDick = \"Call me Ishmael. Some years ago --\n  never mind how long precisely -- having little\n  or no money in my purse, and nothing particular\n  to interest me on shore, I thought I would sail\n  about a little and see the watery part of the\n  world...\"\n"
  },
  {
    "path": "documentation/examples/switch.coffee",
    "content": "switch day\n  when \"Mon\" then go work\n  when \"Tue\" then go relax\n  when \"Thu\" then go iceFishing\n  when \"Fri\", \"Sat\"\n    if day is bingoDay\n      go bingo\n      go dancing\n  when \"Sun\" then go church\n  else go work\n"
  },
  {
    "path": "documentation/examples/switch_with_no_expression.coffee",
    "content": "score = 76\ngrade = switch\n  when score < 60 then 'F'\n  when score < 70 then 'D'\n  when score < 80 then 'C'\n  when score < 90 then 'B'\n  else 'A'\n# grade == 'C'\n"
  },
  {
    "path": "documentation/examples/tagged_template_literals.coffee",
    "content": "upperCaseExpr = (textParts, expressions...) ->\n  textParts.reduce (text, textPart, i) ->\n    text + expressions[i - 1].toUpperCase() + textPart\n\ngreet = (name, adjective) ->\n  upperCaseExpr\"\"\"\n               Hi #{name}. You look #{adjective}!\n               \"\"\"\n"
  },
  {
    "path": "documentation/examples/try.coffee",
    "content": "try\n  allHellBreaksLoose()\n  catsAndDogsLivingTogether()\ncatch error\n  print error\nfinally\n  cleanUp()\n"
  },
  {
    "path": "documentation/examples/type_annotations.coffee",
    "content": "# @flow\n\n###::\ntype Obj = {\n  num: number,\n};\n###\n\nfn = (str ###: string ###, obj ###: Obj ###) ###: string ### ->\n  str + obj.num\n"
  },
  {
    "path": "documentation/examples/while.coffee",
    "content": "# Econ 101\nif this.studyingEconomics\n  buy()  while supply > demand\n  sell() until supply > demand\n\n# Nursery Rhyme\nnum = 6\nlyrics = while num -= 1\n  \"#{num} little monkeys, jumping on the bed.\n    One fell out and bumped his head.\"\n"
  },
  {
    "path": "documentation/sections/annotated_source.md",
    "content": "## Annotated Source\n\nYou can browse the CoffeeScript <%= fullVersion %> source in readable, annotated form [here](annotated-source/). You can also jump directly to a particular source file:\n\n- [Grammar Rules — src/grammar](annotated-source/grammar.html)\n- [Lexing Tokens — src/lexer](annotated-source/lexer.html)\n- [The Rewriter — src/rewriter](annotated-source/rewriter.html)\n- [The Syntax Tree — src/nodes](annotated-source/nodes.html)\n- [Lexical Scope — src/scope](annotated-source/scope.html)\n- [Helpers &amp; Utility Functions — src/helpers](annotated-source/helpers.html)\n- [The CoffeeScript Module — src/coffeescript](annotated-source/coffeescript.html)\n- [Cake &amp; Cakefiles — src/cake](annotated-source/cake.html)\n- [“coffee” Command-Line Utility — src/command](annotated-source/command.html)\n- [Option Parsing — src/optparse](annotated-source/optparse.html)\n- [Interactive REPL — src/repl](annotated-source/repl.html)\n- [Source Maps — src/sourcemap](annotated-source/sourcemap.html)\n"
  },
  {
    "path": "documentation/sections/announcing_coffeescript_2.md",
    "content": "# Announcing CoffeeScript 2\n\nWe are pleased to announce CoffeeScript 2! This new release of the CoffeeScript language and compiler aims to bring CoffeeScript into the modern JavaScript era, closing gaps in compatibility with JavaScript while preserving the clean syntax that is CoffeeScript’s hallmark. In a nutshell:\n\n- The CoffeeScript 2 compiler now translates CoffeeScript code into modern JavaScript syntax. So a CoffeeScript `=>` is now output as `=>`, a CoffeeScript `class` is now output using the `class` keyword, and so on. This means you may need to [transpile the CoffeeScript compiler’s output](../#es2015plus-output).\n- CoffeeScript 2 adds support for [async functions](../#async-functions) syntax, for the future [object destructuring](../#destructuring) syntax, and for [JSX](../#jsx). Some features, such as [modules](../#modules) (`import` and `export` statements), [`for…of`](../#generator-iteration), and [tagged template literals](../#tagged-template-literals) were backported into CoffeeScript versions 1.11 and 1.12.\n- All of the above was achieved with very few [breaking changes from 1.x](../#breaking-changes). Most current CoffeeScript projects should be able to upgrade with little or no refactoring necessary.\n\nCoffeeScript 2 was developed with two primary goals: remove any incompatibilities with modern JavaScript that might prevent CoffeeScript from being used on a project; and preserve as much backward compatibility as possible. [Install now](../#installation): `npm install -g coffeescript@2`\n\n## Modern JavaScript Output\n\nFrom the beginning, CoffeeScript has been described as being “just JavaScript.” And today, JavaScript is ES2015 (well, ES2017; also commonly known as ES6). CoffeeScript welcomes the changes in the JavaScript world and we’re happy to stop outputting circa-1999 syntax for modern features.\n\nMany new JavaScript features, such as `=>`, were informed by CoffeeScript and are one-to-one compatible, or very nearly so. This has made outputting many of CoffeeScript’s innovations into new JS syntax straightforward: not only does `=>` become `=>`, but `{ a } = obj` becomes `{ a } = obj`, `\"a#{b}c\"` becomes `` `a${b}c` `` and so on.\n\nThe following CoffeeScript features were updated in 2.0 to output using modern JavaScript syntax (or added in CoffeeScript 1.11 through 2.0, output using modern syntax):\n\n- Modules: `import`/`export`\n- Classes: `class Animal`\n- Async functions: `await someFunction()`\n- Bound/arrow functions: `=>`\n- Function default parameters: `(options = {}) ->`\n- Function splat/rest parameters: `(items...) ->`\n- Destructuring, for both arrays and objects: `[first, second] = items`, `{length} = items`\n- Object rest/spread properties: `{options..., force: yes}`, `{force, otherOptions...} = options`\n- Interpolated strings/template literals (JS backticked strings): `\"Hello, #{user}!\"`\n- Tagged template literals: `html\"<strong>coffee</strong>\"`\n- JavaScript’s `for…of` is now available as CoffeeScript’s `for…from` (we already had a `for…of`): `for n from generatorFunction()`\n\nNot all CoffeeScript features were adopted into JavaScript in 100% the same way; most notably, [default values](../#breaking-changes-default-values) in JavaScript (and also in CoffeeScript 2) are only applied when a variable is `undefined`, not `undefined` or `null` as in CoffeeScript 1; and [classes](../#breaking-changes-classes) have their own differences. See the [breaking changes](../#breaking-changes) for the fine details.\n\nIn our experience, most breaking changes are edge cases that should affect very few people, like JavaScript’s [lack of an `arguments` object inside arrow functions](../#breaking-change-fat-arrow). There seem to be two breaking changes that affect a significant number of projects:\n\n- In CoffeeScript 2, “bare” `super` (calling `super` without arguments) is now no longer allowed, and one must use `super()` or `super arguments...` instead.\n- References to `this`/`@` cannot occur before a call to `super`, per the JS spec.\n\nSee the [full details](../#breaking-changes-super-extends). Either the CoffeeScript compiler or your transpiler will throw errors for either of these cases, so updating your code is a matter of fixing each occurrence as the compiler errors on it, until your code compiles successfully.\n\n## Other Features\n\nBesides supporting new JavaScript features and outputting older CoffeeScript features in modern JS syntax, CoffeeScript 2 has added support for the following:\n\n- [JSX](../#jsx)\n- [Line comments](../#comments) are now output (in CoffeeScript 1 they were discarded)\n- Block comments are now allowed anywhere, enabling [static type annotations](../#type-annotations) using Flow’s comment-based syntax\n\nThere are many smaller improvements as well, such as to the `coffee` command-line tool. You can read all the details in the [changelog](../#changelog) for the 2.0.0 betas.\n\n## “What About …?”\n\nA few JavaScript features have been intentionally omitted from CoffeeScript. These include `let` and `const` (and `var`), named functions and the `get` and `set` keywords. These get asked about so often that we added a section to the docs called [Unsupported ECMAScript Features](../#unsupported). CoffeeScript’s lack of equivalents for these features does not affect compatibility or interoperability with JavaScript modules or libraries.\n\n## Future Compatibility\n\nBack when CoffeeScript 1 was created, ES2015 JavaScript and transpilers like [Babel](http://babeljs.io/), [Bublé](https://buble.surge.sh/) or [Traceur Compiler](https://github.com/google/traceur-compiler) were several years away. The CoffeeScript compiler itself had to do what today’s transpilers do, converting modern features like destructuring and arrow functions into equivalent lowest-common-denominator JavaScript.\n\nBut transpilers exist now, and they do their job well. With them around, there’s no need for the CoffeeScript compiler to duplicate this functionality. All the CoffeeScript compiler needs to worry about now is converting the CoffeeScript version of new syntax into the JS version of that syntax, e.g. `\"Hello, #{name}!\"` into `` `Hello, ${name}!` ``. This makes adding support for new JavaScript features much easier than before.\n\nMost features added by ECMA in recent years haven’t required any updates at all in CoffeeScript. New global objects, or new methods on global objects, don’t require any updates on CoffeeScript’s part to work. Some proposed future JS features _do_ involve new syntax, like [class fields](https://github.com/tc39/proposal-class-fields). We have adopted a policy of supporting new syntax only when it reaches Stage 4 in ECMA’s process, which means that the syntax is final and will be in the next ES release. On occasion we might support a _feature_ before it has reached Stage 4, but output it using equivalent non-experimental syntax instead of the newly-proposed syntax; that’s what’s happening in 2.0.0 for [object destructuring](../#splats), where our output uses the same polyfill that Babel uses. When the new syntax is finalized, we will update our output to use the final syntax.\n\n## Credits\n\nThe major features of 2.0.0 would not have been possible without the following people:\n\n- [@GeoffreyBooth](https://github.com/GeoffreyBooth): Organizer of the CoffeeScript 2 effort, developer for modules; arrow functions, function default parameters and function rest parameters output using ES2015 syntax; line comments output and block comments output anywhere; block embedded JavaScript via triple backticks; improved parsing of Literate CoffeeScript; and the new docs website.\n- [@connec](https://github.com/connec): Classes; destructuring; splats/rest syntax in arrays and function calls; and computed properties all output using ES2015 syntax.\n- [@GabrielRatener](https://github.com/GabrielRatener): Async functions.\n- [@xixixao](https://github.com/xixixao): JSX.\n- [@zdenko](https://github.com/zdenko): Object rest/spread properties (object destructuring).\n- [@greghuc](https://github.com/greghuc): Tagged template literals, interpolated strings output in ES2015 syntax.\n- [@atg](https://github.com/atg): ES2015 `for…of`, supported as CoffeeScript’s `for…from`.\n- [@lydell](https://github.com/lydell) and [@jashkenas](https://github.com/jashkenas): Guidance, code reviews and feedback.\n\n\nSee the full [honor roll](https://github.com/jashkenas/coffeescript/wiki/CoffeeScript-2-Honor-Roll).\n\nThanks and we hope you enjoy CoffeeScript 2!\n"
  },
  {
    "path": "documentation/sections/async_functions.md",
    "content": "## Async Functions\n\nES2017’s [async functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function) are supported through the `await` keyword. Like with generators, there's no need for an `async` keyword; an async function in CoffeeScript is simply a function that awaits.\n\nSimilar to how `yield return` forces a generator, `await return` may be used to force a function to be async.\n\n```\ncodeFor('async', true)\n```\n"
  },
  {
    "path": "documentation/sections/books.md",
    "content": "## Books\n\nThere are a number of excellent resources to help you get started with CoffeeScript, some of which are freely available online.\n\n*   [The Little Book on CoffeeScript](http://arcturo.github.io/library/coffeescript/) is a brief 5-chapter introduction to CoffeeScript, written with great clarity and precision by [Alex MacCaw](http://alexmaccaw.co.uk/).\n*   [Smooth CoffeeScript](http://autotelicum.github.io/Smooth-CoffeeScript/) is a reimagination of the excellent book [Eloquent JavaScript](http://eloquentjavascript.net/), as if it had been written in CoffeeScript instead. Covers language features as well as the functional and object oriented programming styles. By [E. Hoigaard](https://github.com/autotelicum).\n*   [CoffeeScript: Accelerated JavaScript Development](http://pragprog.com/book/tbcoffee/coffeescript) is [Trevor Burnham](http://trevorburnham.com/)’s thorough introduction to the language. By the end of the book, you’ll have built a fast-paced multiplayer word game, writing both the client-side and Node.js portions in CoffeeScript.\n*   [CoffeeScript Programming with jQuery, Rails, and Node.js](https://www.packtpub.com/web-development/coffeescript-programming-jquery-rails-and-nodejs) is a new book by Michael Erasmus that covers CoffeeScript with an eye towards real-world usage both in the browser (jQuery) and on the server-side (Rails, Node).\n*   [CoffeeScript Ristretto](https://leanpub.com/coffeescript-ristretto/read) is a deep dive into CoffeeScript’s semantics from simple functions up through closures, higher-order functions, objects, classes, combinators, and decorators. By [Reg Braithwaite](http://braythwayt.com/).\n*   [Testing with CoffeeScript](https://efendibooks.com/minibooks/testing-with-coffeescript) is a succinct and freely downloadable guide to building testable applications with CoffeeScript and Jasmine.\n*   [CoffeeScript Application Development](https://www.packtpub.com/web-development/coffeescript-application-development) from Packt, introduces CoffeeScript while walking through the process of building a demonstration web application. A [CoffeeScript Application Development Coookbook](https://www.packtpub.com/web-development/coffeescript-application-development-cookbook) with over 90 “recipes” is also available.\n*   [CoffeeScript in Action](https://www.manning.com/books/coffeescript-in-action) from Manning Publications, covers CoffeeScript syntax, composition techniques and application development.\n*   [CoffeeScript: Die Alternative zu JavaScript](https://www.dpunkt.de/buecher/4021/coffeescript.html) from dpunkt.verlag, is the first CoffeeScript book in Deutsch.\n"
  },
  {
    "path": "documentation/sections/breaking_changes.md",
    "content": "## Breaking Changes From CoffeeScript 1.x to 2\n\nCoffeeScript 2 aims to output as much idiomatic ES2015+ syntax as possible with as few breaking changes from CoffeeScript 1.x as possible. Some breaking changes, unfortunately, were unavoidable.\n"
  },
  {
    "path": "documentation/sections/breaking_changes_argument_parsing_and_shebang_lines.md",
    "content": "### Argument parsing and shebang (`#!`) lines\n\nIn CoffeeScript 1.x, `--` was required after the path and filename of the script to be run, but before any arguments passed to that script. This convention is now deprecated. So instead of:\n\n```bash\ncoffee [options] path/to/script.coffee -- [args]\n```\n\nNow you would just type:\n\n```bash\ncoffee [options] path/to/script.coffee [args]\n```\n\nThe deprecated version will still work, but it will print a warning before running the script.\n\nOn non-Windows platforms, a `.coffee` file can be made executable by adding a shebang (`#!`) line at the top of the file and marking the file as executable. For example:\n\n```coffee\n#!/usr/bin/env coffee\n\nx = 2 + 2\nconsole.log x\n```\n\nIf this were saved as `executable.coffee`, it could be made executable and run:\n\n```bash\n▶ chmod +x ./executable.coffee\n▶ ./executable.coffee\n4\n```\n\nIn CoffeeScript 1.x, this used to fail when trying to pass arguments to the script. Some users on OS X worked around the problem by using `#!/usr/bin/env coffee --` as the first line of the file. That didn’t work on Linux, however, which cannot parse shebang lines with more than a single argument. While such scripts will still run on OS X, CoffeeScript will now display a warning before compiling or evaluating files that begin with a too-long shebang line. Now that CoffeeScript 2 supports passing arguments without needing `--`, we recommend simply changing the shebang lines in such scripts to just `#!/usr/bin/env coffee`."
  },
  {
    "path": "documentation/sections/breaking_changes_bound_generator_functions.md",
    "content": "### Bound generator functions\n\nBound generator functions, a.k.a. generator arrow functions, [aren’t allowed in ECMAScript](http://stackoverflow.com/questions/27661306/can-i-use-es6s-arrow-function-syntax-with-generators-arrow-notation). You can write `function*` or `=>`, but not both. Therefore, CoffeeScript code like this:\n\n```coffee\nf = => yield this\n# Throws a compiler error\n```\n\nNeeds to be rewritten the old-fashioned way:\n\n```\ncodeFor('breaking_change_bound_generator_function')\n```\n"
  },
  {
    "path": "documentation/sections/breaking_changes_classes.md",
    "content": "### Classes are compiled to ES2015 classes\n\nES2015 classes and their methods have some restrictions beyond those on regular functions.\n\nClass constructors can’t be invoked without `new`:\n\n```coffee\n(class)()\n# Throws a TypeError at runtime\n```\n\nES2015 classes don’t allow bound (fat arrow) methods. The CoffeeScript compiler goes through some contortions to preserve support for them, but one thing that can’t be accommodated is calling a bound method before it is bound:\n\n```coffee\nclass Base\n  constructor: ->\n    @onClick()      # This works\n    clickHandler = @onClick\n    clickHandler()  # This throws a runtime error\n\nclass Component extends Base\n  onClick: =>\n    console.log 'Clicked!', @\n```\n\nClass methods can’t be used with `new` (uncommon):\n\n```coffee\nclass Namespace\n  @Klass = ->\nnew Namespace.Klass  # Throws a TypeError at runtime\n```\n\nDue to the hoisting required to compile to ES2015 classes, dynamic keys in class methods can’t use values from the executable class body unless the methods are assigned in prototype style.\n\n```coffee\nclass A\n  name = 'method'\n  \"#{name}\": ->   # This method will be named 'undefined'\n  @::[name] = ->  # This will work; assigns to `A.prototype.method`\n```\n"
  },
  {
    "path": "documentation/sections/breaking_changes_default_values.md",
    "content": "### Default values for function parameters and destructured elements\n\nPer the [ES2015 spec regarding function default parameters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Default_parameters) and [destructuring default values](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Default_values), default values are only applied when a value is missing or `undefined`. In CoffeeScript 1.x, the default value would be applied in those cases but also if the  value was `null`.\n\n```\ncodeFor('breaking_change_function_parameter_default_values', 'f(null)')\n```\n\n```\ncodeFor('breaking_change_destructuring_default_values', 'a')\n```\n"
  },
  {
    "path": "documentation/sections/breaking_changes_fat_arrow.md",
    "content": "### Bound (fat arrow) functions\n\nIn CoffeeScript 1.x, `=>` compiled to a regular `function` but with references to `this`/`@` rewritten to use the outer scope’s `this`, or with the inner function bound to the outer scope via `.bind` (hence the name “bound function”). In CoffeeScript 2, `=>` compiles to [ES2015’s `=>`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions), which behaves slightly differently. The largest difference is that in ES2015, `=>` functions lack an `arguments` object:\n\n```\ncodeFor('breaking_change_fat_arrow', 'outer(1, 2)')\n```"
  },
  {
    "path": "documentation/sections/breaking_changes_jsx_and_the_less_than_and_greater_than_operators.md",
    "content": "### JSX and the `<` and `>` operators\n\nWith the addition of [JSX](#jsx), the `<` and `>` characters serve as both the “less than” and “greater than” operators and as the delimiters for XML tags, like `<div>`. For best results, in general you should always wrap the operators in spaces to distinguish them from XML tags: `i < len`, not `i<len`. The compiler tries to be forgiving when it can be sure what you intend, but always putting spaces around the “less than” and “greater than” operators will remove ambiguity.\n"
  },
  {
    "path": "documentation/sections/breaking_changes_literate_coffeescript.md",
    "content": "### Literate CoffeeScript parsing\n\nCoffeeScript 2’s parsing of Literate CoffeeScript has been refactored to now be more careful about not treating indented lists as code blocks; but this means that all code blocks (unless they are to be interpreted as comments) must be separated by at least one blank line from lists.\n\nCode blocks should also now maintain a consistent indentation level—so an indentation of one tab (or whatever you consider to be a tab stop, like 2 spaces or 4 spaces) should be treated as your code’s “left margin,” with all code in the file relative to that column.\n\nCode blocks that you want to be part of the commentary, and not executed, must have at least one line (ideally the first line of the block) completely unindented.\n"
  },
  {
    "path": "documentation/sections/breaking_changes_super_extends.md",
    "content": "### `super` and `extends`\n\nDue to a syntax clash with `super` with accessors, “bare” `super` (the keyword `super` without parentheses) no longer compiles to a super call forwarding all arguments.\n\n```coffee\nclass B extends A\n  foo: -> super\n  # Throws a compiler error\n```\n\nArguments can be forwarded explicitly using splats:\n\n```\ncodeFor('breaking_change_super_with_arguments')\n```\n\nOr if you know that the parent function doesn’t require arguments, just call `super()`:\n\n```\ncodeFor('breaking_change_super_without_arguments')\n```\n\nCoffeeScript 1.x allowed the `extends` keyword to set up prototypal inheritance between functions, and `super` could be used manually prototype-assigned functions:\n\n```coffee\nA = ->\nB = ->\nB extends A\nB.prototype.foo = -> super arguments...\n# Last two lines each throw compiler errors in CoffeeScript 2\n```\n\nDue to the switch to ES2015 `extends` and `super`, using these keywords for prototypal functions are no longer supported. The above case could be refactored to:\n\n```\ncodeFor('breaking_change_super_in_non-class_methods_refactor_with_apply')\n```\n\nor\n\n```\ncodeFor('breaking_change_super_in_non-class_methods_refactor_with_class')\n```\n"
  },
  {
    "path": "documentation/sections/breaking_changes_super_this.md",
    "content": "### `super` and `this`\n\nIn the constructor of a derived class (a class that `extends` another class), `this` cannot be used before calling `super`:\n\n```coffee\nclass B extends A\n  constructor: -> this  # Throws a compiler error\n```\nThis also means you cannot pass a reference to `this` as an argument to `super` in the constructor of a derived class:\n\n```coffee\nclass B extends A\n  constructor: (@arg) ->\n    super @arg  # Throws a compiler error\n```\nThis is a limitation of ES2015 classes. As a workaround, assign to `this` after the `super` call:\n\n```\ncodeFor('breaking_change_super_this')\n```\n"
  },
  {
    "path": "documentation/sections/cake.md",
    "content": "## Cake, and Cakefiles\n\nCoffeeScript includes a (very) simple build system similar to [Make](http://www.gnu.org/software/make/) and [Rake](http://rake.rubyforge.org/). Naturally, it’s called Cake, and is used for the tasks that build and test the CoffeeScript language itself. Tasks are defined in a file named `Cakefile`, and can be invoked by running `cake [task]` from within the directory. To print a list of all the tasks and options, just type `cake`.\n\nTask definitions are written in CoffeeScript, so you can put arbitrary code in your Cakefile. Define a task with a name, a long description, and the function to invoke when the task is run. If your task takes a command-line option, you can define the option with short and long flags, and it will be made available in the `options` object. Here’s a task that uses the Node.js API to rebuild CoffeeScript’s parser:\n\n```\ncodeFor('cake_tasks')\n```\n\nIf you need to invoke one task before another — for example, running `build` before `test`, you can use the `invoke` function: `invoke 'build'`. Cake tasks are a minimal way to expose your CoffeeScript functions to the command line, so [don’t expect any fanciness built-in](/v<%= majorVersion %>/annotated-source/cake.html). If you need dependencies, or async callbacks, it’s best to put them in your code itself — not the cake task.\n"
  },
  {
    "path": "documentation/sections/chaining.md",
    "content": "## Chaining Function Calls\n\nLeading `.` closes all open calls, allowing for simpler chaining syntax.\n\n```\ncodeFor('chaining')\n```\n"
  },
  {
    "path": "documentation/sections/changelog/0.1.0.md",
    "content": "```\nreleaseHeader('2009-12-24', '0.1.0', '8e9d637985d2dc9b44922076ad54ffef7fa8e9c2')\n```\n\nInitial CoffeeScript release.\n"
  },
  {
    "path": "documentation/sections/changelog/0.1.1.md",
    "content": "```\nreleaseHeader('2009-12-24', '0.1.1', '0.1.0')\n```\n\nAdded `instanceof` and `typeof` as operators.\n"
  },
  {
    "path": "documentation/sections/changelog/0.1.2.md",
    "content": "```\nreleaseHeader('2009-12-24', '0.1.2', '0.1.1')\n```\n\nFixed a bug with calling `super()` through more than one level of inheritance, with the re-addition of the `extends` keyword. Added experimental [Narwhal](http://narwhaljs.org/) support (as a Tusk package), contributed by [Tom Robinson](http://blog.tlrobinson.net/), including **bin/cs** as a CoffeeScript REPL and interpreter. New `--no-wrap` option to suppress the safety function wrapper.\n"
  },
  {
    "path": "documentation/sections/changelog/0.1.3.md",
    "content": "```\nreleaseHeader('2009-12-25', '0.1.3', '0.1.2')\n```\n\nThe `coffee` command now includes `--interactive`, which launches an interactive CoffeeScript session, and `--run`, which directly compiles and executes a script. Both options depend on a working installation of Narwhal. The `aint` keyword has been replaced by `isnt`, which goes together a little smoother with `is`. Quoted strings are now allowed as identifiers within object literals: eg. `{\"5+5\": 10}`. All assignment operators now use a colon: `+:`, `-:`, `*:`, etc.\n"
  },
  {
    "path": "documentation/sections/changelog/0.1.4.md",
    "content": "```\nreleaseHeader('2009-12-25', '0.1.4', '0.1.3')\n```\n\nThe official CoffeeScript extension is now `.coffee` instead of `.cs`, which properly belongs to [C#](https://en.wikipedia.org/wiki/C_Sharp_(programming_language)). Due to popular demand, you can now also use `=` to assign. Unlike JavaScript, `=` can also be used within object literals, interchangeably with `:`. Made a grammatical fix for chained function calls like `func(1)(2)(3)(4)`. Inheritance and super no longer use `__proto__`, so they should be IE-compatible now.\n"
  },
  {
    "path": "documentation/sections/changelog/0.1.5.md",
    "content": "```\nreleaseHeader('2009-12-26', '0.1.5', '0.1.4')\n```\n\nArray slice literals and array comprehensions can now both take Ruby-style ranges to specify the start and end. JavaScript variable declaration is now pushed up to the top of the scope, making all assignment statements into expressions. You can use `\\` to escape newlines. The `coffeescript` command is now called `coffee`.\n"
  },
  {
    "path": "documentation/sections/changelog/0.1.6.md",
    "content": "```\nreleaseHeader('2009-12-27', '0.1.6', '0.1.5')\n```\n\nBugfix for running `coffee --interactive` and `--run` from outside of the CoffeeScript directory. Bugfix for nested function/if-statements.\n"
  },
  {
    "path": "documentation/sections/changelog/0.2.0.md",
    "content": "```\nreleaseHeader('2010-01-05', '0.2.0', '0.1.6')\n```\n\nMajor release. Significant whitespace. Better statement-to-expression conversion. Splats. Splice literals. Object comprehensions. Blocks. The existential operator. Many thanks to all the folks who posted issues, with special thanks to [Liam O’Connor-Davis](https://github.com/liamoc) for whitespace and expression help.\n"
  },
  {
    "path": "documentation/sections/changelog/0.2.1.md",
    "content": "```\nreleaseHeader('2010-01-05', '0.2.1', '0.2.0')\n```\n\nArguments objects are now converted into real arrays when referenced.\n"
  },
  {
    "path": "documentation/sections/changelog/0.2.2.md",
    "content": "```\nreleaseHeader('2010-01-10', '0.2.2', '0.2.1')\n```\n\nWhen performing a comprehension over an object, use `ino`, instead of `in`, which helps us generate smaller, more efficient code at compile time.\nAdded `::` as a shorthand for saying `.prototype.`\nThe “splat” symbol has been changed from a prefix asterisk `*`, to a postfix ellipsis `...`\nAdded JavaScript’s `in` operator, empty `return` statements, and empty `while` loops.\nConstructor functions that start with capital letters now include a safety check to make sure that the new instance of the object is returned.\nThe `extends` keyword now functions identically to `goog.inherits` in Google’s Closure Library.\n"
  },
  {
    "path": "documentation/sections/changelog/0.2.3.md",
    "content": "```\nreleaseHeader('2010-01-11', '0.2.3', '0.2.2')\n```\n\nAxed the unsatisfactory `ino` keyword, replacing it with `of` for object comprehensions. They now look like: `for prop, value of object`.\n"
  },
  {
    "path": "documentation/sections/changelog/0.2.4.md",
    "content": "```\nreleaseHeader('2010-01-12', '0.2.4', '0.2.3')\n```\n\nAdded ECMAScript Harmony style destructuring assignment, for dealing with extracting values from nested arrays and objects. Added indentation-sensitive heredocs for nicely formatted strings or chunks of code.\n"
  },
  {
    "path": "documentation/sections/changelog/0.2.5.md",
    "content": "```\nreleaseHeader('2010-01-13', '0.2.5', '0.2.4')\n```\n\nThe conditions in switch statements can now take multiple values at once — If any of them are true, the case will run. Added the long arrow `==>`, which defines and immediately binds a function to `this`. While loops can now be used as expressions, in the same way that comprehensions can. Splats can be used within pattern matches to soak up the rest of an array.\n"
  },
  {
    "path": "documentation/sections/changelog/0.2.6.md",
    "content": "```\nreleaseHeader('2010-01-17', '0.2.6', '0.2.5')\n```\n\nAdded Python-style chained comparisons, the conditional existence operator `?=`, and some examples from _Beautiful Code_. Bugfixes relating to statement-to-expression conversion, arguments-to-array conversion, and the TextMate syntax highlighter.\n"
  },
  {
    "path": "documentation/sections/changelog/0.3.0.md",
    "content": "```\nreleaseHeader('2010-01-26', '0.3.0', '0.2.6')\n```\n\nCoffeeScript 0.3 includes major syntax changes:\nThe function symbol was changed to `->`, and the bound function symbol is now `=>`.\nParameter lists in function definitions must now be wrapped in parentheses.\nAdded property soaking, with the `?.` operator.\nMade parentheses optional, when invoking functions with arguments.\nRemoved the obsolete block literal syntax.\n"
  },
  {
    "path": "documentation/sections/changelog/0.3.2.md",
    "content": "```\nreleaseHeader('2010-02-08', '0.3.2', '0.3.0')\n```\n\n`@property` is now a shorthand for `this.property`.\nSwitched the default JavaScript engine from Narwhal to Node.js. Pass the `--narwhal` flag if you’d like to continue using it.\n"
  },
  {
    "path": "documentation/sections/changelog/0.5.0.md",
    "content": "```\nreleaseHeader('2010-02-21', '0.5.0', '0.3.2')\n```\n\nCoffeeScript 0.5.0 is a major release, While there are no language changes, the Ruby compiler has been removed in favor of a self-hosting compiler written in pure CoffeeScript.\n"
  },
  {
    "path": "documentation/sections/changelog/0.5.1.md",
    "content": "```\nreleaseHeader('2010-02-24', '0.5.1', '0.5.0')\n```\n\nImprovements to null soaking with the existential operator, including soaks on indexed properties. Added conditions to `while` loops, so you can use them as filters with `when`, in the same manner as comprehensions.\n"
  },
  {
    "path": "documentation/sections/changelog/0.5.2.md",
    "content": "```\nreleaseHeader('2010-02-25', '0.5.2', '0.5.1')\n```\n\nAdded a compressed version of the compiler for inclusion in web pages as\n`/v<%= majorVersion %>/browser-compiler-legacy/coffeescript.js`. It’ll automatically run any script tags with type `text/coffeescript` for you. Added a `--stdio` option to the `coffee` command, for piped-in compiles.\n"
  },
  {
    "path": "documentation/sections/changelog/0.5.3.md",
    "content": "```\nreleaseHeader('2010-02-27', '0.5.3', '0.5.2')\n```\n\nCoffeeScript now has a syntax for defining classes. Many of the core components (Nodes, Lexer, Rewriter, Scope, Optparse) are using them. Cakefiles can use `optparse.coffee` to define options for tasks. `--run` is now the default flag for the `coffee` command, use `--compile` to save JavaScripts. Bugfix for an ambiguity between RegExp literals and chained divisions.\n"
  },
  {
    "path": "documentation/sections/changelog/0.5.4.md",
    "content": "```\nreleaseHeader('2010-03-03', '0.5.4', '0.5.3')\n```\n\nBugfix that corrects the Node.js global constants `__filename` and `__dirname`. Tweaks for more flexible parsing of nested function literals and improperly-indented comments. Updates for the latest Node.js API.\n"
  },
  {
    "path": "documentation/sections/changelog/0.5.5.md",
    "content": "```\nreleaseHeader('2010-03-08', '0.5.5', '0.5.4')\n```\n\nString interpolation, contributed by [Stan Angeloff](https://github.com/StanAngeloff). Since `--run` has been the default since **0.5.3**, updating `--stdio` and `--eval` to run by default, pass `--compile` as well if you’d like to print the result.\n"
  },
  {
    "path": "documentation/sections/changelog/0.5.6.md",
    "content": "```\nreleaseHeader('2010-03-23', '0.5.6', '0.5.5')\n```\n\nInterpolation can now be used within regular expressions and heredocs, as well as strings. Added the `<-` bind operator. Allowing assignment to half-expressions instead of special `||=`-style operators. The arguments object is no longer automatically converted into an array. After requiring `coffeescript`, Node.js can now directly load `.coffee` files, thanks to **registerExtension**. Multiple splats can now be used in function calls, arrays, and pattern matching.\n"
  },
  {
    "path": "documentation/sections/changelog/0.6.0.md",
    "content": "```\nreleaseHeader('2010-04-03', '0.6.0', '0.5.6')\n```\n\nTrailing commas are now allowed, a-la Python. Static properties may be assigned directly within class definitions, using `@property` notation.\n"
  },
  {
    "path": "documentation/sections/changelog/0.6.1.md",
    "content": "```\nreleaseHeader('2010-04-12', '0.6.1', '0.6.0')\n```\n\nUpgraded CoffeeScript for compatibility with the new Node.js **v0.1.90** series.\n"
  },
  {
    "path": "documentation/sections/changelog/0.6.2.md",
    "content": "```\nreleaseHeader('2010-05-15', '0.6.2', '0.6.1')\n```\n\nThe `coffee` command will now preserve directory structure when compiling a directory full of scripts. Fixed two omissions that were preventing the CoffeeScript compiler from running live within Internet Explorer. There’s now a syntax for block comments, similar in spirit to CoffeeScript’s heredocs. ECMA Harmony DRY-style pattern matching is now supported, where the name of the property is the same as the name of the value: `{name, length}: func`. Pattern matching is now allowed within comprehension variables. `unless` is now allowed in block form. `until` loops were added, as the inverse of `while` loops. `switch` statements are now allowed without switch object clauses. Compatible with Node.js **v0.1.95**.\n"
  },
  {
    "path": "documentation/sections/changelog/0.7.0.md",
    "content": "```\nreleaseHeader('2010-06-28', '0.7.0', '0.6.2')\n```\n\nOfficial CoffeeScript variable style is now camelCase, as in JavaScript. Reserved words are now allowed as object keys, and will be quoted for you. Range comprehensions now generate cleaner code, but you have to specify `by -1` if you’d like to iterate downward. Reporting of syntax errors is greatly improved from the previous release. Running `coffee` with no arguments now launches the REPL, with Readline support. The `<-` bind operator has been removed from CoffeeScript. The `loop` keyword was added, which is equivalent to a `while true` loop. Comprehensions that contain closures will now close over their variables, like the semantics of a `forEach`. You can now use bound function in class definitions (bound to the instance). For consistency, `a in b` is now an array presence check, and `a of b` is an object-key check. Comments are no longer passed through to the generated JavaScript.\n"
  },
  {
    "path": "documentation/sections/changelog/0.7.1.md",
    "content": "```\nreleaseHeader('2010-07-11', '0.7.1', '0.7.0')\n```\n\nBlock-style comments are now passed through and printed as JavaScript block comments – making them useful for licenses and copyright headers. Better support for running coffee scripts standalone via hashbangs. Improved syntax errors for tokens that are not in the grammar.\n"
  },
  {
    "path": "documentation/sections/changelog/0.7.2.md",
    "content": "```\nreleaseHeader('2010-07-12', '0.7.2', '0.7.1')\n```\n\nQuick bugfix (right after 0.7.1) for a problem that prevented `coffee` command-line options from being parsed in some circumstances.\n"
  },
  {
    "path": "documentation/sections/changelog/0.9.0.md",
    "content": "```\nreleaseHeader('2010-08-04', '0.9.0', '0.7.2')\n```\n\nThe CoffeeScript **0.9** series is considered to be a release candidate for **1.0**; let’s give her a shakedown cruise. **0.9.0** introduces a massive backwards-incompatible change: Assignment now uses `=`, and object literals use `:`, as in JavaScript. This allows us to have implicit object literals, and YAML-style object definitions. Half assignments are removed, in favor of `+=`, `or=`, and friends. Interpolation now uses a hash mark `#` instead of the dollar sign `$` — because dollar signs may be part of a valid JS identifier. Downwards range comprehensions are now safe again, and are optimized to straight for loops when created with integer endpoints. A fast, unguarded form of object comprehension was added: `for all key, value of object`. Mentioning the `super` keyword with no arguments now forwards all arguments passed to the function, as in Ruby. If you extend class `B` from parent class `A`, if `A` has an `extended` method defined, it will be called, passing in `B` — this enables static inheritance, among other things. Cleaner output for functions bound with the fat arrow. `@variables` can now be used in parameter lists, with the parameter being automatically set as a property on the object — useful in constructors and setter functions. Constructor functions can now take splats.\n"
  },
  {
    "path": "documentation/sections/changelog/0.9.1.md",
    "content": "```\nreleaseHeader('2010-08-11', '0.9.1', '0.9.0')\n```\n\nBugfix release for **0.9.1**. Greatly improves the handling of mixed implicit objects, implicit function calls, and implicit indentation. String and regex interpolation is now strictly `#{ … }` (Ruby style). The compiler now takes a `--require` flag, which specifies scripts to run before compilation.\n"
  },
  {
    "path": "documentation/sections/changelog/0.9.2.md",
    "content": "```\nreleaseHeader('2010-08-23', '0.9.2', '0.9.1')\n```\n\nSpecifying the start and end of a range literal is now optional, eg. `array[3..]`. You can now say `a not instanceof b`. Fixed important bugs with nested significant and non-significant indentation (Issue #637). Added a `--require` flag that allows you to hook into the `coffee` command. Added a custom `jsl.conf` file for our preferred JavaScriptLint setup. Sped up Jison grammar compilation time by flattening rules for operations. Block comments can now be used with JavaScript-minifier-friendly syntax. Added JavaScript’s compound assignment bitwise operators. Bugfixes to implicit object literals with leading number and string keys, as the subject of implicit calls, and as part of compound assignment.\n"
  },
  {
    "path": "documentation/sections/changelog/0.9.3.md",
    "content": "```\nreleaseHeader('2010-09-16', '0.9.3', '0.9.2')\n```\n\nCoffeeScript `switch` statements now compile into JS `switch` statements — they previously compiled into `if/else` chains for JavaScript 1.3 compatibility. Soaking a function invocation is now supported. Users of the RubyMine editor should now be able to use `--watch` mode.\n"
  },
  {
    "path": "documentation/sections/changelog/0.9.4.md",
    "content": "```\nreleaseHeader('2010-09-21', '0.9.4', '0.9.3')\n```\n\nCoffeeScript now uses appropriately-named temporary variables, and recycles their references after use. Added `require.extensions` support for **Node.js 0.3**. Loading CoffeeScript in the browser now adds just a single `CoffeeScript` object to global scope. Fixes for implicit object and block comment edge cases.\n"
  },
  {
    "path": "documentation/sections/changelog/0.9.5.md",
    "content": "```\nreleaseHeader('2010-11-21', '0.9.5', '0.9.4')\n```\n\n0.9.5 should be considered the first release candidate for CoffeeScript 1.0. There have been a large number of internal changes since the previous release, many contributed from **satyr**’s [Coco](https://github.com/satyr/coco) dialect of CoffeeScript. Heregexes (extended regexes) were added. Functions can now have default arguments. Class bodies are now executable code. Improved syntax errors for invalid CoffeeScript. `undefined` now works like `null`, and cannot be assigned a new value. There was a precedence change with respect to single-line comprehensions: `result = i for i in list`\nused to parse as `result = (i for i in list)` by default … it now parses as\n`(result = i) for i in list`.\n"
  },
  {
    "path": "documentation/sections/changelog/0.9.6.md",
    "content": "```\nreleaseHeader('2010-12-06', '0.9.6', '0.9.5')\n```\n\nThe REPL now properly formats stacktraces, and stays alive through asynchronous exceptions. Using `--watch` now prints timestamps as files are compiled. Fixed some accidentally-leaking variables within plucked closure-loops. Constructors now maintain their declaration location within a class body. Dynamic object keys were removed. Nested classes are now supported. Fixes execution context for naked splatted functions. Bugfix for inversion of chained comparisons. Chained class instantiation now works properly with splats.\n"
  },
  {
    "path": "documentation/sections/changelog/1.0.0.md",
    "content": "```\nreleaseHeader('2010-12-24', '1.0.0', '0.9.6')\n```\n\nCoffeeScript loops no longer try to preserve block scope when functions are being generated within the loop body. Instead, you can use the `do` keyword to create a convenient closure wrapper. Added a `--nodejs` flag for passing through options directly to the `node` executable. Better behavior around the use of pure statements within expressions. Fixed inclusive slicing through `-1`, for all browsers, and splicing with arbitrary expressions as endpoints.\n"
  },
  {
    "path": "documentation/sections/changelog/1.0.1.md",
    "content": "```\nreleaseHeader('2011-01-31', '1.0.1', '1.0.0')\n```\n\nFixed a lexer bug with Unicode identifiers. Updated REPL for compatibility with Node.js 0.3.7\\. Fixed requiring relative paths in the REPL. Trailing `return` and `return undefined` are now optimized away. Stopped requiring the core Node.js `util` module for back-compatibility with Node.js 0.2.5\\. Fixed a case where a conditional `return` would cause fallthrough in a `switch` statement. Optimized empty objects in destructuring assignment.\n"
  },
  {
    "path": "documentation/sections/changelog/1.1.0.md",
    "content": "```\nreleaseHeader('2011-05-01', '1.1.0', '1.0.1')\n```\n\nWhen running via the `coffee` executable, `process.argv` and friends now report `coffee` instead of `node`. Better compatibility with **Node.js 0.4.x** module lookup changes. The output in the REPL is now colorized, like Node’s is. Giving your concatenated CoffeeScripts a name when using `--join` is now mandatory. Fix for lexing compound division `/=` as a regex accidentally. All `text/coffeescript` tags should now execute in the order they’re included. Fixed an issue with extended subclasses using external constructor functions. Fixed an edge-case infinite loop in `addImplicitParentheses`. Fixed exponential slowdown with long chains of function calls. Globals no longer leak into the CoffeeScript REPL. Splatted parameters are declared local to the function.\n"
  },
  {
    "path": "documentation/sections/changelog/1.1.1.md",
    "content": "```\nreleaseHeader('2011-05-10', '1.1.1', '1.1.0')\n```\n\nBugfix release for classes with external constructor functions, see issue #1182.\n"
  },
  {
    "path": "documentation/sections/changelog/1.1.2.md",
    "content": "```\nreleaseHeader('2011-08-04', '1.1.2', '1.1.1')\n```\n\nFixes for block comment formatting, `?=` compilation, implicit calls against control structures, implicit invocation of a try/catch block, variadic arguments leaking from local scope, line numbers in syntax errors following heregexes, property access on parenthesized number literals, bound class methods and super with reserved names, a REPL overhaul, consecutive compiled semicolons, block comments in implicitly called objects, and a Chrome bug.\n"
  },
  {
    "path": "documentation/sections/changelog/1.1.3.md",
    "content": "```\nreleaseHeader('2011-11-08', '1.1.3', '1.1.2')\n```\n\n*   Ahh, whitespace. CoffeeScript’s compiled JS now tries to space things out and keep it readable, as you can see in the examples on this page.\n*   You can now call `super` in class level methods in class bodies, and bound class methods now preserve their correct context.\n*   JavaScript has always supported octal numbers `010 is 8`, and hexadecimal numbers `0xf is 15`, but CoffeeScript now also supports binary numbers: `0b10 is 2`.\n*   The CoffeeScript module has been nested under a subdirectory to make it easier to `require` individual components separately, without having to use **npm**. For example, after adding the CoffeeScript folder to your path: `require('coffeescript/lexer')`\n*   There’s a new “link” feature in Try CoffeeScript on this webpage. Use it to get a shareable permalink for your example script.\n*   The `coffee --watch` feature now only works on Node.js 0.6.0 and higher, but now also works properly on Windows.\n*   Lots of small bug fixes from **[@michaelficarra](https://github.com/michaelficarra)**, **[@geraldalewis](https://github.com/geraldalewis)**, **[@satyr](https://github.com/satyr)**, and **[@trevorburnham](https://github.com/trevorburnham)**.\n"
  },
  {
    "path": "documentation/sections/changelog/1.10.0.md",
    "content": "```\nreleaseHeader('2015-09-03', '1.10.0', '1.9.3')\n```\n\n*   CoffeeScript now supports ES2015-style destructuring defaults.\n*   `(offsetHeight: height) ->` no longer compiles. That syntax was accidental and partly broken. Use `({offsetHeight: height}) ->` instead. Object destructuring always requires braces.\n*   Several minor bug fixes, including:\n    *   A bug where the REPL would sometimes report valid code as invalid, based on what you had typed earlier.\n    *   A problem with multiple JS contexts in the jest test framework.\n    *   An error in io.js where strict mode is set on internal modules.\n    *   A variable name clash for the caught error in `catch` blocks.\n"
  },
  {
    "path": "documentation/sections/changelog/1.11.0.md",
    "content": "```\nreleaseHeader('2016-09-24', '1.11.0', '1.10.0')\n```\n\n*   CoffeeScript now supports ES2015 [`import` and `export` syntax](#modules).\n*   Added the `-M, --inline-map` flag to the compiler, allowing you embed the source map directly into the output JavaScript, rather than as a separate file.\n*   A bunch of fixes for `yield`:\n    *   `yield return` can no longer mistakenly be used as an expression.\n    *   `yield` now mirrors `return` in that it can be used stand-alone as well as with expressions. Where you previously wrote `yield undefined`, you may now write simply `yield`. However, this means also inheriting the same syntax limitations that `return` has, so these examples no longer compile:\n        ```\n        doubles = ->\n          yield for i in [1..3]\n            i * 2\n        six = ->\n          yield\n            2 * 3\n        ```\n    *   The JavaScript output is a bit nicer, with unnecessary parentheses and spaces, double indentation and double semicolons around `yield` no longer present.\n*   `&&=`, `||=`, `and=` and `or=` no longer accidentally allow a space before the equals sign.\n*   Improved several error messages.\n*   Just like `undefined` compiles to `void 0`, `NaN` now compiles into `0/0` and `Infinity` into `2e308`.\n*   Bugfix for renamed destructured parameters with defaults. `({a: b = 1}) ->` no longer crashes the compiler.\n*   Improved the internal representation of a CoffeeScript program. This is only noticeable to tools that use `CoffeeScript.tokens` or `CoffeeScript.nodes`. Such tools need to update to take account for changed or added tokens and nodes.\n*   Several minor bug fixes, including:\n    *   The caught error in `catch` blocks is no longer declared unnecessarily, and no longer mistakenly named `undefined` for `catch`-less `try` blocks.\n    *   Unassignable parameter destructuring no longer crashes the compiler.\n    *   Source maps are now used correctly for errors thrown from .coffee.md files.\n    *   `coffee -e 'throw null'` no longer crashes.\n    *   The REPL no longer crashes when using `.exit` to exit it.\n    *   Invalid JavaScript is no longer output when lots of `for` loops are used in the same scope.\n    *   A unicode issue when using stdin with the CLI.\n"
  },
  {
    "path": "documentation/sections/changelog/1.11.1.md",
    "content": "```\nreleaseHeader('2016-10-02', '1.11.1', '1.11.0')\n```\n\n*   Bugfix for shorthand object syntax after interpolated keys.\n*   Bugfix for indentation-stripping in `\"\"\"` strings.\n*   Bugfix for not being able to use the name “arguments” for a prototype property of class.\n*   Correctly compile large hexadecimal numbers literals to `2e308` (just like all other large number literals do).\n"
  },
  {
    "path": "documentation/sections/changelog/1.12.0.md",
    "content": "```\nreleaseHeader('2016-12-04', '1.12.0', '1.11.1')\n```\n\n*   CoffeeScript now supports ES2015 [tagged template literals](#tagged-template-literals). Note that using tagged template literals in your code makes you responsible for ensuring that either your runtime supports tagged template literals or that you transpile the output JavaScript further to a version your target runtime(s) support.\n*   CoffeeScript now provides a [`for…from`](#generator-iteration) syntax for outputting ES2015 [`for…of`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of). (Sorry they couldn’t match, but we came up with `for…of` first for something else.) This allows iterating over generators or any other iterable object. Note that using `for…from` in your code makes you responsible for ensuring that either your runtime supports `for…of` or that you transpile the output JavaScript further to a version your target runtime(s) support.\n*   Triple backticks (`` ```​``) allow the creation of embedded JavaScript blocks where escaping single backticks is not required, which should improve interoperability with ES2015 template literals and with Markdown.\n*   Within single-backtick embedded JavaScript, backticks can now be escaped via `` \\`​``.\n*   The browser tests now run in the browser again, and are accessible [here](/v<%= majorVersion %>/test.html) if you would like to test your browser.\n*   CoffeeScript-only keywords in ES2015 `import`s and `export`s are now ignored.\n*   The compiler now throws an error on trying to export an anonymous class.\n*   Bugfixes related to tokens and location data, for better source maps and improved compatibility with downstream tools.\n"
  },
  {
    "path": "documentation/sections/changelog/1.12.1.md",
    "content": "```\nreleaseHeader('2016-12-07', '1.12.1', '1.12.0')\n```\n\n*   You can now import a module member named `default`, e.g. `import { default } from 'lib'`. Though like in ES2015, you cannot import an entire module and name it `default` (so `import default from 'lib'` is not allowed).\n*   Fix regression where `from` as a variable name was breaking `for` loop declarations. For the record, `from` is not a reserved word in CoffeeScript; you may use it for variable names. `from` behaves like a keyword within the context of `import` and `export` statements, and in the declaration of a `for` loop; though you should also be able to use variables named `from` in those contexts, and the compiler should be able to tell the difference.\n"
  },
  {
    "path": "documentation/sections/changelog/1.12.2.md",
    "content": "```\nreleaseHeader('2016-12-16', '1.12.2', '1.12.1')\n```\n\n*   The browser compiler can once again be built unminified via `MINIFY=false cake build:browser`.\n*   The error-prone patched version of `Error.prepareStackTrace` has been removed.\n*   Command completion in the REPL (pressing tab to get suggestions) has been fixed for Node 6.9.1+.\n*   The [browser-based tests](/v<%= majorVersion %>/test.html) now include all the tests as the Node-based version.\n"
  },
  {
    "path": "documentation/sections/changelog/1.12.3.md",
    "content": "```\nreleaseHeader('2017-01-24', '1.12.3', '1.12.2')\n```\n\n*   `@` values can now be used as indices in `for` expressions. This loosens the compilation of `for` expressions to allow the index variable to be an `@` value, e.g. `do @visit for @node, @index in nodes`. Within `@visit`, the index of the current node (`@node`) would be available as `@index`.\n*   CoffeeScript’s patched `Error.prepareStackTrace` has been restored, with some revisions that should prevent the erroneous exceptions that were making life difficult for some downstream projects. This fixes the incorrect line numbers in stack traces since 1.12.2.\n*   The `//=` operator’s output now wraps parentheses around the right operand, like the other assignment operators.\n"
  },
  {
    "path": "documentation/sections/changelog/1.12.4.md",
    "content": "```\nreleaseHeader('2017-02-18', '1.12.4', '1.12.3')\n```\n\n*   The `cake` commands have been updated, with new `watch` options for most tasks. Clone the [CoffeeScript repo](https://github.com/jashkenas/coffeescript) and run `cake` at the root of the repo to see the options.\n*   Fixed a bug where `export`ing a referenced variable was preventing the variable from being declared.\n*   Fixed a bug where the `coffee` command wasn’t working for a `.litcoffee` file.\n*   Bugfixes related to tokens and location data, for better source maps and improved compatibility with downstream tools.\n"
  },
  {
    "path": "documentation/sections/changelog/1.12.5.md",
    "content": "```\nreleaseHeader('2017-04-10', '1.12.5', '1.12.4')\n```\n\n*   Better handling of `default`, `from`, `as` and `*` within `import` and `export` statements. You can now import or export a member named `default` and the compiler won’t interpret it as the `default` keyword.\n*   Fixed a bug where invalid octal escape sequences weren’t throwing errors in the compiler.\n"
  },
  {
    "path": "documentation/sections/changelog/1.12.6.md",
    "content": "```\nreleaseHeader('2017-05-15', '1.12.6', '1.12.5')\n```\n\n*   The `return` and `export` keywords can now accept implicit objects (defined by indentation, without needing braces).\n*   Support Unicode code point escapes (e.g. `\\u{1F4A9}`).\n*   The `coffee` command now first looks to see if CoffeeScript is installed under `node_modules` in the current folder, and executes the `coffee` binary there if so; or otherwise it runs the globally installed one. This allows you to have one version of CoffeeScript installed globally and a different one installed locally for a particular project. (Likewise for the `cake` command.)\n*   Bugfixes for chained function calls not closing implicit objects or ternaries.\n*   Bugfixes for incorrect code generated by the `?` operator within a termary `if` statement.\n*   Fixed some tests, and failing tests now result in a nonzero exit code.\n"
  },
  {
    "path": "documentation/sections/changelog/1.12.7.md",
    "content": "```\nreleaseHeader('2017-07-16', '1.12.7', '1.12.6')\n```\n\n*   Fix regressions in 1.12.6 related to chained function calls and indented `return` and `throw` arguments.\n*   The REPL no longer warns about assigning to `_`.\n"
  },
  {
    "path": "documentation/sections/changelog/1.2.0.md",
    "content": "```\nreleaseHeader('2011-12-18', '1.2.0', '1.1.3')\n```\n\n*   Multiple improvements to `coffee --watch` and `--join`. You may now use both together, as well as add and remove files and directories within a `--watch`’d folder.\n*   The `throw` statement can now be used as part of an expression.\n*   Block comments at the top of the file will now appear outside of the safety closure wrapper.\n*   Fixed a number of minor 1.1.3 regressions having to do with trailing operators and unfinished lines, and a more major 1.1.3 regression that caused bound functions _within_ bound class functions to have the incorrect `this`.\n"
  },
  {
    "path": "documentation/sections/changelog/1.3.1.md",
    "content": "```\nreleaseHeader('2012-04-10', '1.3.1', '1.2.0')\n```\n\n*   CoffeeScript now enforces all of JavaScript’s **Strict Mode** early syntax errors at compile time. This includes old-style octal literals, duplicate property names in object literals, duplicate parameters in a function definition, deleting naked variables, setting the value of `eval` or `arguments`, and more. See a full discussion at [#1547](https://github.com/jashkenas/coffeescript/issues/1547).\n*   The REPL now has a handy new multi-line mode for entering large blocks of code. It’s useful when copy-and-pasting examples into the REPL. Enter multi-line mode with `Ctrl-V`. You may also now pipe input directly into the REPL.\n*   CoffeeScript now prints a `Generated by CoffeeScript VERSION` header at the top of each compiled file.\n*   Conditional assignment of previously undefined variables `a or= b` is now considered a syntax error.\n*   A tweak to the semantics of `do`, which can now be used to more easily simulate a namespace: `do (x = 1, y = 2) -> …`\n*   Loop indices are now mutable within a loop iteration, and immutable between them.\n*   Both endpoints of a slice are now allowed to be omitted for consistency, effectively creating a shallow copy of the list.\n*   Additional tweaks and improvements to `coffee --watch` under Node’s “new” file watching API. Watch will now beep by default if you introduce a syntax error into a watched script. We also now ignore hidden directories by default when watching recursively.\n"
  },
  {
    "path": "documentation/sections/changelog/1.3.3.md",
    "content": "```\nreleaseHeader('2012-05-15', '1.3.3', '1.3.1')\n```\n\n*   Due to the new semantics of JavaScript’s strict mode, CoffeeScript no longer guarantees that constructor functions have names in all runtimes. See [#2052](https://github.com/jashkenas/coffeescript/issues/2052) for discussion.\n*   Inside of a nested function inside of an instance method, it’s now possible to call `super` more reliably (walks recursively up).\n*   Named loop variables no longer have different scoping heuristics than other local variables. (Reverts #643)\n*   Fix for splats nested within the LHS of destructuring assignment.\n*   Corrections to our compile time strict mode forbidding of octal literals.\n"
  },
  {
    "path": "documentation/sections/changelog/1.4.0.md",
    "content": "```\nreleaseHeader('2012-10-23', '1.4.0', '1.3.3')\n```\n\n*   The CoffeeScript compiler now strips Microsoft’s UTF-8 BOM if it exists, allowing you to compile BOM-borked source files.\n*   Fix Node/compiler deprecation warnings by removing `registerExtension`, and moving from `path.exists` to `fs.exists`.\n*   Small tweaks to splat compilation, backticks, slicing, and the error for duplicate keys in object literals.\n"
  },
  {
    "path": "documentation/sections/changelog/1.5.0.md",
    "content": "```\nreleaseHeader('2013-02-25', '1.5.0', '1.4.0')\n```\n\n*   First release of [Literate CoffeeScript](#literate).\n*   The CoffeeScript REPL is now based on the Node.js REPL, and should work better and more familiarly.\n*   Returning explicit values from constructors is now forbidden. If you want to return an arbitrary value, use a function, not a constructor.\n*   You can now loop over an array backwards, without having to manually deal with the indexes: `for item in list by -1`\n*   Source locations are now preserved in the CoffeeScript AST, although source maps are not yet being emitted.\n"
  },
  {
    "path": "documentation/sections/changelog/1.6.1.md",
    "content": "```\nreleaseHeader('2013-03-05', '1.6.1', '1.5.0')\n```\n\n*   First release of [source maps](#source-maps). Pass the `--map` flag to the compiler, and off you go. Direct all your thanks over to [Jason Walton](https://github.com/jwalton).\n*   Fixed a 1.5.0 regression with multiple implicit calls against an indented implicit object. Combinations of implicit function calls and implicit objects should generally be parsed better now — but it still isn’t good _style_ to nest them too heavily.\n*   `.coffee.md` is now also supported as a Literate CoffeeScript file extension, for existing tooling. `.litcoffee` remains the canonical one.\n*   Several minor fixes surrounding member properties, bound methods and `super` in class declarations.\n"
  },
  {
    "path": "documentation/sections/changelog/1.6.2.md",
    "content": "```\nreleaseHeader('2013-03-18', '1.6.2', '1.6.1')\n```\n\n*   Source maps have been used to provide automatic line-mapping when running CoffeeScript directly via the `coffee` command, and for automatic line-mapping when running CoffeeScript directly in the browser. Also, to provide better error messages for semantic errors thrown by the compiler — [with colors, even](http://cl.ly/NdOA).\n*   Improved support for mixed literate/vanilla-style CoffeeScript projects, and generating source maps for both at the same time.\n*   Fixes for **1.6.x** regressions with overriding inherited bound functions, and for Windows file path management.\n*   The `coffee` command can now correctly `fork()` both `.coffee` and `.js` files. (Requires Node.js 0.9+)\n"
  },
  {
    "path": "documentation/sections/changelog/1.6.3.md",
    "content": "```\nreleaseHeader('2013-06-02', '1.6.3', '1.6.2')\n```\n\n*   The CoffeeScript REPL now remembers your history between sessions. Just like a proper REPL should.\n*   You can now use `require` in Node to load `.coffee.md` Literate CoffeeScript files. In the browser, `text/literate-coffeescript` script tags.\n*   The old `coffee --lint` command has been removed. It was useful while originally working on the compiler, but has been surpassed by JSHint. You may now use `-l` to pass literate files in over **stdio**.\n*   Bugfixes for Windows path separators, `catch` without naming the error, and executable-class-bodies-with- prototypal-property-attachment.\n"
  },
  {
    "path": "documentation/sections/changelog/1.7.0.md",
    "content": "```\nreleaseHeader('2014-01-28', '1.7.0', '1.6.3')\n```\n\n*   When requiring CoffeeScript files in Node you must now explicitly register the compiler. This can be done with `require 'coffeescript/register'` or `CoffeeScript.register()`. Also for configuration such as Mocha’s, use **coffeescript/register**.\n*   Improved error messages, source maps and stack traces. Source maps now use the updated `//#` syntax.\n*   Leading `.` now closes all open calls, allowing for simpler chaining syntax.\n*   Added `**`, `//` and `%%` operators and `...` expansion in parameter lists and destructuring expressions.\n*   Multiline strings are now joined by a single space and ignore all indentation. A backslash at the end of a line can denote the amount of whitespace between lines, in both strings and heredocs. Backslashes correctly escape whitespace in block regexes.\n*   Closing brackets can now be indented and therefore no longer cause unexpected error.\n*   Several breaking compilation fixes. Non-callable literals (strings, numbers etc.) don’t compile in a call now and multiple postfix conditionals compile properly. Postfix conditionals and loops always bind object literals. Conditional assignment compiles properly in subexpressions. `super` is disallowed outside of methods and works correctly inside `for` loops.\n*   Formatting of compiled block comments has been improved.\n*   No more `-p` folders on Windows.\n*   The `options` object passed to CoffeeScript is no longer mutated.\n"
  },
  {
    "path": "documentation/sections/changelog/1.7.1.md",
    "content": "```\nreleaseHeader('2014-01-29', '1.7.1', '1.7.0')\n```\n\n*   Fixed a typo that broke node module lookup when running a script directly with the `coffee` binary.\n"
  },
  {
    "path": "documentation/sections/changelog/1.8.0.md",
    "content": "```\nreleaseHeader('2014-08-26', '1.8.0', '1.7.1')\n```\n\n*   The `--join` option of the CLI is now deprecated.\n*   Source maps now use `.js.map` as file extension, instead of just `.map`.\n*   The CLI now exits with the exit code 1 when it fails to write a file to disk.\n*   The compiler no longer crashes on unterminated, single-quoted strings.\n*   Fixed location data for string interpolations, which made source maps out of sync.\n*   The error marker in error messages is now correctly positioned if the code is indented with tabs.\n*   Fixed a slight formatting error in CoffeeScript’s source map-patched stack traces.\n*   The `%%` operator now coerces its right operand only once.\n*   It is now possible to require CoffeeScript files from Cakefiles without having to register the compiler first.\n*   The CoffeeScript REPL is now exported and can be required using `require 'coffeescript/repl'`.\n*   Fixes for the REPL in Node 0.11.\n"
  },
  {
    "path": "documentation/sections/changelog/1.9.0.md",
    "content": "```\nreleaseHeader('2015-01-29', '1.9.0', '1.8.0')\n```\n\n*   CoffeeScript now supports ES2015 generators. A generator is simply a function that `yield`s.\n*   More robust parsing and improved error messages for strings and regexes — especially with respect to interpolation.\n*   Changed strategy for the generation of internal compiler variable names. Note that this means that `@example` function parameters are no longer available as naked `example` variables within the function body.\n*   Fixed REPL compatibility with latest versions of Node and Io.js.\n*   Various minor bug fixes.\n"
  },
  {
    "path": "documentation/sections/changelog/1.9.1.md",
    "content": "```\nreleaseHeader('2015-02-18', '1.9.1', '1.9.0')\n```\n\n*   Interpolation now works in object literal keys (again). You can use this to dynamically name properties.\n*   Internal compiler variable names no longer start with underscores. This makes the generated JavaScript a bit prettier, and also fixes an issue with the completely broken and ungodly way that AngularJS “parses” function arguments.\n*   Fixed a few `yield`-related edge cases with `yield return` and `yield throw`.\n*   Minor bug fixes and various improvements to compiler error messages.\n"
  },
  {
    "path": "documentation/sections/changelog/1.9.2.md",
    "content": "```\nreleaseHeader('2015-04-15', '1.9.2', '1.9.1')\n```\n\n*   Fixed a **watch** mode error introduced in 1.9.1 when compiling multiple files with the same filename.\n*   Bugfix for `yield` around expressions containing `this`.\n*   Added a Ruby-style `-r` option to the REPL, which allows requiring a module before execution with `--eval` or `--interactive`.\n*   In `<script type=\"text/coffeescript\">` tags, to avoid possible duplicate browser requests for .coffee files, you can now use the `data-src` attribute instead of `src`.\n*   Minor bug fixes for IE8, strict ES5 regular expressions and Browserify.\n"
  },
  {
    "path": "documentation/sections/changelog/1.9.3.md",
    "content": "```\nreleaseHeader('2015-05-27', '1.9.3', '1.9.2')\n```\n\n*   Bugfix for interpolation in the first key of an object literal in an implicit call.\n*   Fixed broken error messages in the REPL, as well as a few minor bugs with the REPL.\n*   Fixed source mappings for tokens at the beginning of lines when compiling with the `--bare` option. This has the nice side effect of generating smaller source maps.\n*   Slight formatting improvement of compiled block comments.\n*   Better error messages for `on`, `off`, `yes` and `no`.\n"
  },
  {
    "path": "documentation/sections/changelog/2.0.0-alpha1.md",
    "content": "```\nreleaseHeader('2017-02-21', '2.0.0-alpha1', '1.12.4')\n```\n\n*   Initial alpha release of CoffeeScript 2. The CoffeeScript compiler now outputs ES2015+ syntax whenever possible. See [breaking changes](#breaking-changes).\n*   Classes are output using ES2015 `class` and `extends` keywords.\n*   Added support for `async`/`await`.\n*   Bound (arrow) functions now output as `=>` functions.\n*   Function parameters with default values now use ES2015 default values syntax.\n*   Splat function parameters now use ES2015 spread syntax.\n*   Computed properties now use ES2015 syntax.\n*   Interpolated strings (template literals) now use ES2015 backtick syntax.\n*   Improved support for recognizing Markdown in Literate CoffeeScript files.\n*   Mixing tabs and spaces in indentation is now disallowed.\n*   Browser compiler is now minified using the Google Closure Compiler (JavaScript version).\n*   Node 7+ required for CoffeeScript 2.\n"
  },
  {
    "path": "documentation/sections/changelog/2.0.0-beta1.md",
    "content": "```\nreleaseHeader('2017-04-14', '2.0.0-beta1', '2.0.0-alpha1')\n```\n\n*   Initial beta release of CoffeeScript 2. No further breaking changes are anticipated.\n*   Destructured objects and arrays now output using ES2015+ syntax whenever possible.\n*   Literate CoffeeScript now has much better support for parsing Markdown, thanks to using [Markdown-It](https://github.com/markdown-it/markdown-it) to detect Markdown sections rather than just looking at indentation.\n*   Calling a function named `get` or `set` now requires parentheses, to disambiguate from the `get` or `set` keywords (which are [disallowed](#unsupported-get-set)).\n*   The compiler now requires Node 7.6+, the first version of Node to support asynchronous functions without requiring a flag.\n"
  },
  {
    "path": "documentation/sections/changelog/2.0.0-beta2.md",
    "content": "```\nreleaseHeader('2017-05-16', '2.0.0-beta2', '2.0.0-beta1')\n```\n\n*   This release includes [all the changes from 1.12.5 to 1.12.6](#1.12.6).\n*   Bound (fat arrow) methods in classes must be declared in the class constructor, after `super()` if the class is extending a parent class. See [breaking changes for classes](#breaking-changes-classes).\n*   All unnecessary utility helper functions have been removed, including the polyfills for `indexOf` and `bind`.\n*   The `extends` keyword now only works in the context of classes; it cannot be used to extend a function prototype. See [breaking changes for `extends`](#breaking-changes-super-extends).\n*   Literate CoffeeScript is now parsed entirely based on indentation, similar to the 1.x implementation; there is no longer a dependency for parsing Markdown. See [breaking changes for Literate CoffeeScript parsing](#breaking-changes-literate-coffeescript).\n*   JavaScript reserved words used as properties are no longer wrapped in quotes.\n*   `require('coffeescript')` should now work in non-Node environments such as the builds created by Webpack or Browserify. This provides a more convenient way to include the browser compiler in builds intending to run in a browser environment.\n*   Unreachable `break` statements are no longer added after `switch` cases that `throw` exceptions.\n*   The browser compiler is now compiled using Babili and transpiled down to Babel’s `env` preset (should be safe for use in all browsers in current use, not just evergreen versions).\n*   Calling functions `@get` or `@set` no longer throws an error about required parentheses. (Bare `get` or `set`, not attached to an object or `@`, [still intentionally throws a compiler error](#unsupported-get-set).)\n*   If `$XDG_CACHE_HOME` is set, the REPL `.coffee_history` file is saved there.\n"
  },
  {
    "path": "documentation/sections/changelog/2.0.0-beta3.md",
    "content": "```\nreleaseHeader('2017-06-30', '2.0.0-beta3', '2.0.0-beta2')\n```\n\n*   [JSX](#jsx) is now supported.\n*   [Object rest/spread properties](#object-spread) are now supported.\n*   Bound (fat arrow) methods are once again supported in classes; though an error will be thrown if you attempt to call the method before it is bound. See [breaking changes for classes](#breaking-changes-classes).\n*   The REPL no longer warns about assigning to `_`.\n*   Bugfixes for destructured nested default values and issues related to chaining or continuing expressions across multiple lines.\n"
  },
  {
    "path": "documentation/sections/changelog/2.0.0-beta4.md",
    "content": "```\nreleaseHeader('2017-08-03', '2.0.0-beta4', '2.0.0-beta3')\n```\n\n*   This release includes [all the changes from 1.12.6 to 1.12.7](#1.12.7).\n*   [Line comments](#comments) (starting with `#`) are now output in the generated JavaScript.\n*   [Block comments](#comments) (delimited by `###`) are now allowed anywhere, including inline where they previously weren’t possible. This provides support for [static type annotations](#type-annotations) using Flow’s comments-based syntax.\n*   Spread syntax (`...` for objects) is now supported in JSX tags: `<div {props...} />`.\n*   Argument parsing for scripts run via `coffee` is improved. See [breaking changes](#breaking-changes-argument-parsing-and-shebang-lines).\n*   CLI: Propagate `SIGINT` and `SIGTERM` signals when node is forked.\n*   `await` in the REPL is now allowed without requiring a wrapper function.\n*   `do super` is now allowed, and other accesses of `super` like `super.x.y` or `super['x'].y` now work.\n*   Splat/spread syntax triple dots are now allowed on either the left or the right (so `props...` or `...props` are both valid).\n*   Tagged template literals are recognized as callable functions.\n*   Bugfixes for object spread syntax in nested properties.\n*   Bugfixes for destructured function parameter default values.\n"
  },
  {
    "path": "documentation/sections/changelog/2.0.0-beta5.md",
    "content": "```\nreleaseHeader('2017-09-02', '2.0.0-beta5', '2.0.0-beta4')\n```\n\n*   Node 6 is now supported, and we will try to maintain that as the minimum required version for CoffeeScript 2 via the `coffee` command or Node API. Older versions of Node, or non-evergreen browsers, can compile via the [legacy browser compiler](./browser-compiler-legacy/coffeescript.js).\n*   The command line `--output` flag now allows you to specify an output filename, not just an output folder.\n*   The command line `--require` flag now properly handles filenames or module names that are invalid identifiers (like an NPM module with a hyphen in the name).\n*   `Object.assign`, output when object destructuring is used, is polyfilled using the same polyfill that Babel outputs. This means that polyfills shouldn’t be required unless support for Internet Explorer 8 or below is desired (or your own code uses a feature that requires a polyfill). See [ES2015+ Output](#es2015plus-output).\n*   A string or JSX interpolation that contains only a comment (`\"a#{### comment ###}b\"` or `<div>{### comment ###}</div>`) is now output (`` `a${/* comment */}b` ``)\n*   Interpolated strings (ES2015 template literals) that contain quotation marks no longer have the quotation marks escaped: `` `say \"${message}\"` ``\n*   It is now possible to chain after a function literal (for example, to define a function and then call `.call` on it).\n*   The results of the async tests are included in the output when you run `cake test`.\n*   Bugfixes for object destructuring; expansions in function parameters; generated reference variables in function parameters; chained functions after `do`; splats after existential operator soaks in arrays (`[a?.b...]`); trailing `if` with splat in arrays or function parameters (`[a if b...]`); attempting to `throw` an `if`, `for`, `switch`, `while` or other invalid construct.\n*   Bugfixes for syntactical edge cases: semicolons after `=` and other “mid-expression” tokens; spaces after `::`; and scripts that begin with `:` or `*`.\n*   Bugfixes for source maps generated via the Node API; and stack trace line numbers when compiling CoffeeScript via the Node API from within a `.coffee` file.\n"
  },
  {
    "path": "documentation/sections/changelog/2.0.0.md",
    "content": "```\nreleaseHeader('2017-09-18', '2.0.0', '2.0.0-beta5')\n```\n\n*   Added `--transpile` flag or `transpile` Node API option to tell the CoffeeScript compiler to pipe its output through Babel before saving or returning it; see [Transpilation](#transpilation). Also changed the `-t` short flag to refer to `--transpile` instead of `--tokens`.\n*   Always populate source maps’ `sourcesContent` property.\n*   Bugfixes for destructuring and for comments in JSX.\n*   _Note that these are only the changes between 2.0.0-beta5 and 2.0.0. See below for all changes since 1.x._\n"
  },
  {
    "path": "documentation/sections/changelog/2.0.1.md",
    "content": "```\nreleaseHeader('2017-09-26', '2.0.1', '2.0.0')\n```\n\n*   `babel-core` is no longer listed in `package.json`, even as an `optionalDependency`, to avoid it being automatically installed for most users. If you wish to use `--transpile`, simply install `babel-core` manually. See [Transpilation](#transpilation).\n*   `--transpile` now relies on Babel to find its options, i.e. the `.babelrc` file in the path of the file(s) being compiled. (Previously the CoffeeScript compiler was duplicating this logic, so nothing has changed from a user’s perspective.) This provides automatic support for additional ways to pass options to Babel in future versions, such as the `.babelrc.js` file coming in Babel 7.\n*   Backticked expressions in a class body, outside any class methods, are now output in the JavaScript class body itself. This allows for passing through experimental JavaScript syntax like the [class fields proposal](https://github.com/tc39/proposal-class-fields), assuming your [transpiler supports it](https://babeljs.io/docs/plugins/transform-class-properties/).\n"
  },
  {
    "path": "documentation/sections/changelog/2.0.2.md",
    "content": "```\nreleaseHeader('2017-10-26', '2.0.2', '2.0.1')\n```\n\n*   `--transpile` now also applies to `require`d or `import`ed CoffeeScript files.\n*   `--transpile` can be used with the REPL: `coffee --interactive --transpile`.\n*   Improvements to comments output that should now cover all of the [Flow comment-based syntax](https://flow.org/en/docs/types/comments/). Inline `###` comments near [variable](https://flow.org/en/docs/types/variables/) initial assignments are now output in the variable declaration statement, and `###` comments near a [class and method names](https://flow.org/en/docs/types/generics/) are now output where Flow expects them.\n*   Importing CoffeeScript keywords is now allowed, so long as they’re aliased: `import { and as andFn } from 'lib'`. (You could also do `import lib from 'lib'` and then reference `lib.and`.)\n*   Calls to functions named `get` and `set` no longer throw an error when given a bracketless object literal as an argument: `obj.set propertyName: propertyValue`.\n*   In the constructor of a derived class (a class that `extends` another class), you cannot call `super` with an argument that references `this`: `class Child extends Parent then constructor: (@arg) -> super(@arg)`. This isn’t allowed in JavaScript, and now the CoffeeScript compiler will throw an error. Instead, assign to `this` after calling `super`: `(arg) -> super(arg); @arg = arg`.\n*   Bugfix for incorrect output when backticked statements and hoisted expressions were both in the same class body. This allows a backticked line like `` `field = 3` ``, for people using the experimental [class fields](https://github.com/tc39/proposal-class-fields) syntax, in the same class along with traditional class body expressions like `prop: 3` that CoffeeScript outputs as part of the class prototype.\n*   Bugfix for comments not output before a complex `?` operation, e.g. `@a ? b`.\n*   All tests now pass in Windows.\n"
  },
  {
    "path": "documentation/sections/changelog/2.0.3.md",
    "content": "```\nreleaseHeader('2017-11-26', '2.0.3', '2.0.2')\n```\n\n*   Bugfix for `export default` followed by an implicit object that contains an explicit object, for example `exportedMember: { obj... }`.\n*   Bugfix for `key, val of obj` after an implicit object member, e.g. `foo: bar for key, val of obj`.\n*   Bugfix for combining array and object destructuring, e.g. `[ ..., {a, b} ] = arr`.\n*   Bugfix for an edge case where it was possible to create a bound (`=>`) generator function, which should throw an error as such functions aren’t allowed in ES2015.\n*   Bugfix for source maps: `.map` files should always have the same base filename as the requested output filename. So `coffee --map --output foo.js test.coffee` should generate `foo.js` and `foo.js.map`.\n*   Bugfix for incorrect source maps generated when using `--transpile` with `--map` for multiple input files.\n*   Bugfix for comments at the beginning or end of input into the REPL (`coffee --interactive`).\n"
  },
  {
    "path": "documentation/sections/changelog/2.1.0.md",
    "content": "```\nreleaseHeader('2017-12-10', '2.1.0', '2.0.3')\n```\n\n*   Computed property keys in object literals are now supported: `obj = { ['key' + i]: 42 }`, or `obj = [Symbol.iterator]: -> yield i++`.\n*   Skipping of array elements, a.k.a. elision, is now supported: `arr = [a, , b]`, or `[, protocol] = url.match /^(.*):\\/\\//`.\n*   [JSX fragments syntax](https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html) is now supported.\n*   Bugfix where `///` within a `#` line comment inside a `///` block regex was erroneously closing the regex, rather than being treated as part of the comment.\n*   Bugfix for incorrect output for object rest destructuring inside array destructuring.\n"
  },
  {
    "path": "documentation/sections/changelog/2.1.1.md",
    "content": "```\nreleaseHeader('2017-12-29', '2.1.1', '2.1.0')\n```\n\n*   Bugfix to set the correct context for executable class bodies. So in `class @B extends @A then @property = 1`, the `@` in `@property` now refers to the class, not the global object.\n*   Bugfix where anonymous classes were getting created using the same automatic variable name. They now each receive unique names, so as not to override each other.\n"
  },
  {
    "path": "documentation/sections/changelog/2.2.0.md",
    "content": "```\nreleaseHeader('2018-02-01', '2.2.0', '2.1.1')\n```\n\n*   This release fixes *all* currently open bugs, dating as far back as 2014, 2012 and 2011.\n*   **Potential breaking change:** An inline `if` or `switch` statement with an ambiguous `else`, such as `if no then if yes then alert 1 else alert 2`, now compiles where the `else` always corresponds to the closest open `then`. Previously the behavior of an ambiguous `else` was unpredictable. If your code has any `if … then` or `switch … then` statements with multiple `then`s (and one or more `else`s) the compiled output might be different now, unless you had resolved ambiguity via parentheses. We made this change because the previous behavior was inconsistent and basically a bug: depending on what grammar was where, for example if there was an inline function or something that implied a block, the `else` might bind to an earlier `then` rather than a later `then`. Now an `else` essentially closes a block opened by a `then`, similar to closing an open parenthesis.\n*   When a required `then` is missing, the error more accurately points out the location of the mistake.\n*   An error is thrown when the `coffee` command is run in an environment that doesn’t support some ES2015 JavaScript features that the CoffeeScript compiler itself requires. This can happen if CoffeeScript is installed in Node older than version 6.\n*   Destructuring with a non-final splat/spread, e.g. `[open, contents..., close] = tag.split('')` is now output using ES2015 rest syntax.\n*   Functions named `get` or `set` can be used without parentheses in more cases, including when attached to `this` or `@` or `?.`; or when the first argument is an implicit object, e.g. `@set key: 'val'`.\n*   Statements such as `break` can now be used inside parentheses, e.g. `(doSomething(); break) while condition` or `(pick(key); break) for key of obj`.\n*   Bugfix for assigning to a property attached to `this`/`@` in destructuring, e.g. `({@prop = yes, @otherProp = no}) ->`.\n*   Bugfix for incorrect errors being thrown about calling `super` with a parameter attached to `this` when said parameter is in a lower scope, e.g. `class Child extends Parent then constructor: -> super(-> @prop)`.\n*   Bugfix to prevent a possible infinite loop when a `for` loop is given a variable to step by, e.g. `for x in [1..3] by step` (as opposed to `by 0.5` or some other primitive numeric value).\n*   Bugfix to no longer declare iterator variables twice when evaluating a range, e.g. `end = 3; fn [0..end]`.\n*   Bugfix for incorrect scope of variables in chained calls, e.g. `start(x = 3).then(-> x = 4)`.\n*   Bugfix for incorrect scope of variables in a function passed to `do`, e.g. `for [1..3] then masked = 10; do -> alert masked`.\n*   Bugfix to no longer throw a syntax error for a trailing comma in a function call, e.g. `fn arg1, arg2,`.\n*   Bugfix for an expression in a property access, e.g. `a[!b in c..]`.\n*   Bugfix to allow a line continuation backslash (`\\`) at any point in a `for` line.\n"
  },
  {
    "path": "documentation/sections/changelog/2.2.1.md",
    "content": "```\nreleaseHeader('2018-02-06', '2.2.1', '2.2.0')\n```\n\n*   Bugfix for regression in 2.2.0 involving an error thrown by the compiler in certain cases when using destructuring with a splat or expansion in an array.\n*   Bugfix for regression in 2.2.0 where in certain cases a range iterator variable was declared in the global scope.\n"
  },
  {
    "path": "documentation/sections/changelog/2.2.2.md",
    "content": "```\nreleaseHeader('2018-02-21', '2.2.2', '2.2.1')\n```\n\n*   Bugfix for regression in 2.2.0 where a range with a `by` (step) value that increments or decrements in the opposite direction as the range was returning an array containing the first value of the range, whereas it should be returning an empty array. In other words, `x for x in [2..1] by 1` should equal `[]`, not `[2]` (because the step value is positive 1, counting up, whereas the range goes from 2 to 1, counting down).\n*   Bugfixes for allowing backslashes in `import` and `export` statements and lines that trigger the start of an indented block, like an `if` statement.\n"
  },
  {
    "path": "documentation/sections/changelog/2.2.3.md",
    "content": "```\nreleaseHeader('2018-03-11', '2.2.3', '2.2.2')\n```\n\n*   Bugfix for object destructuring with an empty array as a key’s value: `{ key: [] } = obj`.\n*   Bugfix for array destructuring onto targets attached to `this`: `[ @most... , @penultimate, @last ] = arr`.\n"
  },
  {
    "path": "documentation/sections/changelog/2.2.4.md",
    "content": "```\nreleaseHeader('2018-03-29', '2.2.4', '2.2.3')\n```\n\n*   When the `by` value in a `for` loop is a literal number, e.g. `for x in [2..1] by -1`, fewer checks are necessary to determine if the loop is in range.\n*   Bugfix for regression in 2.2.0 where a statement inside parentheses, e.g. `(fn(); break) while condition`, was compiling. Pure statements like `break` or `return` cannot turn a parenthesized block into an expression, and should throw an error.\n"
  },
  {
    "path": "documentation/sections/changelog/2.3.0.md",
    "content": "```\nreleaseHeader('2018-04-29', '2.3.0', '2.2.4')\n```\n\n*   This release adds support for all the new features and syntaxes in ES2018 that weren’t already possible in CoffeeScript. For all of the below features, make sure that you [transpile](#transpilation) unless you know that your target runtime(s) support each feature.\n*   Asynchronous iterators are now supported. You can now `yield` an `await` call, e.g. `do -> until file.EOF then yield await file.readLine()`.\n*   Object splats/destructuring, a.k.a. object rest/spread syntax, has been standardized as part of ES2018 and therefore this release removes the polyfill that had previously been supporting this syntax. Code like `{a, b, rest...} = obj` now outputs more or less just like it appears, rather than being converted into an `Object.assign` call. Note that there are [some subtle differences](https://developers.google.com/web/updates/2017/06/object-rest-spread) between the `Object.assign` polyfill and the native implementation.\n*   The exponentiation operator, `**`, and exponentiation assignment operator `**=` are new to JavaScript in ES2018. Now code like `a ** 3` is output as it appears, rather than being converted into `Math.pow(a, 3)` as it was before.\n*   The `s` (dotAll) flag is now supported in regular expressions.\n"
  },
  {
    "path": "documentation/sections/changelog/2.3.1.md",
    "content": "```\nreleaseHeader('2018-05-21', '2.3.1', '2.3.0')\n```\n\n*   Returning a JSX tag that is adjacent to another JSX tag, as opposed to returning a root JSX tag or fragment, is invalid JSX syntax. Babel throws an error on this, and now the CoffeeScript compiler does too.\n*   Invalid indentation inside a JSX interpolation (the middle of `<tag>{ ... }</tag>`) now throws an error.\n*   The browser compiler, used in [Try CoffeeScript](https://coffeescript.org/#try) and similar web-based CoffeeScript editors, now evaluates code in a global scope rather than the scope of the browser compiler. This improves performance of code executed via the browser compiler.\n*   Syntax cleanup: it is now possible for an implicit function call to take a body-less class as an argument, and `?::` now behaves identically to `::` with regard to implying a line continuation.\n"
  },
  {
    "path": "documentation/sections/changelog/2.3.2.md",
    "content": "```\nreleaseHeader('2018-09-19', '2.3.2', '2.3.1')\n```\n\n*   Babel 7 is now supported. With version 7, the Babel team moved from `babel-core` on NPM to `@babel/core`. Now the CoffeeScript `--transpile` option will first search for `@babel/core` (Babel versions 7 and above) and then search for `babel-core` (versions 6 and below) to try to find an installed version of Babel to use for transpilation.\n*   The syntax [`new.target`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new.target) is now supported.\n*   You can now follow the keyword `yield` with an indented object, like has already been allowed for `return` and other keywords.\n*   Previously, any comments inside a JSX tag or attribute would cause interpolation braces (`{` and `}`) to be output. This is only necessary for line (`#`, or `//` in JavaScript) comments, not here (`###`, or `/* */`) comments; so now the compiler checks if all the comments that would trigger the braces are here comments, and if so it doesn’t generate the unnecessary interpolation braces.\n"
  },
  {
    "path": "documentation/sections/changelog/2.4.0.md",
    "content": "```\nreleaseHeader('2019-03-29', '2.4.0', '2.3.2')\n```\n\n*   Dynamic `import()` expressions are now supported. The parentheses are always required, to distinguish from `import` statements. See [Modules](#dynamic-import). Note that as of this writing, the JavaScript feature itself is still Stage 3; if it changes before being fully standardized, it may change in CoffeeScript too. Using `import()` before its upstream [ECMAScript proposal](https://github.com/tc39/proposal-dynamic-import) is finalized should be considered provisional, subject to breaking changes if the proposal changes or is rejected. We have also revised our [policy](#contributing) on Stage 3 ECMAScript features, to support them when the features are [shipped](https://caniuse.com/#feat=es6-module-dynamic-import) in significant runtimes such as major browsers or Node.js.\n*   There are now two browser versions of the CoffeeScript compiler: the traditional one that’s been published for years, and a new [ES module version](/browser-compiler-modern/coffeescript.js) that can be used via `import`. If your browser supports it, it is in effect on this page. A reference to the ES module browser compiler is in the `package.json` `\"module\"` field.\n*   The Node API now exposes the previously private `registerCompiled` method, to allow plugins that use the `coffeescript` package to take advantage of CoffeeScript’s internal caching.\n*   Bugfixes for commas in strings in block arrays, a reference to `@` not being maintained in a `do` block in a class, and function default parameters should no longer be wrapped by extraneous parentheses.\n"
  },
  {
    "path": "documentation/sections/changelog/2.4.1.md",
    "content": "```\nreleaseHeader('2019-04-08', '2.4.1', '2.4.0')\n```\n\n*   Both the [traditional ES5](/browser-compiler-legacy/coffeescript.js) and [modern ES module](/browser-compiler-modern/coffeescript.js) versions of the CoffeeScript browser compiler are now published to NPM, enabling the browser compilers’ use via services that provide NPM modules’ code available via public CDN. The traditional version is referenced via the `package.json` `\"browser\"` field, and the ES module version via the `\"module\"` field.\n"
  },
  {
    "path": "documentation/sections/changelog/2.5.0.md",
    "content": "```\nreleaseHeader('2019-12-31', '2.5.0', '2.4.1')\n```\n\n*   The compiler now supports a new `ast` option, available via `--ast` on the command line or `ast` via the Node API. This option outputs an “abstract syntax tree,” or a JSON-like representation of the input CoffeeScript source code. This AST follows [Babel’s spec](https://github.com/babel/babel/blob/master/packages/babel-parser/ast/spec.md) as closely as possible, for compatibility with tools that work with JavaScript source code. Two tools that use this new AST output are [`eslint-plugin-coffee`](https://github.com/helixbass/eslint-plugin-coffee), a plugin to lint CoffeeScript via [ESLint](https://eslint.org/); and [`prettier-plugin-coffeescript`](https://github.com/helixbass/prettier-plugin-coffeescript), a plugin to reformat CoffeeScript source code via [Prettier](https://prettier.io/). _The structure and properties of CoffeeScript’s AST are not final and may undergo breaking changes between CoffeeScript versions; please [open an issue](https://github.com/jashkenas/coffeescript/issues) if you are interested in creating new integrations._\n*   [Numeric separators](https://github.com/tc39/proposal-numeric-separator) are now supported in CoffeeScript, following the same syntax as JavaScript: `1_234_567`.\n*   [`BigInt` numbers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) are now supported in CoffeeScript, following the same syntax as JavaScript: `42n`.\n*   `'''` and `\"\"\"` strings are now output as more readable JavaScript template literals, or backtick (`` ` ``) strings, with actual newlines rather than `\\n` escape sequences.\n*   Classes can now contain computed properties, e.g. `[someVar]: ->` or `@[anotherVar]: ->`.\n*   JSX tags can now contain XML-style namespaces, e.g. `<image xlink:href=\"data:image/png\" />` or `<Something:Tag></Something:Tag>`.\n*   Bugfixes for comments after colons not appearing the output; reserved words mistakenly being disallowed as JSX attributes; indented leading elisions in multiline arrays; and invalid location data in source maps.\n"
  },
  {
    "path": "documentation/sections/changelog/2.5.1.md",
    "content": "```\nreleaseHeader('2020-01-31', '2.5.1', '2.5.0')\n```\n\n*   Object splats can now include prototype shorthands, such as `a = {b::c...}`; and soaks, such as `a = {b?.c..., d?()...}`.\n*   Bugfix for regression in 2.5.0 where compilation became much slower for files with Windows-style line endings.\n*   Bugfix for an implicit object after a line continuation keyword like `or` inside a larger implicit object.\n"
  },
  {
    "path": "documentation/sections/changelog/2.6.0.md",
    "content": "```\nreleaseHeader('2021-09-19', '2.6.0', '2.5.1')\n```\n\n*   The syntax `import.meta`, including `import.meta.url`, is now supported.\n*   The `await` keyword is now supported outside of functions (in other words, at the top level). [Note that JavaScript runtimes only support this for ES modules.](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await#top_level_await)\n*   Bugfix for a `for` comprehension at the end of an `unless` or `until` line.\n"
  },
  {
    "path": "documentation/sections/changelog/2.6.1.md",
    "content": "```\nreleaseHeader('2021-10-03', '2.6.1', '2.6.0')\n```\n\n*   The `coffeescript` package itself now supports named exports when used by ES modules in Node.js; or in other words, `import { compile } from 'coffeescript'` now works, rather than only `import CoffeeScript from 'coffeescript'`.\n*   Bugfix for a stack overflow error when compiling large files in non-bare mode.\n"
  },
  {
    "path": "documentation/sections/changelog/2.7.0.md",
    "content": "```\nreleaseHeader('2022-04-23', '2.7.0', '2.6.1')\n```\n\n*   The [import assertions syntax](https://github.com/tc39/proposal-import-assertions) is now supported. This allows statements like `export { version } from './package.json' assert { type: 'json' }` or expressions like `import('./calendar.json', { assert { type: 'json' } })`.\n*   CoffeeScript no longer always patches Node’s error stack traces. This patching, where the line and column numbers are adjusted to match the source CoffeeScript rather than the generated JavaScript, caused conflicts with other libraries and is unnecessary when Node’s new [`--enable-source-maps` flag](https://nodejs.org/docs/latest/api/cli.html#--enable-source-maps) is passed. The patching will now occur only when `--enable-source-maps` is not set, no other library has already patched the stack traces, and `require('coffeescript/register')` is used. The patching can be enabled explicitly via `require('coffeescript').patchStackTrace()` or `import { patchStackTrace } from 'coffeescript'; patchStackTrace()`.\n*   Bugfix for an issue where block (triple-quoted) strings weren’t getting transpiled correctly into a JSX expression container wrapping the template literal (such as ``<div a={`...`} />``).\n*   Bugfixes for line continuations not behaving as expected for a nonempty first line of an explicit `[` array or `{` object literal.\n"
  },
  {
    "path": "documentation/sections/changelog.md",
    "content": "## Changelog\n"
  },
  {
    "path": "documentation/sections/chat.md",
    "content": "## Web Chat (IRC)\n\nQuick help and advice can often be found in the CoffeeScript IRC room `#coffeescript` on `irc.freenode.net`, which you can [join via your web browser](http://webchat.freenode.net/?channels=coffeescript).\n"
  },
  {
    "path": "documentation/sections/classes.md",
    "content": "## Classes\n\nCoffeeScript 1 provided the `class` and `extends` keywords as syntactic sugar for working with prototypal functions. With ES2015, JavaScript has adopted those keywords; so CoffeeScript 2 compiles its `class` and `extends` keywords to ES2015 classes.\n\n```\ncodeFor('classes', true)\n```\n\nStatic methods can be defined using `@` before the method name:\n\n```\ncodeFor('static', 'Teenager.say(\"Are we there yet?\")')\n```\n\nFinally, class definitions are blocks of executable code, which make for interesting metaprogramming possibilities. In the context of a class definition, `this` is the class object itself; therefore, you can assign static properties by using `@property: value`.\n"
  },
  {
    "path": "documentation/sections/coffeescript_2.md",
    "content": "## CoffeeScript 2\n"
  },
  {
    "path": "documentation/sections/command_line_interface.md",
    "content": "### Command Line\n\nOnce installed, you should have access to the `coffee` command, which can execute scripts, compile `.coffee` files into `.js`, and provide an interactive REPL. The `coffee` command takes the following options:\n\n| Option | Description |\n| --- | --- |\n| `-c, --compile` | Compile a `.coffee` script into a `.js` JavaScript file of the same name. |\n| `-t, --transpile` | Pipe the CoffeeScript compiler’s output through Babel before saving or running the generated JavaScript. Requires `@babel/core` to be installed, and options to pass to Babel in a `.babelrc` file or a `package.json` with a `babel` key in the path of the file or folder to be compiled. See [Transpilation](#transpilation).\n| `-m, --map` | Generate source maps alongside the compiled JavaScript files. Adds `sourceMappingURL` directives to the JavaScript as well. |\n| `-M, --inline-map` | Just like `--map`, but include the source map directly in the compiled JavaScript files, rather than in a separate file. |\n| `-i, --interactive` | Launch an interactive CoffeeScript session to try short snippets. Identical to calling `coffee` with no arguments. |\n| `-o, --output [DIR]` | Write out all compiled JavaScript files into the specified directory. Use in conjunction with `--compile` or `--watch`. |\n| `-w, --watch` | Watch files for changes, rerunning the specified command when any file is updated. |\n| `-p, --print` | Instead of writing out the JavaScript as a file, print it directly to **stdout**. |\n| `-s, --stdio` | Pipe in CoffeeScript to STDIN and get back JavaScript over STDOUT. Good for use with processes written in other languages. An example:<br><code>cat src/cake.coffee &#124; coffee -sc</code> |\n| `-l, --literate` | Parses the code as Literate CoffeeScript. You only need to specify this when passing in code directly over **stdio**, or using some sort of extension-less file name. |\n| `-e, --eval` | Compile and print a little snippet of CoffeeScript directly from the command line. For example:<br>`coffee -e \"console.log num for num in [10..1]\"` |\n| `-r, --require [MODULE]`&emsp; | `require()` the given module before starting the REPL or evaluating the code given with the `--eval` flag. |\n| `-b, --bare` | Compile the JavaScript without the [top-level function safety wrapper](#lexical-scope). |\n| `--no-header` | Suppress the “Generated by CoffeeScript” header. |\n| `--nodejs` | The `node` executable has some useful options you can set, such as `--debug`, `--debug-brk`, `--max-stack-size`, and `--expose-gc`. Use this flag to forward options directly to Node.js. To pass multiple flags, use `--nodejs` multiple times. |\n| `--ast` | Generate an abstract syntax tree of nodes of the CoffeeScript. Used for integrating with JavaScript build tools. |\n| `--tokens` | Instead of parsing the CoffeeScript, just lex it, and print out the token stream. Used for debugging the compiler. |\n| `-n, --nodes` | Instead of compiling the CoffeeScript, just lex and parse it, and print out the parse tree. Used for debugging the compiler. |\n\n#### Examples:\n\n*   Compile a directory tree of `.coffee` files in `src` into a parallel tree of `.js` files in `lib`:<br>\n    `coffee --compile --output lib/ src/`\n*   Watch a file for changes, and recompile it every time the file is saved:<br>\n    `coffee --watch --compile experimental.coffee`\n*   Concatenate a list of files into a single script:<br>\n    `coffee --join project.js --compile src/*.coffee`\n*   Print out the compiled JS from a one-liner:<br>\n    `coffee -bpe \"alert i for i in [0..10]\"`\n*   All together now, watch and recompile an entire project as you work on it:<br>\n    `coffee -o lib/ -cw src/`\n*   Start the CoffeeScript REPL (`Ctrl-D` to exit, `Ctrl-V`for multi-line):<br>\n    `coffee`\n\nTo use `--transpile`, see [Transpilation](#transpilation).\n"
  },
  {
    "path": "documentation/sections/comments.md",
    "content": "## Comments\n\nIn CoffeeScript, comments are denoted by the `#` character to the end of a line, or from `###` to the next appearance of `###`. Comments are ignored by the compiler, though the compiler makes its best effort at reinserting your comments into the output JavaScript after compilation.\n\n```\ncodeFor('comment')\n```\n\nInline `###` comments make [type annotations](#type-annotations) possible."
  },
  {
    "path": "documentation/sections/comparisons.md",
    "content": "## Chained Comparisons\n\nCoffeeScript borrows [chained comparisons](https://docs.python.org/3/reference/expressions.html#not-in) from Python — making it easy to test if a value falls within a certain range.\n\n```\ncodeFor('comparisons', 'healthy')\n```\n"
  },
  {
    "path": "documentation/sections/compatibility.md",
    "content": "### Compatibility\n\nMost modern JavaScript features that CoffeeScript supports can run natively in Node 7.6+, meaning that Node can run CoffeeScript’s output without any further processing required. Here are some notable exceptions:\n\n*  [JSX](#jsx) always requires transpilation.\n*  [Splats, a.k.a. object rest/spread syntax, for objects](https://coffeescript.org/#splats) are supported by Node 8.6+.\n*  The [regular expression `s` (dotall) flag](https://github.com/tc39/proposal-regexp-dotall-flag) is supported by Node 9+.\n*  [Async generator functions](https://github.com/tc39/proposal-async-iteration) are supported by Node 10+.\n*  [Modules](#modules) are supported by Node 12+ with `\"type\": \"module\"` in your project’s `package.json`.\n\nThis list may be incomplete, and excludes versions of Node that support newer features behind flags; please refer to [node.green](http://node.green/) for full details. You can [run the tests in your browser](test.html) to see what your browser supports. It is your responsibility to ensure that your runtime supports the modern features you use; or that you [transpile](#transpilation) your code. When in doubt, transpile.\n\nFor compatibility with other JavaScript frameworks and tools, see [Integrations](#integrations).\n"
  },
  {
    "path": "documentation/sections/conditionals.md",
    "content": "## If, Else, Unless, and Conditional Assignment\n\n`if`/`else` statements can be written without the use of parentheses and curly brackets. As with functions and other block expressions, multi-line conditionals are delimited by indentation. There’s also a handy postfix form, with the `if` or `unless` at the end.\n\nCoffeeScript can compile `if` statements into JavaScript expressions, using the ternary operator when possible, and closure wrapping otherwise. There is no explicit ternary statement in CoffeeScript — you simply use a regular `if` statement on a single line.\n\n```\ncodeFor('conditionals')\n```\n"
  },
  {
    "path": "documentation/sections/contributing.md",
    "content": "## Contributing\n\nContributions are welcome! Feel free to fork [the repo](https://github.com/jashkenas/coffeescript) and submit a pull request.\n\n[Some features of ECMAScript are intentionally unsupported](#unsupported). Please review both the open and closed [issues on GitHub](https://github.com/jashkenas/coffeescript/issues) to see if the feature you’re looking for has already been discussed. As a general rule, we don’t support ECMAScript syntax for features that aren’t yet finalized (at Stage 4 in the [proposal approval process](https://github.com/tc39/proposals)) or implemented in major browsers and/or Node (which can sometimes happen for features in Stage 3). Any Stage 3 features that CoffeeScript chooses to support should be considered experimental, subject to breaking changes or removal until the feature reaches Stage 4.\n\nFor more resources on adding to CoffeeScript, please see [the Wiki](https://github.com/jashkenas/coffeescript/wiki/%5BHowto%5D-Hacking-on-the-CoffeeScript-Compiler), especially [How The Parser Works](https://github.com/jashkenas/coffeescript/wiki/%5BHowTo%5D-How-parsing-works).\n\nThere are several things you can do to increase your odds of having your pull request accepted:\n\n  * Create tests! Any pull request should probably include basic tests to verify you didn’t break anything, or future changes won’t break your code.\n  * Follow the style of the rest of the CoffeeScript codebase.\n  * Ensure any ECMAScript syntax is mature (at Stage 4, or at Stage 3 with support in major browsers or runtimes).\n  * Add only features that have broad utility, rather than a feature aimed at a specific use case or framework.\n\nOf course, it’s entirely possible that you have a great addition, but it doesn’t fit within these constraints. Feel free to roll your own solution; you will have [plenty of company](https://github.com/jashkenas/coffeescript/wiki/In-The-Wild).\n"
  },
  {
    "path": "documentation/sections/destructuring.md",
    "content": "## Destructuring Assignment\n\nJust like JavaScript (since ES2015), CoffeeScript has destructuring assignment syntax. When you assign an array or object literal to a value, CoffeeScript breaks up and matches both sides against each other, assigning the values on the right to the variables on the left. In the simplest case, it can be used for parallel assignment:\n\n```\ncodeFor('parallel_assignment', 'theBait')\n```\n\nBut it’s also helpful for dealing with functions that return multiple values.\n\n```\ncodeFor('multiple_return_values', 'forecast')\n```\n\nDestructuring assignment can be used with any depth of array and object nesting, to help pull out deeply nested properties.\n\n```\ncodeFor('object_extraction', 'name + \"-\" + street')\n```\n\nDestructuring assignment can even be combined with splats.\n\n```\ncodeFor('patterns_and_splats', 'contents.join(\"\")')\n```\n\nExpansion can be used to retrieve elements from the end of an array without having to assign the rest of its values. It works in function parameter lists as well.\n\n```\ncodeFor('expansion', 'first + \" \" + last')\n```\n\nDestructuring assignment is also useful when combined with class constructors to assign properties to your instance from an options object passed to the constructor.\n\n```\ncodeFor('constructor_destructuring', 'tim.age + \" \" + tim.height')\n```\n\nThe above example also demonstrates that if properties are missing in the destructured object or array, you can, just like in JavaScript, provide defaults. Note though that unlike with the existential operator, the default is only applied with the value is missing or `undefined`—[passing `null` will set a value of `null`](#breaking-changes-default-values), not the default.\n"
  },
  {
    "path": "documentation/sections/embedded.md",
    "content": "## Embedded JavaScript\n\nHopefully, you’ll never need to use it, but if you ever need to intersperse snippets of JavaScript within your CoffeeScript, you can use backticks to pass it straight through.\n\n```\ncodeFor('embedded', 'hi()')\n```\n\nEscape backticks with backslashes: `` \\`​`` becomes `` `​``.\n\nEscape backslashes before backticks with more backslashes: `` \\\\\\`​`` becomes `` \\`​``.\n\n```\ncodeFor('embedded_escaped', 'markdown()')\n```\n\nYou can also embed blocks of JavaScript using triple backticks. That’s easier than escaping backticks, if you need them inside your JavaScript block.\n\n```\ncodeFor('embedded_block', 'time()')\n```\n"
  },
  {
    "path": "documentation/sections/examples.md",
    "content": "## Examples\n\nThe [best list of open-source CoffeeScript examples](https://github.com/trending?l=coffeescript&since=monthly) can be found on GitHub. But just to throw out a few more:\n\n*   **GitHub**’s [Hubot](https://hubot.github.com/), a friendly IRC robot that can perform any number of useful and useless tasks.\n*   **sstephenson**’s [Pow](http://pow.cx/), a zero-configuration Rack server, with comprehensive annotated source.\n*   **technoweenie**’s [Coffee-Resque](https://github.com/technoweenie/coffee-resque), a port of [Resque](https://github.com/defunkt/resque) for Node.js.\n*   **stephank**’s [Orona](https://github.com/stephank/orona), a remake of the Bolo tank game for modern browsers.\n*   **GitHub**’s [Atom](https://atom.io/), a hackable text editor built on web technologies.\n*   **Basecamp**’s [Trix](https://trix-editor.org/), a rich text editor for web apps.\n"
  },
  {
    "path": "documentation/sections/existential_operator.md",
    "content": "## The Existential Operator\n\nIt’s a little difficult to check for the existence of a variable in JavaScript. `if (variable) …` comes close, but fails for zero, the empty string, and false (to name just the most common cases). CoffeeScript’s existential operator `?` returns true unless a variable is `null` or `undefined` or undeclared, which makes it analogous to Ruby’s `nil?`.\n\nIt can also be used for safer conditional assignment than the JavaScript pattern `a = a || value` provides, for cases where you may be handling numbers or strings.\n\n```\ncodeFor('existence', 'footprints')\n```\n\nNote that if the compiler knows that `a` is in scope and therefore declared, `a?` compiles to `a != null`, _not_ `a !== null`. The `!=` makes a loose comparison to `null`, which does double duty also comparing against `undefined`. The reverse also holds for `not a?` or `unless a?`.\n\n```\ncodeFor('existence_declared')\n```\n\nIf a variable might be undeclared, the compiler does a thorough check. This is what JavaScript coders _should_ be typing when they want to check if a mystery variable exists.\n\n```\ncodeFor('existence_undeclared')\n```\n\nThe accessor variant of the existential operator `?.` can be used to soak up null references in a chain of properties. Use it instead of the dot accessor `.` in cases where the base value may be `null` or `undefined`. If all of the properties exist then you’ll get the expected result, if the chain is broken, `undefined` is returned instead of the `TypeError` that would be raised otherwise.\n\n```\ncodeFor('soaks')\n```\n\nFor completeness:\n\n| Example | Definition |\n| --- | --- |\n| `a?` | tests that `a` is in scope and `a != null` |\n| `a ? b` | returns `a` if `a` is in scope and `a != null`; otherwise, `b` |\n| `a?.b` or `a?['b']` | returns `a.b` if `a` is in scope and `a != null`; otherwise, `undefined` |\n| `a?(b, c)` or `a? b, c`&emsp; | returns the result of calling `a` (with arguments `b` and `c`) if `a` is in scope and callable; otherwise, `undefined` |\n| `a ?= b` | assigns the value of `b` to `a` if `a` is not in scope or if `a == null`; produces the new value of `a` |"
  },
  {
    "path": "documentation/sections/expressions.md",
    "content": "## Everything is an Expression (at least, as much as possible)\n\nYou might have noticed how even though we don’t add return statements to CoffeeScript functions, they nonetheless return their final value. The CoffeeScript compiler tries to make sure that all statements in the language can be used as expressions. Watch how the `return` gets pushed down into each possible branch of execution in the function below.\n\n```\ncodeFor('expressions', 'eldest')\n```\n\nEven though functions will always return their final value, it’s both possible and encouraged to return early from a function body writing out the explicit return (`return value`), when you know that you’re done.\n\nBecause variable declarations occur at the top of scope, assignment can be used within expressions, even for variables that haven’t been seen before:\n\n```\ncodeFor('expressions_assignment', 'six')\n```\n\nThings that would otherwise be statements in JavaScript, when used as part of an expression in CoffeeScript, are converted into expressions by wrapping them in a closure. This lets you do useful things, like assign the result of a comprehension to a variable:\n\n```\ncodeFor('expressions_comprehension', 'globals')\n```\n\nAs well as silly things, like passing a `try`/`catch` statement directly into a function call:\n\n```\ncodeFor('expressions_try', true)\n```\n\nThere are a handful of statements in JavaScript that can’t be meaningfully converted into expressions, namely `break`, `continue`, and `return`. If you make use of them within a block of code, CoffeeScript won’t try to perform the conversion.\n"
  },
  {
    "path": "documentation/sections/fat_arrow.md",
    "content": "## Bound (Fat Arrow) Functions\n\nIn JavaScript, the `this` keyword is dynamically scoped to mean the object that the current function is attached to. If you pass a function as a callback or attach it to a different object, the original value of `this` will be lost. If you’re not familiar with this behavior, [this Digital Web article](https://web.archive.org/web/20150316122013/http://www.digital-web.com/articles/scope_in_javascript) gives a good overview of the quirks.\n\nThe fat arrow `=>` can be used to both define a function, and to bind it to the current value of `this`, right on the spot. This is helpful when using callback-based libraries like Prototype or jQuery, for creating iterator functions to pass to `each`, or event-handler functions to use with `on`. Functions created with the fat arrow are able to access properties of the `this` where they’re defined.\n\n```\ncodeFor('fat_arrow')\n```\n\nIf we had used `->` in the callback above, `@customer` would have referred to the undefined “customer” property of the DOM element, and trying to call `purchase()` on it would have raised an exception.\n\nThe fat arrow was one of the most popular features of CoffeeScript, and ES2015 [adopted it](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions); so CoffeeScript 2 compiles `=>` to ES `=>`.\n"
  },
  {
    "path": "documentation/sections/functions.md",
    "content": "## Functions\n\nFunctions are defined by an optional list of parameters in parentheses, an arrow, and the function body. The empty function looks like this: `->`\n\n```\ncodeFor('functions', 'cube(5)')\n```\n\nFunctions may also have default values for arguments, which will be used if the incoming argument is missing (`undefined`).\n\n```\ncodeFor('default_args', 'fill(\"cup\")')\n```\n"
  },
  {
    "path": "documentation/sections/generators.md",
    "content": "## Generator Functions\n\nCoffeeScript supports ES2015 [generator functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*) through the `yield` keyword. There's no `function*(){}` nonsense — a generator in CoffeeScript is simply a function that yields.\n\n```\ncodeFor('generators', 'ps.next().value')\n```\n\n`yield*` is called `yield from`, and `yield return` may be used if you need to force a generator that doesn’t yield.\n\n<div id=\"generator-iteration\" class=\"bookmark\"></div>\n\nYou can iterate over a generator function using `for…from`.\n\n```\ncodeFor('generator_iteration', 'getFibonacciNumbers(10)')\n```\n"
  },
  {
    "path": "documentation/sections/heregexes.md",
    "content": "## Block Regular Expressions\n\nSimilar to block strings and comments, CoffeeScript supports block regexes — extended regular expressions that ignore internal whitespace and can contain comments and interpolation. Modeled after Perl’s `/x` modifier, CoffeeScript’s block regexes are delimited by `///` and go a long way towards making complex regular expressions readable. To quote from the CoffeeScript source:\n\n```\ncodeFor('heregexes')\n```\n"
  },
  {
    "path": "documentation/sections/installation.md",
    "content": "## Installation\n\nThe command-line version of `coffee` is available as a [Node.js](https://nodejs.org/) utility, requiring Node 6 or later. The [core compiler](/v<%= majorVersion %>/browser-compiler-modern/coffeescript.js) however, does not depend on Node, and can be run in any JavaScript environment, or in the browser (see [Try CoffeeScript](#try)).\n\nTo install, first make sure you have a working copy of the latest stable version of [Node.js](https://nodejs.org/). You can then install CoffeeScript globally with [npm](https://www.npmjs.com/):\n\n```bash\nnpm install --global coffeescript\n```\n\nThis will make the `coffee` and `cake` commands available globally.\n\nIf you are using CoffeeScript in a project, you should install it locally for that project so that the version of CoffeeScript is tracked as one of your project’s dependencies. Within that project’s folder:\n\n```bash\nnpm install --save-dev coffeescript\n```\n\nThe `coffee` and `cake` commands will first look in the current folder to see if CoffeeScript is installed locally, and use that version if so. This allows different versions of CoffeeScript to be installed globally and locally.\n\nIf you plan to use the `--transpile` option (see [Transpilation](#transpilation)) you will need to also install `@babel/core` either globally or locally, depending on whether you are running a globally or locally installed version of CoffeeScript.\n"
  },
  {
    "path": "documentation/sections/integrations.md",
    "content": "## Integrations\n\nCoffeeScript is part of the vast JavaScript ecosystem, and many libraries help integrate CoffeeScript with JavaScript. Major projects, especially projects updated to work with CoffeeScript 2, are listed here; more can be found in the [wiki pages](https://github.com/jashkenas/coffeescript/wiki). If there’s a project that you feel should be added to this section, please open an issue or [pull request](https://github.com/jashkenas/coffeescript/wiki/%5BHowTo%5D-Update-the-docs). Projects are listed in alphabetical order by category.\n"
  },
  {
    "path": "documentation/sections/integrations_build_tools.md",
    "content": "### Build Tools\n\n* [Browserify](http://browserify.org) with [coffeeify](https://github.com/jnordberg/coffeeify)\n\n* [Grunt](https://gruntjs.com) with [grunt-contrib-coffee](https://github.com/gruntjs/grunt-contrib-coffee)\n\n* [Gulp](https://gulpjs.com) with [gulp-coffee](https://github.com/gulp-community/gulp-coffee)\n\n* [Parcel](https://parceljs.org) with [transformer-coffeescript](https://github.com/parcel-bundler/parcel/tree/v2/packages/transformers/coffeescript)\n\n* [Rollup](https://rollupjs.org) with [rollup-plugin-coffee-script](https://github.com/lautis/rollup-plugin-coffee-script)\n\n* [Webpack](https://webpack.js.org) with [coffee-loader](https://github.com/webpack-contrib/coffee-loader)\n"
  },
  {
    "path": "documentation/sections/integrations_code_editors.md",
    "content": "### Code Editors\n\n* [Atom](https://atom.io) [packages](https://atom.io/packages/search?q=coffeescript)\n\n* [Sublime Text](https://sublimetext.com) [packages](https://packagecontrol.io/search/coffeescript)\n\n* [Visual Studio Code](https://code.visualstudio.com) [extensions](https://marketplace.visualstudio.com/search?target=VSCode&term=coffeescript)\n"
  },
  {
    "path": "documentation/sections/integrations_frameworks.md",
    "content": "### Frameworks\n\n* [Ember](https://emberjs.com)\n with [ember-cli-coffeescript](https://github.com/kimroen/ember-cli-coffeescript)\n\n* [Meteor](https://meteor.com) with [coffeescript-compiler](https://atmospherejs.com/meteor/coffeescript-compiler)\n"
  },
  {
    "path": "documentation/sections/integrations_linters_and_formatting.md",
    "content": "### Linters and Formatting\n\n* [CoffeeLint](https://coffeelint.github.io/)\n\n* [ESLint](https://eslint.org) with [eslint-plugin-coffee](https://github.com/helixbass/eslint-plugin-coffee)\n\n* [Prettier](https://prettier.io) with [prettier-plugin-coffeescript](https://github.com/helixbass/prettier-plugin-coffeescript)\n"
  },
  {
    "path": "documentation/sections/integrations_testing.md",
    "content": "### Testing\n\n* [Jest](https://jestjs.io) with [jest-preset-coffeescript](https://github.com/danielbayley/jest-preset-coffeescript)\n"
  },
  {
    "path": "documentation/sections/introduction.md",
    "content": "**CoffeeScript is a little language that compiles into JavaScript.** Underneath that awkward Java-esque patina, JavaScript has always had a gorgeous heart. CoffeeScript is an attempt to expose the good parts of JavaScript in a simple way.\n\nThe golden rule of CoffeeScript is: _“It’s just JavaScript.”_ The code compiles one-to-one into the equivalent JS, and there is no interpretation at runtime. You can use any existing JavaScript library seamlessly from CoffeeScript (and vice-versa). The compiled output is readable, pretty-printed, and tends to run as fast or faster than the equivalent handwritten JavaScript.\n\n**Latest Version:** [<%= fullVersion %>](https://github.com/jashkenas/coffeescript/tarball/<%= fullVersion %>)\n\n```bash\n# Install locally for a project:\nnpm install --save-dev coffeescript\n\n# Install globally to execute .coffee files anywhere:\nnpm install --global coffeescript\n```\n"
  },
  {
    "path": "documentation/sections/jsx.md",
    "content": "## JSX\n\n[JSX](https://facebook.github.io/react/docs/introducing-jsx.html) is JavaScript containing interspersed XML elements. While conceived for [React](https://facebook.github.io/react/), it is not specific to any particular library or framework.\n\nCoffeeScript supports interspersed XML elements, without the need for separate plugins or special settings. The XML elements will be compiled as such, outputting JSX that could be parsed like any normal JSX file, for example by [Babel with the React JSX transform](https://babeljs.io/docs/plugins/transform-react-jsx/). CoffeeScript does _not_ output `React.createElement` calls or any code specific to React or any other framework. It is up to you to attach another step in your build chain to convert this JSX to whatever function calls you wish the XML elements to compile to.\n\nJust like in JSX and HTML, denote XML tags using `<` and `>`. You can interpolate CoffeeScript code inside a tag using `{` and `}`. To avoid compiler errors, when using `<` and `>` to mean “less than” or “greater than,” you should wrap the operators in spaces to distinguish them from XML tags. So `i < len`, not `i<len`. The compiler tries to be forgiving when it can be sure what you intend, but always putting spaces around the “less than” and “greater than” operators will remove ambiguity.\n\n```\ncodeFor('jsx')\n```\n\nOlder plugins or forks of CoffeeScript supported JSX syntax and referred to it as CSX or CJSX. They also often used a `.cjsx` file extension, but this is no longer necessary; regular `.coffee` will do.\n"
  },
  {
    "path": "documentation/sections/language.md",
    "content": "## Language Reference\n\n_This reference is structured so that it can be read from top to bottom, if you like. Later sections use ideas and syntax previously introduced. Familiarity with JavaScript is assumed. In all of the following examples, the source CoffeeScript is provided on the left, and the direct compilation into JavaScript is on the right._\n\n_Many of the examples can be run (where it makes sense) by pressing the_ <small>▶</small> _button on the right. The CoffeeScript on the left is editable, and the JavaScript will update as you edit._\n\nFirst, the basics: CoffeeScript uses significant whitespace to delimit blocks of code. You don’t need to use semicolons `;` to terminate expressions, ending the line will do just as well (although semicolons can still be used to fit multiple expressions onto a single line). Instead of using curly braces `{ }` to surround blocks of code in [functions](#literals), [if-statements](#conditionals), [switch](#switch), and [try/catch](#try-catch), use indentation.\n\nYou don’t need to use parentheses to invoke a function if you’re passing arguments. The implicit call wraps forward to the end of the line or block expression.<br>\n`console.log sys.inspect object` → `console.log(sys.inspect(object));`\n"
  },
  {
    "path": "documentation/sections/lexical_scope.md",
    "content": "## Lexical Scoping and Variable Safety\n\nThe CoffeeScript compiler takes care to make sure that all of your variables are properly declared within lexical scope — you never need to write `var` yourself.\n\n```\ncodeFor('scope', 'inner')\n```\n\nNotice how all of the variable declarations have been pushed up to the top of the closest scope, the first time they appear. `outer` is not redeclared within the inner function, because it’s already in scope; `inner` within the function, on the other hand, should not be able to change the value of the external variable of the same name, and therefore has a declaration of its own.\n\nBecause you don’t have direct access to the `var` keyword, it’s impossible to shadow an outer variable on purpose, you may only refer to it. So be careful that you’re not reusing the name of an external variable accidentally, if you’re writing a deeply nested function.\n\nAlthough suppressed within this documentation for clarity, all CoffeeScript output (except in files with `import` or `export` statements) is wrapped in an anonymous function: `(function(){ … })();`. This safety wrapper, combined with the automatic generation of the `var` keyword, make it exceedingly difficult to pollute the global namespace by accident. (The safety wrapper can be disabled with the [`bare` option](#usage), and is unnecessary and automatically disabled when using modules.)\n\nIf you’d like to create top-level variables for other scripts to use, attach them as properties on `window`; attach them as properties on the `exports` object in CommonJS; or use an [`export` statement](#modules). If you’re targeting both CommonJS and the browser, the [existential operator](#existential-operator) (covered below), gives you a reliable way to figure out where to add them: `exports ? this`.\n\nSince CoffeeScript takes care of all variable declaration, it is not possible to declare variables with ES2015’s `let` or `const`. [This is intentional](#unsupported-let-const); we feel that the simplicity gained by not having to think about variable declaration outweighs the benefit of having three separate ways to declare variables."
  },
  {
    "path": "documentation/sections/literate.md",
    "content": "## Literate CoffeeScript\n\nBesides being used as an ordinary programming language, CoffeeScript may also be written in “literate” mode. If you name your file with a `.litcoffee` extension, you can write it as a Markdown document — a document that also happens to be executable CoffeeScript code. The compiler will treat any indented blocks (Markdown’s way of indicating source code) as executable code, and ignore the rest as comments. Code blocks must also be separated from comments by at least one blank line.\n\nJust for kicks, a little bit of the compiler is currently implemented in this fashion: See it [as a document](https://gist.github.com/jashkenas/3fc3c1a8b1009c00d9df), [raw](https://raw.githubusercontent.com/jashkenas/coffeescript/master/src/scope.litcoffee), and [properly highlighted in a text editor](http://cl.ly/LxEu).\n\nA few caveats:\n\n* Code blocks need to maintain consistent indentation relative to each other. When the compiler parses your Literate CoffeeScript file, it first discards all the non-code block lines and then parses the remainder as a regular CoffeeScript file. Therefore the code blocks need to be written as if the comment lines don’t exist, with consistent indentation (including whether they are indented with tabs or spaces).\n* Along those lines, code blocks within list items or blockquotes are not treated as executable code. Since list items and blockquotes imply their own indentation, it would be ambiguous how to treat indentation between successive code blocks when some are within these other blocks and some are not.\n* List items can be at most only one paragraph long. The second paragraph of a list item would be indented after a blank line, and therefore indistinguishable from a code block.\n"
  },
  {
    "path": "documentation/sections/loops.md",
    "content": "## Loops and Comprehensions\n\nMost of the loops you’ll write in CoffeeScript will be **comprehensions** over arrays, objects, and ranges. Comprehensions replace (and compile into) `for` loops, with optional guard clauses and the value of the current array index. Unlike for loops, array comprehensions are expressions, and can be returned and assigned.\n\n```\ncodeFor('array_comprehensions')\n```\n\nComprehensions should be able to handle most places where you otherwise would use a loop, `each`/`forEach`, `map`, or `select`/`filter`, for example:<br>\n`shortNames = (name for name in list when name.length < 5)`<br>\nIf you know the start and end of your loop, or would like to step through in fixed-size increments, you can use a range to specify the start and end of your comprehension.\n\n```\ncodeFor('range_comprehensions', 'countdown')\n```\n\nNote how because we are assigning the value of the comprehensions to a variable in the example above, CoffeeScript is collecting the result of each iteration into an array. Sometimes functions end with loops that are intended to run only for their side-effects. Be careful that you’re not accidentally returning the results of the comprehension in these cases, by adding a meaningful return value — like `true` — or `null`, to the bottom of your function.\n\nTo step through a range comprehension in fixed-size chunks, use `by`, for example:\n`evens = (x for x in [0..10] by 2)`\n\nIf you don’t need the current iteration value you may omit it:\n`browser.closeCurrentTab() for [0...count]`\n\nComprehensions can also be used to iterate over the keys and values in an object. Use `of` to signal comprehension over the properties of an object instead of the values in an array.\n\n```\ncodeFor('object_comprehensions', 'ages.join(\", \")')\n```\n\nIf you would like to iterate over just the keys that are defined on the object itself, by adding a `hasOwnProperty` check to avoid properties that may be inherited from the prototype, use `for own key, value of object`.\n\nTo iterate a generator function, use `from`. See [Generator Functions](#generator-iteration).\n\nThe only low-level loop that CoffeeScript provides is the `while` loop. The main difference from JavaScript is that the `while` loop can be used as an expression, returning an array containing the result of each iteration through the loop.\n\n```\ncodeFor('while', 'lyrics.join(\"\\\\n\")')\n```\n\nFor readability, the `until` keyword is equivalent to `while not`, and the `loop` keyword is equivalent to `while true`.\n\nWhen using a JavaScript loop to generate functions, it’s common to insert a closure wrapper in order to ensure that loop variables are closed over, and all the generated functions don’t just share the final values. CoffeeScript provides the `do` keyword, which immediately invokes a passed function, forwarding any arguments.\n\n```\ncodeFor('do')\n```\n"
  },
  {
    "path": "documentation/sections/modules.md",
    "content": "## Modules\n\n[ES2015 modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules) are supported in CoffeeScript, with very similar `import` and `export` syntax:\n\n```\ncodeFor('modules')\n```\n\n<div id=\"dynamic-import\" class=\"bookmark\"></div>\n\n[Dynamic import](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports) is also supported, with mandatory parentheses:\n\n```\ncodeFor('dynamic_import', true)\n```\n\n<div id=\"modules-note\" class=\"bookmark\"></div>\n\nNote that the CoffeeScript compiler **does not resolve modules**; writing an `import` or `export` statement in CoffeeScript will produce an `import` or `export` statement in the resulting output. Such statements can be run by all modern browsers (when the script is referenced via `<script type=\"module\">`) and [by Node.js](https://nodejs.org/api/esm.html#esm_enabling) when the output `.js` files are in a folder where the nearest parent `package.json` file contains `\"type\": \"module\"`. Because the runtime is evaluating the generated output, the `import` statements must reference the output files; so if `file.coffee` is output as `file.js`, it needs to be referenced as `file.js` in the `import` statement, with the `.js` extension included.\n\nAlso, any file with an `import` or `export` statement will be output without a [top-level function safety wrapper](#lexical-scope); in other words, importing or exporting modules will automatically trigger [bare](#usage) mode for that file. This is because per the ES2015 spec, `import` or `export` statements must occur at the topmost scope.\n"
  },
  {
    "path": "documentation/sections/nodejs_usage.md",
    "content": "### Node.js\n\nIf you’d like to use Node.js’ CommonJS to `require` CoffeeScript files, e.g. `require './app.coffee'`, you must first “register” CoffeeScript as an extension:\n\n```coffee\nrequire 'coffeescript/register'\n\nApp = require './app' # The .coffee extension is optional\n```\n\nIf you want to use the compiler’s API, for example to make an app that compiles strings of CoffeeScript on the fly, you can `require` the full module:\n\n```coffee\nCoffeeScript = require 'coffeescript'\n\neval CoffeeScript.compile 'console.log \"Mmmmm, I could really go for some #{Math.pi}\"'\n```\n\nThe `compile` method has the signature `compile(code, options)` where `code` is a string of CoffeeScript code, and the optional `options` is an object with some or all of the following properties:\n\n* `options.sourceMap`, boolean: if true, a source map will be generated; and instead of returning a string, `compile` will return an object of the form `{js, v3SourceMap, sourceMap}`.\n* `options.inlineMap`, boolean: if true, output the source map as a base64-encoded string in a comment at the bottom.\n* `options.filename`, string: the filename to use for the source map. It can include a path (relative or absolute).\n* `options.bare`, boolean: if true, output without the [top-level function safety wrapper](#lexical-scope).\n* `options.header`, boolean: if true, output the `Generated by CoffeeScript` header.\n* `options.transpile`, **object**: if set, this must be an object with the [options to pass to Babel](http://babeljs.io/docs/usage/api/#options). See [Transpilation](#transpilation).\n* `options.ast`, boolean: if true, return an abstract syntax tree of the input CoffeeScript source code.\n"
  },
  {
    "path": "documentation/sections/objects_and_arrays.md",
    "content": "## Objects and Arrays\n\nThe CoffeeScript literals for objects and arrays look very similar to their JavaScript cousins. When each property is listed on its own line, the commas are optional. Objects may be created using indentation instead of explicit braces, similar to [YAML](http://yaml.org).\n\n```\ncodeFor('objects_and_arrays', 'song.join(\" … \")')\n```\n\nCoffeeScript has a shortcut for creating objects when you want the key to be set with a variable of the same name. Note that the `{` and `}` are required for this shorthand.\n\n```\ncodeFor('objects_shorthand')\n```\n"
  },
  {
    "path": "documentation/sections/operators.md",
    "content": "## Operators and Aliases\n\nBecause the `==` operator frequently causes undesirable coercion, is intransitive, and has a different meaning than in other languages, CoffeeScript compiles `==` into `===`, and `!=` into `!==`. In addition, `is` compiles into `===`, and `isnt` into `!==`.\n\nYou can use `not` as an alias for `!`.\n\nFor logic, `and` compiles to `&&`, and `or` into `||`.\n\nInstead of a newline or semicolon, `then` can be used to separate conditions from expressions, in `while`, `if`/`else`, and `switch`/`when` statements.\n\nAs in [YAML](http://yaml.org/), `on` and `yes` are the same as boolean `true`, while `off` and `no` are boolean `false`.\n\n`unless` can be used as the inverse of `if`.\n\nAs a shortcut for `this.property`, you can use `@property`.\n\nYou can use `in` to test for array presence, and `of` to test for JavaScript object-key presence.\n\nIn a `for` loop, `from` compiles to the [ES2015 `of`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of). (Yes, it’s unfortunate; the CoffeeScript `of` predates the ES2015 `of`.)\n\nTo simplify math expressions, `**` can be used for exponentiation and `//` performs floor division. `%` works just like in JavaScript, while `%%` provides [“dividend dependent modulo”](https://en.wikipedia.org/wiki/Modulo_operation):\n\n```\ncodeFor('modulo')\n```\n\nAll together now:\n\n| CoffeeScript | JavaScript |\n| --- | --- |\n| `is` | `===` |\n| `isnt` | `!==` |\n| `not` | `!` |\n| `and` | `&&` |\n| `or` | <code>&#124;&#124;</code> |\n| `true`, `yes`, `on` | `true` |\n| `false`, `no`, `off`&emsp; | `false` |\n| `@`, `this` | `this` |\n| `a in b` | `[].indexOf.call(b, a) >= 0` |\n| `a of b` | `a in b` |\n| `for a from b` | `for (a of b)` |\n| `a ** b` | `a ** b` |\n| `a // b` | `Math.floor(a / b)` |\n| `a %% b` | `(a % b + b) % b` |\n\n```\ncodeFor('aliases')\n```\n"
  },
  {
    "path": "documentation/sections/overview.md",
    "content": "## Overview\n\n_CoffeeScript on the <span class=\"d-md-none\">top</span><span class=\"d-none d-md-inline\">left</span>, compiled JavaScript output on the <span class=\"d-md-none\">bottom</span><span class=\"d-none d-md-inline\">right</span>. The CoffeeScript is editable!_\n\n```\ncodeFor('overview', 'cubes', false)\n```\n"
  },
  {
    "path": "documentation/sections/prototypal_inheritance.md",
    "content": "## Prototypal Inheritance\n\nIn addition to supporting ES2015 classes, CoffeeScript provides a shortcut for working with prototypes. The `::` operator gives you quick access to an object’s prototype:\n\n```\ncodeFor('prototypes', '\"one_two\".dasherize()')\n```\n"
  },
  {
    "path": "documentation/sections/resources.md",
    "content": "## Resources\n\n*   [CoffeeScript on GitHub](https://github.com/jashkenas/coffeescript/)\n*   [CoffeeScript Issues](https://github.com/jashkenas/coffeescript/issues)<br>\n    Bug reports, feature proposals, and ideas for changes to the language belong here.\n*   [CoffeeScript Google Group](https://groups.google.com/forum/#!forum/coffeescript)<br>\n    If you’d like to ask a question, the mailing list is a good place to get help.\n*   [The CoffeeScript Wiki](https://github.com/jashkenas/coffeescript/wiki)<br>\n    If you’ve ever learned a neat CoffeeScript tip or trick, or ran into a gotcha — share it on the wiki.\n*   [The FAQ](https://github.com/jashkenas/coffeescript/wiki/FAQ)<br>\n    Perhaps your CoffeeScript-related question has been asked before. Check the FAQ first.\n*   [JS2Coffee](http://js2.coffee/)<br>\n    Is a very well done reverse JavaScript-to-CoffeeScript compiler. It’s not going to be perfect (infer what your JavaScript classes are, when you need bound functions, and so on…) — but it’s a great starting point for converting simple scripts.\n*   [High-Rez Logo](https://github.com/jashkenas/coffeescript/tree/master/documentation/site)<br>\n    The CoffeeScript logo is available in SVG for use in presentations.\n"
  },
  {
    "path": "documentation/sections/screencasts.md",
    "content": "## Screencasts\n\n*   [A Sip of CoffeeScript](http://coffeescript.codeschool.com/) is a [Code School Course](https://www.codeschool.com) which combines 6 screencasts with in-browser coding to make learning fun. The first level is free to try out.\n*   [Meet CoffeeScript](https://www.pluralsight.com/courses/meet-coffeescript) is a 75-minute long screencast by PeepCode, now [PluralSight](https://www.pluralsight.com/). Highly memorable for its animations which demonstrate transforming CoffeeScript into the equivalent JS.\n*   If you’re looking for less of a time commitment, RailsCasts’ [CoffeeScript Basics](http://railscasts.com/episodes/267-coffeescript-basics) should have you covered, hitting all of the important notes about CoffeeScript in 11 minutes.\n"
  },
  {
    "path": "documentation/sections/scripts.md",
    "content": "## `\"text/coffeescript\"` Script Tags\n\nWhile it’s not recommended for serious use, CoffeeScripts may be included directly within the browser using `<script type=\"text/coffeescript\">` tags. The source includes a compressed and minified version of the compiler ([Download current version here, 77k when gzipped](/v<%= majorVersion %>/browser-compiler-legacy/coffeescript.js)) as `docs/v<%= majorVersion %>/browser-compiler-legacy/coffeescript.js`. Include this file on a page with inline CoffeeScript tags, and it will compile and evaluate them in order.\n\nThe usual caveats about CoffeeScript apply — your inline scripts will run within a closure wrapper, so if you want to expose global variables or functions, attach them to the `window` object.\n"
  },
  {
    "path": "documentation/sections/slices.md",
    "content": "## Array Slicing and Splicing with Ranges\n\nRanges can also be used to extract slices of arrays. With two dots (`3..6`), the range is inclusive (`3, 4, 5, 6`); with three dots (`3...6`), the range excludes the end (`3, 4, 5`). Slices indices have useful defaults. An omitted first index defaults to zero and an omitted second index defaults to the size of the array.\n\n```\ncodeFor('slices', 'middle')\n```\n\nThe same syntax can be used with assignment to replace a segment of an array with new values, splicing it.\n\n```\ncodeFor('splices', 'numbers')\n```\n\nNote that JavaScript strings are immutable, and can’t be spliced.\n"
  },
  {
    "path": "documentation/sections/source_maps.md",
    "content": "## Source Maps\n\nCoffeeScript includes support for generating source maps, a way to tell your JavaScript engine what part of your CoffeeScript program matches up with the code being evaluated. Browsers that support it can automatically use source maps to show your original source code in the debugger. To generate source maps alongside your JavaScript files, pass the `--map` or `-m` flag to the compiler.\n\nFor a full introduction to source maps, how they work, and how to hook them up in your browser, read the [HTML5 Tutorial](https://www.html5rocks.com/en/tutorials/developertools/sourcemaps/).\n"
  },
  {
    "path": "documentation/sections/splats.md",
    "content": "## Splats, or Rest Parameters/Spread Syntax\n\nThe JavaScript `arguments` object is a useful way to work with functions that accept variable numbers of arguments. CoffeeScript provides splats `...`, both for function definition as well as invocation, making variable numbers of arguments a little bit more palatable. ES2015 adopted this feature as their [rest parameters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters).\n\n```\ncodeFor('splats', true)\n```\n\n<div id=\"array-spread\" class=\"bookmark\"></div>\n\nSplats also let us elide array elements...\n\n```\ncodeFor('array_spread', 'all')\n```\n\n<div id=\"object-spread\" class=\"bookmark\"></div>\n\n...and object properties.\n\n```\ncodeFor('object_spread', 'JSON.stringify(currentUser)')\n```\n\nIn ECMAScript this is called [spread syntax](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator), and has been supported for arrays since ES2015 and objects since ES2018."
  },
  {
    "path": "documentation/sections/strings.md",
    "content": "## Strings\n\nLike JavaScript and many other languages, CoffeeScript supports strings as delimited by the `\"` or `'` characters. CoffeeScript also supports string interpolation within `\"`-quoted strings, using `#{ … }`. Single-quoted strings are literal. You may even use interpolation in object keys.\n\n```\ncodeFor('interpolation', 'sentence')\n```\n\nMultiline strings are allowed in CoffeeScript. Lines are joined by a single space unless they end with a backslash. Indentation is ignored.\n\n```\ncodeFor('strings', 'mobyDick')\n```\n\nBlock strings, delimited by `\"\"\"` or `'''`, can be used to hold formatted or indentation-sensitive text (or, if you just don’t feel like escaping quotes and apostrophes). The indentation level that begins the block is maintained throughout, so you can keep it all aligned with the body of your code.\n\n```\ncodeFor('heredocs', 'html')\n```\n\nDouble-quoted block strings, like other double-quoted strings, allow interpolation.\n"
  },
  {
    "path": "documentation/sections/switch.md",
    "content": "## Switch/When/Else\n\n`switch` statements in JavaScript are a bit awkward. You need to remember to `break` at the end of every `case` statement to avoid accidentally falling through to the default case. CoffeeScript prevents accidental fall-through, and can convert the `switch` into a returnable, assignable expression. The format is: `switch` condition, `when` clauses, `else` the default case.\n\nAs in Ruby, `switch` statements in CoffeeScript can take multiple values for each `when` clause. If any of the values match, the clause runs.\n\n```\ncodeFor('switch')\n```\n\n`switch` statements can also be used without a control expression, turning them in to a cleaner alternative to `if`/`else` chains.\n\n```\ncodeFor('switch_with_no_expression')\n```\n"
  },
  {
    "path": "documentation/sections/tagged_template_literals.md",
    "content": "## Tagged Template Literals\n\nCoffeeScript supports [ES2015 tagged template literals](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals#Tagged_template_literals), which enable customized string interpolation. If you immediately prefix a string with a function name (no space between the two), CoffeeScript will output this “function plus string” combination as an ES2015 tagged template literal, which will [behave accordingly](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Template_literals#Tagged_template_literals): the function is called, with the parameters being the input text and expression parts that make up the interpolated string. The function can then assemble these parts into an output string, providing custom string interpolation.\n\n```\ncodeFor('tagged_template_literals', 'greet(\"greg\", \"awesome\")')\n```\n"
  },
  {
    "path": "documentation/sections/test.md",
    "content": "## Browser-based Tests\n\nCoffeeScript includes an extensive test suite, which verifies that the compiler generates JavaScript that behaves as it should. The tests canonically run via the Node runtime, and must all pass there before we consider publishing a new release of CoffeeScript; but you can also run the tests in a web browser. This can be a good way to determine which features of CoffeeScript your current browser may not support. In general, the latest version of [Google Chrome Canary](https://www.google.com/chrome/browser/canary.html) should pass all the tests.\n\nNote that since no JavaScript runtime yet supports ES2015 modules, the tests for module support verify only that the CoffeeScript compiler’s output is the correct syntax; the tests don’t verify that the modules resolve properly.\n\n[Run the tests in your browser.](test.html)\n"
  },
  {
    "path": "documentation/sections/transpilation.md",
    "content": "### Transpilation\n\nCoffeeScript 2 generates JavaScript that uses the latest, modern syntax. The runtime or browsers where you want your code to run [might not support all of that syntax](#compatibility). In that case, we want to convert modern JavaScript into older JavaScript that will run in older versions of Node or older browsers; for example, `{ a } = obj` into `a = obj.a`. This is done via transpilers like [Babel](http://babeljs.io/), [Bublé](https://buble.surge.sh/) or [Traceur Compiler](https://github.com/google/traceur-compiler). See [Build Tools](#build-tools).\n\n#### Quickstart\n\nFrom the root of your project:\n\n```bash\nnpm install --save-dev @babel/core @babel/preset-env\necho '{ \"presets\": [\"@babel/env\"] }' > .babelrc\ncoffee --compile --transpile --inline-map some-file.coffee\n```\n\n#### Transpiling with the CoffeeScript compiler\n\nTo make things easy, CoffeeScript has built-in support for the popular [Babel](http://babeljs.io/) transpiler. You can use it via the `--transpile` command-line option or the `transpile` Node API option. To use either, `@babel/core` must be installed in your project:\n\n```bash\nnpm install --save-dev @babel/core\n```\n\nOr if you’re running the `coffee` command outside of a project folder, using a globally-installed `coffeescript` module, `@babel/core` needs to be installed globally:\n\n```bash\nnpm install --global @babel/core\n```\n\nBy default, Babel doesn’t do anything—it doesn’t make assumptions about what you want to transpile to. You need to provide it with a configuration so that it knows what to do. One way to do this is by creating a [`.babelrc` file](https://babeljs.io/docs/usage/babelrc/) in the folder containing the files you’re compiling, or in any parent folder up the path above those files. (Babel supports [other ways](https://babeljs.io/docs/usage/babelrc/), too.) A minimal `.babelrc` file would be just `{ \"presets\": [\"@babel/env\"] }`. This implies that you have installed [`@babel/preset-env`](https://babeljs.io/docs/plugins/preset-env/):\n\n```bash\nnpm install --save-dev @babel/preset-env  # Or --global for non-project-based usage\n```\n\nSee [Babel’s website to learn about presets and plugins](https://babeljs.io/docs/plugins/) and the multitude of options you have. Another preset you might need is [`@babel/plugin-transform-react-jsx`](https://babeljs.io/docs/en/babel-plugin-transform-react-jsx/) if you’re using JSX with React (JSX can also be used with other frameworks).\n\nOnce you have `@babel/core` and `@babel/preset-env` (or other presets or plugins) installed, and a `.babelrc` file (or other equivalent) in place, you can use `coffee --transpile` to pipe CoffeeScript’s output through Babel using the options you’ve saved.\n\nIf you’re using CoffeeScript via the [Node API](nodejs_usage), where you call `CoffeeScript.compile` with a string to be compiled and an `options` object, the `transpile` key of the `options` object should be the Babel options:\n\n```js\nCoffeeScript.compile(code, {transpile: {presets: ['@babel/env']}})\n```\n\nYou can also transpile CoffeeScript’s output without using the `transpile` option, for example as part of a build chain. This lets you use transpilers other than Babel, and it gives you greater control over the process. There are many great task runners for setting up JavaScript build chains, such as [Gulp](http://gulpjs.com/), [Webpack](https://webpack.github.io/), [Grunt](https://gruntjs.com/) and [Broccoli](http://broccolijs.com/).\n\n#### Polyfills\n\nNote that transpiling doesn’t automatically supply [polyfills](https://developer.mozilla.org/en-US/docs/Glossary/Polyfill) for your code. CoffeeScript itself will output [`Array.indexOf`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) if you use the `in` operator, or destructuring or spread/rest syntax; and [`Function.bind`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind) if you use a bound (`=>`) method in a class. Both are supported in Internet Explorer 9+ and all more recent browsers, but you will need to supply polyfills if you need to support Internet Explorer 8 or below and are using features that would cause these methods to be output. You’ll also need to supply polyfills if your own code uses these methods or another method added in recent versions of JavaScript. One polyfill option is [`@babel/polyfill`](https://babeljs.io/docs/en/babel-polyfill/), though there are many [other](https://hackernoon.com/polyfills-everything-you-ever-wanted-to-know-or-maybe-a-bit-less-7c8de164e423) [strategies](https://philipwalton.com/articles/loading-polyfills-only-when-needed/).\n"
  },
  {
    "path": "documentation/sections/try.md",
    "content": "## Try/Catch/Finally\n\n`try` expressions have the same semantics as `try` statements in JavaScript, though in CoffeeScript, you may omit _both_ the catch and finally parts. The catch part may also omit the error parameter if it is not needed.\n\n```\ncodeFor('try')\n```\n"
  },
  {
    "path": "documentation/sections/type_annotations.md",
    "content": "## Type Annotations\n\nStatic type checking can be achieved in CoffeeScript by using [Flow](https://flow.org/)’s [Comment Types syntax](https://flow.org/en/docs/types/comments/):\n\n```\ncodeFor('type_annotations')\n```\n\nCoffeeScript does not do any type checking itself; the JavaScript output you see above needs to get passed to Flow for it to validate your code. We expect most people will use a [build tool](#es2015plus-output) for this, but here’s how to do it the simplest way possible using the [CoffeeScript](#cli) and [Flow](https://flow.org/en/docs/usage/) command-line tools, assuming you’ve already [installed Flow](https://flow.org/en/docs/install/) and the [latest CoffeeScript](#installation) in your project folder:\n\n```bash\ncoffee --bare --no-header --compile app.coffee && npm run flow\n```\n\n`--bare` and `--no-header` are important because Flow requires the first line of the file to be the comment `// @flow`. If you configure your build chain to compile CoffeeScript and pass the result to Flow in-memory, you can get better performance than this example; and a proper build tool should be able to watch your CoffeeScript files and recompile and type-check them for you on save.\n\nIf you know of another way to achieve static type checking with CoffeeScript, please [create an issue](https://github.com/jashkenas/coffeescript/issues/new) and let us know."
  },
  {
    "path": "documentation/sections/unsupported.md",
    "content": "## Unsupported ECMAScript Features\n\nThere are a few ECMAScript features that CoffeeScript intentionally doesn’t support.\n"
  },
  {
    "path": "documentation/sections/unsupported_get_set.md",
    "content": "### `get` and `set` keyword shorthand syntax\n\n`get` and `set`, as keywords preceding functions or class methods, are intentionally unimplemented in CoffeeScript.\n\nThis is to avoid grammatical ambiguity, since in CoffeeScript such a construct looks identical to a function call (e.g. `get(function foo() {})`); and because there is an [alternate syntax](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) that is slightly more verbose but just as effective:\n\n```\ncodeFor('get_set', 'screen.height')\n```\n"
  },
  {
    "path": "documentation/sections/unsupported_let_const.md",
    "content": "### `let` and `const`: block-scoped and reassignment-protected variables\n\nWhen CoffeeScript was designed, `var` was [intentionally omitted](https://github.com/jashkenas/coffeescript/issues/238#issuecomment-153502). This was to spare developers the mental housekeeping of needing to worry about variable _declaration_ (`var foo`) as opposed to variable _assignment_ (`foo = 1`). The CoffeeScript compiler automatically takes care of declaration for you, by generating `var` statements at the top of every function scope. This makes it impossible to accidentally declare a global variable.\n\n`let` and `const` add a useful ability to JavaScript in that you can use them to declare variables within a _block_ scope, for example within an `if` statement body or a `for` loop body, whereas `var` always declares variables in the scope of an entire function. When CoffeeScript 2 was designed, there was much discussion of whether this functionality was useful enough to outweigh the simplicity offered by never needing to consider variable declaration in CoffeeScript. In the end, it was decided that the simplicity was more valued. In CoffeeScript there remains only one type of variable.\n\nKeep in mind that `const` only protects you from _reassigning_ a variable; it doesn’t prevent the variable’s value from changing, the way constants usually do in other languages:\n\n```js\nconst obj = {foo: 'bar'};\nobj.foo = 'baz'; // Allowed!\nobj = {}; // Throws error\n```\n"
  },
  {
    "path": "documentation/sections/unsupported_named_functions.md",
    "content": "### Named functions and function declarations\n\nNewcomers to CoffeeScript often wonder how to generate the JavaScript `function foo() {}`, as opposed to the `foo = function() {}` that CoffeeScript produces. The first form is a [function declaration](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function), and the second is a [function expression](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function). As stated above, in CoffeeScript [everything is an expression](#expressions), so naturally we favor the expression form. Supporting only one variant helps avoid confusing bugs that can arise from the [subtle differences between the two forms](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function#Function_declaration_hoisting).\n\nTechnically, `foo = function() {}` is creating an anonymous function that gets assigned to a variable named `foo`. Some very early versions of CoffeeScript named this function, e.g. `foo = function foo() {}`, but this was dropped because of compatibility issues with Internet Explorer. For a while this annoyed people, as these functions would be unnamed in stack traces; but modern JavaScript runtimes [infer the names of such anonymous functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name) from the names of the variables to which they’re assigned. Given that this is the case, it’s simplest to just preserve the current behavior.\n"
  },
  {
    "path": "documentation/sections/usage.md",
    "content": "## Usage\n"
  },
  {
    "path": "documentation/sections/whats_new_in_coffeescript_2.md",
    "content": "### What’s New In CoffeeScript 2?\n\nThe biggest change in CoffeeScript 2 is that now the CoffeeScript compiler produces modern JavaScript syntax (ES6, or ES2015 and later). A CoffeeScript `=>` becomes a JS `=>`, a CoffeeScript `class` becomes a JS `class` and so on. Major new features in CoffeeScript 2 include [async functions](#async-functions) and [JSX](#jsx). You can read more in the [announcement](announcing-coffeescript-2/).\n\nThere are very few [breaking changes from CoffeeScript 1.x to 2](#breaking-changes); we hope the upgrade process is smooth for most projects.\n"
  },
  {
    "path": "documentation/site/body.html",
    "content": "<%= include('navbar.html') %>\n\n<%= include('try.html') %>\n\n<div class=\"container-fluid\" id=\"top\">\n  <div class=\"row flex-nowrap main-row\">\n    <nav class=\"sidebar bg-ribbed-light\">\n      <%= include('sidebar.html') %>\n    </nav>\n    <main class=\"main\">\n      <header class=\"d-none d-lg-block\">\n        <p class=\"title-logo\">\n          <%= include('logo.svg') %>\n        </p>\n      </header>\n      <section id=\"introduction\">\n        <%= htmlFor('introduction') %>\n      </section>\n      <section id=\"overview\">\n        <%= htmlFor('overview') %>\n      </section>\n      <section id=\"coffeescript-2\">\n        <%= htmlFor('coffeescript_2') %>\n        <section id=\"whats-new-in-coffeescript-2\">\n          <%= htmlFor('whats_new_in_coffeescript_2') %>\n        </section>\n        <section id=\"compatibility\">\n          <%= htmlFor('compatibility') %>\n        </section>\n      </section>\n      <section id=\"installation\">\n        <%= htmlFor('installation') %>\n      </section>\n      <section id=\"usage\">\n        <%= htmlFor('usage') %>\n        <section id=\"cli\">\n          <%= htmlFor('command_line_interface') %>\n        </section>\n        <section id=\"nodejs-usage\">\n          <%= htmlFor('nodejs_usage') %>\n        </section>\n        <section id=\"transpilation\">\n          <%= htmlFor('transpilation') %>\n        </section>\n      </section>\n      <section id=\"language\">\n        <%= htmlFor('language') %>\n        <section id=\"functions\">\n          <%= htmlFor('functions') %>\n        </section>\n        <section id=\"strings\">\n          <%= htmlFor('strings') %>\n        </section>\n        <section id=\"objects-and-arrays\">\n          <%= htmlFor('objects_and_arrays') %>\n        </section>\n        <section id=\"comments\">\n          <%= htmlFor('comments') %>\n        </section>\n        <section id=\"lexical-scope\">\n          <%= htmlFor('lexical_scope') %>\n        </section>\n        <section id=\"conditionals\">\n          <%= htmlFor('conditionals') %>\n        </section>\n        <section id=\"splats\">\n          <%= htmlFor('splats') %>\n        </section>\n        <section id=\"loops\">\n          <%= htmlFor('loops') %>\n        </section>\n        <section id=\"slices\">\n          <%= htmlFor('slices') %>\n        </section>\n        <section id=\"expressions\">\n          <%= htmlFor('expressions') %>\n        </section>\n        <section id=\"operators\">\n          <%= htmlFor('operators') %>\n        </section>\n        <section id=\"existential-operator\">\n          <%= htmlFor('existential_operator') %>\n        </section>\n        <section id=\"chaining\">\n          <%= htmlFor('chaining') %>\n        </section>\n        <section id=\"destructuring\">\n          <%= htmlFor('destructuring') %>\n        </section>\n        <section id=\"fat-arrow\">\n          <%= htmlFor('fat_arrow') %>\n        </section>\n        <section id=\"generators\">\n          <%= htmlFor('generators') %>\n        </section>\n        <section id=\"async-functions\">\n          <%= htmlFor('async_functions') %>\n        </section>\n        <section id=\"classes\">\n          <%= htmlFor('classes') %>\n        </section>\n        <section id=\"prototypal-inheritance\">\n          <%= htmlFor('prototypal_inheritance') %>\n        </section>\n        <section id=\"switch\">\n          <%= htmlFor('switch') %>\n        </section>\n        <section id=\"try-catch\">\n          <%= htmlFor('try') %>\n        </section>\n        <section id=\"comparisons\">\n          <%= htmlFor('comparisons') %>\n        </section>\n        <section id=\"regexes\">\n          <%= htmlFor('heregexes') %>\n        </section>\n        <section id=\"tagged-template-literals\">\n          <%= htmlFor('tagged_template_literals') %>\n        </section>\n        <section id=\"modules\">\n          <%= htmlFor('modules') %>\n        </section>\n        <section id=\"embedded\">\n          <%= htmlFor('embedded') %>\n        </section>\n        <section id=\"jsx\">\n          <%= htmlFor('jsx') %>\n        </section>\n      </section>\n      <section id=\"type-annotations\">\n        <%= htmlFor('type_annotations') %>\n      </section>\n      <section id=\"literate\">\n        <%= htmlFor('literate') %>\n      </section>\n      <section id=\"source-maps\">\n        <%= htmlFor('source_maps') %>\n      </section>\n      <section id=\"cake\">\n        <%= htmlFor('cake') %>\n      </section>\n      <section id=\"scripts\">\n        <%= htmlFor('scripts') %>\n      </section>\n      <section id=\"integrations\">\n        <%= htmlFor('integrations') %>\n        <section id=\"build-tools\">\n          <%= htmlFor('integrations_build_tools') %>\n        </section>\n        <section id=\"code-editors\">\n          <%= htmlFor('integrations_code_editors') %>\n        </section>\n        <section id=\"frameworks\">\n          <%= htmlFor('integrations_frameworks') %>\n        </section>\n        <section id=\"linters-and-formatting\">\n          <%= htmlFor('integrations_linters_and_formatting') %>\n        </section>\n        <section id=\"testing\">\n          <%= htmlFor('integrations_testing') %>\n        </section>\n      </section>\n      <section id=\"resources\">\n        <%= htmlFor('resources') %>\n        <section id=\"books\">\n          <%= htmlFor('books') %>\n        </section>\n        <section id=\"screencasts\">\n          <%= htmlFor('screencasts') %>\n        </section>\n        <section id=\"examples\">\n          <%= htmlFor('examples') %>\n        </section>\n        <section id=\"chat\">\n          <%= htmlFor('chat') %>\n        </section>\n        <section id=\"annotated-source\">\n          <%= htmlFor('annotated_source') %>\n        </section>\n        <section id=\"contributing\">\n          <%= htmlFor('contributing') %>\n        </section>\n      </section>\n      <section id=\"unsupported\">\n        <%= htmlFor('unsupported') %>\n        <section id=\"unsupported-let-const\">\n          <%= htmlFor('unsupported_let_const') %>\n        </section>\n        <section id=\"unsupported-named-functions\">\n          <%= htmlFor('unsupported_named_functions') %>\n        </section>\n        <section id=\"unsupported-get-set\">\n          <%= htmlFor('unsupported_get_set') %>\n        </section>\n      </section>\n      <section id=\"breaking-changes\">\n        <%= htmlFor('breaking_changes') %>\n        <section id=\"breaking-changes-fat-arrow\">\n          <%= htmlFor('breaking_changes_fat_arrow') %>\n        </section>\n        <section id=\"breaking-changes-default-values\">\n          <%= htmlFor('breaking_changes_default_values') %>\n        </section>\n        <section id=\"breaking-changes-bound-generator-functions\">\n          <%= htmlFor('breaking_changes_bound_generator_functions') %>\n        </section>\n        <section id=\"breaking-changes-classes\">\n          <%= htmlFor('breaking_changes_classes') %>\n        </section>\n        <section id=\"breaking-changes-super-this\">\n          <%= htmlFor('breaking_changes_super_this') %>\n        </section>\n        <section id=\"breaking-changes-super-extends\">\n          <%= htmlFor('breaking_changes_super_extends') %>\n        </section>\n        <section id=\"breaking-changes-jsx-and-the-less-than-and-greater-than-operators\">\n          <%= htmlFor('breaking_changes_jsx_and_the_less_than_and_greater_than_operators') %>\n        </section>\n        <section id=\"breaking-changes-literate-coffeescript\">\n          <%= htmlFor('breaking_changes_literate_coffeescript') %>\n        </section>\n        <section id=\"breaking-changes-argument-parsing-and-shebang-lines\">\n          <%= htmlFor('breaking_changes_argument_parsing_and_shebang_lines') %>\n        </section>\n      </section>\n      <section id=\"changelog\">\n        <%= htmlFor('changelog') %>\n        <section id=\"2.7.0\">\n          <%= htmlFor('changelog/2.7.0') %>\n        </section>\n        <section id=\"2.6.1\">\n          <%= htmlFor('changelog/2.6.1') %>\n        </section>\n        <section id=\"2.6.0\">\n          <%= htmlFor('changelog/2.6.0') %>\n        </section>\n        <section id=\"2.5.1\">\n          <%= htmlFor('changelog/2.5.1') %>\n        </section>\n        <section id=\"2.5.0\">\n          <%= htmlFor('changelog/2.5.0') %>\n        </section>\n        <section id=\"2.4.1\">\n          <%= htmlFor('changelog/2.4.1') %>\n        </section>\n        <section id=\"2.4.0\">\n          <%= htmlFor('changelog/2.4.0') %>\n        </section>\n        <section id=\"2.3.2\">\n          <%= htmlFor('changelog/2.3.2') %>\n        </section>\n        <section id=\"2.3.1\">\n          <%= htmlFor('changelog/2.3.1') %>\n        </section>\n        <section id=\"2.3.0\">\n          <%= htmlFor('changelog/2.3.0') %>\n        </section>\n        <section id=\"2.2.4\">\n          <%= htmlFor('changelog/2.2.4') %>\n        </section>\n        <section id=\"2.2.3\">\n          <%= htmlFor('changelog/2.2.3') %>\n        </section>\n        <section id=\"2.2.2\">\n          <%= htmlFor('changelog/2.2.2') %>\n        </section>\n        <section id=\"2.2.1\">\n          <%= htmlFor('changelog/2.2.1') %>\n        </section>\n        <section id=\"2.2.0\">\n          <%= htmlFor('changelog/2.2.0') %>\n        </section>\n        <section id=\"2.1.1\">\n          <%= htmlFor('changelog/2.1.1') %>\n        </section>\n        <section id=\"2.1.0\">\n          <%= htmlFor('changelog/2.1.0') %>\n        </section>\n        <section id=\"2.0.3\">\n          <%= htmlFor('changelog/2.0.3') %>\n        </section>\n        <section id=\"2.0.2\">\n          <%= htmlFor('changelog/2.0.2') %>\n        </section>\n        <section id=\"2.0.1\">\n          <%= htmlFor('changelog/2.0.1') %>\n        </section>\n        <section id=\"2.0.0\">\n          <%= htmlFor('changelog/2.0.0') %>\n        </section>\n        <section id=\"2.0.0-beta5\">\n          <%= htmlFor('changelog/2.0.0-beta5') %>\n        </section>\n        <section id=\"2.0.0-beta4\">\n          <%= htmlFor('changelog/2.0.0-beta4') %>\n        </section>\n        <section id=\"2.0.0-beta3\">\n          <%= htmlFor('changelog/2.0.0-beta3') %>\n        </section>\n        <section id=\"2.0.0-beta2\">\n          <%= htmlFor('changelog/2.0.0-beta2') %>\n        </section>\n        <section id=\"2.0.0-beta1\">\n          <%= htmlFor('changelog/2.0.0-beta1') %>\n        </section>\n        <section id=\"2.0.0-alpha1\">\n          <%= htmlFor('changelog/2.0.0-alpha1') %>\n        </section>\n        <section id=\"1.12.7\">\n          <%= htmlFor('changelog/1.12.7') %>\n        </section>\n        <section id=\"1.12.6\">\n          <%= htmlFor('changelog/1.12.6') %>\n        </section>\n        <section id=\"1.12.5\">\n          <%= htmlFor('changelog/1.12.5') %>\n        </section>\n        <section id=\"1.12.4\">\n          <%= htmlFor('changelog/1.12.4') %>\n        </section>\n        <section id=\"1.12.3\">\n          <%= htmlFor('changelog/1.12.3') %>\n        </section>\n        <section id=\"1.12.2\">\n          <%= htmlFor('changelog/1.12.2') %>\n        </section>\n        <section id=\"1.12.1\">\n          <%= htmlFor('changelog/1.12.1') %>\n        </section>\n        <section id=\"1.12.0\">\n          <%= htmlFor('changelog/1.12.0') %>\n        </section>\n        <section id=\"1.11.1\">\n          <%= htmlFor('changelog/1.11.1') %>\n        </section>\n        <section id=\"1.11.0\">\n          <%= htmlFor('changelog/1.11.0') %>\n        </section>\n        <section id=\"1.10.0\">\n          <%= htmlFor('changelog/1.10.0') %>\n        </section>\n        <section id=\"1.9.3\">\n          <%= htmlFor('changelog/1.9.3') %>\n        </section>\n        <section id=\"1.9.2\">\n          <%= htmlFor('changelog/1.9.2') %>\n        </section>\n        <section id=\"1.9.1\">\n          <%= htmlFor('changelog/1.9.1') %>\n        </section>\n        <section id=\"1.9.0\">\n          <%= htmlFor('changelog/1.9.0') %>\n        </section>\n        <section id=\"1.8.0\">\n          <%= htmlFor('changelog/1.8.0') %>\n        </section>\n        <section id=\"1.7.1\">\n          <%= htmlFor('changelog/1.7.1') %>\n        </section>\n        <section id=\"1.7.0\">\n          <%= htmlFor('changelog/1.7.0') %>\n        </section>\n        <section id=\"1.6.3\">\n          <%= htmlFor('changelog/1.6.3') %>\n        </section>\n        <section id=\"1.6.2\">\n          <%= htmlFor('changelog/1.6.2') %>\n        </section>\n        <section id=\"1.6.1\">\n          <%= htmlFor('changelog/1.6.1') %>\n        </section>\n        <section id=\"1.5.0\">\n          <%= htmlFor('changelog/1.5.0') %>\n        </section>\n        <section id=\"1.4.0\">\n          <%= htmlFor('changelog/1.4.0') %>\n        </section>\n        <section id=\"1.3.3\">\n          <%= htmlFor('changelog/1.3.3') %>\n        </section>\n        <section id=\"1.3.1\">\n          <%= htmlFor('changelog/1.3.1') %>\n        </section>\n        <section id=\"1.2.0\">\n          <%= htmlFor('changelog/1.2.0') %>\n        </section>\n        <section id=\"1.1.3\">\n          <%= htmlFor('changelog/1.1.3') %>\n        </section>\n        <section id=\"1.1.2\">\n          <%= htmlFor('changelog/1.1.2') %>\n        </section>\n        <section id=\"1.1.1\">\n          <%= htmlFor('changelog/1.1.1') %>\n        </section>\n        <section id=\"1.1.0\">\n          <%= htmlFor('changelog/1.1.0') %>\n        </section>\n        <section id=\"1.0.1\">\n          <%= htmlFor('changelog/1.0.1') %>\n        </section>\n        <section id=\"1.0.0\">\n          <%= htmlFor('changelog/1.0.0') %>\n        </section>\n        <section id=\"0.9.6\">\n          <%= htmlFor('changelog/0.9.6') %>\n        </section>\n        <section id=\"0.9.5\">\n          <%= htmlFor('changelog/0.9.5') %>\n        </section>\n        <section id=\"0.9.4\">\n          <%= htmlFor('changelog/0.9.4') %>\n        </section>\n        <section id=\"0.9.3\">\n          <%= htmlFor('changelog/0.9.3') %>\n        </section>\n        <section id=\"0.9.2\">\n          <%= htmlFor('changelog/0.9.2') %>\n        </section>\n        <section id=\"0.9.1\">\n          <%= htmlFor('changelog/0.9.1') %>\n        </section>\n        <section id=\"0.9.0\">\n          <%= htmlFor('changelog/0.9.0') %>\n        </section>\n        <section id=\"0.7.2\">\n          <%= htmlFor('changelog/0.7.2') %>\n        </section>\n        <section id=\"0.7.1\">\n          <%= htmlFor('changelog/0.7.1') %>\n        </section>\n        <section id=\"0.7.0\">\n          <%= htmlFor('changelog/0.7.0') %>\n        </section>\n        <section id=\"0.6.2\">\n          <%= htmlFor('changelog/0.6.2') %>\n        </section>\n        <section id=\"0.6.1\">\n          <%= htmlFor('changelog/0.6.1') %>\n        </section>\n        <section id=\"0.6.0\">\n          <%= htmlFor('changelog/0.6.0') %>\n        </section>\n        <section id=\"0.5.6\">\n          <%= htmlFor('changelog/0.5.6') %>\n        </section>\n        <section id=\"0.5.5\">\n          <%= htmlFor('changelog/0.5.5') %>\n        </section>\n        <section id=\"0.5.4\">\n          <%= htmlFor('changelog/0.5.4') %>\n        </section>\n        <section id=\"0.5.3\">\n          <%= htmlFor('changelog/0.5.3') %>\n        </section>\n        <section id=\"0.5.2\">\n          <%= htmlFor('changelog/0.5.2') %>\n        </section>\n        <section id=\"0.5.1\">\n          <%= htmlFor('changelog/0.5.1') %>\n        </section>\n        <section id=\"0.5.0\">\n          <%= htmlFor('changelog/0.5.0') %>\n        </section>\n        <section id=\"0.3.2\">\n          <%= htmlFor('changelog/0.3.2') %>\n        </section>\n        <section id=\"0.3.0\">\n          <%= htmlFor('changelog/0.3.0') %>\n        </section>\n        <section id=\"0.2.6\">\n          <%= htmlFor('changelog/0.2.6') %>\n        </section>\n        <section id=\"0.2.5\">\n          <%= htmlFor('changelog/0.2.5') %>\n        </section>\n        <section id=\"0.2.4\">\n          <%= htmlFor('changelog/0.2.4') %>\n        </section>\n        <section id=\"0.2.3\">\n          <%= htmlFor('changelog/0.2.3') %>\n        </section>\n        <section id=\"0.2.2\">\n          <%= htmlFor('changelog/0.2.2') %>\n        </section>\n        <section id=\"0.2.1\">\n          <%= htmlFor('changelog/0.2.1') %>\n        </section>\n        <section id=\"0.2.0\">\n          <%= htmlFor('changelog/0.2.0') %>\n        </section>\n        <section id=\"0.1.6\">\n          <%= htmlFor('changelog/0.1.6') %>\n        </section>\n        <section id=\"0.1.5\">\n          <%= htmlFor('changelog/0.1.5') %>\n        </section>\n        <section id=\"0.1.4\">\n          <%= htmlFor('changelog/0.1.4') %>\n        </section>\n        <section id=\"0.1.3\">\n          <%= htmlFor('changelog/0.1.3') %>\n        </section>\n        <section id=\"0.1.2\">\n          <%= htmlFor('changelog/0.1.2') %>\n        </section>\n        <section id=\"0.1.1\">\n          <%= htmlFor('changelog/0.1.1') %>\n        </section>\n        <section id=\"0.1.0\">\n          <%= htmlFor('changelog/0.1.0') %>\n        </section>\n      </section>\n    </main>\n  </div>\n</div>\n"
  },
  {
    "path": "documentation/site/code.coffee",
    "content": "fs           = require 'fs'\n_            = require 'underscore'\n\n# Use CodeMirror in Node for syntax highlighting, per\n# https://github.com/codemirror/CodeMirror/blob/master/bin/source-highlight\nCodeMirror   = require 'codemirror/addon/runmode/runmode.node.js'\nrequire 'codemirror/mode/coffeescript/coffeescript.js'\nrequire 'codemirror/mode/javascript/javascript.js'\n\nCoffeeScript = require '../../lib/coffeescript'\n\n\nmodule.exports = ->\n  (file, run = no) ->\n    cs = fs.readFileSync \"documentation/examples/#{file}.coffee\", 'utf-8'\n    js = CoffeeScript.compile cs, bare: yes # This is just the initial JavaScript output; it is replaced by dynamic compilation on changes of the CoffeeScript pane.\n    render = _.template fs.readFileSync('documentation/site/code.html', 'utf-8')\n    include = (file) -> fs.readFileSync(\"documentation/site/#{file}\", 'utf-8')\n\n    highlight = (language, code) ->\n      # Adapted from https://github.com/codemirror/CodeMirror/blob/master/bin/source-highlight.\n      html = ''\n      curStyle = null\n      accum = ''\n\n      esc = (str) ->\n        str.replace /[<&]/g, (ch) ->\n          if ch is '&' then '&amp;' else '&lt;'\n\n      flush = ->\n        if curStyle\n          html += \"<span class=\\\"#{curStyle.replace /(^|\\s+)/g, '$1cm-'}\\\">#{esc accum}</span>\"\n        else\n          html += esc accum\n\n      CodeMirror.runMode code, {name: language}, (text, style) ->\n        if style isnt curStyle\n          flush()\n          curStyle = style\n          accum = text\n        else\n          accum += text\n      flush()\n\n      html\n\n    output = render {file, cs, js, highlight, include, run}\n"
  },
  {
    "path": "documentation/site/code.css",
    "content": "/* Adapted from https://github.com/FarhadG/code-mirror-themes/blob/master/themes/twilight.css and https://github.com/codemirror/CodeMirror/blob/master/theme/twilight.css */\n\n/* CodeMirror general styling */\n\n.CodeMirror,\n.placeholder-code {\n  /* https://codemirror.net/demo/resize.html */\n  height: auto;\n  background: transparent;\n  font-family: 'Roboto Mono';\n  font-weight: 400;\n  line-height: 1.25;\n  letter-spacing: 0.3px;\n  color: #f8f8f8;\n  /* Prevent mobile Safari from zooming in on our code editors; the code is 16px naturally, but somehow being explicit about it prevents the zooming */\n  font-size: 16px;\n}\n@media (min-width: 768px) {\n  .CodeMirror,\n  .placeholder-code {\n    font-size: 87.5%; /* Matching Bootstrap’s font size for code, which calculates to 14.4px */\n  }\n}\n.CodeMirror-lines {\n  padding: 0.5em 0;\n}\n.placeholder-code {\n  padding: 0.5em 4px;\n  margin-bottom: 1.37em;\n  white-space: pre-wrap;\n}\n.CodeMirror pre,\n.CodeMirror pre.CodeMirror-line,\npre.placeholder-code {\n  line-height: 1.4em;\n}\n.CodeMirror-code:focus {\n  outline: none;\n}\ndiv.CodeMirror-cursor {\n  border-left: 3px solid #f8f8f8;\n}\n.CodeMirror-activeline-background {\n  background: #ffffff08;\n}\n.CodeMirror-selected {\n  background: #ddf0ff33;\n}\n\n/* Syntax highlighting */\n\n.cm-keyword,\n.placeholder-code .keyword {\n  color: #cda869;\n}\n.cm-atom {\n  color: #dad085;\n}\n.cm-number,\n.cm-meta,\n.placeholder-code .number,\n.placeholder-code .built_in,\n.placeholder-code .builtin-name,\n.placeholder-code .literal,\n.placeholder-code .type,\n/*.placeholder-code .params,*/\n.placeholder-code .meta,\n.placeholder-code .link {\n  color: #dad085;\n}\n.cm-def {\n  color: #f8f8f8;\n}\nspan.cm-variable-2,\nspan.cm-tag {\n  color: #f8f8f8;\n}\nspan.cm-variable-3,\nspan.cm-def,\nspan.cm-type {\n  color: #f8f8f8;\n}\n.cm-operator,\n.placeholder-code .punctuation,\n.placeholder-code .symbol,\n.placeholder-code .bullet,\n.placeholder-code .addition,\n.placeholder-code .operator {\n  color: #cda869;\n}\n.cm-comment,\n.placeholder-code .comment {\n  font-style: italic;\n  color: #5f5a60;\n}\n.cm-string,\n.cm-string-2,\n.placeholder-code .string {\n  color: #8f9d6a;\n}\n.cm-property,\n.placeholder-code .attribute {\n  color: #dad085;\n}\n.cm-builtin {\n  color: #cda869;\n}\n.cm-tag {\n  color: #997643;\n}\n.cm-attribute {\n  color: #d6bb6d;\n}\n.cm-header {\n  color: #FF6400;\n}\n.cm-hr {\n  color: #AEAEAE;\n}\n.cm-link {\n  color: #ad9361;\n  font-style: italic;\n  text-decoration: none;\n}\n.cm-error {\n  border-bottom: 1px solid rgba(142, 22, 22, 0.67);\n}\n\n/* Uneditable code blocks are inverted, so use darker versions of the above */\n\n.uneditable-code-block code {\n  padding: 0;\n}\n\n.uneditable-code-block .comment {\n  font-style: italic;\n  color: #837B85;\n}\n.uneditable-code-block .class,\n.uneditable-code-block .function,\n.uneditable-code-block .keyword,\n.uneditable-code-block .reserved,\n.uneditable-code-block .title {\n  color: #534328;\n}\n.uneditable-code-block .string\n.uneditable-code-block .value\n.uneditable-code-block .inheritance\n.uneditable-code-block .header {\n  color: #3A4029;\n}\n.uneditable-code-block .variable,\n.uneditable-code-block .literal,\n.uneditable-code-block .tag,\n.uneditable-code-block .regexp,\n.uneditable-code-block .subst,\n.uneditable-code-block .property {\n  color: #474429;\n}\n.uneditable-code-block .number,\n.uneditable-code-block .preprocessor,\n.uneditable-code-block .built_in,\n.uneditable-code-block .params,\n.uneditable-code-block .constant {\n  color: #474429;\n}\n"
  },
  {
    "path": "documentation/site/code.html",
    "content": "<aside class=\"code-example container-fluid bg-ribbed-dark\" data-example=\"<%= file %>\">\n  <div class=\"row\">\n    <div class=\"col-md-6 coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"<%= file %>-coffee\"><%= cs %></textarea>\n      <pre class=\"placeholder-code\"><%= highlight('coffeescript', cs) %></pre>\n    </div>\n    <div class=\"col-md-6 javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"<%= file %>-js\"><%= js %></textarea>\n      <pre class=\"placeholder-code\"><%= highlight('javascript', js) %></pre>\n    </div>\n  </div>\n  <% if (run) { %>\n  <div class=\"row\">\n    <div class=\"col text-right\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"<%= file %>\" data-run=\"<%= escape(run) %>\"><small><%= include('play.svg') %></small><%= run === true ? '' : run.replace(/\"/g, '&quot;') %></button>\n    </div>\n  </div>\n  <% } %>\n</aside>\n"
  },
  {
    "path": "documentation/site/docs.coffee",
    "content": "unless window.location.origin # Polyfill `location.origin` for IE < 11\n  window.location.origin = \"#{window.location.protocol}//#{window.location.hostname}\"\n\n\n# Initialize Google Analytics\nwindow.GA_TRACKING_ID = 'UA-106156830-1'\nwindow.dataLayer ?= []\nwindow.gtag = ->\n  window.dataLayer.push arguments\n  return\nwindow.gtag 'js', new Date()\nwindow.gtag 'config', window.GA_TRACKING_ID\n\n\n# Initialize the CoffeeScript docs interactions\n$(document).ready ->\n  CoffeeScript.patchStackTrace()\n\n  # Format dates for the user’s locale, e.g. 'December 24, 2009' or '24 décembre 2009'\n  $('time').each (index, el) ->\n    date = el.dateTime or $(el).text()\n    formattedDate = new Date(date).toLocaleDateString undefined, # undefined to use browser locale\n      year: 'numeric'\n      month: 'long'\n      day: 'numeric'\n    $(el).text formattedDate.toString()\n\n\n  # Mobile navigation\n  toggleSidebar = ->\n    $('.navbar-toggler, .sidebar').toggleClass 'show'\n\n  $('[data-toggle=\"offcanvas\"]').click toggleSidebar\n\n  $('[data-action=\"sidebar-nav\"]').click (event) ->\n    if $('.navbar-toggler').is(':visible')\n      event.preventDefault()\n      toggleSidebar()\n      setTimeout ->\n        window.location = event.target.href\n      , 260 # Wait for the sidebar to slide away before navigating\n    gtag 'event', 'sidebar_navigate',\n      event_category: 'navigation'\n      event_label: event.target.href.replace window.location.origin, ''\n\n  # Initialize Scrollspy for sidebar navigation; https://getbootstrap.com/docs/4.0/components/scrollspy/\n  # See also http://www.codingeverything.com/2014/02/BootstrapDocsSideBar.html and http://jsfiddle.net/KyleMit/v6zhz/\n  $('.main').scrollspy\n    target: '#contents'\n    offset: Math.round $('main').css('padding-top').replace('px', '')\n\n  initializeScrollspyFromHash = (hash) ->\n    $(\"#contents a.active[href!='#{hash}']\").removeClass 'show'\n\n  $('.main').on 'activate.bs.scrollspy', (event, target) ->\n    # We only want one active link in the nav\n    $(\"#contents a.active[href!='#{target.relatedTarget}']\").removeClass 'show'\n    $target = $(\"#contents a[href='#{target.relatedTarget}']\")\n    return if $target.prop('href') is \"#{window.location.origin}/#try\"\n    # Update the browser address bar on scroll, without adding to the history; clicking the sidebar links will automatically add to the history\n    replaceState $target.prop('href')\n    # Track this as a new pageview; we only want '/#hash', not 'https://coffeescript.org/#hash'\n    gtag 'config', GA_TRACKING_ID,\n      page_path: $target.prop('href').replace window.location.origin, ''\n\n\n  # Initialize CodeMirror for code examples; https://codemirror.net/doc/manual.html\n  # Defer this until a code example is clicked or focused, to avoid unnecessary computation/slowness\n  textareas = []\n  editors = []\n  lastCompilationElapsedTime = 200\n  $('textarea').each (index) ->\n    textareas[index] = @\n    $(@).data 'index', index\n\n  initializeEditor = ($textarea) ->\n    index = $textarea.data 'index'\n    mode = if $textarea.hasClass('javascript-output') then 'javascript' else 'coffeescript'\n    editors[index] = editor = CodeMirror.fromTextArea $textarea[0],\n      mode: mode\n      theme: 'twilight'\n      indentUnit: 2\n      tabSize: 2\n      lineWrapping: on\n      lineNumbers: off\n      inputStyle: 'contenteditable'\n      readOnly: mode isnt 'coffeescript' # Can’t use 'nocursor' if we want the JavaScript to be copyable\n      viewportMargin: Infinity\n\n    # Whenever the user edits the CoffeeScript side of a code example, update the JavaScript output\n    # If the editor is Try CoffeeScript, also update the hash and save this code in localStorage\n    if mode is 'coffeescript'\n      pending = null\n      editor.on 'change', (instance, change) ->\n        clearTimeout pending\n        pending = setTimeout ->\n          lastCompilationStartTime = Date.now()\n          try\n            coffee = editor.getValue()\n            if index is 0 and $('#try').hasClass('show') # If this is the editor in Try CoffeeScript and it’s still visible\n              if $('#try').hasClass('show')\n                # Update the hash with the current code\n                link = \"try:#{encodeURIComponent coffee}\"\n                replaceState \"#{window.location.href.split('#')[0]}##{link}\"\n              # Save this to the user’s localStorage\n              try\n                if window.localStorage?\n                  window.localStorage.setItem 'tryCoffeeScriptCode', coffee\n              catch exception\n\n            js = CoffeeScript.compile coffee, bare: yes, inlineMap: true\n            # Inline map is added to adjust stack trace line numbers but we strip it from the displayed JS for visual clarity.\n            output = js.replace /(\\n\\/\\/# [^\\n]*){2}$/, \"\"\n            lastCompilationElapsedTime = Math.max(200, Date.now() - lastCompilationStartTime)\n          catch exception\n            output = \"#{exception}\"\n\n          editors[index + 1].js = js\n          editors[index + 1].setValue output\n\n          gtag 'event', 'edit_code',\n            event_category: 'engagement'\n            event_label: $textarea.closest('[data-example]').data('example')\n        , lastCompilationElapsedTime\n\n      # Fix the code editors’ handling of tab-indented code\n      editor.addKeyMap\n        'Tab': (cm) ->\n          if cm.somethingSelected()\n            cm.indentSelection 'add'\n          else if /^\\t/m.test cm.getValue()\n            # If any lines start with a tab, treat this as tab-indented code\n            cm.execCommand 'insertTab'\n          else\n            cm.execCommand 'insertSoftTab'\n        'Shift-Tab': (cm) ->\n          cm.indentSelection 'subtract'\n        'Enter': (cm) ->\n          cm.options.indentWithTabs = /^\\t/m.test cm.getValue()\n          cm.execCommand 'newlineAndIndent'\n\n  $('.placeholder-code').one 'mouseover', (event) ->\n    $textarea = $(@).prev 'textarea'\n    $(@).remove()\n    initializeEditor $textarea\n    # Initialize the sibling column too\n    $siblingColumn = $ $textarea.parent().siblings()[0]\n    $siblingColumn.children('.placeholder-code').remove()\n    initializeEditor $ $siblingColumn.children('textarea')[0]\n\n  initializeTryEditors = ->\n    initializeEditor $ '#try-coffeescript-coffee'\n    initializeEditor $ '#try-coffeescript-js'\n\n  # Handle the code example buttons\n  $('[data-action=\"run-code-example\"]').click ->\n    run = $(@).data 'run'\n    index = $(\"##{$(@).data('example')}-js\").data 'index'\n    js = if editors[index]?.js\n      editors[index].js\n    else\n      $(textareas[index]).val()\n    js = \"#{js}\\nalert(#{unescape run});\" unless run is yes\n    window.eval js\n    gtag 'event', 'run_code',\n      event_category: 'engagement'\n      event_label: $(@).closest('[data-example]').data('example')\n\n  # Try CoffeeScript\n  previousHash = null\n  toggleTry = (checkLocalStorage) ->\n    $('#try, #try-link').toggleClass 'show'\n    if $('#try').hasClass('show')\n      previousHash = window.location.hash if window.location.hash\n      initializeTryEditors() if $('#try .CodeMirror').length is 0\n      if checkLocalStorage and window.localStorage?\n        try\n          coffee = window.localStorage.getItem 'tryCoffeeScriptCode'\n          if coffee?\n            editors[0].setValue coffee\n          else\n            replaceState '#try'\n        catch exception\n          replaceState '#try'\n      else\n        replaceState '#try'\n    else\n      if previousHash then replaceState(previousHash) else clearHash()\n  closeTry = ->\n    $('#try, #try-link').removeClass 'show'\n    if previousHash then replaceState(previousHash) else clearHash()\n\n  $('[data-toggle=\"try\"]').click (event) ->\n    event.preventDefault()\n    toggleTry yes\n  $('[data-close=\"try\"]').click closeTry\n\n  $('[data-action=\"scroll-to-top\"]').click (event) ->\n    return if $('#try').hasClass('show')\n    $('.main')[0].scrollTop = 0\n    setTimeout clearHash, 10\n\n  clearHash = ->\n    window.history.replaceState {}, document.title, window.location.pathname\n\n  replaceState = (newURL) ->\n    newURL = \"#{window.location.pathname}#{newURL}\" if newURL?.indexOf('#') is 0\n    window.history.replaceState {}, document.title, (newURL or '')\n\n  $(window).on 'hashchange', ->\n    # Get rid of dangling # in the address bar\n    clearHash() if window.location.hash is ''\n\n  # Configure the initial state\n  if window.location.hash?\n    if window.location.hash is '#try'\n      toggleTry yes\n    else if window.location.hash.indexOf('#try') is 0\n      initializeTryEditors() if $('#try .CodeMirror').length is 0\n      editors[0].setValue decodeURIComponent window.location.hash[5..]\n      toggleTry no\n    else if window.location.hash is ''\n      clearHash()\n    else\n      initializeScrollspyFromHash window.location.hash\n      if window.location.hash.length > 1\n        # Initializing the code editors might’ve thrown off our vertical scroll position\n        document.getElementById(window.location.hash.slice(1).replace(/try:.*/, '')).scrollIntoView()\n"
  },
  {
    "path": "documentation/site/docs.css",
    "content": "html,\nbody {\n  /* Prevent scroll on narrow devices */\n  overflow-x: hidden;\n}\nbody {\n  /* Required for Scrollspy */\n  position: relative;\n  /* Push below header bar */\n  margin-top: 3.5rem;\n}\n\nsvg {\n  width: auto;\n  height: 100%;\n}\n\na {\n  color: #1b5e20;\n  transition: 0.1s ease-in-out;\n}\na:focus, a:hover, a:active {\n  color: #388e3c;\n  cursor: pointer;\n  text-decoration: none;\n}\n\nbutton:focus, .navbar-dark .navbar-toggler:focus {\n  outline: none;\n  border: thin solid rgba(248, 243, 240, 0.3);\n}\n\n.bg-dark {\n  background-color: #3e2723 !important;\n}\n\n.bg-ribbed-light {\n  background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1 3\"><path opacity=\".03\" fill=\"#000\" d=\"M0 0h1v1H0z\"/><path opacity=\".005\" fill=\"#000\" d=\"M0 1h1v2H0z\"/></svg>');\n  background-size: 1px 3px;\n}\n.bg-ribbed-dark {\n  background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1 3\"><path opacity=\".2\" fill=\"#000\" d=\"M0 0h1v1H0z\"/><path opacity=\".15\" fill=\"#000\" d=\"M0 1h1v2H0z\"/></svg>');\n  background-size: 1px 3px;\n}\n\n\n/*\n * Header\n */\n.site-navbar {\n  height: 3.5rem;\n  font-family: 'Lato';\n  font-weight: 400;\n  font-size: 1.1em;\n}\n\n.navbar-brand {\n  height: 2.2em;\n  margin-right: 1em;\n}\n\n.navbar-dark path {\n  fill: #fff;\n}\n\n.navbar-nav .nav-item {\n  margin-left: 0.6em;\n  margin-right: 0.6em;\n  border-radius: 0.4em;\n}\n.navbar-nav .nav-item:hover,\n.navbar-nav .nav-item:active,\n.navbar-nav .nav-item.show {\n  background-color: #4e342e;\n}\n\n.navbar-toggler {\n  transition: all 0.1s ease-in-out;\n}\n\n\n/*\n * Layout; based on https://codepen.io/Sphinxxxx/pen/WjwbEO\n */\n.main-row {\n  height: calc(100vh - 3.5rem);\n}\n\n/*\n * Sidebar\n */\n\n.sidebar {\n  /* Scrollable contents if viewport is shorter than content */\n  overflow-y: auto;\n  overflow-x: hidden;\n  left: 0;\n  bottom: 0;\n  z-index: 1000;\n  padding: 0;\n  background-color: #efebe9;\n  border-right: 1px solid #efebe9;\n}\n.sidebar::-webkit-scrollbar {\n  display: none;\n}\n@media screen and (max-width: 991px) {\n  .sidebar {\n    position: fixed;\n    top: 3.5em;\n    height: calc(100% - 3.5rem);\n    left: -100%;\n    transition: 0.25s left ease-in-out;\n  }\n  .sidebar.show {\n    left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .sidebar {\n    flex: 0 0 auto;\n  }\n}\n\n.contents {\n  padding: 0.5em 0 0.5em 0.5em;\n  font-family: 'Alegreya Sans';\n  font-weight: 400;\n  font-size: 1.2em;\n  align-items: normal;\n}\n\n.contents .nav .nav {\n  margin-left: 1em;\n  font-size: 0.9em;\n}\n\n.contents .nav-link {\n  padding: 0.2em 0.7em;\n}\n\n.contents .nav-link.active,\n.contents .nav-link.active a:hover,\n.contents .nav-link.active a:focus {\n  font-weight: 800;\n}\n\n\n/*\n * Main content\n */\n\n.main {\n  max-width: 100%;\n  padding: 1.3em;\n}\n@media (min-width: 992px) {\n  .main {\n    flex: 1 1 auto;\n    overflow: auto;\n    padding-right: 2em;\n    padding-left: 2em;\n  }\n}\n\n.title-logo {\n  width: 30rem;\n  margin: 3rem auto;\n}\n.title-logo path {\n  fill: #2f2625;\n}\n\n.main p, .main li, .main td, .main th {\n  font-family: Lato;\n  font-weight: 300;\n  font-size: 1.1em;\n  line-height: 1.7;\n}\n.main blockquote {\n  font-size: 1.1em;\n}\n.main li p, .main li li, .main li blockquote {\n  font-size: 1em;\n}\n@media (min-width: 768px) {\n  .main p, .main li, .main td, .main th, .main blockquote {\n    font-size: 1.2em;\n  }\n}\n.main td {\n  vertical-align: top;\n  padding: 0.3em 0;\n}\n.main strong, .main th {\n  font-weight: 700;\n}\n.main a {\n  border-bottom: 2px solid transparent;\n  font-weight: 400;\n}\n.main a:focus, .main a:hover, .main a:active {\n  border-bottom: 2px solid rgba(56, 142, 60, 0.2);\n}\n.main blockquote pre {\n  background-color: #f8f3f0;\n  color: #2f2625;\n  border-radius: .3em;\n  padding: 0.4em 0.6em;\n}\n\np, blockquote, table, .code-example {\n  margin-bottom: 1.1em;\n}\n.main li {\n  margin-bottom: 0.6em;\n}\n\ncode, td code {\n  white-space: nowrap;\n  padding: 2px 8px;\n}\npre code {\n  white-space: pre; /* We want newlines to be newlines in code blocks */\n}\n\nh2, h3, h4 {\n  margin-top: 1.3em;\n  margin-bottom: 0.6em;\n  font-family: 'Alegreya Sans';\n}\nh2 {\n  font-weight: 800;\n}\nh3, h4, h2 time {\n  font-weight: 400;\n}\n\n@media (min-width: 1200px) {\n  .main > header, .main section > h2, .main section > h3, .main section > h4, .main section > p, .main section > blockquote, .main section > ul, .main section > table {\n    max-width: 80%;\n  }\n}\n\ncode, button {\n  font-family: 'Roboto Mono';\n  font-weight: 400;\n}\ncode, a > code {\n  background-color: #f8f3f0;\n}\ncode {\n  color: #2f2625;\n}\n\n\n/*\n * Chrome around code examples; see code.css for the styling of the code blocks themselves\n */\n\ntextarea {\n  position: absolute;\n  left: -99999px; /* Hide off canvas, while still remaining visible */\n}\n\n.code-example {\n  background-color: #2f2625;\n  padding: 1em;\n  border-radius: 0.3em;\n  margin-bottom: 1em;\n}\n\n.javascript-output-column {\n  border-left: 1px solid rgba(255, 255, 255, 0.2);\n}\n\n.btn-primary {\n  background-color: #69f0ae;\n  color: #0b140f;\n  border-color: #53d88f;\n  transition: 0.2s ease-in-out;\n  min-width: 3.125rem;\n}\n.btn-primary:active, .btn-primary:focus, .btn-primary:hover, .btn-primary:active:hover, .btn-primary:active:focus {\n  background-color: #61fea8;\n  color: #060a08;\n  border-color: #4de486;\n  outline: 0;\n}\n\n.play-button {\n  height: 1em;\n  width: 1em;\n}\n\n.javascript-output-column .CodeMirror-cursor {\n  /* https://github.com/codemirror/CodeMirror/issues/2568 */\n  display: none;\n}\n\n/*\n * Try CoffeeScript\n */\n.try-coffeescript {\n  position: fixed;\n  height: calc(100% - 3.5rem);\n  top: 3.5rem;\n  left: 0;\n  right: 0;\n  opacity: 0;\n  transition: opacity 0.15s ease-in-out;\n  z-index: -1001;\n  background-color: #2f2625;\n}\n.try-coffeescript.show {\n  opacity: 1;\n  z-index: 1001;\n}\n\n.try-coffeescript .CodeMirror {\n  height: calc(100vh - 7rem);\n  cursor: text;\n}\n\n.try-coffeescript .code-column {\n  overflow: hidden;\n  background-color: #2f2625;\n  color: #2f2625;\n}\n\n@media screen and (max-width: 767px) {\n  .try-coffeescript .code-column {\n    height: calc(50vh - 0.5 * 3.5rem);\n  }\n}\n@media screen and (min-width: 768px) {\n  .try-coffeescript .code-column {\n    padding-bottom: 100%;\n    margin-bottom: -100%;\n  }\n}\n\n.try-coffeescript button svg {\n  height: 1em;\n  transform: scale(1.3) translateY(0.1em);\n  fill: #0b140f;\n}\n\n@media screen and (max-width: 767px) {\n  .try-coffeescript .try-buttons {\n    position: absolute;\n    bottom: 1em;\n    z-index: 1002;\n  }\n}\n"
  },
  {
    "path": "documentation/site/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv=\"content-type\" content=\"text/html;charset=UTF-8\" />\n<title>CoffeeScript</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n<link rel=\"canonical\" href=\"https://coffeescript.org\" />\n\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/apple-touch-icon.png\">\n<link rel=\"icon\" type=\"image/png\" href=\"/favicon-32x32.png\" sizes=\"32x32\">\n<link rel=\"icon\" type=\"image/png\" href=\"/favicon-16x16.png\" sizes=\"16x16\">\n<link rel=\"manifest\" href=\"/manifest.json\">\n<link rel=\"mask-icon\" href=\"/safari-pinned-tab.svg\" color=\"#5bbad5\">\n<meta name=\"theme-color\" content=\"#ffffff\">\n\n<%= include('styles.html') %>\n</head>\n<body>\n\n<%= include('body.html') %>\n\n<%= include('scripts.html') %>\n</body>\n</html>\n"
  },
  {
    "path": "documentation/site/navbar.html",
    "content": "<nav class=\"navbar navbar-expand-lg fixed-top navbar-dark bg-dark bg-ribbed-dark site-navbar\">\n  <a class=\"navbar-brand\" href=\"#\" data-close=\"try\" data-action=\"scroll-to-top\"><%= include('logo.svg') %></a>\n  <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"offcanvas\" data-close=\"try\" aria-label=\"Toggle sidebar\">\n    <span class=\"navbar-toggler-icon\"></span>\n  </button>\n\n  <nav class=\"collapse navbar-collapse\">\n    <div class=\"navbar-nav mr-auto d-none d-lg-flex\">\n      <a href=\"#try\" id=\"try-link\" class=\"nav-item nav-link\" data-toggle=\"try\">Try CoffeeScript</a>\n      <a href=\"#language\" class=\"nav-item nav-link\" data-close=\"try\">Language Reference</a>\n      <a href=\"#integrations\" class=\"nav-item nav-link\" data-close=\"try\">Integrations</a>\n      <a href=\"#resources\" class=\"nav-item nav-link\" data-close=\"try\">Resources</a>\n      <a href=\"https://github.com/jashkenas/coffeescript/\" class=\"nav-item nav-link\" data-close=\"try\">GitHub\n        </a>\n    </div>\n  </nav>\n</nav>\n"
  },
  {
    "path": "documentation/site/scripts.html",
    "content": "<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\" integrity=\"sha384-tsQFqpEReu7ZLhBV2VZlAu7zcOV+rXbYlF2cqB8txI/8aZajjp4Bqd+V6D5IgvKT\" crossorigin=\"anonymous\"></script>\n<script src=\"https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js\" integrity=\"sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm\" crossorigin=\"anonymous\"></script>\n<script src=\"https://cdn.jsdelivr.net/combine/npm/codemirror@5.37.0/lib/codemirror.js,npm/codemirror@5.37.0/mode/coffeescript/coffeescript.js,npm/codemirror@5.37.0/addon/lint/coffeescript-lint.js,npm/codemirror@5.37.0/mode/javascript/javascript.js\"></script>\n\n<script nomodule src=\"./browser-compiler-legacy/coffeescript.js\"></script>\n<script nomodule>\n<%= includeScript('docs.coffee') %>\n</script>\n<script type=\"module\">\nimport CoffeeScript from './browser-compiler-modern/coffeescript.js';\n<%= includeScript('docs.coffee') %>\n</script>\n\n<script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-106156830-1\"></script>\n"
  },
  {
    "path": "documentation/site/sidebar.html",
    "content": "<nav id=\"contents\" class=\"navbar contents\">\n  <nav class=\"nav flex-column\">\n    <a href=\"#try\" class=\"nav-link d-md-none\" data-action=\"sidebar-nav\" data-toggle=\"try\">Try CoffeeScript</a>\n    <a href=\"#introduction\" class=\"nav-link\" data-action=\"sidebar-nav\">Introduction</a>\n    <a href=\"#overview\" class=\"nav-link\" data-action=\"sidebar-nav\">Overview</a>\n    <a href=\"#coffeescript-2\" class=\"nav-link\" data-action=\"sidebar-nav\">CoffeeScript 2</a>\n    <nav class=\"nav flex-column\">\n      <a href=\"#whats-new-in-coffeescript-2\" class=\"nav-link\" data-action=\"sidebar-nav\">What’s New in CoffeeScript 2</a>\n      <a href=\"#compatibility\" class=\"nav-link\" data-action=\"sidebar-nav\">Compatibility</a>\n    </nav>\n    <a href=\"#installation\" class=\"nav-link\" data-action=\"sidebar-nav\">Installation</a>\n    <a href=\"#usage\" class=\"nav-link\" data-action=\"sidebar-nav\">Usage</a>\n    <nav class=\"nav flex-column\">\n      <a href=\"#cli\" class=\"nav-link\" data-action=\"sidebar-nav\">Command Line</a>\n      <a href=\"#nodejs-usage\" class=\"nav-link\" data-action=\"sidebar-nav\">Node.js</a>\n      <a href=\"#transpilation\" class=\"nav-link\" data-action=\"sidebar-nav\">Transpilation</a>\n    </nav>\n    <a href=\"#language\" class=\"nav-link\" data-action=\"sidebar-nav\">Language Reference</a>\n      <nav class=\"nav flex-column\">\n        <a href=\"#functions\" class=\"nav-link\" data-action=\"sidebar-nav\">Functions</a>\n        <a href=\"#strings\" class=\"nav-link\" data-action=\"sidebar-nav\">Strings</a>\n        <a href=\"#objects-and-arrays\" class=\"nav-link\" data-action=\"sidebar-nav\">Objects and Arrays</a>\n        <a href=\"#comments\" class=\"nav-link\" data-action=\"sidebar-nav\">Comments</a>\n        <a href=\"#lexical-scope\" class=\"nav-link\" data-action=\"sidebar-nav\">Lexical Scoping and Variable Safety</a>\n        <a href=\"#conditionals\" class=\"nav-link\" data-action=\"sidebar-nav\">If, Else, Unless, and Conditional Assignment</a>\n        <a href=\"#splats\" class=\"nav-link\" data-action=\"sidebar-nav\">Splats, or Rest Parameters/Spread Syntax</a>\n        <a href=\"#loops\" class=\"nav-link\" data-action=\"sidebar-nav\">Loops and Comprehensions</a>\n        <a href=\"#slices\" class=\"nav-link\" data-action=\"sidebar-nav\">Array Slicing and Splicing</a>\n        <a href=\"#expressions\" class=\"nav-link\" data-action=\"sidebar-nav\">Everything is an Expression</a>\n        <a href=\"#operators\" class=\"nav-link\" data-action=\"sidebar-nav\">Operators and Aliases</a>\n        <a href=\"#existential-operator\" class=\"nav-link\" data-action=\"sidebar-nav\">Existential Operator</a>\n        <a href=\"#destructuring\" class=\"nav-link\" data-action=\"sidebar-nav\">Destructuring Assignment</a>\n        <a href=\"#chaining\" class=\"nav-link\" data-action=\"sidebar-nav\">Chaining Function Calls</a>\n        <a href=\"#fat-arrow\" class=\"nav-link\" data-action=\"sidebar-nav\">Bound (Fat Arrow) Functions</a>\n        <a href=\"#generators\" class=\"nav-link\" data-action=\"sidebar-nav\">Generator Functions</a>\n        <a href=\"#async-functions\" class=\"nav-link\" data-action=\"sidebar-nav\">Async Functions</a>\n        <a href=\"#classes\" class=\"nav-link\" data-action=\"sidebar-nav\">Classes</a>\n        <a href=\"#prototypal-inheritance\" class=\"nav-link\" data-action=\"sidebar-nav\">Prototypal Inheritance</a>\n        <a href=\"#switch\" class=\"nav-link\" data-action=\"sidebar-nav\">Switch/When/Else</a>\n        <a href=\"#try-catch\" class=\"nav-link\" data-action=\"sidebar-nav\">Try/Catch/Finally</a>\n        <a href=\"#comparisons\" class=\"nav-link\" data-action=\"sidebar-nav\">Chained Comparisons</a>\n        <a href=\"#regexes\" class=\"nav-link\" data-action=\"sidebar-nav\">Block Regular Expressions</a>\n        <a href=\"#tagged-template-literals\" class=\"nav-link\" data-action=\"sidebar-nav\">Tagged Template Literals</a>\n        <a href=\"#modules\" class=\"nav-link\" data-action=\"sidebar-nav\">Modules</a>\n        <a href=\"#embedded\" class=\"nav-link\" data-action=\"sidebar-nav\">Embedded JavaScript</a>\n        <a href=\"#jsx\" class=\"nav-link\" data-action=\"sidebar-nav\">JSX</a>\n      </nav>\n    <a href=\"#type-annotations\" class=\"nav-link\" data-action=\"sidebar-nav\">Type Annotations</a>\n    <a href=\"#literate\" class=\"nav-link\" data-action=\"sidebar-nav\">Literate CoffeeScript</a>\n    <a href=\"#source-maps\" class=\"nav-link\" data-action=\"sidebar-nav\">Source Maps</a>\n    <a href=\"#cake\" class=\"nav-link\" data-action=\"sidebar-nav\">Cake, and Cakefiles</a>\n    <a href=\"#scripts\" class=\"nav-link\" data-action=\"sidebar-nav\"><code>\"text/coffeescript\"</code> Script Tags</a>\n    <a href=\"#integrations\" class=\"nav-link\" data-action=\"sidebar-nav\">Integrations</a>\n      <nav class=\"nav flex-column\">\n        <a href=\"#build-tools\" class=\"nav-link\" data-action=\"sidebar-nav\">Build Tools</a>\n        <a href=\"#code-editors\" class=\"nav-link\" data-action=\"sidebar-nav\">Code Editors</a>\n        <a href=\"#frameworks\" class=\"nav-link\" data-action=\"sidebar-nav\">Frameworks</a>\n        <a href=\"#linters-and-formatting\" class=\"nav-link\" data-action=\"sidebar-nav\">Linters and Formatting</a>\n        <a href=\"#testing\" class=\"nav-link\" data-action=\"sidebar-nav\">Testing</a>\n      </nav>\n    <a href=\"#resources\" class=\"nav-link\" data-action=\"sidebar-nav\">Resources</a>\n      <nav class=\"nav flex-column\">\n        <a href=\"#books\" class=\"nav-link\" data-action=\"sidebar-nav\">Books</a>\n        <a href=\"#screencasts\" class=\"nav-link\" data-action=\"sidebar-nav\">Screencasts</a>\n        <a href=\"#examples\" class=\"nav-link\" data-action=\"sidebar-nav\">Examples</a>\n        <a href=\"#chat\" class=\"nav-link\" data-action=\"sidebar-nav\">Chat</a>\n        <a href=\"#annotated-source\" class=\"nav-link\" data-action=\"sidebar-nav\">Annotated Source</a>\n        <a href=\"#contributing\" class=\"nav-link\" data-action=\"sidebar-nav\">Contributing</a>\n      </nav>\n    <a href=\"https://github.com/jashkenas/coffeescript/\" class=\"nav-item nav-link d-md-none\" data-action=\"sidebar-nav\">GitHub</a>\n    <a href=\"#unsupported\" class=\"nav-link\" data-action=\"sidebar-nav\">Unsupported ECMAScript Features</a>\n      <nav class=\"nav flex-column\">\n        <a href=\"#unsupported-let-const\" class=\"nav-link\" data-action=\"sidebar-nav\"><code>let</code> and <code>const</code></a>\n        <a href=\"#unsupported-named-functions\" class=\"nav-link\" data-action=\"sidebar-nav\">Named Functions and Function Declarations</a>\n        <a href=\"#unsupported-get-set\" class=\"nav-link\" data-action=\"sidebar-nav\"><code>get</code> and <code>set</code> Shorthand Syntax</a>\n      </nav>\n    <a href=\"#breaking-changes\" class=\"nav-link\" data-action=\"sidebar-nav\">Breaking Changes From 1.x</a>\n      <nav class=\"nav flex-column\">\n        <a href=\"#breaking-changes-fat-arrow\" class=\"nav-link\" data-action=\"sidebar-nav\">Bound (Fat Arrow) Functions</a>\n        <a href=\"#breaking-changes-default-values\" class=\"nav-link\" data-action=\"sidebar-nav\">Default Values</a>\n        <a href=\"#breaking-changes-bound-generator-functions\" class=\"nav-link\" data-action=\"sidebar-nav\">Bound Generator Functions</a>\n        <a href=\"#breaking-changes-classes\" class=\"nav-link\" data-action=\"sidebar-nav\">Classes</a>\n        <a href=\"#breaking-changes-super-this\" class=\"nav-link\" data-action=\"sidebar-nav\"><code>super</code> and <code>this</code></a>\n        <a href=\"#breaking-changes-super-extends\" class=\"nav-link\" data-action=\"sidebar-nav\"><code>super</code> and <code>extends</code></a>\n        <a href=\"#breaking-changes-jsx-and-the-less-than-and-greater-than-operators\" class=\"nav-link\" data-action=\"sidebar-nav\">JSX and the <code>&lt;</code> and <code>&gt;</code> Operators</a>\n        <a href=\"#breaking-changes-literate-coffeescript\" class=\"nav-link\" data-action=\"sidebar-nav\">Literate CoffeeScript Parsing</a>\n        <a href=\"#breaking-changes-argument-parsing-and-shebang-lines\" class=\"nav-link\" data-action=\"sidebar-nav\">Argument Parsing and <code>#!</code> Lines</a>\n      </nav>\n    <a href=\"#changelog\" class=\"nav-link\" data-action=\"sidebar-nav\">Changelog</a>\n    <a href=\"test.html\" class=\"nav-link\" data-action=\"sidebar-nav\">Browser-Based Tests</a>\n    <a href=\"/v1/\" class=\"nav-link\" data-action=\"sidebar-nav\">Version 1.x Documentation</a>\n  </nav>\n</nav>\n"
  },
  {
    "path": "documentation/site/styles.html",
    "content": "<link href=\"https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4\" crossorigin=\"anonymous\">\n<!-- The CoffeeScript logo font is Google’s Galada -->\n<link href=\"https://fonts.googleapis.com/css?family=Alegreya+Sans:400,800|Lato:300,300i,400,700|Roboto+Mono:400,400i\" rel=\"stylesheet\" crossorigin=\"anonymous\">\n<link href=\"https://cdn.jsdelivr.net/npm/codemirror@5.62.3/lib/codemirror.css\" rel=\"stylesheet\" crossorigin=\"anonymous\">\n<style>\n<%= include('code.css') %>\n<%= include('docs.css') %>\n</style>\n"
  },
  {
    "path": "documentation/site/test.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n  <title>CoffeeScript Test Suite</title>\n  <script nomodule src=\"browser-compiler-legacy/coffeescript.js\"></script>\n  <script type=\"module\">\n    import CoffeeScript from './browser-compiler-modern/coffeescript.js';\n    window.CoffeeScript = CoffeeScript;\n    window.addEventListener('DOMContentLoaded', CoffeeScript.runScripts, false);\n  </script>\n  <script src=\"https://cdn.jsdelivr.net/underscorejs/1.8.3/underscore-min.js\"></script>\n  <style>\n    body, pre {\n      font-family: Consolas, Menlo, Monaco, monospace;\n    }\n    body {\n      margin: 1em;\n    }\n    h1 {\n      font-size: 1.3em;\n    }\n    div {\n      margin: 0.6em;\n    }\n    .good {\n      color: #22b24c\n    }\n    .bad {\n      color: #eb6864\n    }\n    .subtle {\n      font-size: 0.7em;\n      color: #999999\n    }\n  </style>\n</head>\n<body>\n\n<h1>CoffeeScript Test Suite</h1>\n\n<pre id=\"stdout\"></pre>\n\n<script type=\"text/coffeescript\">\n@testingBrowser = yes\n@global = window\n@bold = @red = @green = @reset = ''\nstdout = document.getElementById 'stdout'\nstart = new Date\n@currentFile = ''\n@passedTests = failedTests = total = done = 0\n\nsay = (msg, className, id) ->\n  div = document.createElement 'div'\n  div.className = className if className?\n  div.id = id if id?\n  div.appendChild document.createTextNode msg\n  stdout.appendChild div\n  msg\n\nasyncTests = []\nonFail = (description, fn, err) ->\n  failures.push\n    error: err\n    description: description\n    source: fn.toString() if fn.toString?\n\n@test = (description, fn) ->\n  ++total\n  try\n    result = fn.call(fn)\n    if result instanceof Promise # An async test.\n      asyncTests.push result\n      result.then ->\n        passedTests++\n      .catch (err) ->\n        onFail description, fn, err\n    else\n      passedTests++\n  catch err\n    onFail description, fn, err\n\n@failures =\n  push: (failure) -> # Match function called by regular tests\n    ++failedTests\n    say \"#{failure.description}:\", 'bad'\n    say failure.source, 'subtle' if failure.source?\n    say failure.error, 'bad'\n    console.error failure.error\n\n@ok = (good, msg = 'Error') ->\n  throw Error msg unless good\n\n# Polyfill Node assert’s fail\n@fail = ->\n  ok no\n\n# Polyfill Node assert’s deepEqual with Underscore’s isEqual\n@deepEqual = (a, b) ->\n  ok _.isEqual(a, b), \"Expected #{JSON.stringify a} to deep equal #{JSON.stringify b}\"\n\n<%= testHelpers %>\n\n@doesNotThrow = (fn) ->\n  fn()\n  ok yes\n\n@throws = (fun, err, msg) ->\n  try\n    fun()\n  catch e\n    if err\n      if typeof err is 'function' and e instanceof err # Handle comparing exceptions\n        ok yes\n      else if e.toString().indexOf('[stdin]') is 0 # Handle comparing error messages\n        ok err e\n      else if err instanceof RegExp\n        ok err.test e\n      else\n        eq e, err\n    else\n      ok yes\n    return\n  ok no\n\n\n# Run the tests\nfor test in document.getElementsByClassName 'test'\n  say '\\u2714 ' + test.id\n  options = {}\n  options.filename = currentFile = test.id\n  options.literate = yes if test.type is 'text/x-literate-coffeescript'\n  CoffeeScript.run test.innerHTML, options\n\n# Finish up\ndone = ->\n  yay = passedTests is total and not failedTests\n  sec = (new Date - start) / 1000\n  msg = \"passed #{passedTests} tests in #{sec.toFixed 2} seconds\"\n  msg = \"failed #{total - passedTests} tests and #{msg}\" unless yay\n  say msg, (if yay then 'good' else 'bad'), 'result'\n\n  gtag 'event', 'tests_complete',\n    event_category: 'tests'\n    event_label: if yay then 'passed' else 'failed'\n    value: if yay then passedTests else total - passedTests\n  gtag 'event', 'tests_report',\n    event_category: 'tests'\n    event_label: msg\n  gtag 'event', 'timing_complete',\n    name: 'tests_run'\n    value: sec * 1000\n\nPromise.all(asyncTests).then(done).catch(done)\n</script>\n\n<%= tests %>\n\n<script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-106156830-1\"></script>\n<script>\n  window.GA_TRACKING_ID = 'UA-106156830-1';\n  window.dataLayer = window.dataLayer || [];\n  function gtag(){dataLayer.push(arguments)};\n  gtag('js', new Date());\n  gtag('config', GA_TRACKING_ID);\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "documentation/site/try.html",
    "content": "<aside id=\"try\" class=\"try-coffeescript container-fluid\" data-example=\"try\">\n  <div class=\"row\">\n    <div class=\"col-md-6 code-column bg-ribbed-dark coffeescript-input-column\">\n      <textarea class=\"coffeescript-input\" id=\"try-coffeescript-coffee\">alert 'Hello CoffeeScript!'</textarea>\n    </div>\n    <div class=\"col-md-6 code-column bg-ribbed-dark javascript-output-column\">\n      <textarea class=\"javascript-output\" id=\"try-coffeescript-js\">alert('Hello CoffeeScript!');</textarea>\n    </div>\n  </div>\n  <div class=\"row\">\n    <div class=\"col text-right try-buttons\">\n      <button type=\"button\" class=\"btn btn-primary\" data-action=\"run-code-example\" data-example=\"try-coffeescript\" data-run=\"true\"><%= include('play.svg') %></button>&emsp;\n    </div>\n  </div>\n</aside>\n"
  },
  {
    "path": "lib/coffeescript/browser.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  // This **Browser** compatibility layer extends core CoffeeScript functions\n  // to make things work smoothly when compiling code directly in the browser.\n  // We add support for loading remote Coffee scripts via **XHR**, and\n  // `text/coffeescript` script tags, source maps via data-URLs, and so on.\n  var CoffeeScript, compile,\n    indexOf = [].indexOf;\n\n  CoffeeScript = require('./coffeescript');\n\n  ({compile} = CoffeeScript);\n\n  // Use `window.eval` to evaluate code, rather than just `eval`, to run the\n  // script in a clean global scope rather than inheriting the scope of the\n  // CoffeeScript compiler. (So that `cake test:browser` also works in Node,\n  // use either `window.eval` or `global.eval` as appropriate).\n  CoffeeScript.eval = function(code, options = {}) {\n    var globalRoot;\n    if (options.bare == null) {\n      options.bare = true;\n    }\n    globalRoot = typeof window !== \"undefined\" && window !== null ? window : global;\n    return globalRoot['eval'](compile(code, options));\n  };\n\n  // Running code does not provide access to this scope.\n  CoffeeScript.run = function(code, options = {}) {\n    options.bare = true;\n    options.shiftLine = true;\n    return Function(compile(code, options))();\n  };\n\n  // Export this more limited `CoffeeScript` than what is exported by\n  // `index.coffee`, which is intended for a Node environment.\n  module.exports = CoffeeScript;\n\n  // If we’re not in a browser environment, we’re finished with the public API.\n  if (typeof window === \"undefined\" || window === null) {\n    return;\n  }\n\n  // Include source maps where possible. If we’ve got a base64 encoder, a\n  // JSON serializer, and tools for escaping unicode characters, we’re good to go.\n  // Ported from https://developer.mozilla.org/en-US/docs/DOM/window.btoa\n  if ((typeof btoa !== \"undefined\" && btoa !== null) && (typeof JSON !== \"undefined\" && JSON !== null)) {\n    compile = function(code, options = {}) {\n      options.inlineMap = true;\n      return CoffeeScript.compile(code, options);\n    };\n  }\n\n  // Load a remote script from the current domain via XHR.\n  CoffeeScript.load = function(url, callback, options = {}, hold = false) {\n    var xhr;\n    options.sourceFiles = [url];\n    xhr = window.ActiveXObject ? new window.ActiveXObject('Microsoft.XMLHTTP') : new window.XMLHttpRequest();\n    xhr.open('GET', url, true);\n    if ('overrideMimeType' in xhr) {\n      xhr.overrideMimeType('text/plain');\n    }\n    xhr.onreadystatechange = function() {\n      var param, ref;\n      if (xhr.readyState === 4) {\n        if ((ref = xhr.status) === 0 || ref === 200) {\n          param = [xhr.responseText, options];\n          if (!hold) {\n            CoffeeScript.run(...param);\n          }\n        } else {\n          throw new Error(`Could not load ${url}`);\n        }\n        if (callback) {\n          return callback(param);\n        }\n      }\n    };\n    return xhr.send(null);\n  };\n\n  // Activate CoffeeScript in the browser by having it compile and evaluate\n  // all script tags with a content-type of `text/coffeescript`.\n  // This happens on page load.\n  CoffeeScript.runScripts = function() {\n    var coffees, coffeetypes, execute, i, index, j, len, s, script, scripts;\n    scripts = window.document.getElementsByTagName('script');\n    coffeetypes = ['text/coffeescript', 'text/literate-coffeescript'];\n    coffees = (function() {\n      var j, len, ref, results;\n      results = [];\n      for (j = 0, len = scripts.length; j < len; j++) {\n        s = scripts[j];\n        if (ref = s.type, indexOf.call(coffeetypes, ref) >= 0) {\n          results.push(s);\n        }\n      }\n      return results;\n    })();\n    index = 0;\n    execute = function() {\n      var param;\n      param = coffees[index];\n      if (param instanceof Array) {\n        CoffeeScript.run(...param);\n        index++;\n        return execute();\n      }\n    };\n    for (i = j = 0, len = coffees.length; j < len; i = ++j) {\n      script = coffees[i];\n      (function(script, i) {\n        var options, source;\n        options = {\n          literate: script.type === coffeetypes[1]\n        };\n        source = script.src || script.getAttribute('data-src');\n        if (source) {\n          options.filename = source;\n          return CoffeeScript.load(source, function(param) {\n            coffees[i] = param;\n            return execute();\n          }, options, true);\n        } else {\n          // `options.filename` defines the filename the source map appears as\n          // in Developer Tools. If a script tag has an `id`, use that as the\n          // filename; otherwise use `coffeescript`, or `coffeescript1` etc.,\n          // leaving the first one unnumbered for the common case that there’s\n          // only one CoffeeScript script block to parse.\n          options.filename = script.id && script.id !== '' ? script.id : `coffeescript${i !== 0 ? i : ''}`;\n          options.sourceFiles = ['embedded'];\n          return coffees[i] = [script.innerHTML, options];\n        }\n      })(script, i);\n    }\n    return execute();\n  };\n\n  // Listen for window load, both in decent browsers and in IE.\n  // Only attach this event handler on startup for the\n  // non-ES module version of the browser compiler, to preserve\n  // backward compatibility while letting the ES module version\n  // be importable without side effects.\n  if (this === window) {\n    if (window.addEventListener) {\n      window.addEventListener('DOMContentLoaded', CoffeeScript.runScripts, false);\n    } else {\n      window.attachEvent('onload', CoffeeScript.runScripts);\n    }\n  }\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/cake.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  // `cake` is a simplified version of [Make](http://www.gnu.org/software/make/)\n  // ([Rake](http://rake.rubyforge.org/), [Jake](https://github.com/280north/jake))\n  // for CoffeeScript. You define tasks with names and descriptions in a Cakefile,\n  // and can call them from the command line, or invoke them from other tasks.\n\n  // Running `cake` with no arguments will print out a list of all the tasks in the\n  // current directory's Cakefile.\n\n  // External dependencies.\n  var CoffeeScript, cakefileDirectory, fatalError, fs, helpers, missingTask, oparse, options, optparse, path, printTasks, switches, tasks;\n\n  fs = require('fs');\n\n  path = require('path');\n\n  helpers = require('./helpers');\n\n  optparse = require('./optparse');\n\n  CoffeeScript = require('./');\n\n  // Register .coffee extension\n  CoffeeScript.register();\n\n  // Keep track of the list of defined tasks, the accepted options, and so on.\n  tasks = {};\n\n  options = {};\n\n  switches = [];\n\n  oparse = null;\n\n  // Mixin the top-level Cake functions for Cakefiles to use directly.\n  helpers.extend(global, {\n    // Define a Cake task with a short name, an optional sentence description,\n    // and the function to run as the action itself.\n    task: function(name, description, action) {\n      if (!action) {\n        [action, description] = [description, action];\n      }\n      return tasks[name] = {name, description, action};\n    },\n    // Define an option that the Cakefile accepts. The parsed options hash,\n    // containing all of the command-line options passed, will be made available\n    // as the first argument to the action.\n    option: function(letter, flag, description) {\n      return switches.push([letter, flag, description]);\n    },\n    // Invoke another task in the current Cakefile.\n    invoke: function(name) {\n      if (!tasks[name]) {\n        missingTask(name);\n      }\n      return tasks[name].action(options);\n    }\n  });\n\n  // Run `cake`. Executes all of the tasks you pass, in order. Note that Node's\n  // asynchrony may cause tasks to execute in a different order than you'd expect.\n  // If no tasks are passed, print the help screen. Keep a reference to the\n  // original directory name, when running Cake tasks from subdirectories.\n  exports.run = function() {\n    var arg, args, e, i, len, ref, results;\n    global.__originalDirname = fs.realpathSync('.');\n    process.chdir(cakefileDirectory(__originalDirname));\n    args = process.argv.slice(2);\n    CoffeeScript.run(fs.readFileSync('Cakefile').toString(), {\n      filename: 'Cakefile'\n    });\n    oparse = new optparse.OptionParser(switches);\n    if (!args.length) {\n      return printTasks();\n    }\n    try {\n      options = oparse.parse(args);\n    } catch (error) {\n      e = error;\n      return fatalError(`${e}`);\n    }\n    ref = options.arguments;\n    results = [];\n    for (i = 0, len = ref.length; i < len; i++) {\n      arg = ref[i];\n      results.push(invoke(arg));\n    }\n    return results;\n  };\n\n  // Display the list of Cake tasks in a format similar to `rake -T`\n  printTasks = function() {\n    var cakefilePath, desc, name, relative, spaces, task;\n    relative = path.relative || path.resolve;\n    cakefilePath = path.join(relative(__originalDirname, process.cwd()), 'Cakefile');\n    console.log(`${cakefilePath} defines the following tasks:\\n`);\n    for (name in tasks) {\n      task = tasks[name];\n      spaces = 20 - name.length;\n      spaces = spaces > 0 ? Array(spaces + 1).join(' ') : '';\n      desc = task.description ? `# ${task.description}` : '';\n      console.log(`cake ${name}${spaces} ${desc}`);\n    }\n    if (switches.length) {\n      return console.log(oparse.help());\n    }\n  };\n\n  // Print an error and exit when attempting to use an invalid task/option.\n  fatalError = function(message) {\n    console.error(message + '\\n');\n    console.log('To see a list of all tasks/options, run \"cake\"');\n    return process.exit(1);\n  };\n\n  missingTask = function(task) {\n    return fatalError(`No such task: ${task}`);\n  };\n\n  // When `cake` is invoked, search in the current and all parent directories\n  // to find the relevant Cakefile.\n  cakefileDirectory = function(dir) {\n    var parent;\n    if (fs.existsSync(path.join(dir, 'Cakefile'))) {\n      return dir;\n    }\n    parent = path.normalize(path.join(dir, '..'));\n    if (parent !== dir) {\n      return cakefileDirectory(parent);\n    }\n    throw new Error(`Cakefile not found in ${process.cwd()}`);\n  };\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/coffeescript.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  // CoffeeScript can be used both on the server, as a command-line compiler based\n  // on Node.js/V8, or to run CoffeeScript directly in the browser. This module\n  // contains the main entry functions for tokenizing, parsing, and compiling\n  // source CoffeeScript into JavaScript.\n  var FILE_EXTENSIONS, Lexer, SourceMap, base64encode, checkShebangLine, compile, getSourceMap, helpers, lexer, packageJson, parser, registerCompiled, withPrettyErrors;\n\n  ({Lexer} = require('./lexer'));\n\n  ({parser} = require('./parser'));\n\n  helpers = require('./helpers');\n\n  SourceMap = require('./sourcemap');\n\n  // Require `package.json`, which is two levels above this file, as this file is\n  // evaluated from `lib/coffeescript`.\n  packageJson = require('../../package.json');\n\n  // The current CoffeeScript version number.\n  exports.VERSION = packageJson.version;\n\n  exports.FILE_EXTENSIONS = FILE_EXTENSIONS = ['.coffee', '.litcoffee', '.coffee.md'];\n\n  // Expose helpers for testing.\n  exports.helpers = helpers;\n\n  ({getSourceMap, registerCompiled} = SourceMap);\n\n  // This is exported to enable an external module to implement caching of\n  // sourcemaps. This is used only when `patchStackTrace` has been called to adjust\n  // stack traces for files with cached source maps.\n  exports.registerCompiled = registerCompiled;\n\n  // Function that allows for btoa in both nodejs and the browser.\n  base64encode = function(src) {\n    switch (false) {\n      case typeof Buffer !== 'function':\n        return Buffer.from(src).toString('base64');\n      case typeof btoa !== 'function':\n        // The contents of a `<script>` block are encoded via UTF-16, so if any extended\n        // characters are used in the block, btoa will fail as it maxes out at UTF-8.\n        // See https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem\n        // for the gory details, and for the solution implemented here.\n        return btoa(encodeURIComponent(src).replace(/%([0-9A-F]{2})/g, function(match, p1) {\n          return String.fromCharCode('0x' + p1);\n        }));\n      default:\n        throw new Error('Unable to base64 encode inline sourcemap.');\n    }\n  };\n\n  // Function wrapper to add source file information to SyntaxErrors thrown by the\n  // lexer/parser/compiler.\n  withPrettyErrors = function(fn) {\n    return function(code, options = {}) {\n      var err;\n      try {\n        return fn.call(this, code, options);\n      } catch (error) {\n        err = error;\n        if (typeof code !== 'string') { // Support `CoffeeScript.nodes(tokens)`.\n          throw err;\n        }\n        throw helpers.updateSyntaxError(err, code, options.filename);\n      }\n    };\n  };\n\n  // Compile CoffeeScript code to JavaScript, using the Coffee/Jison compiler.\n\n  // If `options.sourceMap` is specified, then `options.filename` must also be\n  // specified. All options that can be passed to `SourceMap#generate` may also\n  // be passed here.\n\n  // This returns a javascript string, unless `options.sourceMap` is passed,\n  // in which case this returns a `{js, v3SourceMap, sourceMap}`\n  // object, where sourceMap is a sourcemap.coffee#SourceMap object, handy for\n  // doing programmatic lookups.\n  exports.compile = compile = withPrettyErrors(function(code, options = {}) {\n    var ast, currentColumn, currentLine, encoded, filename, fragment, fragments, generateSourceMap, header, i, j, js, len, len1, map, newLines, nodes, range, ref, sourceCodeLastLine, sourceCodeNumberOfLines, sourceMapDataURI, sourceURL, token, tokens, transpiler, transpilerOptions, transpilerOutput, v3SourceMap;\n    // Clone `options`, to avoid mutating the `options` object passed in.\n    options = Object.assign({}, options);\n    generateSourceMap = options.sourceMap || options.inlineMap || (options.filename == null);\n    filename = options.filename || helpers.anonymousFileName();\n    checkShebangLine(filename, code);\n    if (generateSourceMap) {\n      map = new SourceMap();\n    }\n    tokens = lexer.tokenize(code, options);\n    // Pass a list of referenced variables, so that generated variables won’t get\n    // the same name.\n    options.referencedVars = (function() {\n      var i, len, results;\n      results = [];\n      for (i = 0, len = tokens.length; i < len; i++) {\n        token = tokens[i];\n        if (token[0] === 'IDENTIFIER') {\n          results.push(token[1]);\n        }\n      }\n      return results;\n    })();\n    // Check for import or export; if found, force bare mode.\n    if (!((options.bare != null) && options.bare === true)) {\n      for (i = 0, len = tokens.length; i < len; i++) {\n        token = tokens[i];\n        if ((ref = token[0]) === 'IMPORT' || ref === 'EXPORT') {\n          options.bare = true;\n          break;\n        }\n      }\n    }\n    nodes = parser.parse(tokens);\n    // If all that was requested was a POJO representation of the nodes, e.g.\n    // the abstract syntax tree (AST), we can stop now and just return that\n    // (after fixing the location data for the root/`File`»`Program` node,\n    // which might’ve gotten misaligned from the original source due to the\n    // `clean` function in the lexer).\n    if (options.ast) {\n      nodes.allCommentTokens = helpers.extractAllCommentTokens(tokens);\n      sourceCodeNumberOfLines = (code.match(/\\r?\\n/g) || '').length + 1;\n      sourceCodeLastLine = /.*$/.exec(code)[0];\n      ast = nodes.ast(options);\n      range = [0, code.length];\n      ast.start = ast.program.start = range[0];\n      ast.end = ast.program.end = range[1];\n      ast.range = ast.program.range = range;\n      ast.loc.start = ast.program.loc.start = {\n        line: 1,\n        column: 0\n      };\n      ast.loc.end.line = ast.program.loc.end.line = sourceCodeNumberOfLines;\n      ast.loc.end.column = ast.program.loc.end.column = sourceCodeLastLine.length;\n      ast.tokens = tokens;\n      return ast;\n    }\n    fragments = nodes.compileToFragments(options);\n    currentLine = 0;\n    if (options.header) {\n      currentLine += 1;\n    }\n    if (options.shiftLine) {\n      currentLine += 1;\n    }\n    currentColumn = 0;\n    js = \"\";\n    for (j = 0, len1 = fragments.length; j < len1; j++) {\n      fragment = fragments[j];\n      // Update the sourcemap with data from each fragment.\n      if (generateSourceMap) {\n        // Do not include empty, whitespace, or semicolon-only fragments.\n        if (fragment.locationData && !/^[;\\s]*$/.test(fragment.code)) {\n          map.add([fragment.locationData.first_line, fragment.locationData.first_column], [currentLine, currentColumn], {\n            noReplace: true\n          });\n        }\n        newLines = helpers.count(fragment.code, \"\\n\");\n        currentLine += newLines;\n        if (newLines) {\n          currentColumn = fragment.code.length - (fragment.code.lastIndexOf(\"\\n\") + 1);\n        } else {\n          currentColumn += fragment.code.length;\n        }\n      }\n      // Copy the code from each fragment into the final JavaScript.\n      js += fragment.code;\n    }\n    if (options.header) {\n      header = `Generated by CoffeeScript ${this.VERSION}`;\n      js = `// ${header}\\n${js}`;\n    }\n    if (generateSourceMap) {\n      v3SourceMap = map.generate(options, code);\n    }\n    if (options.transpile) {\n      if (typeof options.transpile !== 'object') {\n        // This only happens if run via the Node API and `transpile` is set to\n        // something other than an object.\n        throw new Error('The transpile option must be given an object with options to pass to Babel');\n      }\n      // Get the reference to Babel that we have been passed if this compiler\n      // is run via the CLI or Node API.\n      transpiler = options.transpile.transpile;\n      delete options.transpile.transpile;\n      transpilerOptions = Object.assign({}, options.transpile);\n      // See https://github.com/babel/babel/issues/827#issuecomment-77573107:\n      // Babel can take a v3 source map object as input in `inputSourceMap`\n      // and it will return an *updated* v3 source map object in its output.\n      if (v3SourceMap && (transpilerOptions.inputSourceMap == null)) {\n        transpilerOptions.inputSourceMap = v3SourceMap;\n      }\n      transpilerOutput = transpiler(js, transpilerOptions);\n      js = transpilerOutput.code;\n      if (v3SourceMap && transpilerOutput.map) {\n        v3SourceMap = transpilerOutput.map;\n      }\n    }\n    if (options.inlineMap) {\n      encoded = base64encode(JSON.stringify(v3SourceMap));\n      sourceMapDataURI = `//# sourceMappingURL=data:application/json;base64,${encoded}`;\n      sourceURL = `//# sourceURL=${filename}`;\n      js = `${js}\\n${sourceMapDataURI}\\n${sourceURL}`;\n    }\n    registerCompiled(filename, code, map);\n    if (options.sourceMap) {\n      return {\n        js,\n        sourceMap: map,\n        v3SourceMap: JSON.stringify(v3SourceMap, null, 2)\n      };\n    } else {\n      return js;\n    }\n  });\n\n  // Tokenize a string of CoffeeScript code, and return the array of tokens.\n  exports.tokens = withPrettyErrors(function(code, options) {\n    return lexer.tokenize(code, options);\n  });\n\n  // Parse a string of CoffeeScript code or an array of lexed tokens, and\n  // return the AST. You can then compile it by calling `.compile()` on the root,\n  // or traverse it by using `.traverseChildren()` with a callback.\n  exports.nodes = withPrettyErrors(function(source, options) {\n    if (typeof source === 'string') {\n      source = lexer.tokenize(source, options);\n    }\n    return parser.parse(source);\n  });\n\n  // This file used to export these methods; leave stubs that throw warnings\n  // instead. These methods have been moved into `index.coffee` to provide\n  // separate entrypoints for Node and non-Node environments, so that static\n  // analysis tools don’t choke on Node packages when compiling for a non-Node\n  // environment.\n  exports.run = exports.eval = exports.register = function() {\n    throw new Error('require index.coffee, not this file');\n  };\n\n  // Instantiate a Lexer for our use here.\n  lexer = new Lexer();\n\n  // The real Lexer produces a generic stream of tokens. This object provides a\n  // thin wrapper around it, compatible with the Jison API. We can then pass it\n  // directly as a “Jison lexer.”\n  parser.lexer = {\n    yylloc: {\n      range: []\n    },\n    options: {\n      ranges: true\n    },\n    lex: function() {\n      var tag, token;\n      token = parser.tokens[this.pos++];\n      if (token) {\n        [tag, this.yytext, this.yylloc] = token;\n        parser.errorToken = token.origin || token;\n        this.yylineno = this.yylloc.first_line;\n      } else {\n        tag = '';\n      }\n      return tag;\n    },\n    setInput: function(tokens) {\n      parser.tokens = tokens;\n      return this.pos = 0;\n    },\n    upcomingInput: function() {\n      return '';\n    }\n  };\n\n  // Make all the AST nodes visible to the parser.\n  parser.yy = require('./nodes');\n\n  // Override Jison's default error handling function.\n  parser.yy.parseError = function(message, {token}) {\n    var errorLoc, errorTag, errorText, errorToken, tokens;\n    // Disregard Jison's message, it contains redundant line number information.\n    // Disregard the token, we take its value directly from the lexer in case\n    // the error is caused by a generated token which might refer to its origin.\n    ({errorToken, tokens} = parser);\n    [errorTag, errorText, errorLoc] = errorToken;\n    errorText = (function() {\n      switch (false) {\n        case errorToken !== tokens[tokens.length - 1]:\n          return 'end of input';\n        case errorTag !== 'INDENT' && errorTag !== 'OUTDENT':\n          return 'indentation';\n        case errorTag !== 'IDENTIFIER' && errorTag !== 'NUMBER' && errorTag !== 'INFINITY' && errorTag !== 'STRING' && errorTag !== 'STRING_START' && errorTag !== 'REGEX' && errorTag !== 'REGEX_START':\n          return errorTag.replace(/_START$/, '').toLowerCase();\n        default:\n          return helpers.nameWhitespaceCharacter(errorText);\n      }\n    })();\n    // The second argument has a `loc` property, which should have the location\n    // data for this token. Unfortunately, Jison seems to send an outdated `loc`\n    // (from the previous token), so we take the location information directly\n    // from the lexer.\n    return helpers.throwSyntaxError(`unexpected ${errorText}`, errorLoc);\n  };\n\n  exports.patchStackTrace = function() {\n    var formatSourcePosition, getSourceMapping;\n    // Based on http://v8.googlecode.com/svn/branches/bleeding_edge/src/messages.js\n    // Modified to handle sourceMap\n    formatSourcePosition = function(frame, getSourceMapping) {\n      var as, column, fileLocation, filename, functionName, isConstructor, isMethodCall, line, methodName, source, tp, typeName;\n      filename = void 0;\n      fileLocation = '';\n      if (frame.isNative()) {\n        fileLocation = \"native\";\n      } else {\n        if (frame.isEval()) {\n          filename = frame.getScriptNameOrSourceURL();\n          if (!filename) {\n            fileLocation = `${frame.getEvalOrigin()}, `;\n          }\n        } else {\n          filename = frame.getFileName();\n        }\n        filename || (filename = \"<anonymous>\");\n        line = frame.getLineNumber();\n        column = frame.getColumnNumber();\n        // Check for a sourceMap position\n        source = getSourceMapping(filename, line, column);\n        fileLocation = source ? `${filename}:${source[0]}:${source[1]}` : `${filename}:${line}:${column}`;\n      }\n      functionName = frame.getFunctionName();\n      isConstructor = frame.isConstructor();\n      isMethodCall = !(frame.isToplevel() || isConstructor);\n      if (isMethodCall) {\n        methodName = frame.getMethodName();\n        typeName = frame.getTypeName();\n        if (functionName) {\n          tp = as = '';\n          if (typeName && functionName.indexOf(typeName)) {\n            tp = `${typeName}.`;\n          }\n          if (methodName && functionName.indexOf(`.${methodName}`) !== functionName.length - methodName.length - 1) {\n            as = ` [as ${methodName}]`;\n          }\n          return `${tp}${functionName}${as} (${fileLocation})`;\n        } else {\n          return `${typeName}.${methodName || '<anonymous>'} (${fileLocation})`;\n        }\n      } else if (isConstructor) {\n        return `new ${functionName || '<anonymous>'} (${fileLocation})`;\n      } else if (functionName) {\n        return `${functionName} (${fileLocation})`;\n      } else {\n        return fileLocation;\n      }\n    };\n    getSourceMapping = function(filename, line, column) {\n      var answer, sourceMap;\n      sourceMap = getSourceMap(filename, line, column);\n      if (sourceMap != null) {\n        answer = sourceMap.sourceLocation([line - 1, column - 1]);\n      }\n      if (answer != null) {\n        return [answer[0] + 1, answer[1] + 1];\n      } else {\n        return null;\n      }\n    };\n    // Based on [michaelficarra/CoffeeScriptRedux](http://goo.gl/ZTx1p)\n    // NodeJS / V8 have no support for transforming positions in stack traces using\n    // sourceMap, so we must monkey-patch Error to display CoffeeScript source\n    // positions.\n    return Error.prepareStackTrace = function(err, stack) {\n      var frame, frames;\n      frames = (function() {\n        var i, len, results;\n        results = [];\n        for (i = 0, len = stack.length; i < len; i++) {\n          frame = stack[i];\n          if (frame.getFunction() === exports.run) {\n            // Don’t display stack frames deeper than `CoffeeScript.run`.\n            break;\n          }\n          results.push(`    at ${formatSourcePosition(frame, getSourceMapping)}`);\n        }\n        return results;\n      })();\n      return `${err.toString()}\\n${frames.join('\\n')}\\n`;\n    };\n  };\n\n  checkShebangLine = function(file, input) {\n    var args, firstLine, ref, rest;\n    firstLine = input.split(/$/m, 1)[0];\n    rest = firstLine != null ? firstLine.match(/^#!\\s*([^\\s]+\\s*)(.*)/) : void 0;\n    args = rest != null ? (ref = rest[2]) != null ? ref.split(/\\s/).filter(function(s) {\n      return s !== '';\n    }) : void 0 : void 0;\n    if ((args != null ? args.length : void 0) > 1) {\n      console.error(`The script to be run begins with a shebang line with more than one\nargument. This script will fail on platforms such as Linux which only\nallow a single argument.`);\n      console.error(`The shebang line was: '${firstLine}' in file '${file}'`);\n      return console.error(`The arguments were: ${JSON.stringify(args)}`);\n    }\n  };\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/command.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  // The `coffee` utility. Handles command-line compilation of CoffeeScript\n  // into various forms: saved into `.js` files or printed to stdout\n  // or recompiled every time the source is saved,\n  // printed as a token stream or as the syntax tree, or launch an\n  // interactive REPL.\n\n  // External dependencies.\n  var BANNER, CoffeeScript, EventEmitter, SWITCHES, buildCSOptionParser, compileJoin, compileOptions, compilePath, compileScript, compileStdio, exec, findDirectoryIndex, forkNode, fs, helpers, hidden, joinTimeout, makePrelude, mkdirp, notSources, optionParser, optparse, opts, outputPath, parseOptions, path, printLine, printTokens, printWarn, removeSource, removeSourceDir, silentUnlink, sourceCode, sources, spawn, timeLog, usage, useWinPathSep, version, wait, watch, watchDir, watchedDirs, writeJs,\n    indexOf = [].indexOf;\n\n  fs = require('fs');\n\n  path = require('path');\n\n  helpers = require('./helpers');\n\n  optparse = require('./optparse');\n\n  CoffeeScript = require('./');\n\n  ({spawn, exec} = require('child_process'));\n\n  ({EventEmitter} = require('events'));\n\n  useWinPathSep = path.sep === '\\\\';\n\n  // Allow CoffeeScript to emit Node.js events.\n  helpers.extend(CoffeeScript, new EventEmitter());\n\n  printLine = function(line) {\n    return process.stdout.write(line + '\\n');\n  };\n\n  printWarn = function(line) {\n    return process.stderr.write(line + '\\n');\n  };\n\n  hidden = function(file) {\n    return /^\\.|~$/.test(file);\n  };\n\n  // The help banner that is printed in conjunction with `-h`/`--help`.\n  BANNER = `Usage: coffee [options] path/to/script.coffee [args]\n\nIf called without options, \\`coffee\\` will run your script.`;\n\n  // The list of all the valid option flags that `coffee` knows how to handle.\n  SWITCHES = [['--ast', 'generate an abstract syntax tree of nodes'], ['-b', '--bare', 'compile without a top-level function wrapper'], ['-c', '--compile', 'compile to JavaScript and save as .js files'], ['-e', '--eval', 'pass a string from the command line as input'], ['-h', '--help', 'display this help message'], ['-i', '--interactive', 'run an interactive CoffeeScript REPL'], ['-j', '--join [FILE]', 'concatenate the source CoffeeScript before compiling'], ['-l', '--literate', 'treat stdio as literate style coffeescript'], ['-m', '--map', 'generate source map and save as .js.map files'], ['-M', '--inline-map', 'generate source map and include it directly in output'], ['-n', '--nodes', 'print out the parse tree that the parser produces'], ['--nodejs [ARGS]', 'pass options directly to the \"node\" binary'], ['--no-header', 'suppress the \"Generated by\" header'], ['-o', '--output [PATH]', 'set the output path or path/filename for compiled JavaScript'], ['-p', '--print', 'print out the compiled JavaScript'], ['-r', '--require [MODULE*]', 'require the given module before eval or REPL'], ['-s', '--stdio', 'listen for and compile scripts over stdio'], ['-t', '--transpile', 'pipe generated JavaScript through Babel'], ['--tokens', 'print out the tokens that the lexer/rewriter produce'], ['-v', '--version', 'display the version number'], ['-w', '--watch', 'watch scripts for changes and rerun commands']];\n\n  // Top-level objects shared by all the functions.\n  opts = {};\n\n  sources = [];\n\n  sourceCode = [];\n\n  notSources = {};\n\n  watchedDirs = {};\n\n  optionParser = null;\n\n  exports.buildCSOptionParser = buildCSOptionParser = function() {\n    return new optparse.OptionParser(SWITCHES, BANNER);\n  };\n\n  // Run `coffee` by parsing passed options and determining what action to take.\n  // Many flags cause us to divert before compiling anything. Flags passed after\n  // `--` will be passed verbatim to your script as arguments in `process.argv`\n  exports.run = function() {\n    var err, i, len, literals, outputBasename, ref, replCliOpts, results, source;\n    optionParser = buildCSOptionParser();\n    try {\n      parseOptions();\n    } catch (error) {\n      err = error;\n      console.error(`option parsing error: ${err.message}`);\n      process.exit(1);\n    }\n    if ((!opts.doubleDashed) && (opts.arguments[1] === '--')) {\n      printWarn(`coffee was invoked with '--' as the second positional argument, which is\nnow deprecated. To pass '--' as an argument to a script to run, put an\nadditional '--' before the path to your script.\n\n'--' will be removed from the argument list.`);\n      printWarn(`The positional arguments were: ${JSON.stringify(opts.arguments)}`);\n      opts.arguments = [opts.arguments[0]].concat(opts.arguments.slice(2));\n    }\n    // Make the REPL *CLI* use the global context so as to (a) be consistent with the\n    // `node` REPL CLI and, therefore, (b) make packages that modify native prototypes\n    // (such as 'colors' and 'sugar') work as expected.\n    replCliOpts = {\n      useGlobal: true\n    };\n    if (opts.require) {\n      opts.prelude = makePrelude(opts.require);\n    }\n    replCliOpts.prelude = opts.prelude;\n    replCliOpts.transpile = opts.transpile;\n    if (opts.nodejs) {\n      return forkNode();\n    }\n    if (opts.help) {\n      return usage();\n    }\n    if (opts.version) {\n      return version();\n    }\n    if (opts.interactive) {\n      return require('./repl').start(replCliOpts);\n    }\n    if (opts.stdio) {\n      return compileStdio();\n    }\n    if (opts.eval) {\n      return compileScript(null, opts.arguments[0]);\n    }\n    if (!opts.arguments.length) {\n      return require('./repl').start(replCliOpts);\n    }\n    literals = opts.run ? opts.arguments.splice(1) : [];\n    process.argv = process.argv.slice(0, 2).concat(literals);\n    process.argv[0] = 'coffee';\n    if (opts.output) {\n      outputBasename = path.basename(opts.output);\n      if (indexOf.call(outputBasename, '.') >= 0 && (outputBasename !== '.' && outputBasename !== '..') && !helpers.ends(opts.output, path.sep)) {\n        // An output filename was specified, e.g. `/dist/scripts.js`.\n        opts.outputFilename = outputBasename;\n        opts.outputPath = path.resolve(path.dirname(opts.output));\n      } else {\n        // An output path was specified, e.g. `/dist`.\n        opts.outputFilename = null;\n        opts.outputPath = path.resolve(opts.output);\n      }\n    }\n    if (opts.join) {\n      opts.join = path.resolve(opts.join);\n      console.error(`\nThe --join option is deprecated and will be removed in a future version.\n\nIf for some reason it's necessary to share local variables between files,\nreplace...\n\n    $ coffee --compile --join bundle.js -- a.coffee b.coffee c.coffee\n\nwith...\n\n    $ cat a.coffee b.coffee c.coffee | coffee --compile --stdio > bundle.js\n`);\n    }\n    ref = opts.arguments;\n    results = [];\n    for (i = 0, len = ref.length; i < len; i++) {\n      source = ref[i];\n      source = path.resolve(source);\n      results.push(compilePath(source, true, source));\n    }\n    return results;\n  };\n\n  makePrelude = function(requires) {\n    return requires.map(function(module) {\n      var full, match, name;\n      if (match = module.match(/^(.*)=(.*)$/)) {\n        [full, name, module] = match;\n      }\n      name || (name = helpers.baseFileName(module, true, useWinPathSep));\n      return `global['${name}'] = require('${module}')`;\n    }).join(';');\n  };\n\n  // Compile a path, which could be a script or a directory. If a directory\n  // is passed, recursively compile all '.coffee', '.litcoffee', and '.coffee.md'\n  // extension source files in it and all subdirectories.\n  compilePath = function(source, topLevel, base) {\n    var code, err, file, files, i, len, results, stats;\n    if (indexOf.call(sources, source) >= 0 || watchedDirs[source] || !topLevel && (notSources[source] || hidden(source))) {\n      return;\n    }\n    try {\n      stats = fs.statSync(source);\n    } catch (error) {\n      err = error;\n      if (err.code === 'ENOENT') {\n        console.error(`File not found: ${source}`);\n        process.exit(1);\n      }\n      throw err;\n    }\n    if (stats.isDirectory()) {\n      if (path.basename(source) === 'node_modules') {\n        notSources[source] = true;\n        return;\n      }\n      if (opts.run) {\n        compilePath(findDirectoryIndex(source), topLevel, base);\n        return;\n      }\n      if (opts.watch) {\n        watchDir(source, base);\n      }\n      try {\n        files = fs.readdirSync(source);\n      } catch (error) {\n        err = error;\n        if (err.code === 'ENOENT') {\n          return;\n        } else {\n          throw err;\n        }\n      }\n      results = [];\n      for (i = 0, len = files.length; i < len; i++) {\n        file = files[i];\n        results.push(compilePath(path.join(source, file), false, base));\n      }\n      return results;\n    } else if (topLevel || helpers.isCoffee(source)) {\n      sources.push(source);\n      sourceCode.push(null);\n      delete notSources[source];\n      if (opts.watch) {\n        watch(source, base);\n      }\n      try {\n        code = fs.readFileSync(source);\n      } catch (error) {\n        err = error;\n        if (err.code === 'ENOENT') {\n          return;\n        } else {\n          throw err;\n        }\n      }\n      return compileScript(source, code.toString(), base);\n    } else {\n      return notSources[source] = true;\n    }\n  };\n\n  findDirectoryIndex = function(source) {\n    var err, ext, i, index, len, ref;\n    ref = CoffeeScript.FILE_EXTENSIONS;\n    for (i = 0, len = ref.length; i < len; i++) {\n      ext = ref[i];\n      index = path.join(source, `index${ext}`);\n      try {\n        if ((fs.statSync(index)).isFile()) {\n          return index;\n        }\n      } catch (error) {\n        err = error;\n        if (err.code !== 'ENOENT') {\n          throw err;\n        }\n      }\n    }\n    console.error(`Missing index.coffee or index.litcoffee in ${source}`);\n    return process.exit(1);\n  };\n\n  // Compile a single source script, containing the given code, according to the\n  // requested options. If evaluating the script directly, set `__filename`,\n  // `__dirname` and `module.filename` to be correct relative to the script's path.\n  compileScript = function(file, input, base = null) {\n    var compiled, err, message, options, saveTo, task;\n    options = compileOptions(file, base);\n    try {\n      task = {file, input, options};\n      CoffeeScript.emit('compile', task);\n      if (opts.tokens) {\n        return printTokens(CoffeeScript.tokens(task.input, task.options));\n      } else if (opts.nodes) {\n        return printLine(CoffeeScript.nodes(task.input, task.options).toString().trim());\n      } else if (opts.ast) {\n        compiled = CoffeeScript.compile(task.input, task.options);\n        return printLine(JSON.stringify(compiled, null, 2));\n      } else if (opts.run) {\n        CoffeeScript.register();\n        if (opts.prelude) {\n          CoffeeScript.eval(opts.prelude, task.options);\n        }\n        return CoffeeScript.run(task.input, task.options);\n      } else if (opts.join && task.file !== opts.join) {\n        if (helpers.isLiterate(file)) {\n          task.input = helpers.invertLiterate(task.input);\n        }\n        sourceCode[sources.indexOf(task.file)] = task.input;\n        return compileJoin();\n      } else {\n        compiled = CoffeeScript.compile(task.input, task.options);\n        task.output = compiled;\n        if (opts.map) {\n          task.output = compiled.js;\n          task.sourceMap = compiled.v3SourceMap;\n        }\n        CoffeeScript.emit('success', task);\n        if (opts.print) {\n          return printLine(task.output.trim());\n        } else if (opts.compile || opts.map) {\n          saveTo = opts.outputFilename && sources.length === 1 ? path.join(opts.outputPath, opts.outputFilename) : options.jsPath;\n          return writeJs(base, task.file, task.output, saveTo, task.sourceMap);\n        }\n      }\n    } catch (error) {\n      err = error;\n      CoffeeScript.emit('failure', err, task);\n      if (CoffeeScript.listeners('failure').length) {\n        return;\n      }\n      message = (err != null ? err.stack : void 0) || `${err}`;\n      if (opts.watch) {\n        return printLine(message + '\\x07');\n      } else {\n        printWarn(message);\n        return process.exit(1);\n      }\n    }\n  };\n\n  // Attach the appropriate listeners to compile scripts incoming over **stdin**,\n  // and write them back to **stdout**.\n  compileStdio = function() {\n    var buffers, stdin;\n    if (opts.map) {\n      console.error('--stdio and --map cannot be used together');\n      process.exit(1);\n    }\n    buffers = [];\n    stdin = process.openStdin();\n    stdin.on('data', function(buffer) {\n      if (buffer) {\n        return buffers.push(buffer);\n      }\n    });\n    return stdin.on('end', function() {\n      return compileScript(null, Buffer.concat(buffers).toString());\n    });\n  };\n\n  // If all of the source files are done being read, concatenate and compile\n  // them together.\n  joinTimeout = null;\n\n  compileJoin = function() {\n    if (!opts.join) {\n      return;\n    }\n    if (!sourceCode.some(function(code) {\n      return code === null;\n    })) {\n      clearTimeout(joinTimeout);\n      return joinTimeout = wait(100, function() {\n        return compileScript(opts.join, sourceCode.join('\\n'), opts.join);\n      });\n    }\n  };\n\n  // Watch a source CoffeeScript file using `fs.watch`, recompiling it every\n  // time the file is updated. May be used in combination with other options,\n  // such as `--print`.\n  watch = function(source, base) {\n    var compile, compileTimeout, err, prevStats, rewatch, startWatcher, watchErr, watcher;\n    watcher = null;\n    prevStats = null;\n    compileTimeout = null;\n    watchErr = function(err) {\n      if (err.code !== 'ENOENT') {\n        throw err;\n      }\n      if (indexOf.call(sources, source) < 0) {\n        return;\n      }\n      try {\n        rewatch();\n        return compile();\n      } catch (error) {\n        removeSource(source, base);\n        return compileJoin();\n      }\n    };\n    compile = function() {\n      clearTimeout(compileTimeout);\n      return compileTimeout = wait(25, function() {\n        return fs.stat(source, function(err, stats) {\n          if (err) {\n            return watchErr(err);\n          }\n          if (prevStats && stats.size === prevStats.size && stats.mtime.getTime() === prevStats.mtime.getTime()) {\n            return rewatch();\n          }\n          prevStats = stats;\n          return fs.readFile(source, function(err, code) {\n            if (err) {\n              return watchErr(err);\n            }\n            compileScript(source, code.toString(), base);\n            return rewatch();\n          });\n        });\n      });\n    };\n    startWatcher = function() {\n      return watcher = fs.watch(source).on('change', compile).on('error', function(err) {\n        if (err.code !== 'EPERM') {\n          throw err;\n        }\n        return removeSource(source, base);\n      });\n    };\n    rewatch = function() {\n      if (watcher != null) {\n        watcher.close();\n      }\n      return startWatcher();\n    };\n    try {\n      return startWatcher();\n    } catch (error) {\n      err = error;\n      return watchErr(err);\n    }\n  };\n\n  // Watch a directory of files for new additions.\n  watchDir = function(source, base) {\n    var err, readdirTimeout, startWatcher, stopWatcher, watcher;\n    watcher = null;\n    readdirTimeout = null;\n    startWatcher = function() {\n      return watcher = fs.watch(source).on('error', function(err) {\n        if (err.code !== 'EPERM') {\n          throw err;\n        }\n        return stopWatcher();\n      }).on('change', function() {\n        clearTimeout(readdirTimeout);\n        return readdirTimeout = wait(25, function() {\n          var err, file, files, i, len, results;\n          try {\n            files = fs.readdirSync(source);\n          } catch (error) {\n            err = error;\n            if (err.code !== 'ENOENT') {\n              throw err;\n            }\n            return stopWatcher();\n          }\n          results = [];\n          for (i = 0, len = files.length; i < len; i++) {\n            file = files[i];\n            results.push(compilePath(path.join(source, file), false, base));\n          }\n          return results;\n        });\n      });\n    };\n    stopWatcher = function() {\n      watcher.close();\n      return removeSourceDir(source, base);\n    };\n    watchedDirs[source] = true;\n    try {\n      return startWatcher();\n    } catch (error) {\n      err = error;\n      if (err.code !== 'ENOENT') {\n        throw err;\n      }\n    }\n  };\n\n  removeSourceDir = function(source, base) {\n    var file, i, len, sourcesChanged;\n    delete watchedDirs[source];\n    sourcesChanged = false;\n    for (i = 0, len = sources.length; i < len; i++) {\n      file = sources[i];\n      if (!(source === path.dirname(file))) {\n        continue;\n      }\n      removeSource(file, base);\n      sourcesChanged = true;\n    }\n    if (sourcesChanged) {\n      return compileJoin();\n    }\n  };\n\n  // Remove a file from our source list, and source code cache. Optionally remove\n  // the compiled JS version as well.\n  removeSource = function(source, base) {\n    var index;\n    index = sources.indexOf(source);\n    sources.splice(index, 1);\n    sourceCode.splice(index, 1);\n    if (!opts.join) {\n      silentUnlink(outputPath(source, base));\n      silentUnlink(outputPath(source, base, '.js.map'));\n      return timeLog(`removed ${source}`);\n    }\n  };\n\n  silentUnlink = function(path) {\n    var err, ref;\n    try {\n      return fs.unlinkSync(path);\n    } catch (error) {\n      err = error;\n      if ((ref = err.code) !== 'ENOENT' && ref !== 'EPERM') {\n        throw err;\n      }\n    }\n  };\n\n  // Get the corresponding output JavaScript path for a source file.\n  outputPath = function(source, base, extension = \".js\") {\n    var basename, dir, srcDir;\n    basename = helpers.baseFileName(source, true, useWinPathSep);\n    srcDir = path.dirname(source);\n    dir = !opts.outputPath ? srcDir : source === base ? opts.outputPath : path.join(opts.outputPath, path.relative(base, srcDir));\n    return path.join(dir, basename + extension);\n  };\n\n  // Recursively mkdir, like `mkdir -p`.\n  mkdirp = function(dir, fn) {\n    var mkdirs, mode;\n    mode = 0o777 & ~process.umask();\n    return (mkdirs = function(p, fn) {\n      return fs.exists(p, function(exists) {\n        if (exists) {\n          return fn();\n        } else {\n          return mkdirs(path.dirname(p), function() {\n            return fs.mkdir(p, mode, function(err) {\n              if (err) {\n                return fn(err);\n              }\n              return fn();\n            });\n          });\n        }\n      });\n    })(dir, fn);\n  };\n\n  // Write out a JavaScript source file with the compiled code. By default, files\n  // are written out in `cwd` as `.js` files with the same name, but the output\n  // directory can be customized with `--output`.\n\n  // If `generatedSourceMap` is provided, this will write a `.js.map` file into the\n  // same directory as the `.js` file.\n  writeJs = function(base, sourcePath, js, jsPath, generatedSourceMap = null) {\n    var compile, jsDir, sourceMapPath;\n    sourceMapPath = `${jsPath}.map`;\n    jsDir = path.dirname(jsPath);\n    compile = function() {\n      if (opts.compile) {\n        if (js.length <= 0) {\n          js = ' ';\n        }\n        if (generatedSourceMap) {\n          js = `${js}\\n//# sourceMappingURL=${helpers.baseFileName(sourceMapPath, false, useWinPathSep)}\\n`;\n        }\n        fs.writeFile(jsPath, js, function(err) {\n          if (err) {\n            printLine(err.message);\n            return process.exit(1);\n          } else if (opts.compile && opts.watch) {\n            return timeLog(`compiled ${sourcePath}`);\n          }\n        });\n      }\n      if (generatedSourceMap) {\n        return fs.writeFile(sourceMapPath, generatedSourceMap, function(err) {\n          if (err) {\n            printLine(`Could not write source map: ${err.message}`);\n            return process.exit(1);\n          }\n        });\n      }\n    };\n    return fs.exists(jsDir, function(itExists) {\n      if (itExists) {\n        return compile();\n      } else {\n        return mkdirp(jsDir, compile);\n      }\n    });\n  };\n\n  // Convenience for cleaner setTimeouts.\n  wait = function(milliseconds, func) {\n    return setTimeout(func, milliseconds);\n  };\n\n  // When watching scripts, it's useful to log changes with the timestamp.\n  timeLog = function(message) {\n    return console.log(`${(new Date()).toLocaleTimeString()} - ${message}`);\n  };\n\n  // Pretty-print a stream of tokens, sans location data.\n  printTokens = function(tokens) {\n    var strings, tag, token, value;\n    strings = (function() {\n      var i, len, results;\n      results = [];\n      for (i = 0, len = tokens.length; i < len; i++) {\n        token = tokens[i];\n        tag = token[0];\n        value = token[1].toString().replace(/\\n/, '\\\\n');\n        results.push(`[${tag} ${value}]`);\n      }\n      return results;\n    })();\n    return printLine(strings.join(' '));\n  };\n\n  // Use the [OptionParser module](optparse.html) to extract all options from\n  // `process.argv` that are specified in `SWITCHES`.\n  parseOptions = function() {\n    var o;\n    o = opts = optionParser.parse(process.argv.slice(2));\n    o.compile || (o.compile = !!o.output);\n    o.run = !(o.compile || o.print || o.map);\n    return o.print = !!(o.print || (o.eval || o.stdio && o.compile));\n  };\n\n  // The compile-time options to pass to the CoffeeScript compiler.\n  compileOptions = function(filename, base) {\n    var answer, cwd, jsDir, jsPath;\n    if (opts.transpile) {\n      try {\n        // The user has requested that the CoffeeScript compiler also transpile\n        // via Babel. We don’t include Babel as a dependency because we want to\n        // avoid dependencies in general, and most users probably won’t be relying\n        // on us to transpile for them; we assume most users will probably either\n        // run CoffeeScript’s output without transpilation (modern Node or evergreen\n        // browsers) or use a proper build chain like Gulp or Webpack.\n        require('@babel/core');\n      } catch (error) {\n        try {\n          require('babel-core');\n        } catch (error) {\n          // Give appropriate instructions depending on whether `coffee` was run\n          // locally or globally.\n          if (require.resolve('.').indexOf(process.cwd()) === 0) {\n            console.error(`To use --transpile, you must have @babel/core installed:\n  npm install --save-dev @babel/core\nAnd you must save options to configure Babel in one of the places it looks to find its options.\nSee https://coffeescript.org/#transpilation`);\n          } else {\n            console.error(`To use --transpile with globally-installed CoffeeScript, you must have @babel/core installed globally:\n  npm install --global @babel/core\nAnd you must save options to configure Babel in one of the places it looks to find its options, relative to the file being compiled or to the current folder.\nSee https://coffeescript.org/#transpilation`);\n          }\n          process.exit(1);\n        }\n      }\n      if (typeof opts.transpile !== 'object') {\n        opts.transpile = {};\n      }\n      // Pass a reference to Babel into the compiler, so that the transpile option\n      // is available for the CLI. We need to do this so that tools like Webpack\n      // can `require('coffeescript')` and build correctly, without trying to\n      // require Babel.\n      opts.transpile.transpile = CoffeeScript.transpile;\n      // Babel searches for its options (a `.babelrc` file, a `.babelrc.js` file,\n      // a `package.json` file with a `babel` key, etc.) relative to the path\n      // given to it in its `filename` option. Make sure we have a path to pass\n      // along.\n      if (!opts.transpile.filename) {\n        opts.transpile.filename = filename || path.resolve(base || process.cwd(), '<anonymous>');\n      }\n    } else {\n      opts.transpile = false;\n    }\n    answer = {\n      filename: filename,\n      literate: opts.literate || helpers.isLiterate(filename),\n      bare: opts.bare,\n      header: opts.compile && !opts['no-header'],\n      transpile: opts.transpile,\n      sourceMap: opts.map,\n      inlineMap: opts['inline-map'],\n      ast: opts.ast\n    };\n    if (filename) {\n      if (base) {\n        cwd = process.cwd();\n        jsPath = outputPath(filename, base);\n        jsDir = path.dirname(jsPath);\n        answer = helpers.merge(answer, {\n          jsPath,\n          sourceRoot: path.relative(jsDir, cwd) + path.sep,\n          sourceFiles: [path.relative(cwd, filename)],\n          generatedFile: helpers.baseFileName(jsPath, false, useWinPathSep)\n        });\n      } else {\n        answer = helpers.merge(answer, {\n          sourceRoot: \"\",\n          sourceFiles: [helpers.baseFileName(filename, false, useWinPathSep)],\n          generatedFile: helpers.baseFileName(filename, true, useWinPathSep) + \".js\"\n        });\n      }\n    }\n    return answer;\n  };\n\n  // Start up a new Node.js instance with the arguments in `--nodejs` passed to\n  // the `node` binary, preserving the other options.\n  forkNode = function() {\n    var args, i, len, nodeArgs, p, ref, signal;\n    nodeArgs = opts.nodejs.split(/\\s+/);\n    args = process.argv.slice(1);\n    args.splice(args.indexOf('--nodejs'), 2);\n    p = spawn(process.execPath, nodeArgs.concat(args), {\n      cwd: process.cwd(),\n      env: process.env,\n      stdio: [0, 1, 2]\n    });\n    ref = ['SIGINT', 'SIGTERM'];\n    for (i = 0, len = ref.length; i < len; i++) {\n      signal = ref[i];\n      process.on(signal, (function(signal) {\n        return function() {\n          return p.kill(signal);\n        };\n      })(signal));\n    }\n    return p.on('exit', function(code) {\n      return process.exit(code);\n    });\n  };\n\n  // Print the `--help` usage message and exit. Deprecated switches are not\n  // shown.\n  usage = function() {\n    return printLine(optionParser.help());\n  };\n\n  // Print the `--version` message and exit.\n  version = function() {\n    return printLine(`CoffeeScript version ${CoffeeScript.VERSION}`);\n  };\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/grammar.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  // The CoffeeScript parser is generated by [Jison](https://github.com/zaach/jison)\n  // from this grammar file. Jison is a bottom-up parser generator, similar in\n  // style to [Bison](http://www.gnu.org/software/bison), implemented in JavaScript.\n  // It can recognize [LALR(1), LR(0), SLR(1), and LR(1)](https://en.wikipedia.org/wiki/LR_grammar)\n  // type grammars. To create the Jison parser, we list the pattern to match\n  // on the left-hand side, and the action to take (usually the creation of syntax\n  // tree nodes) on the right. As the parser runs, it\n  // shifts tokens from our token stream, from left to right, and\n  // [attempts to match](https://en.wikipedia.org/wiki/Bottom-up_parsing)\n  // the token sequence against the rules below. When a match can be made, it\n  // reduces into the [nonterminal](https://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols)\n  // (the enclosing name at the top), and we proceed from there.\n\n  // If you run the `cake build:parser` command, Jison constructs a parse table\n  // from our rules and saves it into `lib/parser.js`.\n\n  // The only dependency is on the **Jison.Parser**.\n  var Parser, alt, alternatives, grammar, name, o, operators, token, tokens, unwrap;\n\n  ({Parser} = require('jison'));\n\n  // Jison DSL\n  // ---------\n\n  // Since we're going to be wrapped in a function by Jison in any case, if our\n  // action immediately returns a value, we can optimize by removing the function\n  // wrapper and just returning the value directly.\n  unwrap = /^function\\s*\\(\\)\\s*\\{\\s*return\\s*([\\s\\S]*);\\s*\\}/;\n\n  // Our handy DSL for Jison grammar generation, thanks to\n  // [Tim Caswell](https://github.com/creationix). For every rule in the grammar,\n  // we pass the pattern-defining string, the action to run, and extra options,\n  // optionally. If no action is specified, we simply pass the value of the\n  // previous nonterminal.\n  o = function(patternString, action, options) {\n    var getAddDataToNodeFunctionString, match, patternCount, performActionFunctionString, returnsLoc;\n    patternString = patternString.replace(/\\s{2,}/g, ' ');\n    patternCount = patternString.split(' ').length;\n    if (action) {\n      // This code block does string replacements in the generated `parser.js`\n      // file, replacing the calls to the `LOC` function and other strings as\n      // listed below.\n      action = (match = unwrap.exec(action)) ? match[1] : `(${action}())`;\n      // All runtime functions we need are defined on `yy`\n      action = action.replace(/\\bnew /g, '$&yy.');\n      action = action.replace(/\\b(?:Block\\.wrap|extend)\\b/g, 'yy.$&');\n      // Returns strings of functions to add to `parser.js` which add extra data\n      // that nodes may have, such as comments or location data. Location data\n      // is added to the first parameter passed in, and the parameter is returned.\n      // If the parameter is not a node, it will just be passed through unaffected.\n      getAddDataToNodeFunctionString = function(first, last, forceUpdateLocation = true) {\n        return `yy.addDataToNode(yy, @${first}, ${first[0] === '$' ? '$$' : '$'}${first}, ${last ? `@${last}, ${last[0] === '$' ? '$$' : '$'}${last}` : 'null, null'}, ${forceUpdateLocation ? 'true' : 'false'})`;\n      };\n      // This code replaces the calls to `LOC` with the `yy.addDataToNode` string\n      // defined above. The `LOC` function, when used below in the grammar rules,\n      // is used to make sure that newly created node class objects get correct\n      // location data assigned to them. By default, the grammar will assign the\n      // location data spanned by *all* of the tokens on the left (e.g. a string\n      // such as `'Body TERMINATOR Line'`) to the “top-level” node returned by\n      // the grammar rule (the function on the right). But for “inner” node class\n      // objects created by grammar rules, they won’t get correct location data\n      // assigned to them without adding `LOC`.\n\n      // For example, consider the grammar rule `'NEW_TARGET . Property'`, which\n      // is handled by a function that returns\n      // `new MetaProperty LOC(1)(new IdentifierLiteral $1), LOC(3)(new Access $3)`.\n      // The `1` in `LOC(1)` refers to the first token (`NEW_TARGET`) and the `3`\n      // in `LOC(3)` refers to the third token (`Property`). In order for the\n      // `new IdentifierLiteral` to get assigned the location data corresponding\n      // to `new` in the source code, we use\n      // `LOC(1)(new IdentifierLiteral ...)` to mean “assign the location data of\n      // the *first* token of this grammar rule (`NEW_TARGET`) to this\n      // `new IdentifierLiteral`”. The `LOC(3)` means “assign the location data of\n      // the *third* token of this grammar rule (`Property`) to this\n      // `new Access`”.\n      returnsLoc = /^LOC/.test(action);\n      action = action.replace(/LOC\\(([0-9]*)\\)/g, getAddDataToNodeFunctionString('$1'));\n      // A call to `LOC` with two arguments, e.g. `LOC(2,4)`, sets the location\n      // data for the generated node on both of the referenced tokens  (the second\n      // and fourth in this example).\n      action = action.replace(/LOC\\(([0-9]*),\\s*([0-9]*)\\)/g, getAddDataToNodeFunctionString('$1', '$2'));\n      performActionFunctionString = `$$ = ${getAddDataToNodeFunctionString(1, patternCount, !returnsLoc)}(${action});`;\n    } else {\n      performActionFunctionString = '$$ = $1;';\n    }\n    return [patternString, performActionFunctionString, options];\n  };\n\n  // Grammatical Rules\n  // -----------------\n\n  // In all of the rules that follow, you'll see the name of the nonterminal as\n  // the key to a list of alternative matches. With each match's action, the\n  // dollar-sign variables are provided by Jison as references to the value of\n  // their numeric position, so in this rule:\n\n  //     'Expression UNLESS Expression'\n\n  // `$1` would be the value of the first `Expression`, `$2` would be the token\n  // for the `UNLESS` terminal, and `$3` would be the value of the second\n  // `Expression`.\n  grammar = {\n    // The **Root** is the top-level node in the syntax tree. Since we parse bottom-up,\n    // all parsing must end here.\n    Root: [\n      o('',\n      function() {\n        return new Root(new Block());\n      }),\n      o('Body',\n      function() {\n        return new Root($1);\n      })\n    ],\n    // Any list of statements and expressions, separated by line breaks or semicolons.\n    Body: [\n      o('Line',\n      function() {\n        return Block.wrap([$1]);\n      }),\n      o('Body TERMINATOR Line',\n      function() {\n        return $1.push($3);\n      }),\n      o('Body TERMINATOR')\n    ],\n    // Block and statements, which make up a line in a body. FuncDirective is a\n    // statement, but not included in Statement because that results in an ambiguous\n    // grammar.\n    Line: [o('Expression'), o('ExpressionLine'), o('Statement'), o('FuncDirective')],\n    FuncDirective: [o('YieldReturn'), o('AwaitReturn')],\n    // Pure statements which cannot be expressions.\n    Statement: [\n      o('Return'),\n      o('STATEMENT',\n      function() {\n        return new StatementLiteral($1);\n      }),\n      o('Import'),\n      o('Export')\n    ],\n    // All the different types of expressions in our language. The basic unit of\n    // CoffeeScript is the **Expression** -- everything that can be an expression\n    // is one. Blocks serve as the building blocks of many other rules, making\n    // them somewhat circular.\n    Expression: [o('Value'), o('Code'), o('Operation'), o('Assign'), o('If'), o('Try'), o('While'), o('For'), o('Switch'), o('Class'), o('Throw'), o('Yield')],\n    // Expressions which are written in single line and would otherwise require being\n    // wrapped in braces: E.g `a = b if do -> f a is 1`, `if f (a) -> a*2 then ...`,\n    // `for x in do (obj) -> f obj when x > 8 then f x`\n    ExpressionLine: [o('CodeLine'), o('IfLine'), o('OperationLine')],\n    Yield: [\n      o('YIELD',\n      function() {\n        return new Op($1,\n      new Value(new Literal('')));\n      }),\n      o('YIELD Expression',\n      function() {\n        return new Op($1,\n      $2);\n      }),\n      o('YIELD INDENT Object OUTDENT',\n      function() {\n        return new Op($1,\n      $3);\n      }),\n      o('YIELD FROM Expression',\n      function() {\n        return new Op($1.concat($2),\n      $3);\n      })\n    ],\n    // An indented block of expressions. Note that the [Rewriter](rewriter.html)\n    // will convert some postfix forms into blocks for us, by adjusting the\n    // token stream.\n    Block: [\n      o('INDENT OUTDENT',\n      function() {\n        return new Block();\n      }),\n      o('INDENT Body OUTDENT',\n      function() {\n        return $2;\n      })\n    ],\n    Identifier: [\n      o('IDENTIFIER',\n      function() {\n        return new IdentifierLiteral($1);\n      }),\n      o('JSX_TAG',\n      function() {\n        var ref,\n      ref1,\n      ref2,\n      ref3;\n        return new JSXTag($1.toString(),\n      {\n          tagNameLocationData: $1.tagNameToken[2],\n          closingTagOpeningBracketLocationData: (ref = $1.closingTagOpeningBracketToken) != null ? ref[2] : void 0,\n          closingTagSlashLocationData: (ref1 = $1.closingTagSlashToken) != null ? ref1[2] : void 0,\n          closingTagNameLocationData: (ref2 = $1.closingTagNameToken) != null ? ref2[2] : void 0,\n          closingTagClosingBracketLocationData: (ref3 = $1.closingTagClosingBracketToken) != null ? ref3[2] : void 0\n        });\n      })\n    ],\n    Property: [\n      o('PROPERTY',\n      function() {\n        return new PropertyName($1.toString());\n      })\n    ],\n    // Alphanumerics are separated from the other **Literal** matchers because\n    // they can also serve as keys in object literals.\n    AlphaNumeric: [\n      o('NUMBER',\n      function() {\n        return new NumberLiteral($1.toString(),\n      {\n          parsedValue: $1.parsedValue\n        });\n      }),\n      o('String')\n    ],\n    String: [\n      o('STRING',\n      function() {\n        return new StringLiteral($1.slice(1,\n      -1), // strip artificial quotes and unwrap to primitive string\n      {\n          quote: $1.quote,\n          initialChunk: $1.initialChunk,\n          finalChunk: $1.finalChunk,\n          indent: $1.indent,\n          double: $1.double,\n          heregex: $1.heregex\n        });\n      }),\n      o('STRING_START Interpolations STRING_END',\n      function() {\n        return new StringWithInterpolations(Block.wrap($2),\n      {\n          quote: $1.quote,\n          startQuote: LOC(1)(new Literal($1.toString()))\n        });\n      })\n    ],\n    Interpolations: [\n      o('InterpolationChunk',\n      function() {\n        return [$1];\n      }),\n      o('Interpolations InterpolationChunk',\n      function() {\n        return $1.concat($2);\n      })\n    ],\n    InterpolationChunk: [\n      o('INTERPOLATION_START Body INTERPOLATION_END',\n      function() {\n        return new Interpolation($2);\n      }),\n      o('INTERPOLATION_START INDENT Body OUTDENT INTERPOLATION_END',\n      function() {\n        return new Interpolation($3);\n      }),\n      o('INTERPOLATION_START INTERPOLATION_END',\n      function() {\n        return new Interpolation();\n      }),\n      o('String',\n      function() {\n        return $1;\n      })\n    ],\n    // The .toString() calls here and elsewhere are to convert `String` objects\n    // back to primitive strings now that we've retrieved stowaway extra properties\n    Regex: [\n      o('REGEX',\n      function() {\n        return new RegexLiteral($1.toString(),\n      {\n          delimiter: $1.delimiter,\n          heregexCommentTokens: $1.heregexCommentTokens\n        });\n      }),\n      o('REGEX_START Invocation REGEX_END',\n      function() {\n        return new RegexWithInterpolations($2,\n      {\n          heregexCommentTokens: $3.heregexCommentTokens\n        });\n      })\n    ],\n    // All of our immediate values. Generally these can be passed straight\n    // through and printed to JavaScript.\n    Literal: [\n      o('AlphaNumeric'),\n      o('JS',\n      function() {\n        return new PassthroughLiteral($1.toString(),\n      {\n          here: $1.here,\n          generated: $1.generated\n        });\n      }),\n      o('Regex'),\n      o('UNDEFINED',\n      function() {\n        return new UndefinedLiteral($1);\n      }),\n      o('NULL',\n      function() {\n        return new NullLiteral($1);\n      }),\n      o('BOOL',\n      function() {\n        return new BooleanLiteral($1.toString(),\n      {\n          originalValue: $1.original\n        });\n      }),\n      o('INFINITY',\n      function() {\n        return new InfinityLiteral($1.toString(),\n      {\n          originalValue: $1.original\n        });\n      }),\n      o('NAN',\n      function() {\n        return new NaNLiteral($1);\n      })\n    ],\n    // Assignment of a variable, property, or index to a value.\n    Assign: [\n      o('Assignable = Expression',\n      function() {\n        return new Assign($1,\n      $3);\n      }),\n      o('Assignable = TERMINATOR Expression',\n      function() {\n        return new Assign($1,\n      $4);\n      }),\n      o('Assignable = INDENT Expression OUTDENT',\n      function() {\n        return new Assign($1,\n      $4);\n      })\n    ],\n    // Assignment when it happens within an object literal. The difference from\n    // the ordinary **Assign** is that these allow numbers and strings as keys.\n    AssignObj: [\n      o('ObjAssignable',\n      function() {\n        return new Value($1);\n      }),\n      o('ObjRestValue'),\n      o('ObjAssignable : Expression',\n      function() {\n        return new Assign(LOC(1)(new Value($1)),\n      $3,\n      'object',\n      {\n          operatorToken: LOC(2)(new Literal($2))\n        });\n      }),\n      o('ObjAssignable : INDENT Expression OUTDENT',\n      function() {\n        return new Assign(LOC(1)(new Value($1)),\n      $4,\n      'object',\n      {\n          operatorToken: LOC(2)(new Literal($2))\n        });\n      }),\n      o('SimpleObjAssignable = Expression',\n      function() {\n        return new Assign(LOC(1)(new Value($1)),\n      $3,\n      null,\n      {\n          operatorToken: LOC(2)(new Literal($2))\n        });\n      }),\n      o('SimpleObjAssignable = INDENT Expression OUTDENT',\n      function() {\n        return new Assign(LOC(1)(new Value($1)),\n      $4,\n      null,\n      {\n          operatorToken: LOC(2)(new Literal($2))\n        });\n      })\n    ],\n    SimpleObjAssignable: [o('Identifier'), o('Property'), o('ThisProperty')],\n    ObjAssignable: [\n      o('SimpleObjAssignable'),\n      o('[ Expression ]',\n      function() {\n        return new Value(new ComputedPropertyName($2));\n      }),\n      o('@ [ Expression ]',\n      function() {\n        return new Value(LOC(1)(new ThisLiteral($1)),\n      [LOC(3)(new ComputedPropertyName($3))],\n      'this');\n      }),\n      o('AlphaNumeric')\n    ],\n    // Object literal spread properties.\n    ObjRestValue: [\n      o('SimpleObjAssignable ...',\n      function() {\n        return new Splat(new Value($1));\n      }),\n      o('... SimpleObjAssignable',\n      function() {\n        return new Splat(new Value($2),\n      {\n          postfix: false\n        });\n      }),\n      o('ObjSpreadExpr ...',\n      function() {\n        return new Splat($1);\n      }),\n      o('... ObjSpreadExpr',\n      function() {\n        return new Splat($2,\n      {\n          postfix: false\n        });\n      })\n    ],\n    ObjSpreadExpr: [\n      o('ObjSpreadIdentifier'),\n      o('Object'),\n      o('Parenthetical'),\n      o('Super'),\n      o('This'),\n      o('SUPER OptFuncExist Arguments',\n      function() {\n        return new SuperCall(LOC(1)(new Super()),\n      $3,\n      $2.soak,\n      $1);\n      }),\n      o('DYNAMIC_IMPORT Arguments',\n      function() {\n        return new DynamicImportCall(LOC(1)(new DynamicImport()),\n      $2);\n      }),\n      o('SimpleObjAssignable OptFuncExist Arguments',\n      function() {\n        return new Call(new Value($1),\n      $3,\n      $2.soak);\n      }),\n      o('ObjSpreadExpr OptFuncExist Arguments',\n      function() {\n        return new Call($1,\n      $3,\n      $2.soak);\n      })\n    ],\n    ObjSpreadIdentifier: [\n      o('SimpleObjAssignable Accessor',\n      function() {\n        return (new Value($1)).add($2);\n      }),\n      o('ObjSpreadExpr Accessor',\n      function() {\n        return (new Value($1)).add($2);\n      })\n    ],\n    // A return statement from a function body.\n    Return: [\n      o('RETURN Expression',\n      function() {\n        return new Return($2);\n      }),\n      o('RETURN INDENT Object OUTDENT',\n      function() {\n        return new Return(new Value($3));\n      }),\n      o('RETURN',\n      function() {\n        return new Return();\n      })\n    ],\n    YieldReturn: [\n      o('YIELD RETURN Expression',\n      function() {\n        return new YieldReturn($3,\n      {\n          returnKeyword: LOC(2)(new Literal($2))\n        });\n      }),\n      o('YIELD RETURN',\n      function() {\n        return new YieldReturn(null,\n      {\n          returnKeyword: LOC(2)(new Literal($2))\n        });\n      })\n    ],\n    AwaitReturn: [\n      o('AWAIT RETURN Expression',\n      function() {\n        return new AwaitReturn($3,\n      {\n          returnKeyword: LOC(2)(new Literal($2))\n        });\n      }),\n      o('AWAIT RETURN',\n      function() {\n        return new AwaitReturn(null,\n      {\n          returnKeyword: LOC(2)(new Literal($2))\n        });\n      })\n    ],\n    // The **Code** node is the function literal. It’s defined by an indented block\n    // of **Block** preceded by a function arrow, with an optional parameter list.\n    Code: [\n      o('PARAM_START ParamList PARAM_END FuncGlyph Block',\n      function() {\n        return new Code($2,\n      $5,\n      $4,\n      LOC(1)(new Literal($1)));\n      }),\n      o('FuncGlyph Block',\n      function() {\n        return new Code([],\n      $2,\n      $1);\n      })\n    ],\n    // The Codeline is the **Code** node with **Line** instead of indented **Block**.\n    CodeLine: [\n      o('PARAM_START ParamList PARAM_END FuncGlyph Line',\n      function() {\n        return new Code($2,\n      LOC(5)(Block.wrap([$5])),\n      $4,\n      LOC(1)(new Literal($1)));\n      }),\n      o('FuncGlyph Line',\n      function() {\n        return new Code([],\n      LOC(2)(Block.wrap([$2])),\n      $1);\n      })\n    ],\n    // CoffeeScript has two different symbols for functions. `->` is for ordinary\n    // functions, and `=>` is for functions bound to the current value of *this*.\n    FuncGlyph: [\n      o('->',\n      function() {\n        return new FuncGlyph($1);\n      }),\n      o('=>',\n      function() {\n        return new FuncGlyph($1);\n      })\n    ],\n    // An optional, trailing comma.\n    OptComma: [o(''), o(',')],\n    // The list of parameters that a function accepts can be of any length.\n    ParamList: [\n      o('',\n      function() {\n        return [];\n      }),\n      o('Param',\n      function() {\n        return [$1];\n      }),\n      o('ParamList , Param',\n      function() {\n        return $1.concat($3);\n      }),\n      o('ParamList OptComma TERMINATOR Param',\n      function() {\n        return $1.concat($4);\n      }),\n      o('ParamList OptComma INDENT ParamList OptComma OUTDENT',\n      function() {\n        return $1.concat($4);\n      })\n    ],\n    // A single parameter in a function definition can be ordinary, or a splat\n    // that hoovers up the remaining arguments.\n    Param: [\n      o('ParamVar',\n      function() {\n        return new Param($1);\n      }),\n      o('ParamVar ...',\n      function() {\n        return new Param($1,\n      null,\n      true);\n      }),\n      o('... ParamVar',\n      function() {\n        return new Param($2,\n      null,\n      {\n          postfix: false\n        });\n      }),\n      o('ParamVar = Expression',\n      function() {\n        return new Param($1,\n      $3);\n      }),\n      o('...',\n      function() {\n        return new Expansion();\n      })\n    ],\n    // Function Parameters\n    ParamVar: [o('Identifier'), o('ThisProperty'), o('Array'), o('Object')],\n    // A splat that occurs outside of a parameter list.\n    Splat: [\n      o('Expression ...',\n      function() {\n        return new Splat($1);\n      }),\n      o('... Expression',\n      function() {\n        return new Splat($2,\n      {\n          postfix: false\n        });\n      })\n    ],\n    // Variables and properties that can be assigned to.\n    SimpleAssignable: [\n      o('Identifier',\n      function() {\n        return new Value($1);\n      }),\n      o('Value Accessor',\n      function() {\n        return $1.add($2);\n      }),\n      o('Code Accessor',\n      function() {\n        return new Value($1).add($2);\n      }),\n      o('ThisProperty')\n    ],\n    // Everything that can be assigned to.\n    Assignable: [\n      o('SimpleAssignable'),\n      o('Array',\n      function() {\n        return new Value($1);\n      }),\n      o('Object',\n      function() {\n        return new Value($1);\n      })\n    ],\n    // The types of things that can be treated as values -- assigned to, invoked\n    // as functions, indexed into, named as a class, etc.\n    Value: [\n      o('Assignable'),\n      o('Literal',\n      function() {\n        return new Value($1);\n      }),\n      o('Parenthetical',\n      function() {\n        return new Value($1);\n      }),\n      o('Range',\n      function() {\n        return new Value($1);\n      }),\n      o('Invocation',\n      function() {\n        return new Value($1);\n      }),\n      o('DoIife',\n      function() {\n        return new Value($1);\n      }),\n      o('This'),\n      o('Super',\n      function() {\n        return new Value($1);\n      }),\n      o('MetaProperty',\n      function() {\n        return new Value($1);\n      })\n    ],\n    // A `super`-based expression that can be used as a value.\n    Super: [\n      o('SUPER . Property',\n      function() {\n        return new Super(LOC(3)(new Access($3)),\n      LOC(1)(new Literal($1)));\n      }),\n      o('SUPER INDEX_START Expression INDEX_END',\n      function() {\n        return new Super(LOC(3)(new Index($3)),\n      LOC(1)(new Literal($1)));\n      }),\n      o('SUPER INDEX_START INDENT Expression OUTDENT INDEX_END',\n      function() {\n        return new Super(LOC(4)(new Index($4)),\n      LOC(1)(new Literal($1)));\n      })\n    ],\n    // A “meta-property” access e.g. `new.target` or `import.meta`, where\n    // something that looks like a property is referenced on a keyword.\n    MetaProperty: [\n      o('NEW_TARGET . Property',\n      function() {\n        return new MetaProperty(LOC(1)(new IdentifierLiteral($1)),\n      LOC(3)(new Access($3)));\n      }),\n      o('IMPORT_META . Property',\n      function() {\n        return new MetaProperty(LOC(1)(new IdentifierLiteral($1)),\n      LOC(3)(new Access($3)));\n      })\n    ],\n    // The general group of accessors into an object, by property, by prototype\n    // or by array index or slice.\n    Accessor: [\n      o('.  Property',\n      function() {\n        return new Access($2);\n      }),\n      o('?. Property',\n      function() {\n        return new Access($2,\n      {\n          soak: true\n        });\n      }),\n      o(':: Property',\n      function() {\n        return [\n          LOC(1)(new Access(new PropertyName('prototype'),\n          {\n            shorthand: true\n          })),\n          LOC(2)(new Access($2))\n        ];\n      }),\n      o('?:: Property',\n      function() {\n        return [\n          LOC(1)(new Access(new PropertyName('prototype'),\n          {\n            shorthand: true,\n            soak: true\n          })),\n          LOC(2)(new Access($2))\n        ];\n      }),\n      o('::',\n      function() {\n        return new Access(new PropertyName('prototype'),\n      {\n          shorthand: true\n        });\n      }),\n      o('?::',\n      function() {\n        return new Access(new PropertyName('prototype'),\n      {\n          shorthand: true,\n          soak: true\n        });\n      }),\n      o('Index')\n    ],\n    // Indexing into an object or array using bracket notation.\n    Index: [\n      o('INDEX_START IndexValue INDEX_END',\n      function() {\n        return $2;\n      }),\n      o('INDEX_START INDENT IndexValue OUTDENT INDEX_END',\n      function() {\n        return $3;\n      }),\n      o('INDEX_SOAK  Index',\n      function() {\n        return extend($2,\n      {\n          soak: true\n        });\n      })\n    ],\n    IndexValue: [\n      o('Expression',\n      function() {\n        return new Index($1);\n      }),\n      o('Slice',\n      function() {\n        return new Slice($1);\n      })\n    ],\n    // In CoffeeScript, an object literal is simply a list of assignments.\n    Object: [\n      o('{ AssignList OptComma }',\n      function() {\n        return new Obj($2,\n      $1.generated);\n      })\n    ],\n    // Assignment of properties within an object literal can be separated by\n    // comma, as in JavaScript, or simply by newline.\n    AssignList: [\n      o('',\n      function() {\n        return [];\n      }),\n      o('AssignObj',\n      function() {\n        return [$1];\n      }),\n      o('AssignList , AssignObj',\n      function() {\n        return $1.concat($3);\n      }),\n      o('AssignList OptComma TERMINATOR AssignObj',\n      function() {\n        return $1.concat($4);\n      }),\n      o('AssignList OptComma INDENT AssignList OptComma OUTDENT',\n      function() {\n        return $1.concat($4);\n      })\n    ],\n    // Class definitions have optional bodies of prototype property assignments,\n    // and optional references to the superclass.\n    Class: [\n      o('CLASS',\n      function() {\n        return new Class();\n      }),\n      o('CLASS Block',\n      function() {\n        return new Class(null,\n      null,\n      $2);\n      }),\n      o('CLASS EXTENDS Expression',\n      function() {\n        return new Class(null,\n      $3);\n      }),\n      o('CLASS EXTENDS Expression Block',\n      function() {\n        return new Class(null,\n      $3,\n      $4);\n      }),\n      o('CLASS SimpleAssignable',\n      function() {\n        return new Class($2);\n      }),\n      o('CLASS SimpleAssignable Block',\n      function() {\n        return new Class($2,\n      null,\n      $3);\n      }),\n      o('CLASS SimpleAssignable EXTENDS Expression',\n      function() {\n        return new Class($2,\n      $4);\n      }),\n      o('CLASS SimpleAssignable EXTENDS Expression Block',\n      function() {\n        return new Class($2,\n      $4,\n      $5);\n      })\n    ],\n    Import: [\n      o('IMPORT String',\n      function() {\n        return new ImportDeclaration(null,\n      $2);\n      }),\n      o('IMPORT String ASSERT Object',\n      function() {\n        return new ImportDeclaration(null,\n      $2,\n      $4);\n      }),\n      o('IMPORT ImportDefaultSpecifier FROM String',\n      function() {\n        return new ImportDeclaration(new ImportClause($2,\n      null),\n      $4);\n      }),\n      o('IMPORT ImportDefaultSpecifier FROM String ASSERT Object',\n      function() {\n        return new ImportDeclaration(new ImportClause($2,\n      null),\n      $4,\n      $6);\n      }),\n      o('IMPORT ImportNamespaceSpecifier FROM String',\n      function() {\n        return new ImportDeclaration(new ImportClause(null,\n      $2),\n      $4);\n      }),\n      o('IMPORT ImportNamespaceSpecifier FROM String ASSERT Object',\n      function() {\n        return new ImportDeclaration(new ImportClause(null,\n      $2),\n      $4,\n      $6);\n      }),\n      o('IMPORT { } FROM String',\n      function() {\n        return new ImportDeclaration(new ImportClause(null,\n      new ImportSpecifierList([])),\n      $5);\n      }),\n      o('IMPORT { } FROM String ASSERT Object',\n      function() {\n        return new ImportDeclaration(new ImportClause(null,\n      new ImportSpecifierList([])),\n      $5,\n      $7);\n      }),\n      o('IMPORT { ImportSpecifierList OptComma } FROM String',\n      function() {\n        return new ImportDeclaration(new ImportClause(null,\n      new ImportSpecifierList($3)),\n      $7);\n      }),\n      o('IMPORT { ImportSpecifierList OptComma } FROM String ASSERT Object',\n      function() {\n        return new ImportDeclaration(new ImportClause(null,\n      new ImportSpecifierList($3)),\n      $7,\n      $9);\n      }),\n      o('IMPORT ImportDefaultSpecifier , ImportNamespaceSpecifier FROM String',\n      function() {\n        return new ImportDeclaration(new ImportClause($2,\n      $4),\n      $6);\n      }),\n      o('IMPORT ImportDefaultSpecifier , ImportNamespaceSpecifier FROM String ASSERT Object',\n      function() {\n        return new ImportDeclaration(new ImportClause($2,\n      $4),\n      $6,\n      $8);\n      }),\n      o('IMPORT ImportDefaultSpecifier , { ImportSpecifierList OptComma } FROM String',\n      function() {\n        return new ImportDeclaration(new ImportClause($2,\n      new ImportSpecifierList($5)),\n      $9);\n      }),\n      o('IMPORT ImportDefaultSpecifier , { ImportSpecifierList OptComma } FROM String ASSERT Object',\n      function() {\n        return new ImportDeclaration(new ImportClause($2,\n      new ImportSpecifierList($5)),\n      $9,\n      $11);\n      })\n    ],\n    ImportSpecifierList: [\n      o('ImportSpecifier',\n      function() {\n        return [$1];\n      }),\n      o('ImportSpecifierList , ImportSpecifier',\n      function() {\n        return $1.concat($3);\n      }),\n      o('ImportSpecifierList OptComma TERMINATOR ImportSpecifier',\n      function() {\n        return $1.concat($4);\n      }),\n      o('INDENT ImportSpecifierList OptComma OUTDENT',\n      function() {\n        return $2;\n      }),\n      o('ImportSpecifierList OptComma INDENT ImportSpecifierList OptComma OUTDENT',\n      function() {\n        return $1.concat($4);\n      })\n    ],\n    ImportSpecifier: [\n      o('Identifier',\n      function() {\n        return new ImportSpecifier($1);\n      }),\n      o('Identifier AS Identifier',\n      function() {\n        return new ImportSpecifier($1,\n      $3);\n      }),\n      o('DEFAULT',\n      function() {\n        return new ImportSpecifier(LOC(1)(new DefaultLiteral($1)));\n      }),\n      o('DEFAULT AS Identifier',\n      function() {\n        return new ImportSpecifier(LOC(1)(new DefaultLiteral($1)),\n      $3);\n      })\n    ],\n    ImportDefaultSpecifier: [\n      o('Identifier',\n      function() {\n        return new ImportDefaultSpecifier($1);\n      })\n    ],\n    ImportNamespaceSpecifier: [\n      o('IMPORT_ALL AS Identifier',\n      function() {\n        return new ImportNamespaceSpecifier(new Literal($1),\n      $3);\n      })\n    ],\n    Export: [\n      o('EXPORT { }',\n      function() {\n        return new ExportNamedDeclaration(new ExportSpecifierList([]));\n      }),\n      o('EXPORT { ExportSpecifierList OptComma }',\n      function() {\n        return new ExportNamedDeclaration(new ExportSpecifierList($3));\n      }),\n      o('EXPORT Class',\n      function() {\n        return new ExportNamedDeclaration($2);\n      }),\n      o('EXPORT Identifier = Expression',\n      function() {\n        return new ExportNamedDeclaration(LOC(2,\n      4)(new Assign($2,\n      $4,\n      null,\n      {\n          moduleDeclaration: 'export'\n        })));\n      }),\n      o('EXPORT Identifier = TERMINATOR Expression',\n      function() {\n        return new ExportNamedDeclaration(LOC(2,\n      5)(new Assign($2,\n      $5,\n      null,\n      {\n          moduleDeclaration: 'export'\n        })));\n      }),\n      o('EXPORT Identifier = INDENT Expression OUTDENT',\n      function() {\n        return new ExportNamedDeclaration(LOC(2,\n      6)(new Assign($2,\n      $5,\n      null,\n      {\n          moduleDeclaration: 'export'\n        })));\n      }),\n      o('EXPORT DEFAULT Expression',\n      function() {\n        return new ExportDefaultDeclaration($3);\n      }),\n      o('EXPORT DEFAULT INDENT Object OUTDENT',\n      function() {\n        return new ExportDefaultDeclaration(new Value($4));\n      }),\n      o('EXPORT EXPORT_ALL FROM String',\n      function() {\n        return new ExportAllDeclaration(new Literal($2),\n      $4);\n      }),\n      o('EXPORT EXPORT_ALL FROM String ASSERT Object',\n      function() {\n        return new ExportAllDeclaration(new Literal($2),\n      $4,\n      $6);\n      }),\n      o('EXPORT { } FROM String',\n      function() {\n        return new ExportNamedDeclaration(new ExportSpecifierList([]),\n      $5);\n      }),\n      o('EXPORT { } FROM String ASSERT Object',\n      function() {\n        return new ExportNamedDeclaration(new ExportSpecifierList([]),\n      $5,\n      $7);\n      }),\n      o('EXPORT { ExportSpecifierList OptComma } FROM String',\n      function() {\n        return new ExportNamedDeclaration(new ExportSpecifierList($3),\n      $7);\n      }),\n      o('EXPORT { ExportSpecifierList OptComma } FROM String ASSERT Object',\n      function() {\n        return new ExportNamedDeclaration(new ExportSpecifierList($3),\n      $7,\n      $9);\n      })\n    ],\n    ExportSpecifierList: [\n      o('ExportSpecifier',\n      function() {\n        return [$1];\n      }),\n      o('ExportSpecifierList , ExportSpecifier',\n      function() {\n        return $1.concat($3);\n      }),\n      o('ExportSpecifierList OptComma TERMINATOR ExportSpecifier',\n      function() {\n        return $1.concat($4);\n      }),\n      o('INDENT ExportSpecifierList OptComma OUTDENT',\n      function() {\n        return $2;\n      }),\n      o('ExportSpecifierList OptComma INDENT ExportSpecifierList OptComma OUTDENT',\n      function() {\n        return $1.concat($4);\n      })\n    ],\n    ExportSpecifier: [\n      o('Identifier',\n      function() {\n        return new ExportSpecifier($1);\n      }),\n      o('Identifier AS Identifier',\n      function() {\n        return new ExportSpecifier($1,\n      $3);\n      }),\n      o('Identifier AS DEFAULT',\n      function() {\n        return new ExportSpecifier($1,\n      LOC(3)(new DefaultLiteral($3)));\n      }),\n      o('DEFAULT',\n      function() {\n        return new ExportSpecifier(LOC(1)(new DefaultLiteral($1)));\n      }),\n      o('DEFAULT AS Identifier',\n      function() {\n        return new ExportSpecifier(LOC(1)(new DefaultLiteral($1)),\n      $3);\n      })\n    ],\n    // Ordinary function invocation, or a chained series of calls.\n    Invocation: [\n      o('Value OptFuncExist String',\n      function() {\n        return new TaggedTemplateCall($1,\n      $3,\n      $2.soak);\n      }),\n      o('Value OptFuncExist Arguments',\n      function() {\n        return new Call($1,\n      $3,\n      $2.soak);\n      }),\n      o('SUPER OptFuncExist Arguments',\n      function() {\n        return new SuperCall(LOC(1)(new Super()),\n      $3,\n      $2.soak,\n      $1);\n      }),\n      o('DYNAMIC_IMPORT Arguments',\n      function() {\n        return new DynamicImportCall(LOC(1)(new DynamicImport()),\n      $2);\n      })\n    ],\n    // An optional existence check on a function.\n    OptFuncExist: [\n      o('',\n      function() {\n        return {\n          soak: false\n        };\n      }),\n      o('FUNC_EXIST',\n      function() {\n        return {\n          soak: true\n        };\n      })\n    ],\n    // The list of arguments to a function call.\n    Arguments: [\n      o('CALL_START CALL_END',\n      function() {\n        return [];\n      }),\n      o('CALL_START ArgList OptComma CALL_END',\n      function() {\n        $2.implicit = $1.generated;\n        return $2;\n      })\n    ],\n    // A reference to the *this* current object.\n    This: [\n      o('THIS',\n      function() {\n        return new Value(new ThisLiteral($1));\n      }),\n      o('@',\n      function() {\n        return new Value(new ThisLiteral($1));\n      })\n    ],\n    // A reference to a property on *this*.\n    ThisProperty: [\n      o('@ Property',\n      function() {\n        return new Value(LOC(1)(new ThisLiteral($1)),\n      [LOC(2)(new Access($2))],\n      'this');\n      })\n    ],\n    // The array literal.\n    Array: [\n      o('[ ]',\n      function() {\n        return new Arr([]);\n      }),\n      o('[ Elisions ]',\n      function() {\n        return new Arr($2);\n      }),\n      o('[ ArgElisionList OptElisions ]',\n      function() {\n        return new Arr([].concat($2,\n      $3));\n      })\n    ],\n    // Inclusive and exclusive range dots.\n    RangeDots: [\n      o('..',\n      function() {\n        return {\n          exclusive: false\n        };\n      }),\n      o('...',\n      function() {\n        return {\n          exclusive: true\n        };\n      })\n    ],\n    // The CoffeeScript range literal.\n    Range: [\n      o('[ Expression RangeDots Expression ]',\n      function() {\n        return new Range($2,\n      $4,\n      $3.exclusive ? 'exclusive' : 'inclusive');\n      }),\n      o('[ ExpressionLine RangeDots Expression ]',\n      function() {\n        return new Range($2,\n      $4,\n      $3.exclusive ? 'exclusive' : 'inclusive');\n      })\n    ],\n    // Array slice literals.\n    Slice: [\n      o('Expression RangeDots Expression',\n      function() {\n        return new Range($1,\n      $3,\n      $2.exclusive ? 'exclusive' : 'inclusive');\n      }),\n      o('Expression RangeDots',\n      function() {\n        return new Range($1,\n      null,\n      $2.exclusive ? 'exclusive' : 'inclusive');\n      }),\n      o('ExpressionLine RangeDots Expression',\n      function() {\n        return new Range($1,\n      $3,\n      $2.exclusive ? 'exclusive' : 'inclusive');\n      }),\n      o('ExpressionLine RangeDots',\n      function() {\n        return new Range($1,\n      null,\n      $2.exclusive ? 'exclusive' : 'inclusive');\n      }),\n      o('RangeDots Expression',\n      function() {\n        return new Range(null,\n      $2,\n      $1.exclusive ? 'exclusive' : 'inclusive');\n      }),\n      o('RangeDots',\n      function() {\n        return new Range(null,\n      null,\n      $1.exclusive ? 'exclusive' : 'inclusive');\n      })\n    ],\n    // The **ArgList** is the list of objects passed into a function call\n    // (i.e. comma-separated expressions). Newlines work as well.\n    ArgList: [\n      o('Arg',\n      function() {\n        return [$1];\n      }),\n      o('ArgList , Arg',\n      function() {\n        return $1.concat($3);\n      }),\n      o('ArgList OptComma TERMINATOR Arg',\n      function() {\n        return $1.concat($4);\n      }),\n      o('INDENT ArgList OptComma OUTDENT',\n      function() {\n        return $2;\n      }),\n      o('ArgList OptComma INDENT ArgList OptComma OUTDENT',\n      function() {\n        return $1.concat($4);\n      })\n    ],\n    // Valid arguments are Blocks or Splats.\n    Arg: [\n      o('Expression'),\n      o('ExpressionLine'),\n      o('Splat'),\n      o('...',\n      function() {\n        return new Expansion();\n      })\n    ],\n    // The **ArgElisionList** is the list of objects, contents of an array literal\n    // (i.e. comma-separated expressions and elisions). Newlines work as well.\n    ArgElisionList: [\n      o('ArgElision'),\n      o('ArgElisionList , ArgElision',\n      function() {\n        return $1.concat($3);\n      }),\n      o('ArgElisionList OptComma TERMINATOR ArgElision',\n      function() {\n        return $1.concat($4);\n      }),\n      o('INDENT ArgElisionList OptElisions OUTDENT',\n      function() {\n        return $2.concat($3);\n      }),\n      o('ArgElisionList OptElisions INDENT ArgElisionList OptElisions OUTDENT',\n      function() {\n        return $1.concat($2,\n      $4,\n      $5);\n      })\n    ],\n    ArgElision: [\n      o('Arg',\n      function() {\n        return [$1];\n      }),\n      o('Elisions Arg',\n      function() {\n        return $1.concat($2);\n      })\n    ],\n    OptElisions: [\n      o('OptComma',\n      function() {\n        return [];\n      }),\n      o(', Elisions',\n      function() {\n        return [].concat($2);\n      })\n    ],\n    Elisions: [\n      o('Elision',\n      function() {\n        return [$1];\n      }),\n      o('Elisions Elision',\n      function() {\n        return $1.concat($2);\n      })\n    ],\n    Elision: [\n      o(',',\n      function() {\n        return new Elision();\n      }),\n      o('Elision TERMINATOR',\n      function() {\n        return $1;\n      })\n    ],\n    // Just simple, comma-separated, required arguments (no fancy syntax). We need\n    // this to be separate from the **ArgList** for use in **Switch** blocks, where\n    // having the newlines wouldn't make sense.\n    SimpleArgs: [\n      o('Expression'),\n      o('ExpressionLine'),\n      o('SimpleArgs , Expression',\n      function() {\n        return [].concat($1,\n      $3);\n      }),\n      o('SimpleArgs , ExpressionLine',\n      function() {\n        return [].concat($1,\n      $3);\n      })\n    ],\n    // The variants of *try/catch/finally* exception handling blocks.\n    Try: [\n      o('TRY Block',\n      function() {\n        return new Try($2);\n      }),\n      o('TRY Block Catch',\n      function() {\n        return new Try($2,\n      $3);\n      }),\n      o('TRY Block FINALLY Block',\n      function() {\n        return new Try($2,\n      null,\n      $4,\n      LOC(3)(new Literal($3)));\n      }),\n      o('TRY Block Catch FINALLY Block',\n      function() {\n        return new Try($2,\n      $3,\n      $5,\n      LOC(4)(new Literal($4)));\n      })\n    ],\n    // A catch clause names its error and runs a block of code.\n    Catch: [\n      o('CATCH Identifier Block',\n      function() {\n        return new Catch($3,\n      $2);\n      }),\n      o('CATCH Object Block',\n      function() {\n        return new Catch($3,\n      LOC(2)(new Value($2)));\n      }),\n      o('CATCH Block',\n      function() {\n        return new Catch($2);\n      })\n    ],\n    // Throw an exception object.\n    Throw: [\n      o('THROW Expression',\n      function() {\n        return new Throw($2);\n      }),\n      o('THROW INDENT Object OUTDENT',\n      function() {\n        return new Throw(new Value($3));\n      })\n    ],\n    // Parenthetical expressions. Note that the **Parenthetical** is a **Value**,\n    // not an **Expression**, so if you need to use an expression in a place\n    // where only values are accepted, wrapping it in parentheses will always do\n    // the trick.\n    Parenthetical: [\n      o('( Body )',\n      function() {\n        return new Parens($2);\n      }),\n      o('( INDENT Body OUTDENT )',\n      function() {\n        return new Parens($3);\n      })\n    ],\n    // The condition portion of a while loop.\n    WhileLineSource: [\n      o('WHILE ExpressionLine',\n      function() {\n        return new While($2);\n      }),\n      o('WHILE ExpressionLine WHEN ExpressionLine',\n      function() {\n        return new While($2,\n      {\n          guard: $4\n        });\n      }),\n      o('UNTIL ExpressionLine',\n      function() {\n        return new While($2,\n      {\n          invert: true\n        });\n      }),\n      o('UNTIL ExpressionLine WHEN ExpressionLine',\n      function() {\n        return new While($2,\n      {\n          invert: true,\n          guard: $4\n        });\n      })\n    ],\n    WhileSource: [\n      o('WHILE Expression',\n      function() {\n        return new While($2);\n      }),\n      o('WHILE Expression WHEN Expression',\n      function() {\n        return new While($2,\n      {\n          guard: $4\n        });\n      }),\n      o('WHILE ExpressionLine WHEN Expression',\n      function() {\n        return new While($2,\n      {\n          guard: $4\n        });\n      }),\n      o('UNTIL Expression',\n      function() {\n        return new While($2,\n      {\n          invert: true\n        });\n      }),\n      o('UNTIL Expression WHEN Expression',\n      function() {\n        return new While($2,\n      {\n          invert: true,\n          guard: $4\n        });\n      }),\n      o('UNTIL ExpressionLine WHEN Expression',\n      function() {\n        return new While($2,\n      {\n          invert: true,\n          guard: $4\n        });\n      })\n    ],\n    // The while loop can either be normal, with a block of expressions to execute,\n    // or postfix, with a single expression. There is no do..while.\n    While: [\n      o('WhileSource Block',\n      function() {\n        return $1.addBody($2);\n      }),\n      o('WhileLineSource Block',\n      function() {\n        return $1.addBody($2);\n      }),\n      o('Statement  WhileSource',\n      function() {\n        return (Object.assign($2,\n      {\n          postfix: true\n        })).addBody(LOC(1)(Block.wrap([$1])));\n      }),\n      o('Expression WhileSource',\n      function() {\n        return (Object.assign($2,\n      {\n          postfix: true\n        })).addBody(LOC(1)(Block.wrap([$1])));\n      }),\n      o('Loop',\n      function() {\n        return $1;\n      })\n    ],\n    Loop: [\n      o('LOOP Block',\n      function() {\n        return new While(LOC(1)(new BooleanLiteral('true')),\n      {\n          isLoop: true\n        }).addBody($2);\n      }),\n      o('LOOP Expression',\n      function() {\n        return new While(LOC(1)(new BooleanLiteral('true')),\n      {\n          isLoop: true\n        }).addBody(LOC(2)(Block.wrap([$2])));\n      })\n    ],\n    // Array, object, and range comprehensions, at the most generic level.\n    // Comprehensions can either be normal, with a block of expressions to execute,\n    // or postfix, with a single expression.\n    For: [\n      o('Statement    ForBody',\n      function() {\n        $2.postfix = true;\n        return $2.addBody($1);\n      }),\n      o('Expression   ForBody',\n      function() {\n        $2.postfix = true;\n        return $2.addBody($1);\n      }),\n      o('ForBody      Block',\n      function() {\n        return $1.addBody($2);\n      }),\n      o('ForLineBody  Block',\n      function() {\n        return $1.addBody($2);\n      })\n    ],\n    ForBody: [\n      o('FOR Range',\n      function() {\n        return new For([],\n      {\n          source: LOC(2)(new Value($2))\n        });\n      }),\n      o('FOR Range BY Expression',\n      function() {\n        return new For([],\n      {\n          source: LOC(2)(new Value($2)),\n          step: $4\n        });\n      }),\n      o('ForStart ForSource',\n      function() {\n        return $1.addSource($2);\n      })\n    ],\n    ForLineBody: [\n      o('FOR Range BY ExpressionLine',\n      function() {\n        return new For([],\n      {\n          source: LOC(2)(new Value($2)),\n          step: $4\n        });\n      }),\n      o('ForStart ForLineSource',\n      function() {\n        return $1.addSource($2);\n      })\n    ],\n    ForStart: [\n      o('FOR ForVariables',\n      function() {\n        return new For([],\n      {\n          name: $2[0],\n          index: $2[1]\n        });\n      }),\n      o('FOR AWAIT ForVariables',\n      function() {\n        var index,\n      name;\n        [name,\n      index] = $3;\n        return new For([],\n      {\n          name,\n          index,\n          await: true,\n          awaitTag: LOC(2)(new Literal($2))\n        });\n      }),\n      o('FOR OWN ForVariables',\n      function() {\n        var index,\n      name;\n        [name,\n      index] = $3;\n        return new For([],\n      {\n          name,\n          index,\n          own: true,\n          ownTag: LOC(2)(new Literal($2))\n        });\n      })\n    ],\n    // An array of all accepted values for a variable inside the loop.\n    // This enables support for pattern matching.\n    ForValue: [\n      o('Identifier'),\n      o('ThisProperty'),\n      o('Array',\n      function() {\n        return new Value($1);\n      }),\n      o('Object',\n      function() {\n        return new Value($1);\n      })\n    ],\n    // An array or range comprehension has variables for the current element\n    // and (optional) reference to the current index. Or, *key, value*, in the case\n    // of object comprehensions.\n    ForVariables: [\n      o('ForValue',\n      function() {\n        return [$1];\n      }),\n      o('ForValue , ForValue',\n      function() {\n        return [$1,\n      $3];\n      })\n    ],\n    // The source of a comprehension is an array or object with an optional guard\n    // clause. If it’s an array comprehension, you can also choose to step through\n    // in fixed-size increments.\n    ForSource: [\n      o('FORIN Expression',\n      function() {\n        return {\n          source: $2\n        };\n      }),\n      o('FOROF Expression',\n      function() {\n        return {\n          source: $2,\n          object: true\n        };\n      }),\n      o('FORIN Expression WHEN Expression',\n      function() {\n        return {\n          source: $2,\n          guard: $4\n        };\n      }),\n      o('FORIN ExpressionLine WHEN Expression',\n      function() {\n        return {\n          source: $2,\n          guard: $4\n        };\n      }),\n      o('FOROF Expression WHEN Expression',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          object: true\n        };\n      }),\n      o('FOROF ExpressionLine WHEN Expression',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          object: true\n        };\n      }),\n      o('FORIN Expression BY Expression',\n      function() {\n        return {\n          source: $2,\n          step: $4\n        };\n      }),\n      o('FORIN ExpressionLine BY Expression',\n      function() {\n        return {\n          source: $2,\n          step: $4\n        };\n      }),\n      o('FORIN Expression WHEN Expression BY Expression',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          step: $6\n        };\n      }),\n      o('FORIN ExpressionLine WHEN Expression BY Expression',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          step: $6\n        };\n      }),\n      o('FORIN Expression WHEN ExpressionLine BY Expression',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          step: $6\n        };\n      }),\n      o('FORIN ExpressionLine WHEN ExpressionLine BY Expression',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          step: $6\n        };\n      }),\n      o('FORIN Expression BY Expression WHEN Expression',\n      function() {\n        return {\n          source: $2,\n          step: $4,\n          guard: $6\n        };\n      }),\n      o('FORIN ExpressionLine BY Expression WHEN Expression',\n      function() {\n        return {\n          source: $2,\n          step: $4,\n          guard: $6\n        };\n      }),\n      o('FORIN Expression BY ExpressionLine WHEN Expression',\n      function() {\n        return {\n          source: $2,\n          step: $4,\n          guard: $6\n        };\n      }),\n      o('FORIN ExpressionLine BY ExpressionLine WHEN Expression',\n      function() {\n        return {\n          source: $2,\n          step: $4,\n          guard: $6\n        };\n      }),\n      o('FORFROM Expression',\n      function() {\n        return {\n          source: $2,\n          from: true\n        };\n      }),\n      o('FORFROM Expression WHEN Expression',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          from: true\n        };\n      }),\n      o('FORFROM ExpressionLine WHEN Expression',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          from: true\n        };\n      })\n    ],\n    ForLineSource: [\n      o('FORIN ExpressionLine',\n      function() {\n        return {\n          source: $2\n        };\n      }),\n      o('FOROF ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          object: true\n        };\n      }),\n      o('FORIN Expression WHEN ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          guard: $4\n        };\n      }),\n      o('FORIN ExpressionLine WHEN ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          guard: $4\n        };\n      }),\n      o('FOROF Expression WHEN ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          object: true\n        };\n      }),\n      o('FOROF ExpressionLine WHEN ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          object: true\n        };\n      }),\n      o('FORIN Expression BY ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          step: $4\n        };\n      }),\n      o('FORIN ExpressionLine BY ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          step: $4\n        };\n      }),\n      o('FORIN Expression WHEN Expression BY ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          step: $6\n        };\n      }),\n      o('FORIN ExpressionLine WHEN Expression BY ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          step: $6\n        };\n      }),\n      o('FORIN Expression WHEN ExpressionLine BY ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          step: $6\n        };\n      }),\n      o('FORIN ExpressionLine WHEN ExpressionLine BY ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          step: $6\n        };\n      }),\n      o('FORIN Expression BY Expression WHEN ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          step: $4,\n          guard: $6\n        };\n      }),\n      o('FORIN ExpressionLine BY Expression WHEN ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          step: $4,\n          guard: $6\n        };\n      }),\n      o('FORIN Expression BY ExpressionLine WHEN ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          step: $4,\n          guard: $6\n        };\n      }),\n      o('FORIN ExpressionLine BY ExpressionLine WHEN ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          step: $4,\n          guard: $6\n        };\n      }),\n      o('FORFROM ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          from: true\n        };\n      }),\n      o('FORFROM Expression WHEN ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          from: true\n        };\n      }),\n      o('FORFROM ExpressionLine WHEN ExpressionLine',\n      function() {\n        return {\n          source: $2,\n          guard: $4,\n          from: true\n        };\n      })\n    ],\n    Switch: [\n      o('SWITCH Expression INDENT Whens OUTDENT',\n      function() {\n        return new Switch($2,\n      $4);\n      }),\n      o('SWITCH ExpressionLine INDENT Whens OUTDENT',\n      function() {\n        return new Switch($2,\n      $4);\n      }),\n      o('SWITCH Expression INDENT Whens ELSE Block OUTDENT',\n      function() {\n        return new Switch($2,\n      $4,\n      LOC(5,\n      6)($6));\n      }),\n      o('SWITCH ExpressionLine INDENT Whens ELSE Block OUTDENT',\n      function() {\n        return new Switch($2,\n      $4,\n      LOC(5,\n      6)($6));\n      }),\n      o('SWITCH INDENT Whens OUTDENT',\n      function() {\n        return new Switch(null,\n      $3);\n      }),\n      o('SWITCH INDENT Whens ELSE Block OUTDENT',\n      function() {\n        return new Switch(null,\n      $3,\n      LOC(4,\n      5)($5));\n      })\n    ],\n    Whens: [\n      o('When',\n      function() {\n        return [$1];\n      }),\n      o('Whens When',\n      function() {\n        return $1.concat($2);\n      })\n    ],\n    // An individual **When** clause, with action.\n    When: [\n      o('LEADING_WHEN SimpleArgs Block',\n      function() {\n        return new SwitchWhen($2,\n      $3);\n      }),\n      o('LEADING_WHEN SimpleArgs Block TERMINATOR',\n      function() {\n        return LOC(1,\n      3)(new SwitchWhen($2,\n      $3));\n      })\n    ],\n    // The most basic form of *if* is a condition and an action. The following\n    // if-related rules are broken up along these lines in order to avoid\n    // ambiguity.\n    IfBlock: [\n      o('IF Expression Block',\n      function() {\n        return new If($2,\n      $3,\n      {\n          type: $1\n        });\n      }),\n      o('IfBlock ELSE IF Expression Block',\n      function() {\n        return $1.addElse(LOC(3,\n      5)(new If($4,\n      $5,\n      {\n          type: $3\n        })));\n      })\n    ],\n    // The full complement of *if* expressions, including postfix one-liner\n    // *if* and *unless*.\n    If: [\n      o('IfBlock'),\n      o('IfBlock ELSE Block',\n      function() {\n        return $1.addElse($3);\n      }),\n      o('Statement  POST_IF Expression',\n      function() {\n        return new If($3,\n      LOC(1)(Block.wrap([$1])),\n      {\n          type: $2,\n          postfix: true\n        });\n      }),\n      o('Expression POST_IF Expression',\n      function() {\n        return new If($3,\n      LOC(1)(Block.wrap([$1])),\n      {\n          type: $2,\n          postfix: true\n        });\n      })\n    ],\n    IfBlockLine: [\n      o('IF ExpressionLine Block',\n      function() {\n        return new If($2,\n      $3,\n      {\n          type: $1\n        });\n      }),\n      o('IfBlockLine ELSE IF ExpressionLine Block',\n      function() {\n        return $1.addElse(LOC(3,\n      5)(new If($4,\n      $5,\n      {\n          type: $3\n        })));\n      })\n    ],\n    IfLine: [\n      o('IfBlockLine'),\n      o('IfBlockLine ELSE Block',\n      function() {\n        return $1.addElse($3);\n      }),\n      o('Statement  POST_IF ExpressionLine',\n      function() {\n        return new If($3,\n      LOC(1)(Block.wrap([$1])),\n      {\n          type: $2,\n          postfix: true\n        });\n      }),\n      o('Expression POST_IF ExpressionLine',\n      function() {\n        return new If($3,\n      LOC(1)(Block.wrap([$1])),\n      {\n          type: $2,\n          postfix: true\n        });\n      })\n    ],\n    // Arithmetic and logical operators, working on one or more operands.\n    // Here they are grouped by order of precedence. The actual precedence rules\n    // are defined at the bottom of the page. It would be shorter if we could\n    // combine most of these rules into a single generic *Operand OpSymbol Operand*\n    // -type rule, but in order to make the precedence binding possible, separate\n    // rules are necessary.\n    OperationLine: [\n      o('UNARY ExpressionLine',\n      function() {\n        return new Op($1,\n      $2);\n      }),\n      o('DO ExpressionLine',\n      function() {\n        return new Op($1,\n      $2);\n      }),\n      o('DO_IIFE CodeLine',\n      function() {\n        return new Op($1,\n      $2);\n      })\n    ],\n    Operation: [\n      o('UNARY Expression',\n      function() {\n        return new Op($1.toString(),\n      $2,\n      void 0,\n      void 0,\n      {\n          originalOperator: $1.original\n        });\n      }),\n      o('DO Expression',\n      function() {\n        return new Op($1,\n      $2);\n      }),\n      o('UNARY_MATH Expression',\n      function() {\n        return new Op($1,\n      $2);\n      }),\n      o('-     Expression',\n      (function() {\n        return new Op('-',\n      $2);\n      }),\n      {\n        prec: 'UNARY_MATH'\n      }),\n      o('+     Expression',\n      (function() {\n        return new Op('+',\n      $2);\n      }),\n      {\n        prec: 'UNARY_MATH'\n      }),\n      o('AWAIT Expression',\n      function() {\n        return new Op($1,\n      $2);\n      }),\n      o('AWAIT INDENT Object OUTDENT',\n      function() {\n        return new Op($1,\n      $3);\n      }),\n      o('-- SimpleAssignable',\n      function() {\n        return new Op('--',\n      $2);\n      }),\n      o('++ SimpleAssignable',\n      function() {\n        return new Op('++',\n      $2);\n      }),\n      o('SimpleAssignable --',\n      function() {\n        return new Op('--',\n      $1,\n      null,\n      true);\n      }),\n      o('SimpleAssignable ++',\n      function() {\n        return new Op('++',\n      $1,\n      null,\n      true);\n      }),\n      // [The existential operator](https://coffeescript.org/#existential-operator).\n      o('Expression ?',\n      function() {\n        return new Existence($1);\n      }),\n      o('Expression +  Expression',\n      function() {\n        return new Op('+',\n      $1,\n      $3);\n      }),\n      o('Expression -  Expression',\n      function() {\n        return new Op('-',\n      $1,\n      $3);\n      }),\n      o('Expression MATH     Expression',\n      function() {\n        return new Op($2,\n      $1,\n      $3);\n      }),\n      o('Expression **       Expression',\n      function() {\n        return new Op($2,\n      $1,\n      $3);\n      }),\n      o('Expression SHIFT    Expression',\n      function() {\n        return new Op($2,\n      $1,\n      $3);\n      }),\n      o('Expression COMPARE  Expression',\n      function() {\n        return new Op($2.toString(),\n      $1,\n      $3,\n      void 0,\n      {\n          originalOperator: $2.original\n        });\n      }),\n      o('Expression &        Expression',\n      function() {\n        return new Op($2,\n      $1,\n      $3);\n      }),\n      o('Expression ^        Expression',\n      function() {\n        return new Op($2,\n      $1,\n      $3);\n      }),\n      o('Expression |        Expression',\n      function() {\n        return new Op($2,\n      $1,\n      $3);\n      }),\n      o('Expression &&       Expression',\n      function() {\n        return new Op($2.toString(),\n      $1,\n      $3,\n      void 0,\n      {\n          originalOperator: $2.original\n        });\n      }),\n      o('Expression ||       Expression',\n      function() {\n        return new Op($2.toString(),\n      $1,\n      $3,\n      void 0,\n      {\n          originalOperator: $2.original\n        });\n      }),\n      o('Expression BIN?     Expression',\n      function() {\n        return new Op($2,\n      $1,\n      $3);\n      }),\n      o('Expression RELATION Expression',\n      function() {\n        var ref,\n      ref1;\n        return new Op($2.toString(),\n      $1,\n      $3,\n      void 0,\n      {\n          invertOperator: (ref = (ref1 = $2.invert) != null ? ref1.original : void 0) != null ? ref : $2.invert\n        });\n      }),\n      o('SimpleAssignable COMPOUND_ASSIGN Expression',\n      function() {\n        return new Assign($1,\n      $3,\n      $2.toString(),\n      {\n          originalContext: $2.original\n        });\n      }),\n      o('SimpleAssignable COMPOUND_ASSIGN INDENT Expression OUTDENT',\n      function() {\n        return new Assign($1,\n      $4,\n      $2.toString(),\n      {\n          originalContext: $2.original\n        });\n      }),\n      o('SimpleAssignable COMPOUND_ASSIGN TERMINATOR Expression',\n      function() {\n        return new Assign($1,\n      $4,\n      $2.toString(),\n      {\n          originalContext: $2.original\n        });\n      })\n    ],\n    DoIife: [\n      o('DO_IIFE Code',\n      function() {\n        return new Op($1,\n      $2);\n      })\n    ]\n  };\n\n  // Precedence\n  // ----------\n\n  // Operators at the top of this list have higher precedence than the ones lower\n  // down. Following these rules is what makes `2 + 3 * 4` parse as:\n\n  //     2 + (3 * 4)\n\n  // And not:\n\n  //     (2 + 3) * 4\n  operators = [['right', 'DO_IIFE'], ['left', '.', '?.', '::', '?::'], ['left', 'CALL_START', 'CALL_END'], ['nonassoc', '++', '--'], ['left', '?'], ['right', 'UNARY', 'DO'], ['right', 'AWAIT'], ['right', '**'], ['right', 'UNARY_MATH'], ['left', 'MATH'], ['left', '+', '-'], ['left', 'SHIFT'], ['left', 'RELATION'], ['left', 'COMPARE'], ['left', '&'], ['left', '^'], ['left', '|'], ['left', '&&'], ['left', '||'], ['left', 'BIN?'], ['nonassoc', 'INDENT', 'OUTDENT'], ['right', 'YIELD'], ['right', '=', ':', 'COMPOUND_ASSIGN', 'RETURN', 'THROW', 'EXTENDS'], ['right', 'FORIN', 'FOROF', 'FORFROM', 'BY', 'WHEN'], ['right', 'IF', 'ELSE', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS', 'IMPORT', 'EXPORT', 'DYNAMIC_IMPORT'], ['left', 'POST_IF']];\n\n  // Wrapping Up\n  // -----------\n\n  // Finally, now that we have our **grammar** and our **operators**, we can create\n  // our **Jison.Parser**. We do this by processing all of our rules, recording all\n  // terminals (every symbol which does not appear as the name of a rule above)\n  // as \"tokens\".\n  tokens = [];\n\n  for (name in grammar) {\n    alternatives = grammar[name];\n    grammar[name] = (function() {\n      var i, j, len, len1, ref, results;\n      results = [];\n      for (i = 0, len = alternatives.length; i < len; i++) {\n        alt = alternatives[i];\n        ref = alt[0].split(' ');\n        for (j = 0, len1 = ref.length; j < len1; j++) {\n          token = ref[j];\n          if (!grammar[token]) {\n            tokens.push(token);\n          }\n        }\n        if (name === 'Root') {\n          alt[1] = `return ${alt[1]}`;\n        }\n        results.push(alt);\n      }\n      return results;\n    })();\n  }\n\n  // Initialize the **Parser** with our list of terminal **tokens**, our **grammar**\n  // rules, and the name of the root. Reverse the operators because Jison orders\n  // precedence from low to high, and we have it high to low\n  // (as in [Yacc](http://dinosaur.compilertools.net/yacc/index.html)).\n  exports.parser = new Parser({\n    tokens: tokens.join(' '),\n    bnf: grammar,\n    operators: operators.reverse(),\n    startSymbol: 'Root'\n  });\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/helpers.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  // This file contains the common helper functions that we'd like to share among\n  // the **Lexer**, **Rewriter**, and the **Nodes**. Merge objects, flatten\n  // arrays, count characters, that sort of thing.\n\n  // Peek at the beginning of a given string to see if it matches a sequence.\n  var UNICODE_CODE_POINT_ESCAPE, attachCommentsToNode, buildLocationData, buildLocationHash, buildTokenDataDictionary, extend, flatten, isBoolean, isNumber, isString, ref, repeat, syntaxErrorToString, unicodeCodePointToUnicodeEscapes,\n    indexOf = [].indexOf;\n\n  exports.starts = function(string, literal, start) {\n    return literal === string.substr(start, literal.length);\n  };\n\n  // Peek at the end of a given string to see if it matches a sequence.\n  exports.ends = function(string, literal, back) {\n    var len;\n    len = literal.length;\n    return literal === string.substr(string.length - len - (back || 0), len);\n  };\n\n  // Repeat a string `n` times.\n  exports.repeat = repeat = function(str, n) {\n    var res;\n    // Use clever algorithm to have O(log(n)) string concatenation operations.\n    res = '';\n    while (n > 0) {\n      if (n & 1) {\n        res += str;\n      }\n      n >>>= 1;\n      str += str;\n    }\n    return res;\n  };\n\n  // Trim out all falsy values from an array.\n  exports.compact = function(array) {\n    var i, item, len1, results;\n    results = [];\n    for (i = 0, len1 = array.length; i < len1; i++) {\n      item = array[i];\n      if (item) {\n        results.push(item);\n      }\n    }\n    return results;\n  };\n\n  // Count the number of occurrences of a string in a string.\n  exports.count = function(string, substr) {\n    var num, pos;\n    num = pos = 0;\n    if (!substr.length) {\n      return 1 / 0;\n    }\n    while (pos = 1 + string.indexOf(substr, pos)) {\n      num++;\n    }\n    return num;\n  };\n\n  // Merge objects, returning a fresh copy with attributes from both sides.\n  // Used every time `Base#compile` is called, to allow properties in the\n  // options hash to propagate down the tree without polluting other branches.\n  exports.merge = function(options, overrides) {\n    return extend(extend({}, options), overrides);\n  };\n\n  // Extend a source object with the properties of another object (shallow copy).\n  extend = exports.extend = function(object, properties) {\n    var key, val;\n    for (key in properties) {\n      val = properties[key];\n      object[key] = val;\n    }\n    return object;\n  };\n\n  // Return a flattened version of an array.\n  // Handy for getting a list of `children` from the nodes.\n  exports.flatten = flatten = function(array) {\n    return array.flat(2e308);\n  };\n\n  // Delete a key from an object, returning the value. Useful when a node is\n  // looking for a particular method in an options hash.\n  exports.del = function(obj, key) {\n    var val;\n    val = obj[key];\n    delete obj[key];\n    return val;\n  };\n\n  // Typical Array::some\n  exports.some = (ref = Array.prototype.some) != null ? ref : function(fn) {\n    var e, i, len1, ref1;\n    ref1 = this;\n    for (i = 0, len1 = ref1.length; i < len1; i++) {\n      e = ref1[i];\n      if (fn(e)) {\n        return true;\n      }\n    }\n    return false;\n  };\n\n  // Helper function for extracting code from Literate CoffeeScript by stripping\n  // out all non-code blocks, producing a string of CoffeeScript code that can\n  // be compiled “normally.”\n  exports.invertLiterate = function(code) {\n    var blankLine, i, indented, insideComment, len1, line, listItemStart, out, ref1;\n    out = [];\n    blankLine = /^\\s*$/;\n    indented = /^[\\t ]/;\n    listItemStart = /^(?:\\t?| {0,3})(?:[\\*\\-\\+]|[0-9]{1,9}\\.)[ \\t]/; // Up to one tab, or up to three spaces, or neither;\n    // followed by `*`, `-` or `+`;\n    // or by an integer up to 9 digits long, followed by a period;\n    // followed by a space or a tab.\n    insideComment = false;\n    ref1 = code.split('\\n');\n    for (i = 0, len1 = ref1.length; i < len1; i++) {\n      line = ref1[i];\n      if (blankLine.test(line)) {\n        insideComment = false;\n        out.push(line);\n      } else if (insideComment || listItemStart.test(line)) {\n        insideComment = true;\n        out.push(`# ${line}`);\n      } else if (!insideComment && indented.test(line)) {\n        out.push(line);\n      } else {\n        insideComment = true;\n        out.push(`# ${line}`);\n      }\n    }\n    return out.join('\\n');\n  };\n\n  // Merge two jison-style location data objects together.\n  // If `last` is not provided, this will simply return `first`.\n  buildLocationData = function(first, last) {\n    if (!last) {\n      return first;\n    } else {\n      return {\n        first_line: first.first_line,\n        first_column: first.first_column,\n        last_line: last.last_line,\n        last_column: last.last_column,\n        last_line_exclusive: last.last_line_exclusive,\n        last_column_exclusive: last.last_column_exclusive,\n        range: [first.range[0], last.range[1]]\n      };\n    }\n  };\n\n  // Build a list of all comments attached to tokens.\n  exports.extractAllCommentTokens = function(tokens) {\n    var allCommentsObj, comment, commentKey, i, j, k, key, len1, len2, len3, ref1, results, sortedKeys, token;\n    allCommentsObj = {};\n    for (i = 0, len1 = tokens.length; i < len1; i++) {\n      token = tokens[i];\n      if (token.comments) {\n        ref1 = token.comments;\n        for (j = 0, len2 = ref1.length; j < len2; j++) {\n          comment = ref1[j];\n          commentKey = comment.locationData.range[0];\n          allCommentsObj[commentKey] = comment;\n        }\n      }\n    }\n    sortedKeys = Object.keys(allCommentsObj).sort(function(a, b) {\n      return a - b;\n    });\n    results = [];\n    for (k = 0, len3 = sortedKeys.length; k < len3; k++) {\n      key = sortedKeys[k];\n      results.push(allCommentsObj[key]);\n    }\n    return results;\n  };\n\n  // Get a lookup hash for a token based on its location data.\n  // Multiple tokens might have the same location hash, but using exclusive\n  // location data distinguishes e.g. zero-length generated tokens from\n  // actual source tokens.\n  buildLocationHash = function(loc) {\n    return `${loc.range[0]}-${loc.range[1]}`;\n  };\n\n  // Build a dictionary of extra token properties organized by tokens’ locations\n  // used as lookup hashes.\n  exports.buildTokenDataDictionary = buildTokenDataDictionary = function(tokens) {\n    var base1, i, len1, token, tokenData, tokenHash;\n    tokenData = {};\n    for (i = 0, len1 = tokens.length; i < len1; i++) {\n      token = tokens[i];\n      if (!token.comments) {\n        continue;\n      }\n      tokenHash = buildLocationHash(token[2]);\n      // Multiple tokens might have the same location hash, such as the generated\n      // `JS` tokens added at the start or end of the token stream to hold\n      // comments that start or end a file.\n      if (tokenData[tokenHash] == null) {\n        tokenData[tokenHash] = {};\n      }\n      if (token.comments) { // `comments` is always an array.\n        // For “overlapping” tokens, that is tokens with the same location data\n        // and therefore matching `tokenHash`es, merge the comments from both/all\n        // tokens together into one array, even if there are duplicate comments;\n        // they will get sorted out later.\n        ((base1 = tokenData[tokenHash]).comments != null ? base1.comments : base1.comments = []).push(...token.comments);\n      }\n    }\n    return tokenData;\n  };\n\n  // This returns a function which takes an object as a parameter, and if that\n  // object is an AST node, updates that object's locationData.\n  // The object is returned either way.\n  exports.addDataToNode = function(parserState, firstLocationData, firstValue, lastLocationData, lastValue, forceUpdateLocation = true) {\n    return function(obj) {\n      var locationData, objHash, ref1, ref2, ref3;\n      // Add location data.\n      locationData = buildLocationData((ref1 = firstValue != null ? firstValue.locationData : void 0) != null ? ref1 : firstLocationData, (ref2 = lastValue != null ? lastValue.locationData : void 0) != null ? ref2 : lastLocationData);\n      if (((obj != null ? obj.updateLocationDataIfMissing : void 0) != null) && (firstLocationData != null)) {\n        obj.updateLocationDataIfMissing(locationData, forceUpdateLocation);\n      } else {\n        obj.locationData = locationData;\n      }\n      // Add comments, building the dictionary of token data if it hasn’t been\n      // built yet.\n      if (parserState.tokenData == null) {\n        parserState.tokenData = buildTokenDataDictionary(parserState.parser.tokens);\n      }\n      if (obj.locationData != null) {\n        objHash = buildLocationHash(obj.locationData);\n        if (((ref3 = parserState.tokenData[objHash]) != null ? ref3.comments : void 0) != null) {\n          attachCommentsToNode(parserState.tokenData[objHash].comments, obj);\n        }\n      }\n      return obj;\n    };\n  };\n\n  exports.attachCommentsToNode = attachCommentsToNode = function(comments, node) {\n    if ((comments == null) || comments.length === 0) {\n      return;\n    }\n    if (node.comments == null) {\n      node.comments = [];\n    }\n    return node.comments.push(...comments);\n  };\n\n  // Convert jison location data to a string.\n  // `obj` can be a token, or a locationData.\n  exports.locationDataToString = function(obj) {\n    var locationData;\n    if ((\"2\" in obj) && (\"first_line\" in obj[2])) {\n      locationData = obj[2];\n    } else if (\"first_line\" in obj) {\n      locationData = obj;\n    }\n    if (locationData) {\n      return `${locationData.first_line + 1}:${locationData.first_column + 1}-` + `${locationData.last_line + 1}:${locationData.last_column + 1}`;\n    } else {\n      return \"No location data\";\n    }\n  };\n\n  // Generate a unique anonymous file name so we can distinguish source map cache\n  // entries for any number of anonymous scripts.\n  exports.anonymousFileName = (function() {\n    var n;\n    n = 0;\n    return function() {\n      return `<anonymous-${n++}>`;\n    };\n  })();\n\n  // A `.coffee.md` compatible version of `basename`, that returns the file sans-extension.\n  exports.baseFileName = function(file, stripExt = false, useWinPathSep = false) {\n    var parts, pathSep;\n    pathSep = useWinPathSep ? /\\\\|\\// : /\\//;\n    parts = file.split(pathSep);\n    file = parts[parts.length - 1];\n    if (!(stripExt && file.indexOf('.') >= 0)) {\n      return file;\n    }\n    parts = file.split('.');\n    parts.pop();\n    if (parts[parts.length - 1] === 'coffee' && parts.length > 1) {\n      parts.pop();\n    }\n    return parts.join('.');\n  };\n\n  // Determine if a filename represents a CoffeeScript file.\n  exports.isCoffee = function(file) {\n    return /\\.((lit)?coffee|coffee\\.md)$/.test(file);\n  };\n\n  // Determine if a filename represents a Literate CoffeeScript file.\n  exports.isLiterate = function(file) {\n    return /\\.(litcoffee|coffee\\.md)$/.test(file);\n  };\n\n  // Throws a SyntaxError from a given location.\n  // The error's `toString` will return an error message following the \"standard\"\n  // format `<filename>:<line>:<col>: <message>` plus the line with the error and a\n  // marker showing where the error is.\n  exports.throwSyntaxError = function(message, location) {\n    var error;\n    error = new SyntaxError(message);\n    error.location = location;\n    error.toString = syntaxErrorToString;\n    // Instead of showing the compiler's stacktrace, show our custom error message\n    // (this is useful when the error bubbles up in Node.js applications that\n    // compile CoffeeScript for example).\n    error.stack = error.toString();\n    throw error;\n  };\n\n  // Update a compiler SyntaxError with source code information if it didn't have\n  // it already.\n  exports.updateSyntaxError = function(error, code, filename) {\n    // Avoid screwing up the `stack` property of other errors (i.e. possible bugs).\n    if (error.toString === syntaxErrorToString) {\n      error.code || (error.code = code);\n      error.filename || (error.filename = filename);\n      error.stack = error.toString();\n    }\n    return error;\n  };\n\n  syntaxErrorToString = function() {\n    var codeLine, colorize, colorsEnabled, end, filename, first_column, first_line, last_column, last_line, marker, ref1, ref2, ref3, ref4, start;\n    if (!(this.code && this.location)) {\n      return Error.prototype.toString.call(this);\n    }\n    ({first_line, first_column, last_line, last_column} = this.location);\n    if (last_line == null) {\n      last_line = first_line;\n    }\n    if (last_column == null) {\n      last_column = first_column;\n    }\n    if ((ref1 = this.filename) != null ? ref1.startsWith('<anonymous') : void 0) {\n      filename = '[stdin]';\n    } else {\n      filename = this.filename || '[stdin]';\n    }\n    codeLine = this.code.split('\\n')[first_line];\n    start = first_column;\n    // Show only the first line on multi-line errors.\n    end = first_line === last_line ? last_column + 1 : codeLine.length;\n    marker = codeLine.slice(0, start).replace(/[^\\s]/g, ' ') + repeat('^', end - start);\n    // Check to see if we're running on a color-enabled TTY.\n    if (typeof process !== \"undefined\" && process !== null) {\n      colorsEnabled = ((ref2 = process.stdout) != null ? ref2.isTTY : void 0) && !((ref3 = process.env) != null ? ref3.NODE_DISABLE_COLORS : void 0);\n    }\n    if ((ref4 = this.colorful) != null ? ref4 : colorsEnabled) {\n      colorize = function(str) {\n        return `\\x1B[1;31m${str}\\x1B[0m`;\n      };\n      codeLine = codeLine.slice(0, start) + colorize(codeLine.slice(start, end)) + codeLine.slice(end);\n      marker = colorize(marker);\n    }\n    return `${filename}:${first_line + 1}:${first_column + 1}: error: ${this.message}\n${codeLine}\n${marker}`;\n  };\n\n  exports.nameWhitespaceCharacter = function(string) {\n    switch (string) {\n      case ' ':\n        return 'space';\n      case '\\n':\n        return 'newline';\n      case '\\r':\n        return 'carriage return';\n      case '\\t':\n        return 'tab';\n      default:\n        return string;\n    }\n  };\n\n  exports.parseNumber = function(string) {\n    var base;\n    if (string == null) {\n      return 0/0;\n    }\n    base = (function() {\n      switch (string.charAt(1)) {\n        case 'b':\n          return 2;\n        case 'o':\n          return 8;\n        case 'x':\n          return 16;\n        default:\n          return null;\n      }\n    })();\n    if (base != null) {\n      return parseInt(string.slice(2).replace(/_/g, ''), base);\n    } else {\n      return parseFloat(string.replace(/_/g, ''));\n    }\n  };\n\n  exports.isFunction = function(obj) {\n    return Object.prototype.toString.call(obj) === '[object Function]';\n  };\n\n  exports.isNumber = isNumber = function(obj) {\n    return Object.prototype.toString.call(obj) === '[object Number]';\n  };\n\n  exports.isString = isString = function(obj) {\n    return Object.prototype.toString.call(obj) === '[object String]';\n  };\n\n  exports.isBoolean = isBoolean = function(obj) {\n    return obj === true || obj === false || Object.prototype.toString.call(obj) === '[object Boolean]';\n  };\n\n  exports.isPlainObject = function(obj) {\n    return typeof obj === 'object' && !!obj && !Array.isArray(obj) && !isNumber(obj) && !isString(obj) && !isBoolean(obj);\n  };\n\n  unicodeCodePointToUnicodeEscapes = function(codePoint) {\n    var high, low, toUnicodeEscape;\n    toUnicodeEscape = function(val) {\n      var str;\n      str = val.toString(16);\n      return `\\\\u${repeat('0', 4 - str.length)}${str}`;\n    };\n    if (codePoint < 0x10000) {\n      return toUnicodeEscape(codePoint);\n    }\n    // surrogate pair\n    high = Math.floor((codePoint - 0x10000) / 0x400) + 0xD800;\n    low = (codePoint - 0x10000) % 0x400 + 0xDC00;\n    return `${toUnicodeEscape(high)}${toUnicodeEscape(low)}`;\n  };\n\n  // Replace `\\u{...}` with `\\uxxxx[\\uxxxx]` in regexes without `u` flag\n  exports.replaceUnicodeCodePointEscapes = function(str, {flags, error, delimiter = ''} = {}) {\n    var shouldReplace;\n    shouldReplace = (flags != null) && indexOf.call(flags, 'u') < 0;\n    return str.replace(UNICODE_CODE_POINT_ESCAPE, function(match, escapedBackslash, codePointHex, offset) {\n      var codePointDecimal;\n      if (escapedBackslash) {\n        return escapedBackslash;\n      }\n      codePointDecimal = parseInt(codePointHex, 16);\n      if (codePointDecimal > 0x10ffff) {\n        error(\"unicode code point escapes greater than \\\\u{10ffff} are not allowed\", {\n          offset: offset + delimiter.length,\n          length: codePointHex.length + 4\n        });\n      }\n      if (!shouldReplace) {\n        return match;\n      }\n      return unicodeCodePointToUnicodeEscapes(codePointDecimal);\n    });\n  };\n\n  UNICODE_CODE_POINT_ESCAPE = /(\\\\\\\\)|\\\\u\\{([\\da-fA-F]+)\\}/g; // Make sure the escape isn’t escaped.\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/index.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  // Node.js Implementation\n  var CoffeeScript, ext, fs, helpers, i, len, path, ref, universalCompile, vm,\n    hasProp = {}.hasOwnProperty;\n\n  CoffeeScript = require('./coffeescript');\n\n  fs = require('fs');\n\n  vm = require('vm');\n\n  path = require('path');\n\n  helpers = CoffeeScript.helpers;\n\n  CoffeeScript.transpile = function(js, options) {\n    var babel;\n    try {\n      babel = require('@babel/core');\n    } catch (error) {\n      try {\n        babel = require('babel-core');\n      } catch (error) {\n        // This error is only for Node, as CLI users will see a different error\n        // earlier if they don’t have Babel installed.\n        throw new Error('To use the transpile option, you must have the \\'@babel/core\\' module installed');\n      }\n    }\n    return babel.transform(js, options);\n  };\n\n  // The `compile` method shared by the CLI, Node and browser APIs.\n  universalCompile = CoffeeScript.compile;\n\n  // The `compile` method particular to the Node API.\n  CoffeeScript.compile = function(code, options) {\n    // Pass a reference to Babel into the compiler, so that the transpile option\n    // is available in the Node API. We need to do this so that tools like Webpack\n    // can `require('coffeescript')` and build correctly, without trying to\n    // require Babel.\n    if (options != null ? options.transpile : void 0) {\n      options.transpile.transpile = CoffeeScript.transpile;\n    }\n    return universalCompile.call(CoffeeScript, code, options);\n  };\n\n  // Compile and execute a string of CoffeeScript (on the server), correctly\n  // setting `__filename`, `__dirname`, and relative `require()`.\n  CoffeeScript.run = function(code, options = {}) {\n    var answer, dir, mainModule, ref;\n    mainModule = require.main;\n    // Set the filename.\n    mainModule.filename = process.argv[1] = options.filename ? fs.realpathSync(options.filename) : helpers.anonymousFileName();\n    // Clear the module cache.\n    mainModule.moduleCache && (mainModule.moduleCache = {});\n    // Assign paths for node_modules loading\n    dir = options.filename != null ? path.dirname(fs.realpathSync(options.filename)) : fs.realpathSync('.');\n    mainModule.paths = require('module')._nodeModulePaths(dir);\n    // Save the options for compiling child imports.\n    mainModule.options = options;\n    options.filename = mainModule.filename;\n    options.inlineMap = true;\n    // Compile.\n    answer = CoffeeScript.compile(code, options);\n    code = (ref = answer.js) != null ? ref : answer;\n    return mainModule._compile(code, mainModule.filename);\n  };\n\n  // Compile and evaluate a string of CoffeeScript (in a Node.js-like environment).\n  // The CoffeeScript REPL uses this to run the input.\n  CoffeeScript.eval = function(code, options = {}) {\n    var Module, _module, _require, createContext, i, isContext, js, k, len, o, r, ref, ref1, ref2, ref3, sandbox, v;\n    if (!(code = code.trim())) {\n      return;\n    }\n    createContext = (ref = vm.Script.createContext) != null ? ref : vm.createContext;\n    isContext = (ref1 = vm.isContext) != null ? ref1 : function(ctx) {\n      return options.sandbox instanceof createContext().constructor;\n    };\n    if (createContext) {\n      if (options.sandbox != null) {\n        if (isContext(options.sandbox)) {\n          sandbox = options.sandbox;\n        } else {\n          sandbox = createContext();\n          ref2 = options.sandbox;\n          for (k in ref2) {\n            if (!hasProp.call(ref2, k)) continue;\n            v = ref2[k];\n            sandbox[k] = v;\n          }\n        }\n        sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox;\n      } else {\n        sandbox = global;\n      }\n      sandbox.__filename = options.filename || 'eval';\n      sandbox.__dirname = path.dirname(sandbox.__filename);\n      // define module/require only if they chose not to specify their own\n      if (!(sandbox !== global || sandbox.module || sandbox.require)) {\n        Module = require('module');\n        sandbox.module = _module = new Module(options.modulename || 'eval');\n        sandbox.require = _require = function(path) {\n          return Module._load(path, _module, true);\n        };\n        _module.filename = sandbox.__filename;\n        ref3 = Object.getOwnPropertyNames(require);\n        for (i = 0, len = ref3.length; i < len; i++) {\n          r = ref3[i];\n          if (r !== 'paths' && r !== 'arguments' && r !== 'caller') {\n            _require[r] = require[r];\n          }\n        }\n        // use the same hack node currently uses for their own REPL\n        _require.paths = _module.paths = Module._nodeModulePaths(process.cwd());\n        _require.resolve = function(request) {\n          return Module._resolveFilename(request, _module);\n        };\n      }\n    }\n    o = {};\n    for (k in options) {\n      if (!hasProp.call(options, k)) continue;\n      v = options[k];\n      o[k] = v;\n    }\n    o.bare = true; // ensure return value\n    js = CoffeeScript.compile(code, o);\n    if (sandbox === global) {\n      return vm.runInThisContext(js);\n    } else {\n      return vm.runInContext(js, sandbox);\n    }\n  };\n\n  CoffeeScript.register = function() {\n    return require('./register');\n  };\n\n  // Throw error with deprecation warning when depending upon implicit `require.extensions` registration\n  if (require.extensions) {\n    ref = CoffeeScript.FILE_EXTENSIONS;\n    for (i = 0, len = ref.length; i < len; i++) {\n      ext = ref[i];\n      (function(ext) {\n        var base;\n        return (base = require.extensions)[ext] != null ? base[ext] : base[ext] = function() {\n          throw new Error(`Use CoffeeScript.register() or require the coffeescript/register module to require ${ext} files.`);\n        };\n      })(ext);\n    }\n  }\n\n  CoffeeScript._compileRawFileContent = function(raw, filename, options = {}) {\n    var answer, err, stripped;\n    // Strip the Unicode byte order mark, if this file begins with one.\n    stripped = raw.charCodeAt(0) === 0xFEFF ? raw.substring(1) : raw;\n    options = Object.assign({}, options, {\n      filename: filename,\n      literate: helpers.isLiterate(filename),\n      sourceFiles: [filename]\n    });\n    try {\n      answer = CoffeeScript.compile(stripped, options);\n    } catch (error) {\n      err = error;\n      // As the filename and code of a dynamically loaded file will be different\n      // from the original file compiled with CoffeeScript.run, add that\n      // information to error so it can be pretty-printed later.\n      throw helpers.updateSyntaxError(err, stripped, filename);\n    }\n    return answer;\n  };\n\n  CoffeeScript._compileFile = function(filename, options = {}) {\n    var raw;\n    raw = fs.readFileSync(filename, 'utf8');\n    return CoffeeScript._compileRawFileContent(raw, filename, options);\n  };\n\n  module.exports = CoffeeScript;\n\n  // Explicitly define all named exports so that Node’s automatic detection of\n  // named exports from CommonJS packages finds all of them. This enables consuming\n  // packages to write code like `import { compile } from 'coffeescript'`.\n  // Don’t simplify this into a loop or similar; the `module.exports.name` part is\n  // essential for Node’s algorithm to successfully detect the name.\n  module.exports.VERSION = CoffeeScript.VERSION;\n\n  module.exports.FILE_EXTENSIONS = CoffeeScript.FILE_EXTENSIONS;\n\n  module.exports.helpers = CoffeeScript.helpers;\n\n  module.exports.registerCompiled = CoffeeScript.registerCompiled;\n\n  module.exports.compile = CoffeeScript.compile;\n\n  module.exports.tokens = CoffeeScript.tokens;\n\n  module.exports.nodes = CoffeeScript.nodes;\n\n  module.exports.register = CoffeeScript.register;\n\n  module.exports.eval = CoffeeScript.eval;\n\n  module.exports.run = CoffeeScript.run;\n\n  module.exports.transpile = CoffeeScript.transpile;\n\n  module.exports.patchStackTrace = CoffeeScript.patchStackTrace;\n\n  module.exports._compileRawFileContent = CoffeeScript._compileRawFileContent;\n\n  module.exports._compileFile = CoffeeScript._compileFile;\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/lexer.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  // The CoffeeScript Lexer. Uses a series of token-matching regexes to attempt\n  // matches against the beginning of the source code. When a match is found,\n  // a token is produced, we consume the match, and start again. Tokens are in the\n  // form:\n\n  //     [tag, value, locationData]\n\n  // where locationData is {first_line, first_column, last_line, last_column, last_line_exclusive, last_column_exclusive}, which is a\n  // format that can be fed directly into [Jison](https://github.com/zaach/jison).  These\n  // are read by jison in the `parser.lexer` function defined in coffeescript.coffee.\n  var BOM, BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARABLE_LEFT_SIDE, COMPARE, COMPOUND_ASSIGN, HERECOMMENT_ILLEGAL, HEREDOC_DOUBLE, HEREDOC_INDENT, HEREDOC_SINGLE, HEREGEX, HEREGEX_COMMENT, HERE_JSTOKEN, IDENTIFIER, INDENTABLE_CLOSERS, INDEXABLE, INSIDE_JSX, INVERSES, JSTOKEN, JSX_ATTRIBUTE, JSX_FRAGMENT_IDENTIFIER, JSX_IDENTIFIER, JSX_IDENTIFIER_PART, JSX_INTERPOLATION, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, Lexer, MATH, MULTI_DENT, NOT_REGEX, NUMBER, OPERATOR, POSSIBLY_DIVISION, REGEX, REGEX_FLAGS, REGEX_ILLEGAL, REGEX_INVALID_ESCAPE, RELATION, RESERVED, Rewriter, SHIFT, STRICT_PROSCRIBED, STRING_DOUBLE, STRING_INVALID_ESCAPE, STRING_SINGLE, STRING_START, TRAILING_SPACES, UNARY, UNARY_MATH, UNFINISHED, VALID_FLAGS, WHITESPACE, addTokenData, attachCommentsToNode, compact, count, flatten, invertLiterate, isForFrom, isUnassignable, key, locationDataToString, merge, parseNumber, repeat, replaceUnicodeCodePointEscapes, starts, throwSyntaxError,\n    indexOf = [].indexOf,\n    slice = [].slice;\n\n  ({Rewriter, INVERSES, UNFINISHED} = require('./rewriter'));\n\n  // Import the helpers we need.\n  ({count, starts, compact, repeat, invertLiterate, merge, attachCommentsToNode, locationDataToString, throwSyntaxError, replaceUnicodeCodePointEscapes, flatten, parseNumber} = require('./helpers'));\n\n  // The Lexer Class\n  // ---------------\n\n  // The Lexer class reads a stream of CoffeeScript and divvies it up into tagged\n  // tokens. Some potential ambiguity in the grammar has been avoided by\n  // pushing some extra smarts into the Lexer.\n  exports.Lexer = Lexer = class Lexer {\n    constructor() {\n      // Throws an error at either a given offset from the current chunk or at the\n      // location of a token (`token[2]`).\n      this.error = this.error.bind(this);\n    }\n\n    // **tokenize** is the Lexer's main method. Scan by attempting to match tokens\n    // one at a time, using a regular expression anchored at the start of the\n    // remaining code, or a custom recursive token-matching method\n    // (for interpolations). When the next token has been recorded, we move forward\n    // within the code past the token, and begin again.\n\n    // Each tokenizing method is responsible for returning the number of characters\n    // it has consumed.\n\n    // Before returning the token stream, run it through the [Rewriter](rewriter.html).\n    tokenize(code, opts = {}) {\n      var consumed, end, i, ref;\n      this.literate = opts.literate; // Are we lexing literate CoffeeScript?\n      this.indent = 0; // The current indentation level.\n      this.baseIndent = 0; // The overall minimum indentation level.\n      this.continuationLineAdditionalIndent = 0; // The over-indentation at the current level.\n      this.outdebt = 0; // The under-outdentation at the current level.\n      this.indents = []; // The stack of all current indentation levels.\n      this.indentLiteral = ''; // The indentation.\n      this.ends = []; // The stack for pairing up tokens.\n      this.tokens = []; // Stream of parsed tokens in the form `['TYPE', value, location data]`.\n      this.seenFor = false; // Used to recognize `FORIN`, `FOROF` and `FORFROM` tokens.\n      this.seenImport = false; // Used to recognize `IMPORT FROM? AS?` tokens.\n      this.seenExport = false; // Used to recognize `EXPORT FROM? AS?` tokens.\n      this.importSpecifierList = false; // Used to identify when in an `IMPORT {...} FROM? ...`.\n      this.exportSpecifierList = false; // Used to identify when in an `EXPORT {...} FROM? ...`.\n      this.jsxDepth = 0; // Used to optimize JSX checks, how deep in JSX we are.\n      this.jsxObjAttribute = {}; // Used to detect if JSX attributes is wrapped in {} (<div {props...} />).\n      this.chunkLine = opts.line || 0; // The start line for the current @chunk.\n      this.chunkColumn = opts.column || 0; // The start column of the current @chunk.\n      this.chunkOffset = opts.offset || 0; // The start offset for the current @chunk.\n      this.locationDataCompensations = opts.locationDataCompensations || {};\n      code = this.clean(code); // The stripped, cleaned original source code.\n      \n      // At every position, run through this list of attempted matches,\n      // short-circuiting if any of them succeed. Their order determines precedence:\n      // `@literalToken` is the fallback catch-all.\n      i = 0;\n      while (this.chunk = code.slice(i)) {\n        consumed = this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.stringToken() || this.numberToken() || this.jsxToken() || this.regexToken() || this.jsToken() || this.literalToken();\n        // Update position.\n        [this.chunkLine, this.chunkColumn, this.chunkOffset] = this.getLineAndColumnFromChunk(consumed);\n        i += consumed;\n        if (opts.untilBalanced && this.ends.length === 0) {\n          return {\n            tokens: this.tokens,\n            index: i\n          };\n        }\n      }\n      this.closeIndentation();\n      if (end = this.ends.pop()) {\n        this.error(`missing ${end.tag}`, ((ref = end.origin) != null ? ref : end)[2]);\n      }\n      if (opts.rewrite === false) {\n        return this.tokens;\n      }\n      return (new Rewriter()).rewrite(this.tokens);\n    }\n\n    // Preprocess the code to remove leading and trailing whitespace, carriage\n    // returns, etc. If we’re lexing literate CoffeeScript, strip external Markdown\n    // by removing all lines that aren’t indented by at least four spaces or a tab.\n    clean(code) {\n      var base, thusFar;\n      thusFar = 0;\n      if (code.charCodeAt(0) === BOM) {\n        code = code.slice(1);\n        this.locationDataCompensations[0] = 1;\n        thusFar += 1;\n      }\n      if (WHITESPACE.test(code)) {\n        code = `\\n${code}`;\n        this.chunkLine--;\n        if ((base = this.locationDataCompensations)[0] == null) {\n          base[0] = 0;\n        }\n        this.locationDataCompensations[0] -= 1;\n      }\n      code = code.replace(/\\r/g, (match, offset) => {\n        this.locationDataCompensations[thusFar + offset] = 1;\n        return '';\n      }).replace(TRAILING_SPACES, '');\n      if (this.literate) {\n        code = invertLiterate(code);\n      }\n      return code;\n    }\n\n    // Tokenizers\n    // ----------\n\n      // Matches identifying literals: variables, keywords, method names, etc.\n    // Check to ensure that JavaScript reserved words aren’t being used as\n    // identifiers. Because CoffeeScript reserves a handful of keywords that are\n    // allowed in JavaScript, we’re careful not to tag them as keywords when\n    // referenced as property names here, so you can still do `jQuery.is()` even\n    // though `is` means `===` otherwise.\n    identifierToken() {\n      var alias, colon, colonOffset, colonToken, id, idLength, inJSXTag, input, match, poppedToken, prev, prevprev, ref, ref1, ref10, ref11, ref12, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, regExSuper, regex, sup, tag, tagToken, tokenData;\n      inJSXTag = this.atJSXTag();\n      regex = inJSXTag ? JSX_ATTRIBUTE : IDENTIFIER;\n      if (!(match = regex.exec(this.chunk))) {\n        return 0;\n      }\n      [input, id, colon] = match;\n      // Preserve length of id for location data\n      idLength = id.length;\n      poppedToken = void 0;\n      if (id === 'own' && this.tag() === 'FOR') {\n        this.token('OWN', id);\n        return id.length;\n      }\n      if (id === 'from' && this.tag() === 'YIELD') {\n        this.token('FROM', id);\n        return id.length;\n      }\n      if (id === 'as' && this.seenImport) {\n        if (this.value() === '*') {\n          this.tokens[this.tokens.length - 1][0] = 'IMPORT_ALL';\n        } else if (ref = this.value(true), indexOf.call(COFFEE_KEYWORDS, ref) >= 0) {\n          prev = this.prev();\n          [prev[0], prev[1]] = ['IDENTIFIER', this.value(true)];\n        }\n        if ((ref1 = this.tag()) === 'DEFAULT' || ref1 === 'IMPORT_ALL' || ref1 === 'IDENTIFIER') {\n          this.token('AS', id);\n          return id.length;\n        }\n      }\n      if (id === 'as' && this.seenExport) {\n        if ((ref2 = this.tag()) === 'IDENTIFIER' || ref2 === 'DEFAULT') {\n          this.token('AS', id);\n          return id.length;\n        }\n        if (ref3 = this.value(true), indexOf.call(COFFEE_KEYWORDS, ref3) >= 0) {\n          prev = this.prev();\n          [prev[0], prev[1]] = ['IDENTIFIER', this.value(true)];\n          this.token('AS', id);\n          return id.length;\n        }\n      }\n      if (id === 'default' && this.seenExport && ((ref4 = this.tag()) === 'EXPORT' || ref4 === 'AS')) {\n        this.token('DEFAULT', id);\n        return id.length;\n      }\n      if (id === 'assert' && (this.seenImport || this.seenExport) && this.tag() === 'STRING') {\n        this.token('ASSERT', id);\n        return id.length;\n      }\n      if (id === 'do' && (regExSuper = /^(\\s*super)(?!\\(\\))/.exec(this.chunk.slice(3)))) {\n        this.token('SUPER', 'super');\n        this.token('CALL_START', '(');\n        this.token('CALL_END', ')');\n        [input, sup] = regExSuper;\n        return sup.length + 3;\n      }\n      prev = this.prev();\n      tag = colon || (prev != null) && (((ref5 = prev[0]) === '.' || ref5 === '?.' || ref5 === '::' || ref5 === '?::') || !prev.spaced && prev[0] === '@') ? 'PROPERTY' : 'IDENTIFIER';\n      tokenData = {};\n      if (tag === 'IDENTIFIER' && (indexOf.call(JS_KEYWORDS, id) >= 0 || indexOf.call(COFFEE_KEYWORDS, id) >= 0) && !(this.exportSpecifierList && indexOf.call(COFFEE_KEYWORDS, id) >= 0)) {\n        tag = id.toUpperCase();\n        if (tag === 'WHEN' && (ref6 = this.tag(), indexOf.call(LINE_BREAK, ref6) >= 0)) {\n          tag = 'LEADING_WHEN';\n        } else if (tag === 'FOR') {\n          this.seenFor = {\n            endsLength: this.ends.length\n          };\n        } else if (tag === 'UNLESS') {\n          tag = 'IF';\n        } else if (tag === 'IMPORT') {\n          this.seenImport = true;\n        } else if (tag === 'EXPORT') {\n          this.seenExport = true;\n        } else if (indexOf.call(UNARY, tag) >= 0) {\n          tag = 'UNARY';\n        } else if (indexOf.call(RELATION, tag) >= 0) {\n          if (tag !== 'INSTANCEOF' && this.seenFor) {\n            tag = 'FOR' + tag;\n            this.seenFor = false;\n          } else {\n            tag = 'RELATION';\n            if (this.value() === '!') {\n              poppedToken = this.tokens.pop();\n              tokenData.invert = (ref7 = (ref8 = poppedToken.data) != null ? ref8.original : void 0) != null ? ref7 : poppedToken[1];\n            }\n          }\n        }\n      } else if (tag === 'IDENTIFIER' && this.seenFor && id === 'from' && isForFrom(prev)) {\n        tag = 'FORFROM';\n        this.seenFor = false;\n      // Throw an error on attempts to use `get` or `set` as keywords, or\n      // what CoffeeScript would normally interpret as calls to functions named\n      // `get` or `set`, i.e. `get({foo: function () {}})`.\n      } else if (tag === 'PROPERTY' && prev) {\n        if (prev.spaced && (ref9 = prev[0], indexOf.call(CALLABLE, ref9) >= 0) && /^[gs]et$/.test(prev[1]) && this.tokens.length > 1 && ((ref10 = this.tokens[this.tokens.length - 2][0]) !== '.' && ref10 !== '?.' && ref10 !== '@')) {\n          this.error(`'${prev[1]}' cannot be used as a keyword, or as a function call without parentheses`, prev[2]);\n        } else if (prev[0] === '.' && this.tokens.length > 1 && (prevprev = this.tokens[this.tokens.length - 2])[0] === 'UNARY' && prevprev[1] === 'new') {\n          prevprev[0] = 'NEW_TARGET';\n        } else if (prev[0] === '.' && this.tokens.length > 1 && (prevprev = this.tokens[this.tokens.length - 2])[0] === 'IMPORT' && prevprev[1] === 'import') {\n          this.seenImport = false;\n          prevprev[0] = 'IMPORT_META';\n        } else if (this.tokens.length > 2) {\n          prevprev = this.tokens[this.tokens.length - 2];\n          if (((ref11 = prev[0]) === '@' || ref11 === 'THIS') && prevprev && prevprev.spaced && /^[gs]et$/.test(prevprev[1]) && ((ref12 = this.tokens[this.tokens.length - 3][0]) !== '.' && ref12 !== '?.' && ref12 !== '@')) {\n            this.error(`'${prevprev[1]}' cannot be used as a keyword, or as a function call without parentheses`, prevprev[2]);\n          }\n        }\n      }\n      if (tag === 'IDENTIFIER' && indexOf.call(RESERVED, id) >= 0 && !inJSXTag) {\n        this.error(`reserved word '${id}'`, {\n          length: id.length\n        });\n      }\n      if (!(tag === 'PROPERTY' || this.exportSpecifierList || this.importSpecifierList)) {\n        if (indexOf.call(COFFEE_ALIASES, id) >= 0) {\n          alias = id;\n          id = COFFEE_ALIAS_MAP[id];\n          tokenData.original = alias;\n        }\n        tag = (function() {\n          switch (id) {\n            case '!':\n              return 'UNARY';\n            case '==':\n            case '!=':\n              return 'COMPARE';\n            case 'true':\n            case 'false':\n              return 'BOOL';\n            case 'break':\n            case 'continue':\n            case 'debugger':\n              return 'STATEMENT';\n            case '&&':\n            case '||':\n              return id;\n            default:\n              return tag;\n          }\n        })();\n      }\n      tagToken = this.token(tag, id, {\n        length: idLength,\n        data: tokenData\n      });\n      if (alias) {\n        tagToken.origin = [tag, alias, tagToken[2]];\n      }\n      if (poppedToken) {\n        [tagToken[2].first_line, tagToken[2].first_column, tagToken[2].range[0]] = [poppedToken[2].first_line, poppedToken[2].first_column, poppedToken[2].range[0]];\n      }\n      if (colon) {\n        colonOffset = input.lastIndexOf(inJSXTag ? '=' : ':');\n        colonToken = this.token(':', ':', {\n          offset: colonOffset\n        });\n        if (inJSXTag) { // used by rewriter\n          colonToken.jsxColon = true;\n        }\n      }\n      if (inJSXTag && tag === 'IDENTIFIER' && prev[0] !== ':') {\n        this.token(',', ',', {\n          length: 0,\n          origin: tagToken,\n          generated: true\n        });\n      }\n      return input.length;\n    }\n\n    // Matches numbers, including decimals, hex, and exponential notation.\n    // Be careful not to interfere with ranges in progress.\n    numberToken() {\n      var lexedLength, match, number, parsedValue, tag, tokenData;\n      if (!(match = NUMBER.exec(this.chunk))) {\n        return 0;\n      }\n      number = match[0];\n      lexedLength = number.length;\n      switch (false) {\n        case !/^0[BOX]/.test(number):\n          this.error(`radix prefix in '${number}' must be lowercase`, {\n            offset: 1\n          });\n          break;\n        case !/^0\\d*[89]/.test(number):\n          this.error(`decimal literal '${number}' must not be prefixed with '0'`, {\n            length: lexedLength\n          });\n          break;\n        case !/^0\\d+/.test(number):\n          this.error(`octal literal '${number}' must be prefixed with '0o'`, {\n            length: lexedLength\n          });\n      }\n      parsedValue = parseNumber(number);\n      tokenData = {parsedValue};\n      tag = parsedValue === 2e308 ? 'INFINITY' : 'NUMBER';\n      if (tag === 'INFINITY') {\n        tokenData.original = number;\n      }\n      this.token(tag, number, {\n        length: lexedLength,\n        data: tokenData\n      });\n      return lexedLength;\n    }\n\n    // Matches strings, including multiline strings, as well as heredocs, with or without\n    // interpolation.\n    stringToken() {\n      var attempt, delimiter, doc, end, heredoc, i, indent, match, prev, quote, ref, regex, token, tokens;\n      [quote] = STRING_START.exec(this.chunk) || [];\n      if (!quote) {\n        return 0;\n      }\n      // If the preceding token is `from` and this is an import or export statement,\n      // properly tag the `from`.\n      prev = this.prev();\n      if (prev && this.value() === 'from' && (this.seenImport || this.seenExport)) {\n        prev[0] = 'FROM';\n      }\n      regex = (function() {\n        switch (quote) {\n          case \"'\":\n            return STRING_SINGLE;\n          case '\"':\n            return STRING_DOUBLE;\n          case \"'''\":\n            return HEREDOC_SINGLE;\n          case '\"\"\"':\n            return HEREDOC_DOUBLE;\n        }\n      })();\n      ({\n        tokens,\n        index: end\n      } = this.matchWithInterpolations(regex, quote));\n      heredoc = quote.length === 3;\n      if (heredoc) {\n        // Find the smallest indentation. It will be removed from all lines later.\n        indent = null;\n        doc = ((function() {\n          var j, len, results;\n          results = [];\n          for (i = j = 0, len = tokens.length; j < len; i = ++j) {\n            token = tokens[i];\n            if (token[0] === 'NEOSTRING') {\n              results.push(token[1]);\n            }\n          }\n          return results;\n        })()).join('#{}');\n        while (match = HEREDOC_INDENT.exec(doc)) {\n          attempt = match[1];\n          if (indent === null || (0 < (ref = attempt.length) && ref < indent.length)) {\n            indent = attempt;\n          }\n        }\n      }\n      delimiter = quote.charAt(0);\n      this.mergeInterpolationTokens(tokens, {\n        quote,\n        indent,\n        endOffset: end\n      }, (value) => {\n        return this.validateUnicodeCodePointEscapes(value, {\n          delimiter: quote\n        });\n      });\n      if (this.atJSXTag()) {\n        this.token(',', ',', {\n          length: 0,\n          origin: this.prev,\n          generated: true\n        });\n      }\n      return end;\n    }\n\n    // Matches and consumes comments. The comments are taken out of the token\n    // stream and saved for later, to be reinserted into the output after\n    // everything has been parsed and the JavaScript code generated.\n    commentToken(chunk = this.chunk, {heregex, returnCommentTokens = false, offsetInChunk = 0} = {}) {\n      var commentAttachment, commentAttachments, commentWithSurroundingWhitespace, content, contents, getIndentSize, hasSeenFirstCommentLine, hereComment, hereLeadingWhitespace, hereTrailingWhitespace, i, indentSize, leadingNewline, leadingNewlineOffset, leadingNewlines, leadingWhitespace, length, lineComment, match, matchIllegal, noIndent, nonInitial, placeholderToken, precededByBlankLine, precedingNonCommentLines, prev;\n      if (!(match = chunk.match(COMMENT))) {\n        return 0;\n      }\n      [commentWithSurroundingWhitespace, hereLeadingWhitespace, hereComment, hereTrailingWhitespace, lineComment] = match;\n      contents = null;\n      // Does this comment follow code on the same line?\n      leadingNewline = /^\\s*\\n+\\s*#/.test(commentWithSurroundingWhitespace);\n      if (hereComment) {\n        matchIllegal = HERECOMMENT_ILLEGAL.exec(hereComment);\n        if (matchIllegal) {\n          this.error(`block comments cannot contain ${matchIllegal[0]}`, {\n            offset: '###'.length + matchIllegal.index,\n            length: matchIllegal[0].length\n          });\n        }\n        // Parse indentation or outdentation as if this block comment didn’t exist.\n        chunk = chunk.replace(`###${hereComment}###`, '');\n        // Remove leading newlines, like `Rewriter::removeLeadingNewlines`, to\n        // avoid the creation of unwanted `TERMINATOR` tokens.\n        chunk = chunk.replace(/^\\n+/, '');\n        this.lineToken({chunk});\n        // Pull out the ###-style comment’s content, and format it.\n        content = hereComment;\n        contents = [\n          {\n            content,\n            length: commentWithSurroundingWhitespace.length - hereLeadingWhitespace.length - hereTrailingWhitespace.length,\n            leadingWhitespace: hereLeadingWhitespace\n          }\n        ];\n      } else {\n        // The `COMMENT` regex captures successive line comments as one token.\n        // Remove any leading newlines before the first comment, but preserve\n        // blank lines between line comments.\n        leadingNewlines = '';\n        content = lineComment.replace(/^(\\n*)/, function(leading) {\n          leadingNewlines = leading;\n          return '';\n        });\n        precedingNonCommentLines = '';\n        hasSeenFirstCommentLine = false;\n        contents = content.split('\\n').map(function(line, index) {\n          var comment, leadingWhitespace;\n          if (!(line.indexOf('#') > -1)) {\n            precedingNonCommentLines += `\\n${line}`;\n            return;\n          }\n          leadingWhitespace = '';\n          content = line.replace(/^([ |\\t]*)#/, function(_, whitespace) {\n            leadingWhitespace = whitespace;\n            return '';\n          });\n          comment = {\n            content,\n            length: '#'.length + content.length,\n            leadingWhitespace: `${!hasSeenFirstCommentLine ? leadingNewlines : ''}${precedingNonCommentLines}${leadingWhitespace}`,\n            precededByBlankLine: !!precedingNonCommentLines\n          };\n          hasSeenFirstCommentLine = true;\n          precedingNonCommentLines = '';\n          return comment;\n        }).filter(function(comment) {\n          return comment;\n        });\n      }\n      getIndentSize = function({leadingWhitespace, nonInitial}) {\n        var lastNewlineIndex;\n        lastNewlineIndex = leadingWhitespace.lastIndexOf('\\n');\n        if ((hereComment != null) || !nonInitial) {\n          if (!(lastNewlineIndex > -1)) {\n            return null;\n          }\n        } else {\n          if (lastNewlineIndex == null) {\n            lastNewlineIndex = -1;\n          }\n        }\n        return leadingWhitespace.length - 1 - lastNewlineIndex;\n      };\n      commentAttachments = (function() {\n        var j, len, results;\n        results = [];\n        for (i = j = 0, len = contents.length; j < len; i = ++j) {\n          ({content, length, leadingWhitespace, precededByBlankLine} = contents[i]);\n          nonInitial = i !== 0;\n          leadingNewlineOffset = nonInitial ? 1 : 0;\n          offsetInChunk += leadingNewlineOffset + leadingWhitespace.length;\n          indentSize = getIndentSize({leadingWhitespace, nonInitial});\n          noIndent = (indentSize == null) || indentSize === -1;\n          commentAttachment = {\n            content,\n            here: hereComment != null,\n            newLine: leadingNewline || nonInitial, // Line comments after the first one start new lines, by definition.\n            locationData: this.makeLocationData({offsetInChunk, length}),\n            precededByBlankLine,\n            indentSize,\n            indented: !noIndent && indentSize > this.indent,\n            outdented: !noIndent && indentSize < this.indent\n          };\n          if (heregex) {\n            commentAttachment.heregex = true;\n          }\n          offsetInChunk += length;\n          results.push(commentAttachment);\n        }\n        return results;\n      }).call(this);\n      prev = this.prev();\n      if (!prev) {\n        // If there’s no previous token, create a placeholder token to attach\n        // this comment to; and follow with a newline.\n        commentAttachments[0].newLine = true;\n        this.lineToken({\n          chunk: this.chunk.slice(commentWithSurroundingWhitespace.length),\n          offset: commentWithSurroundingWhitespace.length // Set the indent.\n        });\n        placeholderToken = this.makeToken('JS', '', {\n          offset: commentWithSurroundingWhitespace.length,\n          generated: true\n        });\n        placeholderToken.comments = commentAttachments;\n        this.tokens.push(placeholderToken);\n        this.newlineToken(commentWithSurroundingWhitespace.length);\n      } else {\n        attachCommentsToNode(commentAttachments, prev);\n      }\n      if (returnCommentTokens) {\n        return commentAttachments;\n      }\n      return commentWithSurroundingWhitespace.length;\n    }\n\n    // Matches JavaScript interpolated directly into the source via backticks.\n    jsToken() {\n      var length, match, matchedHere, script;\n      if (!(this.chunk.charAt(0) === '`' && (match = (matchedHere = HERE_JSTOKEN.exec(this.chunk)) || JSTOKEN.exec(this.chunk)))) {\n        return 0;\n      }\n      // Convert escaped backticks to backticks, and escaped backslashes\n      // just before escaped backticks to backslashes\n      script = match[1];\n      ({length} = match[0]);\n      this.token('JS', script, {\n        length,\n        data: {\n          here: !!matchedHere\n        }\n      });\n      return length;\n    }\n\n    // Matches regular expression literals, as well as multiline extended ones.\n    // Lexing regular expressions is difficult to distinguish from division, so we\n    // borrow some basic heuristics from JavaScript and Ruby.\n    regexToken() {\n      var body, closed, comment, commentIndex, commentOpts, commentTokens, comments, delimiter, end, flags, fullMatch, index, leadingWhitespace, match, matchedComment, origin, prev, ref, ref1, regex, tokens;\n      switch (false) {\n        case !(match = REGEX_ILLEGAL.exec(this.chunk)):\n          this.error(`regular expressions cannot begin with ${match[2]}`, {\n            offset: match.index + match[1].length\n          });\n          break;\n        case !(match = this.matchWithInterpolations(HEREGEX, '///')):\n          ({tokens, index} = match);\n          comments = [];\n          while (matchedComment = HEREGEX_COMMENT.exec(this.chunk.slice(0, index))) {\n            ({\n              index: commentIndex\n            } = matchedComment);\n            [fullMatch, leadingWhitespace, comment] = matchedComment;\n            comments.push({\n              comment,\n              offsetInChunk: commentIndex + leadingWhitespace.length\n            });\n          }\n          commentTokens = flatten((function() {\n            var j, len, results;\n            results = [];\n            for (j = 0, len = comments.length; j < len; j++) {\n              commentOpts = comments[j];\n              results.push(this.commentToken(commentOpts.comment, Object.assign(commentOpts, {\n                heregex: true,\n                returnCommentTokens: true\n              })));\n            }\n            return results;\n          }).call(this));\n          break;\n        case !(match = REGEX.exec(this.chunk)):\n          [regex, body, closed] = match;\n          this.validateEscapes(body, {\n            isRegex: true,\n            offsetInChunk: 1\n          });\n          index = regex.length;\n          prev = this.prev();\n          if (prev) {\n            if (prev.spaced && (ref = prev[0], indexOf.call(CALLABLE, ref) >= 0)) {\n              if (!closed || POSSIBLY_DIVISION.test(regex)) {\n                return 0;\n              }\n            } else if (ref1 = prev[0], indexOf.call(NOT_REGEX, ref1) >= 0) {\n              return 0;\n            }\n          }\n          if (!closed) {\n            this.error('missing / (unclosed regex)');\n          }\n          break;\n        default:\n          return 0;\n      }\n      [flags] = REGEX_FLAGS.exec(this.chunk.slice(index));\n      end = index + flags.length;\n      origin = this.makeToken('REGEX', null, {\n        length: end\n      });\n      switch (false) {\n        case !!VALID_FLAGS.test(flags):\n          this.error(`invalid regular expression flags ${flags}`, {\n            offset: index,\n            length: flags.length\n          });\n          break;\n        case !(regex || tokens.length === 1):\n          delimiter = body ? '/' : '///';\n          if (body == null) {\n            body = tokens[0][1];\n          }\n          this.validateUnicodeCodePointEscapes(body, {delimiter});\n          this.token('REGEX', `/${body}/${flags}`, {\n            length: end,\n            origin,\n            data: {delimiter}\n          });\n          break;\n        default:\n          this.token('REGEX_START', '(', {\n            length: 0,\n            origin,\n            generated: true\n          });\n          this.token('IDENTIFIER', 'RegExp', {\n            length: 0,\n            generated: true\n          });\n          this.token('CALL_START', '(', {\n            length: 0,\n            generated: true\n          });\n          this.mergeInterpolationTokens(tokens, {\n            double: true,\n            heregex: {flags},\n            endOffset: end - flags.length,\n            quote: '///'\n          }, (str) => {\n            return this.validateUnicodeCodePointEscapes(str, {delimiter});\n          });\n          if (flags) {\n            this.token(',', ',', {\n              offset: index - 1,\n              length: 0,\n              generated: true\n            });\n            this.token('STRING', '\"' + flags + '\"', {\n              offset: index,\n              length: flags.length\n            });\n          }\n          this.token(')', ')', {\n            offset: end,\n            length: 0,\n            generated: true\n          });\n          this.token('REGEX_END', ')', {\n            offset: end,\n            length: 0,\n            generated: true\n          });\n      }\n      // Explicitly attach any heregex comments to the REGEX/REGEX_END token.\n      if (commentTokens != null ? commentTokens.length : void 0) {\n        addTokenData(this.tokens[this.tokens.length - 1], {\n          heregexCommentTokens: commentTokens\n        });\n      }\n      return end;\n    }\n\n    // Matches newlines, indents, and outdents, and determines which is which.\n    // If we can detect that the current line is continued onto the next line,\n    // then the newline is suppressed:\n\n    //     elements\n    //       .each( ... )\n    //       .map( ... )\n\n    // Keeps track of the level of indentation, because a single outdent token\n    // can close multiple indents, so we need to know how far in we happen to be.\n    lineToken({chunk = this.chunk, offset = 0} = {}) {\n      var backslash, diff, endsContinuationLineIndentation, indent, match, minLiteralLength, newIndentLiteral, noNewlines, prev, ref, size;\n      if (!(match = MULTI_DENT.exec(chunk))) {\n        return 0;\n      }\n      indent = match[0];\n      prev = this.prev();\n      backslash = (prev != null ? prev[0] : void 0) === '\\\\';\n      if (!((backslash || ((ref = this.seenFor) != null ? ref.endsLength : void 0) < this.ends.length) && this.seenFor)) {\n        this.seenFor = false;\n      }\n      if (!((backslash && this.seenImport) || this.importSpecifierList)) {\n        this.seenImport = false;\n      }\n      if (!((backslash && this.seenExport) || this.exportSpecifierList)) {\n        this.seenExport = false;\n      }\n      size = indent.length - 1 - indent.lastIndexOf('\\n');\n      noNewlines = this.unfinished();\n      newIndentLiteral = size > 0 ? indent.slice(-size) : '';\n      if (!/^(.?)\\1*$/.exec(newIndentLiteral)) {\n        this.error('mixed indentation', {\n          offset: indent.length\n        });\n        return indent.length;\n      }\n      minLiteralLength = Math.min(newIndentLiteral.length, this.indentLiteral.length);\n      if (newIndentLiteral.slice(0, minLiteralLength) !== this.indentLiteral.slice(0, minLiteralLength)) {\n        this.error('indentation mismatch', {\n          offset: indent.length\n        });\n        return indent.length;\n      }\n      if (size - this.continuationLineAdditionalIndent === this.indent) {\n        if (noNewlines) {\n          this.suppressNewlines();\n        } else {\n          this.newlineToken(offset);\n        }\n        return indent.length;\n      }\n      if (size > this.indent) {\n        if (noNewlines) {\n          if (!backslash) {\n            this.continuationLineAdditionalIndent = size - this.indent;\n          }\n          if (this.continuationLineAdditionalIndent) {\n            prev.continuationLineIndent = this.indent + this.continuationLineAdditionalIndent;\n          }\n          this.suppressNewlines();\n          return indent.length;\n        }\n        if (!this.tokens.length) {\n          this.baseIndent = this.indent = size;\n          this.indentLiteral = newIndentLiteral;\n          return indent.length;\n        }\n        diff = size - this.indent + this.outdebt;\n        this.token('INDENT', diff, {\n          offset: offset + indent.length - size,\n          length: size\n        });\n        this.indents.push(diff);\n        this.ends.push({\n          tag: 'OUTDENT'\n        });\n        this.outdebt = this.continuationLineAdditionalIndent = 0;\n        this.indent = size;\n        this.indentLiteral = newIndentLiteral;\n      } else if (size < this.baseIndent) {\n        this.error('missing indentation', {\n          offset: offset + indent.length\n        });\n      } else {\n        endsContinuationLineIndentation = this.continuationLineAdditionalIndent > 0;\n        this.continuationLineAdditionalIndent = 0;\n        this.outdentToken({\n          moveOut: this.indent - size,\n          noNewlines,\n          outdentLength: indent.length,\n          offset,\n          indentSize: size,\n          endsContinuationLineIndentation\n        });\n      }\n      return indent.length;\n    }\n\n    // Record an outdent token or multiple tokens, if we happen to be moving back\n    // inwards past several recorded indents. Sets new @indent value.\n    outdentToken({moveOut, noNewlines, outdentLength = 0, offset = 0, indentSize, endsContinuationLineIndentation}) {\n      var decreasedIndent, dent, lastIndent, ref, terminatorToken;\n      decreasedIndent = this.indent - moveOut;\n      while (moveOut > 0) {\n        lastIndent = this.indents[this.indents.length - 1];\n        if (!lastIndent) {\n          this.outdebt = moveOut = 0;\n        } else if (this.outdebt && moveOut <= this.outdebt) {\n          this.outdebt -= moveOut;\n          moveOut = 0;\n        } else {\n          dent = this.indents.pop() + this.outdebt;\n          if (outdentLength && (ref = this.chunk[outdentLength], indexOf.call(INDENTABLE_CLOSERS, ref) >= 0)) {\n            decreasedIndent -= dent - moveOut;\n            moveOut = dent;\n          }\n          this.outdebt = 0;\n          // pair might call outdentToken, so preserve decreasedIndent\n          this.pair('OUTDENT');\n          this.token('OUTDENT', moveOut, {\n            length: outdentLength,\n            indentSize: indentSize + moveOut - dent\n          });\n          moveOut -= dent;\n        }\n      }\n      if (dent) {\n        this.outdebt -= moveOut;\n      }\n      this.suppressSemicolons();\n      if (!(this.tag() === 'TERMINATOR' || noNewlines)) {\n        terminatorToken = this.token('TERMINATOR', '\\n', {\n          offset: offset + outdentLength,\n          length: 0\n        });\n        if (endsContinuationLineIndentation) {\n          terminatorToken.endsContinuationLineIndentation = {\n            preContinuationLineIndent: this.indent\n          };\n        }\n      }\n      this.indent = decreasedIndent;\n      this.indentLiteral = this.indentLiteral.slice(0, decreasedIndent);\n      return this;\n    }\n\n    // Matches and consumes non-meaningful whitespace. Tag the previous token\n    // as being “spaced”, because there are some cases where it makes a difference.\n    whitespaceToken() {\n      var match, nline, prev;\n      if (!((match = WHITESPACE.exec(this.chunk)) || (nline = this.chunk.charAt(0) === '\\n'))) {\n        return 0;\n      }\n      prev = this.prev();\n      if (prev) {\n        prev[match ? 'spaced' : 'newLine'] = true;\n      }\n      if (match) {\n        return match[0].length;\n      } else {\n        return 0;\n      }\n    }\n\n    // Generate a newline token. Consecutive newlines get merged together.\n    newlineToken(offset) {\n      this.suppressSemicolons();\n      if (this.tag() !== 'TERMINATOR') {\n        this.token('TERMINATOR', '\\n', {\n          offset,\n          length: 0\n        });\n      }\n      return this;\n    }\n\n    // Use a `\\` at a line-ending to suppress the newline.\n    // The slash is removed here once its job is done.\n    suppressNewlines() {\n      var prev;\n      prev = this.prev();\n      if (prev[1] === '\\\\') {\n        if (prev.comments && this.tokens.length > 1) {\n          // `@tokens.length` should be at least 2 (some code, then `\\`).\n          // If something puts a `\\` after nothing, they deserve to lose any\n          // comments that trail it.\n          attachCommentsToNode(prev.comments, this.tokens[this.tokens.length - 2]);\n        }\n        this.tokens.pop();\n      }\n      return this;\n    }\n\n    jsxToken() {\n      var afterTag, end, endToken, firstChar, fullId, fullTagName, id, input, j, jsxTag, len, match, offset, openingTagToken, prev, prevChar, properties, property, ref, tagToken, token, tokens;\n      firstChar = this.chunk[0];\n      // Check the previous token to detect if attribute is spread.\n      prevChar = this.tokens.length > 0 ? this.tokens[this.tokens.length - 1][0] : '';\n      if (firstChar === '<') {\n        match = JSX_IDENTIFIER.exec(this.chunk.slice(1)) || JSX_FRAGMENT_IDENTIFIER.exec(this.chunk.slice(1));\n        // Not the right hand side of an unspaced comparison (i.e. `a<b`).\n        if (!(match && (this.jsxDepth > 0 || !(prev = this.prev()) || prev.spaced || (ref = prev[0], indexOf.call(COMPARABLE_LEFT_SIDE, ref) < 0)))) {\n          return 0;\n        }\n        [input, id] = match;\n        fullId = id;\n        if (indexOf.call(id, '.') >= 0) {\n          [id, ...properties] = id.split('.');\n        } else {\n          properties = [];\n        }\n        tagToken = this.token('JSX_TAG', id, {\n          length: id.length + 1,\n          data: {\n            openingBracketToken: this.makeToken('<', '<'),\n            tagNameToken: this.makeToken('IDENTIFIER', id, {\n              offset: 1\n            })\n          }\n        });\n        offset = id.length + 1;\n        for (j = 0, len = properties.length; j < len; j++) {\n          property = properties[j];\n          this.token('.', '.', {offset});\n          offset += 1;\n          this.token('PROPERTY', property, {offset});\n          offset += property.length;\n        }\n        this.token('CALL_START', '(', {\n          generated: true\n        });\n        this.token('[', '[', {\n          generated: true\n        });\n        this.ends.push({\n          tag: '/>',\n          origin: tagToken,\n          name: id,\n          properties\n        });\n        this.jsxDepth++;\n        return fullId.length + 1;\n      } else if (jsxTag = this.atJSXTag()) {\n        if (this.chunk.slice(0, 2) === '/>') { // Self-closing tag.\n          this.pair('/>');\n          this.token(']', ']', {\n            length: 2,\n            generated: true\n          });\n          this.token('CALL_END', ')', {\n            length: 2,\n            generated: true,\n            data: {\n              selfClosingSlashToken: this.makeToken('/', '/'),\n              closingBracketToken: this.makeToken('>', '>', {\n                offset: 1\n              })\n            }\n          });\n          this.jsxDepth--;\n          return 2;\n        } else if (firstChar === '{') {\n          if (prevChar === ':') {\n            // This token represents the start of a JSX attribute value\n            // that’s an expression (e.g. the `{b}` in `<div a={b} />`).\n            // Our grammar represents the beginnings of expressions as `(`\n            // tokens, so make this into a `(` token that displays as `{`.\n            token = this.token('(', '{');\n            this.jsxObjAttribute[this.jsxDepth] = false;\n            // tag attribute name as JSX\n            addTokenData(this.tokens[this.tokens.length - 3], {\n              jsx: true\n            });\n          } else {\n            token = this.token('{', '{');\n            this.jsxObjAttribute[this.jsxDepth] = true;\n          }\n          this.ends.push({\n            tag: '}',\n            origin: token\n          });\n          return 1;\n        } else if (firstChar === '>') { // end of opening tag\n          ({\n            // Ignore terminators inside a tag.\n            origin: openingTagToken\n          } = this.pair('/>')); // As if the current tag was self-closing.\n          this.token(']', ']', {\n            generated: true,\n            data: {\n              closingBracketToken: this.makeToken('>', '>')\n            }\n          });\n          this.token(',', 'JSX_COMMA', {\n            generated: true\n          });\n          ({\n            tokens,\n            index: end\n          } = this.matchWithInterpolations(INSIDE_JSX, '>', '</', JSX_INTERPOLATION));\n          this.mergeInterpolationTokens(tokens, {\n            endOffset: end,\n            jsx: true\n          }, (value) => {\n            return this.validateUnicodeCodePointEscapes(value, {\n              delimiter: '>'\n            });\n          });\n          match = JSX_IDENTIFIER.exec(this.chunk.slice(end)) || JSX_FRAGMENT_IDENTIFIER.exec(this.chunk.slice(end));\n          if (!match || match[1] !== `${jsxTag.name}${((function() {\n            var k, len1, ref1, results;\n            ref1 = jsxTag.properties;\n            results = [];\n            for (k = 0, len1 = ref1.length; k < len1; k++) {\n              property = ref1[k];\n              results.push(`.${property}`);\n            }\n            return results;\n          })()).join('')}`) {\n            this.error(`expected corresponding JSX closing tag for ${jsxTag.name}`, jsxTag.origin.data.tagNameToken[2]);\n          }\n          [, fullTagName] = match;\n          afterTag = end + fullTagName.length;\n          if (this.chunk[afterTag] !== '>') {\n            this.error(\"missing closing > after tag name\", {\n              offset: afterTag,\n              length: 1\n            });\n          }\n          // -2/+2 for the opening `</` and +1 for the closing `>`.\n          endToken = this.token('CALL_END', ')', {\n            offset: end - 2,\n            length: fullTagName.length + 3,\n            generated: true,\n            data: {\n              closingTagOpeningBracketToken: this.makeToken('<', '<', {\n                offset: end - 2\n              }),\n              closingTagSlashToken: this.makeToken('/', '/', {\n                offset: end - 1\n              }),\n              // TODO: individual tokens for complex tag name? eg < / A . B >\n              closingTagNameToken: this.makeToken('IDENTIFIER', fullTagName, {\n                offset: end\n              }),\n              closingTagClosingBracketToken: this.makeToken('>', '>', {\n                offset: end + fullTagName.length\n              })\n            }\n          });\n          // make the closing tag location data more easily accessible to the grammar\n          addTokenData(openingTagToken, endToken.data);\n          this.jsxDepth--;\n          return afterTag + 1;\n        } else {\n          return 0;\n        }\n      } else if (this.atJSXTag(1)) {\n        if (firstChar === '}') {\n          this.pair(firstChar);\n          if (this.jsxObjAttribute[this.jsxDepth]) {\n            this.token('}', '}');\n            this.jsxObjAttribute[this.jsxDepth] = false;\n          } else {\n            this.token(')', '}');\n          }\n          this.token(',', ',', {\n            generated: true\n          });\n          return 1;\n        } else {\n          return 0;\n        }\n      } else {\n        return 0;\n      }\n    }\n\n    atJSXTag(depth = 0) {\n      var i, last, ref;\n      if (this.jsxDepth === 0) {\n        return false;\n      }\n      i = this.ends.length - 1;\n      while (((ref = this.ends[i]) != null ? ref.tag : void 0) === 'OUTDENT' || depth-- > 0) { // Ignore indents.\n        i--;\n      }\n      last = this.ends[i];\n      return (last != null ? last.tag : void 0) === '/>' && last;\n    }\n\n    // We treat all other single characters as a token. E.g.: `( ) , . !`\n    // Multi-character operators are also literal tokens, so that Jison can assign\n    // the proper order of operations. There are some symbols that we tag specially\n    // here. `;` and newlines are both treated as a `TERMINATOR`, we distinguish\n    // parentheses that indicate a method call from regular parentheses, and so on.\n    literalToken() {\n      var match, message, origin, prev, ref, ref1, ref2, ref3, ref4, ref5, skipToken, tag, token, value;\n      if (match = OPERATOR.exec(this.chunk)) {\n        [value] = match;\n        if (CODE.test(value)) {\n          this.tagParameters();\n        }\n      } else {\n        value = this.chunk.charAt(0);\n      }\n      tag = value;\n      prev = this.prev();\n      if (prev && indexOf.call(['=', ...COMPOUND_ASSIGN], value) >= 0) {\n        skipToken = false;\n        if (value === '=' && ((ref = prev[1]) === '||' || ref === '&&') && !prev.spaced) {\n          prev[0] = 'COMPOUND_ASSIGN';\n          prev[1] += '=';\n          if ((ref1 = prev.data) != null ? ref1.original : void 0) {\n            prev.data.original += '=';\n          }\n          prev[2].range = [prev[2].range[0], prev[2].range[1] + 1];\n          prev[2].last_column += 1;\n          prev[2].last_column_exclusive += 1;\n          prev = this.tokens[this.tokens.length - 2];\n          skipToken = true;\n        }\n        if (prev && prev[0] !== 'PROPERTY') {\n          origin = (ref2 = prev.origin) != null ? ref2 : prev;\n          message = isUnassignable(prev[1], origin[1]);\n          if (message) {\n            this.error(message, origin[2]);\n          }\n        }\n        if (skipToken) {\n          return value.length;\n        }\n      }\n      if (value === '(' && (prev != null ? prev[0] : void 0) === 'IMPORT') {\n        prev[0] = 'DYNAMIC_IMPORT';\n      }\n      if (value === '{' && this.seenImport) {\n        this.importSpecifierList = true;\n      } else if (this.importSpecifierList && value === '}') {\n        this.importSpecifierList = false;\n      } else if (value === '{' && (prev != null ? prev[0] : void 0) === 'EXPORT') {\n        this.exportSpecifierList = true;\n      } else if (this.exportSpecifierList && value === '}') {\n        this.exportSpecifierList = false;\n      }\n      if (value === ';') {\n        if (ref3 = prev != null ? prev[0] : void 0, indexOf.call(['=', ...UNFINISHED], ref3) >= 0) {\n          this.error('unexpected ;');\n        }\n        this.seenFor = this.seenImport = this.seenExport = false;\n        tag = 'TERMINATOR';\n      } else if (value === '*' && (prev != null ? prev[0] : void 0) === 'EXPORT') {\n        tag = 'EXPORT_ALL';\n      } else if (indexOf.call(MATH, value) >= 0) {\n        tag = 'MATH';\n      } else if (indexOf.call(COMPARE, value) >= 0) {\n        tag = 'COMPARE';\n      } else if (indexOf.call(COMPOUND_ASSIGN, value) >= 0) {\n        tag = 'COMPOUND_ASSIGN';\n      } else if (indexOf.call(UNARY, value) >= 0) {\n        tag = 'UNARY';\n      } else if (indexOf.call(UNARY_MATH, value) >= 0) {\n        tag = 'UNARY_MATH';\n      } else if (indexOf.call(SHIFT, value) >= 0) {\n        tag = 'SHIFT';\n      } else if (value === '?' && (prev != null ? prev.spaced : void 0)) {\n        tag = 'BIN?';\n      } else if (prev) {\n        if (value === '(' && !prev.spaced && (ref4 = prev[0], indexOf.call(CALLABLE, ref4) >= 0)) {\n          if (prev[0] === '?') {\n            prev[0] = 'FUNC_EXIST';\n          }\n          tag = 'CALL_START';\n        } else if (value === '[' && (((ref5 = prev[0], indexOf.call(INDEXABLE, ref5) >= 0) && !prev.spaced) || (prev[0] === '::'))) { // `.prototype` can’t be a method you can call.\n          tag = 'INDEX_START';\n          switch (prev[0]) {\n            case '?':\n              prev[0] = 'INDEX_SOAK';\n          }\n        }\n      }\n      token = this.makeToken(tag, value);\n      switch (value) {\n        case '(':\n        case '{':\n        case '[':\n          this.ends.push({\n            tag: INVERSES[value],\n            origin: token\n          });\n          break;\n        case ')':\n        case '}':\n        case ']':\n          this.pair(value);\n      }\n      this.tokens.push(this.makeToken(tag, value));\n      return value.length;\n    }\n\n    // Token Manipulators\n    // ------------------\n\n      // A source of ambiguity in our grammar used to be parameter lists in function\n    // definitions versus argument lists in function calls. Walk backwards, tagging\n    // parameters specially in order to make things easier for the parser.\n    tagParameters() {\n      var i, paramEndToken, stack, tok, tokens;\n      if (this.tag() !== ')') {\n        return this.tagDoIife();\n      }\n      stack = [];\n      ({tokens} = this);\n      i = tokens.length;\n      paramEndToken = tokens[--i];\n      paramEndToken[0] = 'PARAM_END';\n      while (tok = tokens[--i]) {\n        switch (tok[0]) {\n          case ')':\n            stack.push(tok);\n            break;\n          case '(':\n          case 'CALL_START':\n            if (stack.length) {\n              stack.pop();\n            } else if (tok[0] === '(') {\n              tok[0] = 'PARAM_START';\n              return this.tagDoIife(i - 1);\n            } else {\n              paramEndToken[0] = 'CALL_END';\n              return this;\n            }\n        }\n      }\n      return this;\n    }\n\n    // Tag `do` followed by a function differently than `do` followed by eg an\n    // identifier to allow for different grammar precedence\n    tagDoIife(tokenIndex) {\n      var tok;\n      tok = this.tokens[tokenIndex != null ? tokenIndex : this.tokens.length - 1];\n      if ((tok != null ? tok[0] : void 0) !== 'DO') {\n        return this;\n      }\n      tok[0] = 'DO_IIFE';\n      return this;\n    }\n\n    // Close up all remaining open blocks at the end of the file.\n    closeIndentation() {\n      return this.outdentToken({\n        moveOut: this.indent,\n        indentSize: 0\n      });\n    }\n\n    // Match the contents of a delimited token and expand variables and expressions\n    // inside it using Ruby-like notation for substitution of arbitrary\n    // expressions.\n\n    //     \"Hello #{name.capitalize()}.\"\n\n    // If it encounters an interpolation, this method will recursively create a new\n    // Lexer and tokenize until the `{` of `#{` is balanced with a `}`.\n\n    //  - `regex` matches the contents of a token (but not `delimiter`, and not\n    //    `#{` if interpolations are desired).\n    //  - `delimiter` is the delimiter of the token. Examples are `'`, `\"`, `'''`,\n    //    `\"\"\"` and `///`.\n    //  - `closingDelimiter` is different from `delimiter` only in JSX\n    //  - `interpolators` matches the start of an interpolation, for JSX it's both\n    //    `{` and `<` (i.e. nested JSX tag)\n\n    // This method allows us to have strings within interpolations within strings,\n    // ad infinitum.\n    matchWithInterpolations(regex, delimiter, closingDelimiter = delimiter, interpolators = /^#\\{/) {\n      var braceInterpolator, close, column, index, interpolationOffset, interpolator, line, match, nested, offset, offsetInChunk, open, ref, ref1, rest, str, strPart, tokens;\n      tokens = [];\n      offsetInChunk = delimiter.length;\n      if (this.chunk.slice(0, offsetInChunk) !== delimiter) {\n        return null;\n      }\n      str = this.chunk.slice(offsetInChunk);\n      while (true) {\n        [strPart] = regex.exec(str);\n        this.validateEscapes(strPart, {\n          isRegex: delimiter.charAt(0) === '/',\n          offsetInChunk\n        });\n        // Push a fake `'NEOSTRING'` token, which will get turned into a real string later.\n        tokens.push(this.makeToken('NEOSTRING', strPart, {\n          offset: offsetInChunk\n        }));\n        str = str.slice(strPart.length);\n        offsetInChunk += strPart.length;\n        if (!(match = interpolators.exec(str))) {\n          break;\n        }\n        [interpolator] = match;\n        // To remove the `#` in `#{`.\n        interpolationOffset = interpolator.length - 1;\n        [line, column, offset] = this.getLineAndColumnFromChunk(offsetInChunk + interpolationOffset);\n        rest = str.slice(interpolationOffset);\n        ({\n          tokens: nested,\n          index\n        } = new Lexer().tokenize(rest, {\n          line,\n          column,\n          offset,\n          untilBalanced: true,\n          locationDataCompensations: this.locationDataCompensations\n        }));\n        // Account for the `#` in `#{`.\n        index += interpolationOffset;\n        braceInterpolator = str[index - 1] === '}';\n        if (braceInterpolator) {\n          // Turn the leading and trailing `{` and `}` into parentheses. Unnecessary\n          // parentheses will be removed later.\n          [open] = nested, [close] = slice.call(nested, -1);\n          open[0] = 'INTERPOLATION_START';\n          open[1] = '(';\n          open[2].first_column -= interpolationOffset;\n          open[2].range = [open[2].range[0] - interpolationOffset, open[2].range[1]];\n          close[0] = 'INTERPOLATION_END';\n          close[1] = ')';\n          close.origin = ['', 'end of interpolation', close[2]];\n        }\n        if (((ref = nested[1]) != null ? ref[0] : void 0) === 'TERMINATOR') {\n          // Remove leading `'TERMINATOR'` (if any).\n          nested.splice(1, 1);\n        }\n        if (((ref1 = nested[nested.length - 3]) != null ? ref1[0] : void 0) === 'INDENT' && nested[nested.length - 2][0] === 'OUTDENT') {\n          // Remove trailing `'INDENT'/'OUTDENT'` pair (if any).\n          nested.splice(-3, 2);\n        }\n        if (!braceInterpolator) {\n          // We are not using `{` and `}`, so wrap the interpolated tokens instead.\n          open = this.makeToken('INTERPOLATION_START', '(', {\n            offset: offsetInChunk,\n            length: 0,\n            generated: true\n          });\n          close = this.makeToken('INTERPOLATION_END', ')', {\n            offset: offsetInChunk + index,\n            length: 0,\n            generated: true\n          });\n          nested = [open, ...nested, close];\n        }\n        // Push a fake `'TOKENS'` token, which will get turned into real tokens later.\n        tokens.push(['TOKENS', nested]);\n        str = str.slice(index);\n        offsetInChunk += index;\n      }\n      if (str.slice(0, closingDelimiter.length) !== closingDelimiter) {\n        this.error(`missing ${closingDelimiter}`, {\n          length: delimiter.length\n        });\n      }\n      return {\n        tokens,\n        index: offsetInChunk + closingDelimiter.length\n      };\n    }\n\n    // Merge the array `tokens` of the fake token types `'TOKENS'` and `'NEOSTRING'`\n    // (as returned by `matchWithInterpolations`) into the token stream. The value\n    // of `'NEOSTRING'`s are converted using `fn` and turned into strings using\n    // `options` first.\n    mergeInterpolationTokens(tokens, options, fn) {\n      var $, converted, double, endOffset, firstIndex, heregex, i, indent, j, jsx, k, lastToken, len, len1, locationToken, lparen, placeholderToken, quote, ref, ref1, rparen, tag, token, tokensToPush, val, value;\n      ({quote, indent, double, heregex, endOffset, jsx} = options);\n      if (tokens.length > 1) {\n        lparen = this.token('STRING_START', '(', {\n          length: (ref = quote != null ? quote.length : void 0) != null ? ref : 0,\n          data: {quote},\n          generated: !(quote != null ? quote.length : void 0)\n        });\n      }\n      firstIndex = this.tokens.length;\n      $ = tokens.length - 1;\n      for (i = j = 0, len = tokens.length; j < len; i = ++j) {\n        token = tokens[i];\n        [tag, value] = token;\n        switch (tag) {\n          case 'TOKENS':\n            // There are comments (and nothing else) in this interpolation.\n            if (value.length === 2 && (value[0].comments || value[1].comments)) {\n              placeholderToken = this.makeToken('JS', '', {\n                generated: true\n              });\n              // Use the same location data as the first parenthesis.\n              placeholderToken[2] = value[0][2];\n              for (k = 0, len1 = value.length; k < len1; k++) {\n                val = value[k];\n                if (!val.comments) {\n                  continue;\n                }\n                if (placeholderToken.comments == null) {\n                  placeholderToken.comments = [];\n                }\n                placeholderToken.comments.push(...val.comments);\n              }\n              value.splice(1, 0, placeholderToken);\n            }\n            // Push all the tokens in the fake `'TOKENS'` token. These already have\n            // sane location data.\n            locationToken = value[0];\n            tokensToPush = value;\n            break;\n          case 'NEOSTRING':\n            // Convert `'NEOSTRING'` into `'STRING'`.\n            converted = fn.call(this, token[1], i);\n            if (i === 0) {\n              addTokenData(token, {\n                initialChunk: true\n              });\n            }\n            if (i === $) {\n              addTokenData(token, {\n                finalChunk: true\n              });\n            }\n            addTokenData(token, {indent, quote, double});\n            if (heregex) {\n              addTokenData(token, {heregex});\n            }\n            if (jsx) {\n              addTokenData(token, {jsx});\n            }\n            token[0] = 'STRING';\n            token[1] = '\"' + converted + '\"';\n            if (tokens.length === 1 && (quote != null)) {\n              token[2].first_column -= quote.length;\n              if (token[1].substr(-2, 1) === '\\n') {\n                token[2].last_line += 1;\n                token[2].last_column = quote.length - 1;\n              } else {\n                token[2].last_column += quote.length;\n                if (token[1].length === 2) {\n                  token[2].last_column -= 1;\n                }\n              }\n              token[2].last_column_exclusive += quote.length;\n              token[2].range = [token[2].range[0] - quote.length, token[2].range[1] + quote.length];\n            }\n            locationToken = token;\n            tokensToPush = [token];\n        }\n        this.tokens.push(...tokensToPush);\n      }\n      if (lparen) {\n        [lastToken] = slice.call(tokens, -1);\n        lparen.origin = [\n          'STRING',\n          null,\n          {\n            first_line: lparen[2].first_line,\n            first_column: lparen[2].first_column,\n            last_line: lastToken[2].last_line,\n            last_column: lastToken[2].last_column,\n            last_line_exclusive: lastToken[2].last_line_exclusive,\n            last_column_exclusive: lastToken[2].last_column_exclusive,\n            range: [lparen[2].range[0],\n          lastToken[2].range[1]]\n          }\n        ];\n        if (!(quote != null ? quote.length : void 0)) {\n          lparen[2] = lparen.origin[2];\n        }\n        return rparen = this.token('STRING_END', ')', {\n          offset: endOffset - (quote != null ? quote : '').length,\n          length: (ref1 = quote != null ? quote.length : void 0) != null ? ref1 : 0,\n          generated: !(quote != null ? quote.length : void 0)\n        });\n      }\n    }\n\n    // Pairs up a closing token, ensuring that all listed pairs of tokens are\n    // correctly balanced throughout the course of the token stream.\n    pair(tag) {\n      var lastIndent, prev, ref, ref1, wanted;\n      ref = this.ends, [prev] = slice.call(ref, -1);\n      if (tag !== (wanted = prev != null ? prev.tag : void 0)) {\n        if ('OUTDENT' !== wanted) {\n          this.error(`unmatched ${tag}`);\n        }\n        // Auto-close `INDENT` to support syntax like this:\n\n        //     el.click((event) ->\n        //       el.hide())\n\n        ref1 = this.indents, [lastIndent] = slice.call(ref1, -1);\n        this.outdentToken({\n          moveOut: lastIndent,\n          noNewlines: true\n        });\n        return this.pair(tag);\n      }\n      return this.ends.pop();\n    }\n\n    // Helpers\n    // -------\n\n      // Compensate for the things we strip out initially (e.g. carriage returns)\n    // so that location data stays accurate with respect to the original source file.\n    getLocationDataCompensation(start, end) {\n      var compensation, current, initialEnd, totalCompensation;\n      totalCompensation = 0;\n      initialEnd = end;\n      current = start;\n      while (current <= end) {\n        if (current === end && start !== initialEnd) {\n          break;\n        }\n        compensation = this.locationDataCompensations[current];\n        if (compensation != null) {\n          totalCompensation += compensation;\n          end += compensation;\n        }\n        current++;\n      }\n      return totalCompensation;\n    }\n\n    // Returns the line and column number from an offset into the current chunk.\n\n    // `offset` is a number of characters into `@chunk`.\n    getLineAndColumnFromChunk(offset) {\n      var column, columnCompensation, compensation, lastLine, lineCount, previousLinesCompensation, ref, string;\n      compensation = this.getLocationDataCompensation(this.chunkOffset, this.chunkOffset + offset);\n      if (offset === 0) {\n        return [this.chunkLine, this.chunkColumn + compensation, this.chunkOffset + compensation];\n      }\n      if (offset >= this.chunk.length) {\n        string = this.chunk;\n      } else {\n        string = this.chunk.slice(0, +(offset - 1) + 1 || 9e9);\n      }\n      lineCount = count(string, '\\n');\n      column = this.chunkColumn;\n      if (lineCount > 0) {\n        ref = string.split('\\n'), [lastLine] = slice.call(ref, -1);\n        column = lastLine.length;\n        previousLinesCompensation = this.getLocationDataCompensation(this.chunkOffset, this.chunkOffset + offset - column);\n        if (previousLinesCompensation < 0) {\n          // Don't recompensate for initially inserted newline.\n          previousLinesCompensation = 0;\n        }\n        columnCompensation = this.getLocationDataCompensation(this.chunkOffset + offset + previousLinesCompensation - column, this.chunkOffset + offset + previousLinesCompensation);\n      } else {\n        column += string.length;\n        columnCompensation = compensation;\n      }\n      return [this.chunkLine + lineCount, column + columnCompensation, this.chunkOffset + offset + compensation];\n    }\n\n    makeLocationData({offsetInChunk, length}) {\n      var endOffset, lastCharacter, locationData;\n      locationData = {\n        range: []\n      };\n      [locationData.first_line, locationData.first_column, locationData.range[0]] = this.getLineAndColumnFromChunk(offsetInChunk);\n      // Use length - 1 for the final offset - we’re supplying the last_line and the last_column,\n      // so if last_column == first_column, then we’re looking at a character of length 1.\n      lastCharacter = length > 0 ? length - 1 : 0;\n      [locationData.last_line, locationData.last_column, endOffset] = this.getLineAndColumnFromChunk(offsetInChunk + lastCharacter);\n      [locationData.last_line_exclusive, locationData.last_column_exclusive] = this.getLineAndColumnFromChunk(offsetInChunk + lastCharacter + (length > 0 ? 1 : 0));\n      locationData.range[1] = length > 0 ? endOffset + 1 : endOffset;\n      return locationData;\n    }\n\n    // Same as `token`, except this just returns the token without adding it\n    // to the results.\n    makeToken(tag, value, {\n        offset: offsetInChunk = 0,\n        length = value.length,\n        origin,\n        generated,\n        indentSize\n      } = {}) {\n      var token;\n      token = [tag, value, this.makeLocationData({offsetInChunk, length})];\n      if (origin) {\n        token.origin = origin;\n      }\n      if (generated) {\n        token.generated = true;\n      }\n      if (indentSize != null) {\n        token.indentSize = indentSize;\n      }\n      return token;\n    }\n\n    // Add a token to the results.\n    // `offset` is the offset into the current `@chunk` where the token starts.\n    // `length` is the length of the token in the `@chunk`, after the offset.  If\n    // not specified, the length of `value` will be used.\n\n    // Returns the new token.\n    token(tag, value, {offset, length, origin, data, generated, indentSize} = {}) {\n      var token;\n      token = this.makeToken(tag, value, {offset, length, origin, generated, indentSize});\n      if (data) {\n        addTokenData(token, data);\n      }\n      this.tokens.push(token);\n      return token;\n    }\n\n    // Peek at the last tag in the token stream.\n    tag() {\n      var ref, token;\n      ref = this.tokens, [token] = slice.call(ref, -1);\n      return token != null ? token[0] : void 0;\n    }\n\n    // Peek at the last value in the token stream.\n    value(useOrigin = false) {\n      var ref, token;\n      ref = this.tokens, [token] = slice.call(ref, -1);\n      if (useOrigin && ((token != null ? token.origin : void 0) != null)) {\n        return token.origin[1];\n      } else {\n        return token != null ? token[1] : void 0;\n      }\n    }\n\n    // Get the previous token in the token stream.\n    prev() {\n      return this.tokens[this.tokens.length - 1];\n    }\n\n    // Are we in the midst of an unfinished expression?\n    unfinished() {\n      var ref;\n      return LINE_CONTINUER.test(this.chunk) || (ref = this.tag(), indexOf.call(UNFINISHED, ref) >= 0);\n    }\n\n    validateUnicodeCodePointEscapes(str, options) {\n      return replaceUnicodeCodePointEscapes(str, merge(options, {error: this.error}));\n    }\n\n    // Validates escapes in strings and regexes.\n    validateEscapes(str, options = {}) {\n      var before, hex, invalidEscape, invalidEscapeRegex, match, message, octal, ref, unicode, unicodeCodePoint;\n      invalidEscapeRegex = options.isRegex ? REGEX_INVALID_ESCAPE : STRING_INVALID_ESCAPE;\n      match = invalidEscapeRegex.exec(str);\n      if (!match) {\n        return;\n      }\n      match[0], before = match[1], octal = match[2], hex = match[3], unicodeCodePoint = match[4], unicode = match[5];\n      message = octal ? \"octal escape sequences are not allowed\" : \"invalid escape sequence\";\n      invalidEscape = `\\\\${octal || hex || unicodeCodePoint || unicode}`;\n      return this.error(`${message} ${invalidEscape}`, {\n        offset: ((ref = options.offsetInChunk) != null ? ref : 0) + match.index + before.length,\n        length: invalidEscape.length\n      });\n    }\n\n    suppressSemicolons() {\n      var ref, ref1, results;\n      results = [];\n      while (this.value() === ';') {\n        this.tokens.pop();\n        if (ref = (ref1 = this.prev()) != null ? ref1[0] : void 0, indexOf.call(['=', ...UNFINISHED], ref) >= 0) {\n          results.push(this.error('unexpected ;'));\n        } else {\n          results.push(void 0);\n        }\n      }\n      return results;\n    }\n\n    error(message, options = {}) {\n      var first_column, first_line, location, ref, ref1;\n      location = 'first_line' in options ? options : ([first_line, first_column] = this.getLineAndColumnFromChunk((ref = options.offset) != null ? ref : 0), {\n        first_line,\n        first_column,\n        last_column: first_column + ((ref1 = options.length) != null ? ref1 : 1) - 1\n      });\n      return throwSyntaxError(message, location);\n    }\n\n  };\n\n  // Helper functions\n  // ----------------\n  isUnassignable = function(name, displayName = name) {\n    switch (false) {\n      case indexOf.call([...JS_KEYWORDS, ...COFFEE_KEYWORDS], name) < 0:\n        return `keyword '${displayName}' can't be assigned`;\n      case indexOf.call(STRICT_PROSCRIBED, name) < 0:\n        return `'${displayName}' can't be assigned`;\n      case indexOf.call(RESERVED, name) < 0:\n        return `reserved word '${displayName}' can't be assigned`;\n      default:\n        return false;\n    }\n  };\n\n  exports.isUnassignable = isUnassignable;\n\n  // `from` isn’t a CoffeeScript keyword, but it behaves like one in `import` and\n  // `export` statements (handled above) and in the declaration line of a `for`\n  // loop. Try to detect when `from` is a variable identifier and when it is this\n  // “sometimes” keyword.\n  isForFrom = function(prev) {\n    var ref;\n    // `for i from iterable`\n    if (prev[0] === 'IDENTIFIER') {\n      return true;\n    // `for from…`\n    } else if (prev[0] === 'FOR') {\n      return false;\n    // `for {from}…`, `for [from]…`, `for {a, from}…`, `for {a: from}…`\n    } else if ((ref = prev[1]) === '{' || ref === '[' || ref === ',' || ref === ':') {\n      return false;\n    } else {\n      return true;\n    }\n  };\n\n  addTokenData = function(token, data) {\n    return Object.assign((token.data != null ? token.data : token.data = {}), data);\n  };\n\n  // Constants\n  // ---------\n\n  // Keywords that CoffeeScript shares in common with JavaScript.\n  JS_KEYWORDS = ['true', 'false', 'null', 'this', 'new', 'delete', 'typeof', 'in', 'instanceof', 'return', 'throw', 'break', 'continue', 'debugger', 'yield', 'await', 'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally', 'class', 'extends', 'super', 'import', 'export', 'default'];\n\n  // CoffeeScript-only keywords.\n  COFFEE_KEYWORDS = ['undefined', 'Infinity', 'NaN', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when'];\n\n  COFFEE_ALIAS_MAP = {\n    and: '&&',\n    or: '||',\n    is: '==',\n    isnt: '!=',\n    not: '!',\n    yes: 'true',\n    no: 'false',\n    on: 'true',\n    off: 'false'\n  };\n\n  COFFEE_ALIASES = (function() {\n    var results;\n    results = [];\n    for (key in COFFEE_ALIAS_MAP) {\n      results.push(key);\n    }\n    return results;\n  })();\n\n  COFFEE_KEYWORDS = COFFEE_KEYWORDS.concat(COFFEE_ALIASES);\n\n  // The list of keywords that are reserved by JavaScript, but not used, or are\n  // used by CoffeeScript internally. We throw an error when these are encountered,\n  // to avoid having a JavaScript error at runtime.\n  RESERVED = ['case', 'function', 'var', 'void', 'with', 'const', 'let', 'enum', 'native', 'implements', 'interface', 'package', 'private', 'protected', 'public', 'static'];\n\n  STRICT_PROSCRIBED = ['arguments', 'eval'];\n\n  // The superset of both JavaScript keywords and reserved words, none of which may\n  // be used as identifiers or properties.\n  exports.JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED);\n\n  // The character code of the nasty Microsoft madness otherwise known as the BOM.\n  BOM = 65279;\n\n  // Token matching regexes.\n  IDENTIFIER = /^(?!\\d)((?:(?!\\s)[$\\w\\x7f-\\uffff])+)([^\\n\\S]*:(?!:))?/; // Is this a property name?\n\n  // Like `IDENTIFIER`, but includes `-`s\n  JSX_IDENTIFIER_PART = /(?:(?!\\s)[\\-$\\w\\x7f-\\uffff])+/.source;\n\n  // In https://facebook.github.io/jsx/ spec, JSXElementName can be\n  // JSXIdentifier, JSXNamespacedName (JSXIdentifier : JSXIdentifier), or\n  // JSXMemberExpression (two or more JSXIdentifier connected by `.`s).\n  JSX_IDENTIFIER = RegExp(`^(?![\\\\d<])(${JSX_IDENTIFIER_PART // Must not start with `<`.\n  // JSXNamespacedName\n  // JSXMemberExpression\n}(?:\\\\s*:\\\\s*${JSX_IDENTIFIER_PART}|(?:\\\\s*\\\\.\\\\s*${JSX_IDENTIFIER_PART})+)?)`);\n\n  // Fragment: <></>\n  JSX_FRAGMENT_IDENTIFIER = /^()>/; // Ends immediately with `>`.\n\n  // In https://facebook.github.io/jsx/ spec, JSXAttributeName can be either\n  // JSXIdentifier or JSXNamespacedName which is JSXIdentifier : JSXIdentifier\n  JSX_ATTRIBUTE = RegExp(`^(?!\\\\d)(${JSX_IDENTIFIER_PART // JSXNamespacedName\n  // Is this an attribute with a value?\n}(?:\\\\s*:\\\\s*${JSX_IDENTIFIER_PART})?)([^\\\\S]*=(?!=))?`);\n\n  NUMBER = /^0b[01](?:_?[01])*n?|^0o[0-7](?:_?[0-7])*n?|^0x[\\da-f](?:_?[\\da-f])*n?|^\\d+(?:_\\d+)*n|^(?:\\d+(?:_\\d+)*)?\\.?\\d+(?:_\\d+)*(?:e[+-]?\\d+(?:_\\d+)*)?/i; // binary\n  // octal\n  // hex\n  // decimal bigint\n  // decimal\n  // decimal without support for numeric literal separators for reference:\n  // \\d*\\.?\\d+ (?:e[+-]?\\d+)?\n\n  OPERATOR = /^(?:[-=]>|[-+*\\/%<>&|^!?=]=|>>>=?|([-+:])\\1|([&|<>*\\/%])\\2=?|\\?(\\.|::)|\\.{2,3})/; // function\n  // compound assign / compare\n  // zero-fill right shift\n  // doubles\n  // logic / shift / power / floor division / modulo\n  // soak access\n  // range or splat\n\n  WHITESPACE = /^[^\\n\\S]+/;\n\n  COMMENT = /^(\\s*)###([^#][\\s\\S]*?)(?:###([^\\n\\S]*)|###$)|^((?:\\s*#(?!##[^#]).*)+)/;\n\n  CODE = /^[-=]>/;\n\n  MULTI_DENT = /^(?:\\n[^\\n\\S]*)+/;\n\n  JSTOKEN = /^`(?!``)((?:[^`\\\\]|\\\\[\\s\\S])*)`/;\n\n  HERE_JSTOKEN = /^```((?:[^`\\\\]|\\\\[\\s\\S]|`(?!``))*)```/;\n\n  // String-matching-regexes.\n  STRING_START = /^(?:'''|\"\"\"|'|\")/;\n\n  STRING_SINGLE = /^(?:[^\\\\']|\\\\[\\s\\S])*/;\n\n  STRING_DOUBLE = /^(?:[^\\\\\"#]|\\\\[\\s\\S]|\\#(?!\\{))*/;\n\n  HEREDOC_SINGLE = /^(?:[^\\\\']|\\\\[\\s\\S]|'(?!''))*/;\n\n  HEREDOC_DOUBLE = /^(?:[^\\\\\"#]|\\\\[\\s\\S]|\"(?!\"\")|\\#(?!\\{))*/;\n\n  INSIDE_JSX = /^(?:[^\\{<])*/; // Start of CoffeeScript interpolation. // Similar to `HEREDOC_DOUBLE` but there is no escaping.\n  // Maybe JSX tag (`<` not allowed even if bare).\n\n  JSX_INTERPOLATION = /^(?:\\{|<(?!\\/))/; // CoffeeScript interpolation.\n  // JSX opening tag.\n\n  HEREDOC_INDENT = /\\n+([^\\n\\S]*)(?=\\S)/g;\n\n  // Regex-matching-regexes.\n  REGEX = /^\\/(?!\\/)((?:[^[\\/\\n\\\\]|\\\\[^\\n]|\\[(?:\\\\[^\\n]|[^\\]\\n\\\\])*\\])*)(\\/)?/; // Every other thing.\n  // Anything but newlines escaped.\n  // Character class.\n\n  REGEX_FLAGS = /^\\w*/;\n\n  VALID_FLAGS = /^(?!.*(.).*\\1)[gimsuy]*$/;\n\n  HEREGEX = /^(?:[^\\\\\\/#\\s]|\\\\[\\s\\S]|\\/(?!\\/\\/)|\\#(?!\\{)|\\s+(?:#(?!\\{).*)?)*/; // Match any character, except those that need special handling below.\n  // Match `\\` followed by any character.\n  // Match any `/` except `///`.\n  // Match `#` which is not part of interpolation, e.g. `#{}`.\n  // Comments consume everything until the end of the line, including `///`.\n\n  HEREGEX_COMMENT = /(\\s+)(#(?!{).*)/gm;\n\n  REGEX_ILLEGAL = /^(\\/|\\/{3}\\s*)(\\*)/;\n\n  POSSIBLY_DIVISION = /^\\/=?\\s/;\n\n  // Other regexes.\n  HERECOMMENT_ILLEGAL = /\\*\\//;\n\n  LINE_CONTINUER = /^\\s*(?:,|\\??\\.(?![.\\d])|\\??::)/;\n\n  STRING_INVALID_ESCAPE = /((?:^|[^\\\\])(?:\\\\\\\\)*)\\\\(?:(0\\d|[1-7])|(x(?![\\da-fA-F]{2}).{0,2})|(u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?)|(u(?!\\{|[\\da-fA-F]{4}).{0,4}))/; // Make sure the escape isn’t escaped.\n  // octal escape\n  // hex escape\n  // unicode code point escape\n  // unicode escape\n\n  REGEX_INVALID_ESCAPE = /((?:^|[^\\\\])(?:\\\\\\\\)*)\\\\(?:(0\\d)|(x(?![\\da-fA-F]{2}).{0,2})|(u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?)|(u(?!\\{|[\\da-fA-F]{4}).{0,4}))/; // Make sure the escape isn’t escaped.\n  // octal escape\n  // hex escape\n  // unicode code point escape\n  // unicode escape\n\n  TRAILING_SPACES = /\\s+$/;\n\n  // Compound assignment tokens.\n  COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=', '**=', '//=', '%%='];\n\n  // Unary tokens.\n  UNARY = ['NEW', 'TYPEOF', 'DELETE'];\n\n  UNARY_MATH = ['!', '~'];\n\n  // Bit-shifting tokens.\n  SHIFT = ['<<', '>>', '>>>'];\n\n  // Comparison tokens.\n  COMPARE = ['==', '!=', '<', '>', '<=', '>='];\n\n  // Mathematical tokens.\n  MATH = ['*', '/', '%', '//', '%%'];\n\n  // Relational tokens that are negatable with `not` prefix.\n  RELATION = ['IN', 'OF', 'INSTANCEOF'];\n\n  // Boolean tokens.\n  BOOL = ['TRUE', 'FALSE'];\n\n  // Tokens which could legitimately be invoked or indexed. An opening\n  // parentheses or bracket following these tokens will be recorded as the start\n  // of a function invocation or indexing operation.\n  CALLABLE = ['IDENTIFIER', 'PROPERTY', ')', ']', '?', '@', 'THIS', 'SUPER', 'DYNAMIC_IMPORT'];\n\n  INDEXABLE = CALLABLE.concat(['NUMBER', 'INFINITY', 'NAN', 'STRING', 'STRING_END', 'REGEX', 'REGEX_END', 'BOOL', 'NULL', 'UNDEFINED', '}', '::']);\n\n  // Tokens which can be the left-hand side of a less-than comparison, i.e. `a<b`.\n  COMPARABLE_LEFT_SIDE = ['IDENTIFIER', ')', ']', 'NUMBER'];\n\n  // Tokens which a regular expression will never immediately follow (except spaced\n  // CALLABLEs in some cases), but which a division operator can.\n\n  // See: http://www-archive.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions\n  NOT_REGEX = INDEXABLE.concat(['++', '--']);\n\n  // Tokens that, when immediately preceding a `WHEN`, indicate that the `WHEN`\n  // occurs at the start of a line. We disambiguate these from trailing whens to\n  // avoid an ambiguity in the grammar.\n  LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR'];\n\n  // Additional indent in front of these is ignored.\n  INDENTABLE_CLOSERS = [')', '}', ']'];\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/nodes.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  // `nodes.coffee` contains all of the node classes for the syntax tree. Most\n  // nodes are created as the result of actions in the [grammar](grammar.html),\n  // but some are created by other nodes as a method of code generation. To convert\n  // the syntax tree into a string of JavaScript code, call `compile()` on the root.\n  var Access, Arr, Assign, AwaitReturn, Base, Block, BooleanLiteral, Call, Catch, Class, ClassProperty, ClassPrototypeProperty, Code, CodeFragment, ComputedPropertyName, DefaultLiteral, Directive, DynamicImport, DynamicImportCall, Elision, EmptyInterpolation, ExecutableClassBody, Existence, Expansion, ExportAllDeclaration, ExportDeclaration, ExportDefaultDeclaration, ExportNamedDeclaration, ExportSpecifier, ExportSpecifierList, Extends, For, FuncDirectiveReturn, FuncGlyph, HEREGEX_OMIT, HereComment, HoistTarget, IdentifierLiteral, If, ImportClause, ImportDeclaration, ImportDefaultSpecifier, ImportNamespaceSpecifier, ImportSpecifier, ImportSpecifierList, In, Index, InfinityLiteral, Interpolation, JSXAttribute, JSXAttributes, JSXElement, JSXEmptyExpression, JSXExpressionContainer, JSXIdentifier, JSXNamespacedName, JSXTag, JSXText, JS_FORBIDDEN, LEADING_BLANK_LINE, LEVEL_ACCESS, LEVEL_COND, LEVEL_LIST, LEVEL_OP, LEVEL_PAREN, LEVEL_TOP, LineComment, Literal, MetaProperty, ModuleDeclaration, ModuleSpecifier, ModuleSpecifierList, NEGATE, NO, NaNLiteral, NullLiteral, NumberLiteral, Obj, ObjectProperty, Op, Param, Parens, PassthroughLiteral, PropertyName, Range, RegexLiteral, RegexWithInterpolations, Return, Root, SIMPLENUM, SIMPLE_STRING_OMIT, STRING_OMIT, Scope, Sequence, Slice, Splat, StatementLiteral, StringLiteral, StringWithInterpolations, Super, SuperCall, Switch, SwitchCase, SwitchWhen, TAB, THIS, TRAILING_BLANK_LINE, TaggedTemplateCall, TemplateElement, ThisLiteral, Throw, Try, UTILITIES, UndefinedLiteral, Value, While, YES, YieldReturn, addDataToNode, astAsBlockIfNeeded, attachCommentsToNode, compact, del, emptyExpressionLocationData, ends, extend, extractSameLineLocationDataFirst, extractSameLineLocationDataLast, flatten, fragmentsToText, greater, hasLineComments, indentInitial, isAstLocGreater, isFunction, isLiteralArguments, isLiteralThis, isLocationDataEndGreater, isLocationDataStartGreater, isNumber, isPlainObject, isUnassignable, jisonLocationDataToAstLocationData, lesser, locationDataToString, makeDelimitedLiteral, merge, mergeAstLocationData, mergeLocationData, moveComments, multident, parseNumber, replaceUnicodeCodePointEscapes, shouldCacheOrIsAssignable, sniffDirectives, some, starts, throwSyntaxError, unfoldSoak, unshiftAfterComments, utility, zeroWidthLocationDataFromEndLocation,\n    indexOf = [].indexOf,\n    splice = [].splice,\n    slice1 = [].slice;\n\n  Error.stackTraceLimit = 2e308;\n\n  ({Scope} = require('./scope'));\n\n  ({isUnassignable, JS_FORBIDDEN} = require('./lexer'));\n\n  // Import the helpers we plan to use.\n  ({compact, flatten, extend, merge, del, starts, ends, some, addDataToNode, attachCommentsToNode, locationDataToString, throwSyntaxError, replaceUnicodeCodePointEscapes, isFunction, isPlainObject, isNumber, parseNumber} = require('./helpers'));\n\n  // Functions required by parser.\n  exports.extend = extend;\n\n  exports.addDataToNode = addDataToNode;\n\n  // Constant functions for nodes that don’t need customization.\n  YES = function() {\n    return true;\n  };\n\n  NO = function() {\n    return false;\n  };\n\n  THIS = function() {\n    return this;\n  };\n\n  NEGATE = function() {\n    this.negated = !this.negated;\n    return this;\n  };\n\n  //### CodeFragment\n\n  // The various nodes defined below all compile to a collection of **CodeFragment** objects.\n  // A CodeFragments is a block of generated code, and the location in the source file where the code\n  // came from. CodeFragments can be assembled together into working code just by catting together\n  // all the CodeFragments' `code` snippets, in order.\n  exports.CodeFragment = CodeFragment = class CodeFragment {\n    constructor(parent, code) {\n      var ref1;\n      this.code = `${code}`;\n      this.type = (parent != null ? (ref1 = parent.constructor) != null ? ref1.name : void 0 : void 0) || 'unknown';\n      this.locationData = parent != null ? parent.locationData : void 0;\n      this.comments = parent != null ? parent.comments : void 0;\n    }\n\n    toString() {\n      // This is only intended for debugging.\n      return `${this.code}${this.locationData ? \": \" + locationDataToString(this.locationData) : ''}`;\n    }\n\n  };\n\n  // Convert an array of CodeFragments into a string.\n  fragmentsToText = function(fragments) {\n    var fragment;\n    return ((function() {\n      var j, len1, results1;\n      results1 = [];\n      for (j = 0, len1 = fragments.length; j < len1; j++) {\n        fragment = fragments[j];\n        results1.push(fragment.code);\n      }\n      return results1;\n    })()).join('');\n  };\n\n  //### Base\n\n  // The **Base** is the abstract base class for all nodes in the syntax tree.\n  // Each subclass implements the `compileNode` method, which performs the\n  // code generation for that node. To compile a node to JavaScript,\n  // call `compile` on it, which wraps `compileNode` in some generic extra smarts,\n  // to know when the generated code needs to be wrapped up in a closure.\n  // An options hash is passed and cloned throughout, containing information about\n  // the environment from higher in the tree (such as if a returned value is\n  // being requested by the surrounding function), information about the current\n  // scope, and indentation level.\n  exports.Base = Base = (function() {\n    class Base {\n      compile(o, lvl) {\n        return fragmentsToText(this.compileToFragments(o, lvl));\n      }\n\n      // Occasionally a node is compiled multiple times, for example to get the name\n      // of a variable to add to scope tracking. When we know that a “premature”\n      // compilation won’t result in comments being output, set those comments aside\n      // so that they’re preserved for a later `compile` call that will result in\n      // the comments being included in the output.\n      compileWithoutComments(o, lvl, method = 'compile') {\n        var fragments, unwrapped;\n        if (this.comments) {\n          this.ignoreTheseCommentsTemporarily = this.comments;\n          delete this.comments;\n        }\n        unwrapped = this.unwrapAll();\n        if (unwrapped.comments) {\n          unwrapped.ignoreTheseCommentsTemporarily = unwrapped.comments;\n          delete unwrapped.comments;\n        }\n        fragments = this[method](o, lvl);\n        if (this.ignoreTheseCommentsTemporarily) {\n          this.comments = this.ignoreTheseCommentsTemporarily;\n          delete this.ignoreTheseCommentsTemporarily;\n        }\n        if (unwrapped.ignoreTheseCommentsTemporarily) {\n          unwrapped.comments = unwrapped.ignoreTheseCommentsTemporarily;\n          delete unwrapped.ignoreTheseCommentsTemporarily;\n        }\n        return fragments;\n      }\n\n      compileNodeWithoutComments(o, lvl) {\n        return this.compileWithoutComments(o, lvl, 'compileNode');\n      }\n\n      // Common logic for determining whether to wrap this node in a closure before\n      // compiling it, or to compile directly. We need to wrap if this node is a\n      // *statement*, and it's not a *pureStatement*, and we're not at\n      // the top level of a block (which would be unnecessary), and we haven't\n      // already been asked to return the result (because statements know how to\n      // return results).\n      compileToFragments(o, lvl) {\n        var fragments, node;\n        o = extend({}, o);\n        if (lvl) {\n          o.level = lvl;\n        }\n        node = this.unfoldSoak(o) || this;\n        node.tab = o.indent;\n        fragments = o.level === LEVEL_TOP || !node.isStatement(o) ? node.compileNode(o) : node.compileClosure(o);\n        this.compileCommentFragments(o, node, fragments);\n        return fragments;\n      }\n\n      compileToFragmentsWithoutComments(o, lvl) {\n        return this.compileWithoutComments(o, lvl, 'compileToFragments');\n      }\n\n      // Statements converted into expressions via closure-wrapping share a scope\n      // object with their parent closure, to preserve the expected lexical scope.\n      compileClosure(o) {\n        var args, argumentsNode, func, meth, parts, ref1, ref2;\n        this.checkForPureStatementInExpression();\n        o.sharedScope = true;\n        func = new Code([], Block.wrap([this]));\n        args = [];\n        if (this.contains((function(node) {\n          return node instanceof SuperCall;\n        }))) {\n          func.bound = true;\n        } else if ((argumentsNode = this.contains(isLiteralArguments)) || this.contains(isLiteralThis)) {\n          args = [new ThisLiteral()];\n          if (argumentsNode) {\n            meth = 'apply';\n            args.push(new IdentifierLiteral('arguments'));\n          } else {\n            meth = 'call';\n          }\n          func = new Value(func, [new Access(new PropertyName(meth))]);\n        }\n        parts = (new Call(func, args)).compileNode(o);\n        switch (false) {\n          case !(func.isGenerator || ((ref1 = func.base) != null ? ref1.isGenerator : void 0)):\n            parts.unshift(this.makeCode(\"(yield* \"));\n            parts.push(this.makeCode(\")\"));\n            break;\n          case !(func.isAsync || ((ref2 = func.base) != null ? ref2.isAsync : void 0)):\n            parts.unshift(this.makeCode(\"(await \"));\n            parts.push(this.makeCode(\")\"));\n        }\n        return parts;\n      }\n\n      compileCommentFragments(o, node, fragments) {\n        var base1, base2, comment, commentFragment, j, len1, ref1, unshiftCommentFragment;\n        if (!node.comments) {\n          return fragments;\n        }\n        // This is where comments, that are attached to nodes as a `comments`\n        // property, become `CodeFragment`s. “Inline block comments,” e.g.\n        // `/* */`-delimited comments that are interspersed within code on a line,\n        // are added to the current `fragments` stream. All other fragments are\n        // attached as properties to the nearest preceding or following fragment,\n        // to remain stowaways until they get properly output in `compileComments`\n        // later on.\n        unshiftCommentFragment = function(commentFragment) {\n          var precedingFragment;\n          if (commentFragment.unshift) {\n            // Find the first non-comment fragment and insert `commentFragment`\n            // before it.\n            return unshiftAfterComments(fragments, commentFragment);\n          } else {\n            if (fragments.length !== 0) {\n              precedingFragment = fragments[fragments.length - 1];\n              if (commentFragment.newLine && precedingFragment.code !== '' && !/\\n\\s*$/.test(precedingFragment.code)) {\n                commentFragment.code = `\\n${commentFragment.code}`;\n              }\n            }\n            return fragments.push(commentFragment);\n          }\n        };\n        ref1 = node.comments;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          comment = ref1[j];\n          if (!(indexOf.call(this.compiledComments, comment) < 0)) {\n            continue;\n          }\n          this.compiledComments.push(comment); // Don’t output this comment twice.\n          // For block/here comments, denoted by `###`, that are inline comments\n          // like `1 + ### comment ### 2`, create fragments and insert them into\n          // the fragments array.\n          // Otherwise attach comment fragments to their closest fragment for now,\n          // so they can be inserted into the output later after all the newlines\n          // have been added.\n          if (comment.here) { // Block comment, delimited by `###`.\n            commentFragment = new HereComment(comment).compileNode(o); // Line comment, delimited by `#`.\n          } else {\n            commentFragment = new LineComment(comment).compileNode(o);\n          }\n          if ((commentFragment.isHereComment && !commentFragment.newLine) || node.includeCommentFragments()) {\n            // Inline block comments, like `1 + /* comment */ 2`, or a node whose\n            // `compileToFragments` method has logic for outputting comments.\n            unshiftCommentFragment(commentFragment);\n          } else {\n            if (fragments.length === 0) {\n              fragments.push(this.makeCode(''));\n            }\n            if (commentFragment.unshift) {\n              if ((base1 = fragments[0]).precedingComments == null) {\n                base1.precedingComments = [];\n              }\n              fragments[0].precedingComments.push(commentFragment);\n            } else {\n              if ((base2 = fragments[fragments.length - 1]).followingComments == null) {\n                base2.followingComments = [];\n              }\n              fragments[fragments.length - 1].followingComments.push(commentFragment);\n            }\n          }\n        }\n        return fragments;\n      }\n\n      // If the code generation wishes to use the result of a complex expression\n      // in multiple places, ensure that the expression is only ever evaluated once,\n      // by assigning it to a temporary variable. Pass a level to precompile.\n\n      // If `level` is passed, then returns `[val, ref]`, where `val` is the compiled value, and `ref`\n      // is the compiled reference. If `level` is not passed, this returns `[val, ref]` where\n      // the two values are raw nodes which have not been compiled.\n      cache(o, level, shouldCache) {\n        var complex, ref, sub;\n        complex = shouldCache != null ? shouldCache(this) : this.shouldCache();\n        if (complex) {\n          ref = new IdentifierLiteral(o.scope.freeVariable('ref'));\n          sub = new Assign(ref, this);\n          if (level) {\n            return [sub.compileToFragments(o, level), [this.makeCode(ref.value)]];\n          } else {\n            return [sub, ref];\n          }\n        } else {\n          ref = level ? this.compileToFragments(o, level) : this;\n          return [ref, ref];\n        }\n      }\n\n      // Occasionally it may be useful to make an expression behave as if it was 'hoisted', whereby the\n      // result of the expression is available before its location in the source, but the expression's\n      // variable scope corresponds to the source position. This is used extensively to deal with executable\n      // class bodies in classes.\n\n      // Calling this method mutates the node, proxying the `compileNode` and `compileToFragments`\n      // methods to store their result for later replacing the `target` node, which is returned by the\n      // call.\n      hoist() {\n        var compileNode, compileToFragments, target;\n        this.hoisted = true;\n        target = new HoistTarget(this);\n        compileNode = this.compileNode;\n        compileToFragments = this.compileToFragments;\n        this.compileNode = function(o) {\n          return target.update(compileNode, o);\n        };\n        this.compileToFragments = function(o) {\n          return target.update(compileToFragments, o);\n        };\n        return target;\n      }\n\n      cacheToCodeFragments(cacheValues) {\n        return [fragmentsToText(cacheValues[0]), fragmentsToText(cacheValues[1])];\n      }\n\n      // Construct a node that returns the current node’s result.\n      // Note that this is overridden for smarter behavior for\n      // many statement nodes (e.g. `If`, `For`).\n      makeReturn(results, mark) {\n        var node;\n        if (mark) {\n          // Mark this node as implicitly returned, so that it can be part of the\n          // node metadata returned in the AST.\n          this.canBeReturned = true;\n          return;\n        }\n        node = this.unwrapAll();\n        if (results) {\n          return new Call(new Literal(`${results}.push`), [node]);\n        } else {\n          return new Return(node);\n        }\n      }\n\n      // Does this node, or any of its children, contain a node of a certain kind?\n      // Recursively traverses down the *children* nodes and returns the first one\n      // that verifies `pred`. Otherwise return undefined. `contains` does not cross\n      // scope boundaries.\n      contains(pred) {\n        var node;\n        node = void 0;\n        this.traverseChildren(false, function(n) {\n          if (pred(n)) {\n            node = n;\n            return false;\n          }\n        });\n        return node;\n      }\n\n      // Pull out the last node of a node list.\n      lastNode(list) {\n        if (list.length === 0) {\n          return null;\n        } else {\n          return list[list.length - 1];\n        }\n      }\n\n      // Debugging representation of the node, for inspecting the parse tree.\n      // This is what `coffee --nodes` prints out.\n      toString(idt = '', name = this.constructor.name) {\n        var tree;\n        tree = '\\n' + idt + name;\n        if (this.soak) {\n          tree += '?';\n        }\n        this.eachChild(function(node) {\n          return tree += node.toString(idt + TAB);\n        });\n        return tree;\n      }\n\n      checkForPureStatementInExpression() {\n        var jumpNode;\n        if (jumpNode = this.jumps()) {\n          return jumpNode.error('cannot use a pure statement in an expression');\n        }\n      }\n\n      // Plain JavaScript object representation of the node, that can be serialized\n      // as JSON. This is what the `ast` option in the Node API returns.\n      // We try to follow the [Babel AST spec](https://github.com/babel/babel/blob/master/packages/babel-parser/ast/spec.md)\n      // as closely as possible, for improved interoperability with other tools.\n      // **WARNING: DO NOT OVERRIDE THIS METHOD IN CHILD CLASSES.**\n      // Only override the component `ast*` methods as needed.\n      ast(o, level) {\n        var astNode;\n        // Merge `level` into `o` and perform other universal checks.\n        o = this.astInitialize(o, level);\n        // Create serializable representation of this node.\n        astNode = this.astNode(o);\n        // Mark AST nodes that correspond to expressions that (implicitly) return.\n        // We can’t do this as part of `astNode` because we need to assemble child\n        // nodes first before marking the parent being returned.\n        if ((this.astNode != null) && this.canBeReturned) {\n          Object.assign(astNode, {\n            returns: true\n          });\n        }\n        return astNode;\n      }\n\n      astInitialize(o, level) {\n        o = Object.assign({}, o);\n        if (level != null) {\n          o.level = level;\n        }\n        if (o.level > LEVEL_TOP) {\n          this.checkForPureStatementInExpression();\n        }\n        if (this.isStatement(o) && o.level !== LEVEL_TOP && (o.scope != null)) {\n          // `@makeReturn` must be called before `astProperties`, because the latter may call\n          // `.ast()` for child nodes and those nodes would need the return logic from `makeReturn`\n          // already executed by then.\n          this.makeReturn(null, true);\n        }\n        return o;\n      }\n\n      astNode(o) {\n        // Every abstract syntax tree node object has four categories of properties:\n        // - type, stored in the `type` field and a string like `NumberLiteral`.\n        // - location data, stored in the `loc`, `start`, `end` and `range` fields.\n        // - properties specific to this node, like `parsedValue`.\n        // - properties that are themselves child nodes, like `body`.\n        // These fields are all intermixed in the Babel spec; `type` and `start` and\n        // `parsedValue` are all top level fields in the AST node object. We have\n        // separate methods for returning each category, that we merge together here.\n        return Object.assign({}, {\n          type: this.astType(o)\n        }, this.astProperties(o), this.astLocationData());\n      }\n\n      // By default, a node class has no specific properties.\n      astProperties() {\n        return {};\n      }\n\n      // By default, a node class’s AST `type` is its class name.\n      astType() {\n        return this.constructor.name;\n      }\n\n      // The AST location data is a rearranged version of our Jison location data,\n      // mutated into the structure that the Babel spec uses.\n      astLocationData() {\n        return jisonLocationDataToAstLocationData(this.locationData);\n      }\n\n      // Determines whether an AST node needs an `ExpressionStatement` wrapper.\n      // Typically matches our `isStatement()` logic but this allows overriding.\n      isStatementAst(o) {\n        return this.isStatement(o);\n      }\n\n      // Passes each child to a function, breaking when the function returns `false`.\n      eachChild(func) {\n        var attr, child, j, k, len1, len2, ref1, ref2;\n        if (!this.children) {\n          return this;\n        }\n        ref1 = this.children;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          attr = ref1[j];\n          if (this[attr]) {\n            ref2 = flatten([this[attr]]);\n            for (k = 0, len2 = ref2.length; k < len2; k++) {\n              child = ref2[k];\n              if (func(child) === false) {\n                return this;\n              }\n            }\n          }\n        }\n        return this;\n      }\n\n      traverseChildren(crossScope, func) {\n        return this.eachChild(function(child) {\n          var recur;\n          recur = func(child);\n          if (recur !== false) {\n            return child.traverseChildren(crossScope, func);\n          }\n        });\n      }\n\n      // `replaceInContext` will traverse children looking for a node for which `match` returns\n      // true. Once found, the matching node will be replaced by the result of calling `replacement`.\n      replaceInContext(match, replacement) {\n        var attr, child, children, i, j, k, len1, len2, ref1, ref2;\n        if (!this.children) {\n          return false;\n        }\n        ref1 = this.children;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          attr = ref1[j];\n          if (children = this[attr]) {\n            if (Array.isArray(children)) {\n              for (i = k = 0, len2 = children.length; k < len2; i = ++k) {\n                child = children[i];\n                if (match(child)) {\n                  splice.apply(children, [i, i - i + 1].concat(ref2 = replacement(child, this))), ref2;\n                  return true;\n                } else {\n                  if (child.replaceInContext(match, replacement)) {\n                    return true;\n                  }\n                }\n              }\n            } else if (match(children)) {\n              this[attr] = replacement(children, this);\n              return true;\n            } else {\n              if (children.replaceInContext(match, replacement)) {\n                return true;\n              }\n            }\n          }\n        }\n      }\n\n      invert() {\n        return new Op('!', this);\n      }\n\n      unwrapAll() {\n        var node;\n        node = this;\n        while (node !== (node = node.unwrap())) {\n          continue;\n        }\n        return node;\n      }\n\n      // For this node and all descendents, set the location data to `locationData`\n      // if the location data is not already set.\n      updateLocationDataIfMissing(locationData, force) {\n        if (force) {\n          this.forceUpdateLocation = true;\n        }\n        if (this.locationData && !this.forceUpdateLocation) {\n          return this;\n        }\n        delete this.forceUpdateLocation;\n        this.locationData = locationData;\n        return this.eachChild(function(child) {\n          return child.updateLocationDataIfMissing(locationData);\n        });\n      }\n\n      // Add location data from another node\n      withLocationDataFrom({locationData}) {\n        return this.updateLocationDataIfMissing(locationData);\n      }\n\n      // Add location data and comments from another node\n      withLocationDataAndCommentsFrom(node) {\n        var comments;\n        this.withLocationDataFrom(node);\n        ({comments} = node);\n        if (comments != null ? comments.length : void 0) {\n          this.comments = comments;\n        }\n        return this;\n      }\n\n      // Throw a SyntaxError associated with this node’s location.\n      error(message) {\n        return throwSyntaxError(message, this.locationData);\n      }\n\n      makeCode(code) {\n        return new CodeFragment(this, code);\n      }\n\n      wrapInParentheses(fragments) {\n        return [this.makeCode('('), ...fragments, this.makeCode(')')];\n      }\n\n      wrapInBraces(fragments) {\n        return [this.makeCode('{'), ...fragments, this.makeCode('}')];\n      }\n\n      // `fragmentsList` is an array of arrays of fragments. Each array in fragmentsList will be\n      // concatenated together, with `joinStr` added in between each, to produce a final flat array\n      // of fragments.\n      joinFragmentArrays(fragmentsList, joinStr) {\n        var answer, fragments, i, j, len1;\n        answer = [];\n        for (i = j = 0, len1 = fragmentsList.length; j < len1; i = ++j) {\n          fragments = fragmentsList[i];\n          if (i) {\n            answer.push(this.makeCode(joinStr));\n          }\n          answer = answer.concat(fragments);\n        }\n        return answer;\n      }\n\n    };\n\n    // Default implementations of the common node properties and methods. Nodes\n    // will override these with custom logic, if needed.\n\n    // `children` are the properties to recurse into when tree walking. The\n    // `children` list *is* the structure of the AST. The `parent` pointer, and\n    // the pointer to the `children` are how you can traverse the tree.\n    Base.prototype.children = [];\n\n    // `isStatement` has to do with “everything is an expression”. A few things\n    // can’t be expressions, such as `break`. Things that `isStatement` returns\n    // `true` for are things that can’t be used as expressions. There are some\n    // error messages that come from `nodes.coffee` due to statements ending up\n    // in expression position.\n    Base.prototype.isStatement = NO;\n\n    // Track comments that have been compiled into fragments, to avoid outputting\n    // them twice.\n    Base.prototype.compiledComments = [];\n\n    // `includeCommentFragments` lets `compileCommentFragments` know whether this node\n    // has special awareness of how to handle comments within its output.\n    Base.prototype.includeCommentFragments = NO;\n\n    // `jumps` tells you if an expression, or an internal part of an expression,\n    // has a flow control construct (like `break`, `continue`, or `return`)\n    // that jumps out of the normal flow of control and can’t be used as a value.\n    // (Note that `throw` is not considered a flow control construct.)\n    // This is important because flow control in the middle of an expression\n    // makes no sense; we have to disallow it.\n    Base.prototype.jumps = NO;\n\n    // If `node.shouldCache() is false`, it is safe to use `node` more than once.\n    // Otherwise you need to store the value of `node` in a variable and output\n    // that variable several times instead. Kind of like this: `5` need not be\n    // cached. `returnFive()`, however, could have side effects as a result of\n    // evaluating it more than once, and therefore we need to cache it. The\n    // parameter is named `shouldCache` rather than `mustCache` because there are\n    // also cases where we might not need to cache but where we want to, for\n    // example a long expression that may well be idempotent but we want to cache\n    // for brevity.\n    Base.prototype.shouldCache = YES;\n\n    Base.prototype.isChainable = NO;\n\n    Base.prototype.isAssignable = NO;\n\n    Base.prototype.isNumber = NO;\n\n    Base.prototype.unwrap = THIS;\n\n    Base.prototype.unfoldSoak = NO;\n\n    // Is this node used to assign a certain variable?\n    Base.prototype.assigns = NO;\n\n    return Base;\n\n  }).call(this);\n\n  //### HoistTarget\n\n  // A **HoistTargetNode** represents the output location in the node tree for a hoisted node.\n  // See Base#hoist.\n  exports.HoistTarget = HoistTarget = class HoistTarget extends Base {\n    // Expands hoisted fragments in the given array\n    static expand(fragments) {\n      var fragment, i, j, ref1;\n      for (i = j = fragments.length - 1; j >= 0; i = j += -1) {\n        fragment = fragments[i];\n        if (fragment.fragments) {\n          splice.apply(fragments, [i, i - i + 1].concat(ref1 = this.expand(fragment.fragments))), ref1;\n        }\n      }\n      return fragments;\n    }\n\n    constructor(source1) {\n      super();\n      this.source = source1;\n      // Holds presentational options to apply when the source node is compiled.\n      this.options = {};\n      // Placeholder fragments to be replaced by the source node’s compilation.\n      this.targetFragments = {\n        fragments: []\n      };\n    }\n\n    isStatement(o) {\n      return this.source.isStatement(o);\n    }\n\n    // Update the target fragments with the result of compiling the source.\n    // Calls the given compile function with the node and options (overriden with the target\n    // presentational options).\n    update(compile, o) {\n      return this.targetFragments.fragments = compile.call(this.source, merge(o, this.options));\n    }\n\n    // Copies the target indent and level, and returns the placeholder fragments\n    compileToFragments(o, level) {\n      this.options.indent = o.indent;\n      this.options.level = level != null ? level : o.level;\n      return [this.targetFragments];\n    }\n\n    compileNode(o) {\n      return this.compileToFragments(o);\n    }\n\n    compileClosure(o) {\n      return this.compileToFragments(o);\n    }\n\n  };\n\n  //### Root\n\n  // The root node of the node tree\n  exports.Root = Root = (function() {\n    class Root extends Base {\n      constructor(body1) {\n        super();\n        this.body = body1;\n        this.isAsync = (new Code([], this.body)).isAsync;\n      }\n\n      // Wrap everything in a safety closure, unless requested not to. It would be\n      // better not to generate them in the first place, but for now, clean up\n      // obvious double-parentheses.\n      compileNode(o) {\n        var fragments, functionKeyword;\n        o.indent = o.bare ? '' : TAB;\n        o.level = LEVEL_TOP;\n        o.compiling = true;\n        this.initializeScope(o);\n        fragments = this.body.compileRoot(o);\n        if (o.bare) {\n          return fragments;\n        }\n        functionKeyword = `${this.isAsync ? 'async ' : ''}function`;\n        return [].concat(this.makeCode(`(${functionKeyword}() {\\n`), fragments, this.makeCode(\"\\n}).call(this);\\n\"));\n      }\n\n      initializeScope(o) {\n        var j, len1, name, ref1, ref2, results1;\n        o.scope = new Scope(null, this.body, null, (ref1 = o.referencedVars) != null ? ref1 : []);\n        ref2 = o.locals || [];\n        results1 = [];\n        for (j = 0, len1 = ref2.length; j < len1; j++) {\n          name = ref2[j];\n          // Mark given local variables in the root scope as parameters so they don’t\n          // end up being declared on the root block.\n          results1.push(o.scope.parameter(name));\n        }\n        return results1;\n      }\n\n      commentsAst() {\n        var comment, commentToken, j, len1, ref1, results1;\n        if (this.allComments == null) {\n          this.allComments = (function() {\n            var j, len1, ref1, ref2, results1;\n            ref2 = (ref1 = this.allCommentTokens) != null ? ref1 : [];\n            results1 = [];\n            for (j = 0, len1 = ref2.length; j < len1; j++) {\n              commentToken = ref2[j];\n              if (!commentToken.heregex) {\n                if (commentToken.here) {\n                  results1.push(new HereComment(commentToken));\n                } else {\n                  results1.push(new LineComment(commentToken));\n                }\n              }\n            }\n            return results1;\n          }).call(this);\n        }\n        ref1 = this.allComments;\n        results1 = [];\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          comment = ref1[j];\n          results1.push(comment.ast());\n        }\n        return results1;\n      }\n\n      astNode(o) {\n        o.level = LEVEL_TOP;\n        this.initializeScope(o);\n        return super.astNode(o);\n      }\n\n      astType() {\n        return 'File';\n      }\n\n      astProperties(o) {\n        this.body.isRootBlock = true;\n        return {\n          program: Object.assign(this.body.ast(o), this.astLocationData()),\n          comments: this.commentsAst()\n        };\n      }\n\n    };\n\n    Root.prototype.children = ['body'];\n\n    return Root;\n\n  }).call(this);\n\n  //### Block\n\n  // The block is the list of expressions that forms the body of an\n  // indented block of code -- the implementation of a function, a clause in an\n  // `if`, `switch`, or `try`, and so on...\n  exports.Block = Block = (function() {\n    class Block extends Base {\n      constructor(nodes) {\n        super();\n        this.expressions = compact(flatten(nodes || []));\n      }\n\n      // Tack an expression on to the end of this expression list.\n      push(node) {\n        this.expressions.push(node);\n        return this;\n      }\n\n      // Remove and return the last expression of this expression list.\n      pop() {\n        return this.expressions.pop();\n      }\n\n      // Add an expression at the beginning of this expression list.\n      unshift(node) {\n        this.expressions.unshift(node);\n        return this;\n      }\n\n      // If this Block consists of just a single node, unwrap it by pulling\n      // it back out.\n      unwrap() {\n        if (this.expressions.length === 1) {\n          return this.expressions[0];\n        } else {\n          return this;\n        }\n      }\n\n      // Is this an empty block of code?\n      isEmpty() {\n        return !this.expressions.length;\n      }\n\n      isStatement(o) {\n        var exp, j, len1, ref1;\n        ref1 = this.expressions;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          exp = ref1[j];\n          if (exp.isStatement(o)) {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      jumps(o) {\n        var exp, j, jumpNode, len1, ref1;\n        ref1 = this.expressions;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          exp = ref1[j];\n          if (jumpNode = exp.jumps(o)) {\n            return jumpNode;\n          }\n        }\n      }\n\n      // A Block node does not return its entire body, rather it\n      // ensures that the final expression is returned.\n      makeReturn(results, mark) {\n        var expr, expressions, last, lastExp, len, penult, ref1, ref2;\n        len = this.expressions.length;\n        ref1 = this.expressions, [lastExp] = slice1.call(ref1, -1);\n        lastExp = (lastExp != null ? lastExp.unwrap() : void 0) || false;\n        // We also need to check that we’re not returning a JSX tag if there’s an\n        // adjacent one at the same level; JSX doesn’t allow that.\n        if (lastExp && lastExp instanceof Parens && lastExp.body.expressions.length > 1) {\n          ({\n            body: {expressions}\n          } = lastExp);\n          [penult, last] = slice1.call(expressions, -2);\n          penult = penult.unwrap();\n          last = last.unwrap();\n          if (penult instanceof JSXElement && last instanceof JSXElement) {\n            expressions[expressions.length - 1].error('Adjacent JSX elements must be wrapped in an enclosing tag');\n          }\n        }\n        if (mark) {\n          if ((ref2 = this.expressions[len - 1]) != null) {\n            ref2.makeReturn(results, mark);\n          }\n          return;\n        }\n        while (len--) {\n          expr = this.expressions[len];\n          this.expressions[len] = expr.makeReturn(results);\n          if (expr instanceof Return && !expr.expression) {\n            this.expressions.splice(len, 1);\n          }\n          break;\n        }\n        return this;\n      }\n\n      compile(o, lvl) {\n        if (!o.scope) {\n          return new Root(this).withLocationDataFrom(this).compile(o, lvl);\n        }\n        return super.compile(o, lvl);\n      }\n\n      // Compile all expressions within the **Block** body. If we need to return\n      // the result, and it’s an expression, simply return it. If it’s a statement,\n      // ask the statement to do so.\n      compileNode(o) {\n        var answer, compiledNodes, fragments, index, j, lastFragment, len1, node, ref1, top;\n        this.tab = o.indent;\n        top = o.level === LEVEL_TOP;\n        compiledNodes = [];\n        ref1 = this.expressions;\n        for (index = j = 0, len1 = ref1.length; j < len1; index = ++j) {\n          node = ref1[index];\n          if (node.hoisted) {\n            // This is a hoisted expression.\n            // We want to compile this and ignore the result.\n            node.compileToFragments(o);\n            continue;\n          }\n          node = node.unfoldSoak(o) || node;\n          if (node instanceof Block) {\n            // This is a nested block. We don’t do anything special here like\n            // enclose it in a new scope; we just compile the statements in this\n            // block along with our own.\n            compiledNodes.push(node.compileNode(o));\n          } else if (top) {\n            node.front = true;\n            fragments = node.compileToFragments(o);\n            if (!node.isStatement(o)) {\n              fragments = indentInitial(fragments, this);\n              [lastFragment] = slice1.call(fragments, -1);\n              if (!(lastFragment.code === '' || lastFragment.isComment)) {\n                fragments.push(this.makeCode(';'));\n              }\n            }\n            compiledNodes.push(fragments);\n          } else {\n            compiledNodes.push(node.compileToFragments(o, LEVEL_LIST));\n          }\n        }\n        if (top) {\n          if (this.spaced) {\n            return [].concat(this.joinFragmentArrays(compiledNodes, '\\n\\n'), this.makeCode('\\n'));\n          } else {\n            return this.joinFragmentArrays(compiledNodes, '\\n');\n          }\n        }\n        if (compiledNodes.length) {\n          answer = this.joinFragmentArrays(compiledNodes, ', ');\n        } else {\n          answer = [this.makeCode('void 0')];\n        }\n        if (compiledNodes.length > 1 && o.level >= LEVEL_LIST) {\n          return this.wrapInParentheses(answer);\n        } else {\n          return answer;\n        }\n      }\n\n      compileRoot(o) {\n        var fragments;\n        this.spaced = true;\n        fragments = this.compileWithDeclarations(o);\n        HoistTarget.expand(fragments);\n        return this.compileComments(fragments);\n      }\n\n      // Compile the expressions body for the contents of a function, with\n      // declarations of all inner variables pushed up to the top.\n      compileWithDeclarations(o) {\n        var assigns, declaredVariable, declaredVariables, declaredVariablesIndex, declars, exp, fragments, i, j, k, len1, len2, post, ref1, rest, scope, spaced;\n        fragments = [];\n        post = [];\n        ref1 = this.expressions;\n        for (i = j = 0, len1 = ref1.length; j < len1; i = ++j) {\n          exp = ref1[i];\n          exp = exp.unwrap();\n          if (!(exp instanceof Literal)) {\n            break;\n          }\n        }\n        o = merge(o, {\n          level: LEVEL_TOP\n        });\n        if (i) {\n          rest = this.expressions.splice(i, 9e9);\n          [spaced, this.spaced] = [this.spaced, false];\n          [fragments, this.spaced] = [this.compileNode(o), spaced];\n          this.expressions = rest;\n        }\n        post = this.compileNode(o);\n        ({scope} = o);\n        if (scope.expressions === this) {\n          declars = o.scope.hasDeclarations();\n          assigns = scope.hasAssignments;\n          if (declars || assigns) {\n            if (i) {\n              fragments.push(this.makeCode('\\n'));\n            }\n            fragments.push(this.makeCode(`${this.tab}var `));\n            if (declars) {\n              declaredVariables = scope.declaredVariables();\n              for (declaredVariablesIndex = k = 0, len2 = declaredVariables.length; k < len2; declaredVariablesIndex = ++k) {\n                declaredVariable = declaredVariables[declaredVariablesIndex];\n                fragments.push(this.makeCode(declaredVariable));\n                if (Object.prototype.hasOwnProperty.call(o.scope.comments, declaredVariable)) {\n                  fragments.push(...o.scope.comments[declaredVariable]);\n                }\n                if (declaredVariablesIndex !== declaredVariables.length - 1) {\n                  fragments.push(this.makeCode(', '));\n                }\n              }\n            }\n            if (assigns) {\n              if (declars) {\n                fragments.push(this.makeCode(`,\\n${this.tab + TAB}`));\n              }\n              fragments.push(this.makeCode(scope.assignedVariables().join(`,\\n${this.tab + TAB}`)));\n            }\n            fragments.push(this.makeCode(`;\\n${this.spaced ? '\\n' : ''}`));\n          } else if (fragments.length && post.length) {\n            fragments.push(this.makeCode(\"\\n\"));\n          }\n        }\n        return fragments.concat(post);\n      }\n\n      compileComments(fragments) {\n        var code, commentFragment, fragment, fragmentIndent, fragmentIndex, indent, j, k, l, len1, len2, len3, newLineIndex, onNextLine, p, pastFragment, pastFragmentIndex, q, ref1, ref2, ref3, ref4, trail, upcomingFragment, upcomingFragmentIndex;\n        for (fragmentIndex = j = 0, len1 = fragments.length; j < len1; fragmentIndex = ++j) {\n          fragment = fragments[fragmentIndex];\n          // Insert comments into the output at the next or previous newline.\n          // If there are no newlines at which to place comments, create them.\n          if (fragment.precedingComments) {\n            // Determine the indentation level of the fragment that we are about\n            // to insert comments before, and use that indentation level for our\n            // inserted comments. At this point, the fragments’ `code` property\n            // is the generated output JavaScript, and CoffeeScript always\n            // generates output indented by two spaces; so all we need to do is\n            // search for a `code` property that begins with at least two spaces.\n            fragmentIndent = '';\n            ref1 = fragments.slice(0, (fragmentIndex + 1));\n            for (k = ref1.length - 1; k >= 0; k += -1) {\n              pastFragment = ref1[k];\n              indent = /^ {2,}/m.exec(pastFragment.code);\n              if (indent) {\n                fragmentIndent = indent[0];\n                break;\n              } else if (indexOf.call(pastFragment.code, '\\n') >= 0) {\n                break;\n              }\n            }\n            code = `\\n${fragmentIndent}` + ((function() {\n              var l, len2, ref2, results1;\n              ref2 = fragment.precedingComments;\n              results1 = [];\n              for (l = 0, len2 = ref2.length; l < len2; l++) {\n                commentFragment = ref2[l];\n                if (commentFragment.isHereComment && commentFragment.multiline) {\n                  results1.push(multident(commentFragment.code, fragmentIndent, false));\n                } else {\n                  results1.push(commentFragment.code);\n                }\n              }\n              return results1;\n            })()).join(`\\n${fragmentIndent}`).replace(/^(\\s*)$/gm, '');\n            ref2 = fragments.slice(0, (fragmentIndex + 1));\n            for (pastFragmentIndex = l = ref2.length - 1; l >= 0; pastFragmentIndex = l += -1) {\n              pastFragment = ref2[pastFragmentIndex];\n              newLineIndex = pastFragment.code.lastIndexOf('\\n');\n              if (newLineIndex === -1) {\n                // Keep searching previous fragments until we can’t go back any\n                // further, either because there are no fragments left or we’ve\n                // discovered that we’re in a code block that is interpolated\n                // inside a string.\n                if (pastFragmentIndex === 0) {\n                  pastFragment.code = '\\n' + pastFragment.code;\n                  newLineIndex = 0;\n                } else if (pastFragment.isStringWithInterpolations && pastFragment.code === '{') {\n                  code = code.slice(1) + '\\n'; // Move newline to end.\n                  newLineIndex = 1;\n                } else {\n                  continue;\n                }\n              }\n              delete fragment.precedingComments;\n              pastFragment.code = pastFragment.code.slice(0, newLineIndex) + code + pastFragment.code.slice(newLineIndex);\n              break;\n            }\n          }\n          // Yes, this is awfully similar to the previous `if` block, but if you\n          // look closely you’ll find lots of tiny differences that make this\n          // confusing if it were abstracted into a function that both blocks share.\n          if (fragment.followingComments) {\n            // Does the first trailing comment follow at the end of a line of code,\n            // like `; // Comment`, or does it start a new line after a line of code?\n            trail = fragment.followingComments[0].trail;\n            fragmentIndent = '';\n            // Find the indent of the next line of code, if we have any non-trailing\n            // comments to output. We need to first find the next newline, as these\n            // comments will be output after that; and then the indent of the line\n            // that follows the next newline.\n            if (!(trail && fragment.followingComments.length === 1)) {\n              onNextLine = false;\n              ref3 = fragments.slice(fragmentIndex);\n              for (p = 0, len2 = ref3.length; p < len2; p++) {\n                upcomingFragment = ref3[p];\n                if (!onNextLine) {\n                  if (indexOf.call(upcomingFragment.code, '\\n') >= 0) {\n                    onNextLine = true;\n                  } else {\n                    continue;\n                  }\n                } else {\n                  indent = /^ {2,}/m.exec(upcomingFragment.code);\n                  if (indent) {\n                    fragmentIndent = indent[0];\n                    break;\n                  } else if (indexOf.call(upcomingFragment.code, '\\n') >= 0) {\n                    break;\n                  }\n                }\n              }\n            }\n            // Is this comment following the indent inserted by bare mode?\n            // If so, there’s no need to indent this further.\n            code = fragmentIndex === 1 && /^\\s+$/.test(fragments[0].code) ? '' : trail ? ' ' : `\\n${fragmentIndent}`;\n            // Assemble properly indented comments.\n            code += ((function() {\n              var len3, q, ref4, results1;\n              ref4 = fragment.followingComments;\n              results1 = [];\n              for (q = 0, len3 = ref4.length; q < len3; q++) {\n                commentFragment = ref4[q];\n                if (commentFragment.isHereComment && commentFragment.multiline) {\n                  results1.push(multident(commentFragment.code, fragmentIndent, false));\n                } else {\n                  results1.push(commentFragment.code);\n                }\n              }\n              return results1;\n            })()).join(`\\n${fragmentIndent}`).replace(/^(\\s*)$/gm, '');\n            ref4 = fragments.slice(fragmentIndex);\n            for (upcomingFragmentIndex = q = 0, len3 = ref4.length; q < len3; upcomingFragmentIndex = ++q) {\n              upcomingFragment = ref4[upcomingFragmentIndex];\n              newLineIndex = upcomingFragment.code.indexOf('\\n');\n              if (newLineIndex === -1) {\n                // Keep searching upcoming fragments until we can’t go any\n                // further, either because there are no fragments left or we’ve\n                // discovered that we’re in a code block that is interpolated\n                // inside a string.\n                if (upcomingFragmentIndex === fragments.length - 1) {\n                  upcomingFragment.code = upcomingFragment.code + '\\n';\n                  newLineIndex = upcomingFragment.code.length;\n                } else if (upcomingFragment.isStringWithInterpolations && upcomingFragment.code === '}') {\n                  code = `${code}\\n`;\n                  newLineIndex = 0;\n                } else {\n                  continue;\n                }\n              }\n              delete fragment.followingComments;\n              if (upcomingFragment.code === '\\n') {\n                // Avoid inserting extra blank lines.\n                code = code.replace(/^\\n/, '');\n              }\n              upcomingFragment.code = upcomingFragment.code.slice(0, newLineIndex) + code + upcomingFragment.code.slice(newLineIndex);\n              break;\n            }\n          }\n        }\n        return fragments;\n      }\n\n      // Wrap up the given nodes as a **Block**, unless it already happens\n      // to be one.\n      static wrap(nodes) {\n        if (nodes.length === 1 && nodes[0] instanceof Block) {\n          return nodes[0];\n        }\n        return new Block(nodes);\n      }\n\n      astNode(o) {\n        if (((o.level != null) && o.level !== LEVEL_TOP) && this.expressions.length) {\n          return (new Sequence(this.expressions).withLocationDataFrom(this)).ast(o);\n        }\n        return super.astNode(o);\n      }\n\n      astType() {\n        if (this.isRootBlock) {\n          return 'Program';\n        } else if (this.isClassBody) {\n          return 'ClassBody';\n        } else {\n          return 'BlockStatement';\n        }\n      }\n\n      astProperties(o) {\n        var body, checkForDirectives, directives, expression, expressionAst, j, len1, ref1;\n        checkForDirectives = del(o, 'checkForDirectives');\n        if (this.isRootBlock || checkForDirectives) {\n          sniffDirectives(this.expressions, {\n            notFinalExpression: checkForDirectives\n          });\n        }\n        directives = [];\n        body = [];\n        ref1 = this.expressions;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          expression = ref1[j];\n          expressionAst = expression.ast(o);\n          // Ignore generated PassthroughLiteral\n          if (expressionAst == null) {\n            continue;\n          } else if (expression instanceof Directive) {\n            directives.push(expressionAst);\n          // If an expression is a statement, it can be added to the body as is.\n          } else if (expression.isStatementAst(o)) {\n            body.push(expressionAst);\n          } else {\n            // Otherwise, we need to wrap it in an `ExpressionStatement` AST node.\n            body.push(Object.assign({\n              type: 'ExpressionStatement',\n              expression: expressionAst\n            }, expression.astLocationData()));\n          }\n        }\n        // For now, we’re not including `sourceType` on the `Program` AST node.\n        // Its value could be either `'script'` or `'module'`, and there’s no way\n        // for CoffeeScript to always know which it should be. The presence of an\n        // `import` or `export` statement in source code would imply that it should\n        // be a `module`, but a project may consist of mostly such files and also\n        // an outlier file that lacks `import` or `export` but is still imported\n        // into the project and therefore expects to be treated as a `module`.\n        // Determining the value of `sourceType` is essentially the same challenge\n        // posed by determining the parse goal of a JavaScript file, also `module`\n        // or `script`, and so if Node figures out a way to do so for `.js` files\n        // then CoffeeScript can copy Node’s algorithm.\n\n          // sourceType: 'module'\n        return {body, directives};\n      }\n\n      astLocationData() {\n        if (this.isRootBlock && (this.locationData == null)) {\n          return;\n        }\n        return super.astLocationData();\n      }\n\n    };\n\n    Block.prototype.children = ['expressions'];\n\n    return Block;\n\n  }).call(this);\n\n  // A directive e.g. 'use strict'.\n  // Currently only used during AST generation.\n  exports.Directive = Directive = class Directive extends Base {\n    constructor(value1) {\n      super();\n      this.value = value1;\n    }\n\n    astProperties(o) {\n      return {\n        value: Object.assign({}, this.value.ast(o), {\n          type: 'DirectiveLiteral'\n        })\n      };\n    }\n\n  };\n\n  //### Literal\n\n  // `Literal` is a base class for static values that can be passed through\n  // directly into JavaScript without translation, such as: strings, numbers,\n  // `true`, `false`, `null`...\n  exports.Literal = Literal = (function() {\n    class Literal extends Base {\n      constructor(value1) {\n        super();\n        this.value = value1;\n      }\n\n      assigns(name) {\n        return name === this.value;\n      }\n\n      compileNode(o) {\n        return [this.makeCode(this.value)];\n      }\n\n      astProperties() {\n        return {\n          value: this.value\n        };\n      }\n\n      toString() {\n        // This is only intended for debugging.\n        return ` ${this.isStatement() ? super.toString() : this.constructor.name}: ${this.value}`;\n      }\n\n    };\n\n    Literal.prototype.shouldCache = NO;\n\n    return Literal;\n\n  }).call(this);\n\n  exports.NumberLiteral = NumberLiteral = class NumberLiteral extends Literal {\n    constructor(value1, {parsedValue} = {}) {\n      super();\n      this.value = value1;\n      this.parsedValue = parsedValue;\n      if (this.parsedValue == null) {\n        if (isNumber(this.value)) {\n          this.parsedValue = this.value;\n          this.value = `${this.value}`;\n        } else {\n          this.parsedValue = parseNumber(this.value);\n        }\n      }\n    }\n\n    isBigInt() {\n      return /n$/.test(this.value);\n    }\n\n    astType() {\n      if (this.isBigInt()) {\n        return 'BigIntLiteral';\n      } else {\n        return 'NumericLiteral';\n      }\n    }\n\n    astProperties() {\n      return {\n        value: this.isBigInt() ? this.parsedValue.toString() : this.parsedValue,\n        extra: {\n          rawValue: this.isBigInt() ? this.parsedValue.toString() : this.parsedValue,\n          raw: this.value\n        }\n      };\n    }\n\n  };\n\n  exports.InfinityLiteral = InfinityLiteral = class InfinityLiteral extends NumberLiteral {\n    constructor(value1, {originalValue: originalValue = 'Infinity'} = {}) {\n      super();\n      this.value = value1;\n      this.originalValue = originalValue;\n    }\n\n    compileNode() {\n      return [this.makeCode('2e308')];\n    }\n\n    astNode(o) {\n      if (this.originalValue !== 'Infinity') {\n        return new NumberLiteral(this.value).withLocationDataFrom(this).ast(o);\n      }\n      return super.astNode(o);\n    }\n\n    astType() {\n      return 'Identifier';\n    }\n\n    astProperties() {\n      return {\n        name: 'Infinity',\n        declaration: false\n      };\n    }\n\n  };\n\n  exports.NaNLiteral = NaNLiteral = class NaNLiteral extends NumberLiteral {\n    constructor() {\n      super('NaN');\n    }\n\n    compileNode(o) {\n      var code;\n      code = [this.makeCode('0/0')];\n      if (o.level >= LEVEL_OP) {\n        return this.wrapInParentheses(code);\n      } else {\n        return code;\n      }\n    }\n\n    astType() {\n      return 'Identifier';\n    }\n\n    astProperties() {\n      return {\n        name: 'NaN',\n        declaration: false\n      };\n    }\n\n  };\n\n  exports.StringLiteral = StringLiteral = class StringLiteral extends Literal {\n    constructor(originalValue, {\n        quote,\n        initialChunk,\n        finalChunk,\n        indent: indent1,\n        double: double1,\n        heregex: heregex1\n      } = {}) {\n      var heredoc, indentRegex, val;\n      super('');\n      this.originalValue = originalValue;\n      this.quote = quote;\n      this.initialChunk = initialChunk;\n      this.finalChunk = finalChunk;\n      this.indent = indent1;\n      this.double = double1;\n      this.heregex = heregex1;\n      if (this.quote === '///') {\n        this.quote = null;\n      }\n      this.fromSourceString = this.quote != null;\n      if (this.quote == null) {\n        this.quote = '\"';\n      }\n      heredoc = this.isFromHeredoc();\n      val = this.originalValue;\n      if (this.heregex) {\n        val = val.replace(HEREGEX_OMIT, '$1$2');\n        val = replaceUnicodeCodePointEscapes(val, {\n          flags: this.heregex.flags\n        });\n      } else {\n        val = val.replace(STRING_OMIT, '$1');\n        val = !this.fromSourceString ? val : heredoc ? (this.indent ? indentRegex = RegExp(`\\\\n${this.indent}`, \"g\") : void 0, indentRegex ? val = val.replace(indentRegex, '\\n') : void 0, this.initialChunk ? val = val.replace(LEADING_BLANK_LINE, '') : void 0, this.finalChunk ? val = val.replace(TRAILING_BLANK_LINE, '') : void 0, val) : val.replace(SIMPLE_STRING_OMIT, (match, offset) => {\n          if ((this.initialChunk && offset === 0) || (this.finalChunk && offset + match.length === val.length)) {\n            return '';\n          } else {\n            return ' ';\n          }\n        });\n      }\n      this.delimiter = this.quote.charAt(0);\n      this.value = makeDelimitedLiteral(val, {delimiter: this.delimiter, double: this.double});\n      this.unquotedValueForTemplateLiteral = makeDelimitedLiteral(val, {\n        delimiter: '`',\n        double: this.double,\n        escapeNewlines: false,\n        includeDelimiters: false,\n        convertTrailingNullEscapes: true\n      });\n      this.unquotedValueForJSX = makeDelimitedLiteral(val, {\n        double: this.double,\n        escapeNewlines: false,\n        includeDelimiters: false,\n        escapeDelimiter: false\n      });\n    }\n\n    compileNode(o) {\n      if (this.shouldGenerateTemplateLiteral()) {\n        return StringWithInterpolations.fromStringLiteral(this).compileNode(o);\n      }\n      if (this.jsx) {\n        return [this.makeCode(this.unquotedValueForJSX)];\n      }\n      return super.compileNode(o);\n    }\n\n    // `StringLiteral`s can represent either entire literal strings\n    // or pieces of text inside of e.g. an interpolated string.\n    // When parsed as the former but needing to be treated as the latter\n    // (e.g. the string part of a tagged template literal), this will return\n    // a copy of the `StringLiteral` with the quotes trimmed from its location\n    // data (like it would have if parsed as part of an interpolated string).\n    withoutQuotesInLocationData() {\n      var copy, endsWithNewline, locationData;\n      endsWithNewline = this.originalValue.slice(-1) === '\\n';\n      locationData = Object.assign({}, this.locationData);\n      locationData.first_column += this.quote.length;\n      if (endsWithNewline) {\n        locationData.last_line -= 1;\n        locationData.last_column = locationData.last_line === locationData.first_line ? locationData.first_column + this.originalValue.length - '\\n'.length : this.originalValue.slice(0, -1).length - '\\n'.length - this.originalValue.slice(0, -1).lastIndexOf('\\n');\n      } else {\n        locationData.last_column -= this.quote.length;\n      }\n      locationData.last_column_exclusive -= this.quote.length;\n      locationData.range = [locationData.range[0] + this.quote.length, locationData.range[1] - this.quote.length];\n      copy = new StringLiteral(this.originalValue, {quote: this.quote, initialChunk: this.initialChunk, finalChunk: this.finalChunk, indent: this.indent, double: this.double, heregex: this.heregex});\n      copy.locationData = locationData;\n      return copy;\n    }\n\n    isFromHeredoc() {\n      return this.quote.length === 3;\n    }\n\n    shouldGenerateTemplateLiteral() {\n      return this.isFromHeredoc();\n    }\n\n    astNode(o) {\n      if (this.shouldGenerateTemplateLiteral()) {\n        return StringWithInterpolations.fromStringLiteral(this).ast(o);\n      }\n      return super.astNode(o);\n    }\n\n    astProperties() {\n      return {\n        value: this.originalValue,\n        extra: {\n          raw: `${this.delimiter}${this.originalValue}${this.delimiter}`\n        }\n      };\n    }\n\n  };\n\n  exports.RegexLiteral = RegexLiteral = (function() {\n    class RegexLiteral extends Literal {\n      constructor(value, {delimiter: delimiter1 = '/', heregexCommentTokens: heregexCommentTokens = []} = {}) {\n        var endDelimiterIndex, heregex, val;\n        super('');\n        this.delimiter = delimiter1;\n        this.heregexCommentTokens = heregexCommentTokens;\n        heregex = this.delimiter === '///';\n        endDelimiterIndex = value.lastIndexOf('/');\n        this.flags = value.slice(endDelimiterIndex + 1);\n        val = this.originalValue = value.slice(1, endDelimiterIndex);\n        if (heregex) {\n          val = val.replace(HEREGEX_OMIT, '$1$2');\n        }\n        val = replaceUnicodeCodePointEscapes(val, {flags: this.flags});\n        this.value = `${makeDelimitedLiteral(val, {\n          delimiter: '/'\n        })}${this.flags}`;\n      }\n\n      astType() {\n        return 'RegExpLiteral';\n      }\n\n      astProperties(o) {\n        var heregexCommentToken, pattern;\n        [, pattern] = this.REGEX_REGEX.exec(this.value);\n        return {\n          value: void 0,\n          pattern,\n          flags: this.flags,\n          delimiter: this.delimiter,\n          originalPattern: this.originalValue,\n          extra: {\n            raw: this.value,\n            originalRaw: `${this.delimiter}${this.originalValue}${this.delimiter}${this.flags}`,\n            rawValue: void 0\n          },\n          comments: (function() {\n            var j, len1, ref1, results1;\n            ref1 = this.heregexCommentTokens;\n            results1 = [];\n            for (j = 0, len1 = ref1.length; j < len1; j++) {\n              heregexCommentToken = ref1[j];\n              if (heregexCommentToken.here) {\n                results1.push(new HereComment(heregexCommentToken).ast(o));\n              } else {\n                results1.push(new LineComment(heregexCommentToken).ast(o));\n              }\n            }\n            return results1;\n          }).call(this)\n        };\n      }\n\n    };\n\n    RegexLiteral.prototype.REGEX_REGEX = /^\\/(.*)\\/\\w*$/;\n\n    return RegexLiteral;\n\n  }).call(this);\n\n  exports.PassthroughLiteral = PassthroughLiteral = class PassthroughLiteral extends Literal {\n    constructor(originalValue, {here, generated} = {}) {\n      super('');\n      this.originalValue = originalValue;\n      this.here = here;\n      this.generated = generated;\n      this.value = this.originalValue.replace(/\\\\+(`|$)/g, function(string) {\n        // `string` is always a value like '\\`', '\\\\\\`', '\\\\\\\\\\`', etc.\n        // By reducing it to its latter half, we turn '\\`' to '`', '\\\\\\`' to '\\`', etc.\n        return string.slice(-Math.ceil(string.length / 2));\n      });\n    }\n\n    astNode(o) {\n      if (this.generated) {\n        return null;\n      }\n      return super.astNode(o);\n    }\n\n    astProperties() {\n      return {\n        value: this.originalValue,\n        here: !!this.here\n      };\n    }\n\n  };\n\n  exports.IdentifierLiteral = IdentifierLiteral = (function() {\n    class IdentifierLiteral extends Literal {\n      eachName(iterator) {\n        return iterator(this);\n      }\n\n      astType() {\n        if (this.jsx) {\n          return 'JSXIdentifier';\n        } else {\n          return 'Identifier';\n        }\n      }\n\n      astProperties() {\n        return {\n          name: this.value,\n          declaration: !!this.isDeclaration\n        };\n      }\n\n    };\n\n    IdentifierLiteral.prototype.isAssignable = YES;\n\n    return IdentifierLiteral;\n\n  }).call(this);\n\n  exports.PropertyName = PropertyName = (function() {\n    class PropertyName extends Literal {\n      astType() {\n        if (this.jsx) {\n          return 'JSXIdentifier';\n        } else {\n          return 'Identifier';\n        }\n      }\n\n      astProperties() {\n        return {\n          name: this.value,\n          declaration: false\n        };\n      }\n\n    };\n\n    PropertyName.prototype.isAssignable = YES;\n\n    return PropertyName;\n\n  }).call(this);\n\n  exports.ComputedPropertyName = ComputedPropertyName = class ComputedPropertyName extends PropertyName {\n    compileNode(o) {\n      return [this.makeCode('['), ...this.value.compileToFragments(o, LEVEL_LIST), this.makeCode(']')];\n    }\n\n    astNode(o) {\n      return this.value.ast(o);\n    }\n\n  };\n\n  exports.StatementLiteral = StatementLiteral = (function() {\n    class StatementLiteral extends Literal {\n      jumps(o) {\n        if (this.value === 'break' && !((o != null ? o.loop : void 0) || (o != null ? o.block : void 0))) {\n          return this;\n        }\n        if (this.value === 'continue' && !(o != null ? o.loop : void 0)) {\n          return this;\n        }\n      }\n\n      compileNode(o) {\n        return [this.makeCode(`${this.tab}${this.value};`)];\n      }\n\n      astType() {\n        switch (this.value) {\n          case 'continue':\n            return 'ContinueStatement';\n          case 'break':\n            return 'BreakStatement';\n          case 'debugger':\n            return 'DebuggerStatement';\n        }\n      }\n\n    };\n\n    StatementLiteral.prototype.isStatement = YES;\n\n    StatementLiteral.prototype.makeReturn = THIS;\n\n    return StatementLiteral;\n\n  }).call(this);\n\n  exports.ThisLiteral = ThisLiteral = class ThisLiteral extends Literal {\n    constructor(value) {\n      super('this');\n      this.shorthand = value === '@';\n    }\n\n    compileNode(o) {\n      var code, ref1;\n      code = ((ref1 = o.scope.method) != null ? ref1.bound : void 0) ? o.scope.method.context : this.value;\n      return [this.makeCode(code)];\n    }\n\n    astType() {\n      return 'ThisExpression';\n    }\n\n    astProperties() {\n      return {\n        shorthand: this.shorthand\n      };\n    }\n\n  };\n\n  exports.UndefinedLiteral = UndefinedLiteral = class UndefinedLiteral extends Literal {\n    constructor() {\n      super('undefined');\n    }\n\n    compileNode(o) {\n      return [this.makeCode(o.level >= LEVEL_ACCESS ? '(void 0)' : 'void 0')];\n    }\n\n    astType() {\n      return 'Identifier';\n    }\n\n    astProperties() {\n      return {\n        name: this.value,\n        declaration: false\n      };\n    }\n\n  };\n\n  exports.NullLiteral = NullLiteral = class NullLiteral extends Literal {\n    constructor() {\n      super('null');\n    }\n\n  };\n\n  exports.BooleanLiteral = BooleanLiteral = class BooleanLiteral extends Literal {\n    constructor(value, {originalValue} = {}) {\n      super(value);\n      this.originalValue = originalValue;\n      if (this.originalValue == null) {\n        this.originalValue = this.value;\n      }\n    }\n\n    astProperties() {\n      return {\n        value: this.value === 'true' ? true : false,\n        name: this.originalValue\n      };\n    }\n\n  };\n\n  exports.DefaultLiteral = DefaultLiteral = class DefaultLiteral extends Literal {\n    astType() {\n      return 'Identifier';\n    }\n\n    astProperties() {\n      return {\n        name: 'default',\n        declaration: false\n      };\n    }\n\n  };\n\n  //### Return\n\n  // A `return` is a *pureStatement*—wrapping it in a closure wouldn’t make sense.\n  exports.Return = Return = (function() {\n    class Return extends Base {\n      constructor(expression1, {belongsToFuncDirectiveReturn} = {}) {\n        super();\n        this.expression = expression1;\n        this.belongsToFuncDirectiveReturn = belongsToFuncDirectiveReturn;\n      }\n\n      compileToFragments(o, level) {\n        var expr, ref1;\n        expr = (ref1 = this.expression) != null ? ref1.makeReturn() : void 0;\n        if (expr && !(expr instanceof Return)) {\n          return expr.compileToFragments(o, level);\n        } else {\n          return super.compileToFragments(o, level);\n        }\n      }\n\n      compileNode(o) {\n        var answer, fragment, j, len1;\n        answer = [];\n        // TODO: If we call `expression.compile()` here twice, we’ll sometimes\n        // get back different results!\n        if (this.expression) {\n          answer = this.expression.compileToFragments(o, LEVEL_PAREN);\n          unshiftAfterComments(answer, this.makeCode(`${this.tab}return `));\n// Since the `return` got indented by `@tab`, preceding comments that are\n// multiline need to be indented.\n          for (j = 0, len1 = answer.length; j < len1; j++) {\n            fragment = answer[j];\n            if (fragment.isHereComment && indexOf.call(fragment.code, '\\n') >= 0) {\n              fragment.code = multident(fragment.code, this.tab);\n            } else if (fragment.isLineComment) {\n              fragment.code = `${this.tab}${fragment.code}`;\n            } else {\n              break;\n            }\n          }\n        } else {\n          answer.push(this.makeCode(`${this.tab}return`));\n        }\n        answer.push(this.makeCode(';'));\n        return answer;\n      }\n\n      checkForPureStatementInExpression() {\n        // don’t flag `return` from `await return`/`yield return` as invalid.\n        if (this.belongsToFuncDirectiveReturn) {\n          return;\n        }\n        return super.checkForPureStatementInExpression();\n      }\n\n      astType() {\n        return 'ReturnStatement';\n      }\n\n      astProperties(o) {\n        var ref1, ref2;\n        return {\n          argument: (ref1 = (ref2 = this.expression) != null ? ref2.ast(o, LEVEL_PAREN) : void 0) != null ? ref1 : null\n        };\n      }\n\n    };\n\n    Return.prototype.children = ['expression'];\n\n    Return.prototype.isStatement = YES;\n\n    Return.prototype.makeReturn = THIS;\n\n    Return.prototype.jumps = THIS;\n\n    return Return;\n\n  }).call(this);\n\n  // Parent class for `YieldReturn`/`AwaitReturn`.\n  exports.FuncDirectiveReturn = FuncDirectiveReturn = (function() {\n    class FuncDirectiveReturn extends Return {\n      constructor(expression, {returnKeyword}) {\n        super(expression);\n        this.returnKeyword = returnKeyword;\n      }\n\n      compileNode(o) {\n        this.checkScope(o);\n        return super.compileNode(o);\n      }\n\n      checkScope(o) {\n        if (o.scope.parent == null) {\n          return this.error(`${this.keyword} can only occur inside functions`);\n        }\n      }\n\n      astNode(o) {\n        this.checkScope(o);\n        return new Op(this.keyword, new Return(this.expression, {\n          belongsToFuncDirectiveReturn: true\n        }).withLocationDataFrom(this.expression != null ? {\n          locationData: mergeLocationData(this.returnKeyword.locationData, this.expression.locationData)\n        } : this.returnKeyword)).withLocationDataFrom(this).ast(o);\n      }\n\n    };\n\n    FuncDirectiveReturn.prototype.isStatementAst = NO;\n\n    return FuncDirectiveReturn;\n\n  }).call(this);\n\n  // `yield return` works exactly like `return`, except that it turns the function\n  // into a generator.\n  exports.YieldReturn = YieldReturn = (function() {\n    class YieldReturn extends FuncDirectiveReturn {};\n\n    YieldReturn.prototype.keyword = 'yield';\n\n    return YieldReturn;\n\n  }).call(this);\n\n  exports.AwaitReturn = AwaitReturn = (function() {\n    class AwaitReturn extends FuncDirectiveReturn {};\n\n    AwaitReturn.prototype.keyword = 'await';\n\n    return AwaitReturn;\n\n  }).call(this);\n\n  //### Value\n\n  // A value, variable or literal or parenthesized, indexed or dotted into,\n  // or vanilla.\n  exports.Value = Value = (function() {\n    class Value extends Base {\n      constructor(base, props, tag, isDefaultValue = false) {\n        var ref1, ref2;\n        super();\n        if (!props && base instanceof Value) {\n          return base;\n        }\n        this.base = base;\n        this.properties = props || [];\n        this.tag = tag;\n        if (tag) {\n          this[tag] = true;\n        }\n        this.isDefaultValue = isDefaultValue;\n        // If this is a `@foo =` assignment, if there are comments on `@` move them\n        // to be on `foo`.\n        if (((ref1 = this.base) != null ? ref1.comments : void 0) && this.base instanceof ThisLiteral && (((ref2 = this.properties[0]) != null ? ref2.name : void 0) != null)) {\n          moveComments(this.base, this.properties[0].name);\n        }\n      }\n\n      // Add a property (or *properties* ) `Access` to the list.\n      add(props) {\n        this.properties = this.properties.concat(props);\n        this.forceUpdateLocation = true;\n        return this;\n      }\n\n      hasProperties() {\n        return this.properties.length !== 0;\n      }\n\n      bareLiteral(type) {\n        return !this.properties.length && this.base instanceof type;\n      }\n\n      // Some boolean checks for the benefit of other nodes.\n      isArray() {\n        return this.bareLiteral(Arr);\n      }\n\n      isRange() {\n        return this.bareLiteral(Range);\n      }\n\n      shouldCache() {\n        return this.hasProperties() || this.base.shouldCache();\n      }\n\n      isAssignable(opts) {\n        return this.hasProperties() || this.base.isAssignable(opts);\n      }\n\n      isNumber() {\n        return this.bareLiteral(NumberLiteral);\n      }\n\n      isString() {\n        return this.bareLiteral(StringLiteral);\n      }\n\n      isRegex() {\n        return this.bareLiteral(RegexLiteral);\n      }\n\n      isUndefined() {\n        return this.bareLiteral(UndefinedLiteral);\n      }\n\n      isNull() {\n        return this.bareLiteral(NullLiteral);\n      }\n\n      isBoolean() {\n        return this.bareLiteral(BooleanLiteral);\n      }\n\n      isAtomic() {\n        var j, len1, node, ref1;\n        ref1 = this.properties.concat(this.base);\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          node = ref1[j];\n          if (node.soak || node instanceof Call || node instanceof Op && node.operator === 'do') {\n            return false;\n          }\n        }\n        return true;\n      }\n\n      isNotCallable() {\n        return this.isNumber() || this.isString() || this.isRegex() || this.isArray() || this.isRange() || this.isSplice() || this.isObject() || this.isUndefined() || this.isNull() || this.isBoolean();\n      }\n\n      isStatement(o) {\n        return !this.properties.length && this.base.isStatement(o);\n      }\n\n      isJSXTag() {\n        return this.base instanceof JSXTag;\n      }\n\n      assigns(name) {\n        return !this.properties.length && this.base.assigns(name);\n      }\n\n      jumps(o) {\n        return !this.properties.length && this.base.jumps(o);\n      }\n\n      isObject(onlyGenerated) {\n        if (this.properties.length) {\n          return false;\n        }\n        return (this.base instanceof Obj) && (!onlyGenerated || this.base.generated);\n      }\n\n      isElision() {\n        if (!(this.base instanceof Arr)) {\n          return false;\n        }\n        return this.base.hasElision();\n      }\n\n      isSplice() {\n        var lastProperty, ref1;\n        ref1 = this.properties, [lastProperty] = slice1.call(ref1, -1);\n        return lastProperty instanceof Slice;\n      }\n\n      looksStatic(className) {\n        var name, ref1, thisLiteral;\n        if (!(((thisLiteral = this.base) instanceof ThisLiteral || (name = this.base).value === className) && this.properties.length === 1 && ((ref1 = this.properties[0].name) != null ? ref1.value : void 0) !== 'prototype')) {\n          return false;\n        }\n        return {\n          staticClassName: thisLiteral != null ? thisLiteral : name\n        };\n      }\n\n      // The value can be unwrapped as its inner node, if there are no attached\n      // properties.\n      unwrap() {\n        if (this.properties.length) {\n          return this;\n        } else {\n          return this.base;\n        }\n      }\n\n      // A reference has base part (`this` value) and name part.\n      // We cache them separately for compiling complex expressions.\n      // `a()[b()] ?= c` -> `(_base = a())[_name = b()] ? _base[_name] = c`\n      cacheReference(o) {\n        var base, bref, name, nref, ref1;\n        ref1 = this.properties, [name] = slice1.call(ref1, -1);\n        if (this.properties.length < 2 && !this.base.shouldCache() && !(name != null ? name.shouldCache() : void 0)) {\n          return [this, this]; // `a` `a.b`\n        }\n        base = new Value(this.base, this.properties.slice(0, -1));\n        if (base.shouldCache()) { // `a().b`\n          bref = new IdentifierLiteral(o.scope.freeVariable('base'));\n          base = new Value(new Parens(new Assign(bref, base)));\n        }\n        if (!name) { // `a()`\n          return [base, bref];\n        }\n        if (name.shouldCache()) { // `a[b()]`\n          nref = new IdentifierLiteral(o.scope.freeVariable('name'));\n          name = new Index(new Assign(nref, name.index));\n          nref = new Index(nref);\n        }\n        return [base.add(name), new Value(bref || base.base, [nref || name])];\n      }\n\n      // We compile a value to JavaScript by compiling and joining each property.\n      // Things get much more interesting if the chain of properties has *soak*\n      // operators `?.` interspersed. Then we have to take care not to accidentally\n      // evaluate anything twice when building the soak chain.\n      compileNode(o) {\n        var fragments, j, len1, prop, props;\n        this.base.front = this.front;\n        props = this.properties;\n        if (props.length && (this.base.cached != null)) {\n          // Cached fragments enable correct order of the compilation,\n          // and reuse of variables in the scope.\n          // Example:\n          // `a(x = 5).b(-> x = 6)` should compile in the same order as\n          // `a(x = 5); b(-> x = 6)`\n          // (see issue #4437, https://github.com/jashkenas/coffeescript/issues/4437)\n          fragments = this.base.cached;\n        } else {\n          fragments = this.base.compileToFragments(o, (props.length ? LEVEL_ACCESS : null));\n        }\n        if (props.length && SIMPLENUM.test(fragmentsToText(fragments))) {\n          fragments.push(this.makeCode('.'));\n        }\n        for (j = 0, len1 = props.length; j < len1; j++) {\n          prop = props[j];\n          fragments.push(...(prop.compileToFragments(o)));\n        }\n        return fragments;\n      }\n\n      // Unfold a soak into an `If`: `a?.b` -> `a.b if a?`\n      unfoldSoak(o) {\n        return this.unfoldedSoak != null ? this.unfoldedSoak : this.unfoldedSoak = (() => {\n          var fst, i, ifn, j, len1, prop, ref, ref1, snd;\n          ifn = this.base.unfoldSoak(o);\n          if (ifn) {\n            ifn.body.properties.push(...this.properties);\n            return ifn;\n          }\n          ref1 = this.properties;\n          for (i = j = 0, len1 = ref1.length; j < len1; i = ++j) {\n            prop = ref1[i];\n            if (!prop.soak) {\n              continue;\n            }\n            prop.soak = false;\n            fst = new Value(this.base, this.properties.slice(0, i));\n            snd = new Value(this.base, this.properties.slice(i));\n            if (fst.shouldCache()) {\n              ref = new IdentifierLiteral(o.scope.freeVariable('ref'));\n              fst = new Parens(new Assign(ref, fst));\n              snd.base = ref;\n            }\n            return new If(new Existence(fst), snd, {\n              soak: true\n            });\n          }\n          return false;\n        })();\n      }\n\n      eachName(iterator, {checkAssignability = true} = {}) {\n        if (this.hasProperties()) {\n          return iterator(this);\n        } else if (!checkAssignability || this.base.isAssignable()) {\n          return this.base.eachName(iterator);\n        } else {\n          return this.error('tried to assign to unassignable value');\n        }\n      }\n\n      // For AST generation, we need an `object` that’s this `Value` minus its last\n      // property, if it has properties.\n      object() {\n        var initialProperties, object;\n        if (!this.hasProperties()) {\n          return this;\n        }\n        // Get all properties except the last one; for a `Value` with only one\n        // property, `initialProperties` is an empty array.\n        initialProperties = this.properties.slice(0, this.properties.length - 1);\n        // Create the `object` that becomes the new “base” for the split-off final\n        // property.\n        object = new Value(this.base, initialProperties, this.tag, this.isDefaultValue);\n        // Add location data to our new node, so that it has correct location data\n        // for source maps or later conversion into AST location data.\n        // This new `Value` has only one property, so the location data is just\n        // that of the parent `Value`’s base.\n        // This new `Value` has multiple properties, so the location data spans\n        // from the parent `Value`’s base to the last property that’s included\n        // in this new node (a.k.a. the second-to-last property of the parent).\n        object.locationData = initialProperties.length === 0 ? this.base.locationData : mergeLocationData(this.base.locationData, initialProperties[initialProperties.length - 1].locationData);\n        return object;\n      }\n\n      containsSoak() {\n        var j, len1, property, ref1;\n        if (!this.hasProperties()) {\n          return false;\n        }\n        ref1 = this.properties;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          property = ref1[j];\n          if (property.soak) {\n            return true;\n          }\n        }\n        if (this.base instanceof Call && this.base.soak) {\n          return true;\n        }\n        return false;\n      }\n\n      astNode(o) {\n        if (!this.hasProperties()) {\n          // If the `Value` has no properties, the AST node is just whatever this\n          // node’s `base` is.\n          return this.base.ast(o);\n        }\n        // Otherwise, call `Base::ast` which in turn calls the `astType` and\n        // `astProperties` methods below.\n        return super.astNode(o);\n      }\n\n      astType() {\n        if (this.isJSXTag()) {\n          return 'JSXMemberExpression';\n        } else if (this.containsSoak()) {\n          return 'OptionalMemberExpression';\n        } else {\n          return 'MemberExpression';\n        }\n      }\n\n      // If this `Value` has properties, the *last* property (e.g. `c` in `a.b.c`)\n      // becomes the `property`, and the preceding properties (e.g. `a.b`) become\n      // a child `Value` node assigned to the `object` property.\n      astProperties(o) {\n        var computed, property, ref1, ref2;\n        ref1 = this.properties, [property] = slice1.call(ref1, -1);\n        if (this.isJSXTag()) {\n          property.name.jsx = true;\n        }\n        computed = property instanceof Index || !(((ref2 = property.name) != null ? ref2.unwrap() : void 0) instanceof PropertyName);\n        return {\n          object: this.object().ast(o, LEVEL_ACCESS),\n          property: property.ast(o, (computed ? LEVEL_PAREN : void 0)),\n          computed,\n          optional: !!property.soak,\n          shorthand: !!property.shorthand\n        };\n      }\n\n      astLocationData() {\n        if (!this.isJSXTag()) {\n          return super.astLocationData();\n        }\n        // don't include leading < of JSX tag in location data\n        return mergeAstLocationData(jisonLocationDataToAstLocationData(this.base.tagNameLocationData), jisonLocationDataToAstLocationData(this.properties[this.properties.length - 1].locationData));\n      }\n\n    };\n\n    Value.prototype.children = ['base', 'properties'];\n\n    return Value;\n\n  }).call(this);\n\n  exports.MetaProperty = MetaProperty = (function() {\n    class MetaProperty extends Base {\n      constructor(meta, property1) {\n        super();\n        this.meta = meta;\n        this.property = property1;\n      }\n\n      checkValid(o) {\n        if (this.meta.value === 'new') {\n          if (this.property instanceof Access && this.property.name.value === 'target') {\n            if (o.scope.parent == null) {\n              return this.error(\"new.target can only occur inside functions\");\n            }\n          } else {\n            return this.error(\"the only valid meta property for new is new.target\");\n          }\n        } else if (this.meta.value === 'import') {\n          if (!(this.property instanceof Access && this.property.name.value === 'meta')) {\n            return this.error(\"the only valid meta property for import is import.meta\");\n          }\n        }\n      }\n\n      compileNode(o) {\n        var fragments;\n        this.checkValid(o);\n        fragments = [];\n        fragments.push(...this.meta.compileToFragments(o, LEVEL_ACCESS));\n        fragments.push(...this.property.compileToFragments(o));\n        return fragments;\n      }\n\n      astProperties(o) {\n        this.checkValid(o);\n        return {\n          meta: this.meta.ast(o, LEVEL_ACCESS),\n          property: this.property.ast(o)\n        };\n      }\n\n    };\n\n    MetaProperty.prototype.children = ['meta', 'property'];\n\n    return MetaProperty;\n\n  }).call(this);\n\n  //### HereComment\n\n  // Comment delimited by `###` (becoming `/* */`).\n  exports.HereComment = HereComment = class HereComment extends Base {\n    constructor({\n        content: content1,\n        newLine,\n        unshift,\n        locationData: locationData1\n      }) {\n      super();\n      this.content = content1;\n      this.newLine = newLine;\n      this.unshift = unshift;\n      this.locationData = locationData1;\n    }\n\n    compileNode(o) {\n      var fragment, hasLeadingMarks, indent, j, leadingWhitespace, len1, line, multiline, ref1;\n      multiline = indexOf.call(this.content, '\\n') >= 0;\n      // Unindent multiline comments. They will be reindented later.\n      if (multiline) {\n        indent = null;\n        ref1 = this.content.split('\\n');\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          line = ref1[j];\n          leadingWhitespace = /^\\s*/.exec(line)[0];\n          if (!indent || leadingWhitespace.length < indent.length) {\n            indent = leadingWhitespace;\n          }\n        }\n        if (indent) {\n          this.content = this.content.replace(RegExp(`\\\\n${indent}`, \"g\"), '\\n');\n        }\n      }\n      hasLeadingMarks = /\\n\\s*[#|\\*]/.test(this.content);\n      if (hasLeadingMarks) {\n        this.content = this.content.replace(/^([ \\t]*)#(?=\\s)/gm, ' *');\n      }\n      this.content = `/*${this.content}${hasLeadingMarks ? ' ' : ''}*/`;\n      fragment = this.makeCode(this.content);\n      fragment.newLine = this.newLine;\n      fragment.unshift = this.unshift;\n      fragment.multiline = multiline;\n      // Don’t rely on `fragment.type`, which can break when the compiler is minified.\n      fragment.isComment = fragment.isHereComment = true;\n      return fragment;\n    }\n\n    astType() {\n      return 'CommentBlock';\n    }\n\n    astProperties() {\n      return {\n        value: this.content\n      };\n    }\n\n  };\n\n  //### LineComment\n\n  // Comment running from `#` to the end of a line (becoming `//`).\n  exports.LineComment = LineComment = class LineComment extends Base {\n    constructor({\n        content: content1,\n        newLine,\n        unshift,\n        locationData: locationData1,\n        precededByBlankLine\n      }) {\n      super();\n      this.content = content1;\n      this.newLine = newLine;\n      this.unshift = unshift;\n      this.locationData = locationData1;\n      this.precededByBlankLine = precededByBlankLine;\n    }\n\n    compileNode(o) {\n      var fragment;\n      fragment = this.makeCode(/^\\s*$/.test(this.content) ? '' : `${this.precededByBlankLine ? `\\n${o.indent}` : ''}//${this.content}`);\n      fragment.newLine = this.newLine;\n      fragment.unshift = this.unshift;\n      fragment.trail = !this.newLine && !this.unshift;\n      // Don’t rely on `fragment.type`, which can break when the compiler is minified.\n      fragment.isComment = fragment.isLineComment = true;\n      return fragment;\n    }\n\n    astType() {\n      return 'CommentLine';\n    }\n\n    astProperties() {\n      return {\n        value: this.content\n      };\n    }\n\n  };\n\n  //### JSX\n  exports.JSXIdentifier = JSXIdentifier = class JSXIdentifier extends IdentifierLiteral {\n    astType() {\n      return 'JSXIdentifier';\n    }\n\n  };\n\n  exports.JSXTag = JSXTag = class JSXTag extends JSXIdentifier {\n    constructor(value, {tagNameLocationData, closingTagOpeningBracketLocationData, closingTagSlashLocationData, closingTagNameLocationData, closingTagClosingBracketLocationData}) {\n      super(value);\n      this.tagNameLocationData = tagNameLocationData;\n      this.closingTagOpeningBracketLocationData = closingTagOpeningBracketLocationData;\n      this.closingTagSlashLocationData = closingTagSlashLocationData;\n      this.closingTagNameLocationData = closingTagNameLocationData;\n      this.closingTagClosingBracketLocationData = closingTagClosingBracketLocationData;\n    }\n\n    astProperties() {\n      return {\n        name: this.value\n      };\n    }\n\n  };\n\n  exports.JSXExpressionContainer = JSXExpressionContainer = (function() {\n    class JSXExpressionContainer extends Base {\n      constructor(expression1, {locationData} = {}) {\n        super();\n        this.expression = expression1;\n        this.expression.jsxAttribute = true;\n        this.locationData = locationData != null ? locationData : this.expression.locationData;\n      }\n\n      compileNode(o) {\n        return this.expression.compileNode(o);\n      }\n\n      astProperties(o) {\n        return {\n          expression: astAsBlockIfNeeded(this.expression, o)\n        };\n      }\n\n    };\n\n    JSXExpressionContainer.prototype.children = ['expression'];\n\n    return JSXExpressionContainer;\n\n  }).call(this);\n\n  exports.JSXEmptyExpression = JSXEmptyExpression = class JSXEmptyExpression extends Base {};\n\n  exports.JSXText = JSXText = class JSXText extends Base {\n    constructor(stringLiteral) {\n      super();\n      this.value = stringLiteral.unquotedValueForJSX;\n      this.locationData = stringLiteral.locationData;\n    }\n\n    astProperties() {\n      return {\n        value: this.value,\n        extra: {\n          raw: this.value\n        }\n      };\n    }\n\n  };\n\n  exports.JSXAttribute = JSXAttribute = (function() {\n    class JSXAttribute extends Base {\n      constructor({\n          name: name1,\n          value\n        }) {\n        var ref1;\n        super();\n        this.name = name1;\n        this.value = value != null ? (value = value.base, value instanceof StringLiteral && !value.shouldGenerateTemplateLiteral() ? value : new JSXExpressionContainer(value)) : null;\n        if ((ref1 = this.value) != null) {\n          ref1.comments = value.comments;\n        }\n      }\n\n      compileNode(o) {\n        var compiledName, val;\n        compiledName = this.name.compileToFragments(o, LEVEL_LIST);\n        if (this.value == null) {\n          return compiledName;\n        }\n        val = this.value.compileToFragments(o, LEVEL_LIST);\n        return compiledName.concat(this.makeCode('='), val);\n      }\n\n      astProperties(o) {\n        var name, ref1, ref2;\n        name = this.name;\n        if (indexOf.call(name.value, ':') >= 0) {\n          name = new JSXNamespacedName(name);\n        }\n        return {\n          name: name.ast(o),\n          value: (ref1 = (ref2 = this.value) != null ? ref2.ast(o) : void 0) != null ? ref1 : null\n        };\n      }\n\n    };\n\n    JSXAttribute.prototype.children = ['name', 'value'];\n\n    return JSXAttribute;\n\n  }).call(this);\n\n  exports.JSXAttributes = JSXAttributes = (function() {\n    class JSXAttributes extends Base {\n      constructor(arr) {\n        var attribute, base, j, k, len1, len2, object, property, ref1, ref2, value, variable;\n        super();\n        this.attributes = [];\n        ref1 = arr.objects;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          object = ref1[j];\n          this.checkValidAttribute(object);\n          ({base} = object);\n          if (base instanceof IdentifierLiteral) {\n            // attribute with no value eg disabled\n            attribute = new JSXAttribute({\n              name: new JSXIdentifier(base.value).withLocationDataAndCommentsFrom(base)\n            });\n            attribute.locationData = base.locationData;\n            this.attributes.push(attribute);\n          } else if (!base.generated) {\n            // object spread attribute eg {...props}\n            attribute = base.properties[0];\n            attribute.jsx = true;\n            attribute.locationData = base.locationData;\n            this.attributes.push(attribute);\n          } else {\n            ref2 = base.properties;\n            // Obj containing attributes with values eg a=\"b\" c={d}\n            for (k = 0, len2 = ref2.length; k < len2; k++) {\n              property = ref2[k];\n              ({variable, value} = property);\n              attribute = new JSXAttribute({\n                name: new JSXIdentifier(variable.base.value).withLocationDataAndCommentsFrom(variable.base),\n                value\n              });\n              attribute.locationData = property.locationData;\n              this.attributes.push(attribute);\n            }\n          }\n        }\n        this.locationData = arr.locationData;\n      }\n\n      // Catch invalid attributes: <div {a:\"b\", props} {props} \"value\" />\n      checkValidAttribute(object) {\n        var attribute, properties;\n        ({\n          base: attribute\n        } = object);\n        properties = (attribute != null ? attribute.properties : void 0) || [];\n        if (!(attribute instanceof Obj || attribute instanceof IdentifierLiteral) || (attribute instanceof Obj && !attribute.generated && (properties.length > 1 || !(properties[0] instanceof Splat)))) {\n          return object.error(`Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.`);\n        }\n      }\n\n      compileNode(o) {\n        var attribute, fragments, j, len1, ref1;\n        fragments = [];\n        ref1 = this.attributes;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          attribute = ref1[j];\n          fragments.push(this.makeCode(' '));\n          fragments.push(...attribute.compileToFragments(o, LEVEL_TOP));\n        }\n        return fragments;\n      }\n\n      astNode(o) {\n        var attribute, j, len1, ref1, results1;\n        ref1 = this.attributes;\n        results1 = [];\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          attribute = ref1[j];\n          results1.push(attribute.ast(o));\n        }\n        return results1;\n      }\n\n    };\n\n    JSXAttributes.prototype.children = ['attributes'];\n\n    return JSXAttributes;\n\n  }).call(this);\n\n  exports.JSXNamespacedName = JSXNamespacedName = (function() {\n    class JSXNamespacedName extends Base {\n      constructor(tag) {\n        var name, namespace;\n        super();\n        [namespace, name] = tag.value.split(':');\n        this.namespace = new JSXIdentifier(namespace).withLocationDataFrom({\n          locationData: extractSameLineLocationDataFirst(namespace.length)(tag.locationData)\n        });\n        this.name = new JSXIdentifier(name).withLocationDataFrom({\n          locationData: extractSameLineLocationDataLast(name.length)(tag.locationData)\n        });\n        this.locationData = tag.locationData;\n      }\n\n      astProperties(o) {\n        return {\n          namespace: this.namespace.ast(o),\n          name: this.name.ast(o)\n        };\n      }\n\n    };\n\n    JSXNamespacedName.prototype.children = ['namespace', 'name'];\n\n    return JSXNamespacedName;\n\n  }).call(this);\n\n  // Node for a JSX element\n  exports.JSXElement = JSXElement = (function() {\n    class JSXElement extends Base {\n      constructor({\n          tagName: tagName1,\n          attributes,\n          content: content1\n        }) {\n        super();\n        this.tagName = tagName1;\n        this.attributes = attributes;\n        this.content = content1;\n      }\n\n      compileNode(o) {\n        var fragments, ref1, tag;\n        if ((ref1 = this.content) != null) {\n          ref1.base.jsx = true;\n        }\n        fragments = [this.makeCode('<')];\n        fragments.push(...(tag = this.tagName.compileToFragments(o, LEVEL_ACCESS)));\n        fragments.push(...this.attributes.compileToFragments(o));\n        if (this.content) {\n          fragments.push(this.makeCode('>'));\n          fragments.push(...this.content.compileNode(o, LEVEL_LIST));\n          fragments.push(...[this.makeCode('</'), ...tag, this.makeCode('>')]);\n        } else {\n          fragments.push(this.makeCode(' />'));\n        }\n        return fragments;\n      }\n\n      isFragment() {\n        return !this.tagName.base.value.length;\n      }\n\n      astNode(o) {\n        var tagName;\n        // The location data spanning the opening element < ... > is captured by\n        // the generated Arr which contains the element's attributes\n        this.openingElementLocationData = jisonLocationDataToAstLocationData(this.attributes.locationData);\n        tagName = this.tagName.base;\n        tagName.locationData = tagName.tagNameLocationData;\n        if (this.content != null) {\n          this.closingElementLocationData = mergeAstLocationData(jisonLocationDataToAstLocationData(tagName.closingTagOpeningBracketLocationData), jisonLocationDataToAstLocationData(tagName.closingTagClosingBracketLocationData));\n        }\n        return super.astNode(o);\n      }\n\n      astType() {\n        if (this.isFragment()) {\n          return 'JSXFragment';\n        } else {\n          return 'JSXElement';\n        }\n      }\n\n      elementAstProperties(o) {\n        var closingElement, columnDiff, currentExpr, openingElement, rangeDiff, ref1, shiftAstLocationData, tagNameAst;\n        tagNameAst = () => {\n          var tag;\n          tag = this.tagName.unwrap();\n          if ((tag != null ? tag.value : void 0) && indexOf.call(tag.value, ':') >= 0) {\n            tag = new JSXNamespacedName(tag);\n          }\n          return tag.ast(o);\n        };\n        openingElement = Object.assign({\n          type: 'JSXOpeningElement',\n          name: tagNameAst(),\n          selfClosing: this.closingElementLocationData == null,\n          attributes: this.attributes.ast(o)\n        }, this.openingElementLocationData);\n        closingElement = null;\n        if (this.closingElementLocationData != null) {\n          closingElement = Object.assign({\n            type: 'JSXClosingElement',\n            name: Object.assign(tagNameAst(), jisonLocationDataToAstLocationData(this.tagName.base.closingTagNameLocationData))\n          }, this.closingElementLocationData);\n          if ((ref1 = closingElement.name.type) === 'JSXMemberExpression' || ref1 === 'JSXNamespacedName') {\n            rangeDiff = closingElement.range[0] - openingElement.range[0] + '/'.length;\n            columnDiff = closingElement.loc.start.column - openingElement.loc.start.column + '/'.length;\n            shiftAstLocationData = (node) => {\n              node.range = [node.range[0] + rangeDiff, node.range[1] + rangeDiff];\n              node.start += rangeDiff;\n              node.end += rangeDiff;\n              node.loc.start = {\n                line: this.closingElementLocationData.loc.start.line,\n                column: node.loc.start.column + columnDiff\n              };\n              return node.loc.end = {\n                line: this.closingElementLocationData.loc.start.line,\n                column: node.loc.end.column + columnDiff\n              };\n            };\n            if (closingElement.name.type === 'JSXMemberExpression') {\n              currentExpr = closingElement.name;\n              while (currentExpr.type === 'JSXMemberExpression') {\n                if (currentExpr !== closingElement.name) {\n                  shiftAstLocationData(currentExpr);\n                }\n                shiftAstLocationData(currentExpr.property);\n                currentExpr = currentExpr.object;\n              }\n              shiftAstLocationData(currentExpr); // JSXNamespacedName\n            } else {\n              shiftAstLocationData(closingElement.name.namespace);\n              shiftAstLocationData(closingElement.name.name);\n            }\n          }\n        }\n        return {openingElement, closingElement};\n      }\n\n      fragmentAstProperties(o) {\n        var closingFragment, openingFragment;\n        openingFragment = Object.assign({\n          type: 'JSXOpeningFragment'\n        }, this.openingElementLocationData);\n        closingFragment = Object.assign({\n          type: 'JSXClosingFragment'\n        }, this.closingElementLocationData);\n        return {openingFragment, closingFragment};\n      }\n\n      contentAst(o) {\n        var base1, child, children, content, element, emptyExpression, expression, j, len1, results1, unwrapped;\n        if (!(this.content && !(typeof (base1 = this.content.base).isEmpty === \"function\" ? base1.isEmpty() : void 0))) {\n          return [];\n        }\n        content = this.content.unwrapAll();\n        children = (function() {\n          var j, len1, ref1, results1;\n          if (content instanceof StringLiteral) {\n            return [new JSXText(content)]; // StringWithInterpolations\n          } else {\n            ref1 = this.content.unwrapAll().extractElements(o, {\n              includeInterpolationWrappers: true,\n              isJsx: true\n            });\n            results1 = [];\n            for (j = 0, len1 = ref1.length; j < len1; j++) {\n              element = ref1[j];\n              if (element instanceof StringLiteral) {\n                results1.push(new JSXText(element)); // Interpolation\n              } else {\n                ({expression} = element);\n                if (expression == null) {\n                  emptyExpression = new JSXEmptyExpression();\n                  emptyExpression.locationData = emptyExpressionLocationData({\n                    interpolationNode: element,\n                    openingBrace: '{',\n                    closingBrace: '}'\n                  });\n                  results1.push(new JSXExpressionContainer(emptyExpression, {\n                    locationData: element.locationData\n                  }));\n                } else {\n                  unwrapped = expression.unwrapAll();\n                  // distinguish `<a><b /></a>` from `<a>{<b />}</a>`\n                  if (unwrapped instanceof JSXElement && unwrapped.locationData.range[0] === element.locationData.range[0]) {\n                    results1.push(unwrapped);\n                  } else {\n                    results1.push(new JSXExpressionContainer(unwrapped, {\n                      locationData: element.locationData\n                    }));\n                  }\n                }\n              }\n            }\n            return results1;\n          }\n        }).call(this);\n        results1 = [];\n        for (j = 0, len1 = children.length; j < len1; j++) {\n          child = children[j];\n          if (!(child instanceof JSXText && child.value.length === 0)) {\n            results1.push(child.ast(o));\n          }\n        }\n        return results1;\n      }\n\n      astProperties(o) {\n        return Object.assign(this.isFragment() ? this.fragmentAstProperties(o) : this.elementAstProperties(o), {\n          children: this.contentAst(o)\n        });\n      }\n\n      astLocationData() {\n        if (this.closingElementLocationData != null) {\n          return mergeAstLocationData(this.openingElementLocationData, this.closingElementLocationData);\n        } else {\n          return this.openingElementLocationData;\n        }\n      }\n\n    };\n\n    JSXElement.prototype.children = ['tagName', 'attributes', 'content'];\n\n    return JSXElement;\n\n  }).call(this);\n\n  //### Call\n\n  // Node for a function invocation.\n  exports.Call = Call = (function() {\n    class Call extends Base {\n      constructor(variable1, args1 = [], soak1, token1) {\n        var ref1;\n        super();\n        this.variable = variable1;\n        this.args = args1;\n        this.soak = soak1;\n        this.token = token1;\n        this.implicit = this.args.implicit;\n        this.isNew = false;\n        if (this.variable instanceof Value && this.variable.isNotCallable()) {\n          this.variable.error(\"literal is not a function\");\n        }\n        if (this.variable.base instanceof JSXTag) {\n          return new JSXElement({\n            tagName: this.variable,\n            attributes: new JSXAttributes(this.args[0].base),\n            content: this.args[1]\n          });\n        }\n        // `@variable` never gets output as a result of this node getting created as\n        // part of `RegexWithInterpolations`, so for that case move any comments to\n        // the `args` property that gets passed into `RegexWithInterpolations` via\n        // the grammar.\n        if (((ref1 = this.variable.base) != null ? ref1.value : void 0) === 'RegExp' && this.args.length !== 0) {\n          moveComments(this.variable, this.args[0]);\n        }\n      }\n\n      // When setting the location, we sometimes need to update the start location to\n      // account for a newly-discovered `new` operator to the left of us. This\n      // expands the range on the left, but not the right.\n      updateLocationDataIfMissing(locationData) {\n        var base, ref1;\n        if (this.locationData && this.needsUpdatedStartLocation) {\n          this.locationData = Object.assign({}, this.locationData, {\n            first_line: locationData.first_line,\n            first_column: locationData.first_column,\n            range: [locationData.range[0], this.locationData.range[1]]\n          });\n          base = ((ref1 = this.variable) != null ? ref1.base : void 0) || this.variable;\n          if (base.needsUpdatedStartLocation) {\n            this.variable.locationData = Object.assign({}, this.variable.locationData, {\n              first_line: locationData.first_line,\n              first_column: locationData.first_column,\n              range: [locationData.range[0], this.variable.locationData.range[1]]\n            });\n            base.updateLocationDataIfMissing(locationData);\n          }\n          delete this.needsUpdatedStartLocation;\n        }\n        return super.updateLocationDataIfMissing(locationData);\n      }\n\n      // Tag this invocation as creating a new instance.\n      newInstance() {\n        var base, ref1;\n        base = ((ref1 = this.variable) != null ? ref1.base : void 0) || this.variable;\n        if (base instanceof Call && !base.isNew) {\n          base.newInstance();\n        } else {\n          this.isNew = true;\n        }\n        this.needsUpdatedStartLocation = true;\n        return this;\n      }\n\n      // Soaked chained invocations unfold into if/else ternary structures.\n      unfoldSoak(o) {\n        var call, ifn, j, left, len1, list, ref1, rite;\n        if (this.soak) {\n          if (this.variable instanceof Super) {\n            left = new Literal(this.variable.compile(o));\n            rite = new Value(left);\n            if (this.variable.accessor == null) {\n              this.variable.error(\"Unsupported reference to 'super'\");\n            }\n          } else {\n            if (ifn = unfoldSoak(o, this, 'variable')) {\n              return ifn;\n            }\n            [left, rite] = new Value(this.variable).cacheReference(o);\n          }\n          rite = new Call(rite, this.args);\n          rite.isNew = this.isNew;\n          left = new Literal(`typeof ${left.compile(o)} === \\\"function\\\"`);\n          return new If(left, new Value(rite), {\n            soak: true\n          });\n        }\n        call = this;\n        list = [];\n        while (true) {\n          if (call.variable instanceof Call) {\n            list.push(call);\n            call = call.variable;\n            continue;\n          }\n          if (!(call.variable instanceof Value)) {\n            break;\n          }\n          list.push(call);\n          if (!((call = call.variable.base) instanceof Call)) {\n            break;\n          }\n        }\n        ref1 = list.reverse();\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          call = ref1[j];\n          if (ifn) {\n            if (call.variable instanceof Call) {\n              call.variable = ifn;\n            } else {\n              call.variable.base = ifn;\n            }\n          }\n          ifn = unfoldSoak(o, call, 'variable');\n        }\n        return ifn;\n      }\n\n      // Compile a vanilla function call.\n      compileNode(o) {\n        var arg, argCode, argIndex, cache, compiledArgs, fragments, j, len1, ref1, ref2, ref3, ref4, varAccess;\n        this.checkForNewSuper();\n        if ((ref1 = this.variable) != null) {\n          ref1.front = this.front;\n        }\n        compiledArgs = [];\n        // If variable is `Accessor` fragments are cached and used later\n        // in `Value::compileNode` to ensure correct order of the compilation,\n        // and reuse of variables in the scope.\n        // Example:\n        // `a(x = 5).b(-> x = 6)` should compile in the same order as\n        // `a(x = 5); b(-> x = 6)`\n        // (see issue #4437, https://github.com/jashkenas/coffeescript/issues/4437)\n        varAccess = ((ref2 = this.variable) != null ? (ref3 = ref2.properties) != null ? ref3[0] : void 0 : void 0) instanceof Access;\n        argCode = (function() {\n          var j, len1, ref4, results1;\n          ref4 = this.args || [];\n          results1 = [];\n          for (j = 0, len1 = ref4.length; j < len1; j++) {\n            arg = ref4[j];\n            if (arg instanceof Code) {\n              results1.push(arg);\n            }\n          }\n          return results1;\n        }).call(this);\n        if (argCode.length > 0 && varAccess && !this.variable.base.cached) {\n          [cache] = this.variable.base.cache(o, LEVEL_ACCESS, function() {\n            return false;\n          });\n          this.variable.base.cached = cache;\n        }\n        ref4 = this.args;\n        for (argIndex = j = 0, len1 = ref4.length; j < len1; argIndex = ++j) {\n          arg = ref4[argIndex];\n          if (argIndex) {\n            compiledArgs.push(this.makeCode(\", \"));\n          }\n          compiledArgs.push(...(arg.compileToFragments(o, LEVEL_LIST)));\n        }\n        fragments = [];\n        if (this.isNew) {\n          fragments.push(this.makeCode('new '));\n        }\n        fragments.push(...this.variable.compileToFragments(o, LEVEL_ACCESS));\n        fragments.push(this.makeCode('('), ...compiledArgs, this.makeCode(')'));\n        return fragments;\n      }\n\n      checkForNewSuper() {\n        if (this.isNew) {\n          if (this.variable instanceof Super) {\n            return this.variable.error(\"Unsupported reference to 'super'\");\n          }\n        }\n      }\n\n      containsSoak() {\n        var ref1;\n        if (this.soak) {\n          return true;\n        }\n        if ((ref1 = this.variable) != null ? typeof ref1.containsSoak === \"function\" ? ref1.containsSoak() : void 0 : void 0) {\n          return true;\n        }\n        return false;\n      }\n\n      astNode(o) {\n        var ref1;\n        if (this.soak && this.variable instanceof Super && ((ref1 = o.scope.namedMethod()) != null ? ref1.ctor : void 0)) {\n          this.variable.error(\"Unsupported reference to 'super'\");\n        }\n        this.checkForNewSuper();\n        return super.astNode(o);\n      }\n\n      astType() {\n        if (this.isNew) {\n          return 'NewExpression';\n        } else if (this.containsSoak()) {\n          return 'OptionalCallExpression';\n        } else {\n          return 'CallExpression';\n        }\n      }\n\n      astProperties(o) {\n        var arg;\n        return {\n          callee: this.variable.ast(o, LEVEL_ACCESS),\n          arguments: (function() {\n            var j, len1, ref1, results1;\n            ref1 = this.args;\n            results1 = [];\n            for (j = 0, len1 = ref1.length; j < len1; j++) {\n              arg = ref1[j];\n              results1.push(arg.ast(o, LEVEL_LIST));\n            }\n            return results1;\n          }).call(this),\n          optional: !!this.soak,\n          implicit: !!this.implicit\n        };\n      }\n\n    };\n\n    Call.prototype.children = ['variable', 'args'];\n\n    return Call;\n\n  }).call(this);\n\n  //### Super\n\n  // Takes care of converting `super()` calls into calls against the prototype's\n  // function of the same name.\n  // When `expressions` are set the call will be compiled in such a way that the\n  // expressions are evaluated without altering the return value of the `SuperCall`\n  // expression.\n  exports.SuperCall = SuperCall = (function() {\n    class SuperCall extends Call {\n      isStatement(o) {\n        var ref1;\n        return ((ref1 = this.expressions) != null ? ref1.length : void 0) && o.level === LEVEL_TOP;\n      }\n\n      compileNode(o) {\n        var ref, ref1, replacement, superCall;\n        if (!((ref1 = this.expressions) != null ? ref1.length : void 0)) {\n          return super.compileNode(o);\n        }\n        superCall = new Literal(fragmentsToText(super.compileNode(o)));\n        replacement = new Block(this.expressions.slice());\n        if (o.level > LEVEL_TOP) {\n          // If we might be in an expression we need to cache and return the result\n          [superCall, ref] = superCall.cache(o, null, YES);\n          replacement.push(ref);\n        }\n        replacement.unshift(superCall);\n        return replacement.compileToFragments(o, o.level === LEVEL_TOP ? o.level : LEVEL_LIST);\n      }\n\n    };\n\n    SuperCall.prototype.children = Call.prototype.children.concat(['expressions']);\n\n    return SuperCall;\n\n  }).call(this);\n\n  exports.Super = Super = (function() {\n    class Super extends Base {\n      constructor(accessor, superLiteral) {\n        super();\n        this.accessor = accessor;\n        this.superLiteral = superLiteral;\n      }\n\n      compileNode(o) {\n        var fragments, method, name, nref, ref1, ref2, salvagedComments, variable;\n        this.checkInInstanceMethod(o);\n        method = o.scope.namedMethod();\n        if (!((method.ctor != null) || (this.accessor != null))) {\n          ({name, variable} = method);\n          if (name.shouldCache() || (name instanceof Index && name.index.isAssignable())) {\n            nref = new IdentifierLiteral(o.scope.parent.freeVariable('name'));\n            name.index = new Assign(nref, name.index);\n          }\n          this.accessor = nref != null ? new Index(nref) : name;\n        }\n        if ((ref1 = this.accessor) != null ? (ref2 = ref1.name) != null ? ref2.comments : void 0 : void 0) {\n          // A `super()` call gets compiled to e.g. `super.method()`, which means\n          // the `method` property name gets compiled for the first time here, and\n          // again when the `method:` property of the class gets compiled. Since\n          // this compilation happens first, comments attached to `method:` would\n          // get incorrectly output near `super.method()`, when we want them to\n          // get output on the second pass when `method:` is output. So set them\n          // aside during this compilation pass, and put them back on the object so\n          // that they’re there for the later compilation.\n          salvagedComments = this.accessor.name.comments;\n          delete this.accessor.name.comments;\n        }\n        fragments = (new Value(new Literal('super'), this.accessor ? [this.accessor] : [])).compileToFragments(o);\n        if (salvagedComments) {\n          attachCommentsToNode(salvagedComments, this.accessor.name);\n        }\n        return fragments;\n      }\n\n      checkInInstanceMethod(o) {\n        var method;\n        method = o.scope.namedMethod();\n        if (!(method != null ? method.isMethod : void 0)) {\n          return this.error('cannot use super outside of an instance method');\n        }\n      }\n\n      astNode(o) {\n        var ref1;\n        this.checkInInstanceMethod(o);\n        if (this.accessor != null) {\n          return (new Value(new Super().withLocationDataFrom((ref1 = this.superLiteral) != null ? ref1 : this), [this.accessor]).withLocationDataFrom(this)).ast(o);\n        }\n        return super.astNode(o);\n      }\n\n    };\n\n    Super.prototype.children = ['accessor'];\n\n    return Super;\n\n  }).call(this);\n\n  //### RegexWithInterpolations\n\n  // Regexes with interpolations are in fact just a variation of a `Call` (a\n  // `RegExp()` call to be precise) with a `StringWithInterpolations` inside.\n  exports.RegexWithInterpolations = RegexWithInterpolations = (function() {\n    class RegexWithInterpolations extends Base {\n      constructor(call1, {heregexCommentTokens: heregexCommentTokens = []} = {}) {\n        super();\n        this.call = call1;\n        this.heregexCommentTokens = heregexCommentTokens;\n      }\n\n      compileNode(o) {\n        return this.call.compileNode(o);\n      }\n\n      astType() {\n        return 'InterpolatedRegExpLiteral';\n      }\n\n      astProperties(o) {\n        var heregexCommentToken, ref1, ref2;\n        return {\n          interpolatedPattern: this.call.args[0].ast(o),\n          flags: (ref1 = (ref2 = this.call.args[1]) != null ? ref2.unwrap().originalValue : void 0) != null ? ref1 : '',\n          comments: (function() {\n            var j, len1, ref3, results1;\n            ref3 = this.heregexCommentTokens;\n            results1 = [];\n            for (j = 0, len1 = ref3.length; j < len1; j++) {\n              heregexCommentToken = ref3[j];\n              if (heregexCommentToken.here) {\n                results1.push(new HereComment(heregexCommentToken).ast(o));\n              } else {\n                results1.push(new LineComment(heregexCommentToken).ast(o));\n              }\n            }\n            return results1;\n          }).call(this)\n        };\n      }\n\n    };\n\n    RegexWithInterpolations.prototype.children = ['call'];\n\n    return RegexWithInterpolations;\n\n  }).call(this);\n\n  //### TaggedTemplateCall\n  exports.TaggedTemplateCall = TaggedTemplateCall = class TaggedTemplateCall extends Call {\n    constructor(variable, arg, soak) {\n      if (arg instanceof StringLiteral) {\n        arg = StringWithInterpolations.fromStringLiteral(arg);\n      }\n      super(variable, [arg], soak);\n    }\n\n    compileNode(o) {\n      return this.variable.compileToFragments(o, LEVEL_ACCESS).concat(this.args[0].compileToFragments(o, LEVEL_LIST));\n    }\n\n    astType() {\n      return 'TaggedTemplateExpression';\n    }\n\n    astProperties(o) {\n      return {\n        tag: this.variable.ast(o, LEVEL_ACCESS),\n        quasi: this.args[0].ast(o, LEVEL_LIST)\n      };\n    }\n\n  };\n\n  //### Extends\n\n  // Node to extend an object's prototype with an ancestor object.\n  // After `goog.inherits` from the\n  // [Closure Library](https://github.com/google/closure-library/blob/master/closure/goog/base.js).\n  exports.Extends = Extends = (function() {\n    class Extends extends Base {\n      constructor(child1, parent1) {\n        super();\n        this.child = child1;\n        this.parent = parent1;\n      }\n\n      // Hooks one constructor into another's prototype chain.\n      compileToFragments(o) {\n        return new Call(new Value(new Literal(utility('extend', o))), [this.child, this.parent]).compileToFragments(o);\n      }\n\n    };\n\n    Extends.prototype.children = ['child', 'parent'];\n\n    return Extends;\n\n  }).call(this);\n\n  //### Access\n\n  // A `.` access into a property of a value, or the `::` shorthand for\n  // an access into the object's prototype.\n  exports.Access = Access = (function() {\n    class Access extends Base {\n      constructor(name1, {\n          soak: soak1,\n          shorthand\n        } = {}) {\n        super();\n        this.name = name1;\n        this.soak = soak1;\n        this.shorthand = shorthand;\n      }\n\n      compileToFragments(o) {\n        var name, node;\n        name = this.name.compileToFragments(o);\n        node = this.name.unwrap();\n        if (node instanceof PropertyName) {\n          return [this.makeCode('.'), ...name];\n        } else {\n          return [this.makeCode('['), ...name, this.makeCode(']')];\n        }\n      }\n\n      astNode(o) {\n        // Babel doesn’t have an AST node for `Access`, but rather just includes\n        // this Access node’s child `name` Identifier node as the `property` of\n        // the `MemberExpression` node.\n        return this.name.ast(o);\n      }\n\n    };\n\n    Access.prototype.children = ['name'];\n\n    Access.prototype.shouldCache = NO;\n\n    return Access;\n\n  }).call(this);\n\n  //### Index\n\n  // A `[ ... ]` indexed access into an array or object.\n  exports.Index = Index = (function() {\n    class Index extends Base {\n      constructor(index1) {\n        super();\n        this.index = index1;\n      }\n\n      compileToFragments(o) {\n        return [].concat(this.makeCode(\"[\"), this.index.compileToFragments(o, LEVEL_PAREN), this.makeCode(\"]\"));\n      }\n\n      shouldCache() {\n        return this.index.shouldCache();\n      }\n\n      astNode(o) {\n        // Babel doesn’t have an AST node for `Index`, but rather just includes\n        // this Index node’s child `index` Identifier node as the `property` of\n        // the `MemberExpression` node. The fact that the `MemberExpression`’s\n        // `property` is an Index means that `computed` is `true` for the\n        // `MemberExpression`.\n        return this.index.ast(o);\n      }\n\n    };\n\n    Index.prototype.children = ['index'];\n\n    return Index;\n\n  }).call(this);\n\n  //### Range\n\n  // A range literal. Ranges can be used to extract portions (slices) of arrays,\n  // to specify a range for comprehensions, or as a value, to be expanded into the\n  // corresponding array of integers at runtime.\n  exports.Range = Range = (function() {\n    class Range extends Base {\n      constructor(from1, to1, tag) {\n        super();\n        this.from = from1;\n        this.to = to1;\n        this.exclusive = tag === 'exclusive';\n        this.equals = this.exclusive ? '' : '=';\n      }\n\n      // Compiles the range's source variables -- where it starts and where it ends.\n      // But only if they need to be cached to avoid double evaluation.\n      compileVariables(o) {\n        var shouldCache, step;\n        o = merge(o, {\n          top: true\n        });\n        shouldCache = del(o, 'shouldCache');\n        [this.fromC, this.fromVar] = this.cacheToCodeFragments(this.from.cache(o, LEVEL_LIST, shouldCache));\n        [this.toC, this.toVar] = this.cacheToCodeFragments(this.to.cache(o, LEVEL_LIST, shouldCache));\n        if (step = del(o, 'step')) {\n          [this.step, this.stepVar] = this.cacheToCodeFragments(step.cache(o, LEVEL_LIST, shouldCache));\n        }\n        this.fromNum = this.from.isNumber() ? parseNumber(this.fromVar) : null;\n        this.toNum = this.to.isNumber() ? parseNumber(this.toVar) : null;\n        return this.stepNum = (step != null ? step.isNumber() : void 0) ? parseNumber(this.stepVar) : null;\n      }\n\n      // When compiled normally, the range returns the contents of the *for loop*\n      // needed to iterate over the values in the range. Used by comprehensions.\n      compileNode(o) {\n        var cond, condPart, from, gt, idx, idxName, known, lowerBound, lt, namedIndex, ref1, ref2, stepCond, stepNotZero, stepPart, to, upperBound, varPart;\n        if (!this.fromVar) {\n          this.compileVariables(o);\n        }\n        if (!o.index) {\n          return this.compileArray(o);\n        }\n        // Set up endpoints.\n        known = (this.fromNum != null) && (this.toNum != null);\n        idx = del(o, 'index');\n        idxName = del(o, 'name');\n        namedIndex = idxName && idxName !== idx;\n        varPart = known && !namedIndex ? `var ${idx} = ${this.fromC}` : `${idx} = ${this.fromC}`;\n        if (this.toC !== this.toVar) {\n          varPart += `, ${this.toC}`;\n        }\n        if (this.step !== this.stepVar) {\n          varPart += `, ${this.step}`;\n        }\n        [lt, gt] = [`${idx} <${this.equals}`, `${idx} >${this.equals}`];\n        // Generate the condition.\n        [from, to] = [this.fromNum, this.toNum];\n        // Always check if the `step` isn't zero to avoid the infinite loop.\n        stepNotZero = `${(ref1 = this.stepNum) != null ? ref1 : this.stepVar} !== 0`;\n        stepCond = `${(ref2 = this.stepNum) != null ? ref2 : this.stepVar} > 0`;\n        lowerBound = `${lt} ${known ? to : this.toVar}`;\n        upperBound = `${gt} ${known ? to : this.toVar}`;\n        condPart = this.step != null ? (this.stepNum != null) && this.stepNum !== 0 ? this.stepNum > 0 ? `${lowerBound}` : `${upperBound}` : `${stepNotZero} && (${stepCond} ? ${lowerBound} : ${upperBound})` : known ? `${from <= to ? lt : gt} ${to}` : `(${this.fromVar} <= ${this.toVar} ? ${lowerBound} : ${upperBound})`;\n        cond = this.stepVar ? `${this.stepVar} > 0` : `${this.fromVar} <= ${this.toVar}`;\n        // Generate the step.\n        stepPart = this.stepVar ? `${idx} += ${this.stepVar}` : known ? namedIndex ? from <= to ? `++${idx}` : `--${idx}` : from <= to ? `${idx}++` : `${idx}--` : namedIndex ? `${cond} ? ++${idx} : --${idx}` : `${cond} ? ${idx}++ : ${idx}--`;\n        if (namedIndex) {\n          varPart = `${idxName} = ${varPart}`;\n        }\n        if (namedIndex) {\n          stepPart = `${idxName} = ${stepPart}`;\n        }\n        // The final loop body.\n        return [this.makeCode(`${varPart}; ${condPart}; ${stepPart}`)];\n      }\n\n      // When used as a value, expand the range into the equivalent array.\n      compileArray(o) {\n        var args, body, cond, hasArgs, i, idt, known, post, pre, range, ref1, ref2, result, vars;\n        known = (this.fromNum != null) && (this.toNum != null);\n        if (known && Math.abs(this.fromNum - this.toNum) <= 20) {\n          range = (function() {\n            var results1 = [];\n            for (var j = ref1 = this.fromNum, ref2 = this.toNum; ref1 <= ref2 ? j <= ref2 : j >= ref2; ref1 <= ref2 ? j++ : j--){ results1.push(j); }\n            return results1;\n          }).apply(this);\n          if (this.exclusive) {\n            range.pop();\n          }\n          return [this.makeCode(`[${range.join(', ')}]`)];\n        }\n        idt = this.tab + TAB;\n        i = o.scope.freeVariable('i', {\n          single: true,\n          reserve: false\n        });\n        result = o.scope.freeVariable('results', {\n          reserve: false\n        });\n        pre = `\\n${idt}var ${result} = [];`;\n        if (known) {\n          o.index = i;\n          body = fragmentsToText(this.compileNode(o));\n        } else {\n          vars = `${i} = ${this.fromC}` + (this.toC !== this.toVar ? `, ${this.toC}` : '');\n          cond = `${this.fromVar} <= ${this.toVar}`;\n          body = `var ${vars}; ${cond} ? ${i} <${this.equals} ${this.toVar} : ${i} >${this.equals} ${this.toVar}; ${cond} ? ${i}++ : ${i}--`;\n        }\n        post = `{ ${result}.push(${i}); }\\n${idt}return ${result};\\n${o.indent}`;\n        hasArgs = function(node) {\n          return node != null ? node.contains(isLiteralArguments) : void 0;\n        };\n        if (hasArgs(this.from) || hasArgs(this.to)) {\n          args = ', arguments';\n        }\n        return [this.makeCode(`(function() {${pre}\\n${idt}for (${body})${post}}).apply(this${args != null ? args : ''})`)];\n      }\n\n      astProperties(o) {\n        var ref1, ref2, ref3, ref4;\n        return {\n          from: (ref1 = (ref2 = this.from) != null ? ref2.ast(o) : void 0) != null ? ref1 : null,\n          to: (ref3 = (ref4 = this.to) != null ? ref4.ast(o) : void 0) != null ? ref3 : null,\n          exclusive: this.exclusive\n        };\n      }\n\n    };\n\n    Range.prototype.children = ['from', 'to'];\n\n    return Range;\n\n  }).call(this);\n\n  //### Slice\n\n  // An array slice literal. Unlike JavaScript’s `Array#slice`, the second parameter\n  // specifies the index of the end of the slice, just as the first parameter\n  // is the index of the beginning.\n  exports.Slice = Slice = (function() {\n    class Slice extends Base {\n      constructor(range1) {\n        super();\n        this.range = range1;\n      }\n\n      // We have to be careful when trying to slice through the end of the array,\n      // `9e9` is used because not all implementations respect `undefined` or `1/0`.\n      // `9e9` should be safe because `9e9` > `2**32`, the max array length.\n      compileNode(o) {\n        var compiled, compiledText, from, fromCompiled, to, toStr;\n        ({to, from} = this.range);\n        // Handle an expression in the property access, e.g. `a[!b in c..]`.\n        if (from != null ? from.shouldCache() : void 0) {\n          from = new Value(new Parens(from));\n        }\n        if (to != null ? to.shouldCache() : void 0) {\n          to = new Value(new Parens(to));\n        }\n        fromCompiled = (from != null ? from.compileToFragments(o, LEVEL_PAREN) : void 0) || [this.makeCode('0')];\n        if (to) {\n          compiled = to.compileToFragments(o, LEVEL_PAREN);\n          compiledText = fragmentsToText(compiled);\n          if (!(!this.range.exclusive && +compiledText === -1)) {\n            toStr = ', ' + (this.range.exclusive ? compiledText : to.isNumber() ? `${+compiledText + 1}` : (compiled = to.compileToFragments(o, LEVEL_ACCESS), `+${fragmentsToText(compiled)} + 1 || 9e9`));\n          }\n        }\n        return [this.makeCode(`.slice(${fragmentsToText(fromCompiled)}${toStr || ''})`)];\n      }\n\n      astNode(o) {\n        return this.range.ast(o);\n      }\n\n    };\n\n    Slice.prototype.children = ['range'];\n\n    return Slice;\n\n  }).call(this);\n\n  //### Obj\n\n  // An object literal, nothing fancy.\n  exports.Obj = Obj = (function() {\n    class Obj extends Base {\n      constructor(props, generated = false) {\n        super();\n        this.generated = generated;\n        this.objects = this.properties = props || [];\n      }\n\n      isAssignable(opts) {\n        var j, len1, message, prop, ref1, ref2;\n        ref1 = this.properties;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          prop = ref1[j];\n          // Check for reserved words.\n          message = isUnassignable(prop.unwrapAll().value);\n          if (message) {\n            prop.error(message);\n          }\n          if (prop instanceof Assign && prop.context === 'object' && !(((ref2 = prop.value) != null ? ref2.base : void 0) instanceof Arr)) {\n            prop = prop.value;\n          }\n          if (!prop.isAssignable(opts)) {\n            return false;\n          }\n        }\n        return true;\n      }\n\n      shouldCache() {\n        return !this.isAssignable();\n      }\n\n      // Check if object contains splat.\n      hasSplat() {\n        var j, len1, prop, ref1;\n        ref1 = this.properties;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          prop = ref1[j];\n          if (prop instanceof Splat) {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      // Move rest property to the end of the list.\n      // `{a, rest..., b} = obj` -> `{a, b, rest...} = obj`\n      // `foo = ({a, rest..., b}) ->` -> `foo = {a, b, rest...}) ->`\n      reorderProperties() {\n        var props, splatProp, splatProps;\n        props = this.properties;\n        splatProps = this.getAndCheckSplatProps();\n        splatProp = props.splice(splatProps[0], 1);\n        return this.objects = this.properties = [].concat(props, splatProp);\n      }\n\n      compileNode(o) {\n        var answer, i, idt, indent, isCompact, j, join, k, key, l, lastNode, len1, len2, len3, node, prop, props, ref1, value;\n        if (this.hasSplat() && this.lhs) {\n          this.reorderProperties();\n        }\n        props = this.properties;\n        if (this.generated) {\n          for (j = 0, len1 = props.length; j < len1; j++) {\n            node = props[j];\n            if (node instanceof Value) {\n              node.error('cannot have an implicit value in an implicit object');\n            }\n          }\n        }\n        idt = o.indent += TAB;\n        lastNode = this.lastNode(this.properties);\n        // If this object is the left-hand side of an assignment, all its children\n        // are too.\n        this.propagateLhs();\n        isCompact = true;\n        ref1 = this.properties;\n        for (k = 0, len2 = ref1.length; k < len2; k++) {\n          prop = ref1[k];\n          if (prop instanceof Assign && prop.context === 'object') {\n            isCompact = false;\n          }\n        }\n        answer = [];\n        answer.push(this.makeCode(isCompact ? '' : '\\n'));\n        for (i = l = 0, len3 = props.length; l < len3; i = ++l) {\n          prop = props[i];\n          join = i === props.length - 1 ? '' : isCompact ? ', ' : prop === lastNode ? '\\n' : ',\\n';\n          indent = isCompact ? '' : idt;\n          key = prop instanceof Assign && prop.context === 'object' ? prop.variable : prop instanceof Assign ? (!this.lhs ? prop.operatorToken.error(`unexpected ${prop.operatorToken.value}`) : void 0, prop.variable) : prop;\n          if (key instanceof Value && key.hasProperties()) {\n            if (prop.context === 'object' || !key.this) {\n              key.error('invalid object key');\n            }\n            key = key.properties[0].name;\n            prop = new Assign(key, prop, 'object');\n          }\n          if (key === prop) {\n            if (prop.shouldCache()) {\n              [key, value] = prop.base.cache(o);\n              if (key instanceof IdentifierLiteral) {\n                key = new PropertyName(key.value);\n              }\n              prop = new Assign(key, value, 'object');\n            } else if (key instanceof Value && key.base instanceof ComputedPropertyName) {\n              // `{ [foo()] }` output as `{ [ref = foo()]: ref }`.\n              if (prop.base.value.shouldCache()) {\n                [key, value] = prop.base.value.cache(o);\n                if (key instanceof IdentifierLiteral) {\n                  key = new ComputedPropertyName(key.value);\n                }\n                prop = new Assign(key, value, 'object');\n              } else {\n                // `{ [expression] }` output as `{ [expression]: expression }`.\n                prop = new Assign(key, prop.base.value, 'object');\n              }\n            } else if (!(typeof prop.bareLiteral === \"function\" ? prop.bareLiteral(IdentifierLiteral) : void 0) && !(prop instanceof Splat)) {\n              prop = new Assign(prop, prop, 'object');\n            }\n          }\n          if (indent) {\n            answer.push(this.makeCode(indent));\n          }\n          answer.push(...prop.compileToFragments(o, LEVEL_TOP));\n          if (join) {\n            answer.push(this.makeCode(join));\n          }\n        }\n        answer.push(this.makeCode(isCompact ? '' : `\\n${this.tab}`));\n        answer = this.wrapInBraces(answer);\n        if (this.front) {\n          return this.wrapInParentheses(answer);\n        } else {\n          return answer;\n        }\n      }\n\n      getAndCheckSplatProps() {\n        var i, prop, props, splatProps;\n        if (!(this.hasSplat() && this.lhs)) {\n          return;\n        }\n        props = this.properties;\n        splatProps = (function() {\n          var j, len1, results1;\n          results1 = [];\n          for (i = j = 0, len1 = props.length; j < len1; i = ++j) {\n            prop = props[i];\n            if (prop instanceof Splat) {\n              results1.push(i);\n            }\n          }\n          return results1;\n        })();\n        if ((splatProps != null ? splatProps.length : void 0) > 1) {\n          props[splatProps[1]].error(\"multiple spread elements are disallowed\");\n        }\n        return splatProps;\n      }\n\n      assigns(name) {\n        var j, len1, prop, ref1;\n        ref1 = this.properties;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          prop = ref1[j];\n          if (prop.assigns(name)) {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      eachName(iterator) {\n        var j, len1, prop, ref1, results1;\n        ref1 = this.properties;\n        results1 = [];\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          prop = ref1[j];\n          if (prop instanceof Assign && prop.context === 'object') {\n            prop = prop.value;\n          }\n          prop = prop.unwrapAll();\n          if (prop.eachName != null) {\n            results1.push(prop.eachName(iterator));\n          } else {\n            results1.push(void 0);\n          }\n        }\n        return results1;\n      }\n\n      // Convert “bare” properties to `ObjectProperty`s (or `Splat`s).\n      expandProperty(property) {\n        var context, key, operatorToken, variable;\n        ({variable, context, operatorToken} = property);\n        key = property instanceof Assign && context === 'object' ? variable : property instanceof Assign ? (!this.lhs ? operatorToken.error(`unexpected ${operatorToken.value}`) : void 0, variable) : property;\n        if (key instanceof Value && key.hasProperties()) {\n          if (!(context !== 'object' && key.this)) {\n            key.error('invalid object key');\n          }\n          if (property instanceof Assign) {\n            return new ObjectProperty({\n              fromAssign: property\n            });\n          } else {\n            return new ObjectProperty({\n              key: property\n            });\n          }\n        }\n        if (key !== property) {\n          return new ObjectProperty({\n            fromAssign: property\n          });\n        }\n        if (property instanceof Splat) {\n          return property;\n        }\n        return new ObjectProperty({\n          key: property\n        });\n      }\n\n      expandProperties() {\n        var j, len1, property, ref1, results1;\n        ref1 = this.properties;\n        results1 = [];\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          property = ref1[j];\n          results1.push(this.expandProperty(property));\n        }\n        return results1;\n      }\n\n      propagateLhs(setLhs) {\n        var j, len1, property, ref1, results1, unwrappedValue, value;\n        if (setLhs) {\n          this.lhs = true;\n        }\n        if (!this.lhs) {\n          return;\n        }\n        ref1 = this.properties;\n        results1 = [];\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          property = ref1[j];\n          if (property instanceof Assign && property.context === 'object') {\n            ({value} = property);\n            unwrappedValue = value.unwrapAll();\n            if (unwrappedValue instanceof Arr || unwrappedValue instanceof Obj) {\n              results1.push(unwrappedValue.propagateLhs(true));\n            } else if (unwrappedValue instanceof Assign) {\n              results1.push(unwrappedValue.nestedLhs = true);\n            } else {\n              results1.push(void 0);\n            }\n          } else if (property instanceof Assign) {\n            // Shorthand property with default, e.g. `{a = 1} = b`.\n            results1.push(property.nestedLhs = true);\n          } else if (property instanceof Splat) {\n            results1.push(property.propagateLhs(true));\n          } else {\n            results1.push(void 0);\n          }\n        }\n        return results1;\n      }\n\n      astNode(o) {\n        this.getAndCheckSplatProps();\n        return super.astNode(o);\n      }\n\n      astType() {\n        if (this.lhs) {\n          return 'ObjectPattern';\n        } else {\n          return 'ObjectExpression';\n        }\n      }\n\n      astProperties(o) {\n        var property;\n        return {\n          implicit: !!this.generated,\n          properties: (function() {\n            var j, len1, ref1, results1;\n            ref1 = this.expandProperties();\n            results1 = [];\n            for (j = 0, len1 = ref1.length; j < len1; j++) {\n              property = ref1[j];\n              results1.push(property.ast(o));\n            }\n            return results1;\n          }).call(this)\n        };\n      }\n\n    };\n\n    Obj.prototype.children = ['properties'];\n\n    return Obj;\n\n  }).call(this);\n\n  exports.ObjectProperty = ObjectProperty = class ObjectProperty extends Base {\n    constructor({key, fromAssign}) {\n      var context, value;\n      super();\n      if (fromAssign) {\n        ({\n          variable: this.key,\n          value,\n          context\n        } = fromAssign);\n        if (context === 'object') {\n          // All non-shorthand properties (i.e. includes `:`).\n          this.value = value;\n        } else {\n          // Left-hand-side shorthand with default e.g. `{a = 1} = b`.\n          this.value = fromAssign;\n          this.shorthand = true;\n        }\n        this.locationData = fromAssign.locationData;\n      } else {\n        // Shorthand without default e.g. `{a}` or `{@a}` or `{[a]}`.\n        this.key = key;\n        this.shorthand = true;\n        this.locationData = key.locationData;\n      }\n    }\n\n    astProperties(o) {\n      var isComputedPropertyName, keyAst, ref1, ref2;\n      isComputedPropertyName = (this.key instanceof Value && this.key.base instanceof ComputedPropertyName) || this.key.unwrap() instanceof StringWithInterpolations;\n      keyAst = this.key.ast(o, LEVEL_LIST);\n      return {\n        key: (keyAst != null ? keyAst.declaration : void 0) ? Object.assign({}, keyAst, {\n          declaration: false\n        }) : keyAst,\n        value: (ref1 = (ref2 = this.value) != null ? ref2.ast(o, LEVEL_LIST) : void 0) != null ? ref1 : keyAst,\n        shorthand: !!this.shorthand,\n        computed: !!isComputedPropertyName,\n        method: false\n      };\n    }\n\n  };\n\n  //### Arr\n\n  // An array literal.\n  exports.Arr = Arr = (function() {\n    class Arr extends Base {\n      constructor(objs, lhs1 = false) {\n        super();\n        this.lhs = lhs1;\n        this.objects = objs || [];\n        this.propagateLhs();\n      }\n\n      hasElision() {\n        var j, len1, obj, ref1;\n        ref1 = this.objects;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          obj = ref1[j];\n          if (obj instanceof Elision) {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      isAssignable(opts) {\n        var allowEmptyArray, allowExpansion, allowNontrailingSplat, i, j, len1, obj, ref1;\n        ({allowExpansion, allowNontrailingSplat, allowEmptyArray = false} = opts != null ? opts : {});\n        if (!this.objects.length) {\n          return allowEmptyArray;\n        }\n        ref1 = this.objects;\n        for (i = j = 0, len1 = ref1.length; j < len1; i = ++j) {\n          obj = ref1[i];\n          if (!allowNontrailingSplat && obj instanceof Splat && i + 1 !== this.objects.length) {\n            return false;\n          }\n          if (!((allowExpansion && obj instanceof Expansion) || (obj.isAssignable(opts) && (!obj.isAtomic || obj.isAtomic())))) {\n            return false;\n          }\n        }\n        return true;\n      }\n\n      shouldCache() {\n        return !this.isAssignable();\n      }\n\n      compileNode(o) {\n        var answer, compiledObjs, fragment, fragmentIndex, fragmentIsElision, fragments, includesLineCommentsOnNonFirstElement, index, j, k, l, len1, len2, len3, len4, len5, obj, objIndex, olen, p, passedElision, q, ref1, ref2, unwrappedObj;\n        if (!this.objects.length) {\n          return [this.makeCode('[]')];\n        }\n        o.indent += TAB;\n        fragmentIsElision = function([fragment]) {\n          return fragment.type === 'Elision' && fragment.code.trim() === ',';\n        };\n        // Detect if `Elision`s at the beginning of the array are processed (e.g. [, , , a]).\n        passedElision = false;\n        answer = [];\n        ref1 = this.objects;\n        for (objIndex = j = 0, len1 = ref1.length; j < len1; objIndex = ++j) {\n          obj = ref1[objIndex];\n          unwrappedObj = obj.unwrapAll();\n          // Let `compileCommentFragments` know to intersperse block comments\n          // into the fragments created when compiling this array.\n          if (unwrappedObj.comments && unwrappedObj.comments.filter(function(comment) {\n            return !comment.here;\n          }).length === 0) {\n            unwrappedObj.includeCommentFragments = YES;\n          }\n        }\n        compiledObjs = (function() {\n          var k, len2, ref2, results1;\n          ref2 = this.objects;\n          results1 = [];\n          for (k = 0, len2 = ref2.length; k < len2; k++) {\n            obj = ref2[k];\n            results1.push(obj.compileToFragments(o, LEVEL_LIST));\n          }\n          return results1;\n        }).call(this);\n        olen = compiledObjs.length;\n        // If `compiledObjs` includes newlines, we will output this as a multiline\n        // array (i.e. with a newline and indentation after the `[`). If an element\n        // contains line comments, that should also trigger multiline output since\n        // by definition line comments will introduce newlines into our output.\n        // The exception is if only the first element has line comments; in that\n        // case, output as the compact form if we otherwise would have, so that the\n        // first element’s line comments get output before or after the array.\n        includesLineCommentsOnNonFirstElement = false;\n        for (index = k = 0, len2 = compiledObjs.length; k < len2; index = ++k) {\n          fragments = compiledObjs[index];\n          for (l = 0, len3 = fragments.length; l < len3; l++) {\n            fragment = fragments[l];\n            if (fragment.isHereComment) {\n              fragment.code = fragment.code.trim();\n            } else if (index !== 0 && includesLineCommentsOnNonFirstElement === false && hasLineComments(fragment)) {\n              includesLineCommentsOnNonFirstElement = true;\n            }\n          }\n          // Add ', ' if all `Elisions` from the beginning of the array are processed (e.g. [, , , a]) and\n          // element isn't `Elision` or last element is `Elision` (e.g. [a,,b,,])\n          if (index !== 0 && passedElision && (!fragmentIsElision(fragments) || index === olen - 1)) {\n            answer.push(this.makeCode(', '));\n          }\n          passedElision = passedElision || !fragmentIsElision(fragments);\n          answer.push(...fragments);\n        }\n        if (includesLineCommentsOnNonFirstElement || indexOf.call(fragmentsToText(answer), '\\n') >= 0) {\n          for (fragmentIndex = p = 0, len4 = answer.length; p < len4; fragmentIndex = ++p) {\n            fragment = answer[fragmentIndex];\n            if (fragment.isHereComment) {\n              fragment.code = `${multident(fragment.code, o.indent, false)}\\n${o.indent}`;\n            } else if (fragment.code === ', ' && !(fragment != null ? fragment.isElision : void 0) && ((ref2 = fragment.type) !== 'StringLiteral' && ref2 !== 'StringWithInterpolations')) {\n              fragment.code = `,\\n${o.indent}`;\n            }\n          }\n          answer.unshift(this.makeCode(`[\\n${o.indent}`));\n          answer.push(this.makeCode(`\\n${this.tab}]`));\n        } else {\n          for (q = 0, len5 = answer.length; q < len5; q++) {\n            fragment = answer[q];\n            if (fragment.isHereComment) {\n              fragment.code = `${fragment.code} `;\n            }\n          }\n          answer.unshift(this.makeCode('['));\n          answer.push(this.makeCode(']'));\n        }\n        return answer;\n      }\n\n      assigns(name) {\n        var j, len1, obj, ref1;\n        ref1 = this.objects;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          obj = ref1[j];\n          if (obj.assigns(name)) {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      eachName(iterator) {\n        var j, len1, obj, ref1, results1;\n        ref1 = this.objects;\n        results1 = [];\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          obj = ref1[j];\n          obj = obj.unwrapAll();\n          results1.push(obj.eachName(iterator));\n        }\n        return results1;\n      }\n\n      // If this array is the left-hand side of an assignment, all its children\n      // are too.\n      propagateLhs(setLhs) {\n        var j, len1, object, ref1, results1, unwrappedObject;\n        if (setLhs) {\n          this.lhs = true;\n        }\n        if (!this.lhs) {\n          return;\n        }\n        ref1 = this.objects;\n        results1 = [];\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          object = ref1[j];\n          if (object instanceof Splat || object instanceof Expansion) {\n            object.lhs = true;\n          }\n          unwrappedObject = object.unwrapAll();\n          if (unwrappedObject instanceof Arr || unwrappedObject instanceof Obj) {\n            results1.push(unwrappedObject.propagateLhs(true));\n          } else if (unwrappedObject instanceof Assign) {\n            results1.push(unwrappedObject.nestedLhs = true);\n          } else {\n            results1.push(void 0);\n          }\n        }\n        return results1;\n      }\n\n      astType() {\n        if (this.lhs) {\n          return 'ArrayPattern';\n        } else {\n          return 'ArrayExpression';\n        }\n      }\n\n      astProperties(o) {\n        var object;\n        return {\n          elements: (function() {\n            var j, len1, ref1, results1;\n            ref1 = this.objects;\n            results1 = [];\n            for (j = 0, len1 = ref1.length; j < len1; j++) {\n              object = ref1[j];\n              results1.push(object.ast(o, LEVEL_LIST));\n            }\n            return results1;\n          }).call(this)\n        };\n      }\n\n    };\n\n    Arr.prototype.children = ['objects'];\n\n    return Arr;\n\n  }).call(this);\n\n  //### Class\n\n  // The CoffeeScript class definition.\n  // Initialize a **Class** with its name, an optional superclass, and a body.\n  exports.Class = Class = (function() {\n    class Class extends Base {\n      constructor(variable1, parent1, body1) {\n        super();\n        this.variable = variable1;\n        this.parent = parent1;\n        this.body = body1;\n        if (this.body == null) {\n          this.body = new Block();\n          this.hasGeneratedBody = true;\n        }\n      }\n\n      compileNode(o) {\n        var executableBody, node, parentName;\n        this.name = this.determineName();\n        executableBody = this.walkBody(o);\n        if (this.parent instanceof Value && !this.parent.hasProperties()) {\n          // Special handling to allow `class expr.A extends A` declarations\n          parentName = this.parent.base.value;\n        }\n        this.hasNameClash = (this.name != null) && this.name === parentName;\n        node = this;\n        if (executableBody || this.hasNameClash) {\n          node = new ExecutableClassBody(node, executableBody);\n        } else if ((this.name == null) && o.level === LEVEL_TOP) {\n          // Anonymous classes are only valid in expressions\n          node = new Parens(node);\n        }\n        if (this.boundMethods.length && this.parent) {\n          if (this.variable == null) {\n            this.variable = new IdentifierLiteral(o.scope.freeVariable('_class'));\n          }\n          if (this.variableRef == null) {\n            [this.variable, this.variableRef] = this.variable.cache(o);\n          }\n        }\n        if (this.variable) {\n          node = new Assign(this.variable, node, null, {moduleDeclaration: this.moduleDeclaration});\n        }\n        this.compileNode = this.compileClassDeclaration;\n        try {\n          return node.compileToFragments(o);\n        } finally {\n          delete this.compileNode;\n        }\n      }\n\n      compileClassDeclaration(o) {\n        var ref1, ref2, result;\n        if (this.externalCtor || this.boundMethods.length) {\n          if (this.ctor == null) {\n            this.ctor = this.makeDefaultConstructor();\n          }\n        }\n        if ((ref1 = this.ctor) != null) {\n          ref1.noReturn = true;\n        }\n        if (this.boundMethods.length) {\n          this.proxyBoundMethods();\n        }\n        o.indent += TAB;\n        result = [];\n        result.push(this.makeCode(\"class \"));\n        if (this.name) {\n          result.push(this.makeCode(this.name));\n        }\n        if (((ref2 = this.variable) != null ? ref2.comments : void 0) != null) {\n          this.compileCommentFragments(o, this.variable, result);\n        }\n        if (this.name) {\n          result.push(this.makeCode(' '));\n        }\n        if (this.parent) {\n          result.push(this.makeCode('extends '), ...this.parent.compileToFragments(o), this.makeCode(' '));\n        }\n        result.push(this.makeCode('{'));\n        if (!this.body.isEmpty()) {\n          this.body.spaced = true;\n          result.push(this.makeCode('\\n'));\n          result.push(...this.body.compileToFragments(o, LEVEL_TOP));\n          result.push(this.makeCode(`\\n${this.tab}`));\n        }\n        result.push(this.makeCode('}'));\n        return result;\n      }\n\n      // Figure out the appropriate name for this class\n      determineName() {\n        var message, name, node, ref1, tail;\n        if (!this.variable) {\n          return null;\n        }\n        ref1 = this.variable.properties, [tail] = slice1.call(ref1, -1);\n        node = tail ? tail instanceof Access && tail.name : this.variable.base;\n        if (!(node instanceof IdentifierLiteral || node instanceof PropertyName)) {\n          return null;\n        }\n        name = node.value;\n        if (!tail) {\n          message = isUnassignable(name);\n          if (message) {\n            this.variable.error(message);\n          }\n        }\n        if (indexOf.call(JS_FORBIDDEN, name) >= 0) {\n          return `_${name}`;\n        } else {\n          return name;\n        }\n      }\n\n      walkBody(o) {\n        var assign, end, executableBody, expression, expressions, exprs, i, initializer, initializerExpression, j, k, len1, len2, method, properties, pushSlice, ref1, start;\n        this.ctor = null;\n        this.boundMethods = [];\n        executableBody = null;\n        initializer = [];\n        ({expressions} = this.body);\n        i = 0;\n        ref1 = expressions.slice();\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          expression = ref1[j];\n          if (expression instanceof Value && expression.isObject(true)) {\n            ({properties} = expression.base);\n            exprs = [];\n            end = 0;\n            start = 0;\n            pushSlice = function() {\n              if (end > start) {\n                return exprs.push(new Value(new Obj(properties.slice(start, end), true)));\n              }\n            };\n            while (assign = properties[end]) {\n              if (initializerExpression = this.addInitializerExpression(assign, o)) {\n                pushSlice();\n                exprs.push(initializerExpression);\n                initializer.push(initializerExpression);\n                start = end + 1;\n              }\n              end++;\n            }\n            pushSlice();\n            splice.apply(expressions, [i, i - i + 1].concat(exprs)), exprs;\n            i += exprs.length;\n          } else {\n            if (initializerExpression = this.addInitializerExpression(expression, o)) {\n              initializer.push(initializerExpression);\n              expressions[i] = initializerExpression;\n            }\n            i += 1;\n          }\n        }\n        for (k = 0, len2 = initializer.length; k < len2; k++) {\n          method = initializer[k];\n          if (method instanceof Code) {\n            if (method.ctor) {\n              if (this.ctor) {\n                method.error('Cannot define more than one constructor in a class');\n              }\n              this.ctor = method;\n            } else if (method.isStatic && method.bound) {\n              method.context = this.name;\n            } else if (method.bound) {\n              this.boundMethods.push(method);\n            }\n          }\n        }\n        if (!o.compiling) {\n          return;\n        }\n        if (initializer.length !== expressions.length) {\n          this.body.expressions = (function() {\n            var l, len3, results1;\n            results1 = [];\n            for (l = 0, len3 = initializer.length; l < len3; l++) {\n              expression = initializer[l];\n              results1.push(expression.hoist());\n            }\n            return results1;\n          })();\n          return new Block(expressions);\n        }\n      }\n\n      // Add an expression to the class initializer\n\n      // This is the key method for determining whether an expression in a class\n      // body should appear in the initializer or the executable body. If the given\n      // `node` is valid in a class body the method will return a (new, modified,\n      // or identical) node for inclusion in the class initializer, otherwise\n      // nothing will be returned and the node will appear in the executable body.\n\n      // At time of writing, only methods (instance and static) are valid in ES\n      // class initializers. As new ES class features (such as class fields) reach\n      // Stage 4, this method will need to be updated to support them. We\n      // additionally allow `PassthroughLiteral`s (backticked expressions) in the\n      // initializer as an escape hatch for ES features that are not implemented\n      // (e.g. getters and setters defined via the `get` and `set` keywords as\n      // opposed to the `Object.defineProperty` method).\n      addInitializerExpression(node, o) {\n        if (node.unwrapAll() instanceof PassthroughLiteral) {\n          return node;\n        } else if (this.validInitializerMethod(node)) {\n          return this.addInitializerMethod(node);\n        } else if (!o.compiling && this.validClassProperty(node)) {\n          return this.addClassProperty(node);\n        } else if (!o.compiling && this.validClassPrototypeProperty(node)) {\n          return this.addClassPrototypeProperty(node);\n        } else {\n          return null;\n        }\n      }\n\n      // Checks if the given node is a valid ES class initializer method.\n      validInitializerMethod(node) {\n        if (!(node instanceof Assign && node.value instanceof Code)) {\n          return false;\n        }\n        if (node.context === 'object' && !node.variable.hasProperties()) {\n          return true;\n        }\n        return node.variable.looksStatic(this.name) && (this.name || !node.value.bound);\n      }\n\n      // Returns a configured class initializer method\n      addInitializerMethod(assign) {\n        var isConstructor, method, methodName, operatorToken, variable;\n        ({\n          variable,\n          value: method,\n          operatorToken\n        } = assign);\n        method.isMethod = true;\n        method.isStatic = variable.looksStatic(this.name);\n        if (method.isStatic) {\n          method.name = variable.properties[0];\n        } else {\n          methodName = variable.base;\n          method.name = new (methodName.shouldCache() ? Index : Access)(methodName);\n          method.name.updateLocationDataIfMissing(methodName.locationData);\n          isConstructor = methodName instanceof StringLiteral ? methodName.originalValue === 'constructor' : methodName.value === 'constructor';\n          if (isConstructor) {\n            method.ctor = (this.parent ? 'derived' : 'base');\n          }\n          if (method.bound && method.ctor) {\n            method.error('Cannot define a constructor as a bound (fat arrow) function');\n          }\n        }\n        method.operatorToken = operatorToken;\n        return method;\n      }\n\n      validClassProperty(node) {\n        if (!(node instanceof Assign)) {\n          return false;\n        }\n        return node.variable.looksStatic(this.name);\n      }\n\n      addClassProperty(assign) {\n        var operatorToken, staticClassName, value, variable;\n        ({variable, value, operatorToken} = assign);\n        ({staticClassName} = variable.looksStatic(this.name));\n        return new ClassProperty({\n          name: variable.properties[0],\n          isStatic: true,\n          staticClassName,\n          value,\n          operatorToken\n        }).withLocationDataFrom(assign);\n      }\n\n      validClassPrototypeProperty(node) {\n        if (!(node instanceof Assign)) {\n          return false;\n        }\n        return node.context === 'object' && !node.variable.hasProperties();\n      }\n\n      addClassPrototypeProperty(assign) {\n        var value, variable;\n        ({variable, value} = assign);\n        return new ClassPrototypeProperty({\n          name: variable.base,\n          value\n        }).withLocationDataFrom(assign);\n      }\n\n      makeDefaultConstructor() {\n        var applyArgs, applyCtor, ctor;\n        ctor = this.addInitializerMethod(new Assign(new Value(new PropertyName('constructor')), new Code()));\n        this.body.unshift(ctor);\n        if (this.parent) {\n          ctor.body.push(new SuperCall(new Super(), [new Splat(new IdentifierLiteral('arguments'))]));\n        }\n        if (this.externalCtor) {\n          applyCtor = new Value(this.externalCtor, [new Access(new PropertyName('apply'))]);\n          applyArgs = [new ThisLiteral(), new IdentifierLiteral('arguments')];\n          ctor.body.push(new Call(applyCtor, applyArgs));\n          ctor.body.makeReturn();\n        }\n        return ctor;\n      }\n\n      proxyBoundMethods() {\n        var method, name;\n        this.ctor.thisAssignments = (function() {\n          var j, len1, ref1, results1;\n          ref1 = this.boundMethods;\n          results1 = [];\n          for (j = 0, len1 = ref1.length; j < len1; j++) {\n            method = ref1[j];\n            if (this.parent) {\n              method.classVariable = this.variableRef;\n            }\n            name = new Value(new ThisLiteral(), [method.name]);\n            results1.push(new Assign(name, new Call(new Value(name, [new Access(new PropertyName('bind'))]), [new ThisLiteral()])));\n          }\n          return results1;\n        }).call(this);\n        return null;\n      }\n\n      declareName(o) {\n        var alreadyDeclared, name, ref1;\n        if (!((name = (ref1 = this.variable) != null ? ref1.unwrap() : void 0) instanceof IdentifierLiteral)) {\n          return;\n        }\n        alreadyDeclared = o.scope.find(name.value);\n        return name.isDeclaration = !alreadyDeclared;\n      }\n\n      isStatementAst() {\n        return true;\n      }\n\n      astNode(o) {\n        var argumentsNode, jumpNode, ref1;\n        if (jumpNode = this.body.jumps()) {\n          jumpNode.error('Class bodies cannot contain pure statements');\n        }\n        if (argumentsNode = this.body.contains(isLiteralArguments)) {\n          argumentsNode.error(\"Class bodies shouldn't reference arguments\");\n        }\n        this.declareName(o);\n        this.name = this.determineName();\n        this.body.isClassBody = true;\n        if (this.hasGeneratedBody) {\n          this.body.locationData = zeroWidthLocationDataFromEndLocation(this.locationData);\n        }\n        this.walkBody(o);\n        sniffDirectives(this.body.expressions);\n        if ((ref1 = this.ctor) != null) {\n          ref1.noReturn = true;\n        }\n        return super.astNode(o);\n      }\n\n      astType(o) {\n        if (o.level === LEVEL_TOP) {\n          return 'ClassDeclaration';\n        } else {\n          return 'ClassExpression';\n        }\n      }\n\n      astProperties(o) {\n        var ref1, ref2, ref3, ref4;\n        return {\n          id: (ref1 = (ref2 = this.variable) != null ? ref2.ast(o) : void 0) != null ? ref1 : null,\n          superClass: (ref3 = (ref4 = this.parent) != null ? ref4.ast(o, LEVEL_PAREN) : void 0) != null ? ref3 : null,\n          body: this.body.ast(o, LEVEL_TOP)\n        };\n      }\n\n    };\n\n    Class.prototype.children = ['variable', 'parent', 'body'];\n\n    return Class;\n\n  }).call(this);\n\n  exports.ExecutableClassBody = ExecutableClassBody = (function() {\n    class ExecutableClassBody extends Base {\n      constructor(_class, body1 = new Block()) {\n        super();\n        this.class = _class;\n        this.body = body1;\n      }\n\n      compileNode(o) {\n        var args, argumentsNode, directives, externalCtor, ident, jumpNode, klass, params, parent, ref1, wrapper;\n        if (jumpNode = this.body.jumps()) {\n          jumpNode.error('Class bodies cannot contain pure statements');\n        }\n        if (argumentsNode = this.body.contains(isLiteralArguments)) {\n          argumentsNode.error(\"Class bodies shouldn't reference arguments\");\n        }\n        params = [];\n        args = [new ThisLiteral()];\n        wrapper = new Code(params, this.body);\n        klass = new Parens(new Call(new Value(wrapper, [new Access(new PropertyName('call'))]), args));\n        this.body.spaced = true;\n        o.classScope = wrapper.makeScope(o.scope);\n        this.name = (ref1 = this.class.name) != null ? ref1 : o.classScope.freeVariable(this.defaultClassVariableName);\n        ident = new IdentifierLiteral(this.name);\n        directives = this.walkBody();\n        this.setContext();\n        if (this.class.hasNameClash) {\n          parent = new IdentifierLiteral(o.classScope.freeVariable('superClass'));\n          wrapper.params.push(new Param(parent));\n          args.push(this.class.parent);\n          this.class.parent = parent;\n        }\n        if (this.externalCtor) {\n          externalCtor = new IdentifierLiteral(o.classScope.freeVariable('ctor', {\n            reserve: false\n          }));\n          this.class.externalCtor = externalCtor;\n          this.externalCtor.variable.base = externalCtor;\n        }\n        if (this.name !== this.class.name) {\n          this.body.expressions.unshift(new Assign(new IdentifierLiteral(this.name), this.class));\n        } else {\n          this.body.expressions.unshift(this.class);\n        }\n        this.body.expressions.unshift(...directives);\n        this.body.push(ident);\n        return klass.compileToFragments(o);\n      }\n\n      // Traverse the class's children and:\n      // - Hoist valid ES properties into `@properties`\n      // - Hoist static assignments into `@properties`\n      // - Convert invalid ES properties into class or prototype assignments\n      walkBody() {\n        var directives, expr, index;\n        directives = [];\n        index = 0;\n        while (expr = this.body.expressions[index]) {\n          if (!(expr instanceof Value && expr.isString())) {\n            break;\n          }\n          if (expr.hoisted) {\n            index++;\n          } else {\n            directives.push(...this.body.expressions.splice(index, 1));\n          }\n        }\n        this.traverseChildren(false, (child) => {\n          var cont, i, j, len1, node, ref1;\n          if (child instanceof Class || child instanceof HoistTarget) {\n            return false;\n          }\n          cont = true;\n          if (child instanceof Block) {\n            ref1 = child.expressions;\n            for (i = j = 0, len1 = ref1.length; j < len1; i = ++j) {\n              node = ref1[i];\n              if (node instanceof Value && node.isObject(true)) {\n                cont = false;\n                child.expressions[i] = this.addProperties(node.base.properties);\n              } else if (node instanceof Assign && node.variable.looksStatic(this.name)) {\n                node.value.isStatic = true;\n              }\n            }\n            child.expressions = flatten(child.expressions);\n          }\n          return cont;\n        });\n        return directives;\n      }\n\n      setContext() {\n        return this.body.traverseChildren(false, (node) => {\n          if (node instanceof ThisLiteral) {\n            return node.value = this.name;\n          } else if (node instanceof Code && node.bound && (node.isStatic || !node.name)) {\n            return node.context = this.name;\n          }\n        });\n      }\n\n      // Make class/prototype assignments for invalid ES properties\n      addProperties(assigns) {\n        var assign, base, name, prototype, result, value, variable;\n        result = (function() {\n          var j, len1, results1;\n          results1 = [];\n          for (j = 0, len1 = assigns.length; j < len1; j++) {\n            assign = assigns[j];\n            variable = assign.variable;\n            base = variable != null ? variable.base : void 0;\n            value = assign.value;\n            delete assign.context;\n            if (base.value === 'constructor') {\n              if (value instanceof Code) {\n                base.error('constructors must be defined at the top level of a class body');\n              }\n              // The class scope is not available yet, so return the assignment to update later\n              assign = this.externalCtor = new Assign(new Value(), value);\n            } else if (!assign.variable.this) {\n              name = base instanceof ComputedPropertyName ? new Index(base.value) : new (base.shouldCache() ? Index : Access)(base);\n              prototype = new Access(new PropertyName('prototype'));\n              variable = new Value(new ThisLiteral(), [prototype, name]);\n              assign.variable = variable;\n            } else if (assign.value instanceof Code) {\n              assign.value.isStatic = true;\n            }\n            results1.push(assign);\n          }\n          return results1;\n        }).call(this);\n        return compact(result);\n      }\n\n    };\n\n    ExecutableClassBody.prototype.children = ['class', 'body'];\n\n    ExecutableClassBody.prototype.defaultClassVariableName = '_Class';\n\n    return ExecutableClassBody;\n\n  }).call(this);\n\n  exports.ClassProperty = ClassProperty = (function() {\n    class ClassProperty extends Base {\n      constructor({\n          name: name1,\n          isStatic,\n          staticClassName: staticClassName1,\n          value: value1,\n          operatorToken: operatorToken1\n        }) {\n        super();\n        this.name = name1;\n        this.isStatic = isStatic;\n        this.staticClassName = staticClassName1;\n        this.value = value1;\n        this.operatorToken = operatorToken1;\n      }\n\n      astProperties(o) {\n        var ref1, ref2, ref3, ref4;\n        return {\n          key: this.name.ast(o, LEVEL_LIST),\n          value: this.value.ast(o, LEVEL_LIST),\n          static: !!this.isStatic,\n          computed: this.name instanceof Index || this.name instanceof ComputedPropertyName,\n          operator: (ref1 = (ref2 = this.operatorToken) != null ? ref2.value : void 0) != null ? ref1 : '=',\n          staticClassName: (ref3 = (ref4 = this.staticClassName) != null ? ref4.ast(o) : void 0) != null ? ref3 : null\n        };\n      }\n\n    };\n\n    ClassProperty.prototype.children = ['name', 'value', 'staticClassName'];\n\n    ClassProperty.prototype.isStatement = YES;\n\n    return ClassProperty;\n\n  }).call(this);\n\n  exports.ClassPrototypeProperty = ClassPrototypeProperty = (function() {\n    class ClassPrototypeProperty extends Base {\n      constructor({\n          name: name1,\n          value: value1\n        }) {\n        super();\n        this.name = name1;\n        this.value = value1;\n      }\n\n      astProperties(o) {\n        return {\n          key: this.name.ast(o, LEVEL_LIST),\n          value: this.value.ast(o, LEVEL_LIST),\n          computed: this.name instanceof ComputedPropertyName || this.name instanceof StringWithInterpolations\n        };\n      }\n\n    };\n\n    ClassPrototypeProperty.prototype.children = ['name', 'value'];\n\n    ClassPrototypeProperty.prototype.isStatement = YES;\n\n    return ClassPrototypeProperty;\n\n  }).call(this);\n\n  //### Import and Export\n  exports.ModuleDeclaration = ModuleDeclaration = (function() {\n    class ModuleDeclaration extends Base {\n      constructor(clause, source1, assertions) {\n        super();\n        this.clause = clause;\n        this.source = source1;\n        this.assertions = assertions;\n        this.checkSource();\n      }\n\n      checkSource() {\n        if ((this.source != null) && this.source instanceof StringWithInterpolations) {\n          return this.source.error('the name of the module to be imported from must be an uninterpolated string');\n        }\n      }\n\n      checkScope(o, moduleDeclarationType) {\n        // TODO: would be appropriate to flag this error during AST generation (as\n        // well as when compiling to JS). But `o.indent` isn’t tracked during AST\n        // generation, and there doesn’t seem to be a current alternative way to track\n        // whether we’re at the “program top-level”.\n        if (o.indent.length !== 0) {\n          return this.error(`${moduleDeclarationType} statements must be at top-level scope`);\n        }\n      }\n\n      astAssertions(o) {\n        var ref1;\n        if (((ref1 = this.assertions) != null ? ref1.properties : void 0) != null) {\n          return this.assertions.properties.map((assertion) => {\n            var end, left, loc, right, start;\n            ({start, end, loc, left, right} = assertion.ast(o));\n            return {\n              type: 'ImportAttribute',\n              start,\n              end,\n              loc,\n              key: left,\n              value: right\n            };\n          });\n        } else {\n          return [];\n        }\n      }\n\n    };\n\n    ModuleDeclaration.prototype.children = ['clause', 'source', 'assertions'];\n\n    ModuleDeclaration.prototype.isStatement = YES;\n\n    ModuleDeclaration.prototype.jumps = THIS;\n\n    ModuleDeclaration.prototype.makeReturn = THIS;\n\n    return ModuleDeclaration;\n\n  }).call(this);\n\n  exports.ImportDeclaration = ImportDeclaration = class ImportDeclaration extends ModuleDeclaration {\n    compileNode(o) {\n      var code, ref1;\n      this.checkScope(o, 'import');\n      o.importedSymbols = [];\n      code = [];\n      code.push(this.makeCode(`${this.tab}import `));\n      if (this.clause != null) {\n        code.push(...this.clause.compileNode(o));\n      }\n      if (((ref1 = this.source) != null ? ref1.value : void 0) != null) {\n        if (this.clause !== null) {\n          code.push(this.makeCode(' from '));\n        }\n        code.push(this.makeCode(this.source.value));\n        if (this.assertions != null) {\n          code.push(this.makeCode(' assert '));\n          code.push(...this.assertions.compileToFragments(o));\n        }\n      }\n      code.push(this.makeCode(';'));\n      return code;\n    }\n\n    astNode(o) {\n      o.importedSymbols = [];\n      return super.astNode(o);\n    }\n\n    astProperties(o) {\n      var ref1, ref2, ret;\n      ret = {\n        specifiers: (ref1 = (ref2 = this.clause) != null ? ref2.ast(o) : void 0) != null ? ref1 : [],\n        source: this.source.ast(o),\n        assertions: this.astAssertions(o)\n      };\n      if (this.clause) {\n        ret.importKind = 'value';\n      }\n      return ret;\n    }\n\n  };\n\n  exports.ImportClause = ImportClause = (function() {\n    class ImportClause extends Base {\n      constructor(defaultBinding, namedImports) {\n        super();\n        this.defaultBinding = defaultBinding;\n        this.namedImports = namedImports;\n      }\n\n      compileNode(o) {\n        var code;\n        code = [];\n        if (this.defaultBinding != null) {\n          code.push(...this.defaultBinding.compileNode(o));\n          if (this.namedImports != null) {\n            code.push(this.makeCode(', '));\n          }\n        }\n        if (this.namedImports != null) {\n          code.push(...this.namedImports.compileNode(o));\n        }\n        return code;\n      }\n\n      astNode(o) {\n        var ref1, ref2;\n        // The AST for `ImportClause` is the non-nested list of import specifiers\n        // that will be the `specifiers` property of an `ImportDeclaration` AST\n        return compact(flatten([(ref1 = this.defaultBinding) != null ? ref1.ast(o) : void 0, (ref2 = this.namedImports) != null ? ref2.ast(o) : void 0]));\n      }\n\n    };\n\n    ImportClause.prototype.children = ['defaultBinding', 'namedImports'];\n\n    return ImportClause;\n\n  }).call(this);\n\n  exports.ExportDeclaration = ExportDeclaration = class ExportDeclaration extends ModuleDeclaration {\n    compileNode(o) {\n      var code, ref1;\n      this.checkScope(o, 'export');\n      this.checkForAnonymousClassExport();\n      code = [];\n      code.push(this.makeCode(`${this.tab}export `));\n      if (this instanceof ExportDefaultDeclaration) {\n        code.push(this.makeCode('default '));\n      }\n      if (!(this instanceof ExportDefaultDeclaration) && (this.clause instanceof Assign || this.clause instanceof Class)) {\n        code.push(this.makeCode('var '));\n        this.clause.moduleDeclaration = 'export';\n      }\n      if ((this.clause.body != null) && this.clause.body instanceof Block) {\n        code = code.concat(this.clause.compileToFragments(o, LEVEL_TOP));\n      } else {\n        code = code.concat(this.clause.compileNode(o));\n      }\n      if (((ref1 = this.source) != null ? ref1.value : void 0) != null) {\n        code.push(this.makeCode(` from ${this.source.value}`));\n        if (this.assertions != null) {\n          code.push(this.makeCode(' assert '));\n          code.push(...this.assertions.compileToFragments(o));\n        }\n      }\n      code.push(this.makeCode(';'));\n      return code;\n    }\n\n    // Prevent exporting an anonymous class; all exported members must be named\n    checkForAnonymousClassExport() {\n      if (!(this instanceof ExportDefaultDeclaration) && this.clause instanceof Class && !this.clause.variable) {\n        return this.clause.error('anonymous classes cannot be exported');\n      }\n    }\n\n    astNode(o) {\n      this.checkForAnonymousClassExport();\n      return super.astNode(o);\n    }\n\n  };\n\n  exports.ExportNamedDeclaration = ExportNamedDeclaration = class ExportNamedDeclaration extends ExportDeclaration {\n    astProperties(o) {\n      var clauseAst, ref1, ref2, ret;\n      ret = {\n        source: (ref1 = (ref2 = this.source) != null ? ref2.ast(o) : void 0) != null ? ref1 : null,\n        assertions: this.astAssertions(o),\n        exportKind: 'value'\n      };\n      clauseAst = this.clause.ast(o);\n      if (this.clause instanceof ExportSpecifierList) {\n        ret.specifiers = clauseAst;\n        ret.declaration = null;\n      } else {\n        ret.specifiers = [];\n        ret.declaration = clauseAst;\n      }\n      return ret;\n    }\n\n  };\n\n  exports.ExportDefaultDeclaration = ExportDefaultDeclaration = class ExportDefaultDeclaration extends ExportDeclaration {\n    astProperties(o) {\n      return {\n        declaration: this.clause.ast(o),\n        assertions: this.astAssertions(o)\n      };\n    }\n\n  };\n\n  exports.ExportAllDeclaration = ExportAllDeclaration = class ExportAllDeclaration extends ExportDeclaration {\n    astProperties(o) {\n      return {\n        source: this.source.ast(o),\n        assertions: this.astAssertions(o),\n        exportKind: 'value'\n      };\n    }\n\n  };\n\n  exports.ModuleSpecifierList = ModuleSpecifierList = (function() {\n    class ModuleSpecifierList extends Base {\n      constructor(specifiers) {\n        super();\n        this.specifiers = specifiers;\n      }\n\n      compileNode(o) {\n        var code, compiledList, fragments, index, j, len1, specifier;\n        code = [];\n        o.indent += TAB;\n        compiledList = (function() {\n          var j, len1, ref1, results1;\n          ref1 = this.specifiers;\n          results1 = [];\n          for (j = 0, len1 = ref1.length; j < len1; j++) {\n            specifier = ref1[j];\n            results1.push(specifier.compileToFragments(o, LEVEL_LIST));\n          }\n          return results1;\n        }).call(this);\n        if (this.specifiers.length !== 0) {\n          code.push(this.makeCode(`{\\n${o.indent}`));\n          for (index = j = 0, len1 = compiledList.length; j < len1; index = ++j) {\n            fragments = compiledList[index];\n            if (index) {\n              code.push(this.makeCode(`,\\n${o.indent}`));\n            }\n            code.push(...fragments);\n          }\n          code.push(this.makeCode(\"\\n}\"));\n        } else {\n          code.push(this.makeCode('{}'));\n        }\n        return code;\n      }\n\n      astNode(o) {\n        var j, len1, ref1, results1, specifier;\n        ref1 = this.specifiers;\n        results1 = [];\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          specifier = ref1[j];\n          results1.push(specifier.ast(o));\n        }\n        return results1;\n      }\n\n    };\n\n    ModuleSpecifierList.prototype.children = ['specifiers'];\n\n    return ModuleSpecifierList;\n\n  }).call(this);\n\n  exports.ImportSpecifierList = ImportSpecifierList = class ImportSpecifierList extends ModuleSpecifierList {};\n\n  exports.ExportSpecifierList = ExportSpecifierList = class ExportSpecifierList extends ModuleSpecifierList {};\n\n  exports.ModuleSpecifier = ModuleSpecifier = (function() {\n    class ModuleSpecifier extends Base {\n      constructor(original, alias, moduleDeclarationType1) {\n        var ref1, ref2;\n        super();\n        this.original = original;\n        this.alias = alias;\n        this.moduleDeclarationType = moduleDeclarationType1;\n        if (this.original.comments || ((ref1 = this.alias) != null ? ref1.comments : void 0)) {\n          this.comments = [];\n          if (this.original.comments) {\n            this.comments.push(...this.original.comments);\n          }\n          if ((ref2 = this.alias) != null ? ref2.comments : void 0) {\n            this.comments.push(...this.alias.comments);\n          }\n        }\n        // The name of the variable entering the local scope\n        this.identifier = this.alias != null ? this.alias.value : this.original.value;\n      }\n\n      compileNode(o) {\n        var code;\n        this.addIdentifierToScope(o);\n        code = [];\n        code.push(this.makeCode(this.original.value));\n        if (this.alias != null) {\n          code.push(this.makeCode(` as ${this.alias.value}`));\n        }\n        return code;\n      }\n\n      addIdentifierToScope(o) {\n        return o.scope.find(this.identifier, this.moduleDeclarationType);\n      }\n\n      astNode(o) {\n        this.addIdentifierToScope(o);\n        return super.astNode(o);\n      }\n\n    };\n\n    ModuleSpecifier.prototype.children = ['original', 'alias'];\n\n    return ModuleSpecifier;\n\n  }).call(this);\n\n  exports.ImportSpecifier = ImportSpecifier = class ImportSpecifier extends ModuleSpecifier {\n    constructor(imported, local) {\n      super(imported, local, 'import');\n    }\n\n    addIdentifierToScope(o) {\n      var ref1;\n      // Per the spec, symbols can’t be imported multiple times\n      // (e.g. `import { foo, foo } from 'lib'` is invalid)\n      if ((ref1 = this.identifier, indexOf.call(o.importedSymbols, ref1) >= 0) || o.scope.check(this.identifier)) {\n        this.error(`'${this.identifier}' has already been declared`);\n      } else {\n        o.importedSymbols.push(this.identifier);\n      }\n      return super.addIdentifierToScope(o);\n    }\n\n    astProperties(o) {\n      var originalAst, ref1, ref2;\n      originalAst = this.original.ast(o);\n      return {\n        imported: originalAst,\n        local: (ref1 = (ref2 = this.alias) != null ? ref2.ast(o) : void 0) != null ? ref1 : originalAst,\n        importKind: null\n      };\n    }\n\n  };\n\n  exports.ImportDefaultSpecifier = ImportDefaultSpecifier = class ImportDefaultSpecifier extends ImportSpecifier {\n    astProperties(o) {\n      return {\n        local: this.original.ast(o)\n      };\n    }\n\n  };\n\n  exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier = class ImportNamespaceSpecifier extends ImportSpecifier {\n    astProperties(o) {\n      return {\n        local: this.alias.ast(o)\n      };\n    }\n\n  };\n\n  exports.ExportSpecifier = ExportSpecifier = class ExportSpecifier extends ModuleSpecifier {\n    constructor(local, exported) {\n      super(local, exported, 'export');\n    }\n\n    astProperties(o) {\n      var originalAst, ref1, ref2;\n      originalAst = this.original.ast(o);\n      return {\n        local: originalAst,\n        exported: (ref1 = (ref2 = this.alias) != null ? ref2.ast(o) : void 0) != null ? ref1 : originalAst\n      };\n    }\n\n  };\n\n  exports.DynamicImport = DynamicImport = class DynamicImport extends Base {\n    compileNode() {\n      return [this.makeCode('import')];\n    }\n\n    astType() {\n      return 'Import';\n    }\n\n  };\n\n  exports.DynamicImportCall = DynamicImportCall = class DynamicImportCall extends Call {\n    compileNode(o) {\n      this.checkArguments();\n      return super.compileNode(o);\n    }\n\n    checkArguments() {\n      var ref1;\n      if (!((1 <= (ref1 = this.args.length) && ref1 <= 2))) {\n        return this.error('import() accepts either one or two arguments');\n      }\n    }\n\n    astNode(o) {\n      this.checkArguments();\n      return super.astNode(o);\n    }\n\n  };\n\n  //### Assign\n\n  // The **Assign** is used to assign a local variable to value, or to set the\n  // property of an object -- including within object literals.\n  exports.Assign = Assign = (function() {\n    class Assign extends Base {\n      constructor(variable1, value1, context1, options = {}) {\n        super();\n        this.variable = variable1;\n        this.value = value1;\n        this.context = context1;\n        ({param: this.param, subpattern: this.subpattern, operatorToken: this.operatorToken, moduleDeclaration: this.moduleDeclaration, originalContext: this.originalContext = this.context} = options);\n        this.propagateLhs();\n      }\n\n      isStatement(o) {\n        return (o != null ? o.level : void 0) === LEVEL_TOP && (this.context != null) && (this.moduleDeclaration || indexOf.call(this.context, \"?\") >= 0);\n      }\n\n      checkNameAssignability(o, varBase) {\n        if (o.scope.type(varBase.value) === 'import') {\n          return varBase.error(`'${varBase.value}' is read-only`);\n        }\n      }\n\n      assigns(name) {\n        return this[this.context === 'object' ? 'value' : 'variable'].assigns(name);\n      }\n\n      unfoldSoak(o) {\n        return unfoldSoak(o, this, 'variable');\n      }\n\n      // During AST generation, we need to allow assignment to these constructs\n      // that are considered “unassignable” during compile-to-JS, while still\n      // flagging things like `[null] = b`.\n      addScopeVariables(o, {allowAssignmentToExpansion = false, allowAssignmentToNontrailingSplat = false, allowAssignmentToEmptyArray = false, allowAssignmentToComplexSplat = false} = {}) {\n        var varBase;\n        if (!(!this.context || this.context === '**=')) {\n          return;\n        }\n        varBase = this.variable.unwrapAll();\n        if (!varBase.isAssignable({\n          allowExpansion: allowAssignmentToExpansion,\n          allowNontrailingSplat: allowAssignmentToNontrailingSplat,\n          allowEmptyArray: allowAssignmentToEmptyArray,\n          allowComplexSplat: allowAssignmentToComplexSplat\n        })) {\n          this.variable.error(`'${this.variable.compile(o)}' can't be assigned`);\n        }\n        return varBase.eachName((name) => {\n          var alreadyDeclared, commentFragments, commentsNode, message;\n          if (typeof name.hasProperties === \"function\" ? name.hasProperties() : void 0) {\n            return;\n          }\n          message = isUnassignable(name.value);\n          if (message) {\n            name.error(message);\n          }\n          // `moduleDeclaration` can be `'import'` or `'export'`.\n          this.checkNameAssignability(o, name);\n          if (this.moduleDeclaration) {\n            o.scope.add(name.value, this.moduleDeclaration);\n            return name.isDeclaration = true;\n          } else if (this.param) {\n            return o.scope.add(name.value, this.param === 'alwaysDeclare' ? 'var' : 'param');\n          } else {\n            alreadyDeclared = o.scope.find(name.value);\n            if (name.isDeclaration == null) {\n              name.isDeclaration = !alreadyDeclared;\n            }\n            // If this assignment identifier has one or more herecomments\n            // attached, output them as part of the declarations line (unless\n            // other herecomments are already staged there) for compatibility\n            // with Flow typing. Don’t do this if this assignment is for a\n            // class, e.g. `ClassName = class ClassName {`, as Flow requires\n            // the comment to be between the class name and the `{`.\n            if (name.comments && !o.scope.comments[name.value] && !(this.value instanceof Class) && name.comments.every(function(comment) {\n              return comment.here && !comment.multiline;\n            })) {\n              commentsNode = new IdentifierLiteral(name.value);\n              commentsNode.comments = name.comments;\n              commentFragments = [];\n              this.compileCommentFragments(o, commentsNode, commentFragments);\n              return o.scope.comments[name.value] = commentFragments;\n            }\n          }\n        });\n      }\n\n      // Compile an assignment, delegating to `compileDestructuring` or\n      // `compileSplice` if appropriate. Keep track of the name of the base object\n      // we've been assigned to, for correct internal references. If the variable\n      // has not been seen yet within the current scope, declare it.\n      compileNode(o) {\n        var answer, compiledName, isValue, name, properties, prototype, ref1, ref2, ref3, ref4, val;\n        isValue = this.variable instanceof Value;\n        if (isValue) {\n          // If `@variable` is an array or an object, we’re destructuring;\n          // if it’s also `isAssignable()`, the destructuring syntax is supported\n          // in ES and we can output it as is; otherwise we `@compileDestructuring`\n          // and convert this ES-unsupported destructuring into acceptable output.\n          if (this.variable.isArray() || this.variable.isObject()) {\n            if (!this.variable.isAssignable()) {\n              if (this.variable.isObject() && this.variable.base.hasSplat()) {\n                return this.compileObjectDestruct(o);\n              } else {\n                return this.compileDestructuring(o);\n              }\n            }\n          }\n          if (this.variable.isSplice()) {\n            return this.compileSplice(o);\n          }\n          if (this.isConditional()) {\n            return this.compileConditional(o);\n          }\n          if ((ref1 = this.context) === '//=' || ref1 === '%%=') {\n            return this.compileSpecialMath(o);\n          }\n        }\n        this.addScopeVariables(o);\n        if (this.value instanceof Code) {\n          if (this.value.isStatic) {\n            this.value.name = this.variable.properties[0];\n          } else if (((ref2 = this.variable.properties) != null ? ref2.length : void 0) >= 2) {\n            ref3 = this.variable.properties, [...properties] = ref3, [prototype, name] = splice.call(properties, -2);\n            if (((ref4 = prototype.name) != null ? ref4.value : void 0) === 'prototype') {\n              this.value.name = name;\n            }\n          }\n        }\n        val = this.value.compileToFragments(o, LEVEL_LIST);\n        compiledName = this.variable.compileToFragments(o, LEVEL_LIST);\n        if (this.context === 'object') {\n          if (this.variable.shouldCache()) {\n            compiledName.unshift(this.makeCode('['));\n            compiledName.push(this.makeCode(']'));\n          }\n          return compiledName.concat(this.makeCode(': '), val);\n        }\n        answer = compiledName.concat(this.makeCode(` ${this.context || '='} `), val);\n        // Per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Assignment_without_declaration,\n        // if we’re destructuring without declaring, the destructuring assignment must be wrapped in parentheses.\n        // The assignment is wrapped in parentheses if 'o.level' has lower precedence than LEVEL_LIST (3)\n        // (i.e. LEVEL_COND (4), LEVEL_OP (5) or LEVEL_ACCESS (6)), or if we're destructuring object, e.g. {a,b} = obj.\n        if (o.level > LEVEL_LIST || isValue && this.variable.base instanceof Obj && !this.nestedLhs && !(this.param === true)) {\n          return this.wrapInParentheses(answer);\n        } else {\n          return answer;\n        }\n      }\n\n      // Object rest property is not assignable: `{{a}...}`\n      compileObjectDestruct(o) {\n        var assigns, props, refVal, splat, splatProp;\n        this.variable.base.reorderProperties();\n        ({\n          properties: props\n        } = this.variable.base);\n        [splat] = slice1.call(props, -1);\n        splatProp = splat.name;\n        assigns = [];\n        refVal = new Value(new IdentifierLiteral(o.scope.freeVariable('ref')));\n        props.splice(-1, 1, new Splat(refVal));\n        assigns.push(new Assign(new Value(new Obj(props)), this.value).compileToFragments(o, LEVEL_LIST));\n        assigns.push(new Assign(new Value(splatProp), refVal).compileToFragments(o, LEVEL_LIST));\n        return this.joinFragmentArrays(assigns, ', ');\n      }\n\n      // Brief implementation of recursive pattern matching, when assigning array or\n      // object literals to a value. Peeks at their properties to assign inner names.\n      compileDestructuring(o) {\n        var assignObjects, assigns, code, compSlice, compSplice, complexObjects, expIdx, expans, fragments, hasObjAssigns, isExpans, isSplat, leftObjs, loopObjects, obj, objIsUnassignable, objects, olen, processObjects, pushAssign, ref, refExp, restVar, rightObjs, slicer, splatVar, splatVarAssign, splatVarRef, splats, splatsAndExpans, top, value, vvar, vvarText;\n        top = o.level === LEVEL_TOP;\n        ({value} = this);\n        ({objects} = this.variable.base);\n        olen = objects.length;\n        // Special-case for `{} = a` and `[] = a` (empty patterns).\n        // Compile to simply `a`.\n        if (olen === 0) {\n          code = value.compileToFragments(o);\n          if (o.level >= LEVEL_OP) {\n            return this.wrapInParentheses(code);\n          } else {\n            return code;\n          }\n        }\n        [obj] = objects;\n        this.disallowLoneExpansion();\n        ({splats, expans, splatsAndExpans} = this.getAndCheckSplatsAndExpansions());\n        isSplat = (splats != null ? splats.length : void 0) > 0;\n        isExpans = (expans != null ? expans.length : void 0) > 0;\n        vvar = value.compileToFragments(o, LEVEL_LIST);\n        vvarText = fragmentsToText(vvar);\n        assigns = [];\n        pushAssign = (variable, val) => {\n          return assigns.push(new Assign(variable, val, null, {\n            param: this.param,\n            subpattern: true\n          }).compileToFragments(o, LEVEL_LIST));\n        };\n        if (isSplat) {\n          splatVar = objects[splats[0]].name.unwrap();\n          if (splatVar instanceof Arr || splatVar instanceof Obj) {\n            splatVarRef = new IdentifierLiteral(o.scope.freeVariable('ref'));\n            objects[splats[0]].name = splatVarRef;\n            splatVarAssign = function() {\n              return pushAssign(new Value(splatVar), splatVarRef);\n            };\n          }\n        }\n        // At this point, there are several things to destructure. So the `fn()` in\n        // `{a, b} = fn()` must be cached, for example. Make vvar into a simple\n        // variable if it isn’t already.\n        if (!(value.unwrap() instanceof IdentifierLiteral) || this.variable.assigns(vvarText)) {\n          ref = o.scope.freeVariable('ref');\n          assigns.push([this.makeCode(ref + ' = '), ...vvar]);\n          vvar = [this.makeCode(ref)];\n          vvarText = ref;\n        }\n        slicer = function(type) {\n          return function(vvar, start, end = false) {\n            var args, slice;\n            if (!(vvar instanceof Value)) {\n              vvar = new IdentifierLiteral(vvar);\n            }\n            args = [vvar, new NumberLiteral(start)];\n            if (end) {\n              args.push(new NumberLiteral(end));\n            }\n            slice = new Value(new IdentifierLiteral(utility(type, o)), [new Access(new PropertyName('call'))]);\n            return new Value(new Call(slice, args));\n          };\n        };\n        // Helper which outputs `[].slice` code.\n        compSlice = slicer(\"slice\");\n        // Helper which outputs `[].splice` code.\n        compSplice = slicer(\"splice\");\n        // Check if `objects` array contains any instance of `Assign`, e.g. {a:1}.\n        hasObjAssigns = function(objs) {\n          var i, j, len1, results1;\n          results1 = [];\n          for (i = j = 0, len1 = objs.length; j < len1; i = ++j) {\n            obj = objs[i];\n            if (obj instanceof Assign && obj.context === 'object') {\n              results1.push(i);\n            }\n          }\n          return results1;\n        };\n        // Check if `objects` array contains any unassignable object.\n        objIsUnassignable = function(objs) {\n          var j, len1;\n          for (j = 0, len1 = objs.length; j < len1; j++) {\n            obj = objs[j];\n            if (!obj.isAssignable()) {\n              return true;\n            }\n          }\n          return false;\n        };\n        // `objects` are complex when there is object assign ({a:1}),\n        // unassignable object, or just a single node.\n        complexObjects = function(objs) {\n          return hasObjAssigns(objs).length || objIsUnassignable(objs) || olen === 1;\n        };\n        // \"Complex\" `objects` are processed in a loop.\n        // Examples: [a, b, {c, r...}, d], [a, ..., {b, r...}, c, d]\n        loopObjects = (objs, vvar, vvarTxt) => {\n          var acc, i, idx, j, len1, message, results1, vval;\n          results1 = [];\n          for (i = j = 0, len1 = objs.length; j < len1; i = ++j) {\n            obj = objs[i];\n            if (obj instanceof Elision) {\n              // `Elision` can be skipped.\n              continue;\n            }\n            // If `obj` is {a: 1}\n            if (obj instanceof Assign && obj.context === 'object') {\n              ({\n                variable: {\n                  base: idx\n                },\n                value: vvar\n              } = obj);\n              if (vvar instanceof Assign) {\n                ({\n                  variable: vvar\n                } = vvar);\n              }\n              idx = vvar.this ? vvar.properties[0].name : new PropertyName(vvar.unwrap().value);\n              acc = idx.unwrap() instanceof PropertyName;\n              vval = new Value(value, [new (acc ? Access : Index)(idx)]);\n            } else {\n              // `obj` is [a...], {a...} or a\n              vvar = (function() {\n                switch (false) {\n                  case !(obj instanceof Splat):\n                    return new Value(obj.name);\n                  default:\n                    return obj;\n                }\n              })();\n              vval = (function() {\n                switch (false) {\n                  case !(obj instanceof Splat):\n                    return compSlice(vvarTxt, i);\n                  default:\n                    return new Value(new Literal(vvarTxt), [new Index(new NumberLiteral(i))]);\n                }\n              })();\n            }\n            message = isUnassignable(vvar.unwrap().value);\n            if (message) {\n              vvar.error(message);\n            }\n            results1.push(pushAssign(vvar, vval));\n          }\n          return results1;\n        };\n        // \"Simple\" `objects` can be split and compiled to arrays, [a, b, c] = arr, [a, b, c...] = arr\n        assignObjects = (objs, vvar, vvarTxt) => {\n          var vval;\n          vvar = new Value(new Arr(objs, true));\n          vval = vvarTxt instanceof Value ? vvarTxt : new Value(new Literal(vvarTxt));\n          return pushAssign(vvar, vval);\n        };\n        processObjects = function(objs, vvar, vvarTxt) {\n          if (complexObjects(objs)) {\n            return loopObjects(objs, vvar, vvarTxt);\n          } else {\n            return assignObjects(objs, vvar, vvarTxt);\n          }\n        };\n        // In case there is `Splat` or `Expansion` in `objects`,\n        // we can split array in two simple subarrays.\n        // `Splat` [a, b, c..., d, e] can be split into  [a, b, c...] and [d, e].\n        // `Expansion` [a, b, ..., c, d] can be split into [a, b] and [c, d].\n        // Examples:\n        // a) `Splat`\n        //   CS: [a, b, c..., d, e] = arr\n        //   JS: [a, b, ...c] = arr, [d, e] = splice.call(c, -2)\n        // b) `Expansion`\n        //   CS: [a, b, ..., d, e] = arr\n        //   JS: [a, b] = arr, [d, e] = slice.call(arr, -2)\n        if (splatsAndExpans.length) {\n          expIdx = splatsAndExpans[0];\n          leftObjs = objects.slice(0, expIdx + (isSplat ? 1 : 0));\n          rightObjs = objects.slice(expIdx + 1);\n          if (leftObjs.length !== 0) {\n            processObjects(leftObjs, vvar, vvarText);\n          }\n          if (rightObjs.length !== 0) {\n            // Slice or splice `objects`.\n            refExp = (function() {\n              switch (false) {\n                case !isSplat:\n                  return compSplice(new Value(objects[expIdx].name), rightObjs.length * -1);\n                case !isExpans:\n                  return compSlice(vvarText, rightObjs.length * -1);\n              }\n            })();\n            if (complexObjects(rightObjs)) {\n              restVar = refExp;\n              refExp = o.scope.freeVariable('ref');\n              assigns.push([this.makeCode(refExp + ' = '), ...restVar.compileToFragments(o, LEVEL_LIST)]);\n            }\n            processObjects(rightObjs, vvar, refExp);\n          }\n        } else {\n          // There is no `Splat` or `Expansion` in `objects`.\n          processObjects(objects, vvar, vvarText);\n        }\n        if (typeof splatVarAssign === \"function\") {\n          splatVarAssign();\n        }\n        if (!(top || this.subpattern)) {\n          assigns.push(vvar);\n        }\n        fragments = this.joinFragmentArrays(assigns, ', ');\n        if (o.level < LEVEL_LIST) {\n          return fragments;\n        } else {\n          return this.wrapInParentheses(fragments);\n        }\n      }\n\n      // Disallow `[...] = a` for some reason. (Could be equivalent to `[] = a`?)\n      disallowLoneExpansion() {\n        var loneObject, objects;\n        if (!(this.variable.base instanceof Arr)) {\n          return;\n        }\n        ({objects} = this.variable.base);\n        if ((objects != null ? objects.length : void 0) !== 1) {\n          return;\n        }\n        [loneObject] = objects;\n        if (loneObject instanceof Expansion) {\n          return loneObject.error('Destructuring assignment has no target');\n        }\n      }\n\n      // Show error if there is more than one `Splat`, or `Expansion`.\n      // Examples: [a, b, c..., d, e, f...], [a, b, ..., c, d, ...], [a, b, ..., c, d, e...]\n      getAndCheckSplatsAndExpansions() {\n        var expans, i, obj, objects, splats, splatsAndExpans;\n        if (!(this.variable.base instanceof Arr)) {\n          return {\n            splats: [],\n            expans: [],\n            splatsAndExpans: []\n          };\n        }\n        ({objects} = this.variable.base);\n        // Count all `Splats`: [a, b, c..., d, e]\n        splats = (function() {\n          var j, len1, results1;\n          results1 = [];\n          for (i = j = 0, len1 = objects.length; j < len1; i = ++j) {\n            obj = objects[i];\n            if (obj instanceof Splat) {\n              results1.push(i);\n            }\n          }\n          return results1;\n        })();\n        // Count all `Expansions`: [a, b, ..., c, d]\n        expans = (function() {\n          var j, len1, results1;\n          results1 = [];\n          for (i = j = 0, len1 = objects.length; j < len1; i = ++j) {\n            obj = objects[i];\n            if (obj instanceof Expansion) {\n              results1.push(i);\n            }\n          }\n          return results1;\n        })();\n        // Combine splats and expansions.\n        splatsAndExpans = [...splats, ...expans];\n        if (splatsAndExpans.length > 1) {\n          // Sort 'splatsAndExpans' so we can show error at first disallowed token.\n          objects[splatsAndExpans.sort()[1]].error(\"multiple splats/expansions are disallowed in an assignment\");\n        }\n        return {splats, expans, splatsAndExpans};\n      }\n\n      // When compiling a conditional assignment, take care to ensure that the\n      // operands are only evaluated once, even though we have to reference them\n      // more than once.\n      compileConditional(o) {\n        var fragments, left, right;\n        [left, right] = this.variable.cacheReference(o);\n        // Disallow conditional assignment of undefined variables.\n        if (!left.properties.length && left.base instanceof Literal && !(left.base instanceof ThisLiteral) && !o.scope.check(left.base.value)) {\n          this.throwUnassignableConditionalError(left.base.value);\n        }\n        if (indexOf.call(this.context, \"?\") >= 0) {\n          o.isExistentialEquals = true;\n          return new If(new Existence(left), right, {\n            type: 'if'\n          }).addElse(new Assign(right, this.value, '=')).compileToFragments(o);\n        } else {\n          fragments = new Op(this.context.slice(0, -1), left, new Assign(right, this.value, '=')).compileToFragments(o);\n          if (o.level <= LEVEL_LIST) {\n            return fragments;\n          } else {\n            return this.wrapInParentheses(fragments);\n          }\n        }\n      }\n\n      // Convert special math assignment operators like `a //= b` to the equivalent\n      // extended form `a = a ** b` and then compiles that.\n      compileSpecialMath(o) {\n        var left, right;\n        [left, right] = this.variable.cacheReference(o);\n        return new Assign(left, new Op(this.context.slice(0, -1), right, this.value)).compileToFragments(o);\n      }\n\n      // Compile the assignment from an array splice literal, using JavaScript's\n      // `Array#splice` method.\n      compileSplice(o) {\n        var answer, exclusive, from, fromDecl, fromRef, name, to, unwrappedVar, valDef, valRef;\n        ({\n          range: {from, to, exclusive}\n        } = this.variable.properties.pop());\n        unwrappedVar = this.variable.unwrapAll();\n        if (unwrappedVar.comments) {\n          moveComments(unwrappedVar, this);\n          delete this.variable.comments;\n        }\n        name = this.variable.compile(o);\n        if (from) {\n          [fromDecl, fromRef] = this.cacheToCodeFragments(from.cache(o, LEVEL_OP));\n        } else {\n          fromDecl = fromRef = '0';\n        }\n        if (to) {\n          if ((from != null ? from.isNumber() : void 0) && to.isNumber()) {\n            to = to.compile(o) - fromRef;\n            if (!exclusive) {\n              to += 1;\n            }\n          } else {\n            to = to.compile(o, LEVEL_ACCESS) + ' - ' + fromRef;\n            if (!exclusive) {\n              to += ' + 1';\n            }\n          }\n        } else {\n          to = \"9e9\";\n        }\n        [valDef, valRef] = this.value.cache(o, LEVEL_LIST);\n        answer = [].concat(this.makeCode(`${utility('splice', o)}.apply(${name}, [${fromDecl}, ${to}].concat(`), valDef, this.makeCode(\")), \"), valRef);\n        if (o.level > LEVEL_TOP) {\n          return this.wrapInParentheses(answer);\n        } else {\n          return answer;\n        }\n      }\n\n      eachName(iterator) {\n        return this.variable.unwrapAll().eachName(iterator);\n      }\n\n      isDefaultAssignment() {\n        return this.param || this.nestedLhs;\n      }\n\n      propagateLhs() {\n        var ref1, ref2;\n        if (!(((ref1 = this.variable) != null ? typeof ref1.isArray === \"function\" ? ref1.isArray() : void 0 : void 0) || ((ref2 = this.variable) != null ? typeof ref2.isObject === \"function\" ? ref2.isObject() : void 0 : void 0))) {\n          return;\n        }\n        // This is the left-hand side of an assignment; let `Arr` and `Obj`\n        // know that, so that those nodes know that they’re assignable as\n        // destructured variables.\n        return this.variable.base.propagateLhs(true);\n      }\n\n      throwUnassignableConditionalError(name) {\n        return this.variable.error(`the variable \\\"${name}\\\" can't be assigned with ${this.context} because it has not been declared before`);\n      }\n\n      isConditional() {\n        var ref1;\n        return (ref1 = this.context) === '||=' || ref1 === '&&=' || ref1 === '?=';\n      }\n\n      astNode(o) {\n        var variable;\n        this.disallowLoneExpansion();\n        this.getAndCheckSplatsAndExpansions();\n        if (this.isConditional()) {\n          variable = this.variable.unwrap();\n          if (variable instanceof IdentifierLiteral && !o.scope.check(variable.value)) {\n            this.throwUnassignableConditionalError(variable.value);\n          }\n        }\n        this.addScopeVariables(o, {\n          allowAssignmentToExpansion: true,\n          allowAssignmentToNontrailingSplat: true,\n          allowAssignmentToEmptyArray: true,\n          allowAssignmentToComplexSplat: true\n        });\n        return super.astNode(o);\n      }\n\n      astType() {\n        if (this.isDefaultAssignment()) {\n          return 'AssignmentPattern';\n        } else {\n          return 'AssignmentExpression';\n        }\n      }\n\n      astProperties(o) {\n        var ref1, ret;\n        ret = {\n          right: this.value.ast(o, LEVEL_LIST),\n          left: this.variable.ast(o, LEVEL_LIST)\n        };\n        if (!this.isDefaultAssignment()) {\n          ret.operator = (ref1 = this.originalContext) != null ? ref1 : '=';\n        }\n        return ret;\n      }\n\n    };\n\n    Assign.prototype.children = ['variable', 'value'];\n\n    Assign.prototype.isAssignable = YES;\n\n    Assign.prototype.isStatementAst = NO;\n\n    return Assign;\n\n  }).call(this);\n\n  //### FuncGlyph\n  exports.FuncGlyph = FuncGlyph = class FuncGlyph extends Base {\n    constructor(glyph) {\n      super();\n      this.glyph = glyph;\n    }\n\n  };\n\n  //### Code\n\n  // A function definition. This is the only node that creates a new Scope.\n  // When for the purposes of walking the contents of a function body, the Code\n  // has no *children* -- they're within the inner scope.\n  exports.Code = Code = (function() {\n    class Code extends Base {\n      constructor(params, body, funcGlyph, paramStart) {\n        var ref1;\n        super();\n        this.funcGlyph = funcGlyph;\n        this.paramStart = paramStart;\n        this.params = params || [];\n        this.body = body || new Block();\n        this.bound = ((ref1 = this.funcGlyph) != null ? ref1.glyph : void 0) === '=>';\n        this.isGenerator = false;\n        this.isAsync = false;\n        this.isMethod = false;\n        this.body.traverseChildren(false, (node) => {\n          if ((node instanceof Op && node.isYield()) || node instanceof YieldReturn) {\n            this.isGenerator = true;\n          }\n          if ((node instanceof Op && node.isAwait()) || node instanceof AwaitReturn) {\n            this.isAsync = true;\n          }\n          if (node instanceof For && node.isAwait()) {\n            return this.isAsync = true;\n          }\n        });\n        this.propagateLhs();\n      }\n\n      isStatement() {\n        return this.isMethod;\n      }\n\n      makeScope(parentScope) {\n        return new Scope(parentScope, this.body, this);\n      }\n\n      // Compilation creates a new scope unless explicitly asked to share with the\n      // outer scope. Handles splat parameters in the parameter list by setting\n      // such parameters to be the final parameter in the function definition, as\n      // required per the ES2015 spec. If the CoffeeScript function definition had\n      // parameters after the splat, they are declared via expressions in the\n      // function body.\n      compileNode(o) {\n        var answer, body, boundMethodCheck, comment, condition, exprs, generatedVariables, haveBodyParam, haveSplatParam, i, ifTrue, j, k, l, len1, len2, len3, m, methodScope, modifiers, name, param, paramToAddToScope, params, paramsAfterSplat, ref, ref1, ref2, ref3, ref4, ref5, ref6, ref7, ref8, scopeVariablesCount, signature, splatParamName, thisAssignments, wasEmpty, yieldNode;\n        this.checkForAsyncOrGeneratorConstructor();\n        if (this.bound) {\n          if ((ref1 = o.scope.method) != null ? ref1.bound : void 0) {\n            this.context = o.scope.method.context;\n          }\n          if (!this.context) {\n            this.context = 'this';\n          }\n        }\n        this.updateOptions(o);\n        params = [];\n        exprs = [];\n        thisAssignments = (ref2 = (ref3 = this.thisAssignments) != null ? ref3.slice() : void 0) != null ? ref2 : [];\n        paramsAfterSplat = [];\n        haveSplatParam = false;\n        haveBodyParam = false;\n        this.checkForDuplicateParams();\n        this.disallowLoneExpansionAndMultipleSplats();\n        // Separate `this` assignments.\n        this.eachParamName(function(name, node, param, obj) {\n          var replacement, target;\n          if (node.this) {\n            name = node.properties[0].name.value;\n            if (indexOf.call(JS_FORBIDDEN, name) >= 0) {\n              name = `_${name}`;\n            }\n            target = new IdentifierLiteral(o.scope.freeVariable(name, {\n              reserve: false\n            }));\n            // `Param` is object destructuring with a default value: ({@prop = 1}) ->\n            // In a case when the variable name is already reserved, we have to assign\n            // a new variable name to the destructured variable: ({prop:prop1 = 1}) ->\n            replacement = param.name instanceof Obj && obj instanceof Assign && obj.operatorToken.value === '=' ? new Assign(new IdentifierLiteral(name), target, 'object') : target; //, operatorToken: new Literal ':'\n            param.renameParam(node, replacement);\n            return thisAssignments.push(new Assign(node, target));\n          }\n        });\n        ref4 = this.params;\n        // Parse the parameters, adding them to the list of parameters to put in the\n        // function definition; and dealing with splats or expansions, including\n        // adding expressions to the function body to declare all parameter\n        // variables that would have been after the splat/expansion parameter.\n        // If we encounter a parameter that needs to be declared in the function\n        // body for any reason, for example it’s destructured with `this`, also\n        // declare and assign all subsequent parameters in the function body so that\n        // any non-idempotent parameters are evaluated in the correct order.\n        for (i = j = 0, len1 = ref4.length; j < len1; i = ++j) {\n          param = ref4[i];\n          // Was `...` used with this parameter? Splat/expansion parameters cannot\n          // have default values, so we need not worry about that.\n          if (param.splat || param instanceof Expansion) {\n            haveSplatParam = true;\n            if (param.splat) {\n              if (param.name instanceof Arr || param.name instanceof Obj) {\n                // Splat arrays are treated oddly by ES; deal with them the legacy\n                // way in the function body. TODO: Should this be handled in the\n                // function parameter list, and if so, how?\n                splatParamName = o.scope.freeVariable('arg');\n                params.push(ref = new Value(new IdentifierLiteral(splatParamName)));\n                exprs.push(new Assign(new Value(param.name), ref));\n              } else {\n                params.push(ref = param.asReference(o));\n                splatParamName = fragmentsToText(ref.compileNodeWithoutComments(o));\n              }\n              if (param.shouldCache()) {\n                exprs.push(new Assign(new Value(param.name), ref)); // `param` is an Expansion\n              }\n            } else {\n              splatParamName = o.scope.freeVariable('args');\n              params.push(new Value(new IdentifierLiteral(splatParamName)));\n            }\n            o.scope.parameter(splatParamName);\n          } else {\n            // Parse all other parameters; if a splat paramater has not yet been\n            // encountered, add these other parameters to the list to be output in\n            // the function definition.\n            if (param.shouldCache() || haveBodyParam) {\n              param.assignedInBody = true;\n              haveBodyParam = true;\n              // This parameter cannot be declared or assigned in the parameter\n              // list. So put a reference in the parameter list and add a statement\n              // to the function body assigning it, e.g.\n              // `(arg) => { var a = arg.a; }`, with a default value if it has one.\n              if (param.value != null) {\n                condition = new Op('===', param, new UndefinedLiteral());\n                ifTrue = new Assign(new Value(param.name), param.value);\n                exprs.push(new If(condition, ifTrue));\n              } else {\n                exprs.push(new Assign(new Value(param.name), param.asReference(o), null, {\n                  param: 'alwaysDeclare'\n                }));\n              }\n            }\n            // If this parameter comes before the splat or expansion, it will go\n            // in the function definition parameter list.\n            if (!haveSplatParam) {\n              // If this parameter has a default value, and it hasn’t already been\n              // set by the `shouldCache()` block above, define it as a statement in\n              // the function body. This parameter comes after the splat parameter,\n              // so we can’t define its default value in the parameter list.\n              if (param.shouldCache()) {\n                ref = param.asReference(o);\n              } else {\n                if ((param.value != null) && !param.assignedInBody) {\n                  ref = new Assign(new Value(param.name), param.value, null, {\n                    param: true\n                  });\n                } else {\n                  ref = param;\n                }\n              }\n              // Add this parameter’s reference(s) to the function scope.\n              if (param.name instanceof Arr || param.name instanceof Obj) {\n                // This parameter is destructured.\n                param.name.lhs = true;\n                if (!param.shouldCache()) {\n                  param.name.eachName(function(prop) {\n                    return o.scope.parameter(prop.value);\n                  });\n                }\n              } else {\n                // This compilation of the parameter is only to get its name to add\n                // to the scope name tracking; since the compilation output here\n                // isn’t kept for eventual output, don’t include comments in this\n                // compilation, so that they get output the “real” time this param\n                // is compiled.\n                paramToAddToScope = param.value != null ? param : ref;\n                o.scope.parameter(fragmentsToText(paramToAddToScope.compileToFragmentsWithoutComments(o)));\n              }\n              params.push(ref);\n            } else {\n              paramsAfterSplat.push(param);\n              // If this parameter had a default value, since it’s no longer in the\n              // function parameter list we need to assign its default value\n              // (if necessary) as an expression in the body.\n              if ((param.value != null) && !param.shouldCache()) {\n                condition = new Op('===', param, new UndefinedLiteral());\n                ifTrue = new Assign(new Value(param.name), param.value);\n                exprs.push(new If(condition, ifTrue));\n              }\n              if (((ref5 = param.name) != null ? ref5.value : void 0) != null) {\n                // Add this parameter to the scope, since it wouldn’t have been added\n                // yet since it was skipped earlier.\n                o.scope.add(param.name.value, 'var', true);\n              }\n            }\n          }\n        }\n        // If there were parameters after the splat or expansion parameter, those\n        // parameters need to be assigned in the body of the function.\n        if (paramsAfterSplat.length !== 0) {\n          // Create a destructured assignment, e.g. `[a, b, c] = [args..., b, c]`\n          exprs.unshift(new Assign(new Value(new Arr([\n            new Splat(new IdentifierLiteral(splatParamName)),\n            ...((function() {\n              var k,\n            len2,\n            results1;\n              results1 = [];\n              for (k = 0, len2 = paramsAfterSplat.length; k < len2; k++) {\n                param = paramsAfterSplat[k];\n                results1.push(param.asReference(o));\n              }\n              return results1;\n            })())\n          ])), new Value(new IdentifierLiteral(splatParamName))));\n        }\n        // Add new expressions to the function body\n        wasEmpty = this.body.isEmpty();\n        this.disallowSuperInParamDefaults();\n        this.checkSuperCallsInConstructorBody();\n        if (!this.expandCtorSuper(thisAssignments)) {\n          this.body.expressions.unshift(...thisAssignments);\n        }\n        this.body.expressions.unshift(...exprs);\n        if (this.isMethod && this.bound && !this.isStatic && this.classVariable) {\n          boundMethodCheck = new Value(new Literal(utility('boundMethodCheck', o)));\n          this.body.expressions.unshift(new Call(boundMethodCheck, [new Value(new ThisLiteral()), this.classVariable]));\n        }\n        if (!(wasEmpty || this.noReturn)) {\n          this.body.makeReturn();\n        }\n        // JavaScript doesn’t allow bound (`=>`) functions to also be generators.\n        // This is usually caught via `Op::compileContinuation`, but double-check:\n        if (this.bound && this.isGenerator) {\n          yieldNode = this.body.contains(function(node) {\n            return node instanceof Op && node.operator === 'yield';\n          });\n          (yieldNode || this).error('yield cannot occur inside bound (fat arrow) functions');\n        }\n        // Assemble the output\n        modifiers = [];\n        if (this.isMethod && this.isStatic) {\n          modifiers.push('static');\n        }\n        if (this.isAsync) {\n          modifiers.push('async');\n        }\n        if (!(this.isMethod || this.bound)) {\n          modifiers.push(`function${this.isGenerator ? '*' : ''}`);\n        } else if (this.isGenerator) {\n          modifiers.push('*');\n        }\n        signature = [this.makeCode('(')];\n        // Block comments between a function name and `(` get output between\n        // `function` and `(`.\n        if (((ref6 = this.paramStart) != null ? ref6.comments : void 0) != null) {\n          this.compileCommentFragments(o, this.paramStart, signature);\n        }\n        for (i = k = 0, len2 = params.length; k < len2; i = ++k) {\n          param = params[i];\n          if (i !== 0) {\n            signature.push(this.makeCode(', '));\n          }\n          if (haveSplatParam && i === params.length - 1) {\n            signature.push(this.makeCode('...'));\n          }\n          // Compile this parameter, but if any generated variables get created\n          // (e.g. `ref`), shift those into the parent scope since we can’t put a\n          // `var` line inside a function parameter list.\n          scopeVariablesCount = o.scope.variables.length;\n          signature.push(...param.compileToFragments(o, LEVEL_PAREN));\n          if (scopeVariablesCount !== o.scope.variables.length) {\n            generatedVariables = o.scope.variables.splice(scopeVariablesCount);\n            o.scope.parent.variables.push(...generatedVariables);\n          }\n        }\n        signature.push(this.makeCode(')'));\n        // Block comments between `)` and `->`/`=>` get output between `)` and `{`.\n        if (((ref7 = this.funcGlyph) != null ? ref7.comments : void 0) != null) {\n          ref8 = this.funcGlyph.comments;\n          for (l = 0, len3 = ref8.length; l < len3; l++) {\n            comment = ref8[l];\n            comment.unshift = false;\n          }\n          this.compileCommentFragments(o, this.funcGlyph, signature);\n        }\n        if (!this.body.isEmpty()) {\n          body = this.body.compileWithDeclarations(o);\n        }\n        // We need to compile the body before method names to ensure `super`\n        // references are handled.\n        if (this.isMethod) {\n          [methodScope, o.scope] = [o.scope, o.scope.parent];\n          name = this.name.compileToFragments(o);\n          if (name[0].code === '.') {\n            name.shift();\n          }\n          o.scope = methodScope;\n        }\n        answer = this.joinFragmentArrays((function() {\n          var len4, p, results1;\n          results1 = [];\n          for (p = 0, len4 = modifiers.length; p < len4; p++) {\n            m = modifiers[p];\n            results1.push(this.makeCode(m));\n          }\n          return results1;\n        }).call(this), ' ');\n        if (modifiers.length && name) {\n          answer.push(this.makeCode(' '));\n        }\n        if (name) {\n          answer.push(...name);\n        }\n        answer.push(...signature);\n        if (this.bound && !this.isMethod) {\n          answer.push(this.makeCode(' =>'));\n        }\n        answer.push(this.makeCode(' {'));\n        if (body != null ? body.length : void 0) {\n          answer.push(this.makeCode('\\n'), ...body, this.makeCode(`\\n${this.tab}`));\n        }\n        answer.push(this.makeCode('}'));\n        if (this.isMethod) {\n          return indentInitial(answer, this);\n        }\n        if (this.front || (o.level >= LEVEL_ACCESS)) {\n          return this.wrapInParentheses(answer);\n        } else {\n          return answer;\n        }\n      }\n\n      updateOptions(o) {\n        o.scope = del(o, 'classScope') || this.makeScope(o.scope);\n        o.scope.shared = del(o, 'sharedScope');\n        o.indent += TAB;\n        delete o.bare;\n        return delete o.isExistentialEquals;\n      }\n\n      checkForDuplicateParams() {\n        var paramNames;\n        paramNames = [];\n        return this.eachParamName(function(name, node, param) {\n          if (indexOf.call(paramNames, name) >= 0) {\n            node.error(`multiple parameters named '${name}'`);\n          }\n          return paramNames.push(name);\n        });\n      }\n\n      eachParamName(iterator) {\n        var j, len1, param, ref1, results1;\n        ref1 = this.params;\n        results1 = [];\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          param = ref1[j];\n          results1.push(param.eachName(iterator));\n        }\n        return results1;\n      }\n\n      // Short-circuit `traverseChildren` method to prevent it from crossing scope\n      // boundaries unless `crossScope` is `true`.\n      traverseChildren(crossScope, func) {\n        if (crossScope) {\n          return super.traverseChildren(crossScope, func);\n        }\n      }\n\n      // Short-circuit `replaceInContext` method to prevent it from crossing context boundaries. Bound\n      // functions have the same context.\n      replaceInContext(child, replacement) {\n        if (this.bound) {\n          return super.replaceInContext(child, replacement);\n        } else {\n          return false;\n        }\n      }\n\n      disallowSuperInParamDefaults({forAst} = {}) {\n        if (!this.ctor) {\n          return false;\n        }\n        return this.eachSuperCall(Block.wrap(this.params), function(superCall) {\n          return superCall.error(\"'super' is not allowed in constructor parameter defaults\");\n        }, {\n          checkForThisBeforeSuper: !forAst\n        });\n      }\n\n      checkSuperCallsInConstructorBody() {\n        var seenSuper;\n        if (!this.ctor) {\n          return false;\n        }\n        seenSuper = this.eachSuperCall(this.body, (superCall) => {\n          if (this.ctor === 'base') {\n            return superCall.error(\"'super' is only allowed in derived class constructors\");\n          }\n        });\n        return seenSuper;\n      }\n\n      flagThisParamInDerivedClassConstructorWithoutCallingSuper(param) {\n        return param.error(\"Can't use @params in derived class constructors without calling super\");\n      }\n\n      checkForAsyncOrGeneratorConstructor() {\n        if (this.ctor) {\n          if (this.isAsync) {\n            this.name.error('Class constructor may not be async');\n          }\n          if (this.isGenerator) {\n            return this.name.error('Class constructor may not be a generator');\n          }\n        }\n      }\n\n      disallowLoneExpansionAndMultipleSplats() {\n        var j, len1, param, ref1, results1, seenSplatParam;\n        seenSplatParam = false;\n        ref1 = this.params;\n        results1 = [];\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          param = ref1[j];\n          // Was `...` used with this parameter? (Only one such parameter is allowed\n          // per function.)\n          if (param.splat || param instanceof Expansion) {\n            if (seenSplatParam) {\n              param.error('only one splat or expansion parameter is allowed per function definition');\n            } else if (param instanceof Expansion && this.params.length === 1) {\n              param.error('an expansion parameter cannot be the only parameter in a function definition');\n            }\n            results1.push(seenSplatParam = true);\n          } else {\n            results1.push(void 0);\n          }\n        }\n        return results1;\n      }\n\n      expandCtorSuper(thisAssignments) {\n        var haveThisParam, param, ref1, seenSuper;\n        if (!this.ctor) {\n          return false;\n        }\n        seenSuper = this.eachSuperCall(this.body, (superCall) => {\n          return superCall.expressions = thisAssignments;\n        });\n        haveThisParam = thisAssignments.length && thisAssignments.length !== ((ref1 = this.thisAssignments) != null ? ref1.length : void 0);\n        if (this.ctor === 'derived' && !seenSuper && haveThisParam) {\n          param = thisAssignments[0].variable;\n          this.flagThisParamInDerivedClassConstructorWithoutCallingSuper(param);\n        }\n        return seenSuper;\n      }\n\n      // Find all super calls in the given context node;\n      // returns `true` if `iterator` is called.\n      eachSuperCall(context, iterator, {checkForThisBeforeSuper = true} = {}) {\n        var seenSuper;\n        seenSuper = false;\n        context.traverseChildren(true, (child) => {\n          var childArgs;\n          if (child instanceof SuperCall) {\n            // `super` in a constructor (the only `super` without an accessor)\n            // cannot be given an argument with a reference to `this`, as that would\n            // be referencing `this` before calling `super`.\n            if (!child.variable.accessor) {\n              childArgs = child.args.filter(function(arg) {\n                return !(arg instanceof Class) && (!(arg instanceof Code) || arg.bound);\n              });\n              Block.wrap(childArgs).traverseChildren(true, (node) => {\n                if (node.this) {\n                  return node.error(\"Can't call super with @params in derived class constructors\");\n                }\n              });\n            }\n            seenSuper = true;\n            iterator(child);\n          } else if (checkForThisBeforeSuper && child instanceof ThisLiteral && this.ctor === 'derived' && !seenSuper) {\n            child.error(\"Can't reference 'this' before calling super in derived class constructors\");\n          }\n          // `super` has the same target in bound (arrow) functions, so check them too\n          return !(child instanceof SuperCall) && (!(child instanceof Code) || child.bound);\n        });\n        return seenSuper;\n      }\n\n      propagateLhs() {\n        var j, len1, name, param, ref1, results1;\n        ref1 = this.params;\n        results1 = [];\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          param = ref1[j];\n          ({name} = param);\n          if (name instanceof Arr || name instanceof Obj) {\n            results1.push(name.propagateLhs(true));\n          } else if (param instanceof Expansion) {\n            results1.push(param.lhs = true);\n          } else {\n            results1.push(void 0);\n          }\n        }\n        return results1;\n      }\n\n      astAddParamsToScope(o) {\n        return this.eachParamName(function(name) {\n          return o.scope.add(name, 'param');\n        });\n      }\n\n      astNode(o) {\n        var seenSuper;\n        this.updateOptions(o);\n        this.checkForAsyncOrGeneratorConstructor();\n        this.checkForDuplicateParams();\n        this.disallowSuperInParamDefaults({\n          forAst: true\n        });\n        this.disallowLoneExpansionAndMultipleSplats();\n        seenSuper = this.checkSuperCallsInConstructorBody();\n        if (this.ctor === 'derived' && !seenSuper) {\n          this.eachParamName((name, node) => {\n            if (node.this) {\n              return this.flagThisParamInDerivedClassConstructorWithoutCallingSuper(node);\n            }\n          });\n        }\n        this.astAddParamsToScope(o);\n        if (!(this.body.isEmpty() || this.noReturn)) {\n          this.body.makeReturn(null, true);\n        }\n        return super.astNode(o);\n      }\n\n      astType() {\n        if (this.isMethod) {\n          return 'ClassMethod';\n        } else if (this.bound) {\n          return 'ArrowFunctionExpression';\n        } else {\n          return 'FunctionExpression';\n        }\n      }\n\n      paramForAst(param) {\n        var name, splat, value;\n        if (param instanceof Expansion) {\n          return param;\n        }\n        ({name, value, splat} = param);\n        if (splat) {\n          return new Splat(name, {\n            lhs: true,\n            postfix: splat.postfix\n          }).withLocationDataFrom(param);\n        } else if (value != null) {\n          return new Assign(name, value, null, {\n            param: true\n          }).withLocationDataFrom({\n            locationData: mergeLocationData(name.locationData, value.locationData)\n          });\n        } else {\n          return name;\n        }\n      }\n\n      methodAstProperties(o) {\n        var getIsComputed, ref1, ref2, ref3, ref4;\n        getIsComputed = () => {\n          if (this.name instanceof Index) {\n            return true;\n          }\n          if (this.name instanceof ComputedPropertyName) {\n            return true;\n          }\n          if (this.name.name instanceof ComputedPropertyName) {\n            return true;\n          }\n          return false;\n        };\n        return {\n          static: !!this.isStatic,\n          key: this.name.ast(o),\n          computed: getIsComputed(),\n          kind: this.ctor ? 'constructor' : 'method',\n          operator: (ref1 = (ref2 = this.operatorToken) != null ? ref2.value : void 0) != null ? ref1 : '=',\n          staticClassName: (ref3 = (ref4 = this.isStatic.staticClassName) != null ? ref4.ast(o) : void 0) != null ? ref3 : null,\n          bound: !!this.bound\n        };\n      }\n\n      astProperties(o) {\n        var param, ref1;\n        return Object.assign({\n          params: (function() {\n            var j, len1, ref1, results1;\n            ref1 = this.params;\n            results1 = [];\n            for (j = 0, len1 = ref1.length; j < len1; j++) {\n              param = ref1[j];\n              results1.push(this.paramForAst(param).ast(o));\n            }\n            return results1;\n          }).call(this),\n          body: this.body.ast(Object.assign({}, o, {\n            checkForDirectives: true\n          }), LEVEL_TOP),\n          generator: !!this.isGenerator,\n          async: !!this.isAsync,\n          // We never generate named functions, so specify `id` as `null`, which\n          // matches the Babel AST for anonymous function expressions/arrow functions\n          id: null,\n          hasIndentedBody: this.body.locationData.first_line > ((ref1 = this.funcGlyph) != null ? ref1.locationData.first_line : void 0)\n        }, this.isMethod ? this.methodAstProperties(o) : {});\n      }\n\n      astLocationData() {\n        var astLocationData, functionLocationData;\n        functionLocationData = super.astLocationData();\n        if (!this.isMethod) {\n          return functionLocationData;\n        }\n        astLocationData = mergeAstLocationData(this.name.astLocationData(), functionLocationData);\n        if (this.isStatic.staticClassName != null) {\n          astLocationData = mergeAstLocationData(this.isStatic.staticClassName.astLocationData(), astLocationData);\n        }\n        return astLocationData;\n      }\n\n    };\n\n    Code.prototype.children = ['params', 'body'];\n\n    Code.prototype.jumps = NO;\n\n    return Code;\n\n  }).call(this);\n\n  //### Param\n\n  // A parameter in a function definition. Beyond a typical JavaScript parameter,\n  // these parameters can also attach themselves to the context of the function,\n  // as well as be a splat, gathering up a group of parameters into an array.\n  exports.Param = Param = (function() {\n    class Param extends Base {\n      constructor(name1, value1, splat1) {\n        var message, token;\n        super();\n        this.name = name1;\n        this.value = value1;\n        this.splat = splat1;\n        message = isUnassignable(this.name.unwrapAll().value);\n        if (message) {\n          this.name.error(message);\n        }\n        if (this.name instanceof Obj && this.name.generated) {\n          token = this.name.objects[0].operatorToken;\n          token.error(`unexpected ${token.value}`);\n        }\n      }\n\n      compileToFragments(o) {\n        return this.name.compileToFragments(o, LEVEL_LIST);\n      }\n\n      compileToFragmentsWithoutComments(o) {\n        return this.name.compileToFragmentsWithoutComments(o, LEVEL_LIST);\n      }\n\n      asReference(o) {\n        var name, node;\n        if (this.reference) {\n          return this.reference;\n        }\n        node = this.name;\n        if (node.this) {\n          name = node.properties[0].name.value;\n          if (indexOf.call(JS_FORBIDDEN, name) >= 0) {\n            name = `_${name}`;\n          }\n          node = new IdentifierLiteral(o.scope.freeVariable(name));\n        } else if (node.shouldCache()) {\n          node = new IdentifierLiteral(o.scope.freeVariable('arg'));\n        }\n        node = new Value(node);\n        node.updateLocationDataIfMissing(this.locationData);\n        return this.reference = node;\n      }\n\n      shouldCache() {\n        return this.name.shouldCache();\n      }\n\n      // Iterates the name or names of a `Param`.\n      // In a sense, a destructured parameter represents multiple JS parameters. This\n      // method allows to iterate them all.\n      // The `iterator` function will be called as `iterator(name, node)` where\n      // `name` is the name of the parameter and `node` is the AST node corresponding\n      // to that name.\n      eachName(iterator, name = this.name) {\n        var atParam, checkAssignabilityOfLiteral, j, len1, nObj, node, obj, ref1, ref2;\n        checkAssignabilityOfLiteral = function(literal) {\n          var message;\n          message = isUnassignable(literal.value);\n          if (message) {\n            literal.error(message);\n          }\n          if (!literal.isAssignable()) {\n            return literal.error(`'${literal.value}' can't be assigned`);\n          }\n        };\n        atParam = (obj, originalObj = null) => {\n          return iterator(`@${obj.properties[0].name.value}`, obj, this, originalObj);\n        };\n        if (name instanceof Call) {\n          name.error(\"Function invocation can't be assigned\");\n        }\n        // * simple literals `foo`\n        if (name instanceof Literal) {\n          checkAssignabilityOfLiteral(name);\n          return iterator(name.value, name, this);\n        }\n        if (name instanceof Value) {\n          // * at-params `@foo`\n          return atParam(name);\n        }\n        ref2 = (ref1 = name.objects) != null ? ref1 : [];\n        for (j = 0, len1 = ref2.length; j < len1; j++) {\n          obj = ref2[j];\n          // Save original obj.\n          nObj = obj;\n          // * destructured parameter with default value\n          if (obj instanceof Assign && (obj.context == null)) {\n            obj = obj.variable;\n          }\n          // * assignments within destructured parameters `{foo:bar}`\n          if (obj instanceof Assign) {\n            // ... possibly with a default value\n            if (obj.value instanceof Assign) {\n              obj = obj.value.variable;\n            } else {\n              obj = obj.value;\n            }\n            this.eachName(iterator, obj.unwrap());\n          // * splats within destructured parameters `[xs...]`\n          } else if (obj instanceof Splat) {\n            node = obj.name.unwrap();\n            iterator(node.value, node, this);\n          } else if (obj instanceof Value) {\n            // * destructured parameters within destructured parameters `[{a}]`\n            if (obj.isArray() || obj.isObject()) {\n              this.eachName(iterator, obj.base);\n            // * at-params within destructured parameters `{@foo}`\n            } else if (obj.this) {\n              atParam(obj, nObj);\n            } else {\n              // * simple destructured parameters {foo}\n              checkAssignabilityOfLiteral(obj.base);\n              iterator(obj.base.value, obj.base, this);\n            }\n          } else if (obj instanceof Elision) {\n            obj;\n          } else if (!(obj instanceof Expansion)) {\n            obj.error(`illegal parameter ${obj.compile()}`);\n          }\n        }\n      }\n\n      // Rename a param by replacing the given AST node for a name with a new node.\n      // This needs to ensure that the the source for object destructuring does not change.\n      renameParam(node, newNode) {\n        var isNode, replacement;\n        isNode = function(candidate) {\n          return candidate === node;\n        };\n        replacement = (node, parent) => {\n          var key;\n          if (parent instanceof Obj) {\n            key = node;\n            if (node.this) {\n              key = node.properties[0].name;\n            }\n            // No need to assign a new variable for the destructured variable if the variable isn't reserved.\n            // Examples:\n            // `({@foo}) ->`  should compile to `({foo}) { this.foo = foo}`\n            // `foo = 1; ({@foo}) ->` should compile to `foo = 1; ({foo:foo1}) { this.foo = foo1 }`\n            if (node.this && key.value === newNode.value) {\n              return new Value(newNode);\n            } else {\n              return new Assign(new Value(key), newNode, 'object');\n            }\n          } else {\n            return newNode;\n          }\n        };\n        return this.replaceInContext(isNode, replacement);\n      }\n\n    };\n\n    Param.prototype.children = ['name', 'value'];\n\n    return Param;\n\n  }).call(this);\n\n  //### Splat\n\n  // A splat, either as a parameter to a function, an argument to a call,\n  // or as part of a destructuring assignment.\n  exports.Splat = Splat = (function() {\n    class Splat extends Base {\n      constructor(name, {\n          lhs: lhs1,\n          postfix: postfix = true\n        } = {}) {\n        super();\n        this.lhs = lhs1;\n        this.postfix = postfix;\n        this.name = name.compile ? name : new Literal(name);\n      }\n\n      shouldCache() {\n        return false;\n      }\n\n      isAssignable({allowComplexSplat = false} = {}) {\n        if (this.name instanceof Obj || this.name instanceof Parens) {\n          return allowComplexSplat;\n        }\n        return this.name.isAssignable() && (!this.name.isAtomic || this.name.isAtomic());\n      }\n\n      assigns(name) {\n        return this.name.assigns(name);\n      }\n\n      compileNode(o) {\n        var compiledSplat;\n        compiledSplat = [this.makeCode('...'), ...this.name.compileToFragments(o, LEVEL_OP)];\n        if (!this.jsx) {\n          return compiledSplat;\n        }\n        return [this.makeCode('{'), ...compiledSplat, this.makeCode('}')];\n      }\n\n      unwrap() {\n        return this.name;\n      }\n\n      propagateLhs(setLhs) {\n        var base1;\n        if (setLhs) {\n          this.lhs = true;\n        }\n        if (!this.lhs) {\n          return;\n        }\n        return typeof (base1 = this.name).propagateLhs === \"function\" ? base1.propagateLhs(true) : void 0;\n      }\n\n      astType() {\n        if (this.jsx) {\n          return 'JSXSpreadAttribute';\n        } else if (this.lhs) {\n          return 'RestElement';\n        } else {\n          return 'SpreadElement';\n        }\n      }\n\n      astProperties(o) {\n        return {\n          argument: this.name.ast(o, LEVEL_OP),\n          postfix: this.postfix\n        };\n      }\n\n    };\n\n    Splat.prototype.children = ['name'];\n\n    return Splat;\n\n  }).call(this);\n\n  //### Expansion\n\n  // Used to skip values inside an array destructuring (pattern matching) or\n  // parameter list.\n  exports.Expansion = Expansion = (function() {\n    class Expansion extends Base {\n      compileNode(o) {\n        return this.throwLhsError();\n      }\n\n      asReference(o) {\n        return this;\n      }\n\n      eachName(iterator) {}\n\n      throwLhsError() {\n        return this.error('Expansion must be used inside a destructuring assignment or parameter list');\n      }\n\n      astNode(o) {\n        if (!this.lhs) {\n          this.throwLhsError();\n        }\n        return super.astNode(o);\n      }\n\n      astType() {\n        return 'RestElement';\n      }\n\n      astProperties() {\n        return {\n          argument: null\n        };\n      }\n\n    };\n\n    Expansion.prototype.shouldCache = NO;\n\n    return Expansion;\n\n  }).call(this);\n\n  //### Elision\n\n  // Array elision element (for example, [,a, , , b, , c, ,]).\n  exports.Elision = Elision = (function() {\n    class Elision extends Base {\n      compileToFragments(o, level) {\n        var fragment;\n        fragment = super.compileToFragments(o, level);\n        fragment.isElision = true;\n        return fragment;\n      }\n\n      compileNode(o) {\n        return [this.makeCode(', ')];\n      }\n\n      asReference(o) {\n        return this;\n      }\n\n      eachName(iterator) {}\n\n      astNode() {\n        return null;\n      }\n\n    };\n\n    Elision.prototype.isAssignable = YES;\n\n    Elision.prototype.shouldCache = NO;\n\n    return Elision;\n\n  }).call(this);\n\n  //### While\n\n  // A while loop, the only sort of low-level loop exposed by CoffeeScript. From\n  // it, all other loops can be manufactured. Useful in cases where you need more\n  // flexibility or more speed than a comprehension can provide.\n  exports.While = While = (function() {\n    class While extends Base {\n      constructor(condition1, {\n          invert: inverted,\n          guard,\n          isLoop\n        } = {}) {\n        super();\n        this.condition = condition1;\n        this.inverted = inverted;\n        this.guard = guard;\n        this.isLoop = isLoop;\n      }\n\n      makeReturn(results, mark) {\n        if (results) {\n          return super.makeReturn(results, mark);\n        }\n        this.returns = !this.jumps();\n        if (mark) {\n          if (this.returns) {\n            this.body.makeReturn(results, mark);\n          }\n          return;\n        }\n        return this;\n      }\n\n      addBody(body1) {\n        this.body = body1;\n        return this;\n      }\n\n      jumps() {\n        var expressions, j, jumpNode, len1, node;\n        ({expressions} = this.body);\n        if (!expressions.length) {\n          return false;\n        }\n        for (j = 0, len1 = expressions.length; j < len1; j++) {\n          node = expressions[j];\n          if (jumpNode = node.jumps({\n            loop: true\n          })) {\n            return jumpNode;\n          }\n        }\n        return false;\n      }\n\n      // The main difference from a JavaScript *while* is that the CoffeeScript\n      // *while* can be used as a part of a larger expression -- while loops may\n      // return an array containing the computed result of each iteration.\n      compileNode(o) {\n        var answer, body, rvar, set;\n        o.indent += TAB;\n        set = '';\n        ({body} = this);\n        if (body.isEmpty()) {\n          body = this.makeCode('');\n        } else {\n          if (this.returns) {\n            body.makeReturn(rvar = o.scope.freeVariable('results'));\n            set = `${this.tab}${rvar} = [];\\n`;\n          }\n          if (this.guard) {\n            if (body.expressions.length > 1) {\n              body.expressions.unshift(new If((new Parens(this.guard)).invert(), new StatementLiteral(\"continue\")));\n            } else {\n              if (this.guard) {\n                body = Block.wrap([new If(this.guard, body)]);\n              }\n            }\n          }\n          body = [].concat(this.makeCode(\"\\n\"), body.compileToFragments(o, LEVEL_TOP), this.makeCode(`\\n${this.tab}`));\n        }\n        answer = [].concat(this.makeCode(set + this.tab + \"while (\"), this.processedCondition().compileToFragments(o, LEVEL_PAREN), this.makeCode(\") {\"), body, this.makeCode(\"}\"));\n        if (this.returns) {\n          answer.push(this.makeCode(`\\n${this.tab}return ${rvar};`));\n        }\n        return answer;\n      }\n\n      processedCondition() {\n        return this.processedConditionCache != null ? this.processedConditionCache : this.processedConditionCache = this.inverted ? this.condition.invert() : this.condition;\n      }\n\n      astType() {\n        return 'WhileStatement';\n      }\n\n      astProperties(o) {\n        var ref1, ref2;\n        return {\n          test: this.condition.ast(o, LEVEL_PAREN),\n          body: this.body.ast(o, LEVEL_TOP),\n          guard: (ref1 = (ref2 = this.guard) != null ? ref2.ast(o) : void 0) != null ? ref1 : null,\n          inverted: !!this.inverted,\n          postfix: !!this.postfix,\n          loop: !!this.isLoop\n        };\n      }\n\n    };\n\n    While.prototype.children = ['condition', 'guard', 'body'];\n\n    While.prototype.isStatement = YES;\n\n    return While;\n\n  }).call(this);\n\n  //### Op\n\n  // Simple Arithmetic and logical operations. Performs some conversion from\n  // CoffeeScript operations into their JavaScript equivalents.\n  exports.Op = Op = (function() {\n    var CONVERSIONS, INVERSIONS;\n\n    class Op extends Base {\n      constructor(op, first, second, flip, {invertOperator, originalOperator: originalOperator = op} = {}) {\n        var call, firstCall, message, ref1, unwrapped;\n        super();\n        this.invertOperator = invertOperator;\n        this.originalOperator = originalOperator;\n        if (op === 'new') {\n          if (((firstCall = unwrapped = first.unwrap()) instanceof Call || (firstCall = unwrapped.base) instanceof Call) && !firstCall.do && !firstCall.isNew) {\n            return new Value(firstCall.newInstance(), firstCall === unwrapped ? [] : unwrapped.properties);\n          }\n          if (!(first instanceof Parens || first.unwrap() instanceof IdentifierLiteral || (typeof first.hasProperties === \"function\" ? first.hasProperties() : void 0))) {\n            first = new Parens(first);\n          }\n          call = new Call(first, []);\n          call.locationData = this.locationData;\n          call.isNew = true;\n          return call;\n        }\n        this.operator = CONVERSIONS[op] || op;\n        this.first = first;\n        this.second = second;\n        this.flip = !!flip;\n        if ((ref1 = this.operator) === '--' || ref1 === '++') {\n          message = isUnassignable(this.first.unwrapAll().value);\n          if (message) {\n            this.first.error(message);\n          }\n        }\n        return this;\n      }\n\n      isNumber() {\n        var ref1;\n        return this.isUnary() && ((ref1 = this.operator) === '+' || ref1 === '-') && this.first instanceof Value && this.first.isNumber();\n      }\n\n      isAwait() {\n        return this.operator === 'await';\n      }\n\n      isYield() {\n        var ref1;\n        return (ref1 = this.operator) === 'yield' || ref1 === 'yield*';\n      }\n\n      isUnary() {\n        return !this.second;\n      }\n\n      shouldCache() {\n        return !this.isNumber();\n      }\n\n      // Am I capable of\n      // [Python-style comparison chaining](https://docs.python.org/3/reference/expressions.html#not-in)?\n      isChainable() {\n        var ref1;\n        return (ref1 = this.operator) === '<' || ref1 === '>' || ref1 === '>=' || ref1 === '<=' || ref1 === '===' || ref1 === '!==';\n      }\n\n      isChain() {\n        return this.isChainable() && this.first.isChainable();\n      }\n\n      invert() {\n        var allInvertable, curr, fst, op, ref1;\n        if (this.isInOperator()) {\n          this.invertOperator = '!';\n          return this;\n        }\n        if (this.isChain()) {\n          allInvertable = true;\n          curr = this;\n          while (curr && curr.operator) {\n            allInvertable && (allInvertable = curr.operator in INVERSIONS);\n            curr = curr.first;\n          }\n          if (!allInvertable) {\n            return new Parens(this).invert();\n          }\n          curr = this;\n          while (curr && curr.operator) {\n            curr.invert = !curr.invert;\n            curr.operator = INVERSIONS[curr.operator];\n            curr = curr.first;\n          }\n          return this;\n        } else if (op = INVERSIONS[this.operator]) {\n          this.operator = op;\n          if (this.first.unwrap() instanceof Op) {\n            this.first.invert();\n          }\n          return this;\n        } else if (this.second) {\n          return new Parens(this).invert();\n        } else if (this.operator === '!' && (fst = this.first.unwrap()) instanceof Op && ((ref1 = fst.operator) === '!' || ref1 === 'in' || ref1 === 'instanceof')) {\n          return fst;\n        } else {\n          return new Op('!', this);\n        }\n      }\n\n      unfoldSoak(o) {\n        var ref1;\n        return ((ref1 = this.operator) === '++' || ref1 === '--' || ref1 === 'delete') && unfoldSoak(o, this, 'first');\n      }\n\n      generateDo(exp) {\n        var call, func, j, len1, param, passedParams, ref, ref1;\n        passedParams = [];\n        func = exp instanceof Assign && (ref = exp.value.unwrap()) instanceof Code ? ref : exp;\n        ref1 = func.params || [];\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          param = ref1[j];\n          if (param.value) {\n            passedParams.push(param.value);\n            delete param.value;\n          } else {\n            passedParams.push(param);\n          }\n        }\n        call = new Call(exp, passedParams);\n        call.do = true;\n        return call;\n      }\n\n      isInOperator() {\n        return this.originalOperator === 'in';\n      }\n\n      compileNode(o) {\n        var answer, inNode, isChain, lhs, rhs;\n        if (this.isInOperator()) {\n          inNode = new In(this.first, this.second);\n          return (this.invertOperator ? inNode.invert() : inNode).compileNode(o);\n        }\n        if (this.invertOperator) {\n          this.invertOperator = null;\n          return this.invert().compileNode(o);\n        }\n        if (this.operator === 'do') {\n          return Op.prototype.generateDo(this.first).compileNode(o);\n        }\n        isChain = this.isChain();\n        if (!isChain) {\n          // In chains, there's no need to wrap bare obj literals in parens,\n          // as the chained expression is wrapped.\n          this.first.front = this.front;\n        }\n        this.checkDeleteOperand(o);\n        if (this.isYield() || this.isAwait()) {\n          return this.compileContinuation(o);\n        }\n        if (this.isUnary()) {\n          return this.compileUnary(o);\n        }\n        if (isChain) {\n          return this.compileChain(o);\n        }\n        switch (this.operator) {\n          case '?':\n            return this.compileExistence(o, this.second.isDefaultValue);\n          case '//':\n            return this.compileFloorDivision(o);\n          case '%%':\n            return this.compileModulo(o);\n          default:\n            lhs = this.first.compileToFragments(o, LEVEL_OP);\n            rhs = this.second.compileToFragments(o, LEVEL_OP);\n            answer = [].concat(lhs, this.makeCode(` ${this.operator} `), rhs);\n            if (o.level <= LEVEL_OP) {\n              return answer;\n            } else {\n              return this.wrapInParentheses(answer);\n            }\n        }\n      }\n\n      // Mimic Python's chained comparisons when multiple comparison operators are\n      // used sequentially. For example:\n\n      //     bin/coffee -e 'console.log 50 < 65 > 10'\n      //     true\n      compileChain(o) {\n        var fragments, fst, shared;\n        [this.first.second, shared] = this.first.second.cache(o);\n        fst = this.first.compileToFragments(o, LEVEL_OP);\n        fragments = fst.concat(this.makeCode(` ${this.invert ? '&&' : '||'} `), shared.compileToFragments(o), this.makeCode(` ${this.operator} `), this.second.compileToFragments(o, LEVEL_OP));\n        return this.wrapInParentheses(fragments);\n      }\n\n      // Keep reference to the left expression, unless this an existential assignment\n      compileExistence(o, checkOnlyUndefined) {\n        var fst, ref;\n        if (this.first.shouldCache()) {\n          ref = new IdentifierLiteral(o.scope.freeVariable('ref'));\n          fst = new Parens(new Assign(ref, this.first));\n        } else {\n          fst = this.first;\n          ref = fst;\n        }\n        return new If(new Existence(fst, checkOnlyUndefined), ref, {\n          type: 'if'\n        }).addElse(this.second).compileToFragments(o);\n      }\n\n      // Compile a unary **Op**.\n      compileUnary(o) {\n        var op, parts, plusMinus;\n        parts = [];\n        op = this.operator;\n        parts.push([this.makeCode(op)]);\n        if (op === '!' && this.first instanceof Existence) {\n          this.first.negated = !this.first.negated;\n          return this.first.compileToFragments(o);\n        }\n        if (o.level >= LEVEL_ACCESS) {\n          return (new Parens(this)).compileToFragments(o);\n        }\n        plusMinus = op === '+' || op === '-';\n        if ((op === 'typeof' || op === 'delete') || plusMinus && this.first instanceof Op && this.first.operator === op) {\n          parts.push([this.makeCode(' ')]);\n        }\n        if (plusMinus && this.first instanceof Op) {\n          this.first = new Parens(this.first);\n        }\n        parts.push(this.first.compileToFragments(o, LEVEL_OP));\n        if (this.flip) {\n          parts.reverse();\n        }\n        return this.joinFragmentArrays(parts, '');\n      }\n\n      compileContinuation(o) {\n        var op, parts, ref1;\n        parts = [];\n        op = this.operator;\n        if (!this.isAwait()) {\n          this.checkContinuation(o);\n        }\n        if (indexOf.call(Object.keys(this.first), 'expression') >= 0 && !(this.first instanceof Throw)) {\n          if (this.first.expression != null) {\n            parts.push(this.first.expression.compileToFragments(o, LEVEL_OP));\n          }\n        } else {\n          if (o.level >= LEVEL_PAREN) {\n            parts.push([this.makeCode(\"(\")]);\n          }\n          parts.push([this.makeCode(op)]);\n          if (((ref1 = this.first.base) != null ? ref1.value : void 0) !== '') {\n            parts.push([this.makeCode(\" \")]);\n          }\n          parts.push(this.first.compileToFragments(o, LEVEL_OP));\n          if (o.level >= LEVEL_PAREN) {\n            parts.push([this.makeCode(\")\")]);\n          }\n        }\n        return this.joinFragmentArrays(parts, '');\n      }\n\n      checkContinuation(o) {\n        var ref1;\n        if (o.scope.parent == null) {\n          this.error(`${this.operator} can only occur inside functions`);\n        }\n        if (((ref1 = o.scope.method) != null ? ref1.bound : void 0) && o.scope.method.isGenerator) {\n          return this.error('yield cannot occur inside bound (fat arrow) functions');\n        }\n      }\n\n      compileFloorDivision(o) {\n        var div, floor, second;\n        floor = new Value(new IdentifierLiteral('Math'), [new Access(new PropertyName('floor'))]);\n        second = this.second.shouldCache() ? new Parens(this.second) : this.second;\n        div = new Op('/', this.first, second);\n        return new Call(floor, [div]).compileToFragments(o);\n      }\n\n      compileModulo(o) {\n        var mod;\n        mod = new Value(new Literal(utility('modulo', o)));\n        return new Call(mod, [this.first, this.second]).compileToFragments(o);\n      }\n\n      toString(idt) {\n        return super.toString(idt, this.constructor.name + ' ' + this.operator);\n      }\n\n      checkDeleteOperand(o) {\n        if (this.operator === 'delete' && o.scope.check(this.first.unwrapAll().value)) {\n          return this.error('delete operand may not be argument or var');\n        }\n      }\n\n      astNode(o) {\n        if (this.isYield()) {\n          this.checkContinuation(o);\n        }\n        this.checkDeleteOperand(o);\n        return super.astNode(o);\n      }\n\n      astType() {\n        if (this.isAwait()) {\n          return 'AwaitExpression';\n        }\n        if (this.isYield()) {\n          return 'YieldExpression';\n        }\n        if (this.isChain()) {\n          return 'ChainedComparison';\n        }\n        switch (this.operator) {\n          case '||':\n          case '&&':\n          case '?':\n            return 'LogicalExpression';\n          case '++':\n          case '--':\n            return 'UpdateExpression';\n          default:\n            if (this.isUnary()) {\n              return 'UnaryExpression';\n            } else {\n              return 'BinaryExpression';\n            }\n        }\n      }\n\n      operatorAst() {\n        return `${this.invertOperator ? `${this.invertOperator} ` : ''}${this.originalOperator}`;\n      }\n\n      chainAstProperties(o) {\n        var currentOp, operand, operands, operators;\n        operators = [this.operatorAst()];\n        operands = [this.second];\n        currentOp = this.first;\n        while (true) {\n          operators.unshift(currentOp.operatorAst());\n          operands.unshift(currentOp.second);\n          currentOp = currentOp.first;\n          if (!currentOp.isChainable()) {\n            operands.unshift(currentOp);\n            break;\n          }\n        }\n        return {\n          operators,\n          operands: (function() {\n            var j, len1, results1;\n            results1 = [];\n            for (j = 0, len1 = operands.length; j < len1; j++) {\n              operand = operands[j];\n              results1.push(operand.ast(o, LEVEL_OP));\n            }\n            return results1;\n          })()\n        };\n      }\n\n      astProperties(o) {\n        var argument, firstAst, operatorAst, ref1, secondAst;\n        if (this.isChain()) {\n          return this.chainAstProperties(o);\n        }\n        firstAst = this.first.ast(o, LEVEL_OP);\n        secondAst = (ref1 = this.second) != null ? ref1.ast(o, LEVEL_OP) : void 0;\n        operatorAst = this.operatorAst();\n        switch (false) {\n          case !this.isUnary():\n            argument = this.isYield() && this.first.unwrap().value === '' ? null : firstAst;\n            if (this.isAwait()) {\n              return {argument};\n            }\n            if (this.isYield()) {\n              return {\n                argument,\n                delegate: this.operator === 'yield*'\n              };\n            }\n            return {\n              argument,\n              operator: operatorAst,\n              prefix: !this.flip\n            };\n          default:\n            return {\n              left: firstAst,\n              right: secondAst,\n              operator: operatorAst\n            };\n        }\n      }\n\n    };\n\n    // The map of conversions from CoffeeScript to JavaScript symbols.\n    CONVERSIONS = {\n      '==': '===',\n      '!=': '!==',\n      'of': 'in',\n      'yieldfrom': 'yield*'\n    };\n\n    // The map of invertible operators.\n    INVERSIONS = {\n      '!==': '===',\n      '===': '!=='\n    };\n\n    Op.prototype.children = ['first', 'second'];\n\n    return Op;\n\n  }).call(this);\n\n  //### In\n  exports.In = In = (function() {\n    class In extends Base {\n      constructor(object1, array) {\n        super();\n        this.object = object1;\n        this.array = array;\n      }\n\n      compileNode(o) {\n        var hasSplat, j, len1, obj, ref1;\n        if (this.array instanceof Value && this.array.isArray() && this.array.base.objects.length) {\n          ref1 = this.array.base.objects;\n          for (j = 0, len1 = ref1.length; j < len1; j++) {\n            obj = ref1[j];\n            if (!(obj instanceof Splat)) {\n              continue;\n            }\n            hasSplat = true;\n            break;\n          }\n          if (!hasSplat) {\n            // `compileOrTest` only if we have an array literal with no splats\n            return this.compileOrTest(o);\n          }\n        }\n        return this.compileLoopTest(o);\n      }\n\n      compileOrTest(o) {\n        var cmp, cnj, i, item, j, len1, ref, ref1, sub, tests;\n        [sub, ref] = this.object.cache(o, LEVEL_OP);\n        [cmp, cnj] = this.negated ? [' !== ', ' && '] : [' === ', ' || '];\n        tests = [];\n        ref1 = this.array.base.objects;\n        for (i = j = 0, len1 = ref1.length; j < len1; i = ++j) {\n          item = ref1[i];\n          if (i) {\n            tests.push(this.makeCode(cnj));\n          }\n          tests = tests.concat((i ? ref : sub), this.makeCode(cmp), item.compileToFragments(o, LEVEL_ACCESS));\n        }\n        if (o.level < LEVEL_OP) {\n          return tests;\n        } else {\n          return this.wrapInParentheses(tests);\n        }\n      }\n\n      compileLoopTest(o) {\n        var fragments, ref, sub;\n        [sub, ref] = this.object.cache(o, LEVEL_LIST);\n        fragments = [].concat(this.makeCode(utility('indexOf', o) + \".call(\"), this.array.compileToFragments(o, LEVEL_LIST), this.makeCode(\", \"), ref, this.makeCode(\") \" + (this.negated ? '< 0' : '>= 0')));\n        if (fragmentsToText(sub) === fragmentsToText(ref)) {\n          return fragments;\n        }\n        fragments = sub.concat(this.makeCode(', '), fragments);\n        if (o.level < LEVEL_LIST) {\n          return fragments;\n        } else {\n          return this.wrapInParentheses(fragments);\n        }\n      }\n\n      toString(idt) {\n        return super.toString(idt, this.constructor.name + (this.negated ? '!' : ''));\n      }\n\n    };\n\n    In.prototype.children = ['object', 'array'];\n\n    In.prototype.invert = NEGATE;\n\n    return In;\n\n  }).call(this);\n\n  //### Try\n\n  // A classic *try/catch/finally* block.\n  exports.Try = Try = (function() {\n    class Try extends Base {\n      constructor(attempt, _catch, ensure, finallyTag) {\n        super();\n        this.attempt = attempt;\n        this.catch = _catch;\n        this.ensure = ensure;\n        this.finallyTag = finallyTag;\n      }\n\n      jumps(o) {\n        var ref1;\n        return this.attempt.jumps(o) || ((ref1 = this.catch) != null ? ref1.jumps(o) : void 0);\n      }\n\n      makeReturn(results, mark) {\n        var ref1, ref2;\n        if (mark) {\n          if ((ref1 = this.attempt) != null) {\n            ref1.makeReturn(results, mark);\n          }\n          if ((ref2 = this.catch) != null) {\n            ref2.makeReturn(results, mark);\n          }\n          return;\n        }\n        if (this.attempt) {\n          this.attempt = this.attempt.makeReturn(results);\n        }\n        if (this.catch) {\n          this.catch = this.catch.makeReturn(results);\n        }\n        return this;\n      }\n\n      // Compilation is more or less as you would expect -- the *finally* clause\n      // is optional, the *catch* is not.\n      compileNode(o) {\n        var catchPart, ensurePart, generatedErrorVariableName, originalIndent, tryPart;\n        originalIndent = o.indent;\n        o.indent += TAB;\n        tryPart = this.attempt.compileToFragments(o, LEVEL_TOP);\n        catchPart = this.catch ? this.catch.compileToFragments(merge(o, {\n          indent: originalIndent\n        }), LEVEL_TOP) : !(this.ensure || this.catch) ? (generatedErrorVariableName = o.scope.freeVariable('error', {\n          reserve: false\n        }), [this.makeCode(` catch (${generatedErrorVariableName}) {}`)]) : [];\n        ensurePart = this.ensure ? [].concat(this.makeCode(\" finally {\\n\"), this.ensure.compileToFragments(o, LEVEL_TOP), this.makeCode(`\\n${this.tab}}`)) : [];\n        return [].concat(this.makeCode(`${this.tab}try {\\n`), tryPart, this.makeCode(`\\n${this.tab}}`), catchPart, ensurePart);\n      }\n\n      astType() {\n        return 'TryStatement';\n      }\n\n      astProperties(o) {\n        var ref1, ref2;\n        return {\n          block: this.attempt.ast(o, LEVEL_TOP),\n          handler: (ref1 = (ref2 = this.catch) != null ? ref2.ast(o) : void 0) != null ? ref1 : null,\n          // Include `finally` keyword in location data.\n          finalizer: this.ensure != null ? Object.assign(this.ensure.ast(o, LEVEL_TOP), mergeAstLocationData(jisonLocationDataToAstLocationData(this.finallyTag.locationData), this.ensure.astLocationData())) : null\n        };\n      }\n\n    };\n\n    Try.prototype.children = ['attempt', 'catch', 'ensure'];\n\n    Try.prototype.isStatement = YES;\n\n    return Try;\n\n  }).call(this);\n\n  exports.Catch = Catch = (function() {\n    class Catch extends Base {\n      constructor(recovery, errorVariable) {\n        var base1, ref1;\n        super();\n        this.recovery = recovery;\n        this.errorVariable = errorVariable;\n        if ((ref1 = this.errorVariable) != null) {\n          if (typeof (base1 = ref1.unwrap()).propagateLhs === \"function\") {\n            base1.propagateLhs(true);\n          }\n        }\n      }\n\n      jumps(o) {\n        return this.recovery.jumps(o);\n      }\n\n      makeReturn(results, mark) {\n        var ret;\n        ret = this.recovery.makeReturn(results, mark);\n        if (mark) {\n          return;\n        }\n        this.recovery = ret;\n        return this;\n      }\n\n      compileNode(o) {\n        var generatedErrorVariableName, placeholder;\n        o.indent += TAB;\n        generatedErrorVariableName = o.scope.freeVariable('error', {\n          reserve: false\n        });\n        placeholder = new IdentifierLiteral(generatedErrorVariableName);\n        this.checkUnassignable();\n        if (this.errorVariable) {\n          this.recovery.unshift(new Assign(this.errorVariable, placeholder));\n        }\n        return [].concat(this.makeCode(\" catch (\"), placeholder.compileToFragments(o), this.makeCode(\") {\\n\"), this.recovery.compileToFragments(o, LEVEL_TOP), this.makeCode(`\\n${this.tab}}`));\n      }\n\n      checkUnassignable() {\n        var message;\n        if (this.errorVariable) {\n          message = isUnassignable(this.errorVariable.unwrapAll().value);\n          if (message) {\n            return this.errorVariable.error(message);\n          }\n        }\n      }\n\n      astNode(o) {\n        var ref1;\n        this.checkUnassignable();\n        if ((ref1 = this.errorVariable) != null) {\n          ref1.eachName(function(name) {\n            var alreadyDeclared;\n            alreadyDeclared = o.scope.find(name.value);\n            return name.isDeclaration = !alreadyDeclared;\n          });\n        }\n        return super.astNode(o);\n      }\n\n      astType() {\n        return 'CatchClause';\n      }\n\n      astProperties(o) {\n        var ref1, ref2;\n        return {\n          param: (ref1 = (ref2 = this.errorVariable) != null ? ref2.ast(o) : void 0) != null ? ref1 : null,\n          body: this.recovery.ast(o, LEVEL_TOP)\n        };\n      }\n\n    };\n\n    Catch.prototype.children = ['recovery', 'errorVariable'];\n\n    Catch.prototype.isStatement = YES;\n\n    return Catch;\n\n  }).call(this);\n\n  //### Throw\n\n  // Simple node to throw an exception.\n  exports.Throw = Throw = (function() {\n    class Throw extends Base {\n      constructor(expression1) {\n        super();\n        this.expression = expression1;\n      }\n\n      compileNode(o) {\n        var fragments;\n        fragments = this.expression.compileToFragments(o, LEVEL_LIST);\n        unshiftAfterComments(fragments, this.makeCode('throw '));\n        fragments.unshift(this.makeCode(this.tab));\n        fragments.push(this.makeCode(';'));\n        return fragments;\n      }\n\n      astType() {\n        return 'ThrowStatement';\n      }\n\n      astProperties(o) {\n        return {\n          argument: this.expression.ast(o, LEVEL_LIST)\n        };\n      }\n\n    };\n\n    Throw.prototype.children = ['expression'];\n\n    Throw.prototype.isStatement = YES;\n\n    Throw.prototype.jumps = NO;\n\n    // A **Throw** is already a return, of sorts...\n    Throw.prototype.makeReturn = THIS;\n\n    return Throw;\n\n  }).call(this);\n\n  //### Existence\n\n  // Checks a variable for existence -- not `null` and not `undefined`. This is\n  // similar to `.nil?` in Ruby, and avoids having to consult a JavaScript truth\n  // table. Optionally only check if a variable is not `undefined`.\n  exports.Existence = Existence = (function() {\n    class Existence extends Base {\n      constructor(expression1, onlyNotUndefined = false) {\n        var salvagedComments;\n        super();\n        this.expression = expression1;\n        this.comparisonTarget = onlyNotUndefined ? 'undefined' : 'null';\n        salvagedComments = [];\n        this.expression.traverseChildren(true, function(child) {\n          var comment, j, len1, ref1;\n          if (child.comments) {\n            ref1 = child.comments;\n            for (j = 0, len1 = ref1.length; j < len1; j++) {\n              comment = ref1[j];\n              if (indexOf.call(salvagedComments, comment) < 0) {\n                salvagedComments.push(comment);\n              }\n            }\n            return delete child.comments;\n          }\n        });\n        attachCommentsToNode(salvagedComments, this);\n        moveComments(this.expression, this);\n      }\n\n      compileNode(o) {\n        var cmp, cnj, code;\n        this.expression.front = this.front;\n        code = this.expression.compile(o, LEVEL_OP);\n        if (this.expression.unwrap() instanceof IdentifierLiteral && !o.scope.check(code)) {\n          [cmp, cnj] = this.negated ? ['===', '||'] : ['!==', '&&'];\n          code = `typeof ${code} ${cmp} \\\"undefined\\\"` + (this.comparisonTarget !== 'undefined' ? ` ${cnj} ${code} ${cmp} ${this.comparisonTarget}` : '');\n        } else {\n          // We explicity want to use loose equality (`==`) when comparing against `null`,\n          // so that an existence check roughly corresponds to a check for truthiness.\n          // Do *not* change this to `===` for `null`, as this will break mountains of\n          // existing code. When comparing only against `undefined`, however, we want to\n          // use `===` because this use case is for parity with ES2015+ default values,\n          // which only get assigned when the variable is `undefined` (but not `null`).\n          cmp = this.comparisonTarget === 'null' ? this.negated ? '==' : '!=' : this.negated ? '===' : '!=='; // `undefined`\n          code = `${code} ${cmp} ${this.comparisonTarget}`;\n        }\n        return [this.makeCode(o.level <= LEVEL_COND ? code : `(${code})`)];\n      }\n\n      astType() {\n        return 'UnaryExpression';\n      }\n\n      astProperties(o) {\n        return {\n          argument: this.expression.ast(o),\n          operator: '?',\n          prefix: false\n        };\n      }\n\n    };\n\n    Existence.prototype.children = ['expression'];\n\n    Existence.prototype.invert = NEGATE;\n\n    return Existence;\n\n  }).call(this);\n\n  //### Parens\n\n  // An extra set of parentheses, specified explicitly in the source. At one time\n  // we tried to clean up the results by detecting and removing redundant\n  // parentheses, but no longer -- you can put in as many as you please.\n\n  // Parentheses are a good way to force any statement to become an expression.\n  exports.Parens = Parens = (function() {\n    class Parens extends Base {\n      constructor(body1) {\n        super();\n        this.body = body1;\n      }\n\n      unwrap() {\n        return this.body;\n      }\n\n      shouldCache() {\n        return this.body.shouldCache();\n      }\n\n      compileNode(o) {\n        var bare, expr, fragments, ref1, shouldWrapComment;\n        expr = this.body.unwrap();\n        // If these parentheses are wrapping an `IdentifierLiteral` followed by a\n        // block comment, output the parentheses (or put another way, don’t optimize\n        // away these redundant parentheses). This is because Flow requires\n        // parentheses in certain circumstances to distinguish identifiers followed\n        // by comment-based type annotations from JavaScript labels.\n        shouldWrapComment = (ref1 = expr.comments) != null ? ref1.some(function(comment) {\n          return comment.here && !comment.unshift && !comment.newLine;\n        }) : void 0;\n        if (expr instanceof Value && expr.isAtomic() && !this.jsxAttribute && !shouldWrapComment) {\n          expr.front = this.front;\n          return expr.compileToFragments(o);\n        }\n        fragments = expr.compileToFragments(o, LEVEL_PAREN);\n        bare = o.level < LEVEL_OP && !shouldWrapComment && (expr instanceof Op && !expr.isInOperator() || expr.unwrap() instanceof Call || (expr instanceof For && expr.returns)) && (o.level < LEVEL_COND || fragments.length <= 3);\n        if (this.jsxAttribute) {\n          return this.wrapInBraces(fragments);\n        }\n        if (bare) {\n          return fragments;\n        } else {\n          return this.wrapInParentheses(fragments);\n        }\n      }\n\n      astNode(o) {\n        return this.body.unwrap().ast(o, LEVEL_PAREN);\n      }\n\n    };\n\n    Parens.prototype.children = ['body'];\n\n    return Parens;\n\n  }).call(this);\n\n  //### StringWithInterpolations\n  exports.StringWithInterpolations = StringWithInterpolations = (function() {\n    class StringWithInterpolations extends Base {\n      constructor(body1, {quote, startQuote, jsxAttribute} = {}) {\n        super();\n        this.body = body1;\n        this.quote = quote;\n        this.startQuote = startQuote;\n        this.jsxAttribute = jsxAttribute;\n      }\n\n      static fromStringLiteral(stringLiteral) {\n        var updatedString, updatedStringValue;\n        updatedString = stringLiteral.withoutQuotesInLocationData();\n        updatedStringValue = new Value(updatedString).withLocationDataFrom(updatedString);\n        return new StringWithInterpolations(Block.wrap([updatedStringValue]), {\n          quote: stringLiteral.quote,\n          jsxAttribute: stringLiteral.jsxAttribute\n        }).withLocationDataFrom(stringLiteral);\n      }\n\n      // `unwrap` returns `this` to stop ancestor nodes reaching in to grab @body,\n      // and using @body.compileNode. `StringWithInterpolations.compileNode` is\n      // _the_ custom logic to output interpolated strings as code.\n      unwrap() {\n        return this;\n      }\n\n      shouldCache() {\n        return this.body.shouldCache();\n      }\n\n      extractElements(o, {includeInterpolationWrappers, isJsx} = {}) {\n        var elements, expr, salvagedComments;\n        // Assumes that `expr` is `Block`\n        expr = this.body.unwrap();\n        elements = [];\n        salvagedComments = [];\n        expr.traverseChildren(false, (node) => {\n          var comment, commentPlaceholder, empty, j, k, len1, len2, ref1, ref2, ref3, unwrapped;\n          if (node instanceof StringLiteral) {\n            if (node.comments) {\n              salvagedComments.push(...node.comments);\n              delete node.comments;\n            }\n            elements.push(node);\n            return true;\n          } else if (node instanceof Interpolation) {\n            if (salvagedComments.length !== 0) {\n              for (j = 0, len1 = salvagedComments.length; j < len1; j++) {\n                comment = salvagedComments[j];\n                comment.unshift = true;\n                comment.newLine = true;\n              }\n              attachCommentsToNode(salvagedComments, node);\n            }\n            if ((unwrapped = (ref1 = node.expression) != null ? ref1.unwrapAll() : void 0) instanceof PassthroughLiteral && unwrapped.generated && !(isJsx && o.compiling)) {\n              if (o.compiling) {\n                commentPlaceholder = new StringLiteral('').withLocationDataFrom(node);\n                commentPlaceholder.comments = unwrapped.comments;\n                if (node.comments) {\n                  (commentPlaceholder.comments != null ? commentPlaceholder.comments : commentPlaceholder.comments = []).push(...node.comments);\n                }\n                elements.push(new Value(commentPlaceholder));\n              } else {\n                empty = new Interpolation().withLocationDataFrom(node);\n                empty.comments = node.comments;\n                elements.push(empty);\n              }\n            } else if (node.expression || includeInterpolationWrappers) {\n              if (node.comments) {\n                ((ref2 = node.expression) != null ? ref2.comments != null ? ref2.comments : ref2.comments = [] : void 0).push(...node.comments);\n              }\n              elements.push(includeInterpolationWrappers ? node : node.expression);\n            }\n            return false;\n          } else if (node.comments) {\n            // This node is getting discarded, but salvage its comments.\n            if (elements.length !== 0 && !(elements[elements.length - 1] instanceof StringLiteral)) {\n              ref3 = node.comments;\n              for (k = 0, len2 = ref3.length; k < len2; k++) {\n                comment = ref3[k];\n                comment.unshift = false;\n                comment.newLine = true;\n              }\n              attachCommentsToNode(node.comments, elements[elements.length - 1]);\n            } else {\n              salvagedComments.push(...node.comments);\n            }\n            delete node.comments;\n          }\n          return true;\n        });\n        return elements;\n      }\n\n      compileNode(o) {\n        var code, element, elements, fragments, j, len1, ref1, unquotedElementValue, wrapped;\n        if (this.comments == null) {\n          this.comments = (ref1 = this.startQuote) != null ? ref1.comments : void 0;\n        }\n        if (this.jsxAttribute) {\n          wrapped = new Parens(new StringWithInterpolations(this.body));\n          wrapped.jsxAttribute = true;\n          return wrapped.compileNode(o);\n        }\n        elements = this.extractElements(o, {\n          isJsx: this.jsx\n        });\n        fragments = [];\n        if (!this.jsx) {\n          fragments.push(this.makeCode('`'));\n        }\n        for (j = 0, len1 = elements.length; j < len1; j++) {\n          element = elements[j];\n          if (element instanceof StringLiteral) {\n            unquotedElementValue = this.jsx ? element.unquotedValueForJSX : element.unquotedValueForTemplateLiteral;\n            fragments.push(this.makeCode(unquotedElementValue));\n          } else {\n            if (!this.jsx) {\n              fragments.push(this.makeCode('$'));\n            }\n            code = element.compileToFragments(o, LEVEL_PAREN);\n            if (!this.isNestedTag(element) || code.some(function(fragment) {\n              var ref2;\n              return (ref2 = fragment.comments) != null ? ref2.some(function(comment) {\n                return comment.here === false;\n              }) : void 0;\n            })) {\n              code = this.wrapInBraces(code);\n              // Flag the `{` and `}` fragments as having been generated by this\n              // `StringWithInterpolations` node, so that `compileComments` knows\n              // to treat them as bounds. But the braces are unnecessary if all of\n              // the enclosed comments are `/* */` comments. Don’t trust\n              // `fragment.type`, which can report minified variable names when\n              // this compiler is minified.\n              code[0].isStringWithInterpolations = true;\n              code[code.length - 1].isStringWithInterpolations = true;\n            }\n            fragments.push(...code);\n          }\n        }\n        if (!this.jsx) {\n          fragments.push(this.makeCode('`'));\n        }\n        return fragments;\n      }\n\n      isNestedTag(element) {\n        var call;\n        call = typeof element.unwrapAll === \"function\" ? element.unwrapAll() : void 0;\n        return this.jsx && call instanceof JSXElement;\n      }\n\n      astType() {\n        return 'TemplateLiteral';\n      }\n\n      astProperties(o) {\n        var element, elements, emptyInterpolation, expression, expressions, index, j, last, len1, node, quasis;\n        elements = this.extractElements(o, {\n          includeInterpolationWrappers: true\n        });\n        [last] = slice1.call(elements, -1);\n        quasis = [];\n        expressions = [];\n        for (index = j = 0, len1 = elements.length; j < len1; index = ++j) {\n          element = elements[index];\n          if (element instanceof StringLiteral) {\n            quasis.push(new TemplateElement(element.originalValue, {\n              tail: element === last\n            }).withLocationDataFrom(element).ast(o)); // Interpolation\n          } else {\n            ({expression} = element);\n            node = expression == null ? (emptyInterpolation = new EmptyInterpolation(), emptyInterpolation.locationData = emptyExpressionLocationData({\n              interpolationNode: element,\n              openingBrace: '#{',\n              closingBrace: '}'\n            }), emptyInterpolation) : expression.unwrapAll();\n            expressions.push(astAsBlockIfNeeded(node, o));\n          }\n        }\n        return {expressions, quasis, quote: this.quote};\n      }\n\n    };\n\n    StringWithInterpolations.prototype.children = ['body'];\n\n    return StringWithInterpolations;\n\n  }).call(this);\n\n  exports.TemplateElement = TemplateElement = class TemplateElement extends Base {\n    constructor(value1, {\n        tail: tail1\n      } = {}) {\n      super();\n      this.value = value1;\n      this.tail = tail1;\n    }\n\n    astProperties() {\n      return {\n        value: {\n          raw: this.value\n        },\n        tail: !!this.tail\n      };\n    }\n\n  };\n\n  exports.Interpolation = Interpolation = (function() {\n    class Interpolation extends Base {\n      constructor(expression1) {\n        super();\n        this.expression = expression1;\n      }\n\n    };\n\n    Interpolation.prototype.children = ['expression'];\n\n    return Interpolation;\n\n  }).call(this);\n\n  // Represents the contents of an empty interpolation (e.g. `#{}`).\n  // Only used during AST generation.\n  exports.EmptyInterpolation = EmptyInterpolation = class EmptyInterpolation extends Base {\n    constructor() {\n      super();\n    }\n\n  };\n\n  //### For\n\n  // CoffeeScript's replacement for the *for* loop is our array and object\n  // comprehensions, that compile into *for* loops here. They also act as an\n  // expression, able to return the result of each filtered iteration.\n\n  // Unlike Python array comprehensions, they can be multi-line, and you can pass\n  // the current index of the loop as a second parameter. Unlike Ruby blocks,\n  // you can map and filter in a single pass.\n  exports.For = For = (function() {\n    class For extends While {\n      constructor(body, source) {\n        super();\n        this.addBody(body);\n        this.addSource(source);\n      }\n\n      isAwait() {\n        var ref1;\n        return (ref1 = this.await) != null ? ref1 : false;\n      }\n\n      addBody(body) {\n        var base1, expressions;\n        this.body = Block.wrap([body]);\n        ({expressions} = this.body);\n        if (expressions.length) {\n          if ((base1 = this.body).locationData == null) {\n            base1.locationData = mergeLocationData(expressions[0].locationData, expressions[expressions.length - 1].locationData);\n          }\n        }\n        return this;\n      }\n\n      addSource(source) {\n        var attr, attribs, attribute, base1, j, k, len1, len2, ref1, ref2, ref3, ref4;\n        ({source: this.source = false} = source);\n        attribs = [\"name\", \"index\", \"guard\", \"step\", \"own\", \"ownTag\", \"await\", \"awaitTag\", \"object\", \"from\"];\n        for (j = 0, len1 = attribs.length; j < len1; j++) {\n          attr = attribs[j];\n          this[attr] = (ref1 = source[attr]) != null ? ref1 : this[attr];\n        }\n        if (!this.source) {\n          return this;\n        }\n        if (this.from && this.index) {\n          this.index.error('cannot use index with for-from');\n        }\n        if (this.own && !this.object) {\n          this.ownTag.error(`cannot use own with for-${this.from ? 'from' : 'in'}`);\n        }\n        if (this.object) {\n          [this.name, this.index] = [this.index, this.name];\n        }\n        if (((ref2 = this.index) != null ? typeof ref2.isArray === \"function\" ? ref2.isArray() : void 0 : void 0) || ((ref3 = this.index) != null ? typeof ref3.isObject === \"function\" ? ref3.isObject() : void 0 : void 0)) {\n          this.index.error('index cannot be a pattern matching expression');\n        }\n        if (this.await && !this.from) {\n          this.awaitTag.error('await must be used with for-from');\n        }\n        this.range = this.source instanceof Value && this.source.base instanceof Range && !this.source.properties.length && !this.from;\n        this.pattern = this.name instanceof Value;\n        if (this.pattern) {\n          if (typeof (base1 = this.name.unwrap()).propagateLhs === \"function\") {\n            base1.propagateLhs(true);\n          }\n        }\n        if (this.range && this.index) {\n          this.index.error('indexes do not apply to range loops');\n        }\n        if (this.range && this.pattern) {\n          this.name.error('cannot pattern match over range loops');\n        }\n        this.returns = false;\n        ref4 = ['source', 'guard', 'step', 'name', 'index'];\n        // Move up any comments in the “`for` line”, i.e. the line of code with `for`,\n        // from any child nodes of that line up to the `for` node itself so that these\n        // comments get output, and get output above the `for` loop.\n        for (k = 0, len2 = ref4.length; k < len2; k++) {\n          attribute = ref4[k];\n          if (!this[attribute]) {\n            continue;\n          }\n          this[attribute].traverseChildren(true, (node) => {\n            var comment, l, len3, ref5;\n            if (node.comments) {\n              ref5 = node.comments;\n              for (l = 0, len3 = ref5.length; l < len3; l++) {\n                comment = ref5[l];\n                // These comments are buried pretty deeply, so if they happen to be\n                // trailing comments the line they trail will be unrecognizable when\n                // we’re done compiling this `for` loop; so just shift them up to\n                // output above the `for` line.\n                comment.newLine = comment.unshift = true;\n              }\n              return moveComments(node, this[attribute]);\n            }\n          });\n          moveComments(this[attribute], this);\n        }\n        return this;\n      }\n\n      // Welcome to the hairiest method in all of CoffeeScript. Handles the inner\n      // loop, filtering, stepping, and result saving for array, object, and range\n      // comprehensions. Some of the generated code can be shared in common, and\n      // some cannot.\n      compileNode(o) {\n        var body, bodyFragments, compare, compareDown, declare, declareDown, defPart, down, forClose, forCode, forPartFragments, fragments, guardPart, idt1, increment, index, ivar, kvar, kvarAssign, last, lvar, name, namePart, ref, ref1, resultPart, returnResult, rvar, scope, source, step, stepNum, stepVar, svar, varPart;\n        body = Block.wrap([this.body]);\n        ref1 = body.expressions, [last] = slice1.call(ref1, -1);\n        if ((last != null ? last.jumps() : void 0) instanceof Return) {\n          this.returns = false;\n        }\n        source = this.range ? this.source.base : this.source;\n        scope = o.scope;\n        if (!this.pattern) {\n          name = this.name && (this.name.compile(o, LEVEL_LIST));\n        }\n        index = this.index && (this.index.compile(o, LEVEL_LIST));\n        if (name && !this.pattern) {\n          scope.find(name);\n        }\n        if (index && !(this.index instanceof Value)) {\n          scope.find(index);\n        }\n        if (this.returns) {\n          rvar = scope.freeVariable('results');\n        }\n        if (this.from) {\n          if (this.pattern) {\n            ivar = scope.freeVariable('x', {\n              single: true\n            });\n          }\n        } else {\n          ivar = (this.object && index) || scope.freeVariable('i', {\n            single: true\n          });\n        }\n        kvar = ((this.range || this.from) && name) || index || ivar;\n        kvarAssign = kvar !== ivar ? `${kvar} = ` : \"\";\n        if (this.step && !this.range) {\n          [step, stepVar] = this.cacheToCodeFragments(this.step.cache(o, LEVEL_LIST, shouldCacheOrIsAssignable));\n          if (this.step.isNumber()) {\n            stepNum = parseNumber(stepVar);\n          }\n        }\n        if (this.pattern) {\n          name = ivar;\n        }\n        varPart = '';\n        guardPart = '';\n        defPart = '';\n        idt1 = this.tab + TAB;\n        if (this.range) {\n          forPartFragments = source.compileToFragments(merge(o, {\n            index: ivar,\n            name,\n            step: this.step,\n            shouldCache: shouldCacheOrIsAssignable\n          }));\n        } else {\n          svar = this.source.compile(o, LEVEL_LIST);\n          if ((name || this.own) && !this.from && !(this.source.unwrap() instanceof IdentifierLiteral)) {\n            defPart += `${this.tab}${ref = scope.freeVariable('ref')} = ${svar};\\n`;\n            svar = ref;\n          }\n          if (name && !this.pattern && !this.from) {\n            namePart = `${name} = ${svar}[${kvar}]`;\n          }\n          if (!this.object && !this.from) {\n            if (step !== stepVar) {\n              defPart += `${this.tab}${step};\\n`;\n            }\n            down = stepNum < 0;\n            if (!(this.step && (stepNum != null) && down)) {\n              lvar = scope.freeVariable('len');\n            }\n            declare = `${kvarAssign}${ivar} = 0, ${lvar} = ${svar}.length`;\n            declareDown = `${kvarAssign}${ivar} = ${svar}.length - 1`;\n            compare = `${ivar} < ${lvar}`;\n            compareDown = `${ivar} >= 0`;\n            if (this.step) {\n              if (stepNum != null) {\n                if (down) {\n                  compare = compareDown;\n                  declare = declareDown;\n                }\n              } else {\n                compare = `${stepVar} > 0 ? ${compare} : ${compareDown}`;\n                declare = `(${stepVar} > 0 ? (${declare}) : ${declareDown})`;\n              }\n              increment = `${ivar} += ${stepVar}`;\n            } else {\n              increment = `${kvar !== ivar ? `++${ivar}` : `${ivar}++`}`;\n            }\n            forPartFragments = [this.makeCode(`${declare}; ${compare}; ${kvarAssign}${increment}`)];\n          }\n        }\n        if (this.returns) {\n          resultPart = `${this.tab}${rvar} = [];\\n`;\n          returnResult = `\\n${this.tab}return ${rvar};`;\n          body.makeReturn(rvar);\n        }\n        if (this.guard) {\n          if (body.expressions.length > 1) {\n            body.expressions.unshift(new If((new Parens(this.guard)).invert(), new StatementLiteral(\"continue\")));\n          } else {\n            if (this.guard) {\n              body = Block.wrap([new If(this.guard, body)]);\n            }\n          }\n        }\n        if (this.pattern) {\n          body.expressions.unshift(new Assign(this.name, this.from ? new IdentifierLiteral(kvar) : new Literal(`${svar}[${kvar}]`)));\n        }\n        if (namePart) {\n          varPart = `\\n${idt1}${namePart};`;\n        }\n        if (this.object) {\n          forPartFragments = [this.makeCode(`${kvar} in ${svar}`)];\n          if (this.own) {\n            guardPart = `\\n${idt1}if (!${utility('hasProp', o)}.call(${svar}, ${kvar})) continue;`;\n          }\n        } else if (this.from) {\n          if (this.await) {\n            forPartFragments = new Op('await', new Parens(new Literal(`${kvar} of ${svar}`)));\n            forPartFragments = forPartFragments.compileToFragments(o, LEVEL_TOP);\n          } else {\n            forPartFragments = [this.makeCode(`${kvar} of ${svar}`)];\n          }\n        }\n        bodyFragments = body.compileToFragments(merge(o, {\n          indent: idt1\n        }), LEVEL_TOP);\n        if (bodyFragments && bodyFragments.length > 0) {\n          bodyFragments = [].concat(this.makeCode('\\n'), bodyFragments, this.makeCode('\\n'));\n        }\n        fragments = [this.makeCode(defPart)];\n        if (resultPart) {\n          fragments.push(this.makeCode(resultPart));\n        }\n        forCode = this.await ? 'for ' : 'for (';\n        forClose = this.await ? '' : ')';\n        fragments = fragments.concat(this.makeCode(this.tab), this.makeCode(forCode), forPartFragments, this.makeCode(`${forClose} {${guardPart}${varPart}`), bodyFragments, this.makeCode(this.tab), this.makeCode('}'));\n        if (returnResult) {\n          fragments.push(this.makeCode(returnResult));\n        }\n        return fragments;\n      }\n\n      astNode(o) {\n        var addToScope, ref1, ref2;\n        addToScope = function(name) {\n          var alreadyDeclared;\n          alreadyDeclared = o.scope.find(name.value);\n          return name.isDeclaration = !alreadyDeclared;\n        };\n        if ((ref1 = this.name) != null) {\n          ref1.eachName(addToScope, {\n            checkAssignability: false\n          });\n        }\n        if ((ref2 = this.index) != null) {\n          ref2.eachName(addToScope, {\n            checkAssignability: false\n          });\n        }\n        return super.astNode(o);\n      }\n\n      astType() {\n        return 'For';\n      }\n\n      astProperties(o) {\n        var ref1, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9;\n        return {\n          source: (ref1 = this.source) != null ? ref1.ast(o) : void 0,\n          body: this.body.ast(o, LEVEL_TOP),\n          guard: (ref2 = (ref3 = this.guard) != null ? ref3.ast(o) : void 0) != null ? ref2 : null,\n          name: (ref4 = (ref5 = this.name) != null ? ref5.ast(o) : void 0) != null ? ref4 : null,\n          index: (ref6 = (ref7 = this.index) != null ? ref7.ast(o) : void 0) != null ? ref6 : null,\n          step: (ref8 = (ref9 = this.step) != null ? ref9.ast(o) : void 0) != null ? ref8 : null,\n          postfix: !!this.postfix,\n          own: !!this.own,\n          await: !!this.await,\n          style: (function() {\n            switch (false) {\n              case !this.from:\n                return 'from';\n              case !this.object:\n                return 'of';\n              case !this.name:\n                return 'in';\n              default:\n                return 'range';\n            }\n          }).call(this)\n        };\n      }\n\n    };\n\n    For.prototype.children = ['body', 'source', 'guard', 'step'];\n\n    return For;\n\n  }).call(this);\n\n  //### Switch\n\n  // A JavaScript *switch* statement. Converts into a returnable expression on-demand.\n  exports.Switch = Switch = (function() {\n    class Switch extends Base {\n      constructor(subject, cases1, otherwise) {\n        super();\n        this.subject = subject;\n        this.cases = cases1;\n        this.otherwise = otherwise;\n      }\n\n      jumps(o = {\n          block: true\n        }) {\n        var block, j, jumpNode, len1, ref1, ref2;\n        ref1 = this.cases;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          ({block} = ref1[j]);\n          if (jumpNode = block.jumps(o)) {\n            return jumpNode;\n          }\n        }\n        return (ref2 = this.otherwise) != null ? ref2.jumps(o) : void 0;\n      }\n\n      makeReturn(results, mark) {\n        var block, j, len1, ref1, ref2;\n        ref1 = this.cases;\n        for (j = 0, len1 = ref1.length; j < len1; j++) {\n          ({block} = ref1[j]);\n          block.makeReturn(results, mark);\n        }\n        if (results) {\n          this.otherwise || (this.otherwise = new Block([new Literal('void 0')]));\n        }\n        if ((ref2 = this.otherwise) != null) {\n          ref2.makeReturn(results, mark);\n        }\n        return this;\n      }\n\n      compileNode(o) {\n        var block, body, cond, conditions, expr, fragments, i, idt1, idt2, j, k, len1, len2, ref1, ref2;\n        idt1 = o.indent + TAB;\n        idt2 = o.indent = idt1 + TAB;\n        fragments = [].concat(this.makeCode(this.tab + \"switch (\"), (this.subject ? this.subject.compileToFragments(o, LEVEL_PAREN) : this.makeCode(\"false\")), this.makeCode(\") {\\n\"));\n        ref1 = this.cases;\n        for (i = j = 0, len1 = ref1.length; j < len1; i = ++j) {\n          ({conditions, block} = ref1[i]);\n          ref2 = flatten([conditions]);\n          for (k = 0, len2 = ref2.length; k < len2; k++) {\n            cond = ref2[k];\n            if (!this.subject) {\n              cond = cond.invert();\n            }\n            fragments = fragments.concat(this.makeCode(idt1 + \"case \"), cond.compileToFragments(o, LEVEL_PAREN), this.makeCode(\":\\n\"));\n          }\n          if ((body = block.compileToFragments(o, LEVEL_TOP)).length > 0) {\n            fragments = fragments.concat(body, this.makeCode('\\n'));\n          }\n          if (i === this.cases.length - 1 && !this.otherwise) {\n            break;\n          }\n          expr = this.lastNode(block.expressions);\n          if (expr instanceof Return || expr instanceof Throw || (expr instanceof Literal && expr.jumps() && expr.value !== 'debugger')) {\n            continue;\n          }\n          fragments.push(cond.makeCode(idt2 + 'break;\\n'));\n        }\n        if (this.otherwise && this.otherwise.expressions.length) {\n          fragments.push(this.makeCode(idt1 + \"default:\\n\"), ...(this.otherwise.compileToFragments(o, LEVEL_TOP)), this.makeCode(\"\\n\"));\n        }\n        fragments.push(this.makeCode(this.tab + '}'));\n        return fragments;\n      }\n\n      astType() {\n        return 'SwitchStatement';\n      }\n\n      casesAst(o) {\n        var caseIndex, caseLocationData, cases, consequent, j, k, kase, l, lastTestIndex, len1, len2, len3, ref1, ref2, results1, test, testConsequent, testIndex, tests;\n        cases = [];\n        ref1 = this.cases;\n        for (caseIndex = j = 0, len1 = ref1.length; j < len1; caseIndex = ++j) {\n          kase = ref1[caseIndex];\n          ({\n            conditions: tests,\n            block: consequent\n          } = kase);\n          tests = flatten([tests]);\n          lastTestIndex = tests.length - 1;\n          for (testIndex = k = 0, len2 = tests.length; k < len2; testIndex = ++k) {\n            test = tests[testIndex];\n            testConsequent = testIndex === lastTestIndex ? consequent : null;\n            caseLocationData = test.locationData;\n            if (testConsequent != null ? testConsequent.expressions.length : void 0) {\n              caseLocationData = mergeLocationData(caseLocationData, testConsequent.expressions[testConsequent.expressions.length - 1].locationData);\n            }\n            if (testIndex === 0) {\n              caseLocationData = mergeLocationData(caseLocationData, kase.locationData, {\n                justLeading: true\n              });\n            }\n            if (testIndex === lastTestIndex) {\n              caseLocationData = mergeLocationData(caseLocationData, kase.locationData, {\n                justEnding: true\n              });\n            }\n            cases.push(new SwitchCase(test, testConsequent, {\n              trailing: testIndex === lastTestIndex\n            }).withLocationDataFrom({\n              locationData: caseLocationData\n            }));\n          }\n        }\n        if ((ref2 = this.otherwise) != null ? ref2.expressions.length : void 0) {\n          cases.push(new SwitchCase(null, this.otherwise).withLocationDataFrom(this.otherwise));\n        }\n        results1 = [];\n        for (l = 0, len3 = cases.length; l < len3; l++) {\n          kase = cases[l];\n          results1.push(kase.ast(o));\n        }\n        return results1;\n      }\n\n      astProperties(o) {\n        var ref1, ref2;\n        return {\n          discriminant: (ref1 = (ref2 = this.subject) != null ? ref2.ast(o, LEVEL_PAREN) : void 0) != null ? ref1 : null,\n          cases: this.casesAst(o)\n        };\n      }\n\n    };\n\n    Switch.prototype.children = ['subject', 'cases', 'otherwise'];\n\n    Switch.prototype.isStatement = YES;\n\n    return Switch;\n\n  }).call(this);\n\n  SwitchCase = (function() {\n    class SwitchCase extends Base {\n      constructor(test1, block1, {trailing} = {}) {\n        super();\n        this.test = test1;\n        this.block = block1;\n        this.trailing = trailing;\n      }\n\n      astProperties(o) {\n        var ref1, ref2, ref3, ref4;\n        return {\n          test: (ref1 = (ref2 = this.test) != null ? ref2.ast(o, LEVEL_PAREN) : void 0) != null ? ref1 : null,\n          consequent: (ref3 = (ref4 = this.block) != null ? ref4.ast(o, LEVEL_TOP).body : void 0) != null ? ref3 : [],\n          trailing: !!this.trailing\n        };\n      }\n\n    };\n\n    SwitchCase.prototype.children = ['test', 'block'];\n\n    return SwitchCase;\n\n  }).call(this);\n\n  exports.SwitchWhen = SwitchWhen = (function() {\n    class SwitchWhen extends Base {\n      constructor(conditions1, block1) {\n        super();\n        this.conditions = conditions1;\n        this.block = block1;\n      }\n\n    };\n\n    SwitchWhen.prototype.children = ['conditions', 'block'];\n\n    return SwitchWhen;\n\n  }).call(this);\n\n  //### If\n\n  // *If/else* statements. Acts as an expression by pushing down requested returns\n  // to the last line of each clause.\n\n  // Single-expression **Ifs** are compiled into conditional operators if possible,\n  // because ternaries are already proper expressions, and don’t need conversion.\n  exports.If = If = (function() {\n    class If extends Base {\n      constructor(condition1, body1, options = {}) {\n        super();\n        this.condition = condition1;\n        this.body = body1;\n        this.elseBody = null;\n        this.isChain = false;\n        ({soak: this.soak, postfix: this.postfix, type: this.type} = options);\n        if (this.condition.comments) {\n          moveComments(this.condition, this);\n        }\n      }\n\n      bodyNode() {\n        var ref1;\n        return (ref1 = this.body) != null ? ref1.unwrap() : void 0;\n      }\n\n      elseBodyNode() {\n        var ref1;\n        return (ref1 = this.elseBody) != null ? ref1.unwrap() : void 0;\n      }\n\n      // Rewrite a chain of **Ifs** to add a default case as the final *else*.\n      addElse(elseBody) {\n        if (this.isChain) {\n          this.elseBodyNode().addElse(elseBody);\n          this.locationData = mergeLocationData(this.locationData, this.elseBodyNode().locationData);\n        } else {\n          this.isChain = elseBody instanceof If;\n          this.elseBody = this.ensureBlock(elseBody);\n          this.elseBody.updateLocationDataIfMissing(elseBody.locationData);\n          if ((this.locationData != null) && (this.elseBody.locationData != null)) {\n            this.locationData = mergeLocationData(this.locationData, this.elseBody.locationData);\n          }\n        }\n        return this;\n      }\n\n      // The **If** only compiles into a statement if either of its bodies needs\n      // to be a statement. Otherwise a conditional operator is safe.\n      isStatement(o) {\n        var ref1;\n        return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((ref1 = this.elseBodyNode()) != null ? ref1.isStatement(o) : void 0);\n      }\n\n      jumps(o) {\n        var ref1;\n        return this.body.jumps(o) || ((ref1 = this.elseBody) != null ? ref1.jumps(o) : void 0);\n      }\n\n      compileNode(o) {\n        if (this.isStatement(o)) {\n          return this.compileStatement(o);\n        } else {\n          return this.compileExpression(o);\n        }\n      }\n\n      makeReturn(results, mark) {\n        var ref1, ref2;\n        if (mark) {\n          if ((ref1 = this.body) != null) {\n            ref1.makeReturn(results, mark);\n          }\n          if ((ref2 = this.elseBody) != null) {\n            ref2.makeReturn(results, mark);\n          }\n          return;\n        }\n        if (results) {\n          this.elseBody || (this.elseBody = new Block([new Literal('void 0')]));\n        }\n        this.body && (this.body = new Block([this.body.makeReturn(results)]));\n        this.elseBody && (this.elseBody = new Block([this.elseBody.makeReturn(results)]));\n        return this;\n      }\n\n      ensureBlock(node) {\n        if (node instanceof Block) {\n          return node;\n        } else {\n          return new Block([node]);\n        }\n      }\n\n      // Compile the `If` as a regular *if-else* statement. Flattened chains\n      // force inner *else* bodies into statement form.\n      compileStatement(o) {\n        var answer, body, child, cond, exeq, ifPart, indent;\n        child = del(o, 'chainChild');\n        exeq = del(o, 'isExistentialEquals');\n        if (exeq) {\n          return new If(this.processedCondition().invert(), this.elseBodyNode(), {\n            type: 'if'\n          }).compileToFragments(o);\n        }\n        indent = o.indent + TAB;\n        cond = this.processedCondition().compileToFragments(o, LEVEL_PAREN);\n        body = this.ensureBlock(this.body).compileToFragments(merge(o, {indent}));\n        ifPart = [].concat(this.makeCode(\"if (\"), cond, this.makeCode(\") {\\n\"), body, this.makeCode(`\\n${this.tab}}`));\n        if (!child) {\n          ifPart.unshift(this.makeCode(this.tab));\n        }\n        if (!this.elseBody) {\n          return ifPart;\n        }\n        answer = ifPart.concat(this.makeCode(' else '));\n        if (this.isChain) {\n          o.chainChild = true;\n          answer = answer.concat(this.elseBody.unwrap().compileToFragments(o, LEVEL_TOP));\n        } else {\n          answer = answer.concat(this.makeCode(\"{\\n\"), this.elseBody.compileToFragments(merge(o, {indent}), LEVEL_TOP), this.makeCode(`\\n${this.tab}}`));\n        }\n        return answer;\n      }\n\n      // Compile the `If` as a conditional operator.\n      compileExpression(o) {\n        var alt, body, cond, fragments;\n        cond = this.processedCondition().compileToFragments(o, LEVEL_COND);\n        body = this.bodyNode().compileToFragments(o, LEVEL_LIST);\n        alt = this.elseBodyNode() ? this.elseBodyNode().compileToFragments(o, LEVEL_LIST) : [this.makeCode('void 0')];\n        fragments = cond.concat(this.makeCode(\" ? \"), body, this.makeCode(\" : \"), alt);\n        if (o.level >= LEVEL_COND) {\n          return this.wrapInParentheses(fragments);\n        } else {\n          return fragments;\n        }\n      }\n\n      unfoldSoak() {\n        return this.soak && this;\n      }\n\n      processedCondition() {\n        return this.processedConditionCache != null ? this.processedConditionCache : this.processedConditionCache = this.type === 'unless' ? this.condition.invert() : this.condition;\n      }\n\n      isStatementAst(o) {\n        return o.level === LEVEL_TOP;\n      }\n\n      astType(o) {\n        if (this.isStatementAst(o)) {\n          return 'IfStatement';\n        } else {\n          return 'ConditionalExpression';\n        }\n      }\n\n      astProperties(o) {\n        var isStatement, ref1, ref2, ref3, ref4;\n        isStatement = this.isStatementAst(o);\n        return {\n          test: this.condition.ast(o, isStatement ? LEVEL_PAREN : LEVEL_COND),\n          consequent: isStatement ? this.body.ast(o, LEVEL_TOP) : this.bodyNode().ast(o, LEVEL_TOP),\n          alternate: this.isChain ? this.elseBody.unwrap().ast(o, isStatement ? LEVEL_TOP : LEVEL_COND) : !isStatement && ((ref1 = this.elseBody) != null ? (ref2 = ref1.expressions) != null ? ref2.length : void 0 : void 0) === 1 ? this.elseBody.expressions[0].ast(o, LEVEL_TOP) : (ref3 = (ref4 = this.elseBody) != null ? ref4.ast(o, LEVEL_TOP) : void 0) != null ? ref3 : null,\n          postfix: !!this.postfix,\n          inverted: this.type === 'unless'\n        };\n      }\n\n    };\n\n    If.prototype.children = ['condition', 'body', 'elseBody'];\n\n    return If;\n\n  }).call(this);\n\n  // A sequence expression e.g. `(a; b)`.\n  // Currently only used during AST generation.\n  exports.Sequence = Sequence = (function() {\n    class Sequence extends Base {\n      constructor(expressions1) {\n        super();\n        this.expressions = expressions1;\n      }\n\n      astNode(o) {\n        if (this.expressions.length === 1) {\n          return this.expressions[0].ast(o);\n        }\n        return super.astNode(o);\n      }\n\n      astType() {\n        return 'SequenceExpression';\n      }\n\n      astProperties(o) {\n        var expression;\n        return {\n          expressions: (function() {\n            var j, len1, ref1, results1;\n            ref1 = this.expressions;\n            results1 = [];\n            for (j = 0, len1 = ref1.length; j < len1; j++) {\n              expression = ref1[j];\n              results1.push(expression.ast(o));\n            }\n            return results1;\n          }).call(this)\n        };\n      }\n\n    };\n\n    Sequence.prototype.children = ['expressions'];\n\n    return Sequence;\n\n  }).call(this);\n\n  // Constants\n  // ---------\n  UTILITIES = {\n    modulo: function() {\n      return 'function(a, b) { return (+a % (b = +b) + b) % b; }';\n    },\n    boundMethodCheck: function() {\n      return \"function(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new Error('Bound instance method accessed before binding'); } }\";\n    },\n    // Shortcuts to speed up the lookup time for native functions.\n    hasProp: function() {\n      return '{}.hasOwnProperty';\n    },\n    indexOf: function() {\n      return '[].indexOf';\n    },\n    slice: function() {\n      return '[].slice';\n    },\n    splice: function() {\n      return '[].splice';\n    }\n  };\n\n  // Levels indicate a node's position in the AST. Useful for knowing if\n  // parens are necessary or superfluous.\n  LEVEL_TOP = 1; // ...;\n\n  LEVEL_PAREN = 2; // (...)\n\n  LEVEL_LIST = 3; // [...]\n\n  LEVEL_COND = 4; // ... ? x : y\n\n  LEVEL_OP = 5; // !...\n\n  LEVEL_ACCESS = 6; // ...[0]\n\n  \n  // Tabs are two spaces for pretty printing.\n  TAB = '  ';\n\n  SIMPLENUM = /^[+-]?\\d+(?:_\\d+)*$/;\n\n  SIMPLE_STRING_OMIT = /\\s*\\n\\s*/g;\n\n  LEADING_BLANK_LINE = /^[^\\n\\S]*\\n/;\n\n  TRAILING_BLANK_LINE = /\\n[^\\n\\S]*$/;\n\n  STRING_OMIT = /((?:\\\\\\\\)+)|\\\\[^\\S\\n]*\\n\\s*/g; // Consume (and preserve) an even number of backslashes.\n  // Remove escaped newlines.\n\n  HEREGEX_OMIT = /((?:\\\\\\\\)+)|\\\\(\\s)|\\s+(?:#.*)?/g; // Consume (and preserve) an even number of backslashes.\n  // Preserve escaped whitespace.\n  // Remove whitespace and comments.\n\n  // Helper Functions\n  // ----------------\n\n  // Helper for ensuring that utility functions are assigned at the top level.\n  utility = function(name, o) {\n    var ref, root;\n    ({root} = o.scope);\n    if (name in root.utilities) {\n      return root.utilities[name];\n    } else {\n      ref = root.freeVariable(name);\n      root.assign(ref, UTILITIES[name](o));\n      return root.utilities[name] = ref;\n    }\n  };\n\n  multident = function(code, tab, includingFirstLine = true) {\n    var endsWithNewLine;\n    endsWithNewLine = code[code.length - 1] === '\\n';\n    code = (includingFirstLine ? tab : '') + code.replace(/\\n/g, `$&${tab}`);\n    code = code.replace(/\\s+$/, '');\n    if (endsWithNewLine) {\n      code = code + '\\n';\n    }\n    return code;\n  };\n\n  // Wherever in CoffeeScript 1 we might’ve inserted a `makeCode \"#{@tab}\"` to\n  // indent a line of code, now we must account for the possibility of comments\n  // preceding that line of code. If there are such comments, indent each line of\n  // such comments, and _then_ indent the first following line of code.\n  indentInitial = function(fragments, node) {\n    var fragment, fragmentIndex, j, len1;\n    for (fragmentIndex = j = 0, len1 = fragments.length; j < len1; fragmentIndex = ++j) {\n      fragment = fragments[fragmentIndex];\n      if (fragment.isHereComment) {\n        fragment.code = multident(fragment.code, node.tab);\n      } else {\n        fragments.splice(fragmentIndex, 0, node.makeCode(`${node.tab}`));\n        break;\n      }\n    }\n    return fragments;\n  };\n\n  hasLineComments = function(node) {\n    var comment, j, len1, ref1;\n    if (!node.comments) {\n      return false;\n    }\n    ref1 = node.comments;\n    for (j = 0, len1 = ref1.length; j < len1; j++) {\n      comment = ref1[j];\n      if (comment.here === false) {\n        return true;\n      }\n    }\n    return false;\n  };\n\n  // Move the `comments` property from one object to another, deleting it from\n  // the first object.\n  moveComments = function(from, to) {\n    if (!(from != null ? from.comments : void 0)) {\n      return;\n    }\n    attachCommentsToNode(from.comments, to);\n    return delete from.comments;\n  };\n\n  // Sometimes when compiling a node, we want to insert a fragment at the start\n  // of an array of fragments; but if the start has one or more comment fragments,\n  // we want to insert this fragment after those but before any non-comments.\n  unshiftAfterComments = function(fragments, fragmentToInsert) {\n    var fragment, fragmentIndex, inserted, j, len1;\n    inserted = false;\n    for (fragmentIndex = j = 0, len1 = fragments.length; j < len1; fragmentIndex = ++j) {\n      fragment = fragments[fragmentIndex];\n      if (!(!fragment.isComment)) {\n        continue;\n      }\n      fragments.splice(fragmentIndex, 0, fragmentToInsert);\n      inserted = true;\n      break;\n    }\n    if (!inserted) {\n      fragments.push(fragmentToInsert);\n    }\n    return fragments;\n  };\n\n  isLiteralArguments = function(node) {\n    return node instanceof IdentifierLiteral && node.value === 'arguments';\n  };\n\n  isLiteralThis = function(node) {\n    return node instanceof ThisLiteral || (node instanceof Code && node.bound);\n  };\n\n  shouldCacheOrIsAssignable = function(node) {\n    return node.shouldCache() || (typeof node.isAssignable === \"function\" ? node.isAssignable() : void 0);\n  };\n\n  // Unfold a node's child if soak, then tuck the node under created `If`\n  unfoldSoak = function(o, parent, name) {\n    var ifn;\n    if (!(ifn = parent[name].unfoldSoak(o))) {\n      return;\n    }\n    parent[name] = ifn.body;\n    ifn.body = new Value(parent);\n    return ifn;\n  };\n\n  // Constructs a string or regex by escaping certain characters.\n  makeDelimitedLiteral = function(body, {\n      delimiter: delimiterOption,\n      escapeNewlines,\n      double,\n      includeDelimiters = true,\n      escapeDelimiter = true,\n      convertTrailingNullEscapes\n    } = {}) {\n    var escapeTemplateLiteralCurlies, printedDelimiter, regex;\n    if (body === '' && delimiterOption === '/') {\n      body = '(?:)';\n    }\n    escapeTemplateLiteralCurlies = delimiterOption === '`';\n    regex = RegExp(`(\\\\\\\\\\\\\\\\)|(\\\\\\\\0(?=\\\\d))${convertTrailingNullEscapes ? /|(\\\\0)$/.source : '' // Escaped backslash. // Trailing null character that could be mistaken as octal escape.\n    // Null character mistaken as octal escape.\n    // Trailing null character that could be mistaken as octal escape.\n    // (Possibly escaped) delimiter.\n    // `${` inside template literals must be escaped.\n    // (Possibly escaped) newlines.\n    // Other escapes.\n}${escapeDelimiter ? RegExp(`|\\\\\\\\?(${delimiterOption})`).source : '' // (Possibly escaped) delimiter.\n}${escapeTemplateLiteralCurlies ? /|\\\\?(\\$\\{)/.source : '' // `${` inside template literals must be escaped.\n}|\\\\\\\\?(?:${escapeNewlines ? '(\\n)|' : ''}(\\\\r)|(\\\\u2028)|(\\\\u2029))|(\\\\\\\\.)`, \"g\");\n    body = body.replace(regex, function(match, backslash, nul, ...args) {\n      var cr, delimiter, lf, ls, other, ps, templateLiteralCurly, trailingNullEscape;\n      trailingNullEscape = convertTrailingNullEscapes ? args.shift() : void 0;\n      delimiter = escapeDelimiter ? args.shift() : void 0;\n      templateLiteralCurly = escapeTemplateLiteralCurlies ? args.shift() : void 0;\n      lf = escapeNewlines ? args.shift() : void 0;\n      [cr, ls, ps, other] = args;\n      switch (false) {\n        // Ignore escaped backslashes.\n        case !backslash:\n          if (double) {\n            return backslash + backslash;\n          } else {\n            return backslash;\n          }\n        case !nul:\n          return '\\\\x00';\n        case !trailingNullEscape:\n          return \"\\\\x00\";\n        case !delimiter:\n          return `\\\\${delimiter}`;\n        case !templateLiteralCurly:\n          return \"\\\\${\";\n        case !lf:\n          return '\\\\n';\n        case !cr:\n          return '\\\\r';\n        case !ls:\n          return '\\\\u2028';\n        case !ps:\n          return '\\\\u2029';\n        case !other:\n          if (double) {\n            return `\\\\${other}`;\n          } else {\n            return other;\n          }\n      }\n    });\n    printedDelimiter = includeDelimiters ? delimiterOption : '';\n    return `${printedDelimiter}${body}${printedDelimiter}`;\n  };\n\n  sniffDirectives = function(expressions, {notFinalExpression} = {}) {\n    var expression, index, lastIndex, results1, unwrapped;\n    index = 0;\n    lastIndex = expressions.length - 1;\n    results1 = [];\n    while (index <= lastIndex) {\n      if (index === lastIndex && notFinalExpression) {\n        break;\n      }\n      expression = expressions[index];\n      if ((unwrapped = expression != null ? typeof expression.unwrap === \"function\" ? expression.unwrap() : void 0 : void 0) instanceof PassthroughLiteral && unwrapped.generated) {\n        index++;\n        continue;\n      }\n      if (!(expression instanceof Value && expression.isString() && !expression.unwrap().shouldGenerateTemplateLiteral())) {\n        break;\n      }\n      expressions[index] = new Directive(expression).withLocationDataFrom(expression);\n      results1.push(index++);\n    }\n    return results1;\n  };\n\n  astAsBlockIfNeeded = function(node, o) {\n    var unwrapped;\n    unwrapped = node.unwrap();\n    if (unwrapped instanceof Block && unwrapped.expressions.length > 1) {\n      unwrapped.makeReturn(null, true);\n      return unwrapped.ast(o, LEVEL_TOP);\n    } else {\n      return node.ast(o, LEVEL_PAREN);\n    }\n  };\n\n  // Helpers for `mergeLocationData` and `mergeAstLocationData` below.\n  lesser = function(a, b) {\n    if (a < b) {\n      return a;\n    } else {\n      return b;\n    }\n  };\n\n  greater = function(a, b) {\n    if (a > b) {\n      return a;\n    } else {\n      return b;\n    }\n  };\n\n  isAstLocGreater = function(a, b) {\n    if (a.line > b.line) {\n      return true;\n    }\n    if (a.line !== b.line) {\n      return false;\n    }\n    return a.column > b.column;\n  };\n\n  isLocationDataStartGreater = function(a, b) {\n    if (a.first_line > b.first_line) {\n      return true;\n    }\n    if (a.first_line !== b.first_line) {\n      return false;\n    }\n    return a.first_column > b.first_column;\n  };\n\n  isLocationDataEndGreater = function(a, b) {\n    if (a.last_line > b.last_line) {\n      return true;\n    }\n    if (a.last_line !== b.last_line) {\n      return false;\n    }\n    return a.last_column > b.last_column;\n  };\n\n  // Take two nodes’ location data and return a new `locationData` object that\n  // encompasses the location data of both nodes. So the new `first_line` value\n  // will be the earlier of the two nodes’ `first_line` values, the new\n  // `last_column` the later of the two nodes’ `last_column` values, etc.\n\n  // If you only want to extend the first node’s location data with the start or\n  // end location data of the second node, pass the `justLeading` or `justEnding`\n  // options. So e.g. if `first`’s range is [4, 5] and `second`’s range is [1, 10],\n  // you’d get:\n  // ```\n  // mergeLocationData(first, second).range                   # [1, 10]\n  // mergeLocationData(first, second, justLeading: yes).range # [1, 5]\n  // mergeLocationData(first, second, justEnding:  yes).range # [4, 10]\n  // ```\n  exports.mergeLocationData = mergeLocationData = function(locationDataA, locationDataB, {justLeading, justEnding} = {}) {\n    return Object.assign(justEnding ? {\n      first_line: locationDataA.first_line,\n      first_column: locationDataA.first_column\n    } : isLocationDataStartGreater(locationDataA, locationDataB) ? {\n      first_line: locationDataB.first_line,\n      first_column: locationDataB.first_column\n    } : {\n      first_line: locationDataA.first_line,\n      first_column: locationDataA.first_column\n    }, justLeading ? {\n      last_line: locationDataA.last_line,\n      last_column: locationDataA.last_column,\n      last_line_exclusive: locationDataA.last_line_exclusive,\n      last_column_exclusive: locationDataA.last_column_exclusive\n    } : isLocationDataEndGreater(locationDataA, locationDataB) ? {\n      last_line: locationDataA.last_line,\n      last_column: locationDataA.last_column,\n      last_line_exclusive: locationDataA.last_line_exclusive,\n      last_column_exclusive: locationDataA.last_column_exclusive\n    } : {\n      last_line: locationDataB.last_line,\n      last_column: locationDataB.last_column,\n      last_line_exclusive: locationDataB.last_line_exclusive,\n      last_column_exclusive: locationDataB.last_column_exclusive\n    }, {\n      range: [justEnding ? locationDataA.range[0] : lesser(locationDataA.range[0], locationDataB.range[0]), justLeading ? locationDataA.range[1] : greater(locationDataA.range[1], locationDataB.range[1])]\n    });\n  };\n\n  // Take two AST nodes, or two AST nodes’ location data objects, and return a new\n  // location data object that encompasses the location data of both nodes. So the\n  // new `start` value will be the earlier of the two nodes’ `start` values, the\n  // new `end` value will be the later of the two nodes’ `end` values, etc.\n\n  // If you only want to extend the first node’s location data with the start or\n  // end location data of the second node, pass the `justLeading` or `justEnding`\n  // options. So e.g. if `first`’s range is [4, 5] and `second`’s range is [1, 10],\n  // you’d get:\n  // ```\n  // mergeAstLocationData(first, second).range                   # [1, 10]\n  // mergeAstLocationData(first, second, justLeading: yes).range # [1, 5]\n  // mergeAstLocationData(first, second, justEnding:  yes).range # [4, 10]\n  // ```\n  exports.mergeAstLocationData = mergeAstLocationData = function(nodeA, nodeB, {justLeading, justEnding} = {}) {\n    return {\n      loc: {\n        start: justEnding ? nodeA.loc.start : isAstLocGreater(nodeA.loc.start, nodeB.loc.start) ? nodeB.loc.start : nodeA.loc.start,\n        end: justLeading ? nodeA.loc.end : isAstLocGreater(nodeA.loc.end, nodeB.loc.end) ? nodeA.loc.end : nodeB.loc.end\n      },\n      range: [justEnding ? nodeA.range[0] : lesser(nodeA.range[0], nodeB.range[0]), justLeading ? nodeA.range[1] : greater(nodeA.range[1], nodeB.range[1])],\n      start: justEnding ? nodeA.start : lesser(nodeA.start, nodeB.start),\n      end: justLeading ? nodeA.end : greater(nodeA.end, nodeB.end)\n    };\n  };\n\n  // Convert Jison-style node class location data to Babel-style location data\n  exports.jisonLocationDataToAstLocationData = jisonLocationDataToAstLocationData = function({first_line, first_column, last_line_exclusive, last_column_exclusive, range}) {\n    return {\n      loc: {\n        start: {\n          line: first_line + 1,\n          column: first_column\n        },\n        end: {\n          line: last_line_exclusive + 1,\n          column: last_column_exclusive\n        }\n      },\n      range: [range[0], range[1]],\n      start: range[0],\n      end: range[1]\n    };\n  };\n\n  // Generate a zero-width location data that corresponds to the end of another node’s location.\n  zeroWidthLocationDataFromEndLocation = function({\n      range: [, endRange],\n      last_line_exclusive,\n      last_column_exclusive\n    }) {\n    return {\n      first_line: last_line_exclusive,\n      first_column: last_column_exclusive,\n      last_line: last_line_exclusive,\n      last_column: last_column_exclusive,\n      last_line_exclusive,\n      last_column_exclusive,\n      range: [endRange, endRange]\n    };\n  };\n\n  extractSameLineLocationDataFirst = function(numChars) {\n    return function({\n        range: [startRange],\n        first_line,\n        first_column\n      }) {\n      return {\n        first_line,\n        first_column,\n        last_line: first_line,\n        last_column: first_column + numChars - 1,\n        last_line_exclusive: first_line,\n        last_column_exclusive: first_column + numChars,\n        range: [startRange, startRange + numChars]\n      };\n    };\n  };\n\n  extractSameLineLocationDataLast = function(numChars) {\n    return function({\n        range: [, endRange],\n        last_line,\n        last_column,\n        last_line_exclusive,\n        last_column_exclusive\n      }) {\n      return {\n        first_line: last_line,\n        first_column: last_column - (numChars - 1),\n        last_line: last_line,\n        last_column: last_column,\n        last_line_exclusive,\n        last_column_exclusive,\n        range: [endRange - numChars, endRange]\n      };\n    };\n  };\n\n  // We don’t currently have a token corresponding to the empty space\n  // between interpolation/JSX expression braces, so piece together the location\n  // data by trimming the braces from the Interpolation’s location data.\n  // Technically the last_line/last_column calculation here could be\n  // incorrect if the ending brace is preceded by a newline, but\n  // last_line/last_column aren’t used for AST generation anyway.\n  emptyExpressionLocationData = function({\n      interpolationNode: element,\n      openingBrace,\n      closingBrace\n    }) {\n    return {\n      first_line: element.locationData.first_line,\n      first_column: element.locationData.first_column + openingBrace.length,\n      last_line: element.locationData.last_line,\n      last_column: element.locationData.last_column - closingBrace.length,\n      last_line_exclusive: element.locationData.last_line,\n      last_column_exclusive: element.locationData.last_column,\n      range: [element.locationData.range[0] + openingBrace.length, element.locationData.range[1] - closingBrace.length]\n    };\n  };\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/optparse.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  var LONG_FLAG, MULTI_FLAG, OPTIONAL, OptionParser, SHORT_FLAG, buildRule, buildRules, normalizeArguments, repeat,\n    splice = [].splice;\n\n  ({repeat} = require('./helpers'));\n\n  // A simple **OptionParser** class to parse option flags from the command-line.\n  // Use it like so:\n\n  //     parser  = new OptionParser switches, helpBanner\n  //     options = parser.parse process.argv\n\n  // The first non-option is considered to be the start of the file (and file\n  // option) list, and all subsequent arguments are left unparsed.\n\n  // The `coffee` command uses an instance of **OptionParser** to parse its\n  // command-line arguments in `src/command.coffee`.\n  exports.OptionParser = OptionParser = class OptionParser {\n    // Initialize with a list of valid options, in the form:\n\n    //     [short-flag, long-flag, description]\n\n    // Along with an optional banner for the usage help.\n    constructor(ruleDeclarations, banner) {\n      this.banner = banner;\n      this.rules = buildRules(ruleDeclarations);\n    }\n\n    // Parse the list of arguments, populating an `options` object with all of the\n    // specified options, and return it. Options after the first non-option\n    // argument are treated as arguments. `options.arguments` will be an array\n    // containing the remaining arguments. This is a simpler API than many option\n    // parsers that allow you to attach callback actions for every flag. Instead,\n    // you're responsible for interpreting the options object.\n    parse(args) {\n      var argument, hasArgument, i, isList, len, name, options, positional, rules;\n      // The CoffeeScript option parser is a little odd; options after the first\n      // non-option argument are treated as non-option arguments themselves.\n      // Optional arguments are normalized by expanding merged flags into multiple\n      // flags. This allows you to have `-wl` be the same as `--watch --lint`.\n      // Note that executable scripts with a shebang (`#!`) line should use the\n      // line `#!/usr/bin/env coffee`, or `#!/absolute/path/to/coffee`, without a\n      // `--` argument after, because that will fail on Linux (see #3946).\n      ({rules, positional} = normalizeArguments(args, this.rules.flagDict));\n      options = {};\n// The `argument` field is added to the rule instance non-destructively by\n// `normalizeArguments`.\n      for (i = 0, len = rules.length; i < len; i++) {\n        ({hasArgument, argument, isList, name} = rules[i]);\n        if (hasArgument) {\n          if (isList) {\n            if (options[name] == null) {\n              options[name] = [];\n            }\n            options[name].push(argument);\n          } else {\n            options[name] = argument;\n          }\n        } else {\n          options[name] = true;\n        }\n      }\n      if (positional[0] === '--') {\n        options.doubleDashed = true;\n        positional = positional.slice(1);\n      }\n      options.arguments = positional;\n      return options;\n    }\n\n    // Return the help text for this **OptionParser**, listing and describing all\n    // of the valid options, for `--help` and such.\n    help() {\n      var i, len, letPart, lines, ref, rule, spaces;\n      lines = [];\n      if (this.banner) {\n        lines.unshift(`${this.banner}\\n`);\n      }\n      ref = this.rules.ruleList;\n      for (i = 0, len = ref.length; i < len; i++) {\n        rule = ref[i];\n        spaces = 15 - rule.longFlag.length;\n        spaces = spaces > 0 ? repeat(' ', spaces) : '';\n        letPart = rule.shortFlag ? rule.shortFlag + ', ' : '    ';\n        lines.push('  ' + letPart + rule.longFlag + spaces + rule.description);\n      }\n      return `\\n${lines.join('\\n')}\\n`;\n    }\n\n  };\n\n  // Helpers\n  // -------\n\n  // Regex matchers for option flags on the command line and their rules.\n  LONG_FLAG = /^(--\\w[\\w\\-]*)/;\n\n  SHORT_FLAG = /^(-\\w)$/;\n\n  MULTI_FLAG = /^-(\\w{2,})/;\n\n  // Matches the long flag part of a rule for an option with an argument. Not\n  // applied to anything in process.argv.\n  OPTIONAL = /\\[(\\w+(\\*?))\\]/;\n\n  // Build and return the list of option rules. If the optional *short-flag* is\n  // unspecified, leave it out by padding with `null`.\n  buildRules = function(ruleDeclarations) {\n    var flag, flagDict, i, j, len, len1, ref, rule, ruleList, tuple;\n    ruleList = (function() {\n      var i, len, results;\n      results = [];\n      for (i = 0, len = ruleDeclarations.length; i < len; i++) {\n        tuple = ruleDeclarations[i];\n        if (tuple.length < 3) {\n          tuple.unshift(null);\n        }\n        results.push(buildRule(...tuple));\n      }\n      return results;\n    })();\n    flagDict = {};\n    for (i = 0, len = ruleList.length; i < len; i++) {\n      rule = ruleList[i];\n      ref = [rule.shortFlag, rule.longFlag];\n      // `shortFlag` is null if not provided in the rule.\n      for (j = 0, len1 = ref.length; j < len1; j++) {\n        flag = ref[j];\n        if (!(flag != null)) {\n          continue;\n        }\n        if (flagDict[flag] != null) {\n          throw new Error(`flag ${flag} for switch ${rule.name} was already declared for switch ${flagDict[flag].name}`);\n        }\n        flagDict[flag] = rule;\n      }\n    }\n    return {ruleList, flagDict};\n  };\n\n  // Build a rule from a `-o` short flag, a `--output [DIR]` long flag, and the\n  // description of what the option does.\n  buildRule = function(shortFlag, longFlag, description) {\n    var match;\n    match = longFlag.match(OPTIONAL);\n    shortFlag = shortFlag != null ? shortFlag.match(SHORT_FLAG)[1] : void 0;\n    longFlag = longFlag.match(LONG_FLAG)[1];\n    return {\n      name: longFlag.replace(/^--/, ''),\n      shortFlag: shortFlag,\n      longFlag: longFlag,\n      description: description,\n      hasArgument: !!(match && match[1]),\n      isList: !!(match && match[2])\n    };\n  };\n\n  normalizeArguments = function(args, flagDict) {\n    var arg, argIndex, flag, i, innerOpts, j, lastOpt, len, len1, multiFlags, multiOpts, needsArgOpt, positional, ref, rule, rules, singleRule, withArg;\n    rules = [];\n    positional = [];\n    needsArgOpt = null;\n    for (argIndex = i = 0, len = args.length; i < len; argIndex = ++i) {\n      arg = args[argIndex];\n      // If the previous argument given to the script was an option that uses the\n      // next command-line argument as its argument, create copy of the option’s\n      // rule with an `argument` field.\n      if (needsArgOpt != null) {\n        withArg = Object.assign({}, needsArgOpt.rule, {\n          argument: arg\n        });\n        rules.push(withArg);\n        needsArgOpt = null;\n        continue;\n      }\n      multiFlags = (ref = arg.match(MULTI_FLAG)) != null ? ref[1].split('').map(function(flagName) {\n        return `-${flagName}`;\n      }) : void 0;\n      if (multiFlags != null) {\n        multiOpts = multiFlags.map(function(flag) {\n          var rule;\n          rule = flagDict[flag];\n          if (rule == null) {\n            throw new Error(`unrecognized option ${flag} in multi-flag ${arg}`);\n          }\n          return {rule, flag};\n        });\n        // Only the last flag in a multi-flag may have an argument.\n        [...innerOpts] = multiOpts, [lastOpt] = splice.call(innerOpts, -1);\n        for (j = 0, len1 = innerOpts.length; j < len1; j++) {\n          ({rule, flag} = innerOpts[j]);\n          if (rule.hasArgument) {\n            throw new Error(`cannot use option ${flag} in multi-flag ${arg} except as the last option, because it needs an argument`);\n          }\n          rules.push(rule);\n        }\n        if (lastOpt.rule.hasArgument) {\n          needsArgOpt = lastOpt;\n        } else {\n          rules.push(lastOpt.rule);\n        }\n      } else if ([LONG_FLAG, SHORT_FLAG].some(function(pat) {\n        return arg.match(pat) != null;\n      })) {\n        singleRule = flagDict[arg];\n        if (singleRule == null) {\n          throw new Error(`unrecognized option ${arg}`);\n        }\n        if (singleRule.hasArgument) {\n          needsArgOpt = {\n            rule: singleRule,\n            flag: arg\n          };\n        } else {\n          rules.push(singleRule);\n        }\n      } else {\n        // This is a positional argument.\n        positional = args.slice(argIndex);\n        break;\n      }\n    }\n    if (needsArgOpt != null) {\n      throw new Error(`value required for ${needsArgOpt.flag}, but it was the last argument provided`);\n    }\n    return {rules, positional};\n  };\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/parser.js",
    "content": "/* parser generated by jison 0.4.18 */\n/*\n  Returns a Parser object of the following structure:\n\n  Parser: {\n    yy: {}\n  }\n\n  Parser.prototype: {\n    yy: {},\n    trace: function(),\n    symbols_: {associative list: name ==> number},\n    terminals_: {associative list: number ==> name},\n    productions_: [...],\n    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n    table: [...],\n    defaultActions: {...},\n    parseError: function(str, hash),\n    parse: function(input),\n\n    lexer: {\n        EOF: 1,\n        parseError: function(str, hash),\n        setInput: function(input),\n        input: function(),\n        unput: function(str),\n        more: function(),\n        less: function(n),\n        pastInput: function(),\n        upcomingInput: function(),\n        showPosition: function(),\n        test_match: function(regex_match_array, rule_index),\n        next: function(),\n        lex: function(),\n        begin: function(condition),\n        popState: function(),\n        _currentRules: function(),\n        topState: function(),\n        pushState: function(condition),\n\n        options: {\n            ranges: boolean           (optional: true ==> token location info will include a .range[] member)\n            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n        },\n\n        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n        rules: [...],\n        conditions: {associative list: name ==> set},\n    }\n  }\n\n\n  token location info (@$, _$, etc.): {\n    first_line: n,\n    last_line: n,\n    first_column: n,\n    last_column: n,\n    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)\n  }\n\n\n  the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n    text:        (matched text)\n    token:       (the produced terminal token, if any)\n    line:        (yylineno)\n  }\n  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n    loc:         (yylloc)\n    expected:    (string describing the set of expected tokens)\n    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n  }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,24],$V1=[1,59],$V2=[1,98],$V3=[1,99],$V4=[1,94],$V5=[1,100],$V6=[1,101],$V7=[1,96],$V8=[1,97],$V9=[1,68],$Va=[1,70],$Vb=[1,71],$Vc=[1,72],$Vd=[1,73],$Ve=[1,74],$Vf=[1,76],$Vg=[1,80],$Vh=[1,77],$Vi=[1,78],$Vj=[1,62],$Vk=[1,45],$Vl=[1,38],$Vm=[1,83],$Vn=[1,84],$Vo=[1,81],$Vp=[1,82],$Vq=[1,93],$Vr=[1,57],$Vs=[1,63],$Vt=[1,64],$Vu=[1,79],$Vv=[1,50],$Vw=[1,58],$Vx=[1,75],$Vy=[1,88],$Vz=[1,89],$VA=[1,90],$VB=[1,91],$VC=[1,56],$VD=[1,87],$VE=[1,40],$VF=[1,41],$VG=[1,61],$VH=[1,42],$VI=[1,43],$VJ=[1,44],$VK=[1,46],$VL=[1,47],$VM=[1,102],$VN=[1,6,35,52,155],$VO=[1,6,33,35,52,74,76,96,137,144,155,158,166],$VP=[1,120],$VQ=[1,121],$VR=[1,122],$VS=[1,117],$VT=[1,105],$VU=[1,104],$VV=[1,103],$VW=[1,106],$VX=[1,107],$VY=[1,108],$VZ=[1,109],$V_=[1,110],$V$=[1,111],$V01=[1,112],$V11=[1,113],$V21=[1,114],$V31=[1,115],$V41=[1,116],$V51=[1,124],$V61=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V71=[2,222],$V81=[1,130],$V91=[1,135],$Va1=[1,131],$Vb1=[1,132],$Vc1=[1,133],$Vd1=[1,136],$Ve1=[1,129],$Vf1=[1,6,33,35,52,74,76,96,137,144,155,157,158,159,165,166,183],$Vg1=[1,6,33,35,46,47,52,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vh1=[2,129],$Vi1=[2,133],$Vj1=[6,33,91,96],$Vk1=[2,106],$Vl1=[1,148],$Vm1=[1,147],$Vn1=[1,142],$Vo1=[1,151],$Vp1=[1,156],$Vq1=[1,154],$Vr1=[1,160],$Vs1=[1,166],$Vt1=[1,162],$Vu1=[1,163],$Vv1=[1,165],$Vw1=[1,170],$Vx1=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vy1=[2,126],$Vz1=[1,6,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VA1=[2,31],$VB1=[1,195],$VC1=[1,196],$VD1=[2,93],$VE1=[1,202],$VF1=[1,208],$VG1=[1,223],$VH1=[1,218],$VI1=[1,227],$VJ1=[1,224],$VK1=[1,229],$VL1=[1,230],$VM1=[1,232],$VN1=[2,227],$VO1=[1,234],$VP1=[14,32,33,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VQ1=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,121,135,136,137,144,155,157,158,159,165,166,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$VR1=[1,247],$VS1=[1,248],$VT1=[2,156],$VU1=[1,264],$VV1=[1,265],$VW1=[1,267],$VX1=[1,277],$VY1=[1,278],$VZ1=[1,6,33,35,46,47,52,70,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V_1=[1,6,33,35,36,46,47,52,66,70,74,76,91,96,105,106,107,110,111,112,115,119,121,128,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$V$1=[1,6,33,35,46,47,49,51,52,57,70,74,76,91,96,105,106,107,110,111,112,115,119,123,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V02=[1,283],$V12=[46,47,136],$V22=[1,322],$V32=[1,321],$V42=[6,33],$V52=[2,104],$V62=[1,328],$V72=[6,33,35,91,96],$V82=[6,33,35,66,76,91,96],$V92=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,194,195,196,197,198,199,200,201,202,203,204],$Va2=[2,377],$Vb2=[2,378],$Vc2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,194,196,197,198,199,200,201,202,203,204],$Vd2=[46,47,105,106,110,111,112,115,135,136],$Ve2=[1,357],$Vf2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183],$Vg2=[2,91],$Vh2=[1,375],$Vi2=[1,377],$Vj2=[1,382],$Vk2=[1,384],$Vl2=[6,33,74,96],$Vm2=[2,247],$Vn2=[2,248],$Vo2=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vp2=[1,398],$Vq2=[14,32,33,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,74,75,76,82,85,87,88,89,93,94,96,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$Vr2=[1,400],$Vs2=[6,33,35,74,96],$Vt2=[6,14,32,33,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,74,75,76,82,85,87,88,89,93,94,96,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$Vu2=[6,33,35,74,96,137],$Vv2=[1,6,33,35,46,47,52,57,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vw2=[1,411],$Vx2=[1,6,33,35,46,47,52,66,70,74,76,91,96,105,106,107,110,111,112,115,119,121,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$Vy2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,166,183],$Vz2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,158,166,183],$VA2=[2,300],$VB2=[173,174,175],$VC2=[96,173,174,175],$VD2=[6,33,119],$VE2=[1,431],$VF2=[6,33,35,96,119],$VG2=[6,33,35,70,96,119],$VH2=[6,33,35,66,70,76,96,105,106,110,111,112,115,119,135,136],$VI2=[6,33,35,76,96,105,106,110,111,112,115,119,135,136],$VJ2=[46,47,49,51],$VK2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,196,197,198,199,200,201,202,203,204],$VL2=[2,367],$VM2=[2,366],$VN2=[35,107],$VO2=[14,32,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,107,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VP2=[2,233],$VQ2=[6,33,35],$VR2=[2,105],$VS2=[1,470],$VT2=[1,471],$VU2=[1,6,33,35,46,47,52,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,151,152,155,157,158,159,165,166,178,180,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VV2=[1,337],$VW2=[35,178,180],$VX2=[1,6,35,52,74,76,91,96,107,119,137,144,155,158,166,183],$VY2=[1,509],$VZ2=[1,516],$V_2=[1,6,33,35,52,74,76,96,137,144,155,158,166,183],$V$2=[2,120],$V03=[1,529],$V13=[33,35,74],$V23=[1,537],$V33=[6,33,35,96,137],$V43=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,178,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V53=[1,6,33,35,52,74,76,96,137,144,155,158,166,178],$V63=[2,314],$V73=[2,315],$V83=[2,330],$V93=[1,557],$Va3=[1,558],$Vb3=[6,33,35,119],$Vc3=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,159,165,166,183],$Vd3=[6,33,35,96],$Ve3=[1,6,33,35,52,74,76,91,96,107,119,137,144,151,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vf3=[33,96],$Vg3=[1,611],$Vh3=[1,612],$Vi3=[1,619],$Vj3=[1,620],$Vk3=[1,638],$Vl3=[1,639],$Vm3=[2,285],$Vn3=[2,288],$Vo3=[2,301],$Vp3=[2,316],$Vq3=[2,320],$Vr3=[2,317],$Vs3=[2,321],$Vt3=[2,318],$Vu3=[2,319],$Vv3=[2,331],$Vw3=[2,332],$Vx3=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,183],$Vy3=[2,322],$Vz3=[2,324],$VA3=[2,326],$VB3=[2,328],$VC3=[2,323],$VD3=[2,325],$VE3=[2,327],$VF3=[2,329];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"Root\":3,\"Body\":4,\"Line\":5,\"TERMINATOR\":6,\"Expression\":7,\"ExpressionLine\":8,\"Statement\":9,\"FuncDirective\":10,\"YieldReturn\":11,\"AwaitReturn\":12,\"Return\":13,\"STATEMENT\":14,\"Import\":15,\"Export\":16,\"Value\":17,\"Code\":18,\"Operation\":19,\"Assign\":20,\"If\":21,\"Try\":22,\"While\":23,\"For\":24,\"Switch\":25,\"Class\":26,\"Throw\":27,\"Yield\":28,\"CodeLine\":29,\"IfLine\":30,\"OperationLine\":31,\"YIELD\":32,\"INDENT\":33,\"Object\":34,\"OUTDENT\":35,\"FROM\":36,\"Block\":37,\"Identifier\":38,\"IDENTIFIER\":39,\"JSX_TAG\":40,\"Property\":41,\"PROPERTY\":42,\"AlphaNumeric\":43,\"NUMBER\":44,\"String\":45,\"STRING\":46,\"STRING_START\":47,\"Interpolations\":48,\"STRING_END\":49,\"InterpolationChunk\":50,\"INTERPOLATION_START\":51,\"INTERPOLATION_END\":52,\"Regex\":53,\"REGEX\":54,\"REGEX_START\":55,\"Invocation\":56,\"REGEX_END\":57,\"Literal\":58,\"JS\":59,\"UNDEFINED\":60,\"NULL\":61,\"BOOL\":62,\"INFINITY\":63,\"NAN\":64,\"Assignable\":65,\"=\":66,\"AssignObj\":67,\"ObjAssignable\":68,\"ObjRestValue\":69,\":\":70,\"SimpleObjAssignable\":71,\"ThisProperty\":72,\"[\":73,\"]\":74,\"@\":75,\"...\":76,\"ObjSpreadExpr\":77,\"ObjSpreadIdentifier\":78,\"Parenthetical\":79,\"Super\":80,\"This\":81,\"SUPER\":82,\"OptFuncExist\":83,\"Arguments\":84,\"DYNAMIC_IMPORT\":85,\"Accessor\":86,\"RETURN\":87,\"AWAIT\":88,\"PARAM_START\":89,\"ParamList\":90,\"PARAM_END\":91,\"FuncGlyph\":92,\"->\":93,\"=>\":94,\"OptComma\":95,\",\":96,\"Param\":97,\"ParamVar\":98,\"Array\":99,\"Splat\":100,\"SimpleAssignable\":101,\"Range\":102,\"DoIife\":103,\"MetaProperty\":104,\".\":105,\"INDEX_START\":106,\"INDEX_END\":107,\"NEW_TARGET\":108,\"IMPORT_META\":109,\"?.\":110,\"::\":111,\"?::\":112,\"Index\":113,\"IndexValue\":114,\"INDEX_SOAK\":115,\"Slice\":116,\"{\":117,\"AssignList\":118,\"}\":119,\"CLASS\":120,\"EXTENDS\":121,\"IMPORT\":122,\"ASSERT\":123,\"ImportDefaultSpecifier\":124,\"ImportNamespaceSpecifier\":125,\"ImportSpecifierList\":126,\"ImportSpecifier\":127,\"AS\":128,\"DEFAULT\":129,\"IMPORT_ALL\":130,\"EXPORT\":131,\"ExportSpecifierList\":132,\"EXPORT_ALL\":133,\"ExportSpecifier\":134,\"FUNC_EXIST\":135,\"CALL_START\":136,\"CALL_END\":137,\"ArgList\":138,\"THIS\":139,\"Elisions\":140,\"ArgElisionList\":141,\"OptElisions\":142,\"RangeDots\":143,\"..\":144,\"Arg\":145,\"ArgElision\":146,\"Elision\":147,\"SimpleArgs\":148,\"TRY\":149,\"Catch\":150,\"FINALLY\":151,\"CATCH\":152,\"THROW\":153,\"(\":154,\")\":155,\"WhileLineSource\":156,\"WHILE\":157,\"WHEN\":158,\"UNTIL\":159,\"WhileSource\":160,\"Loop\":161,\"LOOP\":162,\"ForBody\":163,\"ForLineBody\":164,\"FOR\":165,\"BY\":166,\"ForStart\":167,\"ForSource\":168,\"ForLineSource\":169,\"ForVariables\":170,\"OWN\":171,\"ForValue\":172,\"FORIN\":173,\"FOROF\":174,\"FORFROM\":175,\"SWITCH\":176,\"Whens\":177,\"ELSE\":178,\"When\":179,\"LEADING_WHEN\":180,\"IfBlock\":181,\"IF\":182,\"POST_IF\":183,\"IfBlockLine\":184,\"UNARY\":185,\"DO\":186,\"DO_IIFE\":187,\"UNARY_MATH\":188,\"-\":189,\"+\":190,\"--\":191,\"++\":192,\"?\":193,\"MATH\":194,\"**\":195,\"SHIFT\":196,\"COMPARE\":197,\"&\":198,\"^\":199,\"|\":200,\"&&\":201,\"||\":202,\"BIN?\":203,\"RELATION\":204,\"COMPOUND_ASSIGN\":205,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",6:\"TERMINATOR\",14:\"STATEMENT\",32:\"YIELD\",33:\"INDENT\",35:\"OUTDENT\",36:\"FROM\",39:\"IDENTIFIER\",40:\"JSX_TAG\",42:\"PROPERTY\",44:\"NUMBER\",46:\"STRING\",47:\"STRING_START\",49:\"STRING_END\",51:\"INTERPOLATION_START\",52:\"INTERPOLATION_END\",54:\"REGEX\",55:\"REGEX_START\",57:\"REGEX_END\",59:\"JS\",60:\"UNDEFINED\",61:\"NULL\",62:\"BOOL\",63:\"INFINITY\",64:\"NAN\",66:\"=\",70:\":\",73:\"[\",74:\"]\",75:\"@\",76:\"...\",82:\"SUPER\",85:\"DYNAMIC_IMPORT\",87:\"RETURN\",88:\"AWAIT\",89:\"PARAM_START\",91:\"PARAM_END\",93:\"->\",94:\"=>\",96:\",\",105:\".\",106:\"INDEX_START\",107:\"INDEX_END\",108:\"NEW_TARGET\",109:\"IMPORT_META\",110:\"?.\",111:\"::\",112:\"?::\",115:\"INDEX_SOAK\",117:\"{\",119:\"}\",120:\"CLASS\",121:\"EXTENDS\",122:\"IMPORT\",123:\"ASSERT\",128:\"AS\",129:\"DEFAULT\",130:\"IMPORT_ALL\",131:\"EXPORT\",133:\"EXPORT_ALL\",135:\"FUNC_EXIST\",136:\"CALL_START\",137:\"CALL_END\",139:\"THIS\",144:\"..\",149:\"TRY\",151:\"FINALLY\",152:\"CATCH\",153:\"THROW\",154:\"(\",155:\")\",157:\"WHILE\",158:\"WHEN\",159:\"UNTIL\",162:\"LOOP\",165:\"FOR\",166:\"BY\",171:\"OWN\",173:\"FORIN\",174:\"FOROF\",175:\"FORFROM\",176:\"SWITCH\",178:\"ELSE\",180:\"LEADING_WHEN\",182:\"IF\",183:\"POST_IF\",185:\"UNARY\",186:\"DO\",187:\"DO_IIFE\",188:\"UNARY_MATH\",189:\"-\",190:\"+\",191:\"--\",192:\"++\",193:\"?\",194:\"MATH\",195:\"**\",196:\"SHIFT\",197:\"COMPARE\",198:\"&\",199:\"^\",200:\"|\",201:\"&&\",202:\"||\",203:\"BIN?\",204:\"RELATION\",205:\"COMPOUND_ASSIGN\"},\nproductions_: [0,[3,0],[3,1],[4,1],[4,3],[4,2],[5,1],[5,1],[5,1],[5,1],[10,1],[10,1],[9,1],[9,1],[9,1],[9,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[8,1],[8,1],[8,1],[28,1],[28,2],[28,4],[28,3],[37,2],[37,3],[38,1],[38,1],[41,1],[43,1],[43,1],[45,1],[45,3],[48,1],[48,2],[50,3],[50,5],[50,2],[50,1],[53,1],[53,3],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[20,3],[20,4],[20,5],[67,1],[67,1],[67,3],[67,5],[67,3],[67,5],[71,1],[71,1],[71,1],[68,1],[68,3],[68,4],[68,1],[69,2],[69,2],[69,2],[69,2],[77,1],[77,1],[77,1],[77,1],[77,1],[77,3],[77,2],[77,3],[77,3],[78,2],[78,2],[13,2],[13,4],[13,1],[11,3],[11,2],[12,3],[12,2],[18,5],[18,2],[29,5],[29,2],[92,1],[92,1],[95,0],[95,1],[90,0],[90,1],[90,3],[90,4],[90,6],[97,1],[97,2],[97,2],[97,3],[97,1],[98,1],[98,1],[98,1],[98,1],[100,2],[100,2],[101,1],[101,2],[101,2],[101,1],[65,1],[65,1],[65,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[80,3],[80,4],[80,6],[104,3],[104,3],[86,2],[86,2],[86,2],[86,2],[86,1],[86,1],[86,1],[113,3],[113,5],[113,2],[114,1],[114,1],[34,4],[118,0],[118,1],[118,3],[118,4],[118,6],[26,1],[26,2],[26,3],[26,4],[26,2],[26,3],[26,4],[26,5],[15,2],[15,4],[15,4],[15,6],[15,4],[15,6],[15,5],[15,7],[15,7],[15,9],[15,6],[15,8],[15,9],[15,11],[126,1],[126,3],[126,4],[126,4],[126,6],[127,1],[127,3],[127,1],[127,3],[124,1],[125,3],[16,3],[16,5],[16,2],[16,4],[16,5],[16,6],[16,3],[16,5],[16,4],[16,6],[16,5],[16,7],[16,7],[16,9],[132,1],[132,3],[132,4],[132,4],[132,6],[134,1],[134,3],[134,3],[134,1],[134,3],[56,3],[56,3],[56,3],[56,2],[83,0],[83,1],[84,2],[84,4],[81,1],[81,1],[72,2],[99,2],[99,3],[99,4],[143,1],[143,1],[102,5],[102,5],[116,3],[116,2],[116,3],[116,2],[116,2],[116,1],[138,1],[138,3],[138,4],[138,4],[138,6],[145,1],[145,1],[145,1],[145,1],[141,1],[141,3],[141,4],[141,4],[141,6],[146,1],[146,2],[142,1],[142,2],[140,1],[140,2],[147,1],[147,2],[148,1],[148,1],[148,3],[148,3],[22,2],[22,3],[22,4],[22,5],[150,3],[150,3],[150,2],[27,2],[27,4],[79,3],[79,5],[156,2],[156,4],[156,2],[156,4],[160,2],[160,4],[160,4],[160,2],[160,4],[160,4],[23,2],[23,2],[23,2],[23,2],[23,1],[161,2],[161,2],[24,2],[24,2],[24,2],[24,2],[163,2],[163,4],[163,2],[164,4],[164,2],[167,2],[167,3],[167,3],[172,1],[172,1],[172,1],[172,1],[170,1],[170,3],[168,2],[168,2],[168,4],[168,4],[168,4],[168,4],[168,4],[168,4],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,2],[168,4],[168,4],[169,2],[169,2],[169,4],[169,4],[169,4],[169,4],[169,4],[169,4],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,2],[169,4],[169,4],[25,5],[25,5],[25,7],[25,7],[25,4],[25,6],[177,1],[177,2],[179,3],[179,4],[181,3],[181,5],[21,1],[21,3],[21,3],[21,3],[184,3],[184,5],[30,1],[30,3],[30,3],[30,3],[31,2],[31,2],[31,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,4],[19,2],[19,2],[19,2],[19,2],[19,2],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,5],[19,4],[103,2]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\nreturn this.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Root(new yy.Block()));\nbreak;\ncase 2:\nreturn this.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Root($$[$0]));\nbreak;\ncase 3:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(yy.Block.wrap([$$[$0]]));\nbreak;\ncase 4:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)($$[$0-2].push($$[$0]));\nbreak;\ncase 5:\nthis.$ = $$[$0-1];\nbreak;\ncase 6: case 7: case 8: case 9: case 10: case 11: case 12: case 14: case 15: case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 41: case 52: case 54: case 64: case 69: case 70: case 71: case 72: case 75: case 80: case 81: case 82: case 83: case 84: case 104: case 105: case 116: case 117: case 118: case 119: case 125: case 126: case 129: case 135: case 149: case 247: case 248: case 249: case 251: case 264: case 265: case 308: case 309: case 364: case 370:\nthis.$ = $$[$0];\nbreak;\ncase 13:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.StatementLiteral($$[$0]));\nbreak;\ncase 31:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Op($$[$0],\n      new yy.Value(new yy.Literal(''))));\nbreak;\ncase 32: case 374: case 375: case 376: case 378: case 379: case 382: case 405:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Op($$[$0-1],\n      $$[$0]));\nbreak;\ncase 33: case 383:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Op($$[$0-3],\n      $$[$0-1]));\nbreak;\ncase 34:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Op($$[$0-2].concat($$[$0-1]),\n      $$[$0]));\nbreak;\ncase 35:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Block());\nbreak;\ncase 36: case 150:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)($$[$0-1]);\nbreak;\ncase 37:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.IdentifierLiteral($$[$0]));\nbreak;\ncase 38:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)((function() {\n        var ref,\n      ref1,\n      ref2,\n      ref3;\n        return new yy.JSXTag($$[$0].toString(),\n      {\n          tagNameLocationData: $$[$0].tagNameToken[2],\n          closingTagOpeningBracketLocationData: (ref = $$[$0].closingTagOpeningBracketToken) != null ? ref[2] : void 0,\n          closingTagSlashLocationData: (ref1 = $$[$0].closingTagSlashToken) != null ? ref1[2] : void 0,\n          closingTagNameLocationData: (ref2 = $$[$0].closingTagNameToken) != null ? ref2[2] : void 0,\n          closingTagClosingBracketLocationData: (ref3 = $$[$0].closingTagClosingBracketToken) != null ? ref3[2] : void 0\n        });\n      }()));\nbreak;\ncase 39:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.PropertyName($$[$0].toString()));\nbreak;\ncase 40:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.NumberLiteral($$[$0].toString(),\n      {\n          parsedValue: $$[$0].parsedValue\n        }));\nbreak;\ncase 42:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.StringLiteral($$[$0].slice(1,\n      -1), // strip artificial quotes and unwrap to primitive string\n      {\n          quote: $$[$0].quote,\n          initialChunk: $$[$0].initialChunk,\n          finalChunk: $$[$0].finalChunk,\n          indent: $$[$0].indent,\n          double: $$[$0].double,\n          heregex: $$[$0].heregex\n        }));\nbreak;\ncase 43:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.StringWithInterpolations(yy.Block.wrap($$[$0-1]),\n      {\n          quote: $$[$0-2].quote,\n          startQuote: yy.addDataToNode(yy, _$[$0-2], $$[$0-2], null, null, true)(new yy.Literal($$[$0-2].toString()))\n        }));\nbreak;\ncase 44: case 107: case 157: case 183: case 208: case 242: case 256: case 260: case 312: case 358:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)([$$[$0]]);\nbreak;\ncase 45: case 257: case 261: case 359:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)($$[$0-1].concat($$[$0]));\nbreak;\ncase 46:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Interpolation($$[$0-1]));\nbreak;\ncase 47:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.Interpolation($$[$0-2]));\nbreak;\ncase 48:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Interpolation());\nbreak;\ncase 49: case 293:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)($$[$0]);\nbreak;\ncase 50:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.RegexLiteral($$[$0].toString(),\n      {\n          delimiter: $$[$0].delimiter,\n          heregexCommentTokens: $$[$0].heregexCommentTokens\n        }));\nbreak;\ncase 51:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.RegexWithInterpolations($$[$0-1],\n      {\n          heregexCommentTokens: $$[$0].heregexCommentTokens\n        }));\nbreak;\ncase 53:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.PassthroughLiteral($$[$0].toString(),\n      {\n          here: $$[$0].here,\n          generated: $$[$0].generated\n        }));\nbreak;\ncase 55:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.UndefinedLiteral($$[$0]));\nbreak;\ncase 56:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.NullLiteral($$[$0]));\nbreak;\ncase 57:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.BooleanLiteral($$[$0].toString(),\n      {\n          originalValue: $$[$0].original\n        }));\nbreak;\ncase 58:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.InfinityLiteral($$[$0].toString(),\n      {\n          originalValue: $$[$0].original\n        }));\nbreak;\ncase 59:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.NaNLiteral($$[$0]));\nbreak;\ncase 60:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Assign($$[$0-2],\n      $$[$0]));\nbreak;\ncase 61:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Assign($$[$0-3],\n      $$[$0]));\nbreak;\ncase 62:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.Assign($$[$0-4],\n      $$[$0-1]));\nbreak;\ncase 63: case 122: case 127: case 128: case 130: case 131: case 132: case 133: case 134: case 136: case 137: case 310: case 311:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Value($$[$0]));\nbreak;\ncase 65:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Assign(yy.addDataToNode(yy, _$[$0-2], $$[$0-2], null, null, true)(new yy.Value($$[$0-2])),\n      $$[$0],\n      'object',\n      {\n          operatorToken: yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.Literal($$[$0-1]))\n        }));\nbreak;\ncase 66:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.Assign(yy.addDataToNode(yy, _$[$0-4], $$[$0-4], null, null, true)(new yy.Value($$[$0-4])),\n      $$[$0-1],\n      'object',\n      {\n          operatorToken: yy.addDataToNode(yy, _$[$0-3], $$[$0-3], null, null, true)(new yy.Literal($$[$0-3]))\n        }));\nbreak;\ncase 67:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Assign(yy.addDataToNode(yy, _$[$0-2], $$[$0-2], null, null, true)(new yy.Value($$[$0-2])),\n      $$[$0],\n      null,\n      {\n          operatorToken: yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.Literal($$[$0-1]))\n        }));\nbreak;\ncase 68:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.Assign(yy.addDataToNode(yy, _$[$0-4], $$[$0-4], null, null, true)(new yy.Value($$[$0-4])),\n      $$[$0-1],\n      null,\n      {\n          operatorToken: yy.addDataToNode(yy, _$[$0-3], $$[$0-3], null, null, true)(new yy.Literal($$[$0-3]))\n        }));\nbreak;\ncase 73:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Value(new yy.ComputedPropertyName($$[$0-1])));\nbreak;\ncase 74:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Value(yy.addDataToNode(yy, _$[$0-3], $$[$0-3], null, null, true)(new yy.ThisLiteral($$[$0-3])),\n      [yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.ComputedPropertyName($$[$0-1]))],\n      'this'));\nbreak;\ncase 76:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Splat(new yy.Value($$[$0-1])));\nbreak;\ncase 77:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Splat(new yy.Value($$[$0]),\n      {\n          postfix: false\n        }));\nbreak;\ncase 78: case 120:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Splat($$[$0-1]));\nbreak;\ncase 79: case 121:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Splat($$[$0],\n      {\n          postfix: false\n        }));\nbreak;\ncase 85: case 220:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.SuperCall(yy.addDataToNode(yy, _$[$0-2], $$[$0-2], null, null, true)(new yy.Super()),\n      $$[$0],\n      $$[$0-1].soak,\n      $$[$0-2]));\nbreak;\ncase 86: case 221:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.DynamicImportCall(yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.DynamicImport()),\n      $$[$0]));\nbreak;\ncase 87:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Call(new yy.Value($$[$0-2]),\n      $$[$0],\n      $$[$0-1].soak));\nbreak;\ncase 88: case 219:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Call($$[$0-2],\n      $$[$0],\n      $$[$0-1].soak));\nbreak;\ncase 89: case 90:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)((new yy.Value($$[$0-1])).add($$[$0]));\nbreak;\ncase 91:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Return($$[$0]));\nbreak;\ncase 92:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Return(new yy.Value($$[$0-1])));\nbreak;\ncase 93:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Return());\nbreak;\ncase 94:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.YieldReturn($$[$0],\n      {\n          returnKeyword: yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.Literal($$[$0-1]))\n        }));\nbreak;\ncase 95:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.YieldReturn(null,\n      {\n          returnKeyword: yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(new yy.Literal($$[$0]))\n        }));\nbreak;\ncase 96:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.AwaitReturn($$[$0],\n      {\n          returnKeyword: yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.Literal($$[$0-1]))\n        }));\nbreak;\ncase 97:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.AwaitReturn(null,\n      {\n          returnKeyword: yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(new yy.Literal($$[$0]))\n        }));\nbreak;\ncase 98:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.Code($$[$0-3],\n      $$[$0],\n      $$[$0-1],\n      yy.addDataToNode(yy, _$[$0-4], $$[$0-4], null, null, true)(new yy.Literal($$[$0-4]))));\nbreak;\ncase 99:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Code([],\n      $$[$0],\n      $$[$0-1]));\nbreak;\ncase 100:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.Code($$[$0-3],\n      yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(yy.Block.wrap([$$[$0]])),\n      $$[$0-1],\n      yy.addDataToNode(yy, _$[$0-4], $$[$0-4], null, null, true)(new yy.Literal($$[$0-4]))));\nbreak;\ncase 101:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Code([],\n      yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(yy.Block.wrap([$$[$0]])),\n      $$[$0-1]));\nbreak;\ncase 102: case 103:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.FuncGlyph($$[$0]));\nbreak;\ncase 106: case 156: case 258:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)([]);\nbreak;\ncase 108: case 158: case 184: case 209: case 243: case 252:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)($$[$0-2].concat($$[$0]));\nbreak;\ncase 109: case 159: case 185: case 210: case 244: case 253:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)($$[$0-3].concat($$[$0]));\nbreak;\ncase 110: case 160: case 187: case 212: case 246:\nthis.$ = yy.addDataToNode(yy, _$[$0-5], $$[$0-5], _$[$0], $$[$0], true)($$[$0-5].concat($$[$0-2]));\nbreak;\ncase 111:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Param($$[$0]));\nbreak;\ncase 112:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Param($$[$0-1],\n      null,\n      true));\nbreak;\ncase 113:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Param($$[$0],\n      null,\n      {\n          postfix: false\n        }));\nbreak;\ncase 114:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Param($$[$0-2],\n      $$[$0]));\nbreak;\ncase 115: case 250:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Expansion());\nbreak;\ncase 123:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)($$[$0-1].add($$[$0]));\nbreak;\ncase 124:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Value($$[$0-1]).add($$[$0]));\nbreak;\ncase 138:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Super(yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(new yy.Access($$[$0])),\n      yy.addDataToNode(yy, _$[$0-2], $$[$0-2], null, null, true)(new yy.Literal($$[$0-2]))));\nbreak;\ncase 139:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Super(yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.Index($$[$0-1])),\n      yy.addDataToNode(yy, _$[$0-3], $$[$0-3], null, null, true)(new yy.Literal($$[$0-3]))));\nbreak;\ncase 140:\nthis.$ = yy.addDataToNode(yy, _$[$0-5], $$[$0-5], _$[$0], $$[$0], true)(new yy.Super(yy.addDataToNode(yy, _$[$0-2], $$[$0-2], null, null, true)(new yy.Index($$[$0-2])),\n      yy.addDataToNode(yy, _$[$0-5], $$[$0-5], null, null, true)(new yy.Literal($$[$0-5]))));\nbreak;\ncase 141: case 142:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.MetaProperty(yy.addDataToNode(yy, _$[$0-2], $$[$0-2], null, null, true)(new yy.IdentifierLiteral($$[$0-2])),\n      yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(new yy.Access($$[$0]))));\nbreak;\ncase 143:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Access($$[$0]));\nbreak;\ncase 144:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Access($$[$0],\n      {\n          soak: true\n        }));\nbreak;\ncase 145:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)([\n          yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.Access(new yy.PropertyName('prototype'),\n          {\n            shorthand: true\n          })),\n          yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(new yy.Access($$[$0]))\n        ]);\nbreak;\ncase 146:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)([\n          yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.Access(new yy.PropertyName('prototype'),\n          {\n            shorthand: true,\n            soak: true\n          })),\n          yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(new yy.Access($$[$0]))\n        ]);\nbreak;\ncase 147:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Access(new yy.PropertyName('prototype'),\n      {\n          shorthand: true\n        }));\nbreak;\ncase 148:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Access(new yy.PropertyName('prototype'),\n      {\n          shorthand: true,\n          soak: true\n        }));\nbreak;\ncase 151:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)($$[$0-2]);\nbreak;\ncase 152:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(yy.extend($$[$0],\n      {\n          soak: true\n        }));\nbreak;\ncase 153:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Index($$[$0]));\nbreak;\ncase 154:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Slice($$[$0]));\nbreak;\ncase 155:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Obj($$[$0-2],\n      $$[$0-3].generated));\nbreak;\ncase 161:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Class());\nbreak;\ncase 162:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Class(null,\n      null,\n      $$[$0]));\nbreak;\ncase 163:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Class(null,\n      $$[$0]));\nbreak;\ncase 164:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Class(null,\n      $$[$0-1],\n      $$[$0]));\nbreak;\ncase 165:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Class($$[$0]));\nbreak;\ncase 166:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Class($$[$0-1],\n      null,\n      $$[$0]));\nbreak;\ncase 167:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Class($$[$0-2],\n      $$[$0]));\nbreak;\ncase 168:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.Class($$[$0-3],\n      $$[$0-1],\n      $$[$0]));\nbreak;\ncase 169:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.ImportDeclaration(null,\n      $$[$0]));\nbreak;\ncase 170:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.ImportDeclaration(null,\n      $$[$0-2],\n      $$[$0]));\nbreak;\ncase 171:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-2],\n      null),\n      $$[$0]));\nbreak;\ncase 172:\nthis.$ = yy.addDataToNode(yy, _$[$0-5], $$[$0-5], _$[$0], $$[$0], true)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-4],\n      null),\n      $$[$0-2],\n      $$[$0]));\nbreak;\ncase 173:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.ImportDeclaration(new yy.ImportClause(null,\n      $$[$0-2]),\n      $$[$0]));\nbreak;\ncase 174:\nthis.$ = yy.addDataToNode(yy, _$[$0-5], $$[$0-5], _$[$0], $$[$0], true)(new yy.ImportDeclaration(new yy.ImportClause(null,\n      $$[$0-4]),\n      $$[$0-2],\n      $$[$0]));\nbreak;\ncase 175:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.ImportDeclaration(new yy.ImportClause(null,\n      new yy.ImportSpecifierList([])),\n      $$[$0]));\nbreak;\ncase 176:\nthis.$ = yy.addDataToNode(yy, _$[$0-6], $$[$0-6], _$[$0], $$[$0], true)(new yy.ImportDeclaration(new yy.ImportClause(null,\n      new yy.ImportSpecifierList([])),\n      $$[$0-2],\n      $$[$0]));\nbreak;\ncase 177:\nthis.$ = yy.addDataToNode(yy, _$[$0-6], $$[$0-6], _$[$0], $$[$0], true)(new yy.ImportDeclaration(new yy.ImportClause(null,\n      new yy.ImportSpecifierList($$[$0-4])),\n      $$[$0]));\nbreak;\ncase 178:\nthis.$ = yy.addDataToNode(yy, _$[$0-8], $$[$0-8], _$[$0], $$[$0], true)(new yy.ImportDeclaration(new yy.ImportClause(null,\n      new yy.ImportSpecifierList($$[$0-6])),\n      $$[$0-2],\n      $$[$0]));\nbreak;\ncase 179:\nthis.$ = yy.addDataToNode(yy, _$[$0-5], $$[$0-5], _$[$0], $$[$0], true)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-4],\n      $$[$0-2]),\n      $$[$0]));\nbreak;\ncase 180:\nthis.$ = yy.addDataToNode(yy, _$[$0-7], $$[$0-7], _$[$0], $$[$0], true)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-6],\n      $$[$0-4]),\n      $$[$0-2],\n      $$[$0]));\nbreak;\ncase 181:\nthis.$ = yy.addDataToNode(yy, _$[$0-8], $$[$0-8], _$[$0], $$[$0], true)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-7],\n      new yy.ImportSpecifierList($$[$0-4])),\n      $$[$0]));\nbreak;\ncase 182:\nthis.$ = yy.addDataToNode(yy, _$[$0-10], $$[$0-10], _$[$0], $$[$0], true)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-9],\n      new yy.ImportSpecifierList($$[$0-6])),\n      $$[$0-2],\n      $$[$0]));\nbreak;\ncase 186: case 211: case 245:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)($$[$0-2]);\nbreak;\ncase 188:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.ImportSpecifier($$[$0]));\nbreak;\ncase 189:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.ImportSpecifier($$[$0-2],\n      $$[$0]));\nbreak;\ncase 190:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.ImportSpecifier(yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(new yy.DefaultLiteral($$[$0]))));\nbreak;\ncase 191:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.ImportSpecifier(yy.addDataToNode(yy, _$[$0-2], $$[$0-2], null, null, true)(new yy.DefaultLiteral($$[$0-2])),\n      $$[$0]));\nbreak;\ncase 192:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.ImportDefaultSpecifier($$[$0]));\nbreak;\ncase 193:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.ImportNamespaceSpecifier(new yy.Literal($$[$0-2]),\n      $$[$0]));\nbreak;\ncase 194:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([])));\nbreak;\ncase 195:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-2])));\nbreak;\ncase 196:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.ExportNamedDeclaration($$[$0]));\nbreak;\ncase 197:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Assign($$[$0-2],\n      $$[$0],\n      null,\n      {\n          moduleDeclaration: 'export'\n        }))));\nbreak;\ncase 198:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Assign($$[$0-3],\n      $$[$0],\n      null,\n      {\n          moduleDeclaration: 'export'\n        }))));\nbreak;\ncase 199:\nthis.$ = yy.addDataToNode(yy, _$[$0-5], $$[$0-5], _$[$0], $$[$0], true)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.Assign($$[$0-4],\n      $$[$0-1],\n      null,\n      {\n          moduleDeclaration: 'export'\n        }))));\nbreak;\ncase 200:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.ExportDefaultDeclaration($$[$0]));\nbreak;\ncase 201:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.ExportDefaultDeclaration(new yy.Value($$[$0-1])));\nbreak;\ncase 202:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.ExportAllDeclaration(new yy.Literal($$[$0-2]),\n      $$[$0]));\nbreak;\ncase 203:\nthis.$ = yy.addDataToNode(yy, _$[$0-5], $$[$0-5], _$[$0], $$[$0], true)(new yy.ExportAllDeclaration(new yy.Literal($$[$0-4]),\n      $$[$0-2],\n      $$[$0]));\nbreak;\ncase 204:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([]),\n      $$[$0]));\nbreak;\ncase 205:\nthis.$ = yy.addDataToNode(yy, _$[$0-6], $$[$0-6], _$[$0], $$[$0], true)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([]),\n      $$[$0-2],\n      $$[$0]));\nbreak;\ncase 206:\nthis.$ = yy.addDataToNode(yy, _$[$0-6], $$[$0-6], _$[$0], $$[$0], true)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-4]),\n      $$[$0]));\nbreak;\ncase 207:\nthis.$ = yy.addDataToNode(yy, _$[$0-8], $$[$0-8], _$[$0], $$[$0], true)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-6]),\n      $$[$0-2],\n      $$[$0]));\nbreak;\ncase 213:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.ExportSpecifier($$[$0]));\nbreak;\ncase 214:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.ExportSpecifier($$[$0-2],\n      $$[$0]));\nbreak;\ncase 215:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.ExportSpecifier($$[$0-2],\n      yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(new yy.DefaultLiteral($$[$0]))));\nbreak;\ncase 216:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.ExportSpecifier(yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(new yy.DefaultLiteral($$[$0]))));\nbreak;\ncase 217:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.ExportSpecifier(yy.addDataToNode(yy, _$[$0-2], $$[$0-2], null, null, true)(new yy.DefaultLiteral($$[$0-2])),\n      $$[$0]));\nbreak;\ncase 218:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.TaggedTemplateCall($$[$0-2],\n      $$[$0],\n      $$[$0-1].soak));\nbreak;\ncase 222:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)({\n          soak: false\n        });\nbreak;\ncase 223:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)({\n          soak: true\n        });\nbreak;\ncase 224:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)([]);\nbreak;\ncase 225:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)((function() {\n        $$[$0-2].implicit = $$[$0-3].generated;\n        return $$[$0-2];\n      }()));\nbreak;\ncase 226: case 227:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Value(new yy.ThisLiteral($$[$0])));\nbreak;\ncase 228:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Value(yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.ThisLiteral($$[$0-1])),\n      [yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(new yy.Access($$[$0]))],\n      'this'));\nbreak;\ncase 229:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Arr([]));\nbreak;\ncase 230:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Arr($$[$0-1]));\nbreak;\ncase 231:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Arr([].concat($$[$0-2],\n      $$[$0-1])));\nbreak;\ncase 232:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)({\n          exclusive: false\n        });\nbreak;\ncase 233:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)({\n          exclusive: true\n        });\nbreak;\ncase 234: case 235:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.Range($$[$0-3],\n      $$[$0-1],\n      $$[$0-2].exclusive ? 'exclusive' : 'inclusive'));\nbreak;\ncase 236: case 238:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Range($$[$0-2],\n      $$[$0],\n      $$[$0-1].exclusive ? 'exclusive' : 'inclusive'));\nbreak;\ncase 237: case 239:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Range($$[$0-1],\n      null,\n      $$[$0].exclusive ? 'exclusive' : 'inclusive'));\nbreak;\ncase 240:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Range(null,\n      $$[$0],\n      $$[$0-1].exclusive ? 'exclusive' : 'inclusive'));\nbreak;\ncase 241:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Range(null,\n      null,\n      $$[$0].exclusive ? 'exclusive' : 'inclusive'));\nbreak;\ncase 254:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)($$[$0-2].concat($$[$0-1]));\nbreak;\ncase 255:\nthis.$ = yy.addDataToNode(yy, _$[$0-5], $$[$0-5], _$[$0], $$[$0], true)($$[$0-5].concat($$[$0-4],\n      $$[$0-2],\n      $$[$0-1]));\nbreak;\ncase 259:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)([].concat($$[$0]));\nbreak;\ncase 262:\nthis.$ = yy.addDataToNode(yy, _$[$0], $$[$0], _$[$0], $$[$0], true)(new yy.Elision());\nbreak;\ncase 263:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)($$[$0-1]);\nbreak;\ncase 266: case 267:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)([].concat($$[$0-2],\n      $$[$0]));\nbreak;\ncase 268:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Try($$[$0]));\nbreak;\ncase 269:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Try($$[$0-1],\n      $$[$0]));\nbreak;\ncase 270:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Try($$[$0-2],\n      null,\n      $$[$0],\n      yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.Literal($$[$0-1]))));\nbreak;\ncase 271:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.Try($$[$0-3],\n      $$[$0-2],\n      $$[$0],\n      yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.Literal($$[$0-1]))));\nbreak;\ncase 272:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Catch($$[$0],\n      $$[$0-1]));\nbreak;\ncase 273:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Catch($$[$0],\n      yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.Value($$[$0-1]))));\nbreak;\ncase 274:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Catch($$[$0]));\nbreak;\ncase 275:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Throw($$[$0]));\nbreak;\ncase 276:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Throw(new yy.Value($$[$0-1])));\nbreak;\ncase 277:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Parens($$[$0-1]));\nbreak;\ncase 278:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.Parens($$[$0-2]));\nbreak;\ncase 279: case 283:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.While($$[$0]));\nbreak;\ncase 280: case 284: case 285:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.While($$[$0-2],\n      {\n          guard: $$[$0]\n        }));\nbreak;\ncase 281: case 286:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.While($$[$0],\n      {\n          invert: true\n        }));\nbreak;\ncase 282: case 287: case 288:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.While($$[$0-2],\n      {\n          invert: true,\n          guard: $$[$0]\n        }));\nbreak;\ncase 289: case 290: case 298: case 299:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)($$[$0-1].addBody($$[$0]));\nbreak;\ncase 291: case 292:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)((Object.assign($$[$0],\n      {\n          postfix: true\n        })).addBody(yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(yy.Block.wrap([$$[$0-1]]))));\nbreak;\ncase 294:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.While(yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.BooleanLiteral('true')),\n      {\n          isLoop: true\n        }).addBody($$[$0]));\nbreak;\ncase 295:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.While(yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.BooleanLiteral('true')),\n      {\n          isLoop: true\n        }).addBody(yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(yy.Block.wrap([$$[$0]]))));\nbreak;\ncase 296: case 297:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)((function() {\n        $$[$0].postfix = true;\n        return $$[$0].addBody($$[$0-1]);\n      }()));\nbreak;\ncase 300:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.For([],\n      {\n          source: yy.addDataToNode(yy, _$[$0], $$[$0], null, null, true)(new yy.Value($$[$0]))\n        }));\nbreak;\ncase 301: case 303:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.For([],\n      {\n          source: yy.addDataToNode(yy, _$[$0-2], $$[$0-2], null, null, true)(new yy.Value($$[$0-2])),\n          step: $$[$0]\n        }));\nbreak;\ncase 302: case 304:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)($$[$0-1].addSource($$[$0]));\nbreak;\ncase 305:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.For([],\n      {\n          name: $$[$0][0],\n          index: $$[$0][1]\n        }));\nbreak;\ncase 306:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)((function() {\n        var index,\n      name;\n        [name,\n      index] = $$[$0];\n        return new yy.For([],\n      {\n          name,\n          index,\n          await: true,\n          awaitTag: yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.Literal($$[$0-1]))\n        });\n      }()));\nbreak;\ncase 307:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)((function() {\n        var index,\n      name;\n        [name,\n      index] = $$[$0];\n        return new yy.For([],\n      {\n          name,\n          index,\n          own: true,\n          ownTag: yy.addDataToNode(yy, _$[$0-1], $$[$0-1], null, null, true)(new yy.Literal($$[$0-1]))\n        });\n      }()));\nbreak;\ncase 313:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)([$$[$0-2],\n      $$[$0]]);\nbreak;\ncase 314: case 333:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)({\n          source: $$[$0]\n        });\nbreak;\ncase 315: case 334:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)({\n          source: $$[$0],\n          object: true\n        });\nbreak;\ncase 316: case 317: case 335: case 336:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)({\n          source: $$[$0-2],\n          guard: $$[$0]\n        });\nbreak;\ncase 318: case 319: case 337: case 338:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)({\n          source: $$[$0-2],\n          guard: $$[$0],\n          object: true\n        });\nbreak;\ncase 320: case 321: case 339: case 340:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)({\n          source: $$[$0-2],\n          step: $$[$0]\n        });\nbreak;\ncase 322: case 323: case 324: case 325: case 341: case 342: case 343: case 344:\nthis.$ = yy.addDataToNode(yy, _$[$0-5], $$[$0-5], _$[$0], $$[$0], true)({\n          source: $$[$0-4],\n          guard: $$[$0-2],\n          step: $$[$0]\n        });\nbreak;\ncase 326: case 327: case 328: case 329: case 345: case 346: case 347: case 348:\nthis.$ = yy.addDataToNode(yy, _$[$0-5], $$[$0-5], _$[$0], $$[$0], true)({\n          source: $$[$0-4],\n          step: $$[$0-2],\n          guard: $$[$0]\n        });\nbreak;\ncase 330: case 349:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)({\n          source: $$[$0],\n          from: true\n        });\nbreak;\ncase 331: case 332: case 350: case 351:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)({\n          source: $$[$0-2],\n          guard: $$[$0],\n          from: true\n        });\nbreak;\ncase 352: case 353:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.Switch($$[$0-3],\n      $$[$0-1]));\nbreak;\ncase 354: case 355:\nthis.$ = yy.addDataToNode(yy, _$[$0-6], $$[$0-6], _$[$0], $$[$0], true)(new yy.Switch($$[$0-5],\n      $$[$0-3],\n      yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0-1], $$[$0-1], true)($$[$0-1])));\nbreak;\ncase 356:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Switch(null,\n      $$[$0-1]));\nbreak;\ncase 357:\nthis.$ = yy.addDataToNode(yy, _$[$0-5], $$[$0-5], _$[$0], $$[$0], true)(new yy.Switch(null,\n      $$[$0-3],\n      yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0-1], $$[$0-1], true)($$[$0-1])));\nbreak;\ncase 360:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.SwitchWhen($$[$0-1],\n      $$[$0]));\nbreak;\ncase 361:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], false)(yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0-1], $$[$0-1], true)(new yy.SwitchWhen($$[$0-2],\n      $$[$0-1])));\nbreak;\ncase 362: case 368:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.If($$[$0-1],\n      $$[$0],\n      {\n          type: $$[$0-2]\n        }));\nbreak;\ncase 363: case 369:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)($$[$0-4].addElse(yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.If($$[$0-1],\n      $$[$0],\n      {\n          type: $$[$0-2]\n        }))));\nbreak;\ncase 365: case 371:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)($$[$0-2].addElse($$[$0]));\nbreak;\ncase 366: case 367: case 372: case 373:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.If($$[$0],\n      yy.addDataToNode(yy, _$[$0-2], $$[$0-2], null, null, true)(yy.Block.wrap([$$[$0-2]])),\n      {\n          type: $$[$0-1],\n          postfix: true\n        }));\nbreak;\ncase 377:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Op($$[$0-1].toString(),\n      $$[$0],\n      void 0,\n      void 0,\n      {\n          originalOperator: $$[$0-1].original\n        }));\nbreak;\ncase 380:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Op('-',\n      $$[$0]));\nbreak;\ncase 381:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Op('+',\n      $$[$0]));\nbreak;\ncase 384:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Op('--',\n      $$[$0]));\nbreak;\ncase 385:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Op('++',\n      $$[$0]));\nbreak;\ncase 386:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Op('--',\n      $$[$0-1],\n      null,\n      true));\nbreak;\ncase 387:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Op('++',\n      $$[$0-1],\n      null,\n      true));\nbreak;\ncase 388:\nthis.$ = yy.addDataToNode(yy, _$[$0-1], $$[$0-1], _$[$0], $$[$0], true)(new yy.Existence($$[$0-1]));\nbreak;\ncase 389:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Op('+',\n      $$[$0-2],\n      $$[$0]));\nbreak;\ncase 390:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Op('-',\n      $$[$0-2],\n      $$[$0]));\nbreak;\ncase 391: case 392: case 393: case 395: case 396: case 397: case 400:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Op($$[$0-1],\n      $$[$0-2],\n      $$[$0]));\nbreak;\ncase 394: case 398: case 399:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Op($$[$0-1].toString(),\n      $$[$0-2],\n      $$[$0],\n      void 0,\n      {\n          originalOperator: $$[$0-1].original\n        }));\nbreak;\ncase 401:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)((function() {\n        var ref,\n      ref1;\n        return new yy.Op($$[$0-1].toString(),\n      $$[$0-2],\n      $$[$0],\n      void 0,\n      {\n          invertOperator: (ref = (ref1 = $$[$0-1].invert) != null ? ref1.original : void 0) != null ? ref : $$[$0-1].invert\n        });\n      }()));\nbreak;\ncase 402:\nthis.$ = yy.addDataToNode(yy, _$[$0-2], $$[$0-2], _$[$0], $$[$0], true)(new yy.Assign($$[$0-2],\n      $$[$0],\n      $$[$0-1].toString(),\n      {\n          originalContext: $$[$0-1].original\n        }));\nbreak;\ncase 403:\nthis.$ = yy.addDataToNode(yy, _$[$0-4], $$[$0-4], _$[$0], $$[$0], true)(new yy.Assign($$[$0-4],\n      $$[$0-1],\n      $$[$0-3].toString(),\n      {\n          originalContext: $$[$0-3].original\n        }));\nbreak;\ncase 404:\nthis.$ = yy.addDataToNode(yy, _$[$0-3], $$[$0-3], _$[$0], $$[$0], true)(new yy.Assign($$[$0-3],\n      $$[$0],\n      $$[$0-2].toString(),\n      {\n          originalContext: $$[$0-2].original\n        }));\nbreak;\n}\n},\ntable: [{1:[2,1],3:1,4:2,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{1:[3]},{1:[2,2],6:$VM},o($VN,[2,3]),o($VO,[2,6],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,7]),o($VO,[2,8],{167:123,160:125,163:126,157:$VP,159:$VQ,165:$VR,183:$V51}),o($VO,[2,9]),o($V61,[2,16],{83:127,86:128,113:134,46:$V71,47:$V71,136:$V71,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1}),o($V61,[2,17],{113:134,86:137,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1}),o($V61,[2,18]),o($V61,[2,19]),o($V61,[2,20]),o($V61,[2,21]),o($V61,[2,22]),o($V61,[2,23]),o($V61,[2,24]),o($V61,[2,25]),o($V61,[2,26]),o($V61,[2,27]),o($VO,[2,28]),o($VO,[2,29]),o($VO,[2,30]),o($Vf1,[2,12]),o($Vf1,[2,13]),o($Vf1,[2,14]),o($Vf1,[2,15]),o($VO,[2,10]),o($VO,[2,11]),o($Vg1,$Vh1,{66:[1,138]}),o($Vg1,[2,130]),o($Vg1,[2,131]),o($Vg1,[2,132]),o($Vg1,$Vi1),o($Vg1,[2,134]),o($Vg1,[2,135]),o($Vg1,[2,136]),o($Vg1,[2,137]),o($Vj1,$Vk1,{90:139,97:140,98:141,38:143,72:144,99:145,34:146,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{5:150,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:$Vo1,34:66,37:149,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:152,8:153,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:157,8:158,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:159,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:167,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:168,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:169,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vw1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:[1,171],88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:172,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:176,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},o($Vx1,$Vy1,{191:[1,177],192:[1,178],205:[1,179]}),o($V61,[2,364],{178:[1,180]}),{33:$Vo1,37:181},{33:$Vo1,37:182},{33:$Vo1,37:183},o($V61,[2,293]),{33:$Vo1,37:184},{33:$Vo1,37:185},{7:186,8:187,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:[1,188],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz1,[2,161],{58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,99:65,34:66,43:67,53:69,38:85,72:86,45:95,92:161,17:173,18:174,65:175,37:189,101:191,33:$Vo1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,121:[1,190],139:$Vu,154:$Vx,187:$Vv1}),{7:192,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,193],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,35,52,74,76,96,137,144,155,157,158,159,165,166,183,193,194,195,196,197,198,199,200,201,202,203,204],$VA1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:194,14:$V0,32:$Vp1,33:$VB1,36:$VC1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:[1,197],88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VO,[2,370],{178:[1,198]}),{18:200,29:199,89:$Vl,92:39,93:$Vm,94:$Vn},o([1,6,35,52,74,76,96,137,144,155,157,158,159,165,166,183],$VD1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:201,14:$V0,32:$Vp1,33:$VE1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{38:207,39:$V2,40:$V3,45:203,46:$V5,47:$V6,117:[1,206],124:204,125:205,130:$VF1},{26:210,38:211,39:$V2,40:$V3,117:[1,209],120:$Vr,129:[1,212],133:[1,213]},o($Vx1,[2,127]),o($Vx1,[2,128]),o($Vg1,[2,52]),o($Vg1,[2,53]),o($Vg1,[2,54]),o($Vg1,[2,55]),o($Vg1,[2,56]),o($Vg1,[2,57]),o($Vg1,[2,58]),o($Vg1,[2,59]),{4:214,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:[1,215],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:216,8:217,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:$VH1,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:219,141:220,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{83:228,105:$VK1,106:$VL1,135:$Ve1,136:$V71},{84:231,136:$VM1},o($Vg1,[2,226]),o($Vg1,$VN1,{41:233,42:$VO1}),{105:[1,235]},{105:[1,236]},o($VP1,[2,102]),o($VP1,[2,103]),o($VQ1,[2,122]),o($VQ1,[2,125]),{7:237,8:238,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:239,8:240,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:241,8:242,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:244,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vo1,34:66,37:243,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vf,75:$Vm1,88:$VR1,99:252,102:245,117:$Vq,170:246,171:$VS1,172:249},{168:254,169:255,173:[1,256],174:[1,257],175:[1,258]},o([6,33,96,119],$VT1,{45:95,118:259,67:260,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),o($VZ1,[2,40]),o($VZ1,[2,41]),o($Vg1,[2,50]),{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:279,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:280,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},o($V_1,[2,37]),o($V_1,[2,38]),o($V$1,[2,42]),{45:284,46:$V5,47:$V6,48:281,50:282,51:$V02},o($VN,[2,5],{7:4,8:5,9:6,10:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,11:27,12:28,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,5:285,14:$V0,32:$V1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V61,[2,388]),{7:286,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:287,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:288,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:289,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:290,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:291,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:292,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:293,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:294,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:295,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:296,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:297,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:298,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:299,8:300,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,292]),o($V61,[2,297]),{7:239,8:301,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:241,8:302,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vf,75:$Vm1,88:$VR1,99:252,102:303,117:$Vq,170:246,171:$VS1,172:249},{168:254,173:[1,304],174:[1,305],175:[1,306]},{7:307,8:308,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,291]),o($V61,[2,296]),{45:309,46:$V5,47:$V6,84:310,136:$VM1},o($VQ1,[2,123]),o($V12,[2,223]),{41:311,42:$VO1},{41:312,42:$VO1},o($VQ1,[2,147],{41:313,42:$VO1}),o($VQ1,[2,148],{41:314,42:$VO1}),o($VQ1,[2,149]),{7:317,8:319,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:[1,316],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$V22,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,114:315,116:318,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,143:320,144:$V32,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{106:$V91,113:323,115:$Vd1},o($VQ1,[2,124]),{6:[1,325],7:324,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,326],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V42,$V52,{95:329,91:[1,327],96:$V62}),o($V72,[2,107]),o($V72,[2,111],{66:[1,331],76:[1,330]}),o($V72,[2,115],{38:143,72:144,99:145,34:146,98:332,39:$V2,40:$V3,73:$Vl1,75:$Vm1,117:$Vq}),o($V82,[2,116]),o($V82,[2,117]),o($V82,[2,118]),o($V82,[2,119]),{41:233,42:$VO1},{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:$VH1,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:219,141:220,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vg1,[2,99]),o($VO,[2,101]),{4:336,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,35:[1,335],38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V92,$Va2,{160:118,163:119,167:123,193:$VV}),o($VO,[2,374]),{7:169,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vw1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{157:$VP,159:$VQ,160:125,163:126,165:$VR,167:123,183:$V51},o([1,6,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,193,194,195,196,197,198,199,200,201,202,203,204],$VA1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:194,14:$V0,32:$Vp1,33:$VB1,36:$VC1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V92,$Vb2,{160:118,163:119,167:123,193:$VV}),o($VO,[2,375]),o($Vc2,[2,379],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vj1,$Vk1,{97:140,98:141,38:143,72:144,99:145,34:146,90:338,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{33:$Vo1,37:149},{7:339,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:340,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{157:$VP,159:$VQ,160:125,163:126,165:$VR,167:123,183:[1,341]},{18:200,89:$Vr1,92:161,93:$Vm,94:$Vn},{7:342,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vc2,[2,380],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vc2,[2,381],{160:118,163:119,167:123,193:$VV,195:$VX}),o($V92,[2,382],{160:118,163:119,167:123,193:$VV}),{34:343,117:$Vq},o($VO,[2,97],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:344,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$VD1,159:$VD1,165:$VD1,183:$VD1,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V61,[2,384],{46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1}),o($V12,$V71,{83:127,86:128,113:134,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1}),{86:137,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,113:134,115:$Vd1},o($Vd2,$Vh1),o($V61,[2,385],{46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1}),o($V61,[2,386]),o($V61,[2,387]),{6:[1,347],7:345,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,346],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$Vo1,37:348,182:[1,349]},o($V61,[2,268],{150:350,151:[1,351],152:[1,352]}),o($V61,[2,289]),o($V61,[2,290]),o($V61,[2,298]),o($V61,[2,299]),{33:[1,353],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[1,354]},{177:355,179:356,180:$Ve2},o($V61,[2,162]),{7:358,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz1,[2,165],{37:359,33:$Vo1,46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1,121:[1,360]}),o($Vf2,[2,275],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:361,117:$Vq},o($Vf2,[2,32],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:362,117:$Vq},{7:363,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,35,52,74,76,96,137,144,155,158,166],[2,95],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:364,14:$V0,32:$Vp1,33:$VE1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$VD1,159:$VD1,165:$VD1,183:$VD1,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{33:$Vo1,37:365,182:[1,366]},o($VO,[2,376]),o($Vg1,[2,405]),o($Vf1,$Vg2,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:367,117:$Vq},o($Vf1,[2,169],{123:[1,368]}),{36:[1,369],96:[1,370]},{36:[1,371]},{33:$Vh2,38:376,39:$V2,40:$V3,119:[1,372],126:373,127:374,129:$Vi2},o([36,96],[2,192]),{128:[1,378]},{33:$Vj2,38:383,39:$V2,40:$V3,119:[1,379],129:$Vk2,132:380,134:381},o($Vf1,[2,196]),{66:[1,385]},{7:386,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,387],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{36:[1,388]},{6:$VM,155:[1,389]},{4:390,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vl2,$Vm2,{160:118,163:119,167:123,143:391,76:[1,392],144:$V32,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vl2,$Vn2,{143:393,76:$V22,144:$V32}),o($Vo2,[2,229]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:[1,394],75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:396,147:395,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([6,33,74],$V52,{142:397,95:399,96:$Vp2}),o($Vq2,[2,260],{6:$Vr2}),o($Vs2,[2,251]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,141:401,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vt2,[2,262]),o($Vs2,[2,256]),o($Vu2,[2,249]),o($Vu2,[2,250],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:403,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{84:404,136:$VM1},{41:405,42:$VO1},{7:406,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,407],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vv2,[2,221]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,137:[1,408],138:409,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vx2,[2,228]),o($Vx2,[2,39]),{41:412,42:$VO1},{41:413,42:$VO1},{33:$Vo1,37:414,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:$Vo1,37:415},o($Vy2,[2,283],{160:118,163:119,167:123,157:$VP,158:[1,416],159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:[2,279],158:[1,417]},o($Vy2,[2,286],{160:118,163:119,167:123,157:$VP,158:[1,418],159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:[2,281],158:[1,419]},o($V61,[2,294]),o($Vz2,[2,295],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$VA2,166:[1,420]},o($VB2,[2,305]),{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,170:421,172:249},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,170:422,172:249},o($VB2,[2,312],{96:[1,423]}),o($VC2,[2,308]),o($VC2,[2,309]),o($VC2,[2,310]),o($VC2,[2,311]),o($V61,[2,302]),{33:[2,304]},{7:424,8:425,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:426,8:427,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:428,8:429,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VD2,$V52,{95:430,96:$VE2}),o($VF2,[2,157]),o($VF2,[2,63],{70:[1,432]}),o($VF2,[2,64]),o($VG2,[2,72],{113:134,83:435,86:436,66:[1,433],76:[1,434],105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),{7:437,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([76,105,106,110,111,112,115,135,136],$VN1,{41:233,42:$VO1,73:[1,438]}),o($VG2,[2,75]),{34:273,38:269,39:$V2,40:$V3,41:270,42:$VO1,71:439,72:271,75:$Vg,77:440,78:272,79:274,80:275,81:276,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx},{76:[1,441],83:442,86:443,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,113:134,115:$Vd1,135:$Ve1,136:$V71},o($VH2,[2,69]),o($VH2,[2,70]),o($VH2,[2,71]),o($VI2,[2,80]),o($VI2,[2,81]),o($VI2,[2,82]),o($VI2,[2,83]),o($VI2,[2,84]),{83:444,105:$VK1,106:$VL1,135:$Ve1,136:$V71},{84:445,136:$VM1},o($Vd2,$Vi1,{57:[1,446]}),o($Vd2,$Vy1),{45:284,46:$V5,47:$V6,49:[1,447],50:448,51:$V02},o($VJ2,[2,44]),{4:449,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:[1,450],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,52:[1,451],53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VJ2,[2,49]),o($VN,[2,4]),o($VK2,[2,389],{160:118,163:119,167:123,193:$VV,194:$VW,195:$VX}),o($VK2,[2,390],{160:118,163:119,167:123,193:$VV,194:$VW,195:$VX}),o($Vc2,[2,391],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vc2,[2,392],{160:118,163:119,167:123,193:$VV,195:$VX}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,196,197,198,199,200,201,202,203,204],[2,393],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,197,198,199,200,201,202,203],[2,394],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,198,199,200,201,202,203],[2,395],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,199,200,201,202,203],[2,396],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,200,201,202,203],[2,397],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,201,202,203],[2,398],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,202,203],[2,399],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,203],[2,400],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,197,198,199,200,201,202,203,204],[2,401],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY}),o($Vz2,$VL2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,373]),{158:[1,452]},{158:[1,453]},o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VA2,{166:[1,454]}),{7:455,8:456,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:457,8:458,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:459,8:460,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz2,$VM2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,372]),o($Vv2,[2,218]),o($Vv2,[2,219]),o($VQ1,[2,143]),o($VQ1,[2,144]),o($VQ1,[2,145]),o($VQ1,[2,146]),{107:[1,461]},{7:317,8:319,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$V22,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,114:462,116:318,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,143:320,144:$V32,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VN2,[2,153],{160:118,163:119,167:123,143:463,76:$V22,144:$V32,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VN2,[2,154]),{76:$V22,143:464,144:$V32},o($VN2,[2,241],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:465,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VO2,[2,232]),o($VO2,$VP2),o($VQ1,[2,152]),o($Vf2,[2,60],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:466,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:467,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{92:468,93:$Vm,94:$Vn},o($VQ2,$VR2,{98:141,38:143,72:144,99:145,34:146,97:469,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{6:$VS2,33:$VT2},o($V72,[2,112]),{7:472,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,113]),o($Vu2,$Vm2,{160:118,163:119,167:123,76:[1,473],157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vu2,$Vn2),o($VU2,[2,35]),{6:$VM,35:[1,474]},{7:475,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V42,$V52,{95:329,91:[1,476],96:$V62}),o($V92,$Va2,{160:118,163:119,167:123,193:$VV}),o($V92,$Vb2,{160:118,163:119,167:123,193:$VV}),{7:477,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$Vo1,37:414,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{35:[1,478]},o($VO,[2,96],{160:118,163:119,167:123,157:$Vg2,159:$Vg2,165:$Vg2,183:$Vg2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,[2,402],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:479,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:480,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,365]),{7:481,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,269],{151:[1,482]}),{33:$Vo1,37:483},{33:$Vo1,34:485,37:486,38:484,39:$V2,40:$V3,117:$Vq},{177:487,179:356,180:$Ve2},{177:488,179:356,180:$Ve2},{35:[1,489],178:[1,490],179:491,180:$Ve2},o($VW2,[2,358]),{7:493,8:494,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,148:492,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VX2,[2,163],{160:118,163:119,167:123,37:495,33:$Vo1,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,166]),{7:496,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,497]},{35:[1,498]},o($Vf2,[2,34],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,94],{160:118,163:119,167:123,157:$Vg2,159:$Vg2,165:$Vg2,183:$Vg2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,371]),{7:500,8:499,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,501]},{34:502,117:$Vq},{45:503,46:$V5,47:$V6},{117:[1,505],125:504,130:$VF1},{45:506,46:$V5,47:$V6},{36:[1,507]},o($VD2,$V52,{95:508,96:$VY2}),o($VF2,[2,183]),{33:$Vh2,38:376,39:$V2,40:$V3,126:510,127:374,129:$Vi2},o($VF2,[2,188],{128:[1,511]}),o($VF2,[2,190],{128:[1,512]}),{38:513,39:$V2,40:$V3},o($Vf1,[2,194],{36:[1,514]}),o($VD2,$V52,{95:515,96:$VZ2}),o($VF2,[2,208]),{33:$Vj2,38:383,39:$V2,40:$V3,129:$Vk2,132:517,134:381},o($VF2,[2,213],{128:[1,518]}),o($VF2,[2,216],{128:[1,519]}),{6:[1,521],7:520,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,522],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V_2,[2,200],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:523,117:$Vq},{45:524,46:$V5,47:$V6},o($Vg1,[2,277]),{6:$VM,35:[1,525]},{7:526,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([14,32,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VP2,{6:$V$2,33:$V$2,74:$V$2,96:$V$2}),{7:527,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vo2,[2,230]),o($Vq2,[2,261],{6:$Vr2}),o($Vs2,[2,257]),{33:$V03,74:[1,528]},o([6,33,35,74],$VR2,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,147:221,145:225,100:226,7:333,8:334,146:530,140:531,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,96:$VJ1,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V13,[2,258],{6:[1,532]}),o($Vt2,[2,263]),o($VQ2,$V52,{95:399,142:533,96:$Vp2}),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:396,147:395,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vu2,[2,121],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vv2,[2,220]),o($Vg1,[2,138]),{107:[1,534],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{7:535,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vv2,[2,224]),o([6,33,137],$V52,{95:536,96:$V23}),o($V33,[2,242]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,138:538,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vg1,[2,141]),o($Vg1,[2,142]),o($V43,[2,362]),o($V53,[2,368]),{7:539,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:540,8:541,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:542,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:543,8:544,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:545,8:546,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VB2,[2,306]),o($VB2,[2,307]),{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,172:547},{33:$V63,157:$VP,158:[1,548],159:$VQ,160:118,163:119,165:$VR,166:[1,549],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,333],158:[1,550],166:[1,551]},{33:$V73,157:$VP,158:[1,552],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,334],158:[1,553]},{33:$V83,157:$VP,158:[1,554],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,349],158:[1,555]},{6:$V93,33:$Va3,119:[1,556]},o($Vb3,$VR2,{45:95,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,67:559,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),{7:560,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,561],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:562,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,563],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,76]),{84:564,136:$VM1},o($VI2,[2,89]),{74:[1,565],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{7:566,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,77],{113:134,83:435,86:436,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),o($VF2,[2,79],{113:134,83:442,86:443,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),o($VF2,[2,78]),{84:567,136:$VM1},o($VI2,[2,90]),{84:568,136:$VM1},o($VI2,[2,86]),o($Vg1,[2,51]),o($V$1,[2,43]),o($VJ2,[2,45]),{6:$VM,52:[1,569]},{4:570,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VJ2,[2,48]),{7:571,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:572,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:573,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,159,165,183],$V63,{160:118,163:119,167:123,158:[1,574],166:[1,575],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,576],166:[1,577]},o($Vc3,$V73,{160:118,163:119,167:123,158:[1,578],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,579]},o($Vc3,$V83,{160:118,163:119,167:123,158:[1,580],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,581]},o($VQ1,[2,150]),{35:[1,582]},o($VN2,[2,237],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:583,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VN2,[2,239],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:584,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VN2,[2,240],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,[2,61],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{35:[1,585],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{5:587,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:$Vo1,34:66,37:586,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,108]),{34:146,38:143,39:$V2,40:$V3,72:144,73:$Vl1,75:$Vm1,76:$Vn1,97:588,98:141,99:145,117:$Vq},o($Vd3,$Vk1,{97:140,98:141,38:143,72:144,99:145,34:146,90:589,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),o($V72,[2,114],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vu2,$V$2),o($VU2,[2,36]),o($Vz2,$VL2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{92:590,93:$Vm,94:$Vn},o($Vz2,$VM2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,383]),{35:[1,591],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf2,[2,404],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vo1,37:592,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:$Vo1,37:593},o($V61,[2,270]),{33:$Vo1,37:594},{33:$Vo1,37:595},o($Ve3,[2,274]),{35:[1,596],178:[1,597],179:491,180:$Ve2},{35:[1,598],178:[1,599],179:491,180:$Ve2},o($V61,[2,356]),{33:$Vo1,37:600},o($VW2,[2,359]),{33:$Vo1,37:601,96:[1,602]},o($Vf3,[2,264],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf3,[2,265]),o($V61,[2,164]),o($VX2,[2,167],{160:118,163:119,167:123,37:603,33:$Vo1,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,276]),o($V61,[2,33]),{33:$Vo1,37:604},{157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf1,[2,92]),o($Vf1,[2,170]),o($Vf1,[2,171],{123:[1,605]}),{36:[1,606]},{33:$Vh2,38:376,39:$V2,40:$V3,126:607,127:374,129:$Vi2},o($Vf1,[2,173],{123:[1,608]}),{45:609,46:$V5,47:$V6},{6:$Vg3,33:$Vh3,119:[1,610]},o($Vb3,$VR2,{38:376,127:613,39:$V2,40:$V3,129:$Vi2}),o($VQ2,$V52,{95:614,96:$VY2}),{38:615,39:$V2,40:$V3},{38:616,39:$V2,40:$V3},{36:[2,193]},{45:617,46:$V5,47:$V6},{6:$Vi3,33:$Vj3,119:[1,618]},o($Vb3,$VR2,{38:383,134:621,39:$V2,40:$V3,129:$Vk2}),o($VQ2,$V52,{95:622,96:$VZ2}),{38:623,39:$V2,40:$V3,129:[1,624]},{38:625,39:$V2,40:$V3},o($V_2,[2,197],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:626,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:627,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,628]},o($Vf1,[2,202],{123:[1,629]}),{155:[1,630]},{74:[1,631],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{74:[1,632],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vo2,[2,231]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,141:633,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vs2,[2,252]),o($V13,[2,259],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,100:226,7:333,8:334,147:395,145:396,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,96:$VJ1,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,145:225,146:634,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$V03,35:[1,635]},o($Vg1,[2,139]),{35:[1,636],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{6:$Vk3,33:$Vl3,137:[1,637]},o([6,33,35,137],$VR2,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,100:226,7:333,8:334,145:640,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VQ2,$V52,{95:641,96:$V23}),o($Vz2,[2,284],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vm3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,280]},o($Vz2,[2,287],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vn3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,282]},{33:$Vo3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,303]},o($VB2,[2,313]),{7:642,8:643,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:644,8:645,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:646,8:647,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:648,8:649,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:650,8:651,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:652,8:653,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:654,8:655,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:656,8:657,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vo2,[2,155]),{34:273,38:269,39:$V2,40:$V3,41:270,42:$VO1,43:266,44:$V4,45:95,46:$V5,47:$V6,67:658,68:261,69:262,71:263,72:271,73:$VU1,75:$VV1,76:$VW1,77:268,78:272,79:274,80:275,81:276,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx},o($Vd3,$VT1,{45:95,67:260,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,118:659,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),o($VF2,[2,158]),o($VF2,[2,65],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:660,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,67],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:661,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VI2,[2,87]),o($VG2,[2,73]),{74:[1,662],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($VI2,[2,88]),o($VI2,[2,85]),o($VJ2,[2,46]),{6:$VM,35:[1,663]},o($Vz2,$Vm3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vz2,$Vn3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vz2,$Vo3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:664,8:665,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:666,8:667,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:668,8:669,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:670,8:671,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:672,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:673,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:674,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:675,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{107:[1,676]},o($VN2,[2,236],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VN2,[2,238],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,62]),o($Vg1,[2,98]),o($VO,[2,100]),o($V72,[2,109]),o($VQ2,$V52,{95:677,96:$V62}),{33:$Vo1,37:586},o($V61,[2,403]),o($V43,[2,363]),o($V61,[2,271]),o($Ve3,[2,272]),o($Ve3,[2,273]),o($V61,[2,352]),{33:$Vo1,37:678},o($V61,[2,353]),{33:$Vo1,37:679},{35:[1,680]},o($VW2,[2,360],{6:[1,681]}),{7:682,8:683,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,168]),o($V53,[2,369]),{34:684,117:$Vq},{45:685,46:$V5,47:$V6},o($VD2,$V52,{95:686,96:$VY2}),{34:687,117:$Vq},o($Vf1,[2,175],{123:[1,688]}),{36:[1,689]},{38:376,39:$V2,40:$V3,127:690,129:$Vi2},{33:$Vh2,38:376,39:$V2,40:$V3,126:691,127:374,129:$Vi2},o($VF2,[2,184]),{6:$Vg3,33:$Vh3,35:[1,692]},o($VF2,[2,189]),o($VF2,[2,191]),o($Vf1,[2,204],{123:[1,693]}),o($Vf1,[2,195],{36:[1,694]}),{38:383,39:$V2,40:$V3,129:$Vk2,134:695},{33:$Vj2,38:383,39:$V2,40:$V3,129:$Vk2,132:696,134:381},o($VF2,[2,209]),{6:$Vi3,33:$Vj3,35:[1,697]},o($VF2,[2,214]),o($VF2,[2,215]),o($VF2,[2,217]),o($V_2,[2,198],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{35:[1,698],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf1,[2,201]),{34:699,117:$Vq},o($Vg1,[2,278]),o($Vg1,[2,234]),o($Vg1,[2,235]),o($VQ2,$V52,{95:399,142:700,96:$Vp2}),o($Vs2,[2,253]),o($Vs2,[2,254]),{107:[1,701]},o($Vv2,[2,225]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:702,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,138:703,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V33,[2,243]),{6:$Vk3,33:$Vl3,35:[1,704]},{33:$Vp3,157:$VP,159:$VQ,160:118,163:119,165:$VR,166:[1,705],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,335],166:[1,706]},{33:$Vq3,157:$VP,158:[1,707],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,339],158:[1,708]},{33:$Vr3,157:$VP,159:$VQ,160:118,163:119,165:$VR,166:[1,709],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,336],166:[1,710]},{33:$Vs3,157:$VP,158:[1,711],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,340],158:[1,712]},{33:$Vt3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,337]},{33:$Vu3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,338]},{33:$Vv3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,350]},{33:$Vw3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,351]},o($VF2,[2,159]),o($VQ2,$V52,{95:713,96:$VE2}),{35:[1,714],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{35:[1,715],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($VG2,[2,74]),{52:[1,716]},o($Vx3,$Vp3,{160:118,163:119,167:123,166:[1,717],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{166:[1,718]},o($Vc3,$Vq3,{160:118,163:119,167:123,158:[1,719],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,720]},o($Vx3,$Vr3,{160:118,163:119,167:123,166:[1,721],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{166:[1,722]},o($Vc3,$Vs3,{160:118,163:119,167:123,158:[1,723],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,724]},o($Vf2,$Vt3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vu3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vv3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vw3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VQ1,[2,151]),{6:$VS2,33:$VT2,35:[1,725]},{35:[1,726]},{35:[1,727]},o($V61,[2,357]),o($VW2,[2,361]),o($Vf3,[2,266],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf3,[2,267]),o($Vf1,[2,172]),o($Vf1,[2,179],{123:[1,728]}),{6:$Vg3,33:$Vh3,119:[1,729]},o($Vf1,[2,174]),{34:730,117:$Vq},{45:731,46:$V5,47:$V6},o($VF2,[2,185]),o($VQ2,$V52,{95:732,96:$VY2}),o($VF2,[2,186]),{34:733,117:$Vq},{45:734,46:$V5,47:$V6},o($VF2,[2,210]),o($VQ2,$V52,{95:735,96:$VZ2}),o($VF2,[2,211]),o($Vf1,[2,199]),o($Vf1,[2,203]),{33:$V03,35:[1,736]},o($Vg1,[2,140]),o($V33,[2,244]),o($VQ2,$V52,{95:737,96:$V23}),o($V33,[2,245]),{7:738,8:739,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:740,8:741,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:742,8:743,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:744,8:745,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:746,8:747,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:748,8:749,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:750,8:751,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:752,8:753,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{6:$V93,33:$Va3,35:[1,754]},o($VF2,[2,66]),o($VF2,[2,68]),o($VJ2,[2,47]),{7:755,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:756,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:757,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:758,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:759,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:760,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:761,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:762,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,110]),o($V61,[2,354]),o($V61,[2,355]),{34:763,117:$Vq},{36:[1,764]},o($Vf1,[2,176]),o($Vf1,[2,177],{123:[1,765]}),{6:$Vg3,33:$Vh3,35:[1,766]},o($Vf1,[2,205]),o($Vf1,[2,206],{123:[1,767]}),{6:$Vi3,33:$Vj3,35:[1,768]},o($Vs2,[2,255]),{6:$Vk3,33:$Vl3,35:[1,769]},{33:$Vy3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,341]},{33:$Vz3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,343]},{33:$VA3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,345]},{33:$VB3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,347]},{33:$VC3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,342]},{33:$VD3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,344]},{33:$VE3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,346]},{33:$VF3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,348]},o($VF2,[2,160]),o($Vf2,$Vy3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vz3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VA3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VB3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VC3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VD3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VE3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VF3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf1,[2,180]),{45:770,46:$V5,47:$V6},{34:771,117:$Vq},o($VF2,[2,187]),{34:772,117:$Vq},o($VF2,[2,212]),o($V33,[2,246]),o($Vf1,[2,181],{123:[1,773]}),o($Vf1,[2,178]),o($Vf1,[2,207]),{34:774,117:$Vq},o($Vf1,[2,182])],\ndefaultActions: {255:[2,304],513:[2,193],541:[2,280],544:[2,282],546:[2,303],651:[2,337],653:[2,338],655:[2,350],657:[2,351],739:[2,341],741:[2,343],743:[2,345],745:[2,347],747:[2,342],749:[2,344],751:[2,346],753:[2,348]},\nparseError: function parseError (str, hash) {\n    if (hash.recoverable) {\n        this.trace(str);\n    } else {\n        var error = new Error(str);\n        error.hash = hash;\n        throw error;\n    }\n},\nparse: function parse(input) {\n    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n    var args = lstack.slice.call(arguments, 1);\n    var lexer = Object.create(this.lexer);\n    var sharedState = { yy: {} };\n    for (var k in this.yy) {\n        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n            sharedState.yy[k] = this.yy[k];\n        }\n    }\n    lexer.setInput(input, sharedState.yy);\n    sharedState.yy.lexer = lexer;\n    sharedState.yy.parser = this;\n    if (typeof lexer.yylloc == 'undefined') {\n        lexer.yylloc = {};\n    }\n    var yyloc = lexer.yylloc;\n    lstack.push(yyloc);\n    var ranges = lexer.options && lexer.options.ranges;\n    if (typeof sharedState.yy.parseError === 'function') {\n        this.parseError = sharedState.yy.parseError;\n    } else {\n        this.parseError = Object.getPrototypeOf(this).parseError;\n    }\n    function popStack(n) {\n        stack.length = stack.length - 2 * n;\n        vstack.length = vstack.length - n;\n        lstack.length = lstack.length - n;\n    }\n    _token_stack:\n        var lex = function () {\n            var token;\n            token = lexer.lex() || EOF;\n            if (typeof token !== 'number') {\n                token = self.symbols_[token] || token;\n            }\n            return token;\n        };\n    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n    while (true) {\n        state = stack[stack.length - 1];\n        if (this.defaultActions[state]) {\n            action = this.defaultActions[state];\n        } else {\n            if (symbol === null || typeof symbol == 'undefined') {\n                symbol = lex();\n            }\n            action = table[state] && table[state][symbol];\n        }\n                    if (typeof action === 'undefined' || !action.length || !action[0]) {\n                var errStr = '';\n                expected = [];\n                for (p in table[state]) {\n                    if (this.terminals_[p] && p > TERROR) {\n                        expected.push('\\'' + this.terminals_[p] + '\\'');\n                    }\n                }\n                if (lexer.showPosition) {\n                    errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n                } else {\n                    errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n                }\n                this.parseError(errStr, {\n                    text: lexer.match,\n                    token: this.terminals_[symbol] || symbol,\n                    line: lexer.yylineno,\n                    loc: yyloc,\n                    expected: expected\n                });\n            }\n        if (action[0] instanceof Array && action.length > 1) {\n            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n        }\n        switch (action[0]) {\n        case 1:\n            stack.push(symbol);\n            vstack.push(lexer.yytext);\n            lstack.push(lexer.yylloc);\n            stack.push(action[1]);\n            symbol = null;\n            if (!preErrorSymbol) {\n                yyleng = lexer.yyleng;\n                yytext = lexer.yytext;\n                yylineno = lexer.yylineno;\n                yyloc = lexer.yylloc;\n                if (recovering > 0) {\n                    recovering--;\n                }\n            } else {\n                symbol = preErrorSymbol;\n                preErrorSymbol = null;\n            }\n            break;\n        case 2:\n            len = this.productions_[action[1]][1];\n            yyval.$ = vstack[vstack.length - len];\n            yyval._$ = {\n                first_line: lstack[lstack.length - (len || 1)].first_line,\n                last_line: lstack[lstack.length - 1].last_line,\n                first_column: lstack[lstack.length - (len || 1)].first_column,\n                last_column: lstack[lstack.length - 1].last_column\n            };\n            if (ranges) {\n                yyval._$.range = [\n                    lstack[lstack.length - (len || 1)].range[0],\n                    lstack[lstack.length - 1].range[1]\n                ];\n            }\n            r = this.performAction.apply(yyval, [\n                yytext,\n                yyleng,\n                yylineno,\n                sharedState.yy,\n                action[1],\n                vstack,\n                lstack\n            ].concat(args));\n            if (typeof r !== 'undefined') {\n                return r;\n            }\n            if (len) {\n                stack = stack.slice(0, -1 * len * 2);\n                vstack = vstack.slice(0, -1 * len);\n                lstack = lstack.slice(0, -1 * len);\n            }\n            stack.push(this.productions_[action[1]][0]);\n            vstack.push(yyval.$);\n            lstack.push(yyval._$);\n            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n            stack.push(newState);\n            break;\n        case 3:\n            return true;\n        }\n    }\n    return true;\n}};\n\nfunction Parser () {\n  this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = parser;\nexports.Parser = parser.Parser;\nexports.parse = function () { return parser.parse.apply(parser, arguments); };\nexports.main = function() {};\nif (typeof module !== 'undefined' && require.main === module) {\n  exports.main(process.argv.slice(1));\n}\n}"
  },
  {
    "path": "lib/coffeescript/register.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  var CoffeeScript, Module, binary, cacheSourceMaps, child_process, ext, findExtension, fork, getRootModule, helpers, i, len, loadFile, nodeSourceMapsSupportEnabled, patchStackTrace, path, ref, ref1;\n\n  CoffeeScript = require('./');\n\n  child_process = require('child_process');\n\n  helpers = require('./helpers');\n\n  path = require('path');\n\n  ({patchStackTrace} = CoffeeScript);\n\n  // Check if Node's built-in source map stack trace transformations are enabled.\n  nodeSourceMapsSupportEnabled = (typeof process !== \"undefined\" && process !== null) && (process.execArgv.includes('--enable-source-maps') || ((ref = process.env.NODE_OPTIONS) != null ? ref.includes('--enable-source-maps') : void 0));\n\n  if (!(Error.prepareStackTrace || nodeSourceMapsSupportEnabled)) {\n    cacheSourceMaps = true;\n    patchStackTrace();\n  }\n\n  // Load and run a CoffeeScript file for Node, stripping any `BOM`s.\n  loadFile = function(module, filename) {\n    var js, options;\n    options = module.options || getRootModule(module).options || {};\n    // Currently `CoffeeScript.compile` caches all source maps if present. They\n    // are available in `getSourceMap` retrieved by `filename`.\n    if (cacheSourceMaps || nodeSourceMapsSupportEnabled) {\n      options.inlineMap = true;\n    }\n    js = CoffeeScript._compileFile(filename, options);\n    return module._compile(js, filename);\n  };\n\n  // If the installed version of Node supports `require.extensions`, register\n  // CoffeeScript as an extension.\n  if (require.extensions) {\n    ref1 = CoffeeScript.FILE_EXTENSIONS;\n    for (i = 0, len = ref1.length; i < len; i++) {\n      ext = ref1[i];\n      require.extensions[ext] = loadFile;\n    }\n    // Patch Node's module loader to be able to handle multi-dot extensions.\n    // This is a horrible thing that should not be required.\n    Module = require('module');\n    findExtension = function(filename) {\n      var curExtension, extensions;\n      extensions = path.basename(filename).split('.');\n      if (extensions[0] === '') {\n        // Remove the initial dot from dotfiles.\n        extensions.shift();\n      }\n      // Start with the longest possible extension and work our way shortwards.\n      while (extensions.shift()) {\n        curExtension = '.' + extensions.join('.');\n        if (Module._extensions[curExtension]) {\n          return curExtension;\n        }\n      }\n      return '.js';\n    };\n    Module.prototype.load = function(filename) {\n      var extension;\n      this.filename = filename;\n      this.paths = Module._nodeModulePaths(path.dirname(filename));\n      extension = findExtension(filename);\n      Module._extensions[extension](this, filename);\n      return this.loaded = true;\n    };\n  }\n\n  // If we're on Node, patch `child_process.fork` so that Coffee scripts are able\n  // to fork both CoffeeScript files, and JavaScript files, directly.\n  if (child_process) {\n    ({fork} = child_process);\n    binary = require.resolve('../../bin/coffee');\n    child_process.fork = function(path, args, options) {\n      if (helpers.isCoffee(path)) {\n        if (!Array.isArray(args)) {\n          options = args || {};\n          args = [];\n        }\n        args = [path].concat(args);\n        path = binary;\n      }\n      return fork(path, args, options);\n    };\n  }\n\n  // Utility function to find the `options` object attached to the topmost module.\n  getRootModule = function(module) {\n    if (module.parent) {\n      return getRootModule(module.parent);\n    } else {\n      return module;\n    }\n  };\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/repl.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  var CoffeeScript, addHistory, addMultilineHandler, fs, getCommandId, merge, nodeREPL, path, replDefaults, runInContext, sawSIGINT, transpile, updateSyntaxError, vm;\n\n  fs = require('fs');\n\n  path = require('path');\n\n  vm = require('vm');\n\n  nodeREPL = require('repl');\n\n  CoffeeScript = require('./');\n\n  ({merge, updateSyntaxError} = require('./helpers'));\n\n  sawSIGINT = false;\n\n  transpile = false;\n\n  replDefaults = {\n    prompt: 'coffee> ',\n    historyFile: (function() {\n      var historyPath;\n      historyPath = process.env.XDG_CACHE_HOME || process.env.HOME;\n      if (historyPath) {\n        return path.join(historyPath, '.coffee_history');\n      }\n    })(),\n    historyMaxInputSize: 10240,\n    eval: function(input, context, filename, cb) {\n      var Assign, Block, Call, Code, Literal, Root, Value, ast, err, isAsync, js, ref, ref1, referencedVars, result, token, tokens;\n      // XXX: multiline hack.\n      input = input.replace(/\\uFF00/g, '\\n');\n      // Node's REPL sends the input ending with a newline and then wrapped in\n      // parens. Unwrap all that.\n      input = input.replace(/^\\(([\\s\\S]*)\\n\\)$/m, '$1');\n      // Node's REPL v6.9.1+ sends the input wrapped in a try/catch statement.\n      // Unwrap that too.\n      input = input.replace(/^\\s*try\\s*{([\\s\\S]*)}\\s*catch.*$/m, '$1');\n      // Require AST nodes to do some AST manipulation.\n      ({Block, Assign, Value, Literal, Call, Code, Root} = require('./nodes'));\n      try {\n        // Tokenize the clean input.\n        tokens = CoffeeScript.tokens(input);\n        // Filter out tokens generated just to hold comments.\n        if (tokens.length >= 2 && tokens[0].generated && ((ref = tokens[0].comments) != null ? ref.length : void 0) !== 0 && `${tokens[0][1]}` === '' && tokens[1][0] === 'TERMINATOR') {\n          tokens = tokens.slice(2);\n        }\n        if (tokens.length >= 1 && tokens[tokens.length - 1].generated && ((ref1 = tokens[tokens.length - 1].comments) != null ? ref1.length : void 0) !== 0 && `${tokens[tokens.length - 1][1]}` === '') {\n          tokens.pop();\n        }\n        // Collect referenced variable names just like in `CoffeeScript.compile`.\n        referencedVars = (function() {\n          var i, len, results;\n          results = [];\n          for (i = 0, len = tokens.length; i < len; i++) {\n            token = tokens[i];\n            if (token[0] === 'IDENTIFIER') {\n              results.push(token[1]);\n            }\n          }\n          return results;\n        })();\n        // Generate the AST of the tokens.\n        ast = CoffeeScript.nodes(tokens).body;\n        // Add assignment to `__` variable to force the input to be an expression.\n        ast = new Block([new Assign(new Value(new Literal('__')), ast, '=')]);\n        // Wrap the expression in a closure to support top-level `await`.\n        ast = new Code([], ast);\n        isAsync = ast.isAsync;\n        // Invoke the wrapping closure.\n        ast = new Root(new Block([new Call(ast)]));\n        js = ast.compile({\n          bare: true,\n          locals: Object.keys(context),\n          referencedVars,\n          sharedScope: true\n        });\n        if (transpile) {\n          js = transpile.transpile(js, transpile.options).code;\n          // Strip `\"use strict\"`, to avoid an exception on assigning to\n          // undeclared variable `__`.\n          js = js.replace(/^\"use strict\"|^'use strict'/, '');\n        }\n        result = runInContext(js, context, filename);\n        // Await an async result, if necessary.\n        if (isAsync) {\n          result.then(function(resolvedResult) {\n            if (!sawSIGINT) {\n              return cb(null, resolvedResult);\n            }\n          });\n          return sawSIGINT = false;\n        } else {\n          return cb(null, result);\n        }\n      } catch (error) {\n        err = error;\n        // AST's `compile` does not add source code information to syntax errors.\n        updateSyntaxError(err, input);\n        return cb(err);\n      }\n    }\n  };\n\n  runInContext = function(js, context, filename) {\n    if (context === global) {\n      return vm.runInThisContext(js, filename);\n    } else {\n      return vm.runInContext(js, context, filename);\n    }\n  };\n\n  addMultilineHandler = function(repl) {\n    var inputStream, multiline, nodeLineListener, origPrompt, outputStream, ref;\n    ({inputStream, outputStream} = repl);\n    // Node 0.11.12 changed API, prompt is now _prompt.\n    origPrompt = (ref = repl._prompt) != null ? ref : repl.prompt;\n    multiline = {\n      enabled: false,\n      initialPrompt: origPrompt.replace(/^[^> ]*/, function(x) {\n        return x.replace(/./g, '-');\n      }),\n      prompt: origPrompt.replace(/^[^> ]*>?/, function(x) {\n        return x.replace(/./g, '.');\n      }),\n      buffer: ''\n    };\n    // Proxy node's line listener\n    nodeLineListener = repl.listeners('line')[0];\n    repl.removeListener('line', nodeLineListener);\n    repl.on('line', function(cmd) {\n      if (multiline.enabled) {\n        multiline.buffer += `${cmd}\\n`;\n        repl.setPrompt(multiline.prompt);\n        repl.prompt(true);\n      } else {\n        repl.setPrompt(origPrompt);\n        nodeLineListener(cmd);\n      }\n    });\n    // Handle Ctrl-v\n    return inputStream.on('keypress', function(char, key) {\n      if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'v')) {\n        return;\n      }\n      if (multiline.enabled) {\n        // allow arbitrarily switching between modes any time before multiple lines are entered\n        if (!multiline.buffer.match(/\\n/)) {\n          multiline.enabled = !multiline.enabled;\n          repl.setPrompt(origPrompt);\n          repl.prompt(true);\n          return;\n        }\n        // no-op unless the current line is empty\n        if ((repl.line != null) && !repl.line.match(/^\\s*$/)) {\n          return;\n        }\n        // eval, print, loop\n        multiline.enabled = !multiline.enabled;\n        repl.line = '';\n        repl.cursor = 0;\n        repl.output.cursorTo(0);\n        repl.output.clearLine(1);\n        // XXX: multiline hack\n        multiline.buffer = multiline.buffer.replace(/\\n/g, '\\uFF00');\n        repl.emit('line', multiline.buffer);\n        multiline.buffer = '';\n      } else {\n        multiline.enabled = !multiline.enabled;\n        repl.setPrompt(multiline.initialPrompt);\n        repl.prompt(true);\n      }\n    });\n  };\n\n  // Store and load command history from a file\n  addHistory = function(repl, filename, maxSize) {\n    var buffer, fd, lastLine, readFd, size, stat;\n    lastLine = null;\n    try {\n      // Get file info and at most maxSize of command history\n      stat = fs.statSync(filename);\n      size = Math.min(maxSize, stat.size);\n      // Read last `size` bytes from the file\n      readFd = fs.openSync(filename, 'r');\n      buffer = Buffer.alloc(size);\n      fs.readSync(readFd, buffer, 0, size, stat.size - size);\n      fs.closeSync(readFd);\n      // Set the history on the interpreter\n      repl.history = buffer.toString().split('\\n').reverse();\n      if (stat.size > maxSize) {\n        // If the history file was truncated we should pop off a potential partial line\n        repl.history.pop();\n      }\n      if (repl.history[0] === '') {\n        // Shift off the final blank newline\n        repl.history.shift();\n      }\n      repl.historyIndex = -1;\n      lastLine = repl.history[0];\n    } catch (error) {}\n    fd = fs.openSync(filename, 'a');\n    repl.addListener('line', function(code) {\n      if (code && code.length && code !== '.history' && code !== '.exit' && lastLine !== code) {\n        // Save the latest command in the file\n        fs.writeSync(fd, `${code}\\n`);\n        return lastLine = code;\n      }\n    });\n    // XXX: The SIGINT event from REPLServer is undocumented, so this is a bit fragile\n    repl.on('SIGINT', function() {\n      return sawSIGINT = true;\n    });\n    repl.on('exit', function() {\n      return fs.closeSync(fd);\n    });\n    // Add a command to show the history stack\n    return repl.commands[getCommandId(repl, 'history')] = {\n      help: 'Show command history',\n      action: function() {\n        repl.outputStream.write(`${repl.history.slice(0).reverse().join('\\n')}\\n`);\n        return repl.displayPrompt();\n      }\n    };\n  };\n\n  getCommandId = function(repl, commandName) {\n    var commandsHaveLeadingDot;\n    // Node 0.11 changed API, a command such as '.help' is now stored as 'help'\n    commandsHaveLeadingDot = repl.commands['.help'] != null;\n    if (commandsHaveLeadingDot) {\n      return `.${commandName}`;\n    } else {\n      return commandName;\n    }\n  };\n\n  module.exports = {\n    start: function(opts = {}) {\n      var Module, build, major, minor, originalModuleLoad, repl;\n      [major, minor, build] = process.versions.node.split('.').map(function(n) {\n        return parseInt(n, 10);\n      });\n      if (major < 6) {\n        console.warn(\"Node 6+ required for CoffeeScript REPL\");\n        process.exit(1);\n      }\n      CoffeeScript.register();\n      process.argv = ['coffee'].concat(process.argv.slice(2));\n      if (opts.transpile) {\n        transpile = {};\n        try {\n          transpile.transpile = require('@babel/core').transform;\n        } catch (error) {\n          try {\n            transpile.transpile = require('babel-core').transform;\n          } catch (error) {\n            console.error(`To use --transpile with an interactive REPL, @babel/core must be installed either in the current folder or globally:\n  npm install --save-dev @babel/core\nor\n  npm install --global @babel/core\nAnd you must save options to configure Babel in one of the places it looks to find its options.\nSee https://coffeescript.org/#transpilation`);\n            process.exit(1);\n          }\n        }\n        transpile.options = {\n          filename: path.resolve(process.cwd(), '<repl>')\n        };\n        // Since the REPL compilation path is unique (in `eval` above), we need\n        // another way to get the `options` object attached to a module so that\n        // it knows later on whether it needs to be transpiled. In the case of\n        // the REPL, the only applicable option is `transpile`.\n        Module = require('module');\n        originalModuleLoad = Module.prototype.load;\n        Module.prototype.load = function(filename) {\n          this.options = {\n            transpile: transpile.options\n          };\n          return originalModuleLoad.call(this, filename);\n        };\n      }\n      opts = merge(replDefaults, opts);\n      repl = nodeREPL.start(opts);\n      if (opts.prelude) {\n        runInContext(opts.prelude, repl.context, 'prelude');\n      }\n      repl.on('exit', function() {\n        if (!repl.closed) {\n          return repl.outputStream.write('\\n');\n        }\n      });\n      addMultilineHandler(repl);\n      if (opts.historyFile) {\n        addHistory(repl, opts.historyFile, opts.historyMaxInputSize);\n      }\n      // Adapt help inherited from the node REPL\n      repl.commands[getCommandId(repl, 'load')].help = 'Load code from a file into this REPL session';\n      return repl;\n    }\n  };\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/rewriter.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  // The CoffeeScript language has a good deal of optional syntax, implicit syntax,\n  // and shorthand syntax. This can greatly complicate a grammar and bloat\n  // the resulting parse table. Instead of making the parser handle it all, we take\n  // a series of passes over the token stream, using this **Rewriter** to convert\n  // shorthand into the unambiguous long form, add implicit indentation and\n  // parentheses, and generally clean things up.\n  var BALANCED_PAIRS, CALL_CLOSERS, CONTROL_IN_IMPLICIT, DISCARDED, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, Rewriter, SINGLE_CLOSERS, SINGLE_LINERS, UNFINISHED, extractAllCommentTokens, generate, k, left, len, moveComments, right, throwSyntaxError,\n    indexOf = [].indexOf,\n    hasProp = {}.hasOwnProperty;\n\n  ({throwSyntaxError, extractAllCommentTokens} = require('./helpers'));\n\n  // Move attached comments from one token to another.\n  moveComments = function(fromToken, toToken) {\n    var comment, k, len, ref, unshiftedComments;\n    if (!fromToken.comments) {\n      return;\n    }\n    if (toToken.comments && toToken.comments.length !== 0) {\n      unshiftedComments = [];\n      ref = fromToken.comments;\n      for (k = 0, len = ref.length; k < len; k++) {\n        comment = ref[k];\n        if (comment.unshift) {\n          unshiftedComments.push(comment);\n        } else {\n          toToken.comments.push(comment);\n        }\n      }\n      toToken.comments = unshiftedComments.concat(toToken.comments);\n    } else {\n      toToken.comments = fromToken.comments;\n    }\n    return delete fromToken.comments;\n  };\n\n  // Create a generated token: one that exists due to a use of implicit syntax.\n  // Optionally have this new token take the attached comments from another token.\n  generate = function(tag, value, origin, commentsToken) {\n    var token;\n    token = [tag, value];\n    token.generated = true;\n    if (origin) {\n      token.origin = origin;\n    }\n    if (commentsToken) {\n      moveComments(commentsToken, token);\n    }\n    return token;\n  };\n\n  // The **Rewriter** class is used by the [Lexer](lexer.html), directly against\n  // its internal array of tokens.\n  exports.Rewriter = Rewriter = (function() {\n    class Rewriter {\n      // Rewrite the token stream in multiple passes, one logical filter at\n      // a time. This could certainly be changed into a single pass through the\n      // stream, with a big ol’ efficient switch, but it’s much nicer to work with\n      // like this. The order of these passes matters—indentation must be\n      // corrected before implicit parentheses can be wrapped around blocks of code.\n      rewrite(tokens1) {\n        var ref, ref1, t;\n        this.tokens = tokens1;\n        // Set environment variable `DEBUG_TOKEN_STREAM` to `true` to output token\n        // debugging info. Also set `DEBUG_REWRITTEN_TOKEN_STREAM` to `true` to\n        // output the token stream after it has been rewritten by this file.\n        if (typeof process !== \"undefined\" && process !== null ? (ref = process.env) != null ? ref.DEBUG_TOKEN_STREAM : void 0 : void 0) {\n          if (process.env.DEBUG_REWRITTEN_TOKEN_STREAM) {\n            console.log('Initial token stream:');\n          }\n          console.log(((function() {\n            var k, len, ref1, results;\n            ref1 = this.tokens;\n            results = [];\n            for (k = 0, len = ref1.length; k < len; k++) {\n              t = ref1[k];\n              results.push(t[0] + '/' + t[1] + (t.comments ? '*' : ''));\n            }\n            return results;\n          }).call(this)).join(' '));\n        }\n        this.removeLeadingNewlines();\n        this.closeOpenCalls();\n        this.closeOpenIndexes();\n        this.normalizeLines();\n        this.tagPostfixConditionals();\n        this.addImplicitBracesAndParens();\n        this.rescueStowawayComments();\n        this.addLocationDataToGeneratedTokens();\n        this.enforceValidJSXAttributes();\n        this.fixIndentationLocationData();\n        this.exposeTokenDataToGrammar();\n        if (typeof process !== \"undefined\" && process !== null ? (ref1 = process.env) != null ? ref1.DEBUG_REWRITTEN_TOKEN_STREAM : void 0 : void 0) {\n          if (process.env.DEBUG_TOKEN_STREAM) {\n            console.log('Rewritten token stream:');\n          }\n          console.log(((function() {\n            var k, len, ref2, results;\n            ref2 = this.tokens;\n            results = [];\n            for (k = 0, len = ref2.length; k < len; k++) {\n              t = ref2[k];\n              results.push(t[0] + '/' + t[1] + (t.comments ? '*' : ''));\n            }\n            return results;\n          }).call(this)).join(' '));\n        }\n        return this.tokens;\n      }\n\n      // Rewrite the token stream, looking one token ahead and behind.\n      // Allow the return value of the block to tell us how many tokens to move\n      // forwards (or backwards) in the stream, to make sure we don’t miss anything\n      // as tokens are inserted and removed, and the stream changes length under\n      // our feet.\n      scanTokens(block) {\n        var i, token, tokens;\n        ({tokens} = this);\n        i = 0;\n        while (token = tokens[i]) {\n          i += block.call(this, token, i, tokens);\n        }\n        return true;\n      }\n\n      detectEnd(i, condition, action, opts = {}) {\n        var levels, ref, ref1, token, tokens;\n        ({tokens} = this);\n        levels = 0;\n        while (token = tokens[i]) {\n          if (levels === 0 && condition.call(this, token, i)) {\n            return action.call(this, token, i);\n          }\n          if (ref = token[0], indexOf.call(EXPRESSION_START, ref) >= 0) {\n            levels += 1;\n          } else if (ref1 = token[0], indexOf.call(EXPRESSION_END, ref1) >= 0) {\n            levels -= 1;\n          }\n          if (levels < 0) {\n            if (opts.returnOnNegativeLevel) {\n              return;\n            }\n            return action.call(this, token, i);\n          }\n          i += 1;\n        }\n        return i - 1;\n      }\n\n      // Leading newlines would introduce an ambiguity in the grammar, so we\n      // dispatch them here.\n      removeLeadingNewlines() {\n        var i, k, l, leadingNewlineToken, len, len1, ref, ref1, tag;\n        ref = this.tokens;\n        for (i = k = 0, len = ref.length; k < len; i = ++k) {\n          [tag] = ref[i];\n          if (tag !== 'TERMINATOR') {\n            // Find the index of the first non-`TERMINATOR` token.\n            break;\n          }\n        }\n        if (i === 0) {\n          return;\n        }\n        ref1 = this.tokens.slice(0, i);\n        // If there are any comments attached to the tokens we’re about to discard,\n        // shift them forward to what will become the new first token.\n        for (l = 0, len1 = ref1.length; l < len1; l++) {\n          leadingNewlineToken = ref1[l];\n          moveComments(leadingNewlineToken, this.tokens[i]);\n        }\n        // Discard all the leading newline tokens.\n        return this.tokens.splice(0, i);\n      }\n\n      // The lexer has tagged the opening parenthesis of a method call. Match it with\n      // its paired close.\n      closeOpenCalls() {\n        var action, condition;\n        condition = function(token, i) {\n          var ref;\n          return (ref = token[0]) === ')' || ref === 'CALL_END';\n        };\n        action = function(token, i) {\n          return token[0] = 'CALL_END';\n        };\n        return this.scanTokens(function(token, i) {\n          if (token[0] === 'CALL_START') {\n            this.detectEnd(i + 1, condition, action);\n          }\n          return 1;\n        });\n      }\n\n      // The lexer has tagged the opening bracket of an indexing operation call.\n      // Match it with its paired close.\n      closeOpenIndexes() {\n        var action, condition, startToken;\n        startToken = null;\n        condition = function(token, i) {\n          var ref;\n          return (ref = token[0]) === ']' || ref === 'INDEX_END';\n        };\n        action = function(token, i) {\n          if (this.tokens.length >= i && this.tokens[i + 1][0] === ':') {\n            startToken[0] = '[';\n            return token[0] = ']';\n          } else {\n            return token[0] = 'INDEX_END';\n          }\n        };\n        return this.scanTokens(function(token, i) {\n          if (token[0] === 'INDEX_START') {\n            startToken = token;\n            this.detectEnd(i + 1, condition, action);\n          }\n          return 1;\n        });\n      }\n\n      // Match tags in token stream starting at `i` with `pattern`.\n      // `pattern` may consist of strings (equality), an array of strings (one of)\n      // or null (wildcard). Returns the index of the match or -1 if no match.\n      indexOfTag(i, ...pattern) {\n        var fuzz, j, k, ref, ref1;\n        fuzz = 0;\n        for (j = k = 0, ref = pattern.length; (0 <= ref ? k < ref : k > ref); j = 0 <= ref ? ++k : --k) {\n          if (pattern[j] == null) {\n            continue;\n          }\n          if (typeof pattern[j] === 'string') {\n            pattern[j] = [pattern[j]];\n          }\n          if (ref1 = this.tag(i + j + fuzz), indexOf.call(pattern[j], ref1) < 0) {\n            return -1;\n          }\n        }\n        return i + j + fuzz - 1;\n      }\n\n      // Returns `yes` if standing in front of something looking like\n      // `@<x>:`, `<x>:` or `<EXPRESSION_START><x>...<EXPRESSION_END>:`.\n      looksObjectish(j) {\n        var end, index;\n        if (this.indexOfTag(j, '@', null, ':') !== -1 || this.indexOfTag(j, null, ':') !== -1) {\n          return true;\n        }\n        index = this.indexOfTag(j, EXPRESSION_START);\n        if (index !== -1) {\n          end = null;\n          this.detectEnd(index + 1, (function(token) {\n            var ref;\n            return ref = token[0], indexOf.call(EXPRESSION_END, ref) >= 0;\n          }), (function(token, i) {\n            return end = i;\n          }));\n          if (this.tag(end + 1) === ':') {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      // Returns `yes` if current line of tokens contain an element of tags on same\n      // expression level. Stop searching at `LINEBREAKS` or explicit start of\n      // containing balanced expression.\n      findTagsBackwards(i, tags) {\n        var backStack, ref, ref1, ref2, ref3, ref4, ref5;\n        backStack = [];\n        while (i >= 0 && (backStack.length || (ref2 = this.tag(i), indexOf.call(tags, ref2) < 0) && ((ref3 = this.tag(i), indexOf.call(EXPRESSION_START, ref3) < 0) || this.tokens[i].generated) && (ref4 = this.tag(i), indexOf.call(LINEBREAKS, ref4) < 0))) {\n          if (ref = this.tag(i), indexOf.call(EXPRESSION_END, ref) >= 0) {\n            backStack.push(this.tag(i));\n          }\n          if ((ref1 = this.tag(i), indexOf.call(EXPRESSION_START, ref1) >= 0) && backStack.length) {\n            backStack.pop();\n          }\n          i -= 1;\n        }\n        return ref5 = this.tag(i), indexOf.call(tags, ref5) >= 0;\n      }\n\n      // Look for signs of implicit calls and objects in the token stream and\n      // add them.\n      addImplicitBracesAndParens() {\n        var stack, start;\n        // Track current balancing depth (both implicit and explicit) on stack.\n        stack = [];\n        start = null;\n        return this.scanTokens(function(token, i, tokens) {\n          var endImplicitCall, endImplicitObject, forward, implicitObjectContinues, implicitObjectIndent, inControlFlow, inImplicit, inImplicitCall, inImplicitControl, inImplicitObject, isImplicit, isImplicitCall, isImplicitObject, k, newLine, nextTag, nextToken, offset, preContinuationLineIndent, preObjectToken, prevTag, prevToken, ref, ref1, ref2, ref3, ref4, ref5, s, sameLine, stackIdx, stackItem, stackNext, stackTag, stackTop, startIdx, startImplicitCall, startImplicitObject, startIndex, startTag, startsLine, tag;\n          [tag] = token;\n          [prevTag] = prevToken = i > 0 ? tokens[i - 1] : [];\n          [nextTag] = nextToken = i < tokens.length - 1 ? tokens[i + 1] : [];\n          stackTop = function() {\n            return stack[stack.length - 1];\n          };\n          startIdx = i;\n          // Helper function, used for keeping track of the number of tokens consumed\n          // and spliced, when returning for getting a new token.\n          forward = function(n) {\n            return i - startIdx + n;\n          };\n          // Helper functions\n          isImplicit = function(stackItem) {\n            var ref;\n            return stackItem != null ? (ref = stackItem[2]) != null ? ref.ours : void 0 : void 0;\n          };\n          isImplicitObject = function(stackItem) {\n            return isImplicit(stackItem) && (stackItem != null ? stackItem[0] : void 0) === '{';\n          };\n          isImplicitCall = function(stackItem) {\n            return isImplicit(stackItem) && (stackItem != null ? stackItem[0] : void 0) === '(';\n          };\n          inImplicit = function() {\n            return isImplicit(stackTop());\n          };\n          inImplicitCall = function() {\n            return isImplicitCall(stackTop());\n          };\n          inImplicitObject = function() {\n            return isImplicitObject(stackTop());\n          };\n          // Unclosed control statement inside implicit parens (like\n          // class declaration or if-conditionals).\n          inImplicitControl = function() {\n            var ref;\n            return inImplicit() && ((ref = stackTop()) != null ? ref[0] : void 0) === 'CONTROL';\n          };\n          startImplicitCall = function(idx) {\n            stack.push([\n              '(',\n              idx,\n              {\n                ours: true\n              }\n            ]);\n            return tokens.splice(idx, 0, generate('CALL_START', '(', ['', 'implicit function call', token[2]], prevToken));\n          };\n          endImplicitCall = function() {\n            stack.pop();\n            tokens.splice(i, 0, generate('CALL_END', ')', ['', 'end of input', token[2]], prevToken));\n            return i += 1;\n          };\n          startImplicitObject = function(idx, {startsLine = true, continuationLineIndent} = {}) {\n            var val;\n            stack.push([\n              '{',\n              idx,\n              {\n                sameLine: true,\n                startsLine: startsLine,\n                ours: true,\n                continuationLineIndent: continuationLineIndent\n              }\n            ]);\n            val = new String('{');\n            val.generated = true;\n            return tokens.splice(idx, 0, generate('{', val, token, prevToken));\n          };\n          endImplicitObject = function(j) {\n            j = j != null ? j : i;\n            stack.pop();\n            tokens.splice(j, 0, generate('}', '}', token, prevToken));\n            return i += 1;\n          };\n          implicitObjectContinues = (j) => {\n            var nextTerminatorIdx;\n            nextTerminatorIdx = null;\n            this.detectEnd(j, function(token) {\n              return token[0] === 'TERMINATOR';\n            }, function(token, i) {\n              return nextTerminatorIdx = i;\n            }, {\n              returnOnNegativeLevel: true\n            });\n            if (nextTerminatorIdx == null) {\n              return false;\n            }\n            return this.looksObjectish(nextTerminatorIdx + 1);\n          };\n          // Don’t end an implicit call/object on next indent if any of these are in an argument/value.\n          if ((inImplicitCall() || inImplicitObject()) && indexOf.call(CONTROL_IN_IMPLICIT, tag) >= 0 || inImplicitObject() && prevTag === ':' && tag === 'FOR') {\n            stack.push([\n              'CONTROL',\n              i,\n              {\n                ours: true\n              }\n            ]);\n            return forward(1);\n          }\n          if (tag === 'INDENT' && inImplicit()) {\n            // An `INDENT` closes an implicit call unless\n\n            //  1. We have seen a `CONTROL` argument on the line.\n            //  2. The last token before the indent is part of the list below.\n            if (prevTag !== '=>' && prevTag !== '->' && prevTag !== '[' && prevTag !== '(' && prevTag !== ',' && prevTag !== '{' && prevTag !== 'ELSE' && prevTag !== '=') {\n              while (inImplicitCall() || inImplicitObject() && prevTag !== ':') {\n                if (inImplicitCall()) {\n                  endImplicitCall();\n                } else {\n                  endImplicitObject();\n                }\n              }\n            }\n            if (inImplicitControl()) {\n              stack.pop();\n            }\n            stack.push([tag, i]);\n            return forward(1);\n          }\n          // Straightforward start of explicit expression.\n          if (indexOf.call(EXPRESSION_START, tag) >= 0) {\n            stack.push([tag, i]);\n            return forward(1);\n          }\n          // Close all implicit expressions inside of explicitly closed expressions.\n          if (indexOf.call(EXPRESSION_END, tag) >= 0) {\n            while (inImplicit()) {\n              if (inImplicitCall()) {\n                endImplicitCall();\n              } else if (inImplicitObject()) {\n                endImplicitObject();\n              } else {\n                stack.pop();\n              }\n            }\n            start = stack.pop();\n          }\n          inControlFlow = () => {\n            var controlFlow, isFunc, seenFor, tagCurrentLine;\n            seenFor = this.findTagsBackwards(i, ['FOR']) && this.findTagsBackwards(i, ['FORIN', 'FOROF', 'FORFROM']);\n            controlFlow = seenFor || this.findTagsBackwards(i, ['WHILE', 'UNTIL', 'LOOP', 'LEADING_WHEN']);\n            if (!controlFlow) {\n              return false;\n            }\n            isFunc = false;\n            tagCurrentLine = token[2].first_line;\n            this.detectEnd(i, function(token, i) {\n              var ref;\n              return ref = token[0], indexOf.call(LINEBREAKS, ref) >= 0;\n            }, function(token, i) {\n              var first_line;\n              [prevTag, , {first_line}] = tokens[i - 1] || [];\n              return isFunc = tagCurrentLine === first_line && (prevTag === '->' || prevTag === '=>');\n            }, {\n              returnOnNegativeLevel: true\n            });\n            return isFunc;\n          };\n          // Recognize standard implicit calls like\n          // f a, f() b, f? c, h[0] d etc.\n          // Added support for spread dots on the left side: f ...a\n          if ((indexOf.call(IMPLICIT_FUNC, tag) >= 0 && token.spaced || tag === '?' && i > 0 && !tokens[i - 1].spaced) && (indexOf.call(IMPLICIT_CALL, nextTag) >= 0 || (nextTag === '...' && (ref = this.tag(i + 2), indexOf.call(IMPLICIT_CALL, ref) >= 0) && !this.findTagsBackwards(i, ['INDEX_START', '['])) || indexOf.call(IMPLICIT_UNSPACED_CALL, nextTag) >= 0 && !nextToken.spaced && !nextToken.newLine) && !inControlFlow()) {\n            if (tag === '?') {\n              tag = token[0] = 'FUNC_EXIST';\n            }\n            startImplicitCall(i + 1);\n            return forward(2);\n          }\n          // Implicit call taking an implicit indented object as first argument.\n\n          //     f\n          //       a: b\n          //       c: d\n\n          // Don’t accept implicit calls of this type, when on the same line\n          // as the control structures below as that may misinterpret constructs like:\n\n          //     if f\n          //        a: 1\n          // as\n\n          //     if f(a: 1)\n\n          // which is probably always unintended.\n          // Furthermore don’t allow this in the first line of a literal array\n          // or explicit object, as that creates grammatical ambiguities (#5368).\n          if (indexOf.call(IMPLICIT_FUNC, tag) >= 0 && this.indexOfTag(i + 1, 'INDENT') > -1 && this.looksObjectish(i + 2) && !this.findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH', 'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL']) && !(((ref1 = (s = (ref2 = stackTop()) != null ? ref2[0] : void 0)) === '{' || ref1 === '[') && !isImplicit(stackTop()) && this.findTagsBackwards(i, s))) {\n            startImplicitCall(i + 1);\n            stack.push(['INDENT', i + 2]);\n            return forward(3);\n          }\n          // Implicit objects start here.\n          if (tag === ':') {\n            // Go back to the (implicit) start of the object.\n            s = (function() {\n              var ref3;\n              switch (false) {\n                case ref3 = this.tag(i - 1), indexOf.call(EXPRESSION_END, ref3) < 0:\n                  [startTag, startIndex] = start;\n                  if (startTag === '[' && startIndex > 0 && this.tag(startIndex - 1) === '@' && !tokens[startIndex - 1].spaced) {\n                    return startIndex - 1;\n                  } else {\n                    return startIndex;\n                  }\n                  break;\n                case this.tag(i - 2) !== '@':\n                  return i - 2;\n                default:\n                  return i - 1;\n              }\n            }).call(this);\n            startsLine = s <= 0 || (ref3 = this.tag(s - 1), indexOf.call(LINEBREAKS, ref3) >= 0) || tokens[s - 1].newLine;\n            // Are we just continuing an already declared object?\n            // Including the case where we indent on the line after an explicit '{'.\n            if (stackTop()) {\n              [stackTag, stackIdx] = stackTop();\n              stackNext = stack[stack.length - 2];\n              if ((stackTag === '{' || stackTag === 'INDENT' && (stackNext != null ? stackNext[0] : void 0) === '{' && !isImplicit(stackNext) && this.findTagsBackwards(stackIdx - 1, ['{'])) && (startsLine || this.tag(s - 1) === ',' || this.tag(s - 1) === '{') && (ref4 = this.tag(s - 1), indexOf.call(UNFINISHED, ref4) < 0)) {\n                return forward(1);\n              }\n            }\n            preObjectToken = i > 1 ? tokens[i - 2] : [];\n            startImplicitObject(s, {\n              startsLine: !!startsLine,\n              continuationLineIndent: preObjectToken.continuationLineIndent\n            });\n            return forward(2);\n          }\n          // End implicit calls when chaining method calls\n          // like e.g.:\n\n          //     f ->\n          //       a\n          //     .g b, ->\n          //       c\n          //     .h a\n\n          // and also\n\n          //     f a\n          //     .g b\n          //     .h a\n\n          // Mark all enclosing objects as not sameLine\n          if (indexOf.call(LINEBREAKS, tag) >= 0) {\n            for (k = stack.length - 1; k >= 0; k += -1) {\n              stackItem = stack[k];\n              if (!isImplicit(stackItem)) {\n                break;\n              }\n              if (isImplicitObject(stackItem)) {\n                stackItem[2].sameLine = false;\n              }\n            }\n          }\n          // End indented-continuation-line implicit objects once that indentation is over.\n          if (tag === 'TERMINATOR' && token.endsContinuationLineIndentation) {\n            ({preContinuationLineIndent} = token.endsContinuationLineIndentation);\n            while (inImplicitObject() && ((implicitObjectIndent = stackTop()[2].continuationLineIndent) != null) && implicitObjectIndent > preContinuationLineIndent) {\n              endImplicitObject();\n            }\n          }\n          newLine = prevTag === 'OUTDENT' || prevToken.newLine;\n          if (indexOf.call(IMPLICIT_END, tag) >= 0 || (indexOf.call(CALL_CLOSERS, tag) >= 0 && newLine) || ((tag === '..' || tag === '...') && this.findTagsBackwards(i, [\"INDEX_START\"]))) {\n            while (inImplicit()) {\n              [stackTag, stackIdx, {sameLine, startsLine}] = stackTop();\n              // Close implicit calls when reached end of argument list\n              if (inImplicitCall() && prevTag !== ',' || (prevTag === ',' && tag === 'TERMINATOR' && (nextTag == null))) {\n                endImplicitCall();\n              // Close implicit objects such as:\n              // return a: 1, b: 2 unless true\n              } else if (inImplicitObject() && sameLine && tag !== 'TERMINATOR' && prevTag !== ':' && !((tag === 'POST_IF' || tag === 'FOR' || tag === 'WHILE' || tag === 'UNTIL') && startsLine && implicitObjectContinues(i + 1))) {\n                endImplicitObject();\n              // Close implicit objects when at end of line, line didn't end with a comma\n              // and the implicit object didn't start the line or the next line doesn’t look like\n              // the continuation of an object.\n              } else if (inImplicitObject() && tag === 'TERMINATOR' && prevTag !== ',' && !(startsLine && this.looksObjectish(i + 1))) {\n                endImplicitObject();\n              } else if (inImplicitControl() && tokens[stackTop()[1]][0] === 'CLASS' && tag === 'TERMINATOR') {\n                stack.pop();\n              } else {\n                break;\n              }\n            }\n          }\n          // Close implicit object if comma is the last character\n          // and what comes after doesn’t look like it belongs.\n          // This is used for trailing commas and calls, like:\n\n          //     x =\n          //         a: b,\n          //         c: d,\n          //     e = 2\n\n          // and\n\n          //     f a, b: c, d: e, f, g: h: i, j\n\n          if (tag === ',' && !this.looksObjectish(i + 1) && inImplicitObject() && !((ref5 = this.tag(i + 2)) === 'FOROF' || ref5 === 'FORIN') && (nextTag !== 'TERMINATOR' || !this.looksObjectish(i + 2))) {\n            // When nextTag is OUTDENT the comma is insignificant and\n            // should just be ignored so embed it in the implicit object.\n\n            // When it isn’t the comma go on to play a role in a call or\n            // array further up the stack, so give it a chance.\n            offset = nextTag === 'OUTDENT' ? 1 : 0;\n            while (inImplicitObject()) {\n              endImplicitObject(i + offset);\n            }\n          }\n          return forward(1);\n        });\n      }\n\n      // Make sure only strings and wrapped expressions are used in JSX attributes.\n      enforceValidJSXAttributes() {\n        return this.scanTokens(function(token, i, tokens) {\n          var next, ref;\n          if (token.jsxColon) {\n            next = tokens[i + 1];\n            if ((ref = next[0]) !== 'STRING_START' && ref !== 'STRING' && ref !== '(') {\n              throwSyntaxError('expected wrapped or quoted JSX attribute', next[2]);\n            }\n          }\n          return 1;\n        });\n      }\n\n      // Not all tokens survive processing by the parser. To avoid comments getting\n      // lost into the ether, find comments attached to doomed tokens and move them\n      // to a token that will make it to the other side.\n      rescueStowawayComments() {\n        var dontShiftForward, insertPlaceholder, shiftCommentsBackward, shiftCommentsForward;\n        insertPlaceholder = function(token, j, tokens, method) {\n          if (tokens[j][0] !== 'TERMINATOR') {\n            tokens[method](generate('TERMINATOR', '\\n', tokens[j]));\n          }\n          return tokens[method](generate('JS', '', tokens[j], token));\n        };\n        dontShiftForward = function(i, tokens) {\n          var j, ref;\n          j = i + 1;\n          while (j !== tokens.length && (ref = tokens[j][0], indexOf.call(DISCARDED, ref) >= 0)) {\n            if (tokens[j][0] === 'INTERPOLATION_END') {\n              return true;\n            }\n            j++;\n          }\n          return false;\n        };\n        shiftCommentsForward = function(token, i, tokens) {\n          var comment, j, k, len, ref, ref1, ref2;\n          // Find the next surviving token and attach this token’s comments to it,\n          // with a flag that we know to output such comments *before* that\n          // token’s own compilation. (Otherwise comments are output following\n          // the token they’re attached to.)\n          j = i;\n          while (j !== tokens.length && (ref = tokens[j][0], indexOf.call(DISCARDED, ref) >= 0)) {\n            j++;\n          }\n          if (!(j === tokens.length || (ref1 = tokens[j][0], indexOf.call(DISCARDED, ref1) >= 0))) {\n            ref2 = token.comments;\n            for (k = 0, len = ref2.length; k < len; k++) {\n              comment = ref2[k];\n              comment.unshift = true;\n            }\n            moveComments(token, tokens[j]);\n            return 1; // All following tokens are doomed!\n          } else {\n            j = tokens.length - 1;\n            insertPlaceholder(token, j, tokens, 'push');\n            // The generated tokens were added to the end, not inline, so we don’t skip.\n            return 1;\n          }\n        };\n        shiftCommentsBackward = function(token, i, tokens) {\n          var j, ref, ref1;\n          // Find the last surviving token and attach this token’s comments to it.\n          j = i;\n          while (j !== -1 && (ref = tokens[j][0], indexOf.call(DISCARDED, ref) >= 0)) {\n            j--;\n          }\n          if (!(j === -1 || (ref1 = tokens[j][0], indexOf.call(DISCARDED, ref1) >= 0))) {\n            moveComments(token, tokens[j]);\n            return 1; // All previous tokens are doomed!\n          } else {\n            insertPlaceholder(token, 0, tokens, 'unshift');\n            // We added two tokens, so shift forward to account for the insertion.\n            return 3;\n          }\n        };\n        return this.scanTokens(function(token, i, tokens) {\n          var dummyToken, j, ref, ref1, ret;\n          if (!token.comments) {\n            return 1;\n          }\n          ret = 1;\n          if (ref = token[0], indexOf.call(DISCARDED, ref) >= 0) {\n            // This token won’t survive passage through the parser, so we need to\n            // rescue its attached tokens and redistribute them to nearby tokens.\n            // Comments that don’t start a new line can shift backwards to the last\n            // safe token, while other tokens should shift forward.\n            dummyToken = {\n              comments: []\n            };\n            j = token.comments.length - 1;\n            while (j !== -1) {\n              if (token.comments[j].newLine === false && token.comments[j].here === false) {\n                dummyToken.comments.unshift(token.comments[j]);\n                token.comments.splice(j, 1);\n              }\n              j--;\n            }\n            if (dummyToken.comments.length !== 0) {\n              ret = shiftCommentsBackward(dummyToken, i - 1, tokens);\n            }\n            if (token.comments.length !== 0) {\n              shiftCommentsForward(token, i, tokens);\n            }\n          } else if (!dontShiftForward(i, tokens)) {\n            // If any of this token’s comments start a line—there’s only\n            // whitespace between the preceding newline and the start of the\n            // comment—and this isn’t one of the special `JS` tokens, then\n            // shift this comment forward to precede the next valid token.\n            // `Block.compileComments` also has logic to make sure that\n            // “starting new line” comments follow or precede the nearest\n            // newline relative to the token that the comment is attached to,\n            // but that newline might be inside a `}` or `)` or other generated\n            // token that we really want this comment to output after. Therefore\n            // we need to shift the comments here, avoiding such generated and\n            // discarded tokens.\n            dummyToken = {\n              comments: []\n            };\n            j = token.comments.length - 1;\n            while (j !== -1) {\n              if (token.comments[j].newLine && !token.comments[j].unshift && !(token[0] === 'JS' && token.generated)) {\n                dummyToken.comments.unshift(token.comments[j]);\n                token.comments.splice(j, 1);\n              }\n              j--;\n            }\n            if (dummyToken.comments.length !== 0) {\n              ret = shiftCommentsForward(dummyToken, i + 1, tokens);\n            }\n          }\n          if (((ref1 = token.comments) != null ? ref1.length : void 0) === 0) {\n            delete token.comments;\n          }\n          return ret;\n        });\n      }\n\n      // Add location data to all tokens generated by the rewriter.\n      addLocationDataToGeneratedTokens() {\n        return this.scanTokens(function(token, i, tokens) {\n          var column, line, nextLocation, prevLocation, rangeIndex, ref, ref1;\n          if (token[2]) {\n            return 1;\n          }\n          if (!(token.generated || token.explicit)) {\n            return 1;\n          }\n          if (token.fromThen && token[0] === 'INDENT') {\n            token[2] = token.origin[2];\n            return 1;\n          }\n          if (token[0] === '{' && (nextLocation = (ref = tokens[i + 1]) != null ? ref[2] : void 0)) {\n            ({\n              first_line: line,\n              first_column: column,\n              range: [rangeIndex]\n            } = nextLocation);\n          } else if (prevLocation = (ref1 = tokens[i - 1]) != null ? ref1[2] : void 0) {\n            ({\n              last_line: line,\n              last_column: column,\n              range: [, rangeIndex]\n            } = prevLocation);\n            column += 1;\n          } else {\n            line = column = 0;\n            rangeIndex = 0;\n          }\n          token[2] = {\n            first_line: line,\n            first_column: column,\n            last_line: line,\n            last_column: column,\n            last_line_exclusive: line,\n            last_column_exclusive: column,\n            range: [rangeIndex, rangeIndex]\n          };\n          return 1;\n        });\n      }\n\n      // `OUTDENT` tokens should always be positioned at the last character of the\n      // previous token, so that AST nodes ending in an `OUTDENT` token end up with a\n      // location corresponding to the last “real” token under the node.\n      fixIndentationLocationData() {\n        var findPrecedingComment;\n        if (this.allComments == null) {\n          this.allComments = extractAllCommentTokens(this.tokens);\n        }\n        findPrecedingComment = (token, {afterPosition, indentSize, first, indented}) => {\n          var comment, k, l, lastMatching, matches, ref, ref1, tokenStart;\n          tokenStart = token[2].range[0];\n          matches = function(comment) {\n            if (comment.outdented) {\n              if (!((indentSize != null) && comment.indentSize > indentSize)) {\n                return false;\n              }\n            }\n            if (indented && !comment.indented) {\n              return false;\n            }\n            if (!(comment.locationData.range[0] < tokenStart)) {\n              return false;\n            }\n            if (!(comment.locationData.range[0] > afterPosition)) {\n              return false;\n            }\n            return true;\n          };\n          if (first) {\n            lastMatching = null;\n            ref = this.allComments;\n            for (k = ref.length - 1; k >= 0; k += -1) {\n              comment = ref[k];\n              if (matches(comment)) {\n                lastMatching = comment;\n              } else if (lastMatching) {\n                return lastMatching;\n              }\n            }\n            return lastMatching;\n          }\n          ref1 = this.allComments;\n          for (l = ref1.length - 1; l >= 0; l += -1) {\n            comment = ref1[l];\n            if (matches(comment)) {\n              return comment;\n            }\n          }\n          return null;\n        };\n        return this.scanTokens(function(token, i, tokens) {\n          var isIndent, nextToken, nextTokenIndex, precedingComment, prevLocationData, prevToken, ref, ref1, ref2, useNextToken;\n          if (!(((ref = token[0]) === 'INDENT' || ref === 'OUTDENT') || (token.generated && token[0] === 'CALL_END' && !((ref1 = token.data) != null ? ref1.closingTagNameToken : void 0)) || (token.generated && token[0] === '}'))) {\n            return 1;\n          }\n          isIndent = token[0] === 'INDENT';\n          prevToken = (ref2 = token.prevToken) != null ? ref2 : tokens[i - 1];\n          prevLocationData = prevToken[2];\n          // addLocationDataToGeneratedTokens() set the outdent’s location data\n          // to the preceding token’s, but in order to detect comments inside an\n          // empty \"block\" we want to look for comments preceding the next token.\n          useNextToken = token.explicit || token.generated;\n          if (useNextToken) {\n            nextToken = token;\n            nextTokenIndex = i;\n            while ((nextToken.explicit || nextToken.generated) && nextTokenIndex !== tokens.length - 1) {\n              nextToken = tokens[nextTokenIndex++];\n            }\n          }\n          precedingComment = findPrecedingComment(useNextToken ? nextToken : token, {\n            afterPosition: prevLocationData.range[0],\n            indentSize: token.indentSize,\n            first: isIndent,\n            indented: useNextToken\n          });\n          if (isIndent) {\n            if (!(precedingComment != null ? precedingComment.newLine : void 0)) {\n              return 1;\n            }\n          }\n          if (token.generated && token[0] === 'CALL_END' && (precedingComment != null ? precedingComment.indented : void 0)) {\n            // We don’t want e.g. an implicit call at the end of an `if` condition to\n            // include a following indented comment.\n            return 1;\n          }\n          if (precedingComment != null) {\n            prevLocationData = precedingComment.locationData;\n          }\n          token[2] = {\n            first_line: precedingComment != null ? prevLocationData.first_line : prevLocationData.last_line,\n            first_column: precedingComment != null ? isIndent ? 0 : prevLocationData.first_column : prevLocationData.last_column,\n            last_line: prevLocationData.last_line,\n            last_column: prevLocationData.last_column,\n            last_line_exclusive: prevLocationData.last_line_exclusive,\n            last_column_exclusive: prevLocationData.last_column_exclusive,\n            range: isIndent && (precedingComment != null) ? [prevLocationData.range[0] - precedingComment.indentSize, prevLocationData.range[1]] : prevLocationData.range\n          };\n          return 1;\n        });\n      }\n\n      // Because our grammar is LALR(1), it can’t handle some single-line\n      // expressions that lack ending delimiters. The **Rewriter** adds the implicit\n      // blocks, so it doesn’t need to. To keep the grammar clean and tidy, trailing\n      // newlines within expressions are removed and the indentation tokens of empty\n      // blocks are added.\n      normalizeLines() {\n        var action, closeElseTag, condition, ifThens, indent, leading_if_then, leading_switch_when, outdent, starter;\n        starter = indent = outdent = null;\n        leading_switch_when = null;\n        leading_if_then = null;\n        // Count `THEN` tags\n        ifThens = [];\n        condition = function(token, i) {\n          var ref, ref1, ref2, ref3;\n          return token[1] !== ';' && (ref = token[0], indexOf.call(SINGLE_CLOSERS, ref) >= 0) && !(token[0] === 'TERMINATOR' && (ref1 = this.tag(i + 1), indexOf.call(EXPRESSION_CLOSE, ref1) >= 0)) && !(token[0] === 'ELSE' && (starter !== 'THEN' || (leading_if_then || leading_switch_when))) && !(((ref2 = token[0]) === 'CATCH' || ref2 === 'FINALLY') && (starter === '->' || starter === '=>')) || (ref3 = token[0], indexOf.call(CALL_CLOSERS, ref3) >= 0) && (this.tokens[i - 1].newLine || this.tokens[i - 1][0] === 'OUTDENT');\n        };\n        action = function(token, i) {\n          if (token[0] === 'ELSE' && starter === 'THEN') {\n            ifThens.pop();\n          }\n          return this.tokens.splice((this.tag(i - 1) === ',' ? i - 1 : i), 0, outdent);\n        };\n        closeElseTag = (tokens, i) => {\n          var lastThen, outdentElse, tlen;\n          tlen = ifThens.length;\n          if (!(tlen > 0)) {\n            return i;\n          }\n          lastThen = ifThens.pop();\n          [, outdentElse] = this.indentation(tokens[lastThen]);\n          // Insert `OUTDENT` to close inner `IF`.\n          outdentElse[1] = tlen * 2;\n          tokens.splice(i, 0, outdentElse);\n          // Insert `OUTDENT` to close outer `IF`.\n          outdentElse[1] = 2;\n          tokens.splice(i + 1, 0, outdentElse);\n          // Remove outdents from the end.\n          this.detectEnd(i + 2, function(token, i) {\n            var ref;\n            return (ref = token[0]) === 'OUTDENT' || ref === 'TERMINATOR';\n          }, function(token, i) {\n            if (this.tag(i) === 'OUTDENT' && this.tag(i + 1) === 'OUTDENT') {\n              return tokens.splice(i, 2);\n            }\n          });\n          return i + 2;\n        };\n        return this.scanTokens(function(token, i, tokens) {\n          var conditionTag, j, k, ref, ref1, ref2, tag;\n          [tag] = token;\n          conditionTag = (tag === '->' || tag === '=>') && this.findTagsBackwards(i, ['IF', 'WHILE', 'FOR', 'UNTIL', 'SWITCH', 'WHEN', 'LEADING_WHEN', '[', 'INDEX_START']) && !(this.findTagsBackwards(i, ['THEN', '..', '...']));\n          if (tag === 'TERMINATOR') {\n            if (this.tag(i + 1) === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') {\n              tokens.splice(i, 1, ...this.indentation());\n              return 1;\n            }\n            if (ref = this.tag(i + 1), indexOf.call(EXPRESSION_CLOSE, ref) >= 0) {\n              if (token[1] === ';' && this.tag(i + 1) === 'OUTDENT') {\n                tokens[i + 1].prevToken = token;\n                moveComments(token, tokens[i + 1]);\n              }\n              tokens.splice(i, 1);\n              return 0;\n            }\n          }\n          if (tag === 'CATCH') {\n            for (j = k = 1; k <= 2; j = ++k) {\n              if (!((ref1 = this.tag(i + j)) === 'OUTDENT' || ref1 === 'TERMINATOR' || ref1 === 'FINALLY')) {\n                continue;\n              }\n              tokens.splice(i + j, 0, ...this.indentation());\n              return 2 + j;\n            }\n          }\n          if ((tag === '->' || tag === '=>') && (((ref2 = this.tag(i + 1)) === ',' || ref2 === ']') || this.tag(i + 1) === '.' && token.newLine)) {\n            [indent, outdent] = this.indentation(tokens[i]);\n            tokens.splice(i + 1, 0, indent, outdent);\n            return 1;\n          }\n          if (indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF') && !conditionTag) {\n            starter = tag;\n            [indent, outdent] = this.indentation(tokens[i]);\n            if (starter === 'THEN') {\n              indent.fromThen = true;\n            }\n            if (tag === 'THEN') {\n              leading_switch_when = this.findTagsBackwards(i, ['LEADING_WHEN']) && this.tag(i + 1) === 'IF';\n              leading_if_then = this.findTagsBackwards(i, ['IF']) && this.tag(i + 1) === 'IF';\n            }\n            if (tag === 'THEN' && this.findTagsBackwards(i, ['IF'])) {\n              ifThens.push(i);\n            }\n            // `ELSE` tag is not closed.\n            if (tag === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') {\n              i = closeElseTag(tokens, i);\n            }\n            tokens.splice(i + 1, 0, indent);\n            this.detectEnd(i + 2, condition, action);\n            if (tag === 'THEN') {\n              tokens.splice(i, 1);\n            }\n            return 1;\n          }\n          return 1;\n        });\n      }\n\n      // Tag postfix conditionals as such, so that we can parse them with a\n      // different precedence.\n      tagPostfixConditionals() {\n        var action, condition, original;\n        original = null;\n        condition = function(token, i) {\n          var prevTag, tag;\n          [tag] = token;\n          [prevTag] = this.tokens[i - 1];\n          return tag === 'TERMINATOR' || (tag === 'INDENT' && indexOf.call(SINGLE_LINERS, prevTag) < 0);\n        };\n        action = function(token, i) {\n          if (token[0] !== 'INDENT' || (token.generated && !token.fromThen)) {\n            return original[0] = 'POST_' + original[0];\n          }\n        };\n        return this.scanTokens(function(token, i) {\n          if (token[0] !== 'IF') {\n            return 1;\n          }\n          original = token;\n          this.detectEnd(i + 1, condition, action);\n          return 1;\n        });\n      }\n\n      // For tokens with extra data, we want to make that data visible to the grammar\n      // by wrapping the token value as a String() object and setting the data as\n      // properties of that object. The grammar should then be responsible for\n      // cleaning this up for the node constructor: unwrapping the token value to a\n      // primitive string and separately passing any expected token data properties\n      exposeTokenDataToGrammar() {\n        return this.scanTokens(function(token, i) {\n          var key, ref, ref1, val;\n          if (token.generated || (token.data && Object.keys(token.data).length !== 0)) {\n            token[1] = new String(token[1]);\n            ref1 = (ref = token.data) != null ? ref : {};\n            for (key in ref1) {\n              if (!hasProp.call(ref1, key)) continue;\n              val = ref1[key];\n              token[1][key] = val;\n            }\n            if (token.generated) {\n              token[1].generated = true;\n            }\n          }\n          return 1;\n        });\n      }\n\n      // Generate the indentation tokens, based on another token on the same line.\n      indentation(origin) {\n        var indent, outdent;\n        indent = ['INDENT', 2];\n        outdent = ['OUTDENT', 2];\n        if (origin) {\n          indent.generated = outdent.generated = true;\n          indent.origin = outdent.origin = origin;\n        } else {\n          indent.explicit = outdent.explicit = true;\n        }\n        return [indent, outdent];\n      }\n\n      // Look up a tag by token index.\n      tag(i) {\n        var ref;\n        return (ref = this.tokens[i]) != null ? ref[0] : void 0;\n      }\n\n    };\n\n    Rewriter.prototype.generate = generate;\n\n    return Rewriter;\n\n  }).call(this);\n\n  // Constants\n  // ---------\n\n  // List of the token pairs that must be balanced.\n  BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END'], ['STRING_START', 'STRING_END'], ['INTERPOLATION_START', 'INTERPOLATION_END'], ['REGEX_START', 'REGEX_END']];\n\n  // The inverse mappings of `BALANCED_PAIRS` we’re trying to fix up, so we can\n  // look things up from either end.\n  exports.INVERSES = INVERSES = {};\n\n  // The tokens that signal the start/end of a balanced pair.\n  EXPRESSION_START = [];\n\n  EXPRESSION_END = [];\n\n  for (k = 0, len = BALANCED_PAIRS.length; k < len; k++) {\n    [left, right] = BALANCED_PAIRS[k];\n    EXPRESSION_START.push(INVERSES[right] = left);\n    EXPRESSION_END.push(INVERSES[left] = right);\n  }\n\n  // Tokens that indicate the close of a clause of an expression.\n  EXPRESSION_CLOSE = ['CATCH', 'THEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END);\n\n  // Tokens that, if followed by an `IMPLICIT_CALL`, indicate a function invocation.\n  IMPLICIT_FUNC = ['IDENTIFIER', 'PROPERTY', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS'];\n\n  // If preceded by an `IMPLICIT_FUNC`, indicates a function invocation.\n  IMPLICIT_CALL = ['IDENTIFIER', 'JSX_TAG', 'PROPERTY', 'NUMBER', 'INFINITY', 'NAN', 'STRING', 'STRING_START', 'REGEX', 'REGEX_START', 'JS', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS', 'DYNAMIC_IMPORT', 'IMPORT_META', 'NEW_TARGET', 'UNDEFINED', 'NULL', 'BOOL', 'UNARY', 'DO', 'DO_IIFE', 'YIELD', 'AWAIT', 'UNARY_MATH', 'SUPER', 'THROW', '@', '->', '=>', '[', '(', '{', '--', '++'];\n\n  IMPLICIT_UNSPACED_CALL = ['+', '-'];\n\n  // Tokens that always mark the end of an implicit call for single-liners.\n  IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR'];\n\n  // Single-line flavors of block expressions that have unclosed endings.\n  // The grammar can’t disambiguate them, so we insert the implicit indentation.\n  SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN'];\n\n  SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN'];\n\n  // Tokens that end a line.\n  LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT'];\n\n  // Tokens that close open calls when they follow a newline.\n  CALL_CLOSERS = ['.', '?.', '::', '?::'];\n\n  // Tokens that prevent a subsequent indent from ending implicit calls/objects\n  CONTROL_IN_IMPLICIT = ['IF', 'TRY', 'FINALLY', 'CATCH', 'CLASS', 'SWITCH'];\n\n  // Tokens that are swallowed up by the parser, never leading to code generation.\n  // You can spot these in `grammar.coffee` because the `o` function second\n  // argument doesn’t contain a `new` call for these tokens.\n  // `STRING_START` isn’t on this list because its `locationData` matches that of\n  // the node that becomes `StringWithInterpolations`, and therefore\n  // `addDataToNode` attaches `STRING_START`’s tokens to that node.\n  DISCARDED = ['(', ')', '[', ']', '{', '}', ':', '.', '..', '...', ',', '=', '++', '--', '?', 'AS', 'AWAIT', 'CALL_START', 'CALL_END', 'DEFAULT', 'DO', 'DO_IIFE', 'ELSE', 'EXTENDS', 'EXPORT', 'FORIN', 'FOROF', 'FORFROM', 'IMPORT', 'INDENT', 'INDEX_SOAK', 'INTERPOLATION_START', 'INTERPOLATION_END', 'LEADING_WHEN', 'OUTDENT', 'PARAM_END', 'REGEX_START', 'REGEX_END', 'RETURN', 'STRING_END', 'THROW', 'UNARY', 'YIELD'].concat(IMPLICIT_UNSPACED_CALL.concat(IMPLICIT_END.concat(CALL_CLOSERS.concat(CONTROL_IN_IMPLICIT))));\n\n  // Tokens that, when appearing at the end of a line, suppress a following TERMINATOR/INDENT token\n  exports.UNFINISHED = UNFINISHED = ['\\\\', '.', '?.', '?::', 'UNARY', 'DO', 'DO_IIFE', 'MATH', 'UNARY_MATH', '+', '-', '**', 'SHIFT', 'RELATION', 'COMPARE', '&', '^', '|', '&&', '||', 'BIN?', 'EXTENDS'];\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/scope.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  // The **Scope** class regulates lexical scoping within CoffeeScript. As you\n  // generate code, you create a tree of scopes in the same shape as the nested\n  // function bodies. Each scope knows about the variables declared within it,\n  // and has a reference to its parent enclosing scope. In this way, we know which\n  // variables are new and need to be declared with `var`, and which are shared\n  // with external scopes.\n  var Scope,\n    indexOf = [].indexOf;\n\n  exports.Scope = Scope = class Scope {\n    // Initialize a scope with its parent, for lookups up the chain,\n    // as well as a reference to the **Block** node it belongs to, which is\n    // where it should declare its variables, a reference to the function that\n    // it belongs to, and a list of variables referenced in the source code\n    // and therefore should be avoided when generating variables. Also track comments\n    // that should be output as part of variable declarations.\n    constructor(parent, expressions, method, referencedVars) {\n      var ref, ref1;\n      this.parent = parent;\n      this.expressions = expressions;\n      this.method = method;\n      this.referencedVars = referencedVars;\n      this.variables = [\n        {\n          name: 'arguments',\n          type: 'arguments'\n        }\n      ];\n      this.comments = {};\n      this.positions = {};\n      if (!this.parent) {\n        this.utilities = {};\n      }\n      // The `@root` is the top-level **Scope** object for a given file.\n      this.root = (ref = (ref1 = this.parent) != null ? ref1.root : void 0) != null ? ref : this;\n    }\n\n    // Adds a new variable or overrides an existing one.\n    add(name, type, immediate) {\n      if (this.shared && !immediate) {\n        return this.parent.add(name, type, immediate);\n      }\n      if (Object.prototype.hasOwnProperty.call(this.positions, name)) {\n        return this.variables[this.positions[name]].type = type;\n      } else {\n        return this.positions[name] = this.variables.push({name, type}) - 1;\n      }\n    }\n\n    // When `super` is called, we need to find the name of the current method we're\n    // in, so that we know how to invoke the same method of the parent class. This\n    // can get complicated if super is being called from an inner function.\n    // `namedMethod` will walk up the scope tree until it either finds the first\n    // function object that has a name filled in, or bottoms out.\n    namedMethod() {\n      var ref;\n      if (((ref = this.method) != null ? ref.name : void 0) || !this.parent) {\n        return this.method;\n      }\n      return this.parent.namedMethod();\n    }\n\n    // Look up a variable name in lexical scope, and declare it if it does not\n    // already exist.\n    find(name, type = 'var') {\n      if (this.check(name)) {\n        return true;\n      }\n      this.add(name, type);\n      return false;\n    }\n\n    // Reserve a variable name as originating from a function parameter for this\n    // scope. No `var` required for internal references.\n    parameter(name) {\n      if (this.shared && this.parent.check(name, true)) {\n        return;\n      }\n      return this.add(name, 'param');\n    }\n\n    // Just check to see if a variable has already been declared, without reserving,\n    // walks up to the root scope.\n    check(name) {\n      var ref;\n      return !!(this.type(name) || ((ref = this.parent) != null ? ref.check(name) : void 0));\n    }\n\n    // Generate a temporary variable name at the given index.\n    temporary(name, index, single = false) {\n      var diff, endCode, letter, newCode, num, startCode;\n      if (single) {\n        startCode = name.charCodeAt(0);\n        endCode = 'z'.charCodeAt(0);\n        diff = endCode - startCode;\n        newCode = startCode + index % (diff + 1);\n        letter = String.fromCharCode(newCode);\n        num = Math.floor(index / (diff + 1));\n        return `${letter}${num || ''}`;\n      } else {\n        return `${name}${index || ''}`;\n      }\n    }\n\n    // Gets the type of a variable.\n    type(name) {\n      var i, len, ref, v;\n      ref = this.variables;\n      for (i = 0, len = ref.length; i < len; i++) {\n        v = ref[i];\n        if (v.name === name) {\n          return v.type;\n        }\n      }\n      return null;\n    }\n\n    // If we need to store an intermediate result, find an available name for a\n    // compiler-generated variable. `_var`, `_var2`, and so on...\n    freeVariable(name, options = {}) {\n      var index, ref, temp;\n      index = 0;\n      while (true) {\n        temp = this.temporary(name, index, options.single);\n        if (!(this.check(temp) || indexOf.call(this.root.referencedVars, temp) >= 0)) {\n          break;\n        }\n        index++;\n      }\n      if ((ref = options.reserve) != null ? ref : true) {\n        this.add(temp, 'var', true);\n      }\n      return temp;\n    }\n\n    // Ensure that an assignment is made at the top of this scope\n    // (or at the top-level scope, if requested).\n    assign(name, value) {\n      this.add(name, {\n        value,\n        assigned: true\n      }, true);\n      return this.hasAssignments = true;\n    }\n\n    // Does this scope have any declared variables?\n    hasDeclarations() {\n      return !!this.declaredVariables().length;\n    }\n\n    // Return the list of variables first declared in this scope.\n    declaredVariables() {\n      var v;\n      return ((function() {\n        var i, len, ref, results;\n        ref = this.variables;\n        results = [];\n        for (i = 0, len = ref.length; i < len; i++) {\n          v = ref[i];\n          if (v.type === 'var') {\n            results.push(v.name);\n          }\n        }\n        return results;\n      }).call(this)).sort();\n    }\n\n    // Return the list of assignments that are supposed to be made at the top\n    // of this scope.\n    assignedVariables() {\n      var i, len, ref, results, v;\n      ref = this.variables;\n      results = [];\n      for (i = 0, len = ref.length; i < len; i++) {\n        v = ref[i];\n        if (v.type.assigned) {\n          results.push(`${v.name} = ${v.type.value}`);\n        }\n      }\n      return results;\n    }\n\n  };\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript/sourcemap.js",
    "content": "// Generated by CoffeeScript 2.7.0\n(function() {\n  // Source maps allow JavaScript runtimes to match running JavaScript back to\n  // the original source code that corresponds to it. This can be minified\n  // JavaScript, but in our case, we're concerned with mapping pretty-printed\n  // JavaScript back to CoffeeScript.\n\n  // In order to produce maps, we must keep track of positions (line number, column number)\n  // that originated every node in the syntax tree, and be able to generate a\n  // [map file](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit)\n  // — which is a compact, VLQ-encoded representation of the JSON serialization\n  // of this information — to write out alongside the generated JavaScript.\n\n  // LineMap\n  // -------\n\n  // A **LineMap** object keeps track of information about original line and column\n  // positions for a single line of output JavaScript code.\n  // **SourceMaps** are implemented in terms of **LineMaps**.\n  var LineMap, SourceMap;\n\n  LineMap = class LineMap {\n    constructor(line1) {\n      this.line = line1;\n      this.columns = [];\n    }\n\n    add(column, [sourceLine, sourceColumn], options = {}) {\n      if (this.columns[column] && options.noReplace) {\n        return;\n      }\n      return this.columns[column] = {\n        line: this.line,\n        column,\n        sourceLine,\n        sourceColumn\n      };\n    }\n\n    sourceLocation(column) {\n      var mapping;\n      while (!((mapping = this.columns[column]) || (column <= 0))) {\n        column--;\n      }\n      return mapping && [mapping.sourceLine, mapping.sourceColumn];\n    }\n\n  };\n\n  SourceMap = (function() {\n    var BASE64_CHARS, VLQ_CONTINUATION_BIT, VLQ_SHIFT, VLQ_VALUE_MASK;\n\n    // SourceMap\n    // ---------\n\n      // Maps locations in a single generated JavaScript file back to locations in\n    // the original CoffeeScript source file.\n\n      // This is intentionally agnostic towards how a source map might be represented on\n    // disk. Once the compiler is ready to produce a \"v3\"-style source map, we can walk\n    // through the arrays of line and column buffer to produce it.\n    class SourceMap {\n      constructor() {\n        this.lines = [];\n      }\n\n      // Adds a mapping to this SourceMap. `sourceLocation` and `generatedLocation`\n      // are both `[line, column]` arrays. If `options.noReplace` is true, then if there\n      // is already a mapping for the specified `line` and `column`, this will have no\n      // effect.\n      add(sourceLocation, generatedLocation, options = {}) {\n        var base, column, line, lineMap;\n        [line, column] = generatedLocation;\n        lineMap = ((base = this.lines)[line] || (base[line] = new LineMap(line)));\n        return lineMap.add(column, sourceLocation, options);\n      }\n\n      // Look up the original position of a given `line` and `column` in the generated\n      // code.\n      sourceLocation([line, column]) {\n        var lineMap;\n        while (!((lineMap = this.lines[line]) || (line <= 0))) {\n          line--;\n        }\n        return lineMap && lineMap.sourceLocation(column);\n      }\n\n      static registerCompiled(filename, source, sourcemap) {\n        if (sourcemap != null) {\n          return SourceMap.sourceMaps[filename] = sourcemap;\n        }\n      }\n\n      static getSourceMap(filename) {\n        return SourceMap.sourceMaps[filename];\n      }\n\n      // V3 SourceMap Generation\n      // -----------------------\n\n        // Builds up a V3 source map, returning the generated JSON as a string.\n      // `options.sourceRoot` may be used to specify the sourceRoot written to the source\n      // map.  Also, `options.sourceFiles` and `options.generatedFile` may be passed to\n      // set \"sources\" and \"file\", respectively.\n      generate(options = {}, code = null) {\n        var buffer, i, j, lastColumn, lastSourceColumn, lastSourceLine, len, len1, lineMap, lineNumber, mapping, needComma, ref, ref1, sources, v3, writingline;\n        writingline = 0;\n        lastColumn = 0;\n        lastSourceLine = 0;\n        lastSourceColumn = 0;\n        needComma = false;\n        buffer = \"\";\n        ref = this.lines;\n        for (lineNumber = i = 0, len = ref.length; i < len; lineNumber = ++i) {\n          lineMap = ref[lineNumber];\n          if (lineMap) {\n            ref1 = lineMap.columns;\n            for (j = 0, len1 = ref1.length; j < len1; j++) {\n              mapping = ref1[j];\n              if (!(mapping)) {\n                continue;\n              }\n              while (writingline < mapping.line) {\n                lastColumn = 0;\n                needComma = false;\n                buffer += \";\";\n                writingline++;\n              }\n              // Write a comma if we've already written a segment on this line.\n              if (needComma) {\n                buffer += \",\";\n                needComma = false;\n              }\n              // Write the next segment. Segments can be 1, 4, or 5 values.  If just one, then it\n              // is a generated column which doesn't match anything in the source code.\n\n              // The starting column in the generated source, relative to any previous recorded\n              // column for the current line:\n              buffer += this.encodeVlq(mapping.column - lastColumn);\n              lastColumn = mapping.column;\n              // The index into the list of sources:\n              buffer += this.encodeVlq(0);\n              // The starting line in the original source, relative to the previous source line.\n              buffer += this.encodeVlq(mapping.sourceLine - lastSourceLine);\n              lastSourceLine = mapping.sourceLine;\n              // The starting column in the original source, relative to the previous column.\n              buffer += this.encodeVlq(mapping.sourceColumn - lastSourceColumn);\n              lastSourceColumn = mapping.sourceColumn;\n              needComma = true;\n            }\n          }\n        }\n        // Produce the canonical JSON object format for a \"v3\" source map.\n        sources = options.sourceFiles ? options.sourceFiles : options.filename ? [options.filename] : ['<anonymous>'];\n        v3 = {\n          version: 3,\n          file: options.generatedFile || '',\n          sourceRoot: options.sourceRoot || '',\n          sources: sources,\n          names: [],\n          mappings: buffer\n        };\n        if (options.sourceMap || options.inlineMap) {\n          v3.sourcesContent = [code];\n        }\n        return v3;\n      }\n\n      encodeVlq(value) {\n        var answer, nextChunk, signBit, valueToEncode;\n        answer = '';\n        // Least significant bit represents the sign.\n        signBit = value < 0 ? 1 : 0;\n        // The next bits are the actual value.\n        valueToEncode = (Math.abs(value) << 1) + signBit;\n        // Make sure we encode at least one character, even if valueToEncode is 0.\n        while (valueToEncode || !answer) {\n          nextChunk = valueToEncode & VLQ_VALUE_MASK;\n          valueToEncode = valueToEncode >> VLQ_SHIFT;\n          if (valueToEncode) {\n            nextChunk |= VLQ_CONTINUATION_BIT;\n          }\n          answer += this.encodeBase64(nextChunk);\n        }\n        return answer;\n      }\n\n      encodeBase64(value) {\n        return BASE64_CHARS[value] || (function() {\n          throw new Error(`Cannot Base64 encode value: ${value}`);\n        })();\n      }\n\n    };\n\n    // Caching\n    // -------\n\n    // A static source maps cache `filename`: `map`. These are used for transforming\n    // stack traces and are currently set in `CoffeeScript.compile` for all files\n    // compiled with the source maps option.\n    SourceMap.sourceMaps = Object.create(null);\n\n    // Base64 VLQ Encoding\n    // -------------------\n\n    // Note that SourceMap VLQ encoding is \"backwards\".  MIDI-style VLQ encoding puts\n    // the most-significant-bit (MSB) from the original value into the MSB of the VLQ\n    // encoded value (see [Wikipedia](https://en.wikipedia.org/wiki/File:Uintvar_coding.svg)).\n    // SourceMap VLQ does things the other way around, with the least significat four\n    // bits of the original value encoded into the first byte of the VLQ encoded value.\n    VLQ_SHIFT = 5;\n\n    VLQ_CONTINUATION_BIT = 1 << VLQ_SHIFT; // 0010 0000\n\n    VLQ_VALUE_MASK = VLQ_CONTINUATION_BIT - 1; // 0001 1111\n\n    // Regular Base64 Encoding\n    // -----------------------\n    BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n    return SourceMap;\n\n  }).call(this);\n\n  // Our API for source maps is just the `SourceMap` class.\n  module.exports = SourceMap;\n\n}).call(this);\n"
  },
  {
    "path": "lib/coffeescript-browser-compiler-legacy/coffeescript.js",
    "content": "/**\n * CoffeeScript Compiler v2.7.0\n * https://coffeescript.org\n *\n * Copyright 2011-2023, Jeremy Ashkenas\n * Released under the MIT License\n */\nfunction _get(){return _get=\"undefined\"!=typeof Reflect&&Reflect.get?Reflect.get:function(target,property,receiver){var base=_superPropBase(target,property);if(base){var desc=Object.getOwnPropertyDescriptor(base,property);return desc.get?desc.get.call(3>arguments.length?target:receiver):desc.value}},_get.apply(this,arguments)}function _superPropBase(object,property){for(;!Object.prototype.hasOwnProperty.call(object,property)&&(object=_getPrototypeOf(object),null!==object););return object}function _inherits(subClass,superClass){if(\"function\"!=typeof superClass&&null!==superClass)throw new TypeError(\"Super expression must either be null or a function\");subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:!0,configurable:!0}}),Object.defineProperty(subClass,\"prototype\",{writable:!1}),superClass&&_setPrototypeOf(subClass,superClass)}function _setPrototypeOf(o,p){return _setPrototypeOf=Object.setPrototypeOf||function(o,p){return o.__proto__=p,o},_setPrototypeOf(o,p)}function _createSuper(Derived){var hasNativeReflectConstruct=_isNativeReflectConstruct();return function(){var Super=_getPrototypeOf(Derived),result;if(hasNativeReflectConstruct){var NewTarget=_getPrototypeOf(this).constructor;result=Reflect.construct(Super,arguments,NewTarget)}else result=Super.apply(this,arguments);return _possibleConstructorReturn(this,result)}}function _possibleConstructorReturn(self,call){if(call&&(\"object\"===_typeof(call)||\"function\"==typeof call))return call;if(void 0!==call)throw new TypeError(\"Derived constructors may only return object or undefined\");return _assertThisInitialized(self)}function _assertThisInitialized(self){if(void 0===self)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return self}function _isNativeReflectConstruct(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}function _getPrototypeOf(o){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function(o){return o.__proto__||Object.getPrototypeOf(o)},_getPrototypeOf(o)}function _toArray(arr){return _arrayWithHoles(arr)||_iterableToArray(arr)||_unsupportedIterableToArray(arr)||_nonIterableRest()}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_unsupportedIterableToArray(arr,i)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}function _iterableToArrayLimit(arr,i){var _i=null==arr?null:\"undefined\"!=typeof Symbol&&arr[Symbol.iterator]||arr[\"@@iterator\"];if(null!=_i){var _arr=[],_n=!0,_d=!1,_s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!(i&&_arr.length===i));_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i[\"return\"]||_i[\"return\"]()}finally{if(_d)throw _e}}return _arr}}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(target,props){for(var i=0,descriptor;i<props.length;i++)descriptor=props[i],descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,\"value\"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}function _createClass(Constructor,protoProps,staticProps){return protoProps&&_defineProperties(Constructor.prototype,protoProps),staticProps&&_defineProperties(Constructor,staticProps),Object.defineProperty(Constructor,\"prototype\",{writable:!1}),Constructor}function _typeof(obj){\"@babel/helpers - typeof\";return _typeof=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&\"function\"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?\"symbol\":typeof obj},_typeof(obj)}function _toConsumableArray(arr){return _arrayWithoutHoles(arr)||_iterableToArray(arr)||_unsupportedIterableToArray(arr)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}function _unsupportedIterableToArray(o,minLen){if(o){if(\"string\"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);return\"Object\"===n&&o.constructor&&(n=o.constructor.name),\"Map\"===n||\"Set\"===n?Array.from(o):\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(o,minLen):void 0}}function _iterableToArray(iter){if(\"undefined\"!=typeof Symbol&&null!=iter[Symbol.iterator]||null!=iter[\"@@iterator\"])return Array.from(iter)}function _arrayWithoutHoles(arr){if(Array.isArray(arr))return _arrayLikeToArray(arr)}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=Array(len);i<len;i++)arr2[i]=arr[i];return arr2}(function(root){var CoffeeScript=function(){var _Mathabs=Math.abs,_StringfromCharCode=String.fromCharCode,_Mathfloor=Math.floor;function require(path){return require[path]}return require[\"../../package.json\"]=function(){return{name:\"coffeescript\",description:\"Unfancy JavaScript\",keywords:[\"javascript\",\"language\",\"coffeescript\",\"compiler\"],author:\"Jeremy Ashkenas\",version:\"2.7.0\",license:\"MIT\",engines:{node:\">=6\"},directories:{lib:\"./lib/coffeescript\"},main:\"./lib/coffeescript/index\",module:\"./lib/coffeescript-browser-compiler-modern/coffeescript.js\",browser:\"./lib/coffeescript-browser-compiler-legacy/coffeescript.js\",bin:{coffee:\"./bin/coffee\",cake:\"./bin/cake\"},files:[\"bin\",\"lib\",\"register.js\",\"repl.js\"],scripts:{test:\"node ./bin/cake test\",\"test-harmony\":\"node --harmony ./bin/cake test\"},homepage:\"https://coffeescript.org\",bugs:\"https://github.com/jashkenas/coffeescript/issues\",repository:{type:\"git\",url:\"git://github.com/jashkenas/coffeescript.git\"},devDependencies:{\"@babel/core\":\"~7.17.9\",\"@babel/preset-env\":\"~7.16.11\",\"babel-preset-minify\":\"~0.5.1\",codemirror:\"~5.65.3\",docco:\"~0.9.1\",\"highlight.js\":\"~11.5.1\",jison:\"~0.4.18\",\"markdown-it\":\"~13.0.0\",puppeteer:\"~13.6.0\",underscore:\"~1.13.3\",webpack:\"~5.72.0\"}}}(),require[\"./helpers\"]=function(){var exports={};return function(){var indexOf=[].indexOf,UNICODE_CODE_POINT_ESCAPE,attachCommentsToNode,buildLocationData,buildLocationHash,buildTokenDataDictionary,extend,flatten,isBoolean,isNumber,isString,ref,repeat,syntaxErrorToString,unicodeCodePointToUnicodeEscapes;exports.starts=function(string,literal,start){return literal===string.substr(start,literal.length)},exports.ends=function(string,literal,back){var len;return len=literal.length,literal===string.substr(string.length-len-(back||0),len)},exports.repeat=repeat=function(str,n){var res;for(res=\"\";0<n;)1&n&&(res+=str),n>>>=1,str+=str;return res},exports.compact=function(array){var i,item,len1,results;for(results=[],i=0,len1=array.length;i<len1;i++)item=array[i],item&&results.push(item);return results},exports.count=function(string,substr){var num,pos;if(num=pos=0,!substr.length)return 1/0;for(;pos=1+string.indexOf(substr,pos);)num++;return num},exports.merge=function(options,overrides){return extend(extend({},options),overrides)},extend=exports.extend=function(object,properties){var key,val;for(key in properties)val=properties[key],object[key]=val;return object},exports.flatten=flatten=function(array){return array.flat(2e308)},exports.del=function(obj,key){var val;return val=obj[key],delete obj[key],val},exports.some=null==(ref=Array.prototype.some)?function(fn){var e,i,len1,ref1;for(ref1=this,i=0,len1=ref1.length;i<len1;i++)if(e=ref1[i],fn(e))return!0;return!1}:ref,exports.invertLiterate=function(code){var blankLine,i,indented,insideComment,len1,line,listItemStart,out,ref1;for(out=[],blankLine=/^\\s*$/,indented=/^[\\t ]/,listItemStart=/^(?:\\t?| {0,3})(?:[\\*\\-\\+]|[0-9]{1,9}\\.)[ \\t]/,insideComment=!1,ref1=code.split(\"\\n\"),(i=0,len1=ref1.length);i<len1;i++)line=ref1[i],blankLine.test(line)?(insideComment=!1,out.push(line)):insideComment||listItemStart.test(line)?(insideComment=!0,out.push(\"# \".concat(line))):!insideComment&&indented.test(line)?out.push(line):(insideComment=!0,out.push(\"# \".concat(line)));return out.join(\"\\n\")},buildLocationData=function(first,last){return last?{first_line:first.first_line,first_column:first.first_column,last_line:last.last_line,last_column:last.last_column,last_line_exclusive:last.last_line_exclusive,last_column_exclusive:last.last_column_exclusive,range:[first.range[0],last.range[1]]}:first},exports.extractAllCommentTokens=function(tokens){var allCommentsObj,comment,commentKey,i,j,k,key,len1,len2,len3,ref1,results,sortedKeys,token;for(allCommentsObj={},i=0,len1=tokens.length;i<len1;i++)if(token=tokens[i],token.comments)for(ref1=token.comments,j=0,len2=ref1.length;j<len2;j++)comment=ref1[j],commentKey=comment.locationData.range[0],allCommentsObj[commentKey]=comment;for(sortedKeys=Object.keys(allCommentsObj).sort(function(a,b){return a-b}),results=[],(k=0,len3=sortedKeys.length);k<len3;k++)key=sortedKeys[k],results.push(allCommentsObj[key]);return results},buildLocationHash=function(loc){return\"\".concat(loc.range[0],\"-\").concat(loc.range[1])},exports.buildTokenDataDictionary=buildTokenDataDictionary=function(tokens){var base1,i,len1,token,tokenData,tokenHash;for(tokenData={},i=0,len1=tokens.length;i<len1;i++)if((token=tokens[i],!!token.comments)&&(tokenHash=buildLocationHash(token[2]),null==tokenData[tokenHash]&&(tokenData[tokenHash]={}),token.comments)){var _ref;(_ref=null==(base1=tokenData[tokenHash]).comments?base1.comments=[]:base1.comments).push.apply(_ref,_toConsumableArray(token.comments))}return tokenData},exports.addDataToNode=function(parserState,firstLocationData,firstValue,lastLocationData,lastValue){var forceUpdateLocation=!(5<arguments.length&&void 0!==arguments[5])||arguments[5];return function(obj){var locationData,objHash,ref1,ref2,ref3;return locationData=buildLocationData(null==(ref1=null==firstValue?void 0:firstValue.locationData)?firstLocationData:ref1,null==(ref2=null==lastValue?void 0:lastValue.locationData)?lastLocationData:ref2),null!=(null==obj?void 0:obj.updateLocationDataIfMissing)&&null!=firstLocationData?obj.updateLocationDataIfMissing(locationData,forceUpdateLocation):obj.locationData=locationData,null==parserState.tokenData&&(parserState.tokenData=buildTokenDataDictionary(parserState.parser.tokens)),null!=obj.locationData&&(objHash=buildLocationHash(obj.locationData),null!=(null==(ref3=parserState.tokenData[objHash])?void 0:ref3.comments)&&attachCommentsToNode(parserState.tokenData[objHash].comments,obj)),obj}},exports.attachCommentsToNode=attachCommentsToNode=function(comments,node){var _node$comments;if(null!=comments&&0!==comments.length)return null==node.comments&&(node.comments=[]),(_node$comments=node.comments).push.apply(_node$comments,_toConsumableArray(comments))},exports.locationDataToString=function(obj){var locationData;return\"2\"in obj&&\"first_line\"in obj[2]?locationData=obj[2]:\"first_line\"in obj&&(locationData=obj),locationData?\"\".concat(locationData.first_line+1,\":\").concat(locationData.first_column+1,\"-\")+\"\".concat(locationData.last_line+1,\":\").concat(locationData.last_column+1):\"No location data\"},exports.anonymousFileName=function(){var n;return n=0,function(){return\"<anonymous-\".concat(n++,\">\")}}(),exports.baseFileName=function(file){var stripExt=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],useWinPathSep=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],parts,pathSep;return(pathSep=useWinPathSep?/\\\\|\\//:/\\//,parts=file.split(pathSep),file=parts[parts.length-1],!(stripExt&&0<=file.indexOf(\".\")))?file:(parts=file.split(\".\"),parts.pop(),\"coffee\"===parts[parts.length-1]&&1<parts.length&&parts.pop(),parts.join(\".\"))},exports.isCoffee=function(file){return /\\.((lit)?coffee|coffee\\.md)$/.test(file)},exports.isLiterate=function(file){return /\\.(litcoffee|coffee\\.md)$/.test(file)},exports.throwSyntaxError=function(message,location){var error;throw error=new SyntaxError(message),error.location=location,error.toString=syntaxErrorToString,error.stack=error.toString(),error},exports.updateSyntaxError=function(error,code,filename){return error.toString===syntaxErrorToString&&(error.code||(error.code=code),error.filename||(error.filename=filename),error.stack=error.toString()),error},syntaxErrorToString=function(){var codeLine,colorize,colorsEnabled,end,filename,first_column,first_line,last_column,last_line,marker,ref1,ref2,ref3,ref4,start;if(!(this.code&&this.location))return Error.prototype.toString.call(this);var _this$location=this.location;return first_line=_this$location.first_line,first_column=_this$location.first_column,last_line=_this$location.last_line,last_column=_this$location.last_column,null==last_line&&(last_line=first_line),null==last_column&&(last_column=first_column),filename=(null==(ref1=this.filename)?void 0:ref1.startsWith(\"<anonymous\"))?\"[stdin]\":this.filename||\"[stdin]\",codeLine=this.code.split(\"\\n\")[first_line],start=first_column,end=first_line===last_line?last_column+1:codeLine.length,marker=codeLine.slice(0,start).replace(/[^\\s]/g,\" \")+repeat(\"^\",end-start),\"undefined\"!=typeof process&&null!==process&&(colorsEnabled=(null==(ref2=process.stdout)?void 0:ref2.isTTY)&&(null==(ref3=process.env)||!ref3.NODE_DISABLE_COLORS)),(null==(ref4=this.colorful)?colorsEnabled:ref4)&&(colorize=function(str){return\"\\x1B[1;31m\".concat(str,\"\\x1B[0m\")},codeLine=codeLine.slice(0,start)+colorize(codeLine.slice(start,end))+codeLine.slice(end),marker=colorize(marker)),\"\".concat(filename,\":\").concat(first_line+1,\":\").concat(first_column+1,\": error: \").concat(this.message,\"\\n\").concat(codeLine,\"\\n\").concat(marker)},exports.nameWhitespaceCharacter=function(string){return\" \"===string?\"space\":\"\\n\"===string?\"newline\":\"\\r\"===string?\"carriage return\":\"\\t\"===string?\"tab\":string},exports.parseNumber=function(string){var base;return null==string?0/0:(base=function(){switch(string.charAt(1)){case\"b\":return 2;case\"o\":return 8;case\"x\":return 16;default:return null;}}(),null==base?parseFloat(string.replace(/_/g,\"\")):parseInt(string.slice(2).replace(/_/g,\"\"),base))},exports.isFunction=function(obj){return\"[object Function]\"===Object.prototype.toString.call(obj)},exports.isNumber=isNumber=function(obj){return\"[object Number]\"===Object.prototype.toString.call(obj)},exports.isString=isString=function(obj){return\"[object String]\"===Object.prototype.toString.call(obj)},exports.isBoolean=isBoolean=function(obj){return!0===obj||!1===obj||\"[object Boolean]\"===Object.prototype.toString.call(obj)},exports.isPlainObject=function(obj){return\"object\"===_typeof(obj)&&!!obj&&!Array.isArray(obj)&&!isNumber(obj)&&!isString(obj)&&!isBoolean(obj)},unicodeCodePointToUnicodeEscapes=function(codePoint){var high,low,toUnicodeEscape;return(toUnicodeEscape=function(val){var str;return str=val.toString(16),\"\\\\u\".concat(repeat(\"0\",4-str.length)).concat(str)},65536>codePoint)?toUnicodeEscape(codePoint):(high=_Mathfloor((codePoint-65536)/1024)+55296,low=(codePoint-65536)%1024+56320,\"\".concat(toUnicodeEscape(high)).concat(toUnicodeEscape(low)))},exports.replaceUnicodeCodePointEscapes=function(str){var _ref2=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},flags=_ref2.flags,error=_ref2.error,_ref2$delimiter=_ref2.delimiter,delimiter=void 0===_ref2$delimiter?\"\":_ref2$delimiter,shouldReplace;return shouldReplace=null!=flags&&0>indexOf.call(flags,\"u\"),str.replace(UNICODE_CODE_POINT_ESCAPE,function(match,escapedBackslash,codePointHex,offset){var codePointDecimal;return escapedBackslash?escapedBackslash:(codePointDecimal=parseInt(codePointHex,16),1114111<codePointDecimal&&error(\"unicode code point escapes greater than \\\\u{10ffff} are not allowed\",{offset:offset+delimiter.length,length:codePointHex.length+4}),shouldReplace?unicodeCodePointToUnicodeEscapes(codePointDecimal):match)})},UNICODE_CODE_POINT_ESCAPE=/(\\\\\\\\)|\\\\u\\{([\\da-fA-F]+)\\}/g}.call(this),{exports:exports}.exports}(),require[\"./rewriter\"]=function(){var exports={};return function(){var indexOf=[].indexOf,hasProp={}.hasOwnProperty,_require=require(\"./helpers\"),BALANCED_PAIRS,CALL_CLOSERS,CONTROL_IN_IMPLICIT,DISCARDED,EXPRESSION_CLOSE,EXPRESSION_END,EXPRESSION_START,IMPLICIT_CALL,IMPLICIT_END,IMPLICIT_FUNC,IMPLICIT_UNSPACED_CALL,INVERSES,LINEBREAKS,Rewriter,SINGLE_CLOSERS,SINGLE_LINERS,UNFINISHED,extractAllCommentTokens,generate,k,left,len,moveComments,right,throwSyntaxError;for(throwSyntaxError=_require.throwSyntaxError,extractAllCommentTokens=_require.extractAllCommentTokens,moveComments=function(fromToken,toToken){var comment,k,len,ref,unshiftedComments;if(fromToken.comments){if(toToken.comments&&0!==toToken.comments.length){for(unshiftedComments=[],ref=fromToken.comments,(k=0,len=ref.length);k<len;k++)comment=ref[k],comment.unshift?unshiftedComments.push(comment):toToken.comments.push(comment);toToken.comments=unshiftedComments.concat(toToken.comments)}else toToken.comments=fromToken.comments;return delete fromToken.comments}},generate=function(tag,value,origin,commentsToken){var token;return token=[tag,value],token.generated=!0,origin&&(token.origin=origin),commentsToken&&moveComments(commentsToken,token),token},exports.Rewriter=Rewriter=function(){var Rewriter=function(){\"use strict\";function Rewriter(){_classCallCheck(this,Rewriter)}return _createClass(Rewriter,[{key:\"rewrite\",value:function rewrite(tokens1){var ref,ref1,t;return this.tokens=tokens1,(\"undefined\"!=typeof process&&null!==process?null==(ref=process.env)?void 0:ref.DEBUG_TOKEN_STREAM:void 0)&&(process.env.DEBUG_REWRITTEN_TOKEN_STREAM&&console.log(\"Initial token stream:\"),console.log(function(){var k,len,ref1,results;for(ref1=this.tokens,results=[],(k=0,len=ref1.length);k<len;k++)t=ref1[k],results.push(t[0]+\"/\"+t[1]+(t.comments?\"*\":\"\"));return results}.call(this).join(\" \"))),this.removeLeadingNewlines(),this.closeOpenCalls(),this.closeOpenIndexes(),this.normalizeLines(),this.tagPostfixConditionals(),this.addImplicitBracesAndParens(),this.rescueStowawayComments(),this.addLocationDataToGeneratedTokens(),this.enforceValidJSXAttributes(),this.fixIndentationLocationData(),this.exposeTokenDataToGrammar(),(\"undefined\"!=typeof process&&null!==process?null==(ref1=process.env)?void 0:ref1.DEBUG_REWRITTEN_TOKEN_STREAM:void 0)&&(process.env.DEBUG_TOKEN_STREAM&&console.log(\"Rewritten token stream:\"),console.log(function(){var k,len,ref2,results;for(ref2=this.tokens,results=[],(k=0,len=ref2.length);k<len;k++)t=ref2[k],results.push(t[0]+\"/\"+t[1]+(t.comments?\"*\":\"\"));return results}.call(this).join(\" \"))),this.tokens}},{key:\"scanTokens\",value:function scanTokens(block){var i,token,tokens;for(tokens=this.tokens,i=0;token=tokens[i];)i+=block.call(this,token,i,tokens);return!0}},{key:\"detectEnd\",value:function detectEnd(i,condition,action){var opts=3<arguments.length&&void 0!==arguments[3]?arguments[3]:{},levels,ref,ref1,token,tokens;for(tokens=this.tokens,levels=0;token=tokens[i];){if(0===levels&&condition.call(this,token,i))return action.call(this,token,i);if((ref=token[0],0<=indexOf.call(EXPRESSION_START,ref))?levels+=1:(ref1=token[0],0<=indexOf.call(EXPRESSION_END,ref1))&&(levels-=1),0>levels)return opts.returnOnNegativeLevel?void 0:action.call(this,token,i);i+=1}return i-1}},{key:\"removeLeadingNewlines\",value:function removeLeadingNewlines(){var i,k,l,leadingNewlineToken,len,len1,ref,ref1,tag;for(ref=this.tokens,i=k=0,len=ref.length;k<len;i=++k){var _ref$i=_slicedToArray(ref[i],1);if(tag=_ref$i[0],\"TERMINATOR\"!==tag)break}if(0!==i){for(ref1=this.tokens.slice(0,i),l=0,len1=ref1.length;l<len1;l++)leadingNewlineToken=ref1[l],moveComments(leadingNewlineToken,this.tokens[i]);return this.tokens.splice(0,i)}}},{key:\"closeOpenCalls\",value:function closeOpenCalls(){var action,condition;return condition=function(token){var ref;return\")\"===(ref=token[0])||\"CALL_END\"===ref},action=function(token){return token[0]=\"CALL_END\"},this.scanTokens(function(token,i){return\"CALL_START\"===token[0]&&this.detectEnd(i+1,condition,action),1})}},{key:\"closeOpenIndexes\",value:function closeOpenIndexes(){var action,condition,startToken;return startToken=null,condition=function(token){var ref;return\"]\"===(ref=token[0])||\"INDEX_END\"===ref},action=function(token,i){return this.tokens.length>=i&&\":\"===this.tokens[i+1][0]?(startToken[0]=\"[\",token[0]=\"]\"):token[0]=\"INDEX_END\"},this.scanTokens(function(token,i){return\"INDEX_START\"===token[0]&&(startToken=token,this.detectEnd(i+1,condition,action)),1})}},{key:\"indexOfTag\",value:function indexOfTag(i){var fuzz,j,k,ref,ref1;fuzz=0;for(var _len=arguments.length,pattern=Array(1<_len?_len-1:0),_key=1;_key<_len;_key++)pattern[_key-1]=arguments[_key];for(j=k=0,ref=pattern.length;0<=ref?k<ref:k>ref;j=0<=ref?++k:--k)if(null!=pattern[j]&&(\"string\"==typeof pattern[j]&&(pattern[j]=[pattern[j]]),ref1=this.tag(i+j+fuzz),0>indexOf.call(pattern[j],ref1)))return-1;return i+j+fuzz-1}},{key:\"looksObjectish\",value:function looksObjectish(j){var end,index;return-1!==this.indexOfTag(j,\"@\",null,\":\")||-1!==this.indexOfTag(j,null,\":\")||(index=this.indexOfTag(j,EXPRESSION_START),!!(-1!==index&&(end=null,this.detectEnd(index+1,function(token){var ref;return ref=token[0],0<=indexOf.call(EXPRESSION_END,ref)},function(token,i){return end=i}),\":\"===this.tag(end+1))))}},{key:\"findTagsBackwards\",value:function findTagsBackwards(i,tags){var backStack,ref,ref1,ref2,ref3,ref4,ref5;for(backStack=[];0<=i&&(backStack.length||(ref2=this.tag(i),0>indexOf.call(tags,ref2))&&((ref3=this.tag(i),0>indexOf.call(EXPRESSION_START,ref3))||this.tokens[i].generated)&&(ref4=this.tag(i),0>indexOf.call(LINEBREAKS,ref4)));)(ref=this.tag(i),0<=indexOf.call(EXPRESSION_END,ref))&&backStack.push(this.tag(i)),(ref1=this.tag(i),0<=indexOf.call(EXPRESSION_START,ref1))&&backStack.length&&backStack.pop(),i-=1;return ref5=this.tag(i),0<=indexOf.call(tags,ref5)}},{key:\"addImplicitBracesAndParens\",value:function addImplicitBracesAndParens(){var stack,start;return stack=[],start=null,this.scanTokens(function(token,i,tokens){var _this=this,_token=_slicedToArray(token,1),endImplicitCall,endImplicitObject,forward,implicitObjectContinues,implicitObjectIndent,inControlFlow,inImplicit,inImplicitCall,inImplicitControl,inImplicitObject,isImplicit,isImplicitCall,isImplicitObject,k,newLine,nextTag,nextToken,offset,preContinuationLineIndent,preObjectToken,prevTag,prevToken,ref,ref1,ref2,ref3,ref4,ref5,s,sameLine,stackIdx,stackItem,stackNext,stackTag,stackTop,startIdx,startImplicitCall,startImplicitObject,startIndex,startTag,startsLine,tag;tag=_token[0];var _prevToken=prevToken=0<i?tokens[i-1]:[],_prevToken2=_slicedToArray(_prevToken,1);prevTag=_prevToken2[0];var _nextToken=nextToken=i<tokens.length-1?tokens[i+1]:[],_nextToken2=_slicedToArray(_nextToken,1);if(nextTag=_nextToken2[0],stackTop=function(){return stack[stack.length-1]},startIdx=i,forward=function(n){return i-startIdx+n},isImplicit=function(stackItem){var ref;return null==stackItem||null==(ref=stackItem[2])?void 0:ref.ours},isImplicitObject=function(stackItem){return isImplicit(stackItem)&&\"{\"===(null==stackItem?void 0:stackItem[0])},isImplicitCall=function(stackItem){return isImplicit(stackItem)&&\"(\"===(null==stackItem?void 0:stackItem[0])},inImplicit=function(){return isImplicit(stackTop())},inImplicitCall=function(){return isImplicitCall(stackTop())},inImplicitObject=function(){return isImplicitObject(stackTop())},inImplicitControl=function(){var ref;return inImplicit()&&\"CONTROL\"===(null==(ref=stackTop())?void 0:ref[0])},startImplicitCall=function(idx){return stack.push([\"(\",idx,{ours:!0}]),tokens.splice(idx,0,generate(\"CALL_START\",\"(\",[\"\",\"implicit function call\",token[2]],prevToken))},endImplicitCall=function(){return stack.pop(),tokens.splice(i,0,generate(\"CALL_END\",\")\",[\"\",\"end of input\",token[2]],prevToken)),i+=1},startImplicitObject=function(idx){var _ref3=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref3$startsLine=_ref3.startsLine,continuationLineIndent=_ref3.continuationLineIndent,val;return stack.push([\"{\",idx,{sameLine:!0,startsLine:void 0===_ref3$startsLine||_ref3$startsLine,ours:!0,continuationLineIndent:continuationLineIndent}]),val=new String(\"{\"),val.generated=!0,tokens.splice(idx,0,generate(\"{\",val,token,prevToken))},endImplicitObject=function(j){return j=null==j?i:j,stack.pop(),tokens.splice(j,0,generate(\"}\",\"}\",token,prevToken)),i+=1},implicitObjectContinues=function(j){var nextTerminatorIdx;return nextTerminatorIdx=null,_this.detectEnd(j,function(token){return\"TERMINATOR\"===token[0]},function(token,i){return nextTerminatorIdx=i},{returnOnNegativeLevel:!0}),null!=nextTerminatorIdx&&_this.looksObjectish(nextTerminatorIdx+1)},(inImplicitCall()||inImplicitObject())&&0<=indexOf.call(CONTROL_IN_IMPLICIT,tag)||inImplicitObject()&&\":\"===prevTag&&\"FOR\"===tag)return stack.push([\"CONTROL\",i,{ours:!0}]),forward(1);if(\"INDENT\"===tag&&inImplicit()){if(\"=>\"!==prevTag&&\"->\"!==prevTag&&\"[\"!==prevTag&&\"(\"!==prevTag&&\",\"!==prevTag&&\"{\"!==prevTag&&\"ELSE\"!==prevTag&&\"=\"!==prevTag)for(;inImplicitCall()||inImplicitObject()&&\":\"!==prevTag;)inImplicitCall()?endImplicitCall():endImplicitObject();return inImplicitControl()&&stack.pop(),stack.push([tag,i]),forward(1)}if(0<=indexOf.call(EXPRESSION_START,tag))return stack.push([tag,i]),forward(1);if(0<=indexOf.call(EXPRESSION_END,tag)){for(;inImplicit();)inImplicitCall()?endImplicitCall():inImplicitObject()?endImplicitObject():stack.pop();start=stack.pop()}if(inControlFlow=function(){var controlFlow,isFunc,seenFor,tagCurrentLine;return(seenFor=_this.findTagsBackwards(i,[\"FOR\"])&&_this.findTagsBackwards(i,[\"FORIN\",\"FOROF\",\"FORFROM\"]),controlFlow=seenFor||_this.findTagsBackwards(i,[\"WHILE\",\"UNTIL\",\"LOOP\",\"LEADING_WHEN\"]),!!controlFlow)&&(isFunc=!1,tagCurrentLine=token[2].first_line,_this.detectEnd(i,function(token){var ref;return ref=token[0],0<=indexOf.call(LINEBREAKS,ref)},function(token,i){var _ref4=tokens[i-1]||[],_ref5=_slicedToArray(_ref4,3),first_line;return prevTag=_ref5[0],first_line=_ref5[2].first_line,isFunc=tagCurrentLine===first_line&&(\"->\"===prevTag||\"=>\"===prevTag)},{returnOnNegativeLevel:!0}),isFunc)},(0<=indexOf.call(IMPLICIT_FUNC,tag)&&token.spaced||\"?\"===tag&&0<i&&!tokens[i-1].spaced)&&(0<=indexOf.call(IMPLICIT_CALL,nextTag)||\"...\"===nextTag&&(ref=this.tag(i+2),0<=indexOf.call(IMPLICIT_CALL,ref))&&!this.findTagsBackwards(i,[\"INDEX_START\",\"[\"])||0<=indexOf.call(IMPLICIT_UNSPACED_CALL,nextTag)&&!nextToken.spaced&&!nextToken.newLine)&&!inControlFlow())return\"?\"===tag&&(tag=token[0]=\"FUNC_EXIST\"),startImplicitCall(i+1),forward(2);if(0<=indexOf.call(IMPLICIT_FUNC,tag)&&-1<this.indexOfTag(i+1,\"INDENT\")&&this.looksObjectish(i+2)&&!this.findTagsBackwards(i,[\"CLASS\",\"EXTENDS\",\"IF\",\"CATCH\",\"SWITCH\",\"LEADING_WHEN\",\"FOR\",\"WHILE\",\"UNTIL\"])&&(\"{\"!==(ref1=s=null==(ref2=stackTop())?void 0:ref2[0])&&\"[\"!==ref1||isImplicit(stackTop())||!this.findTagsBackwards(i,s)))return startImplicitCall(i+1),stack.push([\"INDENT\",i+2]),forward(3);if(\":\"===tag){if(s=function(){var ref3;switch(!1){case(ref3=this.tag(i-1),0>indexOf.call(EXPRESSION_END,ref3)):var _start=start,_start2=_slicedToArray(_start,2);return startTag=_start2[0],startIndex=_start2[1],\"[\"===startTag&&0<startIndex&&\"@\"===this.tag(startIndex-1)&&!tokens[startIndex-1].spaced?startIndex-1:startIndex;break;case\"@\"!==this.tag(i-2):return i-2;default:return i-1;}}.call(this),startsLine=0>=s||(ref3=this.tag(s-1),0<=indexOf.call(LINEBREAKS,ref3))||tokens[s-1].newLine,stackTop()){var _stackTop=stackTop(),_stackTop2=_slicedToArray(_stackTop,2);if(stackTag=_stackTop2[0],stackIdx=_stackTop2[1],stackNext=stack[stack.length-2],(\"{\"===stackTag||\"INDENT\"===stackTag&&\"{\"===(null==stackNext?void 0:stackNext[0])&&!isImplicit(stackNext)&&this.findTagsBackwards(stackIdx-1,[\"{\"]))&&(startsLine||\",\"===this.tag(s-1)||\"{\"===this.tag(s-1))&&(ref4=this.tag(s-1),0>indexOf.call(UNFINISHED,ref4)))return forward(1)}return preObjectToken=1<i?tokens[i-2]:[],startImplicitObject(s,{startsLine:!!startsLine,continuationLineIndent:preObjectToken.continuationLineIndent}),forward(2)}if(0<=indexOf.call(LINEBREAKS,tag))for(k=stack.length-1;0<=k&&(stackItem=stack[k],!!isImplicit(stackItem));k+=-1)isImplicitObject(stackItem)&&(stackItem[2].sameLine=!1);if(\"TERMINATOR\"===tag&&token.endsContinuationLineIndentation)for(preContinuationLineIndent=token.endsContinuationLineIndentation.preContinuationLineIndent;inImplicitObject()&&null!=(implicitObjectIndent=stackTop()[2].continuationLineIndent)&&implicitObjectIndent>preContinuationLineIndent;)endImplicitObject();if(newLine=\"OUTDENT\"===prevTag||prevToken.newLine,0<=indexOf.call(IMPLICIT_END,tag)||0<=indexOf.call(CALL_CLOSERS,tag)&&newLine||(\"..\"===tag||\"...\"===tag)&&this.findTagsBackwards(i,[\"INDEX_START\"]))for(;inImplicit();){var _stackTop3=stackTop(),_stackTop4=_slicedToArray(_stackTop3,3);stackTag=_stackTop4[0],stackIdx=_stackTop4[1];var _stackTop4$=_stackTop4[2];if(sameLine=_stackTop4$.sameLine,startsLine=_stackTop4$.startsLine,inImplicitCall()&&\",\"!==prevTag||\",\"===prevTag&&\"TERMINATOR\"===tag&&null==nextTag)endImplicitCall();else if(inImplicitObject()&&sameLine&&\"TERMINATOR\"!==tag&&\":\"!==prevTag&&!((\"POST_IF\"===tag||\"FOR\"===tag||\"WHILE\"===tag||\"UNTIL\"===tag)&&startsLine&&implicitObjectContinues(i+1)))endImplicitObject();else if(inImplicitObject()&&\"TERMINATOR\"===tag&&\",\"!==prevTag&&!(startsLine&&this.looksObjectish(i+1)))endImplicitObject();else if(inImplicitControl()&&\"CLASS\"===tokens[stackTop()[1]][0]&&\"TERMINATOR\"===tag)stack.pop();else break}if(\",\"===tag&&!this.looksObjectish(i+1)&&inImplicitObject()&&\"FOROF\"!==(ref5=this.tag(i+2))&&\"FORIN\"!==ref5&&(\"TERMINATOR\"!==nextTag||!this.looksObjectish(i+2)))for(offset=\"OUTDENT\"===nextTag?1:0;inImplicitObject();)endImplicitObject(i+offset);return forward(1)})}},{key:\"enforceValidJSXAttributes\",value:function enforceValidJSXAttributes(){return this.scanTokens(function(token,i,tokens){var next,ref;return token.jsxColon&&(next=tokens[i+1],\"STRING_START\"!==(ref=next[0])&&\"STRING\"!==ref&&\"(\"!==ref&&throwSyntaxError(\"expected wrapped or quoted JSX attribute\",next[2])),1})}},{key:\"rescueStowawayComments\",value:function rescueStowawayComments(){var dontShiftForward,insertPlaceholder,shiftCommentsBackward,shiftCommentsForward;return insertPlaceholder=function(token,j,tokens,method){return\"TERMINATOR\"!==tokens[j][0]&&tokens[method](generate(\"TERMINATOR\",\"\\n\",tokens[j])),tokens[method](generate(\"JS\",\"\",tokens[j],token))},dontShiftForward=function(i,tokens){var j,ref;for(j=i+1;j!==tokens.length&&(ref=tokens[j][0],0<=indexOf.call(DISCARDED,ref));){if(\"INTERPOLATION_END\"===tokens[j][0])return!0;j++}return!1},shiftCommentsForward=function(token,i,tokens){var comment,j,k,len,ref,ref1,ref2;for(j=i;j!==tokens.length&&(ref=tokens[j][0],0<=indexOf.call(DISCARDED,ref));)j++;if(!(j===tokens.length||(ref1=tokens[j][0],0<=indexOf.call(DISCARDED,ref1)))){for(ref2=token.comments,k=0,len=ref2.length;k<len;k++)comment=ref2[k],comment.unshift=!0;return moveComments(token,tokens[j]),1}return j=tokens.length-1,insertPlaceholder(token,j,tokens,\"push\"),1},shiftCommentsBackward=function(token,i,tokens){var j,ref,ref1;for(j=i;-1!==j&&(ref=tokens[j][0],0<=indexOf.call(DISCARDED,ref));)j--;return-1===j||(ref1=tokens[j][0],0<=indexOf.call(DISCARDED,ref1))?(insertPlaceholder(token,0,tokens,\"unshift\"),3):(moveComments(token,tokens[j]),1)},this.scanTokens(function(token,i,tokens){var dummyToken,j,ref,ref1,ret;if(!token.comments)return 1;if(ret=1,ref=token[0],0<=indexOf.call(DISCARDED,ref)){for(dummyToken={comments:[]},j=token.comments.length-1;-1!==j;)!1===token.comments[j].newLine&&!1===token.comments[j].here&&(dummyToken.comments.unshift(token.comments[j]),token.comments.splice(j,1)),j--;0!==dummyToken.comments.length&&(ret=shiftCommentsBackward(dummyToken,i-1,tokens)),0!==token.comments.length&&shiftCommentsForward(token,i,tokens)}else if(!dontShiftForward(i,tokens)){for(dummyToken={comments:[]},j=token.comments.length-1;-1!==j;)!token.comments[j].newLine||token.comments[j].unshift||\"JS\"===token[0]&&token.generated||(dummyToken.comments.unshift(token.comments[j]),token.comments.splice(j,1)),j--;0!==dummyToken.comments.length&&(ret=shiftCommentsForward(dummyToken,i+1,tokens))}return 0===(null==(ref1=token.comments)?void 0:ref1.length)&&delete token.comments,ret})}},{key:\"addLocationDataToGeneratedTokens\",value:function addLocationDataToGeneratedTokens(){return this.scanTokens(function(token,i,tokens){var column,line,nextLocation,prevLocation,rangeIndex,ref,ref1;if(token[2])return 1;if(!(token.generated||token.explicit))return 1;if(token.fromThen&&\"INDENT\"===token[0])return token[2]=token.origin[2],1;if(\"{\"===token[0]&&(nextLocation=null==(ref=tokens[i+1])?void 0:ref[2])){var _nextLocation=nextLocation;line=_nextLocation.first_line,column=_nextLocation.first_column;var _nextLocation$range=_slicedToArray(_nextLocation.range,1);rangeIndex=_nextLocation$range[0]}else if(prevLocation=null==(ref1=tokens[i-1])?void 0:ref1[2]){var _prevLocation=prevLocation;line=_prevLocation.last_line,column=_prevLocation.last_column;var _prevLocation$range=_slicedToArray(_prevLocation.range,2);rangeIndex=_prevLocation$range[1],column+=1}else line=column=0,rangeIndex=0;return token[2]={first_line:line,first_column:column,last_line:line,last_column:column,last_line_exclusive:line,last_column_exclusive:column,range:[rangeIndex,rangeIndex]},1})}},{key:\"fixIndentationLocationData\",value:function fixIndentationLocationData(){var _this2=this,findPrecedingComment;return null==this.allComments&&(this.allComments=extractAllCommentTokens(this.tokens)),findPrecedingComment=function(token,_ref6){var afterPosition=_ref6.afterPosition,indentSize=_ref6.indentSize,first=_ref6.first,indented=_ref6.indented,comment,k,l,lastMatching,matches,ref,ref1,tokenStart;if(tokenStart=token[2].range[0],matches=function(comment){return(!comment.outdented||null!=indentSize&&comment.indentSize>indentSize)&&(!indented||comment.indented)&&!!(comment.locationData.range[0]<tokenStart)&&!!(comment.locationData.range[0]>afterPosition)},first){for(lastMatching=null,ref=_this2.allComments,k=ref.length-1;0<=k;k+=-1)if(comment=ref[k],matches(comment))lastMatching=comment;else if(lastMatching)return lastMatching;return lastMatching}for(ref1=_this2.allComments,l=ref1.length-1;0<=l;l+=-1)if(comment=ref1[l],matches(comment))return comment;return null},this.scanTokens(function(token,i,tokens){var isIndent,nextToken,nextTokenIndex,precedingComment,prevLocationData,prevToken,ref,ref1,ref2,useNextToken;if(\"INDENT\"!==(ref=token[0])&&\"OUTDENT\"!==ref&&(!token.generated||\"CALL_END\"!==token[0]||null!=(ref1=token.data)&&ref1.closingTagNameToken)&&(!token.generated||\"}\"!==token[0]))return 1;if(isIndent=\"INDENT\"===token[0],prevToken=null==(ref2=token.prevToken)?tokens[i-1]:ref2,prevLocationData=prevToken[2],useNextToken=token.explicit||token.generated,useNextToken)for(nextToken=token,nextTokenIndex=i;(nextToken.explicit||nextToken.generated)&&nextTokenIndex!==tokens.length-1;)nextToken=tokens[nextTokenIndex++];return(precedingComment=findPrecedingComment(useNextToken?nextToken:token,{afterPosition:prevLocationData.range[0],indentSize:token.indentSize,first:isIndent,indented:useNextToken}),isIndent&&(null==precedingComment||!precedingComment.newLine))?1:token.generated&&\"CALL_END\"===token[0]&&(null==precedingComment?void 0:precedingComment.indented)?1:(null!=precedingComment&&(prevLocationData=precedingComment.locationData),token[2]={first_line:null==precedingComment?prevLocationData.last_line:prevLocationData.first_line,first_column:null==precedingComment?prevLocationData.last_column:isIndent?0:prevLocationData.first_column,last_line:prevLocationData.last_line,last_column:prevLocationData.last_column,last_line_exclusive:prevLocationData.last_line_exclusive,last_column_exclusive:prevLocationData.last_column_exclusive,range:isIndent&&null!=precedingComment?[prevLocationData.range[0]-precedingComment.indentSize,prevLocationData.range[1]]:prevLocationData.range},1)})}},{key:\"normalizeLines\",value:function normalizeLines(){var _this3=this,action,closeElseTag,condition,ifThens,indent,leading_if_then,leading_switch_when,outdent,starter;return starter=indent=outdent=null,leading_switch_when=null,leading_if_then=null,ifThens=[],condition=function(token,i){var ref,ref1,ref2,ref3;return\";\"!==token[1]&&(ref=token[0],0<=indexOf.call(SINGLE_CLOSERS,ref))&&!(\"TERMINATOR\"===token[0]&&(ref1=this.tag(i+1),0<=indexOf.call(EXPRESSION_CLOSE,ref1)))&&!(\"ELSE\"===token[0]&&(\"THEN\"!==starter||leading_if_then||leading_switch_when))&&(\"CATCH\"!==(ref2=token[0])&&\"FINALLY\"!==ref2||\"->\"!==starter&&\"=>\"!==starter)||(ref3=token[0],0<=indexOf.call(CALL_CLOSERS,ref3))&&(this.tokens[i-1].newLine||\"OUTDENT\"===this.tokens[i-1][0])},action=function(token,i){return\"ELSE\"===token[0]&&\"THEN\"===starter&&ifThens.pop(),this.tokens.splice(\",\"===this.tag(i-1)?i-1:i,0,outdent)},closeElseTag=function(tokens,i){var lastThen,outdentElse,tlen;if(tlen=ifThens.length,!(0<tlen))return i;lastThen=ifThens.pop();var _this3$indentation=_this3.indentation(tokens[lastThen]),_this3$indentation2=_slicedToArray(_this3$indentation,2);return outdentElse=_this3$indentation2[1],outdentElse[1]=2*tlen,tokens.splice(i,0,outdentElse),outdentElse[1]=2,tokens.splice(i+1,0,outdentElse),_this3.detectEnd(i+2,function(token){var ref;return\"OUTDENT\"===(ref=token[0])||\"TERMINATOR\"===ref},function(token,i){if(\"OUTDENT\"===this.tag(i)&&\"OUTDENT\"===this.tag(i+1))return tokens.splice(i,2)}),i+2},this.scanTokens(function(token,i,tokens){var _token2=_slicedToArray(token,1),conditionTag,j,k,ref,ref1,ref2,tag;if(tag=_token2[0],conditionTag=(\"->\"===tag||\"=>\"===tag)&&this.findTagsBackwards(i,[\"IF\",\"WHILE\",\"FOR\",\"UNTIL\",\"SWITCH\",\"WHEN\",\"LEADING_WHEN\",\"[\",\"INDEX_START\"])&&!this.findTagsBackwards(i,[\"THEN\",\"..\",\"...\"]),\"TERMINATOR\"===tag){if(\"ELSE\"===this.tag(i+1)&&\"OUTDENT\"!==this.tag(i-1))return tokens.splice.apply(tokens,[i,1].concat(_toConsumableArray(this.indentation()))),1;if(ref=this.tag(i+1),0<=indexOf.call(EXPRESSION_CLOSE,ref))return\";\"===token[1]&&\"OUTDENT\"===this.tag(i+1)&&(tokens[i+1].prevToken=token,moveComments(token,tokens[i+1])),tokens.splice(i,1),0}if(\"CATCH\"===tag)for(j=k=1;2>=k;j=++k)if(\"OUTDENT\"===(ref1=this.tag(i+j))||\"TERMINATOR\"===ref1||\"FINALLY\"===ref1)return tokens.splice.apply(tokens,[i+j,0].concat(_toConsumableArray(this.indentation()))),2+j;if((\"->\"===tag||\"=>\"===tag)&&(\",\"===(ref2=this.tag(i+1))||\"]\"===ref2||\".\"===this.tag(i+1)&&token.newLine)){var _this$indentation=this.indentation(tokens[i]),_this$indentation2=_slicedToArray(_this$indentation,2);return indent=_this$indentation2[0],outdent=_this$indentation2[1],tokens.splice(i+1,0,indent,outdent),1}if(0<=indexOf.call(SINGLE_LINERS,tag)&&\"INDENT\"!==this.tag(i+1)&&(\"ELSE\"!==tag||\"IF\"!==this.tag(i+1))&&!conditionTag){starter=tag;var _this$indentation3=this.indentation(tokens[i]),_this$indentation4=_slicedToArray(_this$indentation3,2);return indent=_this$indentation4[0],outdent=_this$indentation4[1],\"THEN\"===starter&&(indent.fromThen=!0),\"THEN\"===tag&&(leading_switch_when=this.findTagsBackwards(i,[\"LEADING_WHEN\"])&&\"IF\"===this.tag(i+1),leading_if_then=this.findTagsBackwards(i,[\"IF\"])&&\"IF\"===this.tag(i+1)),\"THEN\"===tag&&this.findTagsBackwards(i,[\"IF\"])&&ifThens.push(i),\"ELSE\"===tag&&\"OUTDENT\"!==this.tag(i-1)&&(i=closeElseTag(tokens,i)),tokens.splice(i+1,0,indent),this.detectEnd(i+2,condition,action),\"THEN\"===tag&&tokens.splice(i,1),1}return 1})}},{key:\"tagPostfixConditionals\",value:function tagPostfixConditionals(){var action,condition,original;return original=null,condition=function(token,i){var _token3=_slicedToArray(token,1),prevTag,tag;tag=_token3[0];var _this$tokens=_slicedToArray(this.tokens[i-1],1);return prevTag=_this$tokens[0],\"TERMINATOR\"===tag||\"INDENT\"===tag&&0>indexOf.call(SINGLE_LINERS,prevTag)},action=function(token){if(\"INDENT\"!==token[0]||token.generated&&!token.fromThen)return original[0]=\"POST_\"+original[0]},this.scanTokens(function(token,i){return\"IF\"===token[0]?(original=token,this.detectEnd(i+1,condition,action),1):1})}},{key:\"exposeTokenDataToGrammar\",value:function exposeTokenDataToGrammar(){return this.scanTokens(function(token){var key,ref,ref1,val;if(token.generated||token.data&&0!==Object.keys(token.data).length){for(key in token[1]=new String(token[1]),ref1=null==(ref=token.data)?{}:ref,ref1)hasProp.call(ref1,key)&&(val=ref1[key],token[1][key]=val);token.generated&&(token[1].generated=!0)}return 1})}},{key:\"indentation\",value:function indentation(origin){var indent,outdent;return indent=[\"INDENT\",2],outdent=[\"OUTDENT\",2],origin?(indent.generated=outdent.generated=!0,indent.origin=outdent.origin=origin):indent.explicit=outdent.explicit=!0,[indent,outdent]}},{key:\"tag\",value:function tag(i){var ref;return null==(ref=this.tokens[i])?void 0:ref[0]}}]),Rewriter}();return Rewriter.prototype.generate=generate,Rewriter}.call(this),BALANCED_PAIRS=[[\"(\",\")\"],[\"[\",\"]\"],[\"{\",\"}\"],[\"INDENT\",\"OUTDENT\"],[\"CALL_START\",\"CALL_END\"],[\"PARAM_START\",\"PARAM_END\"],[\"INDEX_START\",\"INDEX_END\"],[\"STRING_START\",\"STRING_END\"],[\"INTERPOLATION_START\",\"INTERPOLATION_END\"],[\"REGEX_START\",\"REGEX_END\"]],exports.INVERSES=INVERSES={},EXPRESSION_START=[],EXPRESSION_END=[],(k=0,len=BALANCED_PAIRS.length);k<len;k++){var _BALANCED_PAIRS$k=_slicedToArray(BALANCED_PAIRS[k],2);left=_BALANCED_PAIRS$k[0],right=_BALANCED_PAIRS$k[1],EXPRESSION_START.push(INVERSES[right]=left),EXPRESSION_END.push(INVERSES[left]=right)}EXPRESSION_CLOSE=[\"CATCH\",\"THEN\",\"ELSE\",\"FINALLY\"].concat(EXPRESSION_END),IMPLICIT_FUNC=[\"IDENTIFIER\",\"PROPERTY\",\"SUPER\",\")\",\"CALL_END\",\"]\",\"INDEX_END\",\"@\",\"THIS\"],IMPLICIT_CALL=[\"IDENTIFIER\",\"JSX_TAG\",\"PROPERTY\",\"NUMBER\",\"INFINITY\",\"NAN\",\"STRING\",\"STRING_START\",\"REGEX\",\"REGEX_START\",\"JS\",\"NEW\",\"PARAM_START\",\"CLASS\",\"IF\",\"TRY\",\"SWITCH\",\"THIS\",\"DYNAMIC_IMPORT\",\"IMPORT_META\",\"NEW_TARGET\",\"UNDEFINED\",\"NULL\",\"BOOL\",\"UNARY\",\"DO\",\"DO_IIFE\",\"YIELD\",\"AWAIT\",\"UNARY_MATH\",\"SUPER\",\"THROW\",\"@\",\"->\",\"=>\",\"[\",\"(\",\"{\",\"--\",\"++\"],IMPLICIT_UNSPACED_CALL=[\"+\",\"-\"],IMPLICIT_END=[\"POST_IF\",\"FOR\",\"WHILE\",\"UNTIL\",\"WHEN\",\"BY\",\"LOOP\",\"TERMINATOR\"],SINGLE_LINERS=[\"ELSE\",\"->\",\"=>\",\"TRY\",\"FINALLY\",\"THEN\"],SINGLE_CLOSERS=[\"TERMINATOR\",\"CATCH\",\"FINALLY\",\"ELSE\",\"OUTDENT\",\"LEADING_WHEN\"],LINEBREAKS=[\"TERMINATOR\",\"INDENT\",\"OUTDENT\"],CALL_CLOSERS=[\".\",\"?.\",\"::\",\"?::\"],CONTROL_IN_IMPLICIT=[\"IF\",\"TRY\",\"FINALLY\",\"CATCH\",\"CLASS\",\"SWITCH\"],DISCARDED=[\"(\",\")\",\"[\",\"]\",\"{\",\"}\",\":\",\".\",\"..\",\"...\",\",\",\"=\",\"++\",\"--\",\"?\",\"AS\",\"AWAIT\",\"CALL_START\",\"CALL_END\",\"DEFAULT\",\"DO\",\"DO_IIFE\",\"ELSE\",\"EXTENDS\",\"EXPORT\",\"FORIN\",\"FOROF\",\"FORFROM\",\"IMPORT\",\"INDENT\",\"INDEX_SOAK\",\"INTERPOLATION_START\",\"INTERPOLATION_END\",\"LEADING_WHEN\",\"OUTDENT\",\"PARAM_END\",\"REGEX_START\",\"REGEX_END\",\"RETURN\",\"STRING_END\",\"THROW\",\"UNARY\",\"YIELD\"].concat(IMPLICIT_UNSPACED_CALL.concat(IMPLICIT_END.concat(CALL_CLOSERS.concat(CONTROL_IN_IMPLICIT)))),exports.UNFINISHED=UNFINISHED=[\"\\\\\",\".\",\"?.\",\"?::\",\"UNARY\",\"DO\",\"DO_IIFE\",\"MATH\",\"UNARY_MATH\",\"+\",\"-\",\"**\",\"SHIFT\",\"RELATION\",\"COMPARE\",\"&\",\"^\",\"|\",\"&&\",\"||\",\"BIN?\",\"EXTENDS\"]}.call(this),{exports:exports}.exports}(),require[\"./lexer\"]=function(){var exports={};return function(){var indexOf=[].indexOf,slice=[].slice,_require2=require(\"./rewriter\"),BOM,BOOL,CALLABLE,CODE,COFFEE_ALIASES,COFFEE_ALIAS_MAP,COFFEE_KEYWORDS,COMMENT,COMPARABLE_LEFT_SIDE,COMPARE,COMPOUND_ASSIGN,HERECOMMENT_ILLEGAL,HEREDOC_DOUBLE,HEREDOC_INDENT,HEREDOC_SINGLE,HEREGEX,HEREGEX_COMMENT,HERE_JSTOKEN,IDENTIFIER,INDENTABLE_CLOSERS,INDEXABLE,INSIDE_JSX,INVERSES,JSTOKEN,JSX_ATTRIBUTE,JSX_FRAGMENT_IDENTIFIER,JSX_IDENTIFIER,JSX_IDENTIFIER_PART,JSX_INTERPOLATION,JS_KEYWORDS,LINE_BREAK,LINE_CONTINUER,Lexer,MATH,MULTI_DENT,NOT_REGEX,NUMBER,OPERATOR,POSSIBLY_DIVISION,REGEX,REGEX_FLAGS,REGEX_ILLEGAL,REGEX_INVALID_ESCAPE,RELATION,RESERVED,Rewriter,SHIFT,STRICT_PROSCRIBED,STRING_DOUBLE,STRING_INVALID_ESCAPE,STRING_SINGLE,STRING_START,TRAILING_SPACES,UNARY,UNARY_MATH,UNFINISHED,VALID_FLAGS,WHITESPACE,addTokenData,attachCommentsToNode,compact,count,flatten,invertLiterate,isForFrom,isUnassignable,key,locationDataToString,merge,parseNumber,repeat,replaceUnicodeCodePointEscapes,starts,throwSyntaxError;Rewriter=_require2.Rewriter,INVERSES=_require2.INVERSES,UNFINISHED=_require2.UNFINISHED;var _require3=require(\"./helpers\");count=_require3.count,starts=_require3.starts,compact=_require3.compact,repeat=_require3.repeat,invertLiterate=_require3.invertLiterate,merge=_require3.merge,attachCommentsToNode=_require3.attachCommentsToNode,locationDataToString=_require3.locationDataToString,throwSyntaxError=_require3.throwSyntaxError,replaceUnicodeCodePointEscapes=_require3.replaceUnicodeCodePointEscapes,flatten=_require3.flatten,parseNumber=_require3.parseNumber,exports.Lexer=Lexer=function(){\"use strict\";function Lexer(){_classCallCheck(this,Lexer),this.error=this.error.bind(this)}return _createClass(Lexer,[{key:\"tokenize\",value:function tokenize(code){var opts=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},consumed,end,i,ref;for(this.literate=opts.literate,this.indent=0,this.baseIndent=0,this.continuationLineAdditionalIndent=0,this.outdebt=0,this.indents=[],this.indentLiteral=\"\",this.ends=[],this.tokens=[],this.seenFor=!1,this.seenImport=!1,this.seenExport=!1,this.importSpecifierList=!1,this.exportSpecifierList=!1,this.jsxDepth=0,this.jsxObjAttribute={},this.chunkLine=opts.line||0,this.chunkColumn=opts.column||0,this.chunkOffset=opts.offset||0,this.locationDataCompensations=opts.locationDataCompensations||{},code=this.clean(code),i=0;this.chunk=code.slice(i);){consumed=this.identifierToken()||this.commentToken()||this.whitespaceToken()||this.lineToken()||this.stringToken()||this.numberToken()||this.jsxToken()||this.regexToken()||this.jsToken()||this.literalToken();var _this$getLineAndColum=this.getLineAndColumnFromChunk(consumed),_this$getLineAndColum2=_slicedToArray(_this$getLineAndColum,3);if(this.chunkLine=_this$getLineAndColum2[0],this.chunkColumn=_this$getLineAndColum2[1],this.chunkOffset=_this$getLineAndColum2[2],i+=consumed,opts.untilBalanced&&0===this.ends.length)return{tokens:this.tokens,index:i}}return this.closeIndentation(),(end=this.ends.pop())&&this.error(\"missing \".concat(end.tag),(null==(ref=end.origin)?end:ref)[2]),!1===opts.rewrite?this.tokens:new Rewriter().rewrite(this.tokens)}},{key:\"clean\",value:function clean(code){var _this4=this,base,thusFar;return thusFar=0,code.charCodeAt(0)===BOM&&(code=code.slice(1),this.locationDataCompensations[0]=1,thusFar+=1),WHITESPACE.test(code)&&(code=\"\\n\".concat(code),this.chunkLine--,null==(base=this.locationDataCompensations)[0]&&(base[0]=0),this.locationDataCompensations[0]-=1),code=code.replace(/\\r/g,function(match,offset){return _this4.locationDataCompensations[thusFar+offset]=1,\"\"}).replace(TRAILING_SPACES,\"\"),this.literate&&(code=invertLiterate(code)),code}},{key:\"identifierToken\",value:function identifierToken(){var alias,colon,colonOffset,colonToken,id,idLength,inJSXTag,input,match,poppedToken,prev,prevprev,ref,ref1,ref10,ref11,ref12,ref2,ref3,ref4,ref5,ref6,ref7,ref8,ref9,regExSuper,regex,sup,tag,tagToken,tokenData;if(inJSXTag=this.atJSXTag(),regex=inJSXTag?JSX_ATTRIBUTE:IDENTIFIER,!(match=regex.exec(this.chunk)))return 0;var _match=match,_match2=_slicedToArray(_match,3);if(input=_match2[0],id=_match2[1],colon=_match2[2],idLength=id.length,poppedToken=void 0,\"own\"===id&&\"FOR\"===this.tag())return this.token(\"OWN\",id),id.length;if(\"from\"===id&&\"YIELD\"===this.tag())return this.token(\"FROM\",id),id.length;if(\"as\"===id&&this.seenImport){if(\"*\"===this.value())this.tokens[this.tokens.length-1][0]=\"IMPORT_ALL\";else if(ref=this.value(!0),0<=indexOf.call(COFFEE_KEYWORDS,ref)){prev=this.prev();var _ref7=[\"IDENTIFIER\",this.value(!0)];prev[0]=_ref7[0],prev[1]=_ref7[1]}if(\"DEFAULT\"===(ref1=this.tag())||\"IMPORT_ALL\"===ref1||\"IDENTIFIER\"===ref1)return this.token(\"AS\",id),id.length}if(\"as\"===id&&this.seenExport){if(\"IDENTIFIER\"===(ref2=this.tag())||\"DEFAULT\"===ref2)return this.token(\"AS\",id),id.length;if(ref3=this.value(!0),0<=indexOf.call(COFFEE_KEYWORDS,ref3)){prev=this.prev();var _ref8=[\"IDENTIFIER\",this.value(!0)];return prev[0]=_ref8[0],prev[1]=_ref8[1],this.token(\"AS\",id),id.length}}if(\"default\"===id&&this.seenExport&&(\"EXPORT\"===(ref4=this.tag())||\"AS\"===ref4))return this.token(\"DEFAULT\",id),id.length;if(\"assert\"===id&&(this.seenImport||this.seenExport)&&\"STRING\"===this.tag())return this.token(\"ASSERT\",id),id.length;if(\"do\"===id&&(regExSuper=/^(\\s*super)(?!\\(\\))/.exec(this.chunk.slice(3)))){this.token(\"SUPER\",\"super\"),this.token(\"CALL_START\",\"(\"),this.token(\"CALL_END\",\")\");var _regExSuper=regExSuper,_regExSuper2=_slicedToArray(_regExSuper,2);return input=_regExSuper2[0],sup=_regExSuper2[1],sup.length+3}if(prev=this.prev(),tag=colon||null!=prev&&(\".\"===(ref5=prev[0])||\"?.\"===ref5||\"::\"===ref5||\"?::\"===ref5||!prev.spaced&&\"@\"===prev[0])?\"PROPERTY\":\"IDENTIFIER\",tokenData={},\"IDENTIFIER\"===tag&&(0<=indexOf.call(JS_KEYWORDS,id)||0<=indexOf.call(COFFEE_KEYWORDS,id))&&!(this.exportSpecifierList&&0<=indexOf.call(COFFEE_KEYWORDS,id))?(tag=id.toUpperCase(),\"WHEN\"===tag&&(ref6=this.tag(),0<=indexOf.call(LINE_BREAK,ref6))?tag=\"LEADING_WHEN\":\"FOR\"===tag?this.seenFor={endsLength:this.ends.length}:\"UNLESS\"===tag?tag=\"IF\":\"IMPORT\"===tag?this.seenImport=!0:\"EXPORT\"===tag?this.seenExport=!0:0<=indexOf.call(UNARY,tag)?tag=\"UNARY\":0<=indexOf.call(RELATION,tag)&&(\"INSTANCEOF\"!==tag&&this.seenFor?(tag=\"FOR\"+tag,this.seenFor=!1):(tag=\"RELATION\",\"!\"===this.value()&&(poppedToken=this.tokens.pop(),tokenData.invert=null==(ref7=null==(ref8=poppedToken.data)?void 0:ref8.original)?poppedToken[1]:ref7)))):\"IDENTIFIER\"===tag&&this.seenFor&&\"from\"===id&&isForFrom(prev)?(tag=\"FORFROM\",this.seenFor=!1):\"PROPERTY\"===tag&&prev&&(prev.spaced&&(ref9=prev[0],0<=indexOf.call(CALLABLE,ref9))&&/^[gs]et$/.test(prev[1])&&1<this.tokens.length&&\".\"!==(ref10=this.tokens[this.tokens.length-2][0])&&\"?.\"!==ref10&&\"@\"!==ref10?this.error(\"'\".concat(prev[1],\"' cannot be used as a keyword, or as a function call without parentheses\"),prev[2]):\".\"===prev[0]&&1<this.tokens.length&&\"UNARY\"===(prevprev=this.tokens[this.tokens.length-2])[0]&&\"new\"===prevprev[1]?prevprev[0]=\"NEW_TARGET\":\".\"===prev[0]&&1<this.tokens.length&&\"IMPORT\"===(prevprev=this.tokens[this.tokens.length-2])[0]&&\"import\"===prevprev[1]?(this.seenImport=!1,prevprev[0]=\"IMPORT_META\"):2<this.tokens.length&&(prevprev=this.tokens[this.tokens.length-2],(\"@\"===(ref11=prev[0])||\"THIS\"===ref11)&&prevprev&&prevprev.spaced&&/^[gs]et$/.test(prevprev[1])&&\".\"!==(ref12=this.tokens[this.tokens.length-3][0])&&\"?.\"!==ref12&&\"@\"!==ref12&&this.error(\"'\".concat(prevprev[1],\"' cannot be used as a keyword, or as a function call without parentheses\"),prevprev[2]))),\"IDENTIFIER\"===tag&&0<=indexOf.call(RESERVED,id)&&!inJSXTag&&this.error(\"reserved word '\".concat(id,\"'\"),{length:id.length}),\"PROPERTY\"===tag||this.exportSpecifierList||this.importSpecifierList||(0<=indexOf.call(COFFEE_ALIASES,id)&&(alias=id,id=COFFEE_ALIAS_MAP[id],tokenData.original=alias),tag=function(){return\"!\"===id?\"UNARY\":\"==\"===id||\"!=\"===id?\"COMPARE\":\"true\"===id||\"false\"===id?\"BOOL\":\"break\"===id||\"continue\"===id||\"debugger\"===id?\"STATEMENT\":\"&&\"===id||\"||\"===id?id:tag}()),tagToken=this.token(tag,id,{length:idLength,data:tokenData}),alias&&(tagToken.origin=[tag,alias,tagToken[2]]),poppedToken){var _ref9=[poppedToken[2].first_line,poppedToken[2].first_column,poppedToken[2].range[0]];tagToken[2].first_line=_ref9[0],tagToken[2].first_column=_ref9[1],tagToken[2].range[0]=_ref9[2]}return colon&&(colonOffset=input.lastIndexOf(inJSXTag?\"=\":\":\"),colonToken=this.token(\":\",\":\",{offset:colonOffset}),inJSXTag&&(colonToken.jsxColon=!0)),inJSXTag&&\"IDENTIFIER\"===tag&&\":\"!==prev[0]&&this.token(\",\",\",\",{length:0,origin:tagToken,generated:!0}),input.length}},{key:\"numberToken\",value:function numberToken(){var lexedLength,match,number,parsedValue,tag,tokenData;if(!(match=NUMBER.exec(this.chunk)))return 0;switch(number=match[0],lexedLength=number.length,!1){case!/^0[BOX]/.test(number):this.error(\"radix prefix in '\".concat(number,\"' must be lowercase\"),{offset:1});break;case!/^0\\d*[89]/.test(number):this.error(\"decimal literal '\".concat(number,\"' must not be prefixed with '0'\"),{length:lexedLength});break;case!/^0\\d+/.test(number):this.error(\"octal literal '\".concat(number,\"' must be prefixed with '0o'\"),{length:lexedLength});}return parsedValue=parseNumber(number),tokenData={parsedValue:parsedValue},tag=2e308===parsedValue?\"INFINITY\":\"NUMBER\",\"INFINITY\"===tag&&(tokenData.original=number),this.token(tag,number,{length:lexedLength,data:tokenData}),lexedLength}},{key:\"stringToken\",value:function stringToken(){var _this5=this,_ref10=STRING_START.exec(this.chunk)||[],_ref11=_slicedToArray(_ref10,1),attempt,delimiter,doc,end,heredoc,i,indent,match,prev,quote,ref,regex,token,tokens;if(quote=_ref11[0],!quote)return 0;prev=this.prev(),prev&&\"from\"===this.value()&&(this.seenImport||this.seenExport)&&(prev[0]=\"FROM\"),regex=function(){return\"'\"===quote?STRING_SINGLE:\"\\\"\"===quote?STRING_DOUBLE:\"'''\"===quote?HEREDOC_SINGLE:\"\\\"\\\"\\\"\"===quote?HEREDOC_DOUBLE:void 0}();var _this$matchWithInterp=this.matchWithInterpolations(regex,quote);if(tokens=_this$matchWithInterp.tokens,end=_this$matchWithInterp.index,heredoc=3===quote.length,heredoc)for(indent=null,doc=function(){var j,len,results;for(results=[],i=j=0,len=tokens.length;j<len;i=++j)token=tokens[i],\"NEOSTRING\"===token[0]&&results.push(token[1]);return results}().join(\"#{}\");match=HEREDOC_INDENT.exec(doc);)attempt=match[1],(null===indent||0<(ref=attempt.length)&&ref<indent.length)&&(indent=attempt);return delimiter=quote.charAt(0),this.mergeInterpolationTokens(tokens,{quote:quote,indent:indent,endOffset:end},function(value){return _this5.validateUnicodeCodePointEscapes(value,{delimiter:quote})}),this.atJSXTag()&&this.token(\",\",\",\",{length:0,origin:this.prev,generated:!0}),end}},{key:\"commentToken\",value:function commentToken(){var chunk=0<arguments.length&&void 0!==arguments[0]?arguments[0]:this.chunk,_ref12=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},heregex=_ref12.heregex,_ref12$returnCommentT=_ref12.returnCommentTokens,_ref12$offsetInChunk=_ref12.offsetInChunk,offsetInChunk=void 0===_ref12$offsetInChunk?0:_ref12$offsetInChunk,commentAttachment,commentAttachments,commentWithSurroundingWhitespace,content,contents,getIndentSize,hasSeenFirstCommentLine,hereComment,hereLeadingWhitespace,hereTrailingWhitespace,i,indentSize,leadingNewline,leadingNewlineOffset,leadingNewlines,leadingWhitespace,length,lineComment,match,matchIllegal,noIndent,nonInitial,placeholderToken,precededByBlankLine,precedingNonCommentLines,prev;if(!(match=chunk.match(COMMENT)))return 0;var _match3=match,_match4=_slicedToArray(_match3,5);return commentWithSurroundingWhitespace=_match4[0],hereLeadingWhitespace=_match4[1],hereComment=_match4[2],hereTrailingWhitespace=_match4[3],lineComment=_match4[4],contents=null,leadingNewline=/^\\s*\\n+\\s*#/.test(commentWithSurroundingWhitespace),hereComment?(matchIllegal=HERECOMMENT_ILLEGAL.exec(hereComment),matchIllegal&&this.error(\"block comments cannot contain \".concat(matchIllegal[0]),{offset:\"###\".length+matchIllegal.index,length:matchIllegal[0].length}),chunk=chunk.replace(\"###\".concat(hereComment,\"###\"),\"\"),chunk=chunk.replace(/^\\n+/,\"\"),this.lineToken({chunk:chunk}),content=hereComment,contents=[{content:content,length:commentWithSurroundingWhitespace.length-hereLeadingWhitespace.length-hereTrailingWhitespace.length,leadingWhitespace:hereLeadingWhitespace}]):(leadingNewlines=\"\",content=lineComment.replace(/^(\\n*)/,function(leading){return leadingNewlines=leading,\"\"}),precedingNonCommentLines=\"\",hasSeenFirstCommentLine=!1,contents=content.split(\"\\n\").map(function(line){var comment,leadingWhitespace;return-1<line.indexOf(\"#\")?(leadingWhitespace=\"\",content=line.replace(/^([ |\\t]*)#/,function(_,whitespace){return leadingWhitespace=whitespace,\"\"}),comment={content:content,length:\"#\".length+content.length,leadingWhitespace:\"\".concat(hasSeenFirstCommentLine?\"\":leadingNewlines).concat(precedingNonCommentLines).concat(leadingWhitespace),precededByBlankLine:!!precedingNonCommentLines},hasSeenFirstCommentLine=!0,precedingNonCommentLines=\"\",comment):void(precedingNonCommentLines+=\"\\n\".concat(line))}).filter(function(comment){return comment})),getIndentSize=function(_ref13){var leadingWhitespace=_ref13.leadingWhitespace,nonInitial=_ref13.nonInitial,lastNewlineIndex;if(lastNewlineIndex=leadingWhitespace.lastIndexOf(\"\\n\"),null==hereComment&&nonInitial)null==lastNewlineIndex&&(lastNewlineIndex=-1);else if(!(-1<lastNewlineIndex))return null;return leadingWhitespace.length-1-lastNewlineIndex},commentAttachments=function(){var j,len,results;for(results=[],i=j=0,len=contents.length;j<len;i=++j){var _contents$i=contents[i];content=_contents$i.content,length=_contents$i.length,leadingWhitespace=_contents$i.leadingWhitespace,precededByBlankLine=_contents$i.precededByBlankLine,nonInitial=0!==i,leadingNewlineOffset=nonInitial?1:0,offsetInChunk+=leadingNewlineOffset+leadingWhitespace.length,indentSize=getIndentSize({leadingWhitespace:leadingWhitespace,nonInitial:nonInitial}),noIndent=null==indentSize||-1===indentSize,commentAttachment={content:content,here:null!=hereComment,newLine:leadingNewline||nonInitial,locationData:this.makeLocationData({offsetInChunk:offsetInChunk,length:length}),precededByBlankLine:precededByBlankLine,indentSize:indentSize,indented:!noIndent&&indentSize>this.indent,outdented:!noIndent&&indentSize<this.indent},heregex&&(commentAttachment.heregex=!0),offsetInChunk+=length,results.push(commentAttachment)}return results}.call(this),prev=this.prev(),prev?attachCommentsToNode(commentAttachments,prev):(commentAttachments[0].newLine=!0,this.lineToken({chunk:this.chunk.slice(commentWithSurroundingWhitespace.length),offset:commentWithSurroundingWhitespace.length}),placeholderToken=this.makeToken(\"JS\",\"\",{offset:commentWithSurroundingWhitespace.length,generated:!0}),placeholderToken.comments=commentAttachments,this.tokens.push(placeholderToken),this.newlineToken(commentWithSurroundingWhitespace.length)),void 0!==_ref12$returnCommentT&&_ref12$returnCommentT?commentAttachments:commentWithSurroundingWhitespace.length}},{key:\"jsToken\",value:function jsToken(){var length,match,matchedHere,script;return\"`\"===this.chunk.charAt(0)&&(match=(matchedHere=HERE_JSTOKEN.exec(this.chunk))||JSTOKEN.exec(this.chunk))?(script=match[1],length=match[0].length,this.token(\"JS\",script,{length:length,data:{here:!!matchedHere}}),length):0}},{key:\"regexToken\",value:function regexToken(){var _this6=this,body,closed,comment,commentIndex,commentOpts,commentTokens,comments,delimiter,end,flags,fullMatch,index,leadingWhitespace,match,matchedComment,origin,prev,ref,ref1,regex,tokens;switch(!1){case!(match=REGEX_ILLEGAL.exec(this.chunk)):this.error(\"regular expressions cannot begin with \".concat(match[2]),{offset:match.index+match[1].length});break;case!(match=this.matchWithInterpolations(HEREGEX,\"///\")):var _match5=match;for(tokens=_match5.tokens,index=_match5.index,comments=[];matchedComment=HEREGEX_COMMENT.exec(this.chunk.slice(0,index));){var _matchedComment=matchedComment;commentIndex=_matchedComment.index;var _matchedComment2=matchedComment,_matchedComment3=_slicedToArray(_matchedComment2,3);fullMatch=_matchedComment3[0],leadingWhitespace=_matchedComment3[1],comment=_matchedComment3[2],comments.push({comment:comment,offsetInChunk:commentIndex+leadingWhitespace.length})}commentTokens=flatten(function(){var j,len,results;for(results=[],j=0,len=comments.length;j<len;j++)commentOpts=comments[j],results.push(this.commentToken(commentOpts.comment,Object.assign(commentOpts,{heregex:!0,returnCommentTokens:!0})));return results}.call(this));break;case!(match=REGEX.exec(this.chunk)):var _match6=match,_match7=_slicedToArray(_match6,3);if(regex=_match7[0],body=_match7[1],closed=_match7[2],this.validateEscapes(body,{isRegex:!0,offsetInChunk:1}),index=regex.length,prev=this.prev(),prev)if(prev.spaced&&(ref=prev[0],0<=indexOf.call(CALLABLE,ref))){if(!closed||POSSIBLY_DIVISION.test(regex))return 0;}else if(ref1=prev[0],0<=indexOf.call(NOT_REGEX,ref1))return 0;closed||this.error(\"missing / (unclosed regex)\");break;default:return 0;}var _REGEX_FLAGS$exec=REGEX_FLAGS.exec(this.chunk.slice(index)),_REGEX_FLAGS$exec2=_slicedToArray(_REGEX_FLAGS$exec,1);switch(flags=_REGEX_FLAGS$exec2[0],end=index+flags.length,origin=this.makeToken(\"REGEX\",null,{length:end}),!1){case!!VALID_FLAGS.test(flags):this.error(\"invalid regular expression flags \".concat(flags),{offset:index,length:flags.length});break;case!(regex||1===tokens.length):delimiter=body?\"/\":\"///\",null==body&&(body=tokens[0][1]),this.validateUnicodeCodePointEscapes(body,{delimiter:delimiter}),this.token(\"REGEX\",\"/\".concat(body,\"/\").concat(flags),{length:end,origin:origin,data:{delimiter:delimiter}});break;default:this.token(\"REGEX_START\",\"(\",{length:0,origin:origin,generated:!0}),this.token(\"IDENTIFIER\",\"RegExp\",{length:0,generated:!0}),this.token(\"CALL_START\",\"(\",{length:0,generated:!0}),this.mergeInterpolationTokens(tokens,{double:!0,heregex:{flags:flags},endOffset:end-flags.length,quote:\"///\"},function(str){return _this6.validateUnicodeCodePointEscapes(str,{delimiter:delimiter})}),flags&&(this.token(\",\",\",\",{offset:index-1,length:0,generated:!0}),this.token(\"STRING\",\"\\\"\"+flags+\"\\\"\",{offset:index,length:flags.length})),this.token(\")\",\")\",{offset:end,length:0,generated:!0}),this.token(\"REGEX_END\",\")\",{offset:end,length:0,generated:!0});}return(null==commentTokens?void 0:commentTokens.length)&&addTokenData(this.tokens[this.tokens.length-1],{heregexCommentTokens:commentTokens}),end}},{key:\"lineToken\",value:function lineToken(){var _Mathmin=Math.min,_ref14=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},_ref14$chunk=_ref14.chunk,chunk=void 0===_ref14$chunk?this.chunk:_ref14$chunk,_ref14$offset=_ref14.offset,offset=void 0===_ref14$offset?0:_ref14$offset,backslash,diff,endsContinuationLineIndentation,indent,match,minLiteralLength,newIndentLiteral,noNewlines,prev,ref,size;if(!(match=MULTI_DENT.exec(chunk)))return 0;if(indent=match[0],prev=this.prev(),backslash=\"\\\\\"===(null==prev?void 0:prev[0]),(backslash||(null==(ref=this.seenFor)?void 0:ref.endsLength)<this.ends.length)&&this.seenFor||(this.seenFor=!1),backslash&&this.seenImport||this.importSpecifierList||(this.seenImport=!1),backslash&&this.seenExport||this.exportSpecifierList||(this.seenExport=!1),size=indent.length-1-indent.lastIndexOf(\"\\n\"),noNewlines=this.unfinished(),newIndentLiteral=0<size?indent.slice(-size):\"\",!/^(.?)\\1*$/.exec(newIndentLiteral))return this.error(\"mixed indentation\",{offset:indent.length}),indent.length;if(minLiteralLength=_Mathmin(newIndentLiteral.length,this.indentLiteral.length),newIndentLiteral.slice(0,minLiteralLength)!==this.indentLiteral.slice(0,minLiteralLength))return this.error(\"indentation mismatch\",{offset:indent.length}),indent.length;if(size-this.continuationLineAdditionalIndent===this.indent)return noNewlines?this.suppressNewlines():this.newlineToken(offset),indent.length;if(size>this.indent){if(noNewlines)return backslash||(this.continuationLineAdditionalIndent=size-this.indent),this.continuationLineAdditionalIndent&&(prev.continuationLineIndent=this.indent+this.continuationLineAdditionalIndent),this.suppressNewlines(),indent.length;if(!this.tokens.length)return this.baseIndent=this.indent=size,this.indentLiteral=newIndentLiteral,indent.length;diff=size-this.indent+this.outdebt,this.token(\"INDENT\",diff,{offset:offset+indent.length-size,length:size}),this.indents.push(diff),this.ends.push({tag:\"OUTDENT\"}),this.outdebt=this.continuationLineAdditionalIndent=0,this.indent=size,this.indentLiteral=newIndentLiteral}else size<this.baseIndent?this.error(\"missing indentation\",{offset:offset+indent.length}):(endsContinuationLineIndentation=0<this.continuationLineAdditionalIndent,this.continuationLineAdditionalIndent=0,this.outdentToken({moveOut:this.indent-size,noNewlines:noNewlines,outdentLength:indent.length,offset:offset,indentSize:size,endsContinuationLineIndentation:endsContinuationLineIndentation}));return indent.length}},{key:\"outdentToken\",value:function outdentToken(_ref15){var moveOut=_ref15.moveOut,noNewlines=_ref15.noNewlines,_ref15$outdentLength=_ref15.outdentLength,outdentLength=void 0===_ref15$outdentLength?0:_ref15$outdentLength,_ref15$offset=_ref15.offset,offset=void 0===_ref15$offset?0:_ref15$offset,indentSize=_ref15.indentSize,endsContinuationLineIndentation=_ref15.endsContinuationLineIndentation,decreasedIndent,dent,lastIndent,ref,terminatorToken;for(decreasedIndent=this.indent-moveOut;0<moveOut;)lastIndent=this.indents[this.indents.length-1],lastIndent?this.outdebt&&moveOut<=this.outdebt?(this.outdebt-=moveOut,moveOut=0):(dent=this.indents.pop()+this.outdebt,outdentLength&&(ref=this.chunk[outdentLength],0<=indexOf.call(INDENTABLE_CLOSERS,ref))&&(decreasedIndent-=dent-moveOut,moveOut=dent),this.outdebt=0,this.pair(\"OUTDENT\"),this.token(\"OUTDENT\",moveOut,{length:outdentLength,indentSize:indentSize+moveOut-dent}),moveOut-=dent):this.outdebt=moveOut=0;return dent&&(this.outdebt-=moveOut),this.suppressSemicolons(),\"TERMINATOR\"===this.tag()||noNewlines||(terminatorToken=this.token(\"TERMINATOR\",\"\\n\",{offset:offset+outdentLength,length:0}),endsContinuationLineIndentation&&(terminatorToken.endsContinuationLineIndentation={preContinuationLineIndent:this.indent})),this.indent=decreasedIndent,this.indentLiteral=this.indentLiteral.slice(0,decreasedIndent),this}},{key:\"whitespaceToken\",value:function whitespaceToken(){var match,nline,prev;return(match=WHITESPACE.exec(this.chunk))||(nline=\"\\n\"===this.chunk.charAt(0))?(prev=this.prev(),prev&&(prev[match?\"spaced\":\"newLine\"]=!0),match?match[0].length:0):0}},{key:\"newlineToken\",value:function newlineToken(offset){return this.suppressSemicolons(),\"TERMINATOR\"!==this.tag()&&this.token(\"TERMINATOR\",\"\\n\",{offset:offset,length:0}),this}},{key:\"suppressNewlines\",value:function suppressNewlines(){var prev;return prev=this.prev(),\"\\\\\"===prev[1]&&(prev.comments&&1<this.tokens.length&&attachCommentsToNode(prev.comments,this.tokens[this.tokens.length-2]),this.tokens.pop()),this}},{key:\"jsxToken\",value:function jsxToken(){var _this7=this,afterTag,end,endToken,firstChar,fullId,fullTagName,id,input,j,jsxTag,len,match,offset,openingTagToken,prev,prevChar,properties,property,ref,tagToken,token,tokens;if(firstChar=this.chunk[0],prevChar=0<this.tokens.length?this.tokens[this.tokens.length-1][0]:\"\",\"<\"===firstChar){if(match=JSX_IDENTIFIER.exec(this.chunk.slice(1))||JSX_FRAGMENT_IDENTIFIER.exec(this.chunk.slice(1)),!(match&&(0<this.jsxDepth||!(prev=this.prev())||prev.spaced||(ref=prev[0],0>indexOf.call(COMPARABLE_LEFT_SIDE,ref)))))return 0;var _match8=match,_match9=_slicedToArray(_match8,2);if(input=_match9[0],id=_match9[1],fullId=id,0<=indexOf.call(id,\".\")){var _id$split=id.split(\".\"),_id$split2=_toArray(_id$split);id=_id$split2[0],properties=_id$split2.slice(1)}else properties=[];for(tagToken=this.token(\"JSX_TAG\",id,{length:id.length+1,data:{openingBracketToken:this.makeToken(\"<\",\"<\"),tagNameToken:this.makeToken(\"IDENTIFIER\",id,{offset:1})}}),offset=id.length+1,(j=0,len=properties.length);j<len;j++)property=properties[j],this.token(\".\",\".\",{offset:offset}),offset+=1,this.token(\"PROPERTY\",property,{offset:offset}),offset+=property.length;return this.token(\"CALL_START\",\"(\",{generated:!0}),this.token(\"[\",\"[\",{generated:!0}),this.ends.push({tag:\"/>\",origin:tagToken,name:id,properties:properties}),this.jsxDepth++,fullId.length+1}if(jsxTag=this.atJSXTag()){if(\"/>\"===this.chunk.slice(0,2))return this.pair(\"/>\"),this.token(\"]\",\"]\",{length:2,generated:!0}),this.token(\"CALL_END\",\")\",{length:2,generated:!0,data:{selfClosingSlashToken:this.makeToken(\"/\",\"/\"),closingBracketToken:this.makeToken(\">\",\">\",{offset:1})}}),this.jsxDepth--,2;if(\"{\"===firstChar)return\":\"===prevChar?(token=this.token(\"(\",\"{\"),this.jsxObjAttribute[this.jsxDepth]=!1,addTokenData(this.tokens[this.tokens.length-3],{jsx:!0})):(token=this.token(\"{\",\"{\"),this.jsxObjAttribute[this.jsxDepth]=!0),this.ends.push({tag:\"}\",origin:token}),1;if(\">\"===firstChar){var _this$pair=this.pair(\"/>\");openingTagToken=_this$pair.origin,this.token(\"]\",\"]\",{generated:!0,data:{closingBracketToken:this.makeToken(\">\",\">\")}}),this.token(\",\",\"JSX_COMMA\",{generated:!0});var _this$matchWithInterp2=this.matchWithInterpolations(INSIDE_JSX,\">\",\"</\",JSX_INTERPOLATION);tokens=_this$matchWithInterp2.tokens,end=_this$matchWithInterp2.index,this.mergeInterpolationTokens(tokens,{endOffset:end,jsx:!0},function(value){return _this7.validateUnicodeCodePointEscapes(value,{delimiter:\">\"})}),match=JSX_IDENTIFIER.exec(this.chunk.slice(end))||JSX_FRAGMENT_IDENTIFIER.exec(this.chunk.slice(end)),match&&match[1]===\"\".concat(jsxTag.name).concat(function(){var k,len1,ref1,results;for(ref1=jsxTag.properties,results=[],(k=0,len1=ref1.length);k<len1;k++)property=ref1[k],results.push(\".\".concat(property));return results}().join(\"\"))||this.error(\"expected corresponding JSX closing tag for \".concat(jsxTag.name),jsxTag.origin.data.tagNameToken[2]);var _match10=match,_match11=_slicedToArray(_match10,2);return fullTagName=_match11[1],afterTag=end+fullTagName.length,\">\"!==this.chunk[afterTag]&&this.error(\"missing closing > after tag name\",{offset:afterTag,length:1}),endToken=this.token(\"CALL_END\",\")\",{offset:end-2,length:fullTagName.length+3,generated:!0,data:{closingTagOpeningBracketToken:this.makeToken(\"<\",\"<\",{offset:end-2}),closingTagSlashToken:this.makeToken(\"/\",\"/\",{offset:end-1}),closingTagNameToken:this.makeToken(\"IDENTIFIER\",fullTagName,{offset:end}),closingTagClosingBracketToken:this.makeToken(\">\",\">\",{offset:end+fullTagName.length})}}),addTokenData(openingTagToken,endToken.data),this.jsxDepth--,afterTag+1}return 0}return this.atJSXTag(1)?\"}\"===firstChar?(this.pair(firstChar),this.jsxObjAttribute[this.jsxDepth]?(this.token(\"}\",\"}\"),this.jsxObjAttribute[this.jsxDepth]=!1):this.token(\")\",\"}\"),this.token(\",\",\",\",{generated:!0}),1):0:0}},{key:\"atJSXTag\",value:function atJSXTag(){var depth=0<arguments.length&&void 0!==arguments[0]?arguments[0]:0,i,last,ref;if(0===this.jsxDepth)return!1;for(i=this.ends.length-1;\"OUTDENT\"===(null==(ref=this.ends[i])?void 0:ref.tag)||0<depth--;)i--;return last=this.ends[i],\"/>\"===(null==last?void 0:last.tag)&&last}},{key:\"literalToken\",value:function literalToken(){var match,message,origin,prev,ref,ref1,ref2,ref3,ref4,ref5,skipToken,tag,token,value;if(match=OPERATOR.exec(this.chunk)){var _match12=match,_match13=_slicedToArray(_match12,1);value=_match13[0],CODE.test(value)&&this.tagParameters()}else value=this.chunk.charAt(0);if(tag=value,prev=this.prev(),prev&&0<=indexOf.call([\"=\"].concat(_toConsumableArray(COMPOUND_ASSIGN)),value)&&(skipToken=!1,\"=\"!==value||\"||\"!==(ref=prev[1])&&\"&&\"!==ref||prev.spaced||(prev[0]=\"COMPOUND_ASSIGN\",prev[1]+=\"=\",(null==(ref1=prev.data)?void 0:ref1.original)&&(prev.data.original+=\"=\"),prev[2].range=[prev[2].range[0],prev[2].range[1]+1],prev[2].last_column+=1,prev[2].last_column_exclusive+=1,prev=this.tokens[this.tokens.length-2],skipToken=!0),prev&&\"PROPERTY\"!==prev[0]&&(origin=null==(ref2=prev.origin)?prev:ref2,message=isUnassignable(prev[1],origin[1]),message&&this.error(message,origin[2])),skipToken))return value.length;if(\"(\"===value&&\"IMPORT\"===(null==prev?void 0:prev[0])&&(prev[0]=\"DYNAMIC_IMPORT\"),\"{\"===value&&this.seenImport?this.importSpecifierList=!0:this.importSpecifierList&&\"}\"===value?this.importSpecifierList=!1:\"{\"===value&&\"EXPORT\"===(null==prev?void 0:prev[0])?this.exportSpecifierList=!0:this.exportSpecifierList&&\"}\"===value&&(this.exportSpecifierList=!1),\";\"===value)(ref3=null==prev?void 0:prev[0],0<=indexOf.call([\"=\"].concat(_toConsumableArray(UNFINISHED)),ref3))&&this.error(\"unexpected ;\"),this.seenFor=this.seenImport=this.seenExport=!1,tag=\"TERMINATOR\";else if(\"*\"===value&&\"EXPORT\"===(null==prev?void 0:prev[0]))tag=\"EXPORT_ALL\";else if(0<=indexOf.call(MATH,value))tag=\"MATH\";else if(0<=indexOf.call(COMPARE,value))tag=\"COMPARE\";else if(0<=indexOf.call(COMPOUND_ASSIGN,value))tag=\"COMPOUND_ASSIGN\";else if(0<=indexOf.call(UNARY,value))tag=\"UNARY\";else if(0<=indexOf.call(UNARY_MATH,value))tag=\"UNARY_MATH\";else if(0<=indexOf.call(SHIFT,value))tag=\"SHIFT\";else if(\"?\"===value&&(null==prev?void 0:prev.spaced))tag=\"BIN?\";else if(prev)if(\"(\"===value&&!prev.spaced&&(ref4=prev[0],0<=indexOf.call(CALLABLE,ref4)))\"?\"===prev[0]&&(prev[0]=\"FUNC_EXIST\"),tag=\"CALL_START\";else if(\"[\"===value&&((ref5=prev[0],0<=indexOf.call(INDEXABLE,ref5))&&!prev.spaced||\"::\"===prev[0]))switch(tag=\"INDEX_START\",prev[0]){case\"?\":prev[0]=\"INDEX_SOAK\";}return token=this.makeToken(tag,value),\"(\"===value||\"{\"===value||\"[\"===value?this.ends.push({tag:INVERSES[value],origin:token}):\")\"===value||\"}\"===value||\"]\"===value?this.pair(value):void 0,(this.tokens.push(this.makeToken(tag,value)),value.length)}},{key:\"tagParameters\",value:function tagParameters(){var i,paramEndToken,stack,tok,tokens;if(\")\"!==this.tag())return this.tagDoIife();for(stack=[],tokens=this.tokens,i=tokens.length,paramEndToken=tokens[--i],paramEndToken[0]=\"PARAM_END\";tok=tokens[--i];)switch(tok[0]){case\")\":stack.push(tok);break;case\"(\":case\"CALL_START\":if(stack.length)stack.pop();else return\"(\"===tok[0]?(tok[0]=\"PARAM_START\",this.tagDoIife(i-1)):(paramEndToken[0]=\"CALL_END\",this);}return this}},{key:\"tagDoIife\",value:function tagDoIife(tokenIndex){var tok;return(tok=this.tokens[null==tokenIndex?this.tokens.length-1:tokenIndex],\"DO\"!==(null==tok?void 0:tok[0]))?this:(tok[0]=\"DO_IIFE\",this)}},{key:\"closeIndentation\",value:function closeIndentation(){return this.outdentToken({moveOut:this.indent,indentSize:0})}},{key:\"matchWithInterpolations\",value:function matchWithInterpolations(regex,delimiter){var closingDelimiter=2<arguments.length&&void 0!==arguments[2]?arguments[2]:delimiter,interpolators=3<arguments.length&&void 0!==arguments[3]?arguments[3]:/^#\\{/,braceInterpolator,close,column,index,interpolationOffset,interpolator,line,match,nested,offset,offsetInChunk,open,ref,ref1,rest,str,strPart,tokens;if(tokens=[],offsetInChunk=delimiter.length,this.chunk.slice(0,offsetInChunk)!==delimiter)return null;for(str=this.chunk.slice(offsetInChunk);;){var _regex$exec=regex.exec(str),_regex$exec2=_slicedToArray(_regex$exec,1);if(strPart=_regex$exec2[0],this.validateEscapes(strPart,{isRegex:\"/\"===delimiter.charAt(0),offsetInChunk:offsetInChunk}),tokens.push(this.makeToken(\"NEOSTRING\",strPart,{offset:offsetInChunk})),str=str.slice(strPart.length),offsetInChunk+=strPart.length,!(match=interpolators.exec(str)))break;var _match14=match,_match15=_slicedToArray(_match14,1);interpolator=_match15[0],interpolationOffset=interpolator.length-1;var _this$getLineAndColum3=this.getLineAndColumnFromChunk(offsetInChunk+interpolationOffset),_this$getLineAndColum4=_slicedToArray(_this$getLineAndColum3,3);line=_this$getLineAndColum4[0],column=_this$getLineAndColum4[1],offset=_this$getLineAndColum4[2],rest=str.slice(interpolationOffset);var _Lexer$tokenize=new Lexer().tokenize(rest,{line:line,column:column,offset:offset,untilBalanced:!0,locationDataCompensations:this.locationDataCompensations});if(nested=_Lexer$tokenize.tokens,index=_Lexer$tokenize.index,index+=interpolationOffset,braceInterpolator=\"}\"===str[index-1],braceInterpolator){var _nested,_nested2,_slice$call,_slice$call2;_nested=nested,_nested2=_slicedToArray(_nested,1),open=_nested2[0],_nested,_slice$call=slice.call(nested,-1),_slice$call2=_slicedToArray(_slice$call,1),close=_slice$call2[0],_slice$call,open[0]=\"INTERPOLATION_START\",open[1]=\"(\",open[2].first_column-=interpolationOffset,open[2].range=[open[2].range[0]-interpolationOffset,open[2].range[1]],close[0]=\"INTERPOLATION_END\",close[1]=\")\",close.origin=[\"\",\"end of interpolation\",close[2]]}\"TERMINATOR\"===(null==(ref=nested[1])?void 0:ref[0])&&nested.splice(1,1),\"INDENT\"===(null==(ref1=nested[nested.length-3])?void 0:ref1[0])&&\"OUTDENT\"===nested[nested.length-2][0]&&nested.splice(-3,2),braceInterpolator||(open=this.makeToken(\"INTERPOLATION_START\",\"(\",{offset:offsetInChunk,length:0,generated:!0}),close=this.makeToken(\"INTERPOLATION_END\",\")\",{offset:offsetInChunk+index,length:0,generated:!0}),nested=[open].concat(_toConsumableArray(nested),[close])),tokens.push([\"TOKENS\",nested]),str=str.slice(index),offsetInChunk+=index}return str.slice(0,closingDelimiter.length)!==closingDelimiter&&this.error(\"missing \".concat(closingDelimiter),{length:delimiter.length}),{tokens:tokens,index:offsetInChunk+closingDelimiter.length}}},{key:\"mergeInterpolationTokens\",value:function mergeInterpolationTokens(tokens,options,fn){var $,converted,_double,endOffset,firstIndex,heregex,i,indent,j,jsx,k,lastToken,len,len1,locationToken,lparen,placeholderToken,quote,ref,ref1,rparen,tag,token,tokensToPush,val,value;for(quote=options.quote,indent=options.indent,_double=options.double,heregex=options.heregex,endOffset=options.endOffset,jsx=options.jsx,1<tokens.length&&(lparen=this.token(\"STRING_START\",\"(\",{length:null==(ref=null==quote?void 0:quote.length)?0:ref,data:{quote:quote},generated:null==quote||!quote.length})),firstIndex=this.tokens.length,$=tokens.length-1,(i=j=0,len=tokens.length);j<len;i=++j){var _this$tokens2;token=tokens[i];var _token4=token,_token5=_slicedToArray(_token4,2);switch(tag=_token5[0],value=_token5[1],tag){case\"TOKENS\":if(2===value.length&&(value[0].comments||value[1].comments)){for(placeholderToken=this.makeToken(\"JS\",\"\",{generated:!0}),placeholderToken[2]=value[0][2],(k=0,len1=value.length);k<len1;k++){var _placeholderToken$com;(val=value[k],!!val.comments)&&(null==placeholderToken.comments&&(placeholderToken.comments=[]),(_placeholderToken$com=placeholderToken.comments).push.apply(_placeholderToken$com,_toConsumableArray(val.comments)))}value.splice(1,0,placeholderToken)}locationToken=value[0],tokensToPush=value;break;case\"NEOSTRING\":converted=fn.call(this,token[1],i),0===i&&addTokenData(token,{initialChunk:!0}),i===$&&addTokenData(token,{finalChunk:!0}),addTokenData(token,{indent:indent,quote:quote,double:_double}),heregex&&addTokenData(token,{heregex:heregex}),jsx&&addTokenData(token,{jsx:jsx}),token[0]=\"STRING\",token[1]=\"\\\"\"+converted+\"\\\"\",1===tokens.length&&null!=quote&&(token[2].first_column-=quote.length,\"\\n\"===token[1].substr(-2,1)?(token[2].last_line+=1,token[2].last_column=quote.length-1):(token[2].last_column+=quote.length,2===token[1].length&&(token[2].last_column-=1)),token[2].last_column_exclusive+=quote.length,token[2].range=[token[2].range[0]-quote.length,token[2].range[1]+quote.length]),locationToken=token,tokensToPush=[token];}(_this$tokens2=this.tokens).push.apply(_this$tokens2,_toConsumableArray(tokensToPush))}if(lparen){var _slice$call3=slice.call(tokens,-1),_slice$call4=_slicedToArray(_slice$call3,1);return lastToken=_slice$call4[0],lparen.origin=[\"STRING\",null,{first_line:lparen[2].first_line,first_column:lparen[2].first_column,last_line:lastToken[2].last_line,last_column:lastToken[2].last_column,last_line_exclusive:lastToken[2].last_line_exclusive,last_column_exclusive:lastToken[2].last_column_exclusive,range:[lparen[2].range[0],lastToken[2].range[1]]}],(null==quote?void 0:quote.length)||(lparen[2]=lparen.origin[2]),rparen=this.token(\"STRING_END\",\")\",{offset:endOffset-(null==quote?\"\":quote).length,length:null==(ref1=null==quote?void 0:quote.length)?0:ref1,generated:null==quote||!quote.length})}}},{key:\"pair\",value:function pair(tag){var _slice$call5,_slice$call6,lastIndent,prev,ref,ref1,wanted;if(ref=this.ends,_slice$call5=slice.call(ref,-1),_slice$call6=_slicedToArray(_slice$call5,1),prev=_slice$call6[0],_slice$call5,tag!==(wanted=null==prev?void 0:prev.tag)){var _slice$call7,_slice$call8;return\"OUTDENT\"!==wanted&&this.error(\"unmatched \".concat(tag)),ref1=this.indents,_slice$call7=slice.call(ref1,-1),_slice$call8=_slicedToArray(_slice$call7,1),lastIndent=_slice$call8[0],_slice$call7,this.outdentToken({moveOut:lastIndent,noNewlines:!0}),this.pair(tag)}return this.ends.pop()}},{key:\"getLocationDataCompensation\",value:function getLocationDataCompensation(start,end){var compensation,current,initialEnd,totalCompensation;for(totalCompensation=0,initialEnd=end,current=start;current<=end&&(current!==end||start===initialEnd);)compensation=this.locationDataCompensations[current],null!=compensation&&(totalCompensation+=compensation,end+=compensation),current++;return totalCompensation}},{key:\"getLineAndColumnFromChunk\",value:function getLineAndColumnFromChunk(offset){var column,columnCompensation,compensation,lastLine,lineCount,previousLinesCompensation,ref,string;if(compensation=this.getLocationDataCompensation(this.chunkOffset,this.chunkOffset+offset),0===offset)return[this.chunkLine,this.chunkColumn+compensation,this.chunkOffset+compensation];if(string=offset>=this.chunk.length?this.chunk:this.chunk.slice(0,+(offset-1)+1||9e9),lineCount=count(string,\"\\n\"),column=this.chunkColumn,0<lineCount){var _slice$call9,_slice$call10;ref=string.split(\"\\n\"),_slice$call9=slice.call(ref,-1),_slice$call10=_slicedToArray(_slice$call9,1),lastLine=_slice$call10[0],_slice$call9,column=lastLine.length,previousLinesCompensation=this.getLocationDataCompensation(this.chunkOffset,this.chunkOffset+offset-column),0>previousLinesCompensation&&(previousLinesCompensation=0),columnCompensation=this.getLocationDataCompensation(this.chunkOffset+offset+previousLinesCompensation-column,this.chunkOffset+offset+previousLinesCompensation)}else column+=string.length,columnCompensation=compensation;return[this.chunkLine+lineCount,column+columnCompensation,this.chunkOffset+offset+compensation]}},{key:\"makeLocationData\",value:function makeLocationData(_ref16){var offsetInChunk=_ref16.offsetInChunk,length=_ref16.length,endOffset,lastCharacter,locationData;locationData={range:[]};var _this$getLineAndColum5=this.getLineAndColumnFromChunk(offsetInChunk),_this$getLineAndColum6=_slicedToArray(_this$getLineAndColum5,3);locationData.first_line=_this$getLineAndColum6[0],locationData.first_column=_this$getLineAndColum6[1],locationData.range[0]=_this$getLineAndColum6[2],lastCharacter=0<length?length-1:0;var _this$getLineAndColum7=this.getLineAndColumnFromChunk(offsetInChunk+lastCharacter),_this$getLineAndColum8=_slicedToArray(_this$getLineAndColum7,3);locationData.last_line=_this$getLineAndColum8[0],locationData.last_column=_this$getLineAndColum8[1],endOffset=_this$getLineAndColum8[2];var _this$getLineAndColum9=this.getLineAndColumnFromChunk(offsetInChunk+lastCharacter+(0<length?1:0)),_this$getLineAndColum10=_slicedToArray(_this$getLineAndColum9,2);return locationData.last_line_exclusive=_this$getLineAndColum10[0],locationData.last_column_exclusive=_this$getLineAndColum10[1],locationData.range[1]=0<length?endOffset+1:endOffset,locationData}},{key:\"makeToken\",value:function makeToken(tag,value){var _ref17=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_ref17$offset=_ref17.offset,offsetInChunk=void 0===_ref17$offset?0:_ref17$offset,_ref17$length=_ref17.length,length=void 0===_ref17$length?value.length:_ref17$length,origin=_ref17.origin,generated=_ref17.generated,indentSize=_ref17.indentSize,token;return token=[tag,value,this.makeLocationData({offsetInChunk:offsetInChunk,length:length})],origin&&(token.origin=origin),generated&&(token.generated=!0),null!=indentSize&&(token.indentSize=indentSize),token}},{key:\"token\",value:function(tag,value){var _ref18=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},offset=_ref18.offset,length=_ref18.length,origin=_ref18.origin,data=_ref18.data,generated=_ref18.generated,indentSize=_ref18.indentSize,token;return token=this.makeToken(tag,value,{offset:offset,length:length,origin:origin,generated:generated,indentSize:indentSize}),data&&addTokenData(token,data),this.tokens.push(token),token}},{key:\"tag\",value:function tag(){var _slice$call11,_slice$call12,ref,token;return ref=this.tokens,_slice$call11=slice.call(ref,-1),_slice$call12=_slicedToArray(_slice$call11,1),token=_slice$call12[0],_slice$call11,null==token?void 0:token[0]}},{key:\"value\",value:function value(){var useOrigin=!!(0<arguments.length&&void 0!==arguments[0])&&arguments[0],_slice$call13,_slice$call14,ref,token;return ref=this.tokens,_slice$call13=slice.call(ref,-1),_slice$call14=_slicedToArray(_slice$call13,1),token=_slice$call14[0],_slice$call13,useOrigin&&null!=(null==token?void 0:token.origin)?token.origin[1]:null==token?void 0:token[1]}},{key:\"prev\",value:function prev(){return this.tokens[this.tokens.length-1]}},{key:\"unfinished\",value:function unfinished(){var ref;return LINE_CONTINUER.test(this.chunk)||(ref=this.tag(),0<=indexOf.call(UNFINISHED,ref))}},{key:\"validateUnicodeCodePointEscapes\",value:function validateUnicodeCodePointEscapes(str,options){return replaceUnicodeCodePointEscapes(str,merge(options,{error:this.error}))}},{key:\"validateEscapes\",value:function validateEscapes(str){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},before,hex,invalidEscape,invalidEscapeRegex,match,message,octal,ref,unicode,unicodeCodePoint;if(invalidEscapeRegex=options.isRegex?REGEX_INVALID_ESCAPE:STRING_INVALID_ESCAPE,match=invalidEscapeRegex.exec(str),!!match)return match[0],before=match[1],octal=match[2],hex=match[3],unicodeCodePoint=match[4],unicode=match[5],message=octal?\"octal escape sequences are not allowed\":\"invalid escape sequence\",invalidEscape=\"\\\\\".concat(octal||hex||unicodeCodePoint||unicode),this.error(\"\".concat(message,\" \").concat(invalidEscape),{offset:(null==(ref=options.offsetInChunk)?0:ref)+match.index+before.length,length:invalidEscape.length})}},{key:\"suppressSemicolons\",value:function suppressSemicolons(){var ref,ref1,results;for(results=[];\";\"===this.value();)this.tokens.pop(),(ref=null==(ref1=this.prev())?void 0:ref1[0],0<=indexOf.call([\"=\"].concat(_toConsumableArray(UNFINISHED)),ref))?results.push(this.error(\"unexpected ;\")):results.push(void 0);return results}},{key:\"error\",value:function error(message){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_this$getLineAndColum11,_this$getLineAndColum12,first_column,first_line,location,ref,ref1;return location=\"first_line\"in options?options:(_this$getLineAndColum11=this.getLineAndColumnFromChunk(null==(ref=options.offset)?0:ref),_this$getLineAndColum12=_slicedToArray(_this$getLineAndColum11,2),first_line=_this$getLineAndColum12[0],first_column=_this$getLineAndColum12[1],_this$getLineAndColum11,{first_line:first_line,first_column:first_column,last_column:first_column+(null==(ref1=options.length)?1:ref1)-1}),throwSyntaxError(message,location)}}]),Lexer}(),isUnassignable=function(name){var displayName=1<arguments.length&&void 0!==arguments[1]?arguments[1]:name;switch(!1){case 0>indexOf.call([].concat(_toConsumableArray(JS_KEYWORDS),_toConsumableArray(COFFEE_KEYWORDS)),name):return\"keyword '\".concat(displayName,\"' can't be assigned\");case 0>indexOf.call(STRICT_PROSCRIBED,name):return\"'\".concat(displayName,\"' can't be assigned\");case 0>indexOf.call(RESERVED,name):return\"reserved word '\".concat(displayName,\"' can't be assigned\");default:return!1;}},exports.isUnassignable=isUnassignable,isForFrom=function(prev){var ref;return\"IDENTIFIER\"===prev[0]||\"FOR\"!==prev[0]&&\"{\"!==(ref=prev[1])&&\"[\"!==ref&&\",\"!==ref&&\":\"!==ref},addTokenData=function(token,data){return Object.assign(null==token.data?token.data={}:token.data,data)},JS_KEYWORDS=[\"true\",\"false\",\"null\",\"this\",\"new\",\"delete\",\"typeof\",\"in\",\"instanceof\",\"return\",\"throw\",\"break\",\"continue\",\"debugger\",\"yield\",\"await\",\"if\",\"else\",\"switch\",\"for\",\"while\",\"do\",\"try\",\"catch\",\"finally\",\"class\",\"extends\",\"super\",\"import\",\"export\",\"default\"],COFFEE_KEYWORDS=[\"undefined\",\"Infinity\",\"NaN\",\"then\",\"unless\",\"until\",\"loop\",\"of\",\"by\",\"when\"],COFFEE_ALIAS_MAP={and:\"&&\",or:\"||\",is:\"==\",isnt:\"!=\",not:\"!\",yes:\"true\",no:\"false\",on:\"true\",off:\"false\"},COFFEE_ALIASES=function(){var results;for(key in results=[],COFFEE_ALIAS_MAP)results.push(key);return results}(),COFFEE_KEYWORDS=COFFEE_KEYWORDS.concat(COFFEE_ALIASES),RESERVED=[\"case\",\"function\",\"var\",\"void\",\"with\",\"const\",\"let\",\"enum\",\"native\",\"implements\",\"interface\",\"package\",\"private\",\"protected\",\"public\",\"static\"],STRICT_PROSCRIBED=[\"arguments\",\"eval\"],exports.JS_FORBIDDEN=JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED),BOM=65279,IDENTIFIER=/^(?!\\d)((?:(?!\\s)[$\\w\\x7f-\\uffff])+)([^\\n\\S]*:(?!:))?/,JSX_IDENTIFIER_PART=/(?:(?!\\s)[\\-$\\w\\x7f-\\uffff])+/.source,JSX_IDENTIFIER=RegExp(\"^(?![\\\\d<])(\".concat(JSX_IDENTIFIER_PART,\"(?:\\\\s*:\\\\s*\").concat(JSX_IDENTIFIER_PART,\"|(?:\\\\s*\\\\.\\\\s*\").concat(JSX_IDENTIFIER_PART,\")+)?)\")),JSX_FRAGMENT_IDENTIFIER=/^()>/,JSX_ATTRIBUTE=RegExp(\"^(?!\\\\d)(\".concat(JSX_IDENTIFIER_PART,\"(?:\\\\s*:\\\\s*\").concat(JSX_IDENTIFIER_PART,\")?)([^\\\\S]*=(?!=))?\")),NUMBER=/^0b[01](?:_?[01])*n?|^0o[0-7](?:_?[0-7])*n?|^0x[\\da-f](?:_?[\\da-f])*n?|^\\d+(?:_\\d+)*n|^(?:\\d+(?:_\\d+)*)?\\.?\\d+(?:_\\d+)*(?:e[+-]?\\d+(?:_\\d+)*)?/i,OPERATOR=/^(?:[-=]>|[-+*\\/%<>&|^!?=]=|>>>=?|([-+:])\\1|([&|<>*\\/%])\\2=?|\\?(\\.|::)|\\.{2,3})/,WHITESPACE=/^[^\\n\\S]+/,COMMENT=/^(\\s*)###([^#][\\s\\S]*?)(?:###([^\\n\\S]*)|###$)|^((?:\\s*#(?!##[^#]).*)+)/,CODE=/^[-=]>/,MULTI_DENT=/^(?:\\n[^\\n\\S]*)+/,JSTOKEN=/^`(?!``)((?:[^`\\\\]|\\\\[\\s\\S])*)`/,HERE_JSTOKEN=/^```((?:[^`\\\\]|\\\\[\\s\\S]|`(?!``))*)```/,STRING_START=/^(?:'''|\"\"\"|'|\")/,STRING_SINGLE=/^(?:[^\\\\']|\\\\[\\s\\S])*/,STRING_DOUBLE=/^(?:[^\\\\\"#]|\\\\[\\s\\S]|\\#(?!\\{))*/,HEREDOC_SINGLE=/^(?:[^\\\\']|\\\\[\\s\\S]|'(?!''))*/,HEREDOC_DOUBLE=/^(?:[^\\\\\"#]|\\\\[\\s\\S]|\"(?!\"\")|\\#(?!\\{))*/,INSIDE_JSX=/^(?:[^\\{<])*/,JSX_INTERPOLATION=/^(?:\\{|<(?!\\/))/,HEREDOC_INDENT=/\\n+([^\\n\\S]*)(?=\\S)/g,REGEX=/^\\/(?!\\/)((?:[^[\\/\\n\\\\]|\\\\[^\\n]|\\[(?:\\\\[^\\n]|[^\\]\\n\\\\])*\\])*)(\\/)?/,REGEX_FLAGS=/^\\w*/,VALID_FLAGS=/^(?!.*(.).*\\1)[gimsuy]*$/,HEREGEX=/^(?:[^\\\\\\/#\\s]|\\\\[\\s\\S]|\\/(?!\\/\\/)|\\#(?!\\{)|\\s+(?:#(?!\\{).*)?)*/,HEREGEX_COMMENT=/(\\s+)(#(?!{).*)/gm,REGEX_ILLEGAL=/^(\\/|\\/{3}\\s*)(\\*)/,POSSIBLY_DIVISION=/^\\/=?\\s/,HERECOMMENT_ILLEGAL=/\\*\\//,LINE_CONTINUER=/^\\s*(?:,|\\??\\.(?![.\\d])|\\??::)/,STRING_INVALID_ESCAPE=/((?:^|[^\\\\])(?:\\\\\\\\)*)\\\\(?:(0\\d|[1-7])|(x(?![\\da-fA-F]{2}).{0,2})|(u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?)|(u(?!\\{|[\\da-fA-F]{4}).{0,4}))/,REGEX_INVALID_ESCAPE=/((?:^|[^\\\\])(?:\\\\\\\\)*)\\\\(?:(0\\d)|(x(?![\\da-fA-F]{2}).{0,2})|(u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?)|(u(?!\\{|[\\da-fA-F]{4}).{0,4}))/,TRAILING_SPACES=/\\s+$/,COMPOUND_ASSIGN=[\"-=\",\"+=\",\"/=\",\"*=\",\"%=\",\"||=\",\"&&=\",\"?=\",\"<<=\",\">>=\",\">>>=\",\"&=\",\"^=\",\"|=\",\"**=\",\"//=\",\"%%=\"],UNARY=[\"NEW\",\"TYPEOF\",\"DELETE\"],UNARY_MATH=[\"!\",\"~\"],SHIFT=[\"<<\",\">>\",\">>>\"],COMPARE=[\"==\",\"!=\",\"<\",\">\",\"<=\",\">=\"],MATH=[\"*\",\"/\",\"%\",\"//\",\"%%\"],RELATION=[\"IN\",\"OF\",\"INSTANCEOF\"],BOOL=[\"TRUE\",\"FALSE\"],CALLABLE=[\"IDENTIFIER\",\"PROPERTY\",\")\",\"]\",\"?\",\"@\",\"THIS\",\"SUPER\",\"DYNAMIC_IMPORT\"],INDEXABLE=CALLABLE.concat([\"NUMBER\",\"INFINITY\",\"NAN\",\"STRING\",\"STRING_END\",\"REGEX\",\"REGEX_END\",\"BOOL\",\"NULL\",\"UNDEFINED\",\"}\",\"::\"]),COMPARABLE_LEFT_SIDE=[\"IDENTIFIER\",\")\",\"]\",\"NUMBER\"],NOT_REGEX=INDEXABLE.concat([\"++\",\"--\"]),LINE_BREAK=[\"INDENT\",\"OUTDENT\",\"TERMINATOR\"],INDENTABLE_CLOSERS=[\")\",\"}\",\"]\"]}.call(this),{exports:exports}.exports}(),require[\"./parser\"]=function(){var exports={},module={exports:exports},parser=function(){function Parser(){this.yy={}}var o=function(k,v,_o,l){for(_o=_o||{},l=k.length;l--;_o[k[l]]=v);return _o},$V0=[1,24],$V1=[1,59],$V2=[1,98],$V3=[1,99],$V4=[1,94],$V5=[1,100],$V6=[1,101],$V7=[1,96],$V8=[1,97],$V9=[1,68],$Va=[1,70],$Vb=[1,71],$Vc=[1,72],$Vd=[1,73],$Ve=[1,74],$Vf=[1,76],$Vg=[1,80],$Vh=[1,77],$Vi=[1,78],$Vj=[1,62],$Vk=[1,45],$Vl=[1,38],$Vm=[1,83],$Vn=[1,84],$Vo=[1,81],$Vp=[1,82],$Vq=[1,93],$Vr=[1,57],$Vs=[1,63],$Vt=[1,64],$Vu=[1,79],$Vv=[1,50],$Vw=[1,58],$Vx=[1,75],$Vy=[1,88],$Vz=[1,89],$VA=[1,90],$VB=[1,91],$VC=[1,56],$VD=[1,87],$VE=[1,40],$VF=[1,41],$VG=[1,61],$VH=[1,42],$VI=[1,43],$VJ=[1,44],$VK=[1,46],$VL=[1,47],$VM=[1,102],$VN=[1,6,35,52,155],$VO=[1,6,33,35,52,74,76,96,137,144,155,158,166],$VP=[1,120],$VQ=[1,121],$VR=[1,122],$VS=[1,117],$VT=[1,105],$VU=[1,104],$VV=[1,103],$VW=[1,106],$VX=[1,107],$VY=[1,108],$VZ=[1,109],$V_=[1,110],$V$=[1,111],$V01=[1,112],$V11=[1,113],$V21=[1,114],$V31=[1,115],$V41=[1,116],$V51=[1,124],$V61=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V71=[2,222],$V81=[1,130],$V91=[1,135],$Va1=[1,131],$Vb1=[1,132],$Vc1=[1,133],$Vd1=[1,136],$Ve1=[1,129],$Vf1=[1,6,33,35,52,74,76,96,137,144,155,157,158,159,165,166,183],$Vg1=[1,6,33,35,46,47,52,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vh1=[2,129],$Vi1=[2,133],$Vj1=[6,33,91,96],$Vk1=[2,106],$Vl1=[1,148],$Vm1=[1,147],$Vn1=[1,142],$Vo1=[1,151],$Vp1=[1,156],$Vq1=[1,154],$Vr1=[1,160],$Vs1=[1,166],$Vt1=[1,162],$Vu1=[1,163],$Vv1=[1,165],$Vw1=[1,170],$Vx1=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vy1=[2,126],$Vz1=[1,6,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VA1=[2,31],$VB1=[1,195],$VC1=[1,196],$VD1=[2,93],$VE1=[1,202],$VF1=[1,208],$VG1=[1,223],$VH1=[1,218],$VI1=[1,227],$VJ1=[1,224],$VK1=[1,229],$VL1=[1,230],$VM1=[1,232],$VN1=[2,227],$VO1=[1,234],$VP1=[14,32,33,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VQ1=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,121,135,136,137,144,155,157,158,159,165,166,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$VR1=[1,247],$VS1=[1,248],$VT1=[2,156],$VU1=[1,264],$VV1=[1,265],$VW1=[1,267],$VX1=[1,277],$VY1=[1,278],$VZ1=[1,6,33,35,46,47,52,70,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V_1=[1,6,33,35,36,46,47,52,66,70,74,76,91,96,105,106,107,110,111,112,115,119,121,128,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$V$1=[1,6,33,35,46,47,49,51,52,57,70,74,76,91,96,105,106,107,110,111,112,115,119,123,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V02=[1,283],$V12=[46,47,136],$V22=[1,322],$V32=[1,321],$V42=[6,33],$V52=[2,104],$V62=[1,328],$V72=[6,33,35,91,96],$V82=[6,33,35,66,76,91,96],$V92=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,194,195,196,197,198,199,200,201,202,203,204],$Va2=[2,377],$Vb2=[2,378],$Vc2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,194,196,197,198,199,200,201,202,203,204],$Vd2=[46,47,105,106,110,111,112,115,135,136],$Ve2=[1,357],$Vf2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183],$Vg2=[2,91],$Vh2=[1,375],$Vi2=[1,377],$Vj2=[1,382],$Vk2=[1,384],$Vl2=[6,33,74,96],$Vm2=[2,247],$Vn2=[2,248],$Vo2=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vp2=[1,398],$Vq2=[14,32,33,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,74,75,76,82,85,87,88,89,93,94,96,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$Vr2=[1,400],$Vs2=[6,33,35,74,96],$Vt2=[6,14,32,33,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,74,75,76,82,85,87,88,89,93,94,96,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$Vu2=[6,33,35,74,96,137],$Vv2=[1,6,33,35,46,47,52,57,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vw2=[1,411],$Vx2=[1,6,33,35,46,47,52,66,70,74,76,91,96,105,106,107,110,111,112,115,119,121,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$Vy2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,166,183],$Vz2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,158,166,183],$VA2=[2,300],$VB2=[173,174,175],$VC2=[96,173,174,175],$VD2=[6,33,119],$VE2=[1,431],$VF2=[6,33,35,96,119],$VG2=[6,33,35,70,96,119],$VH2=[6,33,35,66,70,76,96,105,106,110,111,112,115,119,135,136],$VI2=[6,33,35,76,96,105,106,110,111,112,115,119,135,136],$VJ2=[46,47,49,51],$VK2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,196,197,198,199,200,201,202,203,204],$VL2=[2,367],$VM2=[2,366],$VN2=[35,107],$VO2=[14,32,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,107,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VP2=[2,233],$VQ2=[6,33,35],$VR2=[2,105],$VS2=[1,470],$VT2=[1,471],$VU2=[1,6,33,35,46,47,52,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,151,152,155,157,158,159,165,166,178,180,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VV2=[1,337],$VW2=[35,178,180],$VX2=[1,6,35,52,74,76,91,96,107,119,137,144,155,158,166,183],$VY2=[1,509],$VZ2=[1,516],$V_2=[1,6,33,35,52,74,76,96,137,144,155,158,166,183],$V$2=[2,120],$V03=[1,529],$V13=[33,35,74],$V23=[1,537],$V33=[6,33,35,96,137],$V43=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,178,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V53=[1,6,33,35,52,74,76,96,137,144,155,158,166,178],$V63=[2,314],$V73=[2,315],$V83=[2,330],$V93=[1,557],$Va3=[1,558],$Vb3=[6,33,35,119],$Vc3=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,159,165,166,183],$Vd3=[6,33,35,96],$Ve3=[1,6,33,35,52,74,76,91,96,107,119,137,144,151,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vf3=[33,96],$Vg3=[1,611],$Vh3=[1,612],$Vi3=[1,619],$Vj3=[1,620],$Vk3=[1,638],$Vl3=[1,639],$Vm3=[2,285],$Vn3=[2,288],$Vo3=[2,301],$Vp3=[2,316],$Vq3=[2,320],$Vr3=[2,317],$Vs3=[2,321],$Vt3=[2,318],$Vu3=[2,319],$Vv3=[2,331],$Vw3=[2,332],$Vx3=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,183],$Vy3=[2,322],$Vz3=[2,324],$VA3=[2,326],$VB3=[2,328],$VC3=[2,323],$VD3=[2,325],$VE3=[2,327],$VF3=[2,329],parser={trace:function(){},yy:{},symbols_:{error:2,Root:3,Body:4,Line:5,TERMINATOR:6,Expression:7,ExpressionLine:8,Statement:9,FuncDirective:10,YieldReturn:11,AwaitReturn:12,Return:13,STATEMENT:14,Import:15,Export:16,Value:17,Code:18,Operation:19,Assign:20,If:21,Try:22,While:23,For:24,Switch:25,Class:26,Throw:27,Yield:28,CodeLine:29,IfLine:30,OperationLine:31,YIELD:32,INDENT:33,Object:34,OUTDENT:35,FROM:36,Block:37,Identifier:38,IDENTIFIER:39,JSX_TAG:40,Property:41,PROPERTY:42,AlphaNumeric:43,NUMBER:44,String:45,STRING:46,STRING_START:47,Interpolations:48,STRING_END:49,InterpolationChunk:50,INTERPOLATION_START:51,INTERPOLATION_END:52,Regex:53,REGEX:54,REGEX_START:55,Invocation:56,REGEX_END:57,Literal:58,JS:59,UNDEFINED:60,NULL:61,BOOL:62,INFINITY:63,NAN:64,Assignable:65,\"=\":66,AssignObj:67,ObjAssignable:68,ObjRestValue:69,\":\":70,SimpleObjAssignable:71,ThisProperty:72,\"[\":73,\"]\":74,\"@\":75,\"...\":76,ObjSpreadExpr:77,ObjSpreadIdentifier:78,Parenthetical:79,Super:80,This:81,SUPER:82,OptFuncExist:83,Arguments:84,DYNAMIC_IMPORT:85,Accessor:86,RETURN:87,AWAIT:88,PARAM_START:89,ParamList:90,PARAM_END:91,FuncGlyph:92,\"->\":93,\"=>\":94,OptComma:95,\",\":96,Param:97,ParamVar:98,Array:99,Splat:100,SimpleAssignable:101,Range:102,DoIife:103,MetaProperty:104,\".\":105,INDEX_START:106,INDEX_END:107,NEW_TARGET:108,IMPORT_META:109,\"?.\":110,\"::\":111,\"?::\":112,Index:113,IndexValue:114,INDEX_SOAK:115,Slice:116,\"{\":117,AssignList:118,\"}\":119,CLASS:120,EXTENDS:121,IMPORT:122,ASSERT:123,ImportDefaultSpecifier:124,ImportNamespaceSpecifier:125,ImportSpecifierList:126,ImportSpecifier:127,AS:128,DEFAULT:129,IMPORT_ALL:130,EXPORT:131,ExportSpecifierList:132,EXPORT_ALL:133,ExportSpecifier:134,FUNC_EXIST:135,CALL_START:136,CALL_END:137,ArgList:138,THIS:139,Elisions:140,ArgElisionList:141,OptElisions:142,RangeDots:143,\"..\":144,Arg:145,ArgElision:146,Elision:147,SimpleArgs:148,TRY:149,Catch:150,FINALLY:151,CATCH:152,THROW:153,\"(\":154,\")\":155,WhileLineSource:156,WHILE:157,WHEN:158,UNTIL:159,WhileSource:160,Loop:161,LOOP:162,ForBody:163,ForLineBody:164,FOR:165,BY:166,ForStart:167,ForSource:168,ForLineSource:169,ForVariables:170,OWN:171,ForValue:172,FORIN:173,FOROF:174,FORFROM:175,SWITCH:176,Whens:177,ELSE:178,When:179,LEADING_WHEN:180,IfBlock:181,IF:182,POST_IF:183,IfBlockLine:184,UNARY:185,DO:186,DO_IIFE:187,UNARY_MATH:188,\"-\":189,\"+\":190,\"--\":191,\"++\":192,\"?\":193,MATH:194,\"**\":195,SHIFT:196,COMPARE:197,\"&\":198,\"^\":199,\"|\":200,\"&&\":201,\"||\":202,\"BIN?\":203,RELATION:204,COMPOUND_ASSIGN:205,$accept:0,$end:1},terminals_:{2:\"error\",6:\"TERMINATOR\",14:\"STATEMENT\",32:\"YIELD\",33:\"INDENT\",35:\"OUTDENT\",36:\"FROM\",39:\"IDENTIFIER\",40:\"JSX_TAG\",42:\"PROPERTY\",44:\"NUMBER\",46:\"STRING\",47:\"STRING_START\",49:\"STRING_END\",51:\"INTERPOLATION_START\",52:\"INTERPOLATION_END\",54:\"REGEX\",55:\"REGEX_START\",57:\"REGEX_END\",59:\"JS\",60:\"UNDEFINED\",61:\"NULL\",62:\"BOOL\",63:\"INFINITY\",64:\"NAN\",66:\"=\",70:\":\",73:\"[\",74:\"]\",75:\"@\",76:\"...\",82:\"SUPER\",85:\"DYNAMIC_IMPORT\",87:\"RETURN\",88:\"AWAIT\",89:\"PARAM_START\",91:\"PARAM_END\",93:\"->\",94:\"=>\",96:\",\",105:\".\",106:\"INDEX_START\",107:\"INDEX_END\",108:\"NEW_TARGET\",109:\"IMPORT_META\",110:\"?.\",111:\"::\",112:\"?::\",115:\"INDEX_SOAK\",117:\"{\",119:\"}\",120:\"CLASS\",121:\"EXTENDS\",122:\"IMPORT\",123:\"ASSERT\",128:\"AS\",129:\"DEFAULT\",130:\"IMPORT_ALL\",131:\"EXPORT\",133:\"EXPORT_ALL\",135:\"FUNC_EXIST\",136:\"CALL_START\",137:\"CALL_END\",139:\"THIS\",144:\"..\",149:\"TRY\",151:\"FINALLY\",152:\"CATCH\",153:\"THROW\",154:\"(\",155:\")\",157:\"WHILE\",158:\"WHEN\",159:\"UNTIL\",162:\"LOOP\",165:\"FOR\",166:\"BY\",171:\"OWN\",173:\"FORIN\",174:\"FOROF\",175:\"FORFROM\",176:\"SWITCH\",178:\"ELSE\",180:\"LEADING_WHEN\",182:\"IF\",183:\"POST_IF\",185:\"UNARY\",186:\"DO\",187:\"DO_IIFE\",188:\"UNARY_MATH\",189:\"-\",190:\"+\",191:\"--\",192:\"++\",193:\"?\",194:\"MATH\",195:\"**\",196:\"SHIFT\",197:\"COMPARE\",198:\"&\",199:\"^\",200:\"|\",201:\"&&\",202:\"||\",203:\"BIN?\",204:\"RELATION\",205:\"COMPOUND_ASSIGN\"},productions_:[0,[3,0],[3,1],[4,1],[4,3],[4,2],[5,1],[5,1],[5,1],[5,1],[10,1],[10,1],[9,1],[9,1],[9,1],[9,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[8,1],[8,1],[8,1],[28,1],[28,2],[28,4],[28,3],[37,2],[37,3],[38,1],[38,1],[41,1],[43,1],[43,1],[45,1],[45,3],[48,1],[48,2],[50,3],[50,5],[50,2],[50,1],[53,1],[53,3],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[20,3],[20,4],[20,5],[67,1],[67,1],[67,3],[67,5],[67,3],[67,5],[71,1],[71,1],[71,1],[68,1],[68,3],[68,4],[68,1],[69,2],[69,2],[69,2],[69,2],[77,1],[77,1],[77,1],[77,1],[77,1],[77,3],[77,2],[77,3],[77,3],[78,2],[78,2],[13,2],[13,4],[13,1],[11,3],[11,2],[12,3],[12,2],[18,5],[18,2],[29,5],[29,2],[92,1],[92,1],[95,0],[95,1],[90,0],[90,1],[90,3],[90,4],[90,6],[97,1],[97,2],[97,2],[97,3],[97,1],[98,1],[98,1],[98,1],[98,1],[100,2],[100,2],[101,1],[101,2],[101,2],[101,1],[65,1],[65,1],[65,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[80,3],[80,4],[80,6],[104,3],[104,3],[86,2],[86,2],[86,2],[86,2],[86,1],[86,1],[86,1],[113,3],[113,5],[113,2],[114,1],[114,1],[34,4],[118,0],[118,1],[118,3],[118,4],[118,6],[26,1],[26,2],[26,3],[26,4],[26,2],[26,3],[26,4],[26,5],[15,2],[15,4],[15,4],[15,6],[15,4],[15,6],[15,5],[15,7],[15,7],[15,9],[15,6],[15,8],[15,9],[15,11],[126,1],[126,3],[126,4],[126,4],[126,6],[127,1],[127,3],[127,1],[127,3],[124,1],[125,3],[16,3],[16,5],[16,2],[16,4],[16,5],[16,6],[16,3],[16,5],[16,4],[16,6],[16,5],[16,7],[16,7],[16,9],[132,1],[132,3],[132,4],[132,4],[132,6],[134,1],[134,3],[134,3],[134,1],[134,3],[56,3],[56,3],[56,3],[56,2],[83,0],[83,1],[84,2],[84,4],[81,1],[81,1],[72,2],[99,2],[99,3],[99,4],[143,1],[143,1],[102,5],[102,5],[116,3],[116,2],[116,3],[116,2],[116,2],[116,1],[138,1],[138,3],[138,4],[138,4],[138,6],[145,1],[145,1],[145,1],[145,1],[141,1],[141,3],[141,4],[141,4],[141,6],[146,1],[146,2],[142,1],[142,2],[140,1],[140,2],[147,1],[147,2],[148,1],[148,1],[148,3],[148,3],[22,2],[22,3],[22,4],[22,5],[150,3],[150,3],[150,2],[27,2],[27,4],[79,3],[79,5],[156,2],[156,4],[156,2],[156,4],[160,2],[160,4],[160,4],[160,2],[160,4],[160,4],[23,2],[23,2],[23,2],[23,2],[23,1],[161,2],[161,2],[24,2],[24,2],[24,2],[24,2],[163,2],[163,4],[163,2],[164,4],[164,2],[167,2],[167,3],[167,3],[172,1],[172,1],[172,1],[172,1],[170,1],[170,3],[168,2],[168,2],[168,4],[168,4],[168,4],[168,4],[168,4],[168,4],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,2],[168,4],[168,4],[169,2],[169,2],[169,4],[169,4],[169,4],[169,4],[169,4],[169,4],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,2],[169,4],[169,4],[25,5],[25,5],[25,7],[25,7],[25,4],[25,6],[177,1],[177,2],[179,3],[179,4],[181,3],[181,5],[21,1],[21,3],[21,3],[21,3],[184,3],[184,5],[30,1],[30,3],[30,3],[30,3],[31,2],[31,2],[31,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,4],[19,2],[19,2],[19,2],[19,2],[19,2],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,5],[19,4],[103,2]],performAction:function(yytext,yyleng,yylineno,yy,yystate,$$,_$){var $0=$$.length-1;switch(yystate){case 1:return this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Root(new yy.Block()));break;case 2:return this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Root($$[$0]));break;case 3:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(yy.Block.wrap([$$[$0]]));break;case 4:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-2].push($$[$0]));break;case 5:this.$=$$[$0-1];break;case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 41:case 52:case 54:case 64:case 69:case 70:case 71:case 72:case 75:case 80:case 81:case 82:case 83:case 84:case 104:case 105:case 116:case 117:case 118:case 119:case 125:case 126:case 129:case 135:case 149:case 247:case 248:case 249:case 251:case 264:case 265:case 308:case 309:case 364:case 370:this.$=$$[$0];break;case 13:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.StatementLiteral($$[$0]));break;case 31:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Op($$[$0],new yy.Value(new yy.Literal(\"\"))));break;case 32:case 374:case 375:case 376:case 378:case 379:case 382:case 405:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1],$$[$0]));break;case 33:case 383:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Op($$[$0-3],$$[$0-1]));break;case 34:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op($$[$0-2].concat($$[$0-1]),$$[$0]));break;case 35:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Block);break;case 36:case 150:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-1]);break;case 37:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.IdentifierLiteral($$[$0]));break;case 38:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(function(){var ref,ref1,ref2,ref3;return new yy.JSXTag($$[$0].toString(),{tagNameLocationData:$$[$0].tagNameToken[2],closingTagOpeningBracketLocationData:null==(ref=$$[$0].closingTagOpeningBracketToken)?void 0:ref[2],closingTagSlashLocationData:null==(ref1=$$[$0].closingTagSlashToken)?void 0:ref1[2],closingTagNameLocationData:null==(ref2=$$[$0].closingTagNameToken)?void 0:ref2[2],closingTagClosingBracketLocationData:null==(ref3=$$[$0].closingTagClosingBracketToken)?void 0:ref3[2]})}());break;case 39:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.PropertyName($$[$0].toString()));break;case 40:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.NumberLiteral($$[$0].toString(),{parsedValue:$$[$0].parsedValue}));break;case 42:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.StringLiteral($$[$0].slice(1,-1),{quote:$$[$0].quote,initialChunk:$$[$0].initialChunk,finalChunk:$$[$0].finalChunk,indent:$$[$0].indent,double:$$[$0].double,heregex:$$[$0].heregex}));break;case 43:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.StringWithInterpolations(yy.Block.wrap($$[$0-1]),{quote:$$[$0-2].quote,startQuote:yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Literal($$[$0-2].toString()))}));break;case 44:case 107:case 157:case 183:case 208:case 242:case 256:case 260:case 312:case 358:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)([$$[$0]]);break;case 45:case 257:case 261:case 359:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].concat($$[$0]));break;case 46:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Interpolation($$[$0-1]));break;case 47:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Interpolation($$[$0-2]));break;case 48:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Interpolation);break;case 49:case 293:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)($$[$0]);break;case 50:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.RegexLiteral($$[$0].toString(),{delimiter:$$[$0].delimiter,heregexCommentTokens:$$[$0].heregexCommentTokens}));break;case 51:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.RegexWithInterpolations($$[$0-1],{heregexCommentTokens:$$[$0].heregexCommentTokens}));break;case 53:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.PassthroughLiteral($$[$0].toString(),{here:$$[$0].here,generated:$$[$0].generated}));break;case 55:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.UndefinedLiteral($$[$0]));break;case 56:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.NullLiteral($$[$0]));break;case 57:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.BooleanLiteral($$[$0].toString(),{originalValue:$$[$0].original}));break;case 58:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.InfinityLiteral($$[$0].toString(),{originalValue:$$[$0].original}));break;case 59:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.NaNLiteral($$[$0]));break;case 60:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-2],$$[$0]));break;case 61:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-3],$$[$0]));break;case 62:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-4],$$[$0-1]));break;case 63:case 122:case 127:case 128:case 130:case 131:case 132:case 133:case 134:case 136:case 137:case 310:case 311:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Value($$[$0]));break;case 65:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Value($$[$0-2])),$$[$0],\"object\",{operatorToken:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 66:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Value($$[$0-4])),$$[$0-1],\"object\",{operatorToken:yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.Literal($$[$0-3]))}));break;case 67:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Value($$[$0-2])),$$[$0],null,{operatorToken:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 68:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Value($$[$0-4])),$$[$0-1],null,{operatorToken:yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.Literal($$[$0-3]))}));break;case 73:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Value(new yy.ComputedPropertyName($$[$0-1])));break;case 74:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Value(yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.ThisLiteral($$[$0-3])),[yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.ComputedPropertyName($$[$0-1]))],\"this\"));break;case 76:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat(new yy.Value($$[$0-1])));break;case 77:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat(new yy.Value($$[$0]),{postfix:!1}));break;case 78:case 120:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat($$[$0-1]));break;case 79:case 121:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat($$[$0],{postfix:!1}));break;case 85:case 220:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.SuperCall(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Super),$$[$0],$$[$0-1].soak,$$[$0-2]));break;case 86:case 221:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.DynamicImportCall(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.DynamicImport),$$[$0]));break;case 87:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Call(new yy.Value($$[$0-2]),$$[$0],$$[$0-1].soak));break;case 88:case 219:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Call($$[$0-2],$$[$0],$$[$0-1].soak));break;case 89:case 90:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Value($$[$0-1]).add($$[$0]));break;case 91:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Return($$[$0]));break;case 92:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Return(new yy.Value($$[$0-1])));break;case 93:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Return);break;case 94:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.YieldReturn($$[$0],{returnKeyword:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 95:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.YieldReturn(null,{returnKeyword:yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Literal($$[$0]))}));break;case 96:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.AwaitReturn($$[$0],{returnKeyword:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 97:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.AwaitReturn(null,{returnKeyword:yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Literal($$[$0]))}));break;case 98:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Code($$[$0-3],$$[$0],$$[$0-1],yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Literal($$[$0-4]))));break;case 99:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Code([],$$[$0],$$[$0-1]));break;case 100:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Code($$[$0-3],yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(yy.Block.wrap([$$[$0]])),$$[$0-1],yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Literal($$[$0-4]))));break;case 101:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Code([],yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(yy.Block.wrap([$$[$0]])),$$[$0-1]));break;case 102:case 103:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.FuncGlyph($$[$0]));break;case 106:case 156:case 258:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)([]);break;case 108:case 158:case 184:case 209:case 243:case 252:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-2].concat($$[$0]));break;case 109:case 159:case 185:case 210:case 244:case 253:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)($$[$0-3].concat($$[$0]));break;case 110:case 160:case 187:case 212:case 246:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)($$[$0-5].concat($$[$0-2]));break;case 111:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Param($$[$0]));break;case 112:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Param($$[$0-1],null,!0));break;case 113:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Param($$[$0],null,{postfix:!1}));break;case 114:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Param($$[$0-2],$$[$0]));break;case 115:case 250:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Expansion);break;case 123:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].add($$[$0]));break;case 124:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Value($$[$0-1]).add($$[$0]));break;case 138:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Super(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0])),yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Literal($$[$0-2]))));break;case 139:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Super(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Index($$[$0-1])),yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.Literal($$[$0-3]))));break;case 140:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.Super(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Index($$[$0-2])),yy.addDataToNode(yy,_$[$0-5],$$[$0-5],null,null,!0)(new yy.Literal($$[$0-5]))));break;case 141:case 142:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.MetaProperty(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.IdentifierLiteral($$[$0-2])),yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))));break;case 143:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Access($$[$0]));break;case 144:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Access($$[$0],{soak:!0}));break;case 145:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0})),yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))]);break;case 146:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0,soak:!0})),yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))]);break;case 147:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0}));break;case 148:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0,soak:!0}));break;case 151:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)($$[$0-2]);break;case 152:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(yy.extend($$[$0],{soak:!0}));break;case 153:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Index($$[$0]));break;case 154:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Slice($$[$0]));break;case 155:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Obj($$[$0-2],$$[$0-3].generated));break;case 161:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Class);break;case 162:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Class(null,null,$$[$0]));break;case 163:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Class(null,$$[$0]));break;case 164:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Class(null,$$[$0-1],$$[$0]));break;case 165:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Class($$[$0]));break;case 166:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Class($$[$0-1],null,$$[$0]));break;case 167:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Class($$[$0-2],$$[$0]));break;case 168:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Class($$[$0-3],$$[$0-1],$$[$0]));break;case 169:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(null,$$[$0]));break;case 170:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(null,$$[$0-2],$$[$0]));break;case 171:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-2],null),$$[$0]));break;case 172:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-4],null),$$[$0-2],$$[$0]));break;case 173:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,$$[$0-2]),$$[$0]));break;case 174:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,$$[$0-4]),$$[$0-2],$$[$0]));break;case 175:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList([])),$$[$0]));break;case 176:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList([])),$$[$0-2],$$[$0]));break;case 177:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList($$[$0-4])),$$[$0]));break;case 178:this.$=yy.addDataToNode(yy,_$[$0-8],$$[$0-8],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList($$[$0-6])),$$[$0-2],$$[$0]));break;case 179:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-4],$$[$0-2]),$$[$0]));break;case 180:this.$=yy.addDataToNode(yy,_$[$0-7],$$[$0-7],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-6],$$[$0-4]),$$[$0-2],$$[$0]));break;case 181:this.$=yy.addDataToNode(yy,_$[$0-8],$$[$0-8],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-7],new yy.ImportSpecifierList($$[$0-4])),$$[$0]));break;case 182:this.$=yy.addDataToNode(yy,_$[$0-10],$$[$0-10],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-9],new yy.ImportSpecifierList($$[$0-6])),$$[$0-2],$$[$0]));break;case 186:case 211:case 245:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)($$[$0-2]);break;case 188:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ImportSpecifier($$[$0]));break;case 189:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ImportSpecifier($$[$0-2],$$[$0]));break;case 190:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ImportSpecifier(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.DefaultLiteral($$[$0]))));break;case 191:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ImportSpecifier(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.DefaultLiteral($$[$0-2])),$$[$0]));break;case 192:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ImportDefaultSpecifier($$[$0]));break;case 193:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ImportNamespaceSpecifier(new yy.Literal($$[$0-2]),$$[$0]));break;case 194:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([])));break;case 195:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-2])));break;case 196:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration($$[$0]));break;case 197:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-2],$$[$0],null,{moduleDeclaration:\"export\"}))));break;case 198:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-3],$$[$0],null,{moduleDeclaration:\"export\"}))));break;case 199:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-4],$$[$0-1],null,{moduleDeclaration:\"export\"}))));break;case 200:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportDefaultDeclaration($$[$0]));break;case 201:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportDefaultDeclaration(new yy.Value($$[$0-1])));break;case 202:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ExportAllDeclaration(new yy.Literal($$[$0-2]),$$[$0]));break;case 203:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ExportAllDeclaration(new yy.Literal($$[$0-4]),$$[$0-2],$$[$0]));break;case 204:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([]),$$[$0]));break;case 205:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([]),$$[$0-2],$$[$0]));break;case 206:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-4]),$$[$0]));break;case 207:this.$=yy.addDataToNode(yy,_$[$0-8],$$[$0-8],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-6]),$$[$0-2],$$[$0]));break;case 213:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ExportSpecifier($$[$0]));break;case 214:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportSpecifier($$[$0-2],$$[$0]));break;case 215:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportSpecifier($$[$0-2],yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.DefaultLiteral($$[$0]))));break;case 216:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ExportSpecifier(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.DefaultLiteral($$[$0]))));break;case 217:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportSpecifier(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.DefaultLiteral($$[$0-2])),$$[$0]));break;case 218:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.TaggedTemplateCall($$[$0-2],$$[$0],$$[$0-1].soak));break;case 222:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({soak:!1});break;case 223:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({soak:!0});break;case 224:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([]);break;case 225:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(function(){return $$[$0-2].implicit=$$[$0-3].generated,$$[$0-2]}());break;case 226:case 227:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Value(new yy.ThisLiteral($$[$0])));break;case 228:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Value(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.ThisLiteral($$[$0-1])),[yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))],\"this\"));break;case 229:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Arr([]));break;case 230:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Arr($$[$0-1]));break;case 231:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Arr([].concat($$[$0-2],$$[$0-1])));break;case 232:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({exclusive:!1});break;case 233:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({exclusive:!0});break;case 234:case 235:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Range($$[$0-3],$$[$0-1],$$[$0-2].exclusive?\"exclusive\":\"inclusive\"));break;case 236:case 238:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Range($$[$0-2],$$[$0],$$[$0-1].exclusive?\"exclusive\":\"inclusive\"));break;case 237:case 239:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Range($$[$0-1],null,$$[$0].exclusive?\"exclusive\":\"inclusive\"));break;case 240:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Range(null,$$[$0],$$[$0-1].exclusive?\"exclusive\":\"inclusive\"));break;case 241:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Range(null,null,$$[$0].exclusive?\"exclusive\":\"inclusive\"));break;case 254:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)($$[$0-2].concat($$[$0-1]));break;case 255:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)($$[$0-5].concat($$[$0-4],$$[$0-2],$$[$0-1]));break;case 259:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([].concat($$[$0]));break;case 262:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Elision);break;case 263:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1]);break;case 266:case 267:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)([].concat($$[$0-2],$$[$0]));break;case 268:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Try($$[$0]));break;case 269:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Try($$[$0-1],$$[$0]));break;case 270:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Try($$[$0-2],null,$$[$0],yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))));break;case 271:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Try($$[$0-3],$$[$0-2],$$[$0],yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))));break;case 272:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Catch($$[$0],$$[$0-1]));break;case 273:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Catch($$[$0],yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Value($$[$0-1]))));break;case 274:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Catch($$[$0]));break;case 275:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Throw($$[$0]));break;case 276:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Throw(new yy.Value($$[$0-1])));break;case 277:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Parens($$[$0-1]));break;case 278:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Parens($$[$0-2]));break;case 279:case 283:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While($$[$0]));break;case 280:case 284:case 285:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.While($$[$0-2],{guard:$$[$0]}));break;case 281:case 286:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While($$[$0],{invert:!0}));break;case 282:case 287:case 288:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.While($$[$0-2],{invert:!0,guard:$$[$0]}));break;case 289:case 290:case 298:case 299:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].addBody($$[$0]));break;case 291:case 292:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(Object.assign($$[$0],{postfix:!0}).addBody(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(yy.Block.wrap([$$[$0-1]]))));break;case 294:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.BooleanLiteral(\"true\")),{isLoop:!0}).addBody($$[$0]));break;case 295:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.BooleanLiteral(\"true\")),{isLoop:!0}).addBody(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(yy.Block.wrap([$$[$0]]))));break;case 296:case 297:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(function(){return $$[$0].postfix=!0,$$[$0].addBody($$[$0-1])}());break;case 300:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.For([],{source:yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Value($$[$0]))}));break;case 301:case 303:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.For([],{source:yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Value($$[$0-2])),step:$$[$0]}));break;case 302:case 304:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].addSource($$[$0]));break;case 305:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.For([],{name:$$[$0][0],index:$$[$0][1]}));break;case 306:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(function(){var _$$$$=_slicedToArray($$[$0],2),index,name;return name=_$$$$[0],index=_$$$$[1],new yy.For([],{name:name,index:index,await:!0,awaitTag:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))})}());break;case 307:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(function(){var _$$$$2=_slicedToArray($$[$0],2),index,name;return name=_$$$$2[0],index=_$$$$2[1],new yy.For([],{name:name,index:index,own:!0,ownTag:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))})}());break;case 313:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)([$$[$0-2],$$[$0]]);break;case 314:case 333:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)({source:$$[$0]});break;case 315:case 334:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)({source:$$[$0],object:!0});break;case 316:case 317:case 335:case 336:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],guard:$$[$0]});break;case 318:case 319:case 337:case 338:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],guard:$$[$0],object:!0});break;case 320:case 321:case 339:case 340:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],step:$$[$0]});break;case 322:case 323:case 324:case 325:case 341:case 342:case 343:case 344:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)({source:$$[$0-4],guard:$$[$0-2],step:$$[$0]});break;case 326:case 327:case 328:case 329:case 345:case 346:case 347:case 348:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)({source:$$[$0-4],step:$$[$0-2],guard:$$[$0]});break;case 330:case 349:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)({source:$$[$0],from:!0});break;case 331:case 332:case 350:case 351:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],guard:$$[$0],from:!0});break;case 352:case 353:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Switch($$[$0-3],$$[$0-1]));break;case 354:case 355:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.Switch($$[$0-5],$$[$0-3],yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0-1],$$[$0-1],!0)($$[$0-1])));break;case 356:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Switch(null,$$[$0-1]));break;case 357:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.Switch(null,$$[$0-3],yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0-1],$$[$0-1],!0)($$[$0-1])));break;case 360:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.SwitchWhen($$[$0-1],$$[$0]));break;case 361:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!1)(yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0-1],$$[$0-1],!0)(new yy.SwitchWhen($$[$0-2],$$[$0-1])));break;case 362:case 368:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.If($$[$0-1],$$[$0],{type:$$[$0-2]}));break;case 363:case 369:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)($$[$0-4].addElse(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.If($$[$0-1],$$[$0],{type:$$[$0-2]}))));break;case 365:case 371:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-2].addElse($$[$0]));break;case 366:case 367:case 372:case 373:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.If($$[$0],yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(yy.Block.wrap([$$[$0-2]])),{type:$$[$0-1],postfix:!0}));break;case 377:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1].toString(),$$[$0],void 0,void 0,{originalOperator:$$[$0-1].original}));break;case 380:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"-\",$$[$0]));break;case 381:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"+\",$$[$0]));break;case 384:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"--\",$$[$0]));break;case 385:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"++\",$$[$0]));break;case 386:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"--\",$$[$0-1],null,!0));break;case 387:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"++\",$$[$0-1],null,!0));break;case 388:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Existence($$[$0-1]));break;case 389:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op(\"+\",$$[$0-2],$$[$0]));break;case 390:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op(\"-\",$$[$0-2],$$[$0]));break;case 391:case 392:case 393:case 395:case 396:case 397:case 400:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1],$$[$0-2],$$[$0]));break;case 394:case 398:case 399:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1].toString(),$$[$0-2],$$[$0],void 0,{originalOperator:$$[$0-1].original}));break;case 401:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(function(){var ref,ref1;return new yy.Op($$[$0-1].toString(),$$[$0-2],$$[$0],void 0,{invertOperator:null==(ref=null==(ref1=$$[$0-1].invert)?void 0:ref1.original)?$$[$0-1].invert:ref})}());break;case 402:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-2],$$[$0],$$[$0-1].toString(),{originalContext:$$[$0-1].original}));break;case 403:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-4],$$[$0-1],$$[$0-3].toString(),{originalContext:$$[$0-3].original}));break;case 404:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-3],$$[$0],$$[$0-2].toString(),{originalContext:$$[$0-2].original}));}},table:[{1:[2,1],3:1,4:2,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{1:[3]},{1:[2,2],6:$VM},o($VN,[2,3]),o($VO,[2,6],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,7]),o($VO,[2,8],{167:123,160:125,163:126,157:$VP,159:$VQ,165:$VR,183:$V51}),o($VO,[2,9]),o($V61,[2,16],{83:127,86:128,113:134,46:$V71,47:$V71,136:$V71,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1}),o($V61,[2,17],{113:134,86:137,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1}),o($V61,[2,18]),o($V61,[2,19]),o($V61,[2,20]),o($V61,[2,21]),o($V61,[2,22]),o($V61,[2,23]),o($V61,[2,24]),o($V61,[2,25]),o($V61,[2,26]),o($V61,[2,27]),o($VO,[2,28]),o($VO,[2,29]),o($VO,[2,30]),o($Vf1,[2,12]),o($Vf1,[2,13]),o($Vf1,[2,14]),o($Vf1,[2,15]),o($VO,[2,10]),o($VO,[2,11]),o($Vg1,$Vh1,{66:[1,138]}),o($Vg1,[2,130]),o($Vg1,[2,131]),o($Vg1,[2,132]),o($Vg1,$Vi1),o($Vg1,[2,134]),o($Vg1,[2,135]),o($Vg1,[2,136]),o($Vg1,[2,137]),o($Vj1,$Vk1,{90:139,97:140,98:141,38:143,72:144,99:145,34:146,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{5:150,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:$Vo1,34:66,37:149,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:152,8:153,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:157,8:158,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:159,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:167,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:168,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:169,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vw1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:[1,171],88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:172,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:176,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},o($Vx1,$Vy1,{191:[1,177],192:[1,178],205:[1,179]}),o($V61,[2,364],{178:[1,180]}),{33:$Vo1,37:181},{33:$Vo1,37:182},{33:$Vo1,37:183},o($V61,[2,293]),{33:$Vo1,37:184},{33:$Vo1,37:185},{7:186,8:187,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:[1,188],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz1,[2,161],{58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,99:65,34:66,43:67,53:69,38:85,72:86,45:95,92:161,17:173,18:174,65:175,37:189,101:191,33:$Vo1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,121:[1,190],139:$Vu,154:$Vx,187:$Vv1}),{7:192,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,193],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,35,52,74,76,96,137,144,155,157,158,159,165,166,183,193,194,195,196,197,198,199,200,201,202,203,204],$VA1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:194,14:$V0,32:$Vp1,33:$VB1,36:$VC1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:[1,197],88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VO,[2,370],{178:[1,198]}),{18:200,29:199,89:$Vl,92:39,93:$Vm,94:$Vn},o([1,6,35,52,74,76,96,137,144,155,157,158,159,165,166,183],$VD1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:201,14:$V0,32:$Vp1,33:$VE1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{38:207,39:$V2,40:$V3,45:203,46:$V5,47:$V6,117:[1,206],124:204,125:205,130:$VF1},{26:210,38:211,39:$V2,40:$V3,117:[1,209],120:$Vr,129:[1,212],133:[1,213]},o($Vx1,[2,127]),o($Vx1,[2,128]),o($Vg1,[2,52]),o($Vg1,[2,53]),o($Vg1,[2,54]),o($Vg1,[2,55]),o($Vg1,[2,56]),o($Vg1,[2,57]),o($Vg1,[2,58]),o($Vg1,[2,59]),{4:214,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:[1,215],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:216,8:217,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:$VH1,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:219,141:220,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{83:228,105:$VK1,106:$VL1,135:$Ve1,136:$V71},{84:231,136:$VM1},o($Vg1,[2,226]),o($Vg1,$VN1,{41:233,42:$VO1}),{105:[1,235]},{105:[1,236]},o($VP1,[2,102]),o($VP1,[2,103]),o($VQ1,[2,122]),o($VQ1,[2,125]),{7:237,8:238,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:239,8:240,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:241,8:242,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:244,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vo1,34:66,37:243,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vf,75:$Vm1,88:$VR1,99:252,102:245,117:$Vq,170:246,171:$VS1,172:249},{168:254,169:255,173:[1,256],174:[1,257],175:[1,258]},o([6,33,96,119],$VT1,{45:95,118:259,67:260,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),o($VZ1,[2,40]),o($VZ1,[2,41]),o($Vg1,[2,50]),{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:279,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:280,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},o($V_1,[2,37]),o($V_1,[2,38]),o($V$1,[2,42]),{45:284,46:$V5,47:$V6,48:281,50:282,51:$V02},o($VN,[2,5],{7:4,8:5,9:6,10:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,11:27,12:28,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,5:285,14:$V0,32:$V1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V61,[2,388]),{7:286,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:287,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:288,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:289,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:290,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:291,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:292,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:293,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:294,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:295,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:296,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:297,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:298,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:299,8:300,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,292]),o($V61,[2,297]),{7:239,8:301,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:241,8:302,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vf,75:$Vm1,88:$VR1,99:252,102:303,117:$Vq,170:246,171:$VS1,172:249},{168:254,173:[1,304],174:[1,305],175:[1,306]},{7:307,8:308,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,291]),o($V61,[2,296]),{45:309,46:$V5,47:$V6,84:310,136:$VM1},o($VQ1,[2,123]),o($V12,[2,223]),{41:311,42:$VO1},{41:312,42:$VO1},o($VQ1,[2,147],{41:313,42:$VO1}),o($VQ1,[2,148],{41:314,42:$VO1}),o($VQ1,[2,149]),{7:317,8:319,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:[1,316],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$V22,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,114:315,116:318,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,143:320,144:$V32,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{106:$V91,113:323,115:$Vd1},o($VQ1,[2,124]),{6:[1,325],7:324,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,326],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V42,$V52,{95:329,91:[1,327],96:$V62}),o($V72,[2,107]),o($V72,[2,111],{66:[1,331],76:[1,330]}),o($V72,[2,115],{38:143,72:144,99:145,34:146,98:332,39:$V2,40:$V3,73:$Vl1,75:$Vm1,117:$Vq}),o($V82,[2,116]),o($V82,[2,117]),o($V82,[2,118]),o($V82,[2,119]),{41:233,42:$VO1},{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:$VH1,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:219,141:220,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vg1,[2,99]),o($VO,[2,101]),{4:336,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,35:[1,335],38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V92,$Va2,{160:118,163:119,167:123,193:$VV}),o($VO,[2,374]),{7:169,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vw1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{157:$VP,159:$VQ,160:125,163:126,165:$VR,167:123,183:$V51},o([1,6,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,193,194,195,196,197,198,199,200,201,202,203,204],$VA1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:194,14:$V0,32:$Vp1,33:$VB1,36:$VC1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V92,$Vb2,{160:118,163:119,167:123,193:$VV}),o($VO,[2,375]),o($Vc2,[2,379],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vj1,$Vk1,{97:140,98:141,38:143,72:144,99:145,34:146,90:338,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{33:$Vo1,37:149},{7:339,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:340,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{157:$VP,159:$VQ,160:125,163:126,165:$VR,167:123,183:[1,341]},{18:200,89:$Vr1,92:161,93:$Vm,94:$Vn},{7:342,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vc2,[2,380],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vc2,[2,381],{160:118,163:119,167:123,193:$VV,195:$VX}),o($V92,[2,382],{160:118,163:119,167:123,193:$VV}),{34:343,117:$Vq},o($VO,[2,97],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:344,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$VD1,159:$VD1,165:$VD1,183:$VD1,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V61,[2,384],{46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1}),o($V12,$V71,{83:127,86:128,113:134,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1}),{86:137,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,113:134,115:$Vd1},o($Vd2,$Vh1),o($V61,[2,385],{46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1}),o($V61,[2,386]),o($V61,[2,387]),{6:[1,347],7:345,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,346],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$Vo1,37:348,182:[1,349]},o($V61,[2,268],{150:350,151:[1,351],152:[1,352]}),o($V61,[2,289]),o($V61,[2,290]),o($V61,[2,298]),o($V61,[2,299]),{33:[1,353],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[1,354]},{177:355,179:356,180:$Ve2},o($V61,[2,162]),{7:358,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz1,[2,165],{37:359,33:$Vo1,46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1,121:[1,360]}),o($Vf2,[2,275],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:361,117:$Vq},o($Vf2,[2,32],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:362,117:$Vq},{7:363,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,35,52,74,76,96,137,144,155,158,166],[2,95],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:364,14:$V0,32:$Vp1,33:$VE1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$VD1,159:$VD1,165:$VD1,183:$VD1,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{33:$Vo1,37:365,182:[1,366]},o($VO,[2,376]),o($Vg1,[2,405]),o($Vf1,$Vg2,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:367,117:$Vq},o($Vf1,[2,169],{123:[1,368]}),{36:[1,369],96:[1,370]},{36:[1,371]},{33:$Vh2,38:376,39:$V2,40:$V3,119:[1,372],126:373,127:374,129:$Vi2},o([36,96],[2,192]),{128:[1,378]},{33:$Vj2,38:383,39:$V2,40:$V3,119:[1,379],129:$Vk2,132:380,134:381},o($Vf1,[2,196]),{66:[1,385]},{7:386,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,387],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{36:[1,388]},{6:$VM,155:[1,389]},{4:390,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vl2,$Vm2,{160:118,163:119,167:123,143:391,76:[1,392],144:$V32,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vl2,$Vn2,{143:393,76:$V22,144:$V32}),o($Vo2,[2,229]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:[1,394],75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:396,147:395,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([6,33,74],$V52,{142:397,95:399,96:$Vp2}),o($Vq2,[2,260],{6:$Vr2}),o($Vs2,[2,251]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,141:401,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vt2,[2,262]),o($Vs2,[2,256]),o($Vu2,[2,249]),o($Vu2,[2,250],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:403,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{84:404,136:$VM1},{41:405,42:$VO1},{7:406,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,407],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vv2,[2,221]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,137:[1,408],138:409,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vx2,[2,228]),o($Vx2,[2,39]),{41:412,42:$VO1},{41:413,42:$VO1},{33:$Vo1,37:414,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:$Vo1,37:415},o($Vy2,[2,283],{160:118,163:119,167:123,157:$VP,158:[1,416],159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:[2,279],158:[1,417]},o($Vy2,[2,286],{160:118,163:119,167:123,157:$VP,158:[1,418],159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:[2,281],158:[1,419]},o($V61,[2,294]),o($Vz2,[2,295],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$VA2,166:[1,420]},o($VB2,[2,305]),{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,170:421,172:249},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,170:422,172:249},o($VB2,[2,312],{96:[1,423]}),o($VC2,[2,308]),o($VC2,[2,309]),o($VC2,[2,310]),o($VC2,[2,311]),o($V61,[2,302]),{33:[2,304]},{7:424,8:425,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:426,8:427,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:428,8:429,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VD2,$V52,{95:430,96:$VE2}),o($VF2,[2,157]),o($VF2,[2,63],{70:[1,432]}),o($VF2,[2,64]),o($VG2,[2,72],{113:134,83:435,86:436,66:[1,433],76:[1,434],105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),{7:437,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([76,105,106,110,111,112,115,135,136],$VN1,{41:233,42:$VO1,73:[1,438]}),o($VG2,[2,75]),{34:273,38:269,39:$V2,40:$V3,41:270,42:$VO1,71:439,72:271,75:$Vg,77:440,78:272,79:274,80:275,81:276,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx},{76:[1,441],83:442,86:443,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,113:134,115:$Vd1,135:$Ve1,136:$V71},o($VH2,[2,69]),o($VH2,[2,70]),o($VH2,[2,71]),o($VI2,[2,80]),o($VI2,[2,81]),o($VI2,[2,82]),o($VI2,[2,83]),o($VI2,[2,84]),{83:444,105:$VK1,106:$VL1,135:$Ve1,136:$V71},{84:445,136:$VM1},o($Vd2,$Vi1,{57:[1,446]}),o($Vd2,$Vy1),{45:284,46:$V5,47:$V6,49:[1,447],50:448,51:$V02},o($VJ2,[2,44]),{4:449,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:[1,450],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,52:[1,451],53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VJ2,[2,49]),o($VN,[2,4]),o($VK2,[2,389],{160:118,163:119,167:123,193:$VV,194:$VW,195:$VX}),o($VK2,[2,390],{160:118,163:119,167:123,193:$VV,194:$VW,195:$VX}),o($Vc2,[2,391],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vc2,[2,392],{160:118,163:119,167:123,193:$VV,195:$VX}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,196,197,198,199,200,201,202,203,204],[2,393],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,197,198,199,200,201,202,203],[2,394],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,198,199,200,201,202,203],[2,395],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,199,200,201,202,203],[2,396],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,200,201,202,203],[2,397],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,201,202,203],[2,398],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,202,203],[2,399],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,203],[2,400],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,197,198,199,200,201,202,203,204],[2,401],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY}),o($Vz2,$VL2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,373]),{158:[1,452]},{158:[1,453]},o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VA2,{166:[1,454]}),{7:455,8:456,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:457,8:458,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:459,8:460,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz2,$VM2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,372]),o($Vv2,[2,218]),o($Vv2,[2,219]),o($VQ1,[2,143]),o($VQ1,[2,144]),o($VQ1,[2,145]),o($VQ1,[2,146]),{107:[1,461]},{7:317,8:319,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$V22,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,114:462,116:318,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,143:320,144:$V32,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VN2,[2,153],{160:118,163:119,167:123,143:463,76:$V22,144:$V32,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VN2,[2,154]),{76:$V22,143:464,144:$V32},o($VN2,[2,241],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:465,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VO2,[2,232]),o($VO2,$VP2),o($VQ1,[2,152]),o($Vf2,[2,60],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:466,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:467,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{92:468,93:$Vm,94:$Vn},o($VQ2,$VR2,{98:141,38:143,72:144,99:145,34:146,97:469,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{6:$VS2,33:$VT2},o($V72,[2,112]),{7:472,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,113]),o($Vu2,$Vm2,{160:118,163:119,167:123,76:[1,473],157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vu2,$Vn2),o($VU2,[2,35]),{6:$VM,35:[1,474]},{7:475,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V42,$V52,{95:329,91:[1,476],96:$V62}),o($V92,$Va2,{160:118,163:119,167:123,193:$VV}),o($V92,$Vb2,{160:118,163:119,167:123,193:$VV}),{7:477,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$Vo1,37:414,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{35:[1,478]},o($VO,[2,96],{160:118,163:119,167:123,157:$Vg2,159:$Vg2,165:$Vg2,183:$Vg2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,[2,402],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:479,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:480,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,365]),{7:481,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,269],{151:[1,482]}),{33:$Vo1,37:483},{33:$Vo1,34:485,37:486,38:484,39:$V2,40:$V3,117:$Vq},{177:487,179:356,180:$Ve2},{177:488,179:356,180:$Ve2},{35:[1,489],178:[1,490],179:491,180:$Ve2},o($VW2,[2,358]),{7:493,8:494,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,148:492,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VX2,[2,163],{160:118,163:119,167:123,37:495,33:$Vo1,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,166]),{7:496,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,497]},{35:[1,498]},o($Vf2,[2,34],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,94],{160:118,163:119,167:123,157:$Vg2,159:$Vg2,165:$Vg2,183:$Vg2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,371]),{7:500,8:499,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,501]},{34:502,117:$Vq},{45:503,46:$V5,47:$V6},{117:[1,505],125:504,130:$VF1},{45:506,46:$V5,47:$V6},{36:[1,507]},o($VD2,$V52,{95:508,96:$VY2}),o($VF2,[2,183]),{33:$Vh2,38:376,39:$V2,40:$V3,126:510,127:374,129:$Vi2},o($VF2,[2,188],{128:[1,511]}),o($VF2,[2,190],{128:[1,512]}),{38:513,39:$V2,40:$V3},o($Vf1,[2,194],{36:[1,514]}),o($VD2,$V52,{95:515,96:$VZ2}),o($VF2,[2,208]),{33:$Vj2,38:383,39:$V2,40:$V3,129:$Vk2,132:517,134:381},o($VF2,[2,213],{128:[1,518]}),o($VF2,[2,216],{128:[1,519]}),{6:[1,521],7:520,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,522],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V_2,[2,200],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:523,117:$Vq},{45:524,46:$V5,47:$V6},o($Vg1,[2,277]),{6:$VM,35:[1,525]},{7:526,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([14,32,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VP2,{6:$V$2,33:$V$2,74:$V$2,96:$V$2}),{7:527,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vo2,[2,230]),o($Vq2,[2,261],{6:$Vr2}),o($Vs2,[2,257]),{33:$V03,74:[1,528]},o([6,33,35,74],$VR2,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,147:221,145:225,100:226,7:333,8:334,146:530,140:531,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,96:$VJ1,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V13,[2,258],{6:[1,532]}),o($Vt2,[2,263]),o($VQ2,$V52,{95:399,142:533,96:$Vp2}),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:396,147:395,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vu2,[2,121],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vv2,[2,220]),o($Vg1,[2,138]),{107:[1,534],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{7:535,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vv2,[2,224]),o([6,33,137],$V52,{95:536,96:$V23}),o($V33,[2,242]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,138:538,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vg1,[2,141]),o($Vg1,[2,142]),o($V43,[2,362]),o($V53,[2,368]),{7:539,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:540,8:541,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:542,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:543,8:544,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:545,8:546,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VB2,[2,306]),o($VB2,[2,307]),{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,172:547},{33:$V63,157:$VP,158:[1,548],159:$VQ,160:118,163:119,165:$VR,166:[1,549],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,333],158:[1,550],166:[1,551]},{33:$V73,157:$VP,158:[1,552],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,334],158:[1,553]},{33:$V83,157:$VP,158:[1,554],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,349],158:[1,555]},{6:$V93,33:$Va3,119:[1,556]},o($Vb3,$VR2,{45:95,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,67:559,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),{7:560,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,561],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:562,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,563],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,76]),{84:564,136:$VM1},o($VI2,[2,89]),{74:[1,565],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{7:566,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,77],{113:134,83:435,86:436,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),o($VF2,[2,79],{113:134,83:442,86:443,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),o($VF2,[2,78]),{84:567,136:$VM1},o($VI2,[2,90]),{84:568,136:$VM1},o($VI2,[2,86]),o($Vg1,[2,51]),o($V$1,[2,43]),o($VJ2,[2,45]),{6:$VM,52:[1,569]},{4:570,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VJ2,[2,48]),{7:571,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:572,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:573,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,159,165,183],$V63,{160:118,163:119,167:123,158:[1,574],166:[1,575],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,576],166:[1,577]},o($Vc3,$V73,{160:118,163:119,167:123,158:[1,578],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,579]},o($Vc3,$V83,{160:118,163:119,167:123,158:[1,580],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,581]},o($VQ1,[2,150]),{35:[1,582]},o($VN2,[2,237],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:583,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VN2,[2,239],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:584,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VN2,[2,240],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,[2,61],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{35:[1,585],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{5:587,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:$Vo1,34:66,37:586,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,108]),{34:146,38:143,39:$V2,40:$V3,72:144,73:$Vl1,75:$Vm1,76:$Vn1,97:588,98:141,99:145,117:$Vq},o($Vd3,$Vk1,{97:140,98:141,38:143,72:144,99:145,34:146,90:589,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),o($V72,[2,114],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vu2,$V$2),o($VU2,[2,36]),o($Vz2,$VL2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{92:590,93:$Vm,94:$Vn},o($Vz2,$VM2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,383]),{35:[1,591],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf2,[2,404],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vo1,37:592,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:$Vo1,37:593},o($V61,[2,270]),{33:$Vo1,37:594},{33:$Vo1,37:595},o($Ve3,[2,274]),{35:[1,596],178:[1,597],179:491,180:$Ve2},{35:[1,598],178:[1,599],179:491,180:$Ve2},o($V61,[2,356]),{33:$Vo1,37:600},o($VW2,[2,359]),{33:$Vo1,37:601,96:[1,602]},o($Vf3,[2,264],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf3,[2,265]),o($V61,[2,164]),o($VX2,[2,167],{160:118,163:119,167:123,37:603,33:$Vo1,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,276]),o($V61,[2,33]),{33:$Vo1,37:604},{157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf1,[2,92]),o($Vf1,[2,170]),o($Vf1,[2,171],{123:[1,605]}),{36:[1,606]},{33:$Vh2,38:376,39:$V2,40:$V3,126:607,127:374,129:$Vi2},o($Vf1,[2,173],{123:[1,608]}),{45:609,46:$V5,47:$V6},{6:$Vg3,33:$Vh3,119:[1,610]},o($Vb3,$VR2,{38:376,127:613,39:$V2,40:$V3,129:$Vi2}),o($VQ2,$V52,{95:614,96:$VY2}),{38:615,39:$V2,40:$V3},{38:616,39:$V2,40:$V3},{36:[2,193]},{45:617,46:$V5,47:$V6},{6:$Vi3,33:$Vj3,119:[1,618]},o($Vb3,$VR2,{38:383,134:621,39:$V2,40:$V3,129:$Vk2}),o($VQ2,$V52,{95:622,96:$VZ2}),{38:623,39:$V2,40:$V3,129:[1,624]},{38:625,39:$V2,40:$V3},o($V_2,[2,197],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:626,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:627,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,628]},o($Vf1,[2,202],{123:[1,629]}),{155:[1,630]},{74:[1,631],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{74:[1,632],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vo2,[2,231]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,141:633,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vs2,[2,252]),o($V13,[2,259],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,100:226,7:333,8:334,147:395,145:396,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,96:$VJ1,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,145:225,146:634,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$V03,35:[1,635]},o($Vg1,[2,139]),{35:[1,636],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{6:$Vk3,33:$Vl3,137:[1,637]},o([6,33,35,137],$VR2,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,100:226,7:333,8:334,145:640,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VQ2,$V52,{95:641,96:$V23}),o($Vz2,[2,284],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vm3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,280]},o($Vz2,[2,287],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vn3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,282]},{33:$Vo3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,303]},o($VB2,[2,313]),{7:642,8:643,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:644,8:645,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:646,8:647,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:648,8:649,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:650,8:651,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:652,8:653,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:654,8:655,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:656,8:657,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vo2,[2,155]),{34:273,38:269,39:$V2,40:$V3,41:270,42:$VO1,43:266,44:$V4,45:95,46:$V5,47:$V6,67:658,68:261,69:262,71:263,72:271,73:$VU1,75:$VV1,76:$VW1,77:268,78:272,79:274,80:275,81:276,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx},o($Vd3,$VT1,{45:95,67:260,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,118:659,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),o($VF2,[2,158]),o($VF2,[2,65],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:660,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,67],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:661,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VI2,[2,87]),o($VG2,[2,73]),{74:[1,662],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($VI2,[2,88]),o($VI2,[2,85]),o($VJ2,[2,46]),{6:$VM,35:[1,663]},o($Vz2,$Vm3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vz2,$Vn3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vz2,$Vo3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:664,8:665,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:666,8:667,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:668,8:669,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:670,8:671,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:672,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:673,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:674,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:675,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{107:[1,676]},o($VN2,[2,236],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VN2,[2,238],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,62]),o($Vg1,[2,98]),o($VO,[2,100]),o($V72,[2,109]),o($VQ2,$V52,{95:677,96:$V62}),{33:$Vo1,37:586},o($V61,[2,403]),o($V43,[2,363]),o($V61,[2,271]),o($Ve3,[2,272]),o($Ve3,[2,273]),o($V61,[2,352]),{33:$Vo1,37:678},o($V61,[2,353]),{33:$Vo1,37:679},{35:[1,680]},o($VW2,[2,360],{6:[1,681]}),{7:682,8:683,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,168]),o($V53,[2,369]),{34:684,117:$Vq},{45:685,46:$V5,47:$V6},o($VD2,$V52,{95:686,96:$VY2}),{34:687,117:$Vq},o($Vf1,[2,175],{123:[1,688]}),{36:[1,689]},{38:376,39:$V2,40:$V3,127:690,129:$Vi2},{33:$Vh2,38:376,39:$V2,40:$V3,126:691,127:374,129:$Vi2},o($VF2,[2,184]),{6:$Vg3,33:$Vh3,35:[1,692]},o($VF2,[2,189]),o($VF2,[2,191]),o($Vf1,[2,204],{123:[1,693]}),o($Vf1,[2,195],{36:[1,694]}),{38:383,39:$V2,40:$V3,129:$Vk2,134:695},{33:$Vj2,38:383,39:$V2,40:$V3,129:$Vk2,132:696,134:381},o($VF2,[2,209]),{6:$Vi3,33:$Vj3,35:[1,697]},o($VF2,[2,214]),o($VF2,[2,215]),o($VF2,[2,217]),o($V_2,[2,198],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{35:[1,698],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf1,[2,201]),{34:699,117:$Vq},o($Vg1,[2,278]),o($Vg1,[2,234]),o($Vg1,[2,235]),o($VQ2,$V52,{95:399,142:700,96:$Vp2}),o($Vs2,[2,253]),o($Vs2,[2,254]),{107:[1,701]},o($Vv2,[2,225]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:702,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,138:703,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V33,[2,243]),{6:$Vk3,33:$Vl3,35:[1,704]},{33:$Vp3,157:$VP,159:$VQ,160:118,163:119,165:$VR,166:[1,705],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,335],166:[1,706]},{33:$Vq3,157:$VP,158:[1,707],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,339],158:[1,708]},{33:$Vr3,157:$VP,159:$VQ,160:118,163:119,165:$VR,166:[1,709],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,336],166:[1,710]},{33:$Vs3,157:$VP,158:[1,711],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,340],158:[1,712]},{33:$Vt3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,337]},{33:$Vu3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,338]},{33:$Vv3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,350]},{33:$Vw3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,351]},o($VF2,[2,159]),o($VQ2,$V52,{95:713,96:$VE2}),{35:[1,714],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{35:[1,715],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($VG2,[2,74]),{52:[1,716]},o($Vx3,$Vp3,{160:118,163:119,167:123,166:[1,717],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{166:[1,718]},o($Vc3,$Vq3,{160:118,163:119,167:123,158:[1,719],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,720]},o($Vx3,$Vr3,{160:118,163:119,167:123,166:[1,721],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{166:[1,722]},o($Vc3,$Vs3,{160:118,163:119,167:123,158:[1,723],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,724]},o($Vf2,$Vt3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vu3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vv3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vw3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VQ1,[2,151]),{6:$VS2,33:$VT2,35:[1,725]},{35:[1,726]},{35:[1,727]},o($V61,[2,357]),o($VW2,[2,361]),o($Vf3,[2,266],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf3,[2,267]),o($Vf1,[2,172]),o($Vf1,[2,179],{123:[1,728]}),{6:$Vg3,33:$Vh3,119:[1,729]},o($Vf1,[2,174]),{34:730,117:$Vq},{45:731,46:$V5,47:$V6},o($VF2,[2,185]),o($VQ2,$V52,{95:732,96:$VY2}),o($VF2,[2,186]),{34:733,117:$Vq},{45:734,46:$V5,47:$V6},o($VF2,[2,210]),o($VQ2,$V52,{95:735,96:$VZ2}),o($VF2,[2,211]),o($Vf1,[2,199]),o($Vf1,[2,203]),{33:$V03,35:[1,736]},o($Vg1,[2,140]),o($V33,[2,244]),o($VQ2,$V52,{95:737,96:$V23}),o($V33,[2,245]),{7:738,8:739,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:740,8:741,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:742,8:743,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:744,8:745,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:746,8:747,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:748,8:749,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:750,8:751,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:752,8:753,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{6:$V93,33:$Va3,35:[1,754]},o($VF2,[2,66]),o($VF2,[2,68]),o($VJ2,[2,47]),{7:755,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:756,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:757,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:758,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:759,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:760,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:761,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:762,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,110]),o($V61,[2,354]),o($V61,[2,355]),{34:763,117:$Vq},{36:[1,764]},o($Vf1,[2,176]),o($Vf1,[2,177],{123:[1,765]}),{6:$Vg3,33:$Vh3,35:[1,766]},o($Vf1,[2,205]),o($Vf1,[2,206],{123:[1,767]}),{6:$Vi3,33:$Vj3,35:[1,768]},o($Vs2,[2,255]),{6:$Vk3,33:$Vl3,35:[1,769]},{33:$Vy3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,341]},{33:$Vz3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,343]},{33:$VA3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,345]},{33:$VB3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,347]},{33:$VC3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,342]},{33:$VD3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,344]},{33:$VE3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,346]},{33:$VF3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,348]},o($VF2,[2,160]),o($Vf2,$Vy3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vz3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VA3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VB3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VC3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VD3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VE3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VF3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf1,[2,180]),{45:770,46:$V5,47:$V6},{34:771,117:$Vq},o($VF2,[2,187]),{34:772,117:$Vq},o($VF2,[2,212]),o($V33,[2,246]),o($Vf1,[2,181],{123:[1,773]}),o($Vf1,[2,178]),o($Vf1,[2,207]),{34:774,117:$Vq},o($Vf1,[2,182])],defaultActions:{255:[2,304],513:[2,193],541:[2,280],544:[2,282],546:[2,303],651:[2,337],653:[2,338],655:[2,350],657:[2,351],739:[2,341],741:[2,343],743:[2,345],745:[2,347],747:[2,342],749:[2,344],751:[2,346],753:[2,348]},parseError:function(str,hash){if(hash.recoverable)this.trace(str);else{var error=new Error(str);throw error.hash=hash,error}},parse:function(input){var self=this,stack=[0],vstack=[null],lstack=[],table=this.table,yytext=\"\",yylineno=0,yyleng=0,recovering=0,EOF=1,args=lstack.slice.call(arguments,1),lexer=Object.create(this.lexer),sharedState={yy:{}};for(var k in this.yy)Object.prototype.hasOwnProperty.call(this.yy,k)&&(sharedState.yy[k]=this.yy[k]);lexer.setInput(input,sharedState.yy),sharedState.yy.lexer=lexer,sharedState.yy.parser=this,\"undefined\"==typeof lexer.yylloc&&(lexer.yylloc={});var yyloc=lexer.yylloc;lstack.push(yyloc);var ranges=lexer.options&&lexer.options.ranges;this.parseError=\"function\"==typeof sharedState.yy.parseError?sharedState.yy.parseError:Object.getPrototypeOf(this).parseError;_token_stack:var lex=function(){var token;return token=lexer.lex()||EOF,\"number\"!=typeof token&&(token=self.symbols_[token]||token),token};for(var yyval={},symbol,preErrorSymbol,state,action,r,p,len,newState,expected;;){if(state=stack[stack.length-1],this.defaultActions[state]?action=this.defaultActions[state]:((null===symbol||\"undefined\"==typeof symbol)&&(symbol=lex()),action=table[state]&&table[state][symbol]),\"undefined\"==typeof action||!action.length||!action[0]){var errStr=\"\";for(p in expected=[],table[state])this.terminals_[p]&&p>2&&expected.push(\"'\"+this.terminals_[p]+\"'\");errStr=lexer.showPosition?\"Parse error on line \"+(yylineno+1)+\":\\n\"+lexer.showPosition()+\"\\nExpecting \"+expected.join(\", \")+\", got '\"+(this.terminals_[symbol]||symbol)+\"'\":\"Parse error on line \"+(yylineno+1)+\": Unexpected \"+(symbol==EOF?\"end of input\":\"'\"+(this.terminals_[symbol]||symbol)+\"'\"),this.parseError(errStr,{text:lexer.match,token:this.terminals_[symbol]||symbol,line:lexer.yylineno,loc:yyloc,expected:expected})}if(action[0]instanceof Array&&1<action.length)throw new Error(\"Parse Error: multiple actions possible at state: \"+state+\", token: \"+symbol);switch(action[0]){case 1:stack.push(symbol),vstack.push(lexer.yytext),lstack.push(lexer.yylloc),stack.push(action[1]),symbol=null,preErrorSymbol?(symbol=preErrorSymbol,preErrorSymbol=null):(yyleng=lexer.yyleng,yytext=lexer.yytext,yylineno=lexer.yylineno,yyloc=lexer.yylloc,0<recovering&&recovering--);break;case 2:if(len=this.productions_[action[1]][1],yyval.$=vstack[vstack.length-len],yyval._$={first_line:lstack[lstack.length-(len||1)].first_line,last_line:lstack[lstack.length-1].last_line,first_column:lstack[lstack.length-(len||1)].first_column,last_column:lstack[lstack.length-1].last_column},ranges&&(yyval._$.range=[lstack[lstack.length-(len||1)].range[0],lstack[lstack.length-1].range[1]]),r=this.performAction.apply(yyval,[yytext,yyleng,yylineno,sharedState.yy,action[1],vstack,lstack].concat(args)),\"undefined\"!=typeof r)return r;len&&(stack=stack.slice(0,2*(-1*len)),vstack=vstack.slice(0,-1*len),lstack=lstack.slice(0,-1*len)),stack.push(this.productions_[action[1]][0]),vstack.push(yyval.$),lstack.push(yyval._$),newState=table[stack[stack.length-2]][stack[stack.length-1]],stack.push(newState);break;case 3:return!0;}}return!0}};return Parser.prototype=parser,parser.Parser=Parser,new Parser}();return\"undefined\"!=typeof require&&\"undefined\"!=typeof exports&&(exports.parser=parser,exports.Parser=parser.Parser,exports.parse=function(){return parser.parse.apply(parser,arguments)},exports.main=function(){},require.main===module&&exports.main(process.argv.slice(1))),module.exports}(),require[\"./scope\"]=function(){var exports={};return function(){var indexOf=[].indexOf,Scope;exports.Scope=Scope=function(){\"use strict\";function Scope(parent,expressions,method,referencedVars){_classCallCheck(this,Scope);var ref,ref1;this.parent=parent,this.expressions=expressions,this.method=method,this.referencedVars=referencedVars,this.variables=[{name:\"arguments\",type:\"arguments\"}],this.comments={},this.positions={},this.parent||(this.utilities={}),this.root=null==(ref=null==(ref1=this.parent)?void 0:ref1.root)?this:ref}return _createClass(Scope,[{key:\"add\",value:function add(name,type,immediate){return this.shared&&!immediate?this.parent.add(name,type,immediate):Object.prototype.hasOwnProperty.call(this.positions,name)?this.variables[this.positions[name]].type=type:this.positions[name]=this.variables.push({name:name,type:type})-1}},{key:\"namedMethod\",value:function namedMethod(){var ref;return(null==(ref=this.method)?void 0:ref.name)||!this.parent?this.method:this.parent.namedMethod()}},{key:\"find\",value:function find(name){var type=1<arguments.length&&void 0!==arguments[1]?arguments[1]:\"var\";return!!this.check(name)||(this.add(name,type),!1)}},{key:\"parameter\",value:function parameter(name){return this.shared&&this.parent.check(name,!0)?void 0:this.add(name,\"param\")}},{key:\"check\",value:function check(name){var ref;return!!(this.type(name)||(null==(ref=this.parent)?void 0:ref.check(name)))}},{key:\"temporary\",value:function temporary(name,index){var single=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],diff,endCode,letter,newCode,num,startCode;return single?(startCode=name.charCodeAt(0),endCode=\"z\".charCodeAt(0),diff=endCode-startCode,newCode=startCode+index%(diff+1),letter=_StringfromCharCode(newCode),num=_Mathfloor(index/(diff+1)),\"\".concat(letter).concat(num||\"\")):\"\".concat(name).concat(index||\"\")}},{key:\"type\",value:function type(name){var i,len,ref,v;for(ref=this.variables,i=0,len=ref.length;i<len;i++)if(v=ref[i],v.name===name)return v.type;return null}},{key:\"freeVariable\",value:function freeVariable(name){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},index,ref,temp;for(index=0;temp=this.temporary(name,index,options.single),!!(this.check(temp)||0<=indexOf.call(this.root.referencedVars,temp));)index++;return(null==(ref=options.reserve)||ref)&&this.add(temp,\"var\",!0),temp}},{key:\"assign\",value:function assign(name,value){return this.add(name,{value:value,assigned:!0},!0),this.hasAssignments=!0}},{key:\"hasDeclarations\",value:function hasDeclarations(){return!!this.declaredVariables().length}},{key:\"declaredVariables\",value:function declaredVariables(){var v;return function(){var i,len,ref,results;for(ref=this.variables,results=[],(i=0,len=ref.length);i<len;i++)v=ref[i],\"var\"===v.type&&results.push(v.name);return results}.call(this).sort()}},{key:\"assignedVariables\",value:function assignedVariables(){var i,len,ref,results,v;for(ref=this.variables,results=[],(i=0,len=ref.length);i<len;i++)v=ref[i],v.type.assigned&&results.push(\"\".concat(v.name,\" = \").concat(v.type.value));return results}}]),Scope}()}.call(this),{exports:exports}.exports}(),require[\"./nodes\"]=function(){var exports={};return function(){var indexOf=[].indexOf,splice=[].splice,slice1=[].slice,Access,Arr,Assign,AwaitReturn,Base,Block,BooleanLiteral,Call,Catch,Class,ClassProperty,ClassPrototypeProperty,Code,CodeFragment,ComputedPropertyName,DefaultLiteral,Directive,DynamicImport,DynamicImportCall,Elision,EmptyInterpolation,ExecutableClassBody,Existence,Expansion,ExportAllDeclaration,ExportDeclaration,ExportDefaultDeclaration,ExportNamedDeclaration,ExportSpecifier,ExportSpecifierList,Extends,For,FuncDirectiveReturn,FuncGlyph,HEREGEX_OMIT,HereComment,HoistTarget,IdentifierLiteral,If,ImportClause,ImportDeclaration,ImportDefaultSpecifier,ImportNamespaceSpecifier,ImportSpecifier,ImportSpecifierList,In,Index,InfinityLiteral,Interpolation,JSXAttribute,JSXAttributes,JSXElement,JSXEmptyExpression,JSXExpressionContainer,JSXIdentifier,JSXNamespacedName,JSXTag,JSXText,JS_FORBIDDEN,LEADING_BLANK_LINE,LEVEL_ACCESS,LEVEL_COND,LEVEL_LIST,LEVEL_OP,LEVEL_PAREN,LEVEL_TOP,LineComment,Literal,MetaProperty,ModuleDeclaration,ModuleSpecifier,ModuleSpecifierList,NEGATE,NO,NaNLiteral,NullLiteral,NumberLiteral,Obj,ObjectProperty,Op,Param,Parens,PassthroughLiteral,PropertyName,Range,RegexLiteral,RegexWithInterpolations,Return,Root,SIMPLENUM,SIMPLE_STRING_OMIT,STRING_OMIT,Scope,Sequence,Slice,Splat,StatementLiteral,StringLiteral,StringWithInterpolations,Super,SuperCall,Switch,SwitchCase,SwitchWhen,TAB,THIS,TRAILING_BLANK_LINE,TaggedTemplateCall,TemplateElement,ThisLiteral,Throw,Try,UTILITIES,UndefinedLiteral,Value,While,YES,YieldReturn,addDataToNode,astAsBlockIfNeeded,attachCommentsToNode,compact,del,emptyExpressionLocationData,ends,extend,extractSameLineLocationDataFirst,extractSameLineLocationDataLast,flatten,fragmentsToText,greater,hasLineComments,indentInitial,isAstLocGreater,isFunction,isLiteralArguments,isLiteralThis,isLocationDataEndGreater,isLocationDataStartGreater,isNumber,isPlainObject,isUnassignable,jisonLocationDataToAstLocationData,lesser,locationDataToString,makeDelimitedLiteral,merge,mergeAstLocationData,mergeLocationData,moveComments,multident,parseNumber,replaceUnicodeCodePointEscapes,shouldCacheOrIsAssignable,sniffDirectives,some,starts,throwSyntaxError,_unfoldSoak,unshiftAfterComments,utility,zeroWidthLocationDataFromEndLocation;Error.stackTraceLimit=2e308;var _require4=require(\"./scope\");Scope=_require4.Scope;var _require5=require(\"./lexer\");isUnassignable=_require5.isUnassignable,JS_FORBIDDEN=_require5.JS_FORBIDDEN;var _require6=require(\"./helpers\");compact=_require6.compact,flatten=_require6.flatten,extend=_require6.extend,merge=_require6.merge,del=_require6.del,starts=_require6.starts,ends=_require6.ends,some=_require6.some,addDataToNode=_require6.addDataToNode,attachCommentsToNode=_require6.attachCommentsToNode,locationDataToString=_require6.locationDataToString,throwSyntaxError=_require6.throwSyntaxError,replaceUnicodeCodePointEscapes=_require6.replaceUnicodeCodePointEscapes,isFunction=_require6.isFunction,isPlainObject=_require6.isPlainObject,isNumber=_require6.isNumber,parseNumber=_require6.parseNumber,exports.extend=extend,exports.addDataToNode=addDataToNode,YES=function(){return!0},NO=function(){return!1},THIS=function(){return this},NEGATE=function(){return this.negated=!this.negated,this},exports.CodeFragment=CodeFragment=function(){\"use strict\";function CodeFragment(parent,code){_classCallCheck(this,CodeFragment);var ref1;this.code=\"\".concat(code),this.type=(null==parent||null==(ref1=parent.constructor)?void 0:ref1.name)||\"unknown\",this.locationData=null==parent?void 0:parent.locationData,this.comments=null==parent?void 0:parent.comments}return _createClass(CodeFragment,[{key:\"toString\",value:function toString(){return\"\".concat(this.code).concat(this.locationData?\": \"+locationDataToString(this.locationData):\"\")}}]),CodeFragment}(),fragmentsToText=function(fragments){var fragment;return function(){var j,len1,results1;for(results1=[],j=0,len1=fragments.length;j<len1;j++)fragment=fragments[j],results1.push(fragment.code);return results1}().join(\"\")},exports.Base=Base=function(){var Base=function(){\"use strict\";function Base(){_classCallCheck(this,Base)}return _createClass(Base,[{key:\"compile\",value:function compile(o,lvl){return fragmentsToText(this.compileToFragments(o,lvl))}},{key:\"compileWithoutComments\",value:function compileWithoutComments(o,lvl){var method=2<arguments.length&&void 0!==arguments[2]?arguments[2]:\"compile\",fragments,unwrapped;return this.comments&&(this.ignoreTheseCommentsTemporarily=this.comments,delete this.comments),unwrapped=this.unwrapAll(),unwrapped.comments&&(unwrapped.ignoreTheseCommentsTemporarily=unwrapped.comments,delete unwrapped.comments),fragments=this[method](o,lvl),this.ignoreTheseCommentsTemporarily&&(this.comments=this.ignoreTheseCommentsTemporarily,delete this.ignoreTheseCommentsTemporarily),unwrapped.ignoreTheseCommentsTemporarily&&(unwrapped.comments=unwrapped.ignoreTheseCommentsTemporarily,delete unwrapped.ignoreTheseCommentsTemporarily),fragments}},{key:\"compileNodeWithoutComments\",value:function compileNodeWithoutComments(o,lvl){return this.compileWithoutComments(o,lvl,\"compileNode\")}},{key:\"compileToFragments\",value:function compileToFragments(o,lvl){var fragments,node;return o=extend({},o),lvl&&(o.level=lvl),node=this.unfoldSoak(o)||this,node.tab=o.indent,fragments=o.level!==LEVEL_TOP&&node.isStatement(o)?node.compileClosure(o):node.compileNode(o),this.compileCommentFragments(o,node,fragments),fragments}},{key:\"compileToFragmentsWithoutComments\",value:function compileToFragmentsWithoutComments(o,lvl){return this.compileWithoutComments(o,lvl,\"compileToFragments\")}},{key:\"compileClosure\",value:function compileClosure(o){var args,argumentsNode,func,meth,parts,ref1,ref2;switch(this.checkForPureStatementInExpression(),o.sharedScope=!0,func=new Code([],Block.wrap([this])),args=[],this.contains(function(node){return node instanceof SuperCall})?func.bound=!0:((argumentsNode=this.contains(isLiteralArguments))||this.contains(isLiteralThis))&&(args=[new ThisLiteral],argumentsNode?(meth=\"apply\",args.push(new IdentifierLiteral(\"arguments\"))):meth=\"call\",func=new Value(func,[new Access(new PropertyName(meth))])),parts=new Call(func,args).compileNode(o),!1){case!(func.isGenerator||(null==(ref1=func.base)?void 0:ref1.isGenerator)):parts.unshift(this.makeCode(\"(yield* \")),parts.push(this.makeCode(\")\"));break;case!(func.isAsync||(null==(ref2=func.base)?void 0:ref2.isAsync)):parts.unshift(this.makeCode(\"(await \")),parts.push(this.makeCode(\")\"));}return parts}},{key:\"compileCommentFragments\",value:function compileCommentFragments(o,node,fragments){var base1,base2,comment,commentFragment,j,len1,ref1,unshiftCommentFragment;if(!node.comments)return fragments;for(unshiftCommentFragment=function(commentFragment){var precedingFragment;return commentFragment.unshift?unshiftAfterComments(fragments,commentFragment):(0!==fragments.length&&(precedingFragment=fragments[fragments.length-1],commentFragment.newLine&&\"\"!==precedingFragment.code&&!/\\n\\s*$/.test(precedingFragment.code)&&(commentFragment.code=\"\\n\".concat(commentFragment.code))),fragments.push(commentFragment))},ref1=node.comments,(j=0,len1=ref1.length);j<len1;j++)(comment=ref1[j],!!(0>indexOf.call(this.compiledComments,comment)))&&(this.compiledComments.push(comment),commentFragment=comment.here?new HereComment(comment).compileNode(o):new LineComment(comment).compileNode(o),commentFragment.isHereComment&&!commentFragment.newLine||node.includeCommentFragments()?unshiftCommentFragment(commentFragment):(0===fragments.length&&fragments.push(this.makeCode(\"\")),commentFragment.unshift?(null==(base1=fragments[0]).precedingComments&&(base1.precedingComments=[]),fragments[0].precedingComments.push(commentFragment)):(null==(base2=fragments[fragments.length-1]).followingComments&&(base2.followingComments=[]),fragments[fragments.length-1].followingComments.push(commentFragment))));return fragments}},{key:\"cache\",value:function cache(o,level,shouldCache){var complex,ref,sub;return complex=null==shouldCache?this.shouldCache():shouldCache(this),complex?(ref=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),sub=new Assign(ref,this),level?[sub.compileToFragments(o,level),[this.makeCode(ref.value)]]:[sub,ref]):(ref=level?this.compileToFragments(o,level):this,[ref,ref])}},{key:\"hoist\",value:function hoist(){var compileNode,compileToFragments,target;return this.hoisted=!0,target=new HoistTarget(this),compileNode=this.compileNode,compileToFragments=this.compileToFragments,this.compileNode=function(o){return target.update(compileNode,o)},this.compileToFragments=function(o){return target.update(compileToFragments,o)},target}},{key:\"cacheToCodeFragments\",value:function cacheToCodeFragments(cacheValues){return[fragmentsToText(cacheValues[0]),fragmentsToText(cacheValues[1])]}},{key:\"makeReturn\",value:function makeReturn(results,mark){var node;return mark?void(this.canBeReturned=!0):(node=this.unwrapAll(),results?new Call(new Literal(\"\".concat(results,\".push\")),[node]):new Return(node))}},{key:\"contains\",value:function contains(pred){var node;return node=void 0,this.traverseChildren(!1,function(n){if(pred(n))return node=n,!1}),node}},{key:\"lastNode\",value:function lastNode(list){return 0===list.length?null:list[list.length-1]}},{key:\"toString\",value:function toString(){var idt=0<arguments.length&&void 0!==arguments[0]?arguments[0]:\"\",name=1<arguments.length&&void 0!==arguments[1]?arguments[1]:this.constructor.name,tree;return tree=\"\\n\"+idt+name,this.soak&&(tree+=\"?\"),this.eachChild(function(node){return tree+=node.toString(idt+TAB)}),tree}},{key:\"checkForPureStatementInExpression\",value:function checkForPureStatementInExpression(){var jumpNode;if(jumpNode=this.jumps())return jumpNode.error(\"cannot use a pure statement in an expression\")}},{key:\"ast\",value:function ast(o,level){var astNode;return o=this.astInitialize(o,level),astNode=this.astNode(o),null!=this.astNode&&this.canBeReturned&&Object.assign(astNode,{returns:!0}),astNode}},{key:\"astInitialize\",value:function astInitialize(o,level){return o=Object.assign({},o),null!=level&&(o.level=level),o.level>LEVEL_TOP&&this.checkForPureStatementInExpression(),this.isStatement(o)&&o.level!==LEVEL_TOP&&null!=o.scope&&this.makeReturn(null,!0),o}},{key:\"astNode\",value:function astNode(o){return Object.assign({},{type:this.astType(o)},this.astProperties(o),this.astLocationData())}},{key:\"astProperties\",value:function astProperties(){return{}}},{key:\"astType\",value:function astType(){return this.constructor.name}},{key:\"astLocationData\",value:function astLocationData(){return jisonLocationDataToAstLocationData(this.locationData)}},{key:\"isStatementAst\",value:function isStatementAst(o){return this.isStatement(o)}},{key:\"eachChild\",value:function eachChild(func){var attr,child,j,k,len1,len2,ref1,ref2;if(!this.children)return this;for(ref1=this.children,j=0,len1=ref1.length;j<len1;j++)if(attr=ref1[j],this[attr])for(ref2=flatten([this[attr]]),k=0,len2=ref2.length;k<len2;k++)if(child=ref2[k],!1===func(child))return this;return this}},{key:\"traverseChildren\",value:function traverseChildren(crossScope,func){return this.eachChild(function(child){var recur;if(recur=func(child),!1!==recur)return child.traverseChildren(crossScope,func)})}},{key:\"replaceInContext\",value:function replaceInContext(match,replacement){var attr,child,children,i,j,k,len1,len2,ref1,ref2;if(!this.children)return!1;for(ref1=this.children,j=0,len1=ref1.length;j<len1;j++)if(attr=ref1[j],children=this[attr])if(Array.isArray(children))for(i=k=0,len2=children.length;k<len2;i=++k){if(child=children[i],match(child))return splice.apply(children,[i,i-i+1].concat(ref2=replacement(child,this))),ref2,!0;if(child.replaceInContext(match,replacement))return!0}else{if(match(children))return this[attr]=replacement(children,this),!0;if(children.replaceInContext(match,replacement))return!0}}},{key:\"invert\",value:function invert(){return new Op(\"!\",this)}},{key:\"unwrapAll\",value:function unwrapAll(){var node;for(node=this;node!==(node=node.unwrap());)continue;return node}},{key:\"updateLocationDataIfMissing\",value:function updateLocationDataIfMissing(locationData,force){return(force&&(this.forceUpdateLocation=!0),this.locationData&&!this.forceUpdateLocation)?this:(delete this.forceUpdateLocation,this.locationData=locationData,this.eachChild(function(child){return child.updateLocationDataIfMissing(locationData)}))}},{key:\"withLocationDataFrom\",value:function withLocationDataFrom(_ref19){var locationData=_ref19.locationData;return this.updateLocationDataIfMissing(locationData)}},{key:\"withLocationDataAndCommentsFrom\",value:function withLocationDataAndCommentsFrom(node){var comments;return this.withLocationDataFrom(node),comments=node.comments,(null==comments?void 0:comments.length)&&(this.comments=comments),this}},{key:\"error\",value:function error(message){return throwSyntaxError(message,this.locationData)}},{key:\"makeCode\",value:function makeCode(code){return new CodeFragment(this,code)}},{key:\"wrapInParentheses\",value:function wrapInParentheses(fragments){return[this.makeCode(\"(\")].concat(_toConsumableArray(fragments),[this.makeCode(\")\")])}},{key:\"wrapInBraces\",value:function wrapInBraces(fragments){return[this.makeCode(\"{\")].concat(_toConsumableArray(fragments),[this.makeCode(\"}\")])}},{key:\"joinFragmentArrays\",value:function joinFragmentArrays(fragmentsList,joinStr){var answer,fragments,i,j,len1;for(answer=[],i=j=0,len1=fragmentsList.length;j<len1;i=++j)fragments=fragmentsList[i],i&&answer.push(this.makeCode(joinStr)),answer=answer.concat(fragments);return answer}}]),Base}();return Base.prototype.children=[],Base.prototype.isStatement=NO,Base.prototype.compiledComments=[],Base.prototype.includeCommentFragments=NO,Base.prototype.jumps=NO,Base.prototype.shouldCache=YES,Base.prototype.isChainable=NO,Base.prototype.isAssignable=NO,Base.prototype.isNumber=NO,Base.prototype.unwrap=THIS,Base.prototype.unfoldSoak=NO,Base.prototype.assigns=NO,Base}.call(this),exports.HoistTarget=HoistTarget=function(_Base){\"use strict\";function HoistTarget(source1){var _this8;return _classCallCheck(this,HoistTarget),_this8=_super.call(this),_this8.source=source1,_this8.options={},_this8.targetFragments={fragments:[]},_this8}_inherits(HoistTarget,_Base);var _super=_createSuper(HoistTarget);return _createClass(HoistTarget,[{key:\"isStatement\",value:function isStatement(o){return this.source.isStatement(o)}},{key:\"update\",value:function update(compile,o){return this.targetFragments.fragments=compile.call(this.source,merge(o,this.options))}},{key:\"compileToFragments\",value:function compileToFragments(o,level){return this.options.indent=o.indent,this.options.level=null==level?o.level:level,[this.targetFragments]}},{key:\"compileNode\",value:function compileNode(o){return this.compileToFragments(o)}},{key:\"compileClosure\",value:function compileClosure(o){return this.compileToFragments(o)}}],[{key:\"expand\",value:function expand(fragments){var fragment,i,j,ref1;for(i=j=fragments.length-1;0<=j;i=j+=-1)fragment=fragments[i],fragment.fragments&&(splice.apply(fragments,[i,i-i+1].concat(ref1=this.expand(fragment.fragments))),ref1);return fragments}}]),HoistTarget}(Base),exports.Root=Root=function(){var Root=function(_Base2){\"use strict\";function Root(body1){var _this9;return _classCallCheck(this,Root),_this9=_super2.call(this),_this9.body=body1,_this9.isAsync=new Code([],_this9.body).isAsync,_this9}_inherits(Root,_Base2);var _super2=_createSuper(Root);return _createClass(Root,[{key:\"compileNode\",value:function compileNode(o){var fragments,functionKeyword;return(o.indent=o.bare?\"\":TAB,o.level=LEVEL_TOP,o.compiling=!0,this.initializeScope(o),fragments=this.body.compileRoot(o),o.bare)?fragments:(functionKeyword=\"\".concat(this.isAsync?\"async \":\"\",\"function\"),[].concat(this.makeCode(\"(\".concat(functionKeyword,\"() {\\n\")),fragments,this.makeCode(\"\\n}).call(this);\\n\")))}},{key:\"initializeScope\",value:function initializeScope(o){var j,len1,name,ref1,ref2,results1;for(o.scope=new Scope(null,this.body,null,null==(ref1=o.referencedVars)?[]:ref1),ref2=o.locals||[],results1=[],(j=0,len1=ref2.length);j<len1;j++)name=ref2[j],results1.push(o.scope.parameter(name));return results1}},{key:\"commentsAst\",value:function commentsAst(){var comment,commentToken,j,len1,ref1,results1;for(null==this.allComments&&(this.allComments=function(){var j,len1,ref1,ref2,results1;for(ref2=null==(ref1=this.allCommentTokens)?[]:ref1,results1=[],(j=0,len1=ref2.length);j<len1;j++)commentToken=ref2[j],commentToken.heregex||(commentToken.here?results1.push(new HereComment(commentToken)):results1.push(new LineComment(commentToken)));return results1}.call(this)),ref1=this.allComments,results1=[],(j=0,len1=ref1.length);j<len1;j++)comment=ref1[j],results1.push(comment.ast());return results1}},{key:\"astNode\",value:function astNode(o){return o.level=LEVEL_TOP,this.initializeScope(o),_get(_getPrototypeOf(Root.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"File\"}},{key:\"astProperties\",value:function astProperties(o){return this.body.isRootBlock=!0,{program:Object.assign(this.body.ast(o),this.astLocationData()),comments:this.commentsAst()}}}]),Root}(Base);return Root.prototype.children=[\"body\"],Root}.call(this),exports.Block=Block=function(){var Block=function(_Base3){\"use strict\";function Block(nodes){var _this10;return _classCallCheck(this,Block),_this10=_super3.call(this),_this10.expressions=compact(flatten(nodes||[])),_this10}_inherits(Block,_Base3);var _super3=_createSuper(Block);return _createClass(Block,[{key:\"push\",value:function push(node){return this.expressions.push(node),this}},{key:\"pop\",value:function pop(){return this.expressions.pop()}},{key:\"unshift\",value:function unshift(node){return this.expressions.unshift(node),this}},{key:\"unwrap\",value:function unwrap(){return 1===this.expressions.length?this.expressions[0]:this}},{key:\"isEmpty\",value:function isEmpty(){return!this.expressions.length}},{key:\"isStatement\",value:function isStatement(o){var exp,j,len1,ref1;for(ref1=this.expressions,j=0,len1=ref1.length;j<len1;j++)if(exp=ref1[j],exp.isStatement(o))return!0;return!1}},{key:\"jumps\",value:function jumps(o){var exp,j,jumpNode,len1,ref1;for(ref1=this.expressions,j=0,len1=ref1.length;j<len1;j++)if(exp=ref1[j],jumpNode=exp.jumps(o))return jumpNode}},{key:\"makeReturn\",value:function makeReturn(results,mark){var _slice1$call,_slice1$call2,expr,expressions,last,lastExp,len,penult,ref1,ref2;if(len=this.expressions.length,ref1=this.expressions,_slice1$call=slice1.call(ref1,-1),_slice1$call2=_slicedToArray(_slice1$call,1),lastExp=_slice1$call2[0],_slice1$call,lastExp=(null==lastExp?void 0:lastExp.unwrap())||!1,lastExp&&lastExp instanceof Parens&&1<lastExp.body.expressions.length){var _lastExp=lastExp;expressions=_lastExp.body.expressions;var _slice1$call3=slice1.call(expressions,-2),_slice1$call4=_slicedToArray(_slice1$call3,2);penult=_slice1$call4[0],last=_slice1$call4[1],penult=penult.unwrap(),last=last.unwrap(),penult instanceof JSXElement&&last instanceof JSXElement&&expressions[expressions.length-1].error(\"Adjacent JSX elements must be wrapped in an enclosing tag\")}if(mark)return void(null!=(ref2=this.expressions[len-1])&&ref2.makeReturn(results,mark));for(;len--;){expr=this.expressions[len],this.expressions[len]=expr.makeReturn(results),expr instanceof Return&&!expr.expression&&this.expressions.splice(len,1);break}return this}},{key:\"compile\",value:function compile(o,lvl){return o.scope?_get(_getPrototypeOf(Block.prototype),\"compile\",this).call(this,o,lvl):new Root(this).withLocationDataFrom(this).compile(o,lvl)}},{key:\"compileNode\",value:function compileNode(o){var answer,compiledNodes,fragments,index,j,lastFragment,len1,node,ref1,top;for(this.tab=o.indent,top=o.level===LEVEL_TOP,compiledNodes=[],ref1=this.expressions,(index=j=0,len1=ref1.length);j<len1;index=++j){if(node=ref1[index],node.hoisted){node.compileToFragments(o);continue}if(node=node.unfoldSoak(o)||node,node instanceof Block)compiledNodes.push(node.compileNode(o));else if(top){if(node.front=!0,fragments=node.compileToFragments(o),!node.isStatement(o)){fragments=indentInitial(fragments,this);var _slice1$call5=slice1.call(fragments,-1),_slice1$call6=_slicedToArray(_slice1$call5,1);lastFragment=_slice1$call6[0],\"\"===lastFragment.code||lastFragment.isComment||fragments.push(this.makeCode(\";\"))}compiledNodes.push(fragments)}else compiledNodes.push(node.compileToFragments(o,LEVEL_LIST))}return top?this.spaced?[].concat(this.joinFragmentArrays(compiledNodes,\"\\n\\n\"),this.makeCode(\"\\n\")):this.joinFragmentArrays(compiledNodes,\"\\n\"):(answer=compiledNodes.length?this.joinFragmentArrays(compiledNodes,\", \"):[this.makeCode(\"void 0\")],1<compiledNodes.length&&o.level>=LEVEL_LIST?this.wrapInParentheses(answer):answer)}},{key:\"compileRoot\",value:function compileRoot(o){var fragments;return this.spaced=!0,fragments=this.compileWithDeclarations(o),HoistTarget.expand(fragments),this.compileComments(fragments)}},{key:\"compileWithDeclarations\",value:function compileWithDeclarations(o){var assigns,declaredVariable,declaredVariables,declaredVariablesIndex,declars,exp,fragments,i,j,k,len1,len2,post,ref1,rest,scope,spaced;for(fragments=[],post=[],ref1=this.expressions,(i=j=0,len1=ref1.length);j<len1&&(exp=ref1[i],exp=exp.unwrap(),!!(exp instanceof Literal));i=++j);if(o=merge(o,{level:LEVEL_TOP}),i){rest=this.expressions.splice(i,9e9);var _ref20=[this.spaced,!1];spaced=_ref20[0],this.spaced=_ref20[1];var _ref21=[this.compileNode(o),spaced];fragments=_ref21[0],this.spaced=_ref21[1],this.expressions=rest}post=this.compileNode(o);var _o2=o;if(scope=_o2.scope,scope.expressions===this)if(declars=o.scope.hasDeclarations(),assigns=scope.hasAssignments,declars||assigns){if(i&&fragments.push(this.makeCode(\"\\n\")),fragments.push(this.makeCode(\"\".concat(this.tab,\"var \"))),declars)for(declaredVariables=scope.declaredVariables(),declaredVariablesIndex=k=0,len2=declaredVariables.length;k<len2;declaredVariablesIndex=++k){if(declaredVariable=declaredVariables[declaredVariablesIndex],fragments.push(this.makeCode(declaredVariable)),Object.prototype.hasOwnProperty.call(o.scope.comments,declaredVariable)){var _fragments;(_fragments=fragments).push.apply(_fragments,_toConsumableArray(o.scope.comments[declaredVariable]))}declaredVariablesIndex!==declaredVariables.length-1&&fragments.push(this.makeCode(\", \"))}assigns&&(declars&&fragments.push(this.makeCode(\",\\n\".concat(this.tab+TAB))),fragments.push(this.makeCode(scope.assignedVariables().join(\",\\n\".concat(this.tab+TAB))))),fragments.push(this.makeCode(\";\\n\".concat(this.spaced?\"\\n\":\"\")))}else fragments.length&&post.length&&fragments.push(this.makeCode(\"\\n\"));return fragments.concat(post)}},{key:\"compileComments\",value:function compileComments(fragments){var code,commentFragment,fragment,fragmentIndent,fragmentIndex,indent,j,k,l,len1,len2,len3,newLineIndex,onNextLine,p,pastFragment,pastFragmentIndex,q,ref1,ref2,ref3,ref4,trail,upcomingFragment,upcomingFragmentIndex;for(fragmentIndex=j=0,len1=fragments.length;j<len1;fragmentIndex=++j){if(fragment=fragments[fragmentIndex],fragment.precedingComments){for(fragmentIndent=\"\",ref1=fragments.slice(0,fragmentIndex+1),k=ref1.length-1;0<=k;k+=-1)if(pastFragment=ref1[k],indent=/^ {2,}/m.exec(pastFragment.code),indent){fragmentIndent=indent[0];break}else if(0<=indexOf.call(pastFragment.code,\"\\n\"))break;for(code=\"\\n\".concat(fragmentIndent)+function(){var l,len2,ref2,results1;for(ref2=fragment.precedingComments,results1=[],(l=0,len2=ref2.length);l<len2;l++)commentFragment=ref2[l],commentFragment.isHereComment&&commentFragment.multiline?results1.push(multident(commentFragment.code,fragmentIndent,!1)):results1.push(commentFragment.code);return results1}().join(\"\\n\".concat(fragmentIndent)).replace(/^(\\s*)$/gm,\"\"),ref2=fragments.slice(0,fragmentIndex+1),pastFragmentIndex=l=ref2.length-1;0<=l;pastFragmentIndex=l+=-1){if(pastFragment=ref2[pastFragmentIndex],newLineIndex=pastFragment.code.lastIndexOf(\"\\n\"),-1===newLineIndex)if(0===pastFragmentIndex)pastFragment.code=\"\\n\"+pastFragment.code,newLineIndex=0;else if(pastFragment.isStringWithInterpolations&&\"{\"===pastFragment.code)code=code.slice(1)+\"\\n\",newLineIndex=1;else continue;delete fragment.precedingComments,pastFragment.code=pastFragment.code.slice(0,newLineIndex)+code+pastFragment.code.slice(newLineIndex);break}}if(fragment.followingComments){if(trail=fragment.followingComments[0].trail,fragmentIndent=\"\",!(trail&&1===fragment.followingComments.length))for(onNextLine=!1,ref3=fragments.slice(fragmentIndex),(p=0,len2=ref3.length);p<len2;p++)if(upcomingFragment=ref3[p],!onNextLine){if(0<=indexOf.call(upcomingFragment.code,\"\\n\"))onNextLine=!0;else continue;}else if(indent=/^ {2,}/m.exec(upcomingFragment.code),indent){fragmentIndent=indent[0];break}else if(0<=indexOf.call(upcomingFragment.code,\"\\n\"))break;for(code=1===fragmentIndex&&/^\\s+$/.test(fragments[0].code)?\"\":trail?\" \":\"\\n\".concat(fragmentIndent),code+=function(){var len3,q,ref4,results1;for(ref4=fragment.followingComments,results1=[],(q=0,len3=ref4.length);q<len3;q++)commentFragment=ref4[q],commentFragment.isHereComment&&commentFragment.multiline?results1.push(multident(commentFragment.code,fragmentIndent,!1)):results1.push(commentFragment.code);return results1}().join(\"\\n\".concat(fragmentIndent)).replace(/^(\\s*)$/gm,\"\"),ref4=fragments.slice(fragmentIndex),(upcomingFragmentIndex=q=0,len3=ref4.length);q<len3;upcomingFragmentIndex=++q){if(upcomingFragment=ref4[upcomingFragmentIndex],newLineIndex=upcomingFragment.code.indexOf(\"\\n\"),-1===newLineIndex)if(upcomingFragmentIndex===fragments.length-1)upcomingFragment.code+=\"\\n\",newLineIndex=upcomingFragment.code.length;else if(upcomingFragment.isStringWithInterpolations&&\"}\"===upcomingFragment.code)code=\"\".concat(code,\"\\n\"),newLineIndex=0;else continue;delete fragment.followingComments,\"\\n\"===upcomingFragment.code&&(code=code.replace(/^\\n/,\"\")),upcomingFragment.code=upcomingFragment.code.slice(0,newLineIndex)+code+upcomingFragment.code.slice(newLineIndex);break}}}return fragments}},{key:\"astNode\",value:function astNode(o){return null!=o.level&&o.level!==LEVEL_TOP&&this.expressions.length?new Sequence(this.expressions).withLocationDataFrom(this).ast(o):_get(_getPrototypeOf(Block.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isRootBlock?\"Program\":this.isClassBody?\"ClassBody\":\"BlockStatement\"}},{key:\"astProperties\",value:function astProperties(o){var body,checkForDirectives,directives,expression,expressionAst,j,len1,ref1;for(checkForDirectives=del(o,\"checkForDirectives\"),(this.isRootBlock||checkForDirectives)&&sniffDirectives(this.expressions,{notFinalExpression:checkForDirectives}),directives=[],body=[],ref1=this.expressions,(j=0,len1=ref1.length);j<len1;j++)if(expression=ref1[j],expressionAst=expression.ast(o),null==expressionAst)continue;else expression instanceof Directive?directives.push(expressionAst):expression.isStatementAst(o)?body.push(expressionAst):body.push(Object.assign({type:\"ExpressionStatement\",expression:expressionAst},expression.astLocationData()));return{body:body,directives:directives}}},{key:\"astLocationData\",value:function astLocationData(){return this.isRootBlock&&null==this.locationData?void 0:_get(_getPrototypeOf(Block.prototype),\"astLocationData\",this).call(this)}}],[{key:\"wrap\",value:function wrap(nodes){return 1===nodes.length&&nodes[0]instanceof Block?nodes[0]:new Block(nodes)}}]),Block}(Base);return Block.prototype.children=[\"expressions\"],Block}.call(this),exports.Directive=Directive=function(_Base4){\"use strict\";function Directive(value1){var _this11;return _classCallCheck(this,Directive),_this11=_super4.call(this),_this11.value=value1,_this11}_inherits(Directive,_Base4);var _super4=_createSuper(Directive);return _createClass(Directive,[{key:\"astProperties\",value:function astProperties(o){return{value:Object.assign({},this.value.ast(o),{type:\"DirectiveLiteral\"})}}}]),Directive}(Base),exports.Literal=Literal=function(){var Literal=function(_Base5){\"use strict\";function Literal(value1){var _this12;return _classCallCheck(this,Literal),_this12=_super5.call(this),_this12.value=value1,_this12}_inherits(Literal,_Base5);var _super5=_createSuper(Literal);return _createClass(Literal,[{key:\"assigns\",value:function assigns(name){return name===this.value}},{key:\"compileNode\",value:function compileNode(){return[this.makeCode(this.value)]}},{key:\"astProperties\",value:function astProperties(){return{value:this.value}}},{key:\"toString\",value:function toString(){return\" \".concat(this.isStatement()?_get(_getPrototypeOf(Literal.prototype),\"toString\",this).call(this):this.constructor.name,\": \").concat(this.value)}}]),Literal}(Base);return Literal.prototype.shouldCache=NO,Literal}.call(this),exports.NumberLiteral=NumberLiteral=function(_Literal){\"use strict\";function NumberLiteral(value1){var _ref22=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},parsedValue=_ref22.parsedValue,_this13;return _classCallCheck(this,NumberLiteral),_this13=_super6.call(this),_this13.value=value1,_this13.parsedValue=parsedValue,null==_this13.parsedValue&&(isNumber(_this13.value)?(_this13.parsedValue=_this13.value,_this13.value=\"\".concat(_this13.value)):_this13.parsedValue=parseNumber(_this13.value)),_this13}_inherits(NumberLiteral,_Literal);var _super6=_createSuper(NumberLiteral);return _createClass(NumberLiteral,[{key:\"isBigInt\",value:function isBigInt(){return /n$/.test(this.value)}},{key:\"astType\",value:function astType(){return this.isBigInt()?\"BigIntLiteral\":\"NumericLiteral\"}},{key:\"astProperties\",value:function astProperties(){return{value:this.isBigInt()?this.parsedValue.toString():this.parsedValue,extra:{rawValue:this.isBigInt()?this.parsedValue.toString():this.parsedValue,raw:this.value}}}}]),NumberLiteral}(Literal),exports.InfinityLiteral=InfinityLiteral=function(_NumberLiteral){\"use strict\";function InfinityLiteral(value1){var _ref23=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref23$originalValue=_ref23.originalValue,originalValue=void 0===_ref23$originalValue?\"Infinity\":_ref23$originalValue,_this14;return _classCallCheck(this,InfinityLiteral),_this14=_super7.call(this),_this14.value=value1,_this14.originalValue=originalValue,_this14}_inherits(InfinityLiteral,_NumberLiteral);var _super7=_createSuper(InfinityLiteral);return _createClass(InfinityLiteral,[{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\"2e308\")]}},{key:\"astNode\",value:function astNode(o){return\"Infinity\"===this.originalValue?_get(_getPrototypeOf(InfinityLiteral.prototype),\"astNode\",this).call(this,o):new NumberLiteral(this.value).withLocationDataFrom(this).ast(o)}},{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:\"Infinity\",declaration:!1}}}]),InfinityLiteral}(NumberLiteral),exports.NaNLiteral=NaNLiteral=function(_NumberLiteral2){\"use strict\";function NaNLiteral(){return _classCallCheck(this,NaNLiteral),_super8.call(this,\"NaN\")}_inherits(NaNLiteral,_NumberLiteral2);var _super8=_createSuper(NaNLiteral);return _createClass(NaNLiteral,[{key:\"compileNode\",value:function compileNode(o){var code;return code=[this.makeCode(\"0/0\")],o.level>=LEVEL_OP?this.wrapInParentheses(code):code}},{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:\"NaN\",declaration:!1}}}]),NaNLiteral}(NumberLiteral),exports.StringLiteral=StringLiteral=function(_Literal2){\"use strict\";function StringLiteral(originalValue){var _ref24=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},quote=_ref24.quote,initialChunk=_ref24.initialChunk,finalChunk=_ref24.finalChunk,indent1=_ref24.indent,double1=_ref24.double,heregex1=_ref24.heregex,_this15;_classCallCheck(this,StringLiteral);var heredoc,indentRegex,val;return _this15=_super9.call(this,\"\"),_this15.originalValue=originalValue,_this15.quote=quote,_this15.initialChunk=initialChunk,_this15.finalChunk=finalChunk,_this15.indent=indent1,_this15.double=double1,_this15.heregex=heregex1,\"///\"===_this15.quote&&(_this15.quote=null),_this15.fromSourceString=null!=_this15.quote,null==_this15.quote&&(_this15.quote=\"\\\"\"),heredoc=_this15.isFromHeredoc(),val=_this15.originalValue,_this15.heregex?(val=val.replace(HEREGEX_OMIT,\"$1$2\"),val=replaceUnicodeCodePointEscapes(val,{flags:_this15.heregex.flags})):(val=val.replace(STRING_OMIT,\"$1\"),val=_this15.fromSourceString?heredoc?(_this15.indent?indentRegex=RegExp(\"\\\\n\".concat(_this15.indent),\"g\"):void 0,indentRegex?val=val.replace(indentRegex,\"\\n\"):void 0,_this15.initialChunk?val=val.replace(LEADING_BLANK_LINE,\"\"):void 0,_this15.finalChunk?val=val.replace(TRAILING_BLANK_LINE,\"\"):void 0,val):val.replace(SIMPLE_STRING_OMIT,function(match,offset){return _this15.initialChunk&&0===offset||_this15.finalChunk&&offset+match.length===val.length?\"\":\" \"}):val),_this15.delimiter=_this15.quote.charAt(0),_this15.value=makeDelimitedLiteral(val,{delimiter:_this15.delimiter,double:_this15.double}),_this15.unquotedValueForTemplateLiteral=makeDelimitedLiteral(val,{delimiter:\"`\",double:_this15.double,escapeNewlines:!1,includeDelimiters:!1,convertTrailingNullEscapes:!0}),_this15.unquotedValueForJSX=makeDelimitedLiteral(val,{double:_this15.double,escapeNewlines:!1,includeDelimiters:!1,escapeDelimiter:!1}),_this15}_inherits(StringLiteral,_Literal2);var _super9=_createSuper(StringLiteral);return _createClass(StringLiteral,[{key:\"compileNode\",value:function compileNode(o){return this.shouldGenerateTemplateLiteral()?StringWithInterpolations.fromStringLiteral(this).compileNode(o):this.jsx?[this.makeCode(this.unquotedValueForJSX)]:_get(_getPrototypeOf(StringLiteral.prototype),\"compileNode\",this).call(this,o)}},{key:\"withoutQuotesInLocationData\",value:function withoutQuotesInLocationData(){var copy,endsWithNewline,locationData;return endsWithNewline=\"\\n\"===this.originalValue.slice(-1),locationData=Object.assign({},this.locationData),locationData.first_column+=this.quote.length,endsWithNewline?(locationData.last_line-=1,locationData.last_column=locationData.last_line===locationData.first_line?locationData.first_column+this.originalValue.length-\"\\n\".length:this.originalValue.slice(0,-1).length-\"\\n\".length-this.originalValue.slice(0,-1).lastIndexOf(\"\\n\")):locationData.last_column-=this.quote.length,locationData.last_column_exclusive-=this.quote.length,locationData.range=[locationData.range[0]+this.quote.length,locationData.range[1]-this.quote.length],copy=new StringLiteral(this.originalValue,{quote:this.quote,initialChunk:this.initialChunk,finalChunk:this.finalChunk,indent:this.indent,double:this.double,heregex:this.heregex}),copy.locationData=locationData,copy}},{key:\"isFromHeredoc\",value:function isFromHeredoc(){return 3===this.quote.length}},{key:\"shouldGenerateTemplateLiteral\",value:function shouldGenerateTemplateLiteral(){return this.isFromHeredoc()}},{key:\"astNode\",value:function astNode(o){return this.shouldGenerateTemplateLiteral()?StringWithInterpolations.fromStringLiteral(this).ast(o):_get(_getPrototypeOf(StringLiteral.prototype),\"astNode\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(){return{value:this.originalValue,extra:{raw:\"\".concat(this.delimiter).concat(this.originalValue).concat(this.delimiter)}}}}]),StringLiteral}(Literal),exports.RegexLiteral=RegexLiteral=function(){var RegexLiteral=function(_Literal3){\"use strict\";function RegexLiteral(value){var _ref25=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref25$delimiter=_ref25.delimiter,delimiter1=void 0===_ref25$delimiter?\"/\":_ref25$delimiter,_ref25$heregexComment=_ref25.heregexCommentTokens,heregexCommentTokens=void 0===_ref25$heregexComment?[]:_ref25$heregexComment,_this16;_classCallCheck(this,RegexLiteral);var endDelimiterIndex,heregex,val;return _this16=_super10.call(this,\"\"),_this16.delimiter=delimiter1,_this16.heregexCommentTokens=heregexCommentTokens,heregex=\"///\"===_this16.delimiter,endDelimiterIndex=value.lastIndexOf(\"/\"),_this16.flags=value.slice(endDelimiterIndex+1),val=_this16.originalValue=value.slice(1,endDelimiterIndex),heregex&&(val=val.replace(HEREGEX_OMIT,\"$1$2\")),val=replaceUnicodeCodePointEscapes(val,{flags:_this16.flags}),_this16.value=\"\".concat(makeDelimitedLiteral(val,{delimiter:\"/\"})).concat(_this16.flags),_this16}_inherits(RegexLiteral,_Literal3);var _super10=_createSuper(RegexLiteral);return _createClass(RegexLiteral,[{key:\"astType\",value:function astType(){return\"RegExpLiteral\"}},{key:\"astProperties\",value:function astProperties(o){var _this$REGEX_REGEX$exe=this.REGEX_REGEX.exec(this.value),_this$REGEX_REGEX$exe2=_slicedToArray(_this$REGEX_REGEX$exe,2),heregexCommentToken,pattern;return pattern=_this$REGEX_REGEX$exe2[1],{value:void 0,pattern:pattern,flags:this.flags,delimiter:this.delimiter,originalPattern:this.originalValue,extra:{raw:this.value,originalRaw:\"\".concat(this.delimiter).concat(this.originalValue).concat(this.delimiter).concat(this.flags),rawValue:void 0},comments:function(){var j,len1,ref1,results1;for(ref1=this.heregexCommentTokens,results1=[],(j=0,len1=ref1.length);j<len1;j++)heregexCommentToken=ref1[j],heregexCommentToken.here?results1.push(new HereComment(heregexCommentToken).ast(o)):results1.push(new LineComment(heregexCommentToken).ast(o));return results1}.call(this)}}}]),RegexLiteral}(Literal);return RegexLiteral.prototype.REGEX_REGEX=/^\\/(.*)\\/\\w*$/,RegexLiteral}.call(this),exports.PassthroughLiteral=PassthroughLiteral=function(_Literal4){\"use strict\";function PassthroughLiteral(originalValue){var _ref26=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},here=_ref26.here,generated=_ref26.generated,_this17;return _classCallCheck(this,PassthroughLiteral),_this17=_super11.call(this,\"\"),_this17.originalValue=originalValue,_this17.here=here,_this17.generated=generated,_this17.value=_this17.originalValue.replace(/\\\\+(`|$)/g,function(string){var _Mathceil=Math.ceil;return string.slice(-_Mathceil(string.length/2))}),_this17}_inherits(PassthroughLiteral,_Literal4);var _super11=_createSuper(PassthroughLiteral);return _createClass(PassthroughLiteral,[{key:\"astNode\",value:function astNode(o){return this.generated?null:_get(_getPrototypeOf(PassthroughLiteral.prototype),\"astNode\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(){return{value:this.originalValue,here:!!this.here}}}]),PassthroughLiteral}(Literal),exports.IdentifierLiteral=IdentifierLiteral=function(){var IdentifierLiteral=function(_Literal5){\"use strict\";function IdentifierLiteral(){return _classCallCheck(this,IdentifierLiteral),_super12.apply(this,arguments)}_inherits(IdentifierLiteral,_Literal5);var _super12=_createSuper(IdentifierLiteral);return _createClass(IdentifierLiteral,[{key:\"eachName\",value:function eachName(iterator){return iterator(this)}},{key:\"astType\",value:function astType(){return this.jsx?\"JSXIdentifier\":\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:this.value,declaration:!!this.isDeclaration}}}]),IdentifierLiteral}(Literal);return IdentifierLiteral.prototype.isAssignable=YES,IdentifierLiteral}.call(this),exports.PropertyName=PropertyName=function(){var PropertyName=function(_Literal6){\"use strict\";function PropertyName(){return _classCallCheck(this,PropertyName),_super13.apply(this,arguments)}_inherits(PropertyName,_Literal6);var _super13=_createSuper(PropertyName);return _createClass(PropertyName,[{key:\"astType\",value:function astType(){return this.jsx?\"JSXIdentifier\":\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:this.value,declaration:!1}}}]),PropertyName}(Literal);return PropertyName.prototype.isAssignable=YES,PropertyName}.call(this),exports.ComputedPropertyName=ComputedPropertyName=function(_PropertyName){\"use strict\";function ComputedPropertyName(){return _classCallCheck(this,ComputedPropertyName),_super14.apply(this,arguments)}_inherits(ComputedPropertyName,_PropertyName);var _super14=_createSuper(ComputedPropertyName);return _createClass(ComputedPropertyName,[{key:\"compileNode\",value:function compileNode(o){return[this.makeCode(\"[\")].concat(_toConsumableArray(this.value.compileToFragments(o,LEVEL_LIST)),[this.makeCode(\"]\")])}},{key:\"astNode\",value:function astNode(o){return this.value.ast(o)}}]),ComputedPropertyName}(PropertyName),exports.StatementLiteral=StatementLiteral=function(){var StatementLiteral=function(_Literal7){\"use strict\";function StatementLiteral(){return _classCallCheck(this,StatementLiteral),_super15.apply(this,arguments)}_inherits(StatementLiteral,_Literal7);var _super15=_createSuper(StatementLiteral);return _createClass(StatementLiteral,[{key:\"jumps\",value:function jumps(o){return\"break\"!==this.value||(null==o?void 0:o.loop)||(null==o?void 0:o.block)?\"continue\"!==this.value||null!=o&&o.loop?void 0:this:this}},{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\"\".concat(this.tab).concat(this.value,\";\"))]}},{key:\"astType\",value:function astType(){switch(this.value){case\"continue\":return\"ContinueStatement\";case\"break\":return\"BreakStatement\";case\"debugger\":return\"DebuggerStatement\";}}}]),StatementLiteral}(Literal);return StatementLiteral.prototype.isStatement=YES,StatementLiteral.prototype.makeReturn=THIS,StatementLiteral}.call(this),exports.ThisLiteral=ThisLiteral=function(_Literal8){\"use strict\";function ThisLiteral(value){var _this18;return _classCallCheck(this,ThisLiteral),_this18=_super16.call(this,\"this\"),_this18.shorthand=\"@\"===value,_this18}_inherits(ThisLiteral,_Literal8);var _super16=_createSuper(ThisLiteral);return _createClass(ThisLiteral,[{key:\"compileNode\",value:function compileNode(o){var code,ref1;return code=(null==(ref1=o.scope.method)?void 0:ref1.bound)?o.scope.method.context:this.value,[this.makeCode(code)]}},{key:\"astType\",value:function astType(){return\"ThisExpression\"}},{key:\"astProperties\",value:function astProperties(){return{shorthand:this.shorthand}}}]),ThisLiteral}(Literal),exports.UndefinedLiteral=UndefinedLiteral=function(_Literal9){\"use strict\";function UndefinedLiteral(){return _classCallCheck(this,UndefinedLiteral),_super17.call(this,\"undefined\")}_inherits(UndefinedLiteral,_Literal9);var _super17=_createSuper(UndefinedLiteral);return _createClass(UndefinedLiteral,[{key:\"compileNode\",value:function compileNode(o){return[this.makeCode(o.level>=LEVEL_ACCESS?\"(void 0)\":\"void 0\")]}},{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:this.value,declaration:!1}}}]),UndefinedLiteral}(Literal),exports.NullLiteral=NullLiteral=function(_Literal10){\"use strict\";function NullLiteral(){return _classCallCheck(this,NullLiteral),_super18.call(this,\"null\")}_inherits(NullLiteral,_Literal10);var _super18=_createSuper(NullLiteral);return _createClass(NullLiteral)}(Literal),exports.BooleanLiteral=BooleanLiteral=function(_Literal11){\"use strict\";function BooleanLiteral(value){var _ref27=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},originalValue=_ref27.originalValue,_this19;return _classCallCheck(this,BooleanLiteral),_this19=_super19.call(this,value),_this19.originalValue=originalValue,null==_this19.originalValue&&(_this19.originalValue=_this19.value),_this19}_inherits(BooleanLiteral,_Literal11);var _super19=_createSuper(BooleanLiteral);return _createClass(BooleanLiteral,[{key:\"astProperties\",value:function astProperties(){return{value:\"true\"===this.value,name:this.originalValue}}}]),BooleanLiteral}(Literal),exports.DefaultLiteral=DefaultLiteral=function(_Literal12){\"use strict\";function DefaultLiteral(){return _classCallCheck(this,DefaultLiteral),_super20.apply(this,arguments)}_inherits(DefaultLiteral,_Literal12);var _super20=_createSuper(DefaultLiteral);return _createClass(DefaultLiteral,[{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:\"default\",declaration:!1}}}]),DefaultLiteral}(Literal),exports.Return=Return=function(){var Return=function(_Base6){\"use strict\";function Return(expression1){var _ref28=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},belongsToFuncDirectiveReturn=_ref28.belongsToFuncDirectiveReturn,_this20;return _classCallCheck(this,Return),_this20=_super21.call(this),_this20.expression=expression1,_this20.belongsToFuncDirectiveReturn=belongsToFuncDirectiveReturn,_this20}_inherits(Return,_Base6);var _super21=_createSuper(Return);return _createClass(Return,[{key:\"compileToFragments\",value:function compileToFragments(o,level){var expr,ref1;return expr=null==(ref1=this.expression)?void 0:ref1.makeReturn(),expr&&!(expr instanceof Return)?expr.compileToFragments(o,level):_get(_getPrototypeOf(Return.prototype),\"compileToFragments\",this).call(this,o,level)}},{key:\"compileNode\",value:function compileNode(o){var answer,fragment,j,len1;if(answer=[],this.expression){for(answer=this.expression.compileToFragments(o,LEVEL_PAREN),unshiftAfterComments(answer,this.makeCode(\"\".concat(this.tab,\"return \"))),(j=0,len1=answer.length);j<len1;j++)if(fragment=answer[j],fragment.isHereComment&&0<=indexOf.call(fragment.code,\"\\n\"))fragment.code=multident(fragment.code,this.tab);else if(fragment.isLineComment)fragment.code=\"\".concat(this.tab).concat(fragment.code);else break;}else answer.push(this.makeCode(\"\".concat(this.tab,\"return\")));return answer.push(this.makeCode(\";\")),answer}},{key:\"checkForPureStatementInExpression\",value:function checkForPureStatementInExpression(){return this.belongsToFuncDirectiveReturn?void 0:_get(_getPrototypeOf(Return.prototype),\"checkForPureStatementInExpression\",this).call(this)}},{key:\"astType\",value:function astType(){return\"ReturnStatement\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{argument:null==(ref1=null==(ref2=this.expression)?void 0:ref2.ast(o,LEVEL_PAREN))?null:ref1}}}]),Return}(Base);return Return.prototype.children=[\"expression\"],Return.prototype.isStatement=YES,Return.prototype.makeReturn=THIS,Return.prototype.jumps=THIS,Return}.call(this),exports.FuncDirectiveReturn=FuncDirectiveReturn=function(){var FuncDirectiveReturn=function(_Return){\"use strict\";function FuncDirectiveReturn(expression,_ref29){var returnKeyword=_ref29.returnKeyword,_this21;return _classCallCheck(this,FuncDirectiveReturn),_this21=_super22.call(this,expression),_this21.returnKeyword=returnKeyword,_this21}_inherits(FuncDirectiveReturn,_Return);var _super22=_createSuper(FuncDirectiveReturn);return _createClass(FuncDirectiveReturn,[{key:\"compileNode\",value:function compileNode(o){return this.checkScope(o),_get(_getPrototypeOf(FuncDirectiveReturn.prototype),\"compileNode\",this).call(this,o)}},{key:\"checkScope\",value:function checkScope(o){if(null==o.scope.parent)return this.error(\"\".concat(this.keyword,\" can only occur inside functions\"))}},{key:\"astNode\",value:function astNode(o){return this.checkScope(o),new Op(this.keyword,new Return(this.expression,{belongsToFuncDirectiveReturn:!0}).withLocationDataFrom(null==this.expression?this.returnKeyword:{locationData:mergeLocationData(this.returnKeyword.locationData,this.expression.locationData)})).withLocationDataFrom(this).ast(o)}}]),FuncDirectiveReturn}(Return);return FuncDirectiveReturn.prototype.isStatementAst=NO,FuncDirectiveReturn}.call(this),exports.YieldReturn=YieldReturn=function(){var YieldReturn=function(_FuncDirectiveReturn){\"use strict\";function YieldReturn(){return _classCallCheck(this,YieldReturn),_super23.apply(this,arguments)}_inherits(YieldReturn,_FuncDirectiveReturn);var _super23=_createSuper(YieldReturn);return _createClass(YieldReturn)}(FuncDirectiveReturn);return YieldReturn.prototype.keyword=\"yield\",YieldReturn}.call(this),exports.AwaitReturn=AwaitReturn=function(){var AwaitReturn=function(_FuncDirectiveReturn2){\"use strict\";function AwaitReturn(){return _classCallCheck(this,AwaitReturn),_super24.apply(this,arguments)}_inherits(AwaitReturn,_FuncDirectiveReturn2);var _super24=_createSuper(AwaitReturn);return _createClass(AwaitReturn)}(FuncDirectiveReturn);return AwaitReturn.prototype.keyword=\"await\",AwaitReturn}.call(this),exports.Value=Value=function(){var Value=function(_Base7){\"use strict\";function Value(base,props,tag){var isDefaultValue=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3],_this22;_classCallCheck(this,Value);var ref1,ref2;return(_this22=_super25.call(this),!props&&base instanceof Value)?_possibleConstructorReturn(_this22,base):(_this22.base=base,_this22.properties=props||[],_this22.tag=tag,tag&&(_this22[tag]=!0),_this22.isDefaultValue=isDefaultValue,(null==(ref1=_this22.base)?void 0:ref1.comments)&&_this22.base instanceof ThisLiteral&&null!=(null==(ref2=_this22.properties[0])?void 0:ref2.name)&&moveComments(_this22.base,_this22.properties[0].name),_this22)}_inherits(Value,_Base7);var _super25=_createSuper(Value);return _createClass(Value,[{key:\"add\",value:function add(props){return this.properties=this.properties.concat(props),this.forceUpdateLocation=!0,this}},{key:\"hasProperties\",value:function hasProperties(){return 0!==this.properties.length}},{key:\"bareLiteral\",value:function bareLiteral(type){return!this.properties.length&&this.base instanceof type}},{key:\"isArray\",value:function isArray(){return this.bareLiteral(Arr)}},{key:\"isRange\",value:function isRange(){return this.bareLiteral(Range)}},{key:\"shouldCache\",value:function shouldCache(){return this.hasProperties()||this.base.shouldCache()}},{key:\"isAssignable\",value:function isAssignable(opts){return this.hasProperties()||this.base.isAssignable(opts)}},{key:\"isNumber\",value:function(){return this.bareLiteral(NumberLiteral)}},{key:\"isString\",value:function isString(){return this.bareLiteral(StringLiteral)}},{key:\"isRegex\",value:function isRegex(){return this.bareLiteral(RegexLiteral)}},{key:\"isUndefined\",value:function isUndefined(){return this.bareLiteral(UndefinedLiteral)}},{key:\"isNull\",value:function isNull(){return this.bareLiteral(NullLiteral)}},{key:\"isBoolean\",value:function isBoolean(){return this.bareLiteral(BooleanLiteral)}},{key:\"isAtomic\",value:function isAtomic(){var j,len1,node,ref1;for(ref1=this.properties.concat(this.base),j=0,len1=ref1.length;j<len1;j++)if(node=ref1[j],node.soak||node instanceof Call||node instanceof Op&&\"do\"===node.operator)return!1;return!0}},{key:\"isNotCallable\",value:function isNotCallable(){return this.isNumber()||this.isString()||this.isRegex()||this.isArray()||this.isRange()||this.isSplice()||this.isObject()||this.isUndefined()||this.isNull()||this.isBoolean()}},{key:\"isStatement\",value:function isStatement(o){return!this.properties.length&&this.base.isStatement(o)}},{key:\"isJSXTag\",value:function isJSXTag(){return this.base instanceof JSXTag}},{key:\"assigns\",value:function assigns(name){return!this.properties.length&&this.base.assigns(name)}},{key:\"jumps\",value:function jumps(o){return!this.properties.length&&this.base.jumps(o)}},{key:\"isObject\",value:function isObject(onlyGenerated){return!this.properties.length&&this.base instanceof Obj&&(!onlyGenerated||this.base.generated)}},{key:\"isElision\",value:function isElision(){return!!(this.base instanceof Arr)&&this.base.hasElision()}},{key:\"isSplice\",value:function isSplice(){var _slice1$call7,_slice1$call8,lastProperty,ref1;return ref1=this.properties,_slice1$call7=slice1.call(ref1,-1),_slice1$call8=_slicedToArray(_slice1$call7,1),lastProperty=_slice1$call8[0],_slice1$call7,lastProperty instanceof Slice}},{key:\"looksStatic\",value:function looksStatic(className){var name,ref1,thisLiteral;return!!(((thisLiteral=this.base)instanceof ThisLiteral||(name=this.base).value===className)&&1===this.properties.length&&\"prototype\"!==(null==(ref1=this.properties[0].name)?void 0:ref1.value))&&{staticClassName:null==thisLiteral?name:thisLiteral}}},{key:\"unwrap\",value:function unwrap(){return this.properties.length?this:this.base}},{key:\"cacheReference\",value:function cacheReference(o){var _slice1$call9,_slice1$call10,base,bref,name,nref,ref1;return(ref1=this.properties,_slice1$call9=slice1.call(ref1,-1),_slice1$call10=_slicedToArray(_slice1$call9,1),name=_slice1$call10[0],_slice1$call9,2>this.properties.length&&!this.base.shouldCache()&&(null==name||!name.shouldCache()))?[this,this]:(base=new Value(this.base,this.properties.slice(0,-1)),base.shouldCache()&&(bref=new IdentifierLiteral(o.scope.freeVariable(\"base\")),base=new Value(new Parens(new Assign(bref,base)))),!name)?[base,bref]:(name.shouldCache()&&(nref=new IdentifierLiteral(o.scope.freeVariable(\"name\")),name=new Index(new Assign(nref,name.index)),nref=new Index(nref)),[base.add(name),new Value(bref||base.base,[nref||name])])}},{key:\"compileNode\",value:function compileNode(o){var fragments,j,len1,prop,props;for(this.base.front=this.front,props=this.properties,fragments=props.length&&null!=this.base.cached?this.base.cached:this.base.compileToFragments(o,props.length?LEVEL_ACCESS:null),props.length&&SIMPLENUM.test(fragmentsToText(fragments))&&fragments.push(this.makeCode(\".\")),(j=0,len1=props.length);j<len1;j++){var _fragments2;prop=props[j],(_fragments2=fragments).push.apply(_fragments2,_toConsumableArray(prop.compileToFragments(o)))}return fragments}},{key:\"unfoldSoak\",value:function unfoldSoak(o){var _this23=this;return null==this.unfoldedSoak?this.unfoldedSoak=function(){var fst,i,ifn,j,len1,prop,ref,ref1,snd;if(ifn=_this23.base.unfoldSoak(o),ifn){var _ifn$body$properties;return(_ifn$body$properties=ifn.body.properties).push.apply(_ifn$body$properties,_toConsumableArray(_this23.properties)),ifn}for(ref1=_this23.properties,i=j=0,len1=ref1.length;j<len1;i=++j)if(prop=ref1[i],!!prop.soak)return prop.soak=!1,fst=new Value(_this23.base,_this23.properties.slice(0,i)),snd=new Value(_this23.base,_this23.properties.slice(i)),fst.shouldCache()&&(ref=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),fst=new Parens(new Assign(ref,fst)),snd.base=ref),new If(new Existence(fst),snd,{soak:!0});return!1}():this.unfoldedSoak}},{key:\"eachName\",value:function eachName(iterator){var _ref30=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref30$checkAssignabi=_ref30.checkAssignability;return this.hasProperties()?iterator(this):!(void 0===_ref30$checkAssignabi||_ref30$checkAssignabi)||this.base.isAssignable()?this.base.eachName(iterator):this.error(\"tried to assign to unassignable value\")}},{key:\"object\",value:function(){var initialProperties,object;return this.hasProperties()?(initialProperties=this.properties.slice(0,this.properties.length-1),object=new Value(this.base,initialProperties,this.tag,this.isDefaultValue),object.locationData=0===initialProperties.length?this.base.locationData:mergeLocationData(this.base.locationData,initialProperties[initialProperties.length-1].locationData),object):this}},{key:\"containsSoak\",value:function containsSoak(){var j,len1,property,ref1;if(!this.hasProperties())return!1;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(property=ref1[j],property.soak)return!0;return!!(this.base instanceof Call&&this.base.soak)}},{key:\"astNode\",value:function astNode(o){return this.hasProperties()?_get(_getPrototypeOf(Value.prototype),\"astNode\",this).call(this,o):this.base.ast(o)}},{key:\"astType\",value:function astType(){return this.isJSXTag()?\"JSXMemberExpression\":this.containsSoak()?\"OptionalMemberExpression\":\"MemberExpression\"}},{key:\"astProperties\",value:function astProperties(o){var _slice1$call11,_slice1$call12,computed,property,ref1,ref2;return ref1=this.properties,_slice1$call11=slice1.call(ref1,-1),_slice1$call12=_slicedToArray(_slice1$call11,1),property=_slice1$call12[0],_slice1$call11,this.isJSXTag()&&(property.name.jsx=!0),computed=property instanceof Index||!((null==(ref2=property.name)?void 0:ref2.unwrap())instanceof PropertyName),{object:this.object().ast(o,LEVEL_ACCESS),property:property.ast(o,computed?LEVEL_PAREN:void 0),computed:computed,optional:!!property.soak,shorthand:!!property.shorthand}}},{key:\"astLocationData\",value:function astLocationData(){return this.isJSXTag()?mergeAstLocationData(jisonLocationDataToAstLocationData(this.base.tagNameLocationData),jisonLocationDataToAstLocationData(this.properties[this.properties.length-1].locationData)):_get(_getPrototypeOf(Value.prototype),\"astLocationData\",this).call(this)}}]),Value}(Base);return Value.prototype.children=[\"base\",\"properties\"],Value}.call(this),exports.MetaProperty=MetaProperty=function(){var MetaProperty=function(_Base8){\"use strict\";function MetaProperty(meta,property1){var _this24;return _classCallCheck(this,MetaProperty),_this24=_super26.call(this),_this24.meta=meta,_this24.property=property1,_this24}_inherits(MetaProperty,_Base8);var _super26=_createSuper(MetaProperty);return _createClass(MetaProperty,[{key:\"checkValid\",value:function checkValid(o){if(\"new\"===this.meta.value){if(!(this.property instanceof Access&&\"target\"===this.property.name.value))return this.error(\"the only valid meta property for new is new.target\");if(null==o.scope.parent)return this.error(\"new.target can only occur inside functions\")}else if(\"import\"===this.meta.value&&!(this.property instanceof Access&&\"meta\"===this.property.name.value))return this.error(\"the only valid meta property for import is import.meta\")}},{key:\"compileNode\",value:function compileNode(o){var _fragments3,_fragments4,fragments;return this.checkValid(o),fragments=[],(_fragments3=fragments).push.apply(_fragments3,_toConsumableArray(this.meta.compileToFragments(o,LEVEL_ACCESS))),(_fragments4=fragments).push.apply(_fragments4,_toConsumableArray(this.property.compileToFragments(o))),fragments}},{key:\"astProperties\",value:function astProperties(o){return this.checkValid(o),{meta:this.meta.ast(o,LEVEL_ACCESS),property:this.property.ast(o)}}}]),MetaProperty}(Base);return MetaProperty.prototype.children=[\"meta\",\"property\"],MetaProperty}.call(this),exports.HereComment=HereComment=function(_Base9){\"use strict\";function HereComment(_ref31){var content1=_ref31.content,newLine=_ref31.newLine,unshift=_ref31.unshift,locationData1=_ref31.locationData,_this25;return _classCallCheck(this,HereComment),_this25=_super27.call(this),_this25.content=content1,_this25.newLine=newLine,_this25.unshift=unshift,_this25.locationData=locationData1,_this25}_inherits(HereComment,_Base9);var _super27=_createSuper(HereComment);return _createClass(HereComment,[{key:\"compileNode\",value:function compileNode(){var fragment,hasLeadingMarks,indent,j,leadingWhitespace,len1,line,multiline,ref1;if(multiline=0<=indexOf.call(this.content,\"\\n\"),multiline){for(indent=null,ref1=this.content.split(\"\\n\"),(j=0,len1=ref1.length);j<len1;j++)line=ref1[j],leadingWhitespace=/^\\s*/.exec(line)[0],(!indent||leadingWhitespace.length<indent.length)&&(indent=leadingWhitespace);indent&&(this.content=this.content.replace(RegExp(\"\\\\n\".concat(indent),\"g\"),\"\\n\"))}return hasLeadingMarks=/\\n\\s*[#|\\*]/.test(this.content),hasLeadingMarks&&(this.content=this.content.replace(/^([ \\t]*)#(?=\\s)/gm,\" *\")),this.content=\"/*\".concat(this.content).concat(hasLeadingMarks?\" \":\"\",\"*/\"),fragment=this.makeCode(this.content),fragment.newLine=this.newLine,fragment.unshift=this.unshift,fragment.multiline=multiline,fragment.isComment=fragment.isHereComment=!0,fragment}},{key:\"astType\",value:function astType(){return\"CommentBlock\"}},{key:\"astProperties\",value:function astProperties(){return{value:this.content}}}]),HereComment}(Base),exports.LineComment=LineComment=function(_Base10){\"use strict\";function LineComment(_ref32){var content1=_ref32.content,newLine=_ref32.newLine,unshift=_ref32.unshift,locationData1=_ref32.locationData,precededByBlankLine=_ref32.precededByBlankLine,_this26;return _classCallCheck(this,LineComment),_this26=_super28.call(this),_this26.content=content1,_this26.newLine=newLine,_this26.unshift=unshift,_this26.locationData=locationData1,_this26.precededByBlankLine=precededByBlankLine,_this26}_inherits(LineComment,_Base10);var _super28=_createSuper(LineComment);return _createClass(LineComment,[{key:\"compileNode\",value:function compileNode(o){var fragment;return fragment=this.makeCode(/^\\s*$/.test(this.content)?\"\":\"\".concat(this.precededByBlankLine?\"\\n\".concat(o.indent):\"\",\"//\").concat(this.content)),fragment.newLine=this.newLine,fragment.unshift=this.unshift,fragment.trail=!this.newLine&&!this.unshift,fragment.isComment=fragment.isLineComment=!0,fragment}},{key:\"astType\",value:function astType(){return\"CommentLine\"}},{key:\"astProperties\",value:function astProperties(){return{value:this.content}}}]),LineComment}(Base),exports.JSXIdentifier=JSXIdentifier=function(_IdentifierLiteral){\"use strict\";function JSXIdentifier(){return _classCallCheck(this,JSXIdentifier),_super29.apply(this,arguments)}_inherits(JSXIdentifier,_IdentifierLiteral);var _super29=_createSuper(JSXIdentifier);return _createClass(JSXIdentifier,[{key:\"astType\",value:function astType(){return\"JSXIdentifier\"}}]),JSXIdentifier}(IdentifierLiteral),exports.JSXTag=JSXTag=function(_JSXIdentifier){\"use strict\";function JSXTag(value,_ref33){var tagNameLocationData=_ref33.tagNameLocationData,closingTagOpeningBracketLocationData=_ref33.closingTagOpeningBracketLocationData,closingTagSlashLocationData=_ref33.closingTagSlashLocationData,closingTagNameLocationData=_ref33.closingTagNameLocationData,closingTagClosingBracketLocationData=_ref33.closingTagClosingBracketLocationData,_this27;return _classCallCheck(this,JSXTag),_this27=_super30.call(this,value),_this27.tagNameLocationData=tagNameLocationData,_this27.closingTagOpeningBracketLocationData=closingTagOpeningBracketLocationData,_this27.closingTagSlashLocationData=closingTagSlashLocationData,_this27.closingTagNameLocationData=closingTagNameLocationData,_this27.closingTagClosingBracketLocationData=closingTagClosingBracketLocationData,_this27}_inherits(JSXTag,_JSXIdentifier);var _super30=_createSuper(JSXTag);return _createClass(JSXTag,[{key:\"astProperties\",value:function astProperties(){return{name:this.value}}}]),JSXTag}(JSXIdentifier),exports.JSXExpressionContainer=JSXExpressionContainer=function(){var JSXExpressionContainer=function(_Base11){\"use strict\";function JSXExpressionContainer(expression1){var _ref34=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},locationData=_ref34.locationData,_this28;return _classCallCheck(this,JSXExpressionContainer),_this28=_super31.call(this),_this28.expression=expression1,_this28.expression.jsxAttribute=!0,_this28.locationData=null==locationData?_this28.expression.locationData:locationData,_this28}_inherits(JSXExpressionContainer,_Base11);var _super31=_createSuper(JSXExpressionContainer);return _createClass(JSXExpressionContainer,[{key:\"compileNode\",value:function compileNode(o){return this.expression.compileNode(o)}},{key:\"astProperties\",value:function astProperties(o){return{expression:astAsBlockIfNeeded(this.expression,o)}}}]),JSXExpressionContainer}(Base);return JSXExpressionContainer.prototype.children=[\"expression\"],JSXExpressionContainer}.call(this),exports.JSXEmptyExpression=JSXEmptyExpression=function(_Base12){\"use strict\";function JSXEmptyExpression(){return _classCallCheck(this,JSXEmptyExpression),_super32.apply(this,arguments)}_inherits(JSXEmptyExpression,_Base12);var _super32=_createSuper(JSXEmptyExpression);return _createClass(JSXEmptyExpression)}(Base),exports.JSXText=JSXText=function(_Base13){\"use strict\";function JSXText(stringLiteral){var _this29;return _classCallCheck(this,JSXText),_this29=_super33.call(this),_this29.value=stringLiteral.unquotedValueForJSX,_this29.locationData=stringLiteral.locationData,_this29}_inherits(JSXText,_Base13);var _super33=_createSuper(JSXText);return _createClass(JSXText,[{key:\"astProperties\",value:function astProperties(){return{value:this.value,extra:{raw:this.value}}}}]),JSXText}(Base),exports.JSXAttribute=JSXAttribute=function(){var JSXAttribute=function(_Base14){\"use strict\";function JSXAttribute(_ref35){var name1=_ref35.name,value=_ref35.value,_this30;_classCallCheck(this,JSXAttribute);var ref1;return _this30=_super34.call(this),_this30.name=name1,_this30.value=null==value?null:(value=value.base,value instanceof StringLiteral&&!value.shouldGenerateTemplateLiteral()?value:new JSXExpressionContainer(value)),null!=(ref1=_this30.value)&&(ref1.comments=value.comments),_this30}_inherits(JSXAttribute,_Base14);var _super34=_createSuper(JSXAttribute);return _createClass(JSXAttribute,[{key:\"compileNode\",value:function compileNode(o){var compiledName,val;return(compiledName=this.name.compileToFragments(o,LEVEL_LIST),null==this.value)?compiledName:(val=this.value.compileToFragments(o,LEVEL_LIST),compiledName.concat(this.makeCode(\"=\"),val))}},{key:\"astProperties\",value:function astProperties(o){var name,ref1,ref2;return name=this.name,0<=indexOf.call(name.value,\":\")&&(name=new JSXNamespacedName(name)),{name:name.ast(o),value:null==(ref1=null==(ref2=this.value)?void 0:ref2.ast(o))?null:ref1}}}]),JSXAttribute}(Base);return JSXAttribute.prototype.children=[\"name\",\"value\"],JSXAttribute}.call(this),exports.JSXAttributes=JSXAttributes=function(){var JSXAttributes=function(_Base15){\"use strict\";function JSXAttributes(arr){var _this31;_classCallCheck(this,JSXAttributes);var attribute,base,j,k,len1,len2,object,property,ref1,ref2,value,variable;for(_this31=_super35.call(this),_this31.attributes=[],ref1=arr.objects,(j=0,len1=ref1.length);j<len1;j++){object=ref1[j],_this31.checkValidAttribute(object);var _object=object;if(base=_object.base,base instanceof IdentifierLiteral)attribute=new JSXAttribute({name:new JSXIdentifier(base.value).withLocationDataAndCommentsFrom(base)}),attribute.locationData=base.locationData,_this31.attributes.push(attribute);else if(!base.generated)attribute=base.properties[0],attribute.jsx=!0,attribute.locationData=base.locationData,_this31.attributes.push(attribute);else for(ref2=base.properties,k=0,len2=ref2.length;k<len2;k++){property=ref2[k];var _property=property;variable=_property.variable,value=_property.value,attribute=new JSXAttribute({name:new JSXIdentifier(variable.base.value).withLocationDataAndCommentsFrom(variable.base),value:value}),attribute.locationData=property.locationData,_this31.attributes.push(attribute)}}return _this31.locationData=arr.locationData,_this31}_inherits(JSXAttributes,_Base15);var _super35=_createSuper(JSXAttributes);return _createClass(JSXAttributes,[{key:\"checkValidAttribute\",value:function checkValidAttribute(object){var attribute,properties;if(attribute=object.base,properties=(null==attribute?void 0:attribute.properties)||[],!(attribute instanceof Obj||attribute instanceof IdentifierLiteral)||attribute instanceof Obj&&!attribute.generated&&(1<properties.length||!(properties[0]instanceof Splat)))return object.error(\"Unexpected token. Allowed JSX attributes are: id=\\\"val\\\", src={source}, {props...} or attribute.\")}},{key:\"compileNode\",value:function compileNode(o){var attribute,fragments,j,len1,ref1;for(fragments=[],ref1=this.attributes,(j=0,len1=ref1.length);j<len1;j++){var _fragments5;attribute=ref1[j],fragments.push(this.makeCode(\" \")),(_fragments5=fragments).push.apply(_fragments5,_toConsumableArray(attribute.compileToFragments(o,LEVEL_TOP)))}return fragments}},{key:\"astNode\",value:function astNode(o){var attribute,j,len1,ref1,results1;for(ref1=this.attributes,results1=[],(j=0,len1=ref1.length);j<len1;j++)attribute=ref1[j],results1.push(attribute.ast(o));return results1}}]),JSXAttributes}(Base);return JSXAttributes.prototype.children=[\"attributes\"],JSXAttributes}.call(this),exports.JSXNamespacedName=JSXNamespacedName=function(){var JSXNamespacedName=function(_Base16){\"use strict\";function JSXNamespacedName(tag){var _this32;_classCallCheck(this,JSXNamespacedName);var name,namespace;_this32=_super36.call(this);var _tag$value$split=tag.value.split(\":\"),_tag$value$split2=_slicedToArray(_tag$value$split,2);return namespace=_tag$value$split2[0],name=_tag$value$split2[1],_this32.namespace=new JSXIdentifier(namespace).withLocationDataFrom({locationData:extractSameLineLocationDataFirst(namespace.length)(tag.locationData)}),_this32.name=new JSXIdentifier(name).withLocationDataFrom({locationData:extractSameLineLocationDataLast(name.length)(tag.locationData)}),_this32.locationData=tag.locationData,_this32}_inherits(JSXNamespacedName,_Base16);var _super36=_createSuper(JSXNamespacedName);return _createClass(JSXNamespacedName,[{key:\"astProperties\",value:function astProperties(o){return{namespace:this.namespace.ast(o),name:this.name.ast(o)}}}]),JSXNamespacedName}(Base);return JSXNamespacedName.prototype.children=[\"namespace\",\"name\"],JSXNamespacedName}.call(this),exports.JSXElement=JSXElement=function(){var JSXElement=function(_Base17){\"use strict\";function JSXElement(_ref36){var tagName1=_ref36.tagName,attributes=_ref36.attributes,content1=_ref36.content,_this33;return _classCallCheck(this,JSXElement),_this33=_super37.call(this),_this33.tagName=tagName1,_this33.attributes=attributes,_this33.content=content1,_this33}_inherits(JSXElement,_Base17);var _super37=_createSuper(JSXElement);return _createClass(JSXElement,[{key:\"compileNode\",value:function compileNode(o){var _fragments6,_fragments7,fragments,ref1,tag;if(null!=(ref1=this.content)&&(ref1.base.jsx=!0),fragments=[this.makeCode(\"<\")],(_fragments6=fragments).push.apply(_fragments6,_toConsumableArray(tag=this.tagName.compileToFragments(o,LEVEL_ACCESS))),(_fragments7=fragments).push.apply(_fragments7,_toConsumableArray(this.attributes.compileToFragments(o))),this.content){var _fragments8,_fragments9;fragments.push(this.makeCode(\">\")),(_fragments8=fragments).push.apply(_fragments8,_toConsumableArray(this.content.compileNode(o,LEVEL_LIST))),(_fragments9=fragments).push.apply(_fragments9,[this.makeCode(\"</\")].concat(_toConsumableArray(tag),[this.makeCode(\">\")]))}else fragments.push(this.makeCode(\" />\"));return fragments}},{key:\"isFragment\",value:function isFragment(){return!this.tagName.base.value.length}},{key:\"astNode\",value:function astNode(o){var tagName;return this.openingElementLocationData=jisonLocationDataToAstLocationData(this.attributes.locationData),tagName=this.tagName.base,tagName.locationData=tagName.tagNameLocationData,null!=this.content&&(this.closingElementLocationData=mergeAstLocationData(jisonLocationDataToAstLocationData(tagName.closingTagOpeningBracketLocationData),jisonLocationDataToAstLocationData(tagName.closingTagClosingBracketLocationData))),_get(_getPrototypeOf(JSXElement.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isFragment()?\"JSXFragment\":\"JSXElement\"}},{key:\"elementAstProperties\",value:function elementAstProperties(o){var _this34=this,closingElement,columnDiff,currentExpr,openingElement,rangeDiff,ref1,shiftAstLocationData,tagNameAst;if(tagNameAst=function(){var tag;return tag=_this34.tagName.unwrap(),(null==tag?void 0:tag.value)&&0<=indexOf.call(tag.value,\":\")&&(tag=new JSXNamespacedName(tag)),tag.ast(o)},openingElement=Object.assign({type:\"JSXOpeningElement\",name:tagNameAst(),selfClosing:null==this.closingElementLocationData,attributes:this.attributes.ast(o)},this.openingElementLocationData),closingElement=null,null!=this.closingElementLocationData&&(closingElement=Object.assign({type:\"JSXClosingElement\",name:Object.assign(tagNameAst(),jisonLocationDataToAstLocationData(this.tagName.base.closingTagNameLocationData))},this.closingElementLocationData),\"JSXMemberExpression\"===(ref1=closingElement.name.type)||\"JSXNamespacedName\"===ref1))if(rangeDiff=closingElement.range[0]-openingElement.range[0]+\"/\".length,columnDiff=closingElement.loc.start.column-openingElement.loc.start.column+\"/\".length,shiftAstLocationData=function(node){return node.range=[node.range[0]+rangeDiff,node.range[1]+rangeDiff],node.start+=rangeDiff,node.end+=rangeDiff,node.loc.start={line:_this34.closingElementLocationData.loc.start.line,column:node.loc.start.column+columnDiff},node.loc.end={line:_this34.closingElementLocationData.loc.start.line,column:node.loc.end.column+columnDiff}},\"JSXMemberExpression\"===closingElement.name.type){for(currentExpr=closingElement.name;\"JSXMemberExpression\"===currentExpr.type;)currentExpr!==closingElement.name&&shiftAstLocationData(currentExpr),shiftAstLocationData(currentExpr.property),currentExpr=currentExpr.object;shiftAstLocationData(currentExpr)}else shiftAstLocationData(closingElement.name.namespace),shiftAstLocationData(closingElement.name.name);return{openingElement:openingElement,closingElement:closingElement}}},{key:\"fragmentAstProperties\",value:function fragmentAstProperties(){var closingFragment,openingFragment;return openingFragment=Object.assign({type:\"JSXOpeningFragment\"},this.openingElementLocationData),closingFragment=Object.assign({type:\"JSXClosingFragment\"},this.closingElementLocationData),{openingFragment:openingFragment,closingFragment:closingFragment}}},{key:\"contentAst\",value:function contentAst(o){var base1,child,children,content,element,emptyExpression,expression,j,len1,results1,unwrapped;if(!this.content||(\"function\"==typeof(base1=this.content.base).isEmpty?base1.isEmpty():void 0))return[];for(content=this.content.unwrapAll(),children=function(){var j,len1,ref1,results1;if(content instanceof StringLiteral)return[new JSXText(content)];for(ref1=this.content.unwrapAll().extractElements(o,{includeInterpolationWrappers:!0,isJsx:!0}),results1=[],(j=0,len1=ref1.length);j<len1;j++)if(element=ref1[j],element instanceof StringLiteral)results1.push(new JSXText(element));else{var _element=element;expression=_element.expression,null==expression?(emptyExpression=new JSXEmptyExpression,emptyExpression.locationData=emptyExpressionLocationData({interpolationNode:element,openingBrace:\"{\",closingBrace:\"}\"}),results1.push(new JSXExpressionContainer(emptyExpression,{locationData:element.locationData}))):(unwrapped=expression.unwrapAll(),unwrapped instanceof JSXElement&&unwrapped.locationData.range[0]===element.locationData.range[0]?results1.push(unwrapped):results1.push(new JSXExpressionContainer(unwrapped,{locationData:element.locationData})))}return results1}.call(this),results1=[],(j=0,len1=children.length);j<len1;j++)child=children[j],child instanceof JSXText&&0===child.value.length||results1.push(child.ast(o));return results1}},{key:\"astProperties\",value:function astProperties(o){return Object.assign(this.isFragment()?this.fragmentAstProperties(o):this.elementAstProperties(o),{children:this.contentAst(o)})}},{key:\"astLocationData\",value:function astLocationData(){return null==this.closingElementLocationData?this.openingElementLocationData:mergeAstLocationData(this.openingElementLocationData,this.closingElementLocationData)}}]),JSXElement}(Base);return JSXElement.prototype.children=[\"tagName\",\"attributes\",\"content\"],JSXElement}.call(this),exports.Call=Call=function(){var Call=function(_Base18){\"use strict\";function Call(variable1){var args1=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[],soak1=2<arguments.length?arguments[2]:void 0,token1=3<arguments.length?arguments[3]:void 0,_this35;_classCallCheck(this,Call);var ref1;return(_this35=_super38.call(this),_this35.variable=variable1,_this35.args=args1,_this35.soak=soak1,_this35.token=token1,_this35.implicit=_this35.args.implicit,_this35.isNew=!1,_this35.variable instanceof Value&&_this35.variable.isNotCallable()&&_this35.variable.error(\"literal is not a function\"),_this35.variable.base instanceof JSXTag)?_possibleConstructorReturn(_this35,new JSXElement({tagName:_this35.variable,attributes:new JSXAttributes(_this35.args[0].base),content:_this35.args[1]})):(\"RegExp\"===(null==(ref1=_this35.variable.base)?void 0:ref1.value)&&0!==_this35.args.length&&moveComments(_this35.variable,_this35.args[0]),_this35)}_inherits(Call,_Base18);var _super38=_createSuper(Call);return _createClass(Call,[{key:\"updateLocationDataIfMissing\",value:function updateLocationDataIfMissing(locationData){var base,ref1;return this.locationData&&this.needsUpdatedStartLocation&&(this.locationData=Object.assign({},this.locationData,{first_line:locationData.first_line,first_column:locationData.first_column,range:[locationData.range[0],this.locationData.range[1]]}),base=(null==(ref1=this.variable)?void 0:ref1.base)||this.variable,base.needsUpdatedStartLocation&&(this.variable.locationData=Object.assign({},this.variable.locationData,{first_line:locationData.first_line,first_column:locationData.first_column,range:[locationData.range[0],this.variable.locationData.range[1]]}),base.updateLocationDataIfMissing(locationData)),delete this.needsUpdatedStartLocation),_get(_getPrototypeOf(Call.prototype),\"updateLocationDataIfMissing\",this).call(this,locationData)}},{key:\"newInstance\",value:function newInstance(){var base,ref1;return base=(null==(ref1=this.variable)?void 0:ref1.base)||this.variable,base instanceof Call&&!base.isNew?base.newInstance():this.isNew=!0,this.needsUpdatedStartLocation=!0,this}},{key:\"unfoldSoak\",value:function unfoldSoak(o){var call,ifn,j,left,len1,list,ref1,rite;if(this.soak){if(this.variable instanceof Super)left=new Literal(this.variable.compile(o)),rite=new Value(left),null==this.variable.accessor&&this.variable.error(\"Unsupported reference to 'super'\");else{if(ifn=_unfoldSoak(o,this,\"variable\"))return ifn;var _Value$cacheReference=new Value(this.variable).cacheReference(o),_Value$cacheReference2=_slicedToArray(_Value$cacheReference,2);left=_Value$cacheReference2[0],rite=_Value$cacheReference2[1]}return rite=new Call(rite,this.args),rite.isNew=this.isNew,left=new Literal(\"typeof \".concat(left.compile(o),\" === \\\"function\\\"\")),new If(left,new Value(rite),{soak:!0})}for(call=this,list=[];;){if(call.variable instanceof Call){list.push(call),call=call.variable;continue}if(!(call.variable instanceof Value))break;if(list.push(call),!((call=call.variable.base)instanceof Call))break}for(ref1=list.reverse(),j=0,len1=ref1.length;j<len1;j++)call=ref1[j],ifn&&(call.variable instanceof Call?call.variable=ifn:call.variable.base=ifn),ifn=_unfoldSoak(o,call,\"variable\");return ifn}},{key:\"compileNode\",value:function compileNode(o){var _fragments10,_fragments11,arg,argCode,argIndex,cache,compiledArgs,fragments,j,len1,ref1,ref2,ref3,ref4,varAccess;if(this.checkForNewSuper(),null!=(ref1=this.variable)&&(ref1.front=this.front),compiledArgs=[],varAccess=(null==(ref2=this.variable)||null==(ref3=ref2.properties)?void 0:ref3[0])instanceof Access,argCode=function(){var j,len1,ref4,results1;for(ref4=this.args||[],results1=[],(j=0,len1=ref4.length);j<len1;j++)arg=ref4[j],arg instanceof Code&&results1.push(arg);return results1}.call(this),0<argCode.length&&varAccess&&!this.variable.base.cached){var _this$variable$base$c=this.variable.base.cache(o,LEVEL_ACCESS,function(){return!1}),_this$variable$base$c2=_slicedToArray(_this$variable$base$c,1);cache=_this$variable$base$c2[0],this.variable.base.cached=cache}for(ref4=this.args,argIndex=j=0,len1=ref4.length;j<len1;argIndex=++j){var _compiledArgs;arg=ref4[argIndex],argIndex&&compiledArgs.push(this.makeCode(\", \")),(_compiledArgs=compiledArgs).push.apply(_compiledArgs,_toConsumableArray(arg.compileToFragments(o,LEVEL_LIST)))}return fragments=[],this.isNew&&fragments.push(this.makeCode(\"new \")),(_fragments10=fragments).push.apply(_fragments10,_toConsumableArray(this.variable.compileToFragments(o,LEVEL_ACCESS))),(_fragments11=fragments).push.apply(_fragments11,[this.makeCode(\"(\")].concat(_toConsumableArray(compiledArgs),[this.makeCode(\")\")])),fragments}},{key:\"checkForNewSuper\",value:function checkForNewSuper(){if(this.isNew&&this.variable instanceof Super)return this.variable.error(\"Unsupported reference to 'super'\")}},{key:\"containsSoak\",value:function containsSoak(){var ref1;return!!this.soak||null!=(ref1=this.variable)&&\"function\"==typeof ref1.containsSoak&&ref1.containsSoak()}},{key:\"astNode\",value:function astNode(o){var ref1;return this.soak&&this.variable instanceof Super&&(null==(ref1=o.scope.namedMethod())?void 0:ref1.ctor)&&this.variable.error(\"Unsupported reference to 'super'\"),this.checkForNewSuper(),_get(_getPrototypeOf(Call.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isNew?\"NewExpression\":this.containsSoak()?\"OptionalCallExpression\":\"CallExpression\"}},{key:\"astProperties\",value:function astProperties(o){var arg;return{callee:this.variable.ast(o,LEVEL_ACCESS),arguments:function(){var j,len1,ref1,results1;for(ref1=this.args,results1=[],(j=0,len1=ref1.length);j<len1;j++)arg=ref1[j],results1.push(arg.ast(o,LEVEL_LIST));return results1}.call(this),optional:!!this.soak,implicit:!!this.implicit}}}]),Call}(Base);return Call.prototype.children=[\"variable\",\"args\"],Call}.call(this),exports.SuperCall=SuperCall=function(){var SuperCall=function(_Call){\"use strict\";function SuperCall(){return _classCallCheck(this,SuperCall),_super39.apply(this,arguments)}_inherits(SuperCall,_Call);var _super39=_createSuper(SuperCall);return _createClass(SuperCall,[{key:\"isStatement\",value:function isStatement(o){var ref1;return(null==(ref1=this.expressions)?void 0:ref1.length)&&o.level===LEVEL_TOP}},{key:\"compileNode\",value:function compileNode(o){var ref,ref1,replacement,superCall;if(null==(ref1=this.expressions)||!ref1.length)return _get(_getPrototypeOf(SuperCall.prototype),\"compileNode\",this).call(this,o);if(superCall=new Literal(fragmentsToText(_get(_getPrototypeOf(SuperCall.prototype),\"compileNode\",this).call(this,o))),replacement=new Block(this.expressions.slice()),o.level>LEVEL_TOP){var _superCall$cache=superCall.cache(o,null,YES),_superCall$cache2=_slicedToArray(_superCall$cache,2);superCall=_superCall$cache2[0],ref=_superCall$cache2[1],replacement.push(ref)}return replacement.unshift(superCall),replacement.compileToFragments(o,o.level===LEVEL_TOP?o.level:LEVEL_LIST)}}]),SuperCall}(Call);return SuperCall.prototype.children=Call.prototype.children.concat([\"expressions\"]),SuperCall}.call(this),exports.Super=Super=function(){var Super=function(_Base19){\"use strict\";function Super(accessor,superLiteral){var _this36;return _classCallCheck(this,Super),_this36=_super40.call(this),_this36.accessor=accessor,_this36.superLiteral=superLiteral,_this36}_inherits(Super,_Base19);var _super40=_createSuper(Super);return _createClass(Super,[{key:\"compileNode\",value:function compileNode(o){var fragments,method,name,nref,ref1,ref2,salvagedComments,variable;if(this.checkInInstanceMethod(o),method=o.scope.namedMethod(),null==method.ctor&&null==this.accessor){var _method=method;name=_method.name,variable=_method.variable,(name.shouldCache()||name instanceof Index&&name.index.isAssignable())&&(nref=new IdentifierLiteral(o.scope.parent.freeVariable(\"name\")),name.index=new Assign(nref,name.index)),this.accessor=null==nref?name:new Index(nref)}return(null==(ref1=this.accessor)||null==(ref2=ref1.name)?void 0:ref2.comments)&&(salvagedComments=this.accessor.name.comments,delete this.accessor.name.comments),fragments=new Value(new Literal(\"super\"),this.accessor?[this.accessor]:[]).compileToFragments(o),salvagedComments&&attachCommentsToNode(salvagedComments,this.accessor.name),fragments}},{key:\"checkInInstanceMethod\",value:function checkInInstanceMethod(o){var method;if(method=o.scope.namedMethod(),null==method||!method.isMethod)return this.error(\"cannot use super outside of an instance method\")}},{key:\"astNode\",value:function astNode(o){var ref1;return this.checkInInstanceMethod(o),null==this.accessor?_get(_getPrototypeOf(Super.prototype),\"astNode\",this).call(this,o):new Value(new Super().withLocationDataFrom(null==(ref1=this.superLiteral)?this:ref1),[this.accessor]).withLocationDataFrom(this).ast(o)}}]),Super}(Base);return Super.prototype.children=[\"accessor\"],Super}.call(this),exports.RegexWithInterpolations=RegexWithInterpolations=function(){var RegexWithInterpolations=function(_Base20){\"use strict\";function RegexWithInterpolations(call1){var _ref37=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref37$heregexComment=_ref37.heregexCommentTokens,heregexCommentTokens=void 0===_ref37$heregexComment?[]:_ref37$heregexComment,_this37;return _classCallCheck(this,RegexWithInterpolations),_this37=_super41.call(this),_this37.call=call1,_this37.heregexCommentTokens=heregexCommentTokens,_this37}_inherits(RegexWithInterpolations,_Base20);var _super41=_createSuper(RegexWithInterpolations);return _createClass(RegexWithInterpolations,[{key:\"compileNode\",value:function compileNode(o){return this.call.compileNode(o)}},{key:\"astType\",value:function astType(){return\"InterpolatedRegExpLiteral\"}},{key:\"astProperties\",value:function astProperties(o){var heregexCommentToken,ref1,ref2;return{interpolatedPattern:this.call.args[0].ast(o),flags:null==(ref1=null==(ref2=this.call.args[1])?void 0:ref2.unwrap().originalValue)?\"\":ref1,comments:function(){var j,len1,ref3,results1;for(ref3=this.heregexCommentTokens,results1=[],(j=0,len1=ref3.length);j<len1;j++)heregexCommentToken=ref3[j],heregexCommentToken.here?results1.push(new HereComment(heregexCommentToken).ast(o)):results1.push(new LineComment(heregexCommentToken).ast(o));return results1}.call(this)}}}]),RegexWithInterpolations}(Base);return RegexWithInterpolations.prototype.children=[\"call\"],RegexWithInterpolations}.call(this),exports.TaggedTemplateCall=TaggedTemplateCall=function(_Call2){\"use strict\";function TaggedTemplateCall(variable,arg,soak){return _classCallCheck(this,TaggedTemplateCall),arg instanceof StringLiteral&&(arg=StringWithInterpolations.fromStringLiteral(arg)),_super42.call(this,variable,[arg],soak)}_inherits(TaggedTemplateCall,_Call2);var _super42=_createSuper(TaggedTemplateCall);return _createClass(TaggedTemplateCall,[{key:\"compileNode\",value:function compileNode(o){return this.variable.compileToFragments(o,LEVEL_ACCESS).concat(this.args[0].compileToFragments(o,LEVEL_LIST))}},{key:\"astType\",value:function astType(){return\"TaggedTemplateExpression\"}},{key:\"astProperties\",value:function astProperties(o){return{tag:this.variable.ast(o,LEVEL_ACCESS),quasi:this.args[0].ast(o,LEVEL_LIST)}}}]),TaggedTemplateCall}(Call),exports.Extends=Extends=function(){var Extends=function(_Base21){\"use strict\";function Extends(child1,parent1){var _this38;return _classCallCheck(this,Extends),_this38=_super43.call(this),_this38.child=child1,_this38.parent=parent1,_this38}_inherits(Extends,_Base21);var _super43=_createSuper(Extends);return _createClass(Extends,[{key:\"compileToFragments\",value:function compileToFragments(o){return new Call(new Value(new Literal(utility(\"extend\",o))),[this.child,this.parent]).compileToFragments(o)}}]),Extends}(Base);return Extends.prototype.children=[\"child\",\"parent\"],Extends}.call(this),exports.Access=Access=function(){var Access=function(_Base22){\"use strict\";function Access(name1){var _ref38=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},soak1=_ref38.soak,shorthand=_ref38.shorthand,_this39;return _classCallCheck(this,Access),_this39=_super44.call(this),_this39.name=name1,_this39.soak=soak1,_this39.shorthand=shorthand,_this39}_inherits(Access,_Base22);var _super44=_createSuper(Access);return _createClass(Access,[{key:\"compileToFragments\",value:function compileToFragments(o){var name,node;return name=this.name.compileToFragments(o),node=this.name.unwrap(),node instanceof PropertyName?[this.makeCode(\".\")].concat(_toConsumableArray(name)):[this.makeCode(\"[\")].concat(_toConsumableArray(name),[this.makeCode(\"]\")])}},{key:\"astNode\",value:function astNode(o){return this.name.ast(o)}}]),Access}(Base);return Access.prototype.children=[\"name\"],Access.prototype.shouldCache=NO,Access}.call(this),exports.Index=Index=function(){var Index=function(_Base23){\"use strict\";function Index(index1){var _this40;return _classCallCheck(this,Index),_this40=_super45.call(this),_this40.index=index1,_this40}_inherits(Index,_Base23);var _super45=_createSuper(Index);return _createClass(Index,[{key:\"compileToFragments\",value:function compileToFragments(o){return[].concat(this.makeCode(\"[\"),this.index.compileToFragments(o,LEVEL_PAREN),this.makeCode(\"]\"))}},{key:\"shouldCache\",value:function shouldCache(){return this.index.shouldCache()}},{key:\"astNode\",value:function astNode(o){return this.index.ast(o)}}]),Index}(Base);return Index.prototype.children=[\"index\"],Index}.call(this),exports.Range=Range=function(){var Range=function(_Base24){\"use strict\";function Range(from1,to1,tag){var _this41;return _classCallCheck(this,Range),_this41=_super46.call(this),_this41.from=from1,_this41.to=to1,_this41.exclusive=\"exclusive\"===tag,_this41.equals=_this41.exclusive?\"\":\"=\",_this41}_inherits(Range,_Base24);var _super46=_createSuper(Range);return _createClass(Range,[{key:\"compileVariables\",value:function compileVariables(o){var shouldCache,step;o=merge(o,{top:!0}),shouldCache=del(o,\"shouldCache\");var _this$cacheToCodeFrag=this.cacheToCodeFragments(this.from.cache(o,LEVEL_LIST,shouldCache)),_this$cacheToCodeFrag2=_slicedToArray(_this$cacheToCodeFrag,2);this.fromC=_this$cacheToCodeFrag2[0],this.fromVar=_this$cacheToCodeFrag2[1];var _this$cacheToCodeFrag3=this.cacheToCodeFragments(this.to.cache(o,LEVEL_LIST,shouldCache)),_this$cacheToCodeFrag4=_slicedToArray(_this$cacheToCodeFrag3,2);if(this.toC=_this$cacheToCodeFrag4[0],this.toVar=_this$cacheToCodeFrag4[1],step=del(o,\"step\")){var _this$cacheToCodeFrag5=this.cacheToCodeFragments(step.cache(o,LEVEL_LIST,shouldCache)),_this$cacheToCodeFrag6=_slicedToArray(_this$cacheToCodeFrag5,2);this.step=_this$cacheToCodeFrag6[0],this.stepVar=_this$cacheToCodeFrag6[1]}return this.fromNum=this.from.isNumber()?parseNumber(this.fromVar):null,this.toNum=this.to.isNumber()?parseNumber(this.toVar):null,this.stepNum=(null==step?void 0:step.isNumber())?parseNumber(this.stepVar):null}},{key:\"compileNode\",value:function compileNode(o){var cond,condPart,from,gt,idx,idxName,known,lowerBound,lt,namedIndex,ref1,ref2,stepCond,stepNotZero,stepPart,to,upperBound,varPart;if(this.fromVar||this.compileVariables(o),!o.index)return this.compileArray(o);known=null!=this.fromNum&&null!=this.toNum,idx=del(o,\"index\"),idxName=del(o,\"name\"),namedIndex=idxName&&idxName!==idx,varPart=known&&!namedIndex?\"var \".concat(idx,\" = \").concat(this.fromC):\"\".concat(idx,\" = \").concat(this.fromC),this.toC!==this.toVar&&(varPart+=\", \".concat(this.toC)),this.step!==this.stepVar&&(varPart+=\", \".concat(this.step)),lt=\"\".concat(idx,\" <\").concat(this.equals),gt=\"\".concat(idx,\" >\").concat(this.equals);var _ref39=[this.fromNum,this.toNum];return from=_ref39[0],to=_ref39[1],stepNotZero=\"\".concat(null==(ref1=this.stepNum)?this.stepVar:ref1,\" !== 0\"),stepCond=\"\".concat(null==(ref2=this.stepNum)?this.stepVar:ref2,\" > 0\"),lowerBound=\"\".concat(lt,\" \").concat(known?to:this.toVar),upperBound=\"\".concat(gt,\" \").concat(known?to:this.toVar),condPart=null==this.step?known?\"\".concat(from<=to?lt:gt,\" \").concat(to):\"(\".concat(this.fromVar,\" <= \").concat(this.toVar,\" ? \").concat(lowerBound,\" : \").concat(upperBound,\")\"):null!=this.stepNum&&0!==this.stepNum?0<this.stepNum?\"\".concat(lowerBound):\"\".concat(upperBound):\"\".concat(stepNotZero,\" && (\").concat(stepCond,\" ? \").concat(lowerBound,\" : \").concat(upperBound,\")\"),cond=this.stepVar?\"\".concat(this.stepVar,\" > 0\"):\"\".concat(this.fromVar,\" <= \").concat(this.toVar),stepPart=this.stepVar?\"\".concat(idx,\" += \").concat(this.stepVar):known?namedIndex?from<=to?\"++\".concat(idx):\"--\".concat(idx):from<=to?\"\".concat(idx,\"++\"):\"\".concat(idx,\"--\"):namedIndex?\"\".concat(cond,\" ? ++\").concat(idx,\" : --\").concat(idx):\"\".concat(cond,\" ? \").concat(idx,\"++ : \").concat(idx,\"--\"),namedIndex&&(varPart=\"\".concat(idxName,\" = \").concat(varPart)),namedIndex&&(stepPart=\"\".concat(idxName,\" = \").concat(stepPart)),[this.makeCode(\"\".concat(varPart,\"; \").concat(condPart,\"; \").concat(stepPart))]}},{key:\"compileArray\",value:function compileArray(o){var args,body,cond,hasArgs,i,idt,known,post,pre,range,ref1,result,vars;return(known=null!=this.fromNum&&null!=this.toNum,known&&20>=_Mathabs(this.fromNum-this.toNum))?(range=function(){for(var results1=[],j=ref1=this.fromNum,ref2=this.toNum;ref1<=ref2?j<=ref2:j>=ref2;ref1<=ref2?j++:j--)results1.push(j);return results1}.apply(this),this.exclusive&&range.pop(),[this.makeCode(\"[\".concat(range.join(\", \"),\"]\"))]):(idt=this.tab+TAB,i=o.scope.freeVariable(\"i\",{single:!0,reserve:!1}),result=o.scope.freeVariable(\"results\",{reserve:!1}),pre=\"\\n\".concat(idt,\"var \").concat(result,\" = [];\"),known?(o.index=i,body=fragmentsToText(this.compileNode(o))):(vars=\"\".concat(i,\" = \").concat(this.fromC)+(this.toC===this.toVar?\"\":\", \".concat(this.toC)),cond=\"\".concat(this.fromVar,\" <= \").concat(this.toVar),body=\"var \".concat(vars,\"; \").concat(cond,\" ? \").concat(i,\" <\").concat(this.equals,\" \").concat(this.toVar,\" : \").concat(i,\" >\").concat(this.equals,\" \").concat(this.toVar,\"; \").concat(cond,\" ? \").concat(i,\"++ : \").concat(i,\"--\")),post=\"{ \".concat(result,\".push(\").concat(i,\"); }\\n\").concat(idt,\"return \").concat(result,\";\\n\").concat(o.indent),hasArgs=function(node){return null==node?void 0:node.contains(isLiteralArguments)},(hasArgs(this.from)||hasArgs(this.to))&&(args=\", arguments\"),[this.makeCode(\"(function() {\".concat(pre,\"\\n\").concat(idt,\"for (\").concat(body,\")\").concat(post,\"}).apply(this\").concat(null==args?\"\":args,\")\"))])}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{from:null==(ref1=null==(ref2=this.from)?void 0:ref2.ast(o))?null:ref1,to:null==(ref3=null==(ref4=this.to)?void 0:ref4.ast(o))?null:ref3,exclusive:this.exclusive}}}]),Range}(Base);return Range.prototype.children=[\"from\",\"to\"],Range}.call(this),exports.Slice=Slice=function(){var Slice=function(_Base25){\"use strict\";function Slice(range1){var _this42;return _classCallCheck(this,Slice),_this42=_super47.call(this),_this42.range=range1,_this42}_inherits(Slice,_Base25);var _super47=_createSuper(Slice);return _createClass(Slice,[{key:\"compileNode\",value:function compileNode(o){var _this$range=this.range,compiled,compiledText,from,fromCompiled,to,toStr;return to=_this$range.to,from=_this$range.from,(null==from?void 0:from.shouldCache())&&(from=new Value(new Parens(from))),(null==to?void 0:to.shouldCache())&&(to=new Value(new Parens(to))),fromCompiled=(null==from?void 0:from.compileToFragments(o,LEVEL_PAREN))||[this.makeCode(\"0\")],to&&(compiled=to.compileToFragments(o,LEVEL_PAREN),compiledText=fragmentsToText(compiled),(this.range.exclusive||-1!=+compiledText)&&(toStr=\", \"+(this.range.exclusive?compiledText:to.isNumber()?\"\".concat(+compiledText+1):(compiled=to.compileToFragments(o,LEVEL_ACCESS),\"+\".concat(fragmentsToText(compiled),\" + 1 || 9e9\"))))),[this.makeCode(\".slice(\".concat(fragmentsToText(fromCompiled)).concat(toStr||\"\",\")\"))]}},{key:\"astNode\",value:function astNode(o){return this.range.ast(o)}}]),Slice}(Base);return Slice.prototype.children=[\"range\"],Slice}.call(this),exports.Obj=Obj=function(){var Obj=function(_Base26){\"use strict\";function Obj(props){var generated=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],_this43;return _classCallCheck(this,Obj),_this43=_super48.call(this),_this43.generated=generated,_this43.objects=_this43.properties=props||[],_this43}_inherits(Obj,_Base26);var _super48=_createSuper(Obj);return _createClass(Obj,[{key:\"isAssignable\",value:function isAssignable(opts){var j,len1,message,prop,ref1,ref2;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(prop=ref1[j],message=isUnassignable(prop.unwrapAll().value),message&&prop.error(message),prop instanceof Assign&&\"object\"===prop.context&&!((null==(ref2=prop.value)?void 0:ref2.base)instanceof Arr)&&(prop=prop.value),!prop.isAssignable(opts))return!1;return!0}},{key:\"shouldCache\",value:function shouldCache(){return!this.isAssignable()}},{key:\"hasSplat\",value:function hasSplat(){var j,len1,prop,ref1;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(prop=ref1[j],prop instanceof Splat)return!0;return!1}},{key:\"reorderProperties\",value:function reorderProperties(){var props,splatProp,splatProps;return props=this.properties,splatProps=this.getAndCheckSplatProps(),splatProp=props.splice(splatProps[0],1),this.objects=this.properties=[].concat(props,splatProp)}},{key:\"compileNode\",value:function compileNode(o){var answer,i,idt,indent,isCompact,j,join,k,key,l,lastNode,len1,len2,len3,node,prop,props,ref1,value;if(this.hasSplat()&&this.lhs&&this.reorderProperties(),props=this.properties,this.generated)for(j=0,len1=props.length;j<len1;j++)node=props[j],node instanceof Value&&node.error(\"cannot have an implicit value in an implicit object\");for(idt=o.indent+=TAB,lastNode=this.lastNode(this.properties),this.propagateLhs(),isCompact=!0,ref1=this.properties,(k=0,len2=ref1.length);k<len2;k++)prop=ref1[k],prop instanceof Assign&&\"object\"===prop.context&&(isCompact=!1);for(answer=[],answer.push(this.makeCode(isCompact?\"\":\"\\n\")),(i=l=0,len3=props.length);l<len3;i=++l){var _answer;if(prop=props[i],join=i===props.length-1?\"\":isCompact?\", \":prop===lastNode?\"\\n\":\",\\n\",indent=isCompact?\"\":idt,key=prop instanceof Assign&&\"object\"===prop.context?prop.variable:prop instanceof Assign?(this.lhs?void 0:prop.operatorToken.error(\"unexpected \".concat(prop.operatorToken.value)),prop.variable):prop,key instanceof Value&&key.hasProperties()&&((\"object\"===prop.context||!key[\"this\"])&&key.error(\"invalid object key\"),key=key.properties[0].name,prop=new Assign(key,prop,\"object\")),key===prop)if(prop.shouldCache()){var _prop$base$cache=prop.base.cache(o),_prop$base$cache2=_slicedToArray(_prop$base$cache,2);key=_prop$base$cache2[0],value=_prop$base$cache2[1],key instanceof IdentifierLiteral&&(key=new PropertyName(key.value)),prop=new Assign(key,value,\"object\")}else if(!(key instanceof Value&&key.base instanceof ComputedPropertyName))\"function\"==typeof prop.bareLiteral&&prop.bareLiteral(IdentifierLiteral)||prop instanceof Splat||(prop=new Assign(prop,prop,\"object\"));else if(prop.base.value.shouldCache()){var _prop$base$value$cach=prop.base.value.cache(o),_prop$base$value$cach2=_slicedToArray(_prop$base$value$cach,2);key=_prop$base$value$cach2[0],value=_prop$base$value$cach2[1],key instanceof IdentifierLiteral&&(key=new ComputedPropertyName(key.value)),prop=new Assign(key,value,\"object\")}else prop=new Assign(key,prop.base.value,\"object\");indent&&answer.push(this.makeCode(indent)),(_answer=answer).push.apply(_answer,_toConsumableArray(prop.compileToFragments(o,LEVEL_TOP))),join&&answer.push(this.makeCode(join))}return answer.push(this.makeCode(isCompact?\"\":\"\\n\".concat(this.tab))),answer=this.wrapInBraces(answer),this.front?this.wrapInParentheses(answer):answer}},{key:\"getAndCheckSplatProps\",value:function getAndCheckSplatProps(){var i,prop,props,splatProps;if(this.hasSplat()&&this.lhs)return props=this.properties,splatProps=function(){var j,len1,results1;for(results1=[],i=j=0,len1=props.length;j<len1;i=++j)prop=props[i],prop instanceof Splat&&results1.push(i);return results1}(),1<(null==splatProps?void 0:splatProps.length)&&props[splatProps[1]].error(\"multiple spread elements are disallowed\"),splatProps}},{key:\"assigns\",value:function assigns(name){var j,len1,prop,ref1;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(prop=ref1[j],prop.assigns(name))return!0;return!1}},{key:\"eachName\",value:function eachName(iterator){var j,len1,prop,ref1,results1;for(ref1=this.properties,results1=[],(j=0,len1=ref1.length);j<len1;j++)prop=ref1[j],prop instanceof Assign&&\"object\"===prop.context&&(prop=prop.value),prop=prop.unwrapAll(),null==prop.eachName?results1.push(void 0):results1.push(prop.eachName(iterator));return results1}},{key:\"expandProperty\",value:function expandProperty(property){var context,key,operatorToken,variable;return variable=property.variable,context=property.context,operatorToken=property.operatorToken,key=property instanceof Assign&&\"object\"===context?variable:property instanceof Assign?(this.lhs?void 0:operatorToken.error(\"unexpected \".concat(operatorToken.value)),variable):property,key instanceof Value&&key.hasProperties()?(\"object\"!==context&&key[\"this\"]||key.error(\"invalid object key\"),property instanceof Assign?new ObjectProperty({fromAssign:property}):new ObjectProperty({key:property})):key===property?property instanceof Splat?property:new ObjectProperty({key:property}):new ObjectProperty({fromAssign:property})}},{key:\"expandProperties\",value:function expandProperties(){var j,len1,property,ref1,results1;for(ref1=this.properties,results1=[],(j=0,len1=ref1.length);j<len1;j++)property=ref1[j],results1.push(this.expandProperty(property));return results1}},{key:\"propagateLhs\",value:function propagateLhs(setLhs){var j,len1,property,ref1,results1,unwrappedValue,value;if(setLhs&&(this.lhs=!0),!!this.lhs){for(ref1=this.properties,results1=[],(j=0,len1=ref1.length);j<len1;j++)if(property=ref1[j],property instanceof Assign&&\"object\"===property.context){var _property2=property;value=_property2.value,unwrappedValue=value.unwrapAll(),unwrappedValue instanceof Arr||unwrappedValue instanceof Obj?results1.push(unwrappedValue.propagateLhs(!0)):unwrappedValue instanceof Assign?results1.push(unwrappedValue.nestedLhs=!0):results1.push(void 0)}else property instanceof Assign?results1.push(property.nestedLhs=!0):property instanceof Splat?results1.push(property.propagateLhs(!0)):results1.push(void 0);return results1}}},{key:\"astNode\",value:function astNode(o){return this.getAndCheckSplatProps(),_get(_getPrototypeOf(Obj.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.lhs?\"ObjectPattern\":\"ObjectExpression\"}},{key:\"astProperties\",value:function astProperties(o){var property;return{implicit:!!this.generated,properties:function(){var j,len1,ref1,results1;for(ref1=this.expandProperties(),results1=[],(j=0,len1=ref1.length);j<len1;j++)property=ref1[j],results1.push(property.ast(o));return results1}.call(this)}}}]),Obj}(Base);return Obj.prototype.children=[\"properties\"],Obj}.call(this),exports.ObjectProperty=ObjectProperty=function(_Base27){\"use strict\";function ObjectProperty(_ref40){var key=_ref40.key,fromAssign=_ref40.fromAssign,_this44;_classCallCheck(this,ObjectProperty);var context,value;return _this44=_super49.call(this),fromAssign?(_this44.key=fromAssign.variable,value=fromAssign.value,context=fromAssign.context,\"object\"===context?_this44.value=value:(_this44.value=fromAssign,_this44.shorthand=!0),_this44.locationData=fromAssign.locationData):(_this44.key=key,_this44.shorthand=!0,_this44.locationData=key.locationData),_this44}_inherits(ObjectProperty,_Base27);var _super49=_createSuper(ObjectProperty);return _createClass(ObjectProperty,[{key:\"astProperties\",value:function astProperties(o){var isComputedPropertyName,keyAst,ref1,ref2;return isComputedPropertyName=this.key instanceof Value&&this.key.base instanceof ComputedPropertyName||this.key.unwrap()instanceof StringWithInterpolations,keyAst=this.key.ast(o,LEVEL_LIST),{key:(null==keyAst?void 0:keyAst.declaration)?Object.assign({},keyAst,{declaration:!1}):keyAst,value:null==(ref1=null==(ref2=this.value)?void 0:ref2.ast(o,LEVEL_LIST))?keyAst:ref1,shorthand:!!this.shorthand,computed:!!isComputedPropertyName,method:!1}}}]),ObjectProperty}(Base),exports.Arr=Arr=function(){var Arr=function(_Base28){\"use strict\";function Arr(objs){var lhs1=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],_this45;return _classCallCheck(this,Arr),_this45=_super50.call(this),_this45.lhs=lhs1,_this45.objects=objs||[],_this45.propagateLhs(),_this45}_inherits(Arr,_Base28);var _super50=_createSuper(Arr);return _createClass(Arr,[{key:\"hasElision\",value:function hasElision(){var j,len1,obj,ref1;for(ref1=this.objects,j=0,len1=ref1.length;j<len1;j++)if(obj=ref1[j],obj instanceof Elision)return!0;return!1}},{key:\"isAssignable\",value:function isAssignable(opts){var _ref41=null==opts?{}:opts,allowEmptyArray,allowExpansion,allowNontrailingSplat,i,j,len1,obj,ref1;allowExpansion=_ref41.allowExpansion,allowNontrailingSplat=_ref41.allowNontrailingSplat;var _ref41$allowEmptyArra=_ref41.allowEmptyArray;if(allowEmptyArray=void 0!==_ref41$allowEmptyArra&&_ref41$allowEmptyArra,!this.objects.length)return allowEmptyArray;for(ref1=this.objects,i=j=0,len1=ref1.length;j<len1;i=++j){if(obj=ref1[i],!allowNontrailingSplat&&obj instanceof Splat&&i+1!==this.objects.length)return!1;if(!(allowExpansion&&obj instanceof Expansion||obj.isAssignable(opts)&&(!obj.isAtomic||obj.isAtomic())))return!1}return!0}},{key:\"shouldCache\",value:function shouldCache(){return!this.isAssignable()}},{key:\"compileNode\",value:function compileNode(o){var answer,compiledObjs,fragment,fragmentIndex,fragmentIsElision,fragments,includesLineCommentsOnNonFirstElement,index,j,k,l,len1,len2,len3,len4,len5,obj,objIndex,olen,p,passedElision,q,ref1,ref2,unwrappedObj;if(!this.objects.length)return[this.makeCode(\"[]\")];for(o.indent+=TAB,fragmentIsElision=function(_ref42){var _ref43=_slicedToArray(_ref42,1),fragment=_ref43[0];return\"Elision\"===fragment.type&&\",\"===fragment.code.trim()},passedElision=!1,answer=[],ref1=this.objects,(objIndex=j=0,len1=ref1.length);j<len1;objIndex=++j)obj=ref1[objIndex],unwrappedObj=obj.unwrapAll(),unwrappedObj.comments&&0===unwrappedObj.comments.filter(function(comment){return!comment.here}).length&&(unwrappedObj.includeCommentFragments=YES);for(compiledObjs=function(){var k,len2,ref2,results1;for(ref2=this.objects,results1=[],(k=0,len2=ref2.length);k<len2;k++)obj=ref2[k],results1.push(obj.compileToFragments(o,LEVEL_LIST));return results1}.call(this),olen=compiledObjs.length,includesLineCommentsOnNonFirstElement=!1,(index=k=0,len2=compiledObjs.length);k<len2;index=++k){var _answer2;for(fragments=compiledObjs[index],l=0,len3=fragments.length;l<len3;l++)fragment=fragments[l],fragment.isHereComment?fragment.code=fragment.code.trim():0!==index&&!1===includesLineCommentsOnNonFirstElement&&hasLineComments(fragment)&&(includesLineCommentsOnNonFirstElement=!0);0!==index&&passedElision&&(!fragmentIsElision(fragments)||index===olen-1)&&answer.push(this.makeCode(\", \")),passedElision=passedElision||!fragmentIsElision(fragments),(_answer2=answer).push.apply(_answer2,_toConsumableArray(fragments))}if(includesLineCommentsOnNonFirstElement||0<=indexOf.call(fragmentsToText(answer),\"\\n\")){for(fragmentIndex=p=0,len4=answer.length;p<len4;fragmentIndex=++p)fragment=answer[fragmentIndex],fragment.isHereComment?fragment.code=\"\".concat(multident(fragment.code,o.indent,!1),\"\\n\").concat(o.indent):\", \"===fragment.code&&(null==fragment||!fragment.isElision)&&\"StringLiteral\"!==(ref2=fragment.type)&&\"StringWithInterpolations\"!==ref2&&(fragment.code=\",\\n\".concat(o.indent));answer.unshift(this.makeCode(\"[\\n\".concat(o.indent))),answer.push(this.makeCode(\"\\n\".concat(this.tab,\"]\")))}else{for(q=0,len5=answer.length;q<len5;q++)fragment=answer[q],fragment.isHereComment&&(fragment.code=\"\".concat(fragment.code,\" \"));answer.unshift(this.makeCode(\"[\")),answer.push(this.makeCode(\"]\"))}return answer}},{key:\"assigns\",value:function assigns(name){var j,len1,obj,ref1;for(ref1=this.objects,j=0,len1=ref1.length;j<len1;j++)if(obj=ref1[j],obj.assigns(name))return!0;return!1}},{key:\"eachName\",value:function eachName(iterator){var j,len1,obj,ref1,results1;for(ref1=this.objects,results1=[],(j=0,len1=ref1.length);j<len1;j++)obj=ref1[j],obj=obj.unwrapAll(),results1.push(obj.eachName(iterator));return results1}},{key:\"propagateLhs\",value:function propagateLhs(setLhs){var j,len1,object,ref1,results1,unwrappedObject;if(setLhs&&(this.lhs=!0),!!this.lhs){for(ref1=this.objects,results1=[],(j=0,len1=ref1.length);j<len1;j++)object=ref1[j],(object instanceof Splat||object instanceof Expansion)&&(object.lhs=!0),unwrappedObject=object.unwrapAll(),unwrappedObject instanceof Arr||unwrappedObject instanceof Obj?results1.push(unwrappedObject.propagateLhs(!0)):unwrappedObject instanceof Assign?results1.push(unwrappedObject.nestedLhs=!0):results1.push(void 0);return results1}}},{key:\"astType\",value:function astType(){return this.lhs?\"ArrayPattern\":\"ArrayExpression\"}},{key:\"astProperties\",value:function astProperties(o){var object;return{elements:function(){var j,len1,ref1,results1;for(ref1=this.objects,results1=[],(j=0,len1=ref1.length);j<len1;j++)object=ref1[j],results1.push(object.ast(o,LEVEL_LIST));return results1}.call(this)}}}]),Arr}(Base);return Arr.prototype.children=[\"objects\"],Arr}.call(this),exports.Class=Class=function(){var Class=function(_Base29){\"use strict\";function Class(variable1,parent1,body1){var _this46;return _classCallCheck(this,Class),_this46=_super51.call(this),_this46.variable=variable1,_this46.parent=parent1,_this46.body=body1,null==_this46.body&&(_this46.body=new Block,_this46.hasGeneratedBody=!0),_this46}_inherits(Class,_Base29);var _super51=_createSuper(Class);return _createClass(Class,[{key:\"compileNode\",value:function compileNode(o){var executableBody,node,parentName;if(this.name=this.determineName(),executableBody=this.walkBody(o),this.parent instanceof Value&&!this.parent.hasProperties()&&(parentName=this.parent.base.value),this.hasNameClash=null!=this.name&&this.name===parentName,node=this,executableBody||this.hasNameClash?node=new ExecutableClassBody(node,executableBody):null==this.name&&o.level===LEVEL_TOP&&(node=new Parens(node)),this.boundMethods.length&&this.parent&&(null==this.variable&&(this.variable=new IdentifierLiteral(o.scope.freeVariable(\"_class\"))),null==this.variableRef)){var _this$variable$cache=this.variable.cache(o),_this$variable$cache2=_slicedToArray(_this$variable$cache,2);this.variable=_this$variable$cache2[0],this.variableRef=_this$variable$cache2[1]}this.variable&&(node=new Assign(this.variable,node,null,{moduleDeclaration:this.moduleDeclaration})),this.compileNode=this.compileClassDeclaration;try{return node.compileToFragments(o)}finally{delete this.compileNode}}},{key:\"compileClassDeclaration\",value:function compileClassDeclaration(o){var ref1,ref2,result;if((this.externalCtor||this.boundMethods.length)&&null==this.ctor&&(this.ctor=this.makeDefaultConstructor()),null!=(ref1=this.ctor)&&(ref1.noReturn=!0),this.boundMethods.length&&this.proxyBoundMethods(),o.indent+=TAB,result=[],result.push(this.makeCode(\"class \")),this.name&&result.push(this.makeCode(this.name)),null!=(null==(ref2=this.variable)?void 0:ref2.comments)&&this.compileCommentFragments(o,this.variable,result),this.name&&result.push(this.makeCode(\" \")),this.parent){var _result;(_result=result).push.apply(_result,[this.makeCode(\"extends \")].concat(_toConsumableArray(this.parent.compileToFragments(o)),[this.makeCode(\" \")]))}if(result.push(this.makeCode(\"{\")),!this.body.isEmpty()){var _result2;this.body.spaced=!0,result.push(this.makeCode(\"\\n\")),(_result2=result).push.apply(_result2,_toConsumableArray(this.body.compileToFragments(o,LEVEL_TOP))),result.push(this.makeCode(\"\\n\".concat(this.tab)))}return result.push(this.makeCode(\"}\")),result}},{key:\"determineName\",value:function determineName(){var _slice1$call13,_slice1$call14,message,name,node,ref1,tail;return this.variable?(ref1=this.variable.properties,_slice1$call13=slice1.call(ref1,-1),_slice1$call14=_slicedToArray(_slice1$call13,1),tail=_slice1$call14[0],_slice1$call13,node=tail?tail instanceof Access&&tail.name:this.variable.base,!(node instanceof IdentifierLiteral||node instanceof PropertyName))?null:(name=node.value,tail||(message=isUnassignable(name),message&&this.variable.error(message)),0<=indexOf.call(JS_FORBIDDEN,name)?\"_\".concat(name):name):null}},{key:\"walkBody\",value:function walkBody(o){var assign,end,executableBody,expression,expressions,exprs,i,initializer,initializerExpression,j,k,len1,len2,method,properties,pushSlice,ref1,start;for(this.ctor=null,this.boundMethods=[],executableBody=null,initializer=[],expressions=this.body.expressions,i=0,ref1=expressions.slice(),(j=0,len1=ref1.length);j<len1;j++)if(expression=ref1[j],expression instanceof Value&&expression.isObject(!0)){for(properties=expression.base.properties,exprs=[],end=0,start=0,pushSlice=function(){if(end>start)return exprs.push(new Value(new Obj(properties.slice(start,end),!0)))};assign=properties[end];)(initializerExpression=this.addInitializerExpression(assign,o))&&(pushSlice(),exprs.push(initializerExpression),initializer.push(initializerExpression),start=end+1),end++;pushSlice(),splice.apply(expressions,[i,i-i+1].concat(exprs)),exprs,i+=exprs.length}else(initializerExpression=this.addInitializerExpression(expression,o))&&(initializer.push(initializerExpression),expressions[i]=initializerExpression),i+=1;for(k=0,len2=initializer.length;k<len2;k++)method=initializer[k],method instanceof Code&&(method.ctor?(this.ctor&&method.error(\"Cannot define more than one constructor in a class\"),this.ctor=method):method.isStatic&&method.bound?method.context=this.name:method.bound&&this.boundMethods.push(method));return o.compiling?initializer.length===expressions.length?void 0:(this.body.expressions=function(){var l,len3,results1;for(results1=[],l=0,len3=initializer.length;l<len3;l++)expression=initializer[l],results1.push(expression.hoist());return results1}(),new Block(expressions)):void 0}},{key:\"addInitializerExpression\",value:function addInitializerExpression(node,o){return node.unwrapAll()instanceof PassthroughLiteral?node:this.validInitializerMethod(node)?this.addInitializerMethod(node):!o.compiling&&this.validClassProperty(node)?this.addClassProperty(node):!o.compiling&&this.validClassPrototypeProperty(node)?this.addClassPrototypeProperty(node):null}},{key:\"validInitializerMethod\",value:function validInitializerMethod(node){return!!(node instanceof Assign&&node.value instanceof Code)&&(!(\"object\"!==node.context||node.variable.hasProperties())||node.variable.looksStatic(this.name)&&(this.name||!node.value.bound))}},{key:\"addInitializerMethod\",value:function addInitializerMethod(assign){var isConstructor,method,methodName,operatorToken,variable;return variable=assign.variable,method=assign.value,operatorToken=assign.operatorToken,method.isMethod=!0,method.isStatic=variable.looksStatic(this.name),method.isStatic?method.name=variable.properties[0]:(methodName=variable.base,method.name=new(methodName.shouldCache()?Index:Access)(methodName),method.name.updateLocationDataIfMissing(methodName.locationData),isConstructor=methodName instanceof StringLiteral?\"constructor\"===methodName.originalValue:\"constructor\"===methodName.value,isConstructor&&(method.ctor=this.parent?\"derived\":\"base\"),method.bound&&method.ctor&&method.error(\"Cannot define a constructor as a bound (fat arrow) function\")),method.operatorToken=operatorToken,method}},{key:\"validClassProperty\",value:function validClassProperty(node){return!!(node instanceof Assign)&&node.variable.looksStatic(this.name)}},{key:\"addClassProperty\",value:function addClassProperty(assign){var operatorToken,staticClassName,value,variable;variable=assign.variable,value=assign.value,operatorToken=assign.operatorToken;var _variable$looksStatic=variable.looksStatic(this.name);return staticClassName=_variable$looksStatic.staticClassName,new ClassProperty({name:variable.properties[0],isStatic:!0,staticClassName:staticClassName,value:value,operatorToken:operatorToken}).withLocationDataFrom(assign)}},{key:\"validClassPrototypeProperty\",value:function validClassPrototypeProperty(node){return!!(node instanceof Assign)&&\"object\"===node.context&&!node.variable.hasProperties()}},{key:\"addClassPrototypeProperty\",value:function addClassPrototypeProperty(assign){var value,variable;return variable=assign.variable,value=assign.value,new ClassPrototypeProperty({name:variable.base,value:value}).withLocationDataFrom(assign)}},{key:\"makeDefaultConstructor\",value:function makeDefaultConstructor(){var applyArgs,applyCtor,ctor;return ctor=this.addInitializerMethod(new Assign(new Value(new PropertyName(\"constructor\")),new Code())),this.body.unshift(ctor),this.parent&&ctor.body.push(new SuperCall(new Super(),[new Splat(new IdentifierLiteral(\"arguments\"))])),this.externalCtor&&(applyCtor=new Value(this.externalCtor,[new Access(new PropertyName(\"apply\"))]),applyArgs=[new ThisLiteral,new IdentifierLiteral(\"arguments\")],ctor.body.push(new Call(applyCtor,applyArgs)),ctor.body.makeReturn()),ctor}},{key:\"proxyBoundMethods\",value:function proxyBoundMethods(){var method,name;return this.ctor.thisAssignments=function(){var j,len1,ref1,results1;for(ref1=this.boundMethods,results1=[],(j=0,len1=ref1.length);j<len1;j++)method=ref1[j],this.parent&&(method.classVariable=this.variableRef),name=new Value(new ThisLiteral(),[method.name]),results1.push(new Assign(name,new Call(new Value(name,[new Access(new PropertyName(\"bind\"))]),[new ThisLiteral])));return results1}.call(this),null}},{key:\"declareName\",value:function declareName(o){var alreadyDeclared,name,ref1;if((name=null==(ref1=this.variable)?void 0:ref1.unwrap())instanceof IdentifierLiteral)return alreadyDeclared=o.scope.find(name.value),name.isDeclaration=!alreadyDeclared}},{key:\"isStatementAst\",value:function isStatementAst(){return!0}},{key:\"astNode\",value:function astNode(o){var argumentsNode,jumpNode,ref1;return(jumpNode=this.body.jumps())&&jumpNode.error(\"Class bodies cannot contain pure statements\"),(argumentsNode=this.body.contains(isLiteralArguments))&&argumentsNode.error(\"Class bodies shouldn't reference arguments\"),this.declareName(o),this.name=this.determineName(),this.body.isClassBody=!0,this.hasGeneratedBody&&(this.body.locationData=zeroWidthLocationDataFromEndLocation(this.locationData)),this.walkBody(o),sniffDirectives(this.body.expressions),null!=(ref1=this.ctor)&&(ref1.noReturn=!0),_get(_getPrototypeOf(Class.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(o){return o.level===LEVEL_TOP?\"ClassDeclaration\":\"ClassExpression\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{id:null==(ref1=null==(ref2=this.variable)?void 0:ref2.ast(o))?null:ref1,superClass:null==(ref3=null==(ref4=this.parent)?void 0:ref4.ast(o,LEVEL_PAREN))?null:ref3,body:this.body.ast(o,LEVEL_TOP)}}}]),Class}(Base);return Class.prototype.children=[\"variable\",\"parent\",\"body\"],Class}.call(this),exports.ExecutableClassBody=ExecutableClassBody=function(){var ExecutableClassBody=function(_Base30){\"use strict\";function ExecutableClassBody(_class){var body1=1<arguments.length&&void 0!==arguments[1]?arguments[1]:new Block,_this47;return _classCallCheck(this,ExecutableClassBody),_this47=_super52.call(this),_this47[\"class\"]=_class,_this47.body=body1,_this47}_inherits(ExecutableClassBody,_Base30);var _super52=_createSuper(ExecutableClassBody);return _createClass(ExecutableClassBody,[{key:\"compileNode\",value:function compileNode(o){var _this$body$expression,args,argumentsNode,directives,externalCtor,ident,jumpNode,klass,params,parent,ref1,wrapper;return(jumpNode=this.body.jumps())&&jumpNode.error(\"Class bodies cannot contain pure statements\"),(argumentsNode=this.body.contains(isLiteralArguments))&&argumentsNode.error(\"Class bodies shouldn't reference arguments\"),params=[],args=[new ThisLiteral],wrapper=new Code(params,this.body),klass=new Parens(new Call(new Value(wrapper,[new Access(new PropertyName(\"call\"))]),args)),this.body.spaced=!0,o.classScope=wrapper.makeScope(o.scope),this.name=null==(ref1=this[\"class\"].name)?o.classScope.freeVariable(this.defaultClassVariableName):ref1,ident=new IdentifierLiteral(this.name),directives=this.walkBody(),this.setContext(),this[\"class\"].hasNameClash&&(parent=new IdentifierLiteral(o.classScope.freeVariable(\"superClass\")),wrapper.params.push(new Param(parent)),args.push(this[\"class\"].parent),this[\"class\"].parent=parent),this.externalCtor&&(externalCtor=new IdentifierLiteral(o.classScope.freeVariable(\"ctor\",{reserve:!1})),this[\"class\"].externalCtor=externalCtor,this.externalCtor.variable.base=externalCtor),this.name===this[\"class\"].name?this.body.expressions.unshift(this[\"class\"]):this.body.expressions.unshift(new Assign(new IdentifierLiteral(this.name),this[\"class\"])),(_this$body$expression=this.body.expressions).unshift.apply(_this$body$expression,_toConsumableArray(directives)),this.body.push(ident),klass.compileToFragments(o)}},{key:\"walkBody\",value:function walkBody(){var _this48=this,directives,expr,index;for(directives=[],index=0;(expr=this.body.expressions[index])&&!!(expr instanceof Value&&expr.isString());)if(expr.hoisted)index++;else{var _directives;(_directives=directives).push.apply(_directives,_toConsumableArray(this.body.expressions.splice(index,1)))}return this.traverseChildren(!1,function(child){var cont,i,j,len1,node,ref1;if(child instanceof Class||child instanceof HoistTarget)return!1;if(cont=!0,child instanceof Block){for(ref1=child.expressions,i=j=0,len1=ref1.length;j<len1;i=++j)node=ref1[i],node instanceof Value&&node.isObject(!0)?(cont=!1,child.expressions[i]=_this48.addProperties(node.base.properties)):node instanceof Assign&&node.variable.looksStatic(_this48.name)&&(node.value.isStatic=!0);child.expressions=flatten(child.expressions)}return cont}),directives}},{key:\"setContext\",value:function setContext(){var _this49=this;return this.body.traverseChildren(!1,function(node){return node instanceof ThisLiteral?node.value=_this49.name:node instanceof Code&&node.bound&&(node.isStatic||!node.name)?node.context=_this49.name:void 0})}},{key:\"addProperties\",value:function addProperties(assigns){var assign,base,name,prototype,result,value,variable;return result=function(){var j,len1,results1;for(results1=[],j=0,len1=assigns.length;j<len1;j++)assign=assigns[j],variable=assign.variable,base=null==variable?void 0:variable.base,value=assign.value,delete assign.context,\"constructor\"===base.value?(value instanceof Code&&base.error(\"constructors must be defined at the top level of a class body\"),assign=this.externalCtor=new Assign(new Value(),value)):assign.variable[\"this\"]?assign.value instanceof Code&&(assign.value.isStatic=!0):(name=base instanceof ComputedPropertyName?new Index(base.value):new(base.shouldCache()?Index:Access)(base),prototype=new Access(new PropertyName(\"prototype\")),variable=new Value(new ThisLiteral(),[prototype,name]),assign.variable=variable),results1.push(assign);return results1}.call(this),compact(result)}}]),ExecutableClassBody}(Base);return ExecutableClassBody.prototype.children=[\"class\",\"body\"],ExecutableClassBody.prototype.defaultClassVariableName=\"_Class\",ExecutableClassBody}.call(this),exports.ClassProperty=ClassProperty=function(){var ClassProperty=function(_Base31){\"use strict\";function ClassProperty(_ref44){var name1=_ref44.name,isStatic=_ref44.isStatic,staticClassName1=_ref44.staticClassName,value1=_ref44.value,operatorToken1=_ref44.operatorToken,_this50;return _classCallCheck(this,ClassProperty),_this50=_super53.call(this),_this50.name=name1,_this50.isStatic=isStatic,_this50.staticClassName=staticClassName1,_this50.value=value1,_this50.operatorToken=operatorToken1,_this50}_inherits(ClassProperty,_Base31);var _super53=_createSuper(ClassProperty);return _createClass(ClassProperty,[{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{key:this.name.ast(o,LEVEL_LIST),value:this.value.ast(o,LEVEL_LIST),static:!!this.isStatic,computed:this.name instanceof Index||this.name instanceof ComputedPropertyName,operator:null==(ref1=null==(ref2=this.operatorToken)?void 0:ref2.value)?\"=\":ref1,staticClassName:null==(ref3=null==(ref4=this.staticClassName)?void 0:ref4.ast(o))?null:ref3}}}]),ClassProperty}(Base);return ClassProperty.prototype.children=[\"name\",\"value\",\"staticClassName\"],ClassProperty.prototype.isStatement=YES,ClassProperty}.call(this),exports.ClassPrototypeProperty=ClassPrototypeProperty=function(){var ClassPrototypeProperty=function(_Base32){\"use strict\";function ClassPrototypeProperty(_ref45){var name1=_ref45.name,value1=_ref45.value,_this51;return _classCallCheck(this,ClassPrototypeProperty),_this51=_super54.call(this),_this51.name=name1,_this51.value=value1,_this51}_inherits(ClassPrototypeProperty,_Base32);var _super54=_createSuper(ClassPrototypeProperty);return _createClass(ClassPrototypeProperty,[{key:\"astProperties\",value:function astProperties(o){return{key:this.name.ast(o,LEVEL_LIST),value:this.value.ast(o,LEVEL_LIST),computed:this.name instanceof ComputedPropertyName||this.name instanceof StringWithInterpolations}}}]),ClassPrototypeProperty}(Base);return ClassPrototypeProperty.prototype.children=[\"name\",\"value\"],ClassPrototypeProperty.prototype.isStatement=YES,ClassPrototypeProperty}.call(this),exports.ModuleDeclaration=ModuleDeclaration=function(){var ModuleDeclaration=function(_Base33){\"use strict\";function ModuleDeclaration(clause,source1,assertions){var _this52;return _classCallCheck(this,ModuleDeclaration),_this52=_super55.call(this),_this52.clause=clause,_this52.source=source1,_this52.assertions=assertions,_this52.checkSource(),_this52}_inherits(ModuleDeclaration,_Base33);var _super55=_createSuper(ModuleDeclaration);return _createClass(ModuleDeclaration,[{key:\"checkSource\",value:function checkSource(){if(null!=this.source&&this.source instanceof StringWithInterpolations)return this.source.error(\"the name of the module to be imported from must be an uninterpolated string\")}},{key:\"checkScope\",value:function checkScope(o,moduleDeclarationType){if(0!==o.indent.length)return this.error(\"\".concat(moduleDeclarationType,\" statements must be at top-level scope\"))}},{key:\"astAssertions\",value:function astAssertions(o){var ref1;return null==(null==(ref1=this.assertions)?void 0:ref1.properties)?[]:this.assertions.properties.map(function(assertion){var _assertion$ast=assertion.ast(o),end,left,loc,right,start;return start=_assertion$ast.start,end=_assertion$ast.end,loc=_assertion$ast.loc,left=_assertion$ast.left,right=_assertion$ast.right,{type:\"ImportAttribute\",start:start,end:end,loc:loc,key:left,value:right}})}}]),ModuleDeclaration}(Base);return ModuleDeclaration.prototype.children=[\"clause\",\"source\",\"assertions\"],ModuleDeclaration.prototype.isStatement=YES,ModuleDeclaration.prototype.jumps=THIS,ModuleDeclaration.prototype.makeReturn=THIS,ModuleDeclaration}.call(this),exports.ImportDeclaration=ImportDeclaration=function(_ModuleDeclaration){\"use strict\";function ImportDeclaration(){return _classCallCheck(this,ImportDeclaration),_super56.apply(this,arguments)}_inherits(ImportDeclaration,_ModuleDeclaration);var _super56=_createSuper(ImportDeclaration);return _createClass(ImportDeclaration,[{key:\"compileNode\",value:function compileNode(o){var code,ref1;if(this.checkScope(o,\"import\"),o.importedSymbols=[],code=[],code.push(this.makeCode(\"\".concat(this.tab,\"import \"))),null!=this.clause){var _code;(_code=code).push.apply(_code,_toConsumableArray(this.clause.compileNode(o)))}if(null!=(null==(ref1=this.source)?void 0:ref1.value)&&(null!==this.clause&&code.push(this.makeCode(\" from \")),code.push(this.makeCode(this.source.value)),null!=this.assertions)){var _code2;code.push(this.makeCode(\" assert \")),(_code2=code).push.apply(_code2,_toConsumableArray(this.assertions.compileToFragments(o)))}return code.push(this.makeCode(\";\")),code}},{key:\"astNode\",value:function astNode(o){return o.importedSymbols=[],_get(_getPrototypeOf(ImportDeclaration.prototype),\"astNode\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ret;return ret={specifiers:null==(ref1=null==(ref2=this.clause)?void 0:ref2.ast(o))?[]:ref1,source:this.source.ast(o),assertions:this.astAssertions(o)},this.clause&&(ret.importKind=\"value\"),ret}}]),ImportDeclaration}(ModuleDeclaration),exports.ImportClause=ImportClause=function(){var ImportClause=function(_Base34){\"use strict\";function ImportClause(defaultBinding,namedImports){var _this53;return _classCallCheck(this,ImportClause),_this53=_super57.call(this),_this53.defaultBinding=defaultBinding,_this53.namedImports=namedImports,_this53}_inherits(ImportClause,_Base34);var _super57=_createSuper(ImportClause);return _createClass(ImportClause,[{key:\"compileNode\",value:function compileNode(o){var code;if(code=[],null!=this.defaultBinding){var _code3;(_code3=code).push.apply(_code3,_toConsumableArray(this.defaultBinding.compileNode(o))),null!=this.namedImports&&code.push(this.makeCode(\", \"))}if(null!=this.namedImports){var _code4;(_code4=code).push.apply(_code4,_toConsumableArray(this.namedImports.compileNode(o)))}return code}},{key:\"astNode\",value:function astNode(o){var ref1,ref2;return compact(flatten([null==(ref1=this.defaultBinding)?void 0:ref1.ast(o),null==(ref2=this.namedImports)?void 0:ref2.ast(o)]))}}]),ImportClause}(Base);return ImportClause.prototype.children=[\"defaultBinding\",\"namedImports\"],ImportClause}.call(this),exports.ExportDeclaration=ExportDeclaration=function(_ModuleDeclaration2){\"use strict\";function ExportDeclaration(){return _classCallCheck(this,ExportDeclaration),_super58.apply(this,arguments)}_inherits(ExportDeclaration,_ModuleDeclaration2);var _super58=_createSuper(ExportDeclaration);return _createClass(ExportDeclaration,[{key:\"compileNode\",value:function compileNode(o){var code,ref1;if(this.checkScope(o,\"export\"),this.checkForAnonymousClassExport(),code=[],code.push(this.makeCode(\"\".concat(this.tab,\"export \"))),this instanceof ExportDefaultDeclaration&&code.push(this.makeCode(\"default \")),!(this instanceof ExportDefaultDeclaration)&&(this.clause instanceof Assign||this.clause instanceof Class)&&(code.push(this.makeCode(\"var \")),this.clause.moduleDeclaration=\"export\"),code=null!=this.clause.body&&this.clause.body instanceof Block?code.concat(this.clause.compileToFragments(o,LEVEL_TOP)):code.concat(this.clause.compileNode(o)),null!=(null==(ref1=this.source)?void 0:ref1.value)&&(code.push(this.makeCode(\" from \".concat(this.source.value))),null!=this.assertions)){var _code5;code.push(this.makeCode(\" assert \")),(_code5=code).push.apply(_code5,_toConsumableArray(this.assertions.compileToFragments(o)))}return code.push(this.makeCode(\";\")),code}},{key:\"checkForAnonymousClassExport\",value:function checkForAnonymousClassExport(){if(!(this instanceof ExportDefaultDeclaration)&&this.clause instanceof Class&&!this.clause.variable)return this.clause.error(\"anonymous classes cannot be exported\")}},{key:\"astNode\",value:function astNode(o){return this.checkForAnonymousClassExport(),_get(_getPrototypeOf(ExportDeclaration.prototype),\"astNode\",this).call(this,o)}}]),ExportDeclaration}(ModuleDeclaration),exports.ExportNamedDeclaration=ExportNamedDeclaration=function(_ExportDeclaration){\"use strict\";function ExportNamedDeclaration(){return _classCallCheck(this,ExportNamedDeclaration),_super59.apply(this,arguments)}_inherits(ExportNamedDeclaration,_ExportDeclaration);var _super59=_createSuper(ExportNamedDeclaration);return _createClass(ExportNamedDeclaration,[{key:\"astProperties\",value:function astProperties(o){var clauseAst,ref1,ref2,ret;return ret={source:null==(ref1=null==(ref2=this.source)?void 0:ref2.ast(o))?null:ref1,assertions:this.astAssertions(o),exportKind:\"value\"},clauseAst=this.clause.ast(o),this.clause instanceof ExportSpecifierList?(ret.specifiers=clauseAst,ret.declaration=null):(ret.specifiers=[],ret.declaration=clauseAst),ret}}]),ExportNamedDeclaration}(ExportDeclaration),exports.ExportDefaultDeclaration=ExportDefaultDeclaration=function(_ExportDeclaration2){\"use strict\";function ExportDefaultDeclaration(){return _classCallCheck(this,ExportDefaultDeclaration),_super60.apply(this,arguments)}_inherits(ExportDefaultDeclaration,_ExportDeclaration2);var _super60=_createSuper(ExportDefaultDeclaration);return _createClass(ExportDefaultDeclaration,[{key:\"astProperties\",value:function astProperties(o){return{declaration:this.clause.ast(o),assertions:this.astAssertions(o)}}}]),ExportDefaultDeclaration}(ExportDeclaration),exports.ExportAllDeclaration=ExportAllDeclaration=function(_ExportDeclaration3){\"use strict\";function ExportAllDeclaration(){return _classCallCheck(this,ExportAllDeclaration),_super61.apply(this,arguments)}_inherits(ExportAllDeclaration,_ExportDeclaration3);var _super61=_createSuper(ExportAllDeclaration);return _createClass(ExportAllDeclaration,[{key:\"astProperties\",value:function astProperties(o){return{source:this.source.ast(o),assertions:this.astAssertions(o),exportKind:\"value\"}}}]),ExportAllDeclaration}(ExportDeclaration),exports.ModuleSpecifierList=ModuleSpecifierList=function(){var ModuleSpecifierList=function(_Base35){\"use strict\";function ModuleSpecifierList(specifiers){var _this54;return _classCallCheck(this,ModuleSpecifierList),_this54=_super62.call(this),_this54.specifiers=specifiers,_this54}_inherits(ModuleSpecifierList,_Base35);var _super62=_createSuper(ModuleSpecifierList);return _createClass(ModuleSpecifierList,[{key:\"compileNode\",value:function compileNode(o){var code,compiledList,fragments,index,j,len1,specifier;if(code=[],o.indent+=TAB,compiledList=function(){var j,len1,ref1,results1;for(ref1=this.specifiers,results1=[],(j=0,len1=ref1.length);j<len1;j++)specifier=ref1[j],results1.push(specifier.compileToFragments(o,LEVEL_LIST));return results1}.call(this),0!==this.specifiers.length){for(code.push(this.makeCode(\"{\\n\".concat(o.indent))),index=j=0,len1=compiledList.length;j<len1;index=++j){var _code6;fragments=compiledList[index],index&&code.push(this.makeCode(\",\\n\".concat(o.indent))),(_code6=code).push.apply(_code6,_toConsumableArray(fragments))}code.push(this.makeCode(\"\\n}\"))}else code.push(this.makeCode(\"{}\"));return code}},{key:\"astNode\",value:function astNode(o){var j,len1,ref1,results1,specifier;for(ref1=this.specifiers,results1=[],(j=0,len1=ref1.length);j<len1;j++)specifier=ref1[j],results1.push(specifier.ast(o));return results1}}]),ModuleSpecifierList}(Base);return ModuleSpecifierList.prototype.children=[\"specifiers\"],ModuleSpecifierList}.call(this),exports.ImportSpecifierList=ImportSpecifierList=function(_ModuleSpecifierList){\"use strict\";function ImportSpecifierList(){return _classCallCheck(this,ImportSpecifierList),_super63.apply(this,arguments)}_inherits(ImportSpecifierList,_ModuleSpecifierList);var _super63=_createSuper(ImportSpecifierList);return _createClass(ImportSpecifierList)}(ModuleSpecifierList),exports.ExportSpecifierList=ExportSpecifierList=function(_ModuleSpecifierList2){\"use strict\";function ExportSpecifierList(){return _classCallCheck(this,ExportSpecifierList),_super64.apply(this,arguments)}_inherits(ExportSpecifierList,_ModuleSpecifierList2);var _super64=_createSuper(ExportSpecifierList);return _createClass(ExportSpecifierList)}(ModuleSpecifierList),exports.ModuleSpecifier=ModuleSpecifier=function(){var ModuleSpecifier=function(_Base36){\"use strict\";function ModuleSpecifier(original,alias,moduleDeclarationType1){var _this55;_classCallCheck(this,ModuleSpecifier);var ref1,ref2;if(_this55=_super65.call(this),_this55.original=original,_this55.alias=alias,_this55.moduleDeclarationType=moduleDeclarationType1,_this55.original.comments||(null==(ref1=_this55.alias)?void 0:ref1.comments)){if(_this55.comments=[],_this55.original.comments){var _this55$comments;(_this55$comments=_this55.comments).push.apply(_this55$comments,_toConsumableArray(_this55.original.comments))}if(null==(ref2=_this55.alias)?void 0:ref2.comments){var _this55$comments2;(_this55$comments2=_this55.comments).push.apply(_this55$comments2,_toConsumableArray(_this55.alias.comments))}}return _this55.identifier=null==_this55.alias?_this55.original.value:_this55.alias.value,_this55}_inherits(ModuleSpecifier,_Base36);var _super65=_createSuper(ModuleSpecifier);return _createClass(ModuleSpecifier,[{key:\"compileNode\",value:function compileNode(o){var code;return this.addIdentifierToScope(o),code=[],code.push(this.makeCode(this.original.value)),null!=this.alias&&code.push(this.makeCode(\" as \".concat(this.alias.value))),code}},{key:\"addIdentifierToScope\",value:function addIdentifierToScope(o){return o.scope.find(this.identifier,this.moduleDeclarationType)}},{key:\"astNode\",value:function astNode(o){return this.addIdentifierToScope(o),_get(_getPrototypeOf(ModuleSpecifier.prototype),\"astNode\",this).call(this,o)}}]),ModuleSpecifier}(Base);return ModuleSpecifier.prototype.children=[\"original\",\"alias\"],ModuleSpecifier}.call(this),exports.ImportSpecifier=ImportSpecifier=function(_ModuleSpecifier){\"use strict\";function ImportSpecifier(imported,local){return _classCallCheck(this,ImportSpecifier),_super66.call(this,imported,local,\"import\")}_inherits(ImportSpecifier,_ModuleSpecifier);var _super66=_createSuper(ImportSpecifier);return _createClass(ImportSpecifier,[{key:\"addIdentifierToScope\",value:function addIdentifierToScope(o){var ref1;return(ref1=this.identifier,0<=indexOf.call(o.importedSymbols,ref1))||o.scope.check(this.identifier)?this.error(\"'\".concat(this.identifier,\"' has already been declared\")):o.importedSymbols.push(this.identifier),_get(_getPrototypeOf(ImportSpecifier.prototype),\"addIdentifierToScope\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(o){var originalAst,ref1,ref2;return originalAst=this.original.ast(o),{imported:originalAst,local:null==(ref1=null==(ref2=this.alias)?void 0:ref2.ast(o))?originalAst:ref1,importKind:null}}}]),ImportSpecifier}(ModuleSpecifier),exports.ImportDefaultSpecifier=ImportDefaultSpecifier=function(_ImportSpecifier){\"use strict\";function ImportDefaultSpecifier(){return _classCallCheck(this,ImportDefaultSpecifier),_super67.apply(this,arguments)}_inherits(ImportDefaultSpecifier,_ImportSpecifier);var _super67=_createSuper(ImportDefaultSpecifier);return _createClass(ImportDefaultSpecifier,[{key:\"astProperties\",value:function astProperties(o){return{local:this.original.ast(o)}}}]),ImportDefaultSpecifier}(ImportSpecifier),exports.ImportNamespaceSpecifier=ImportNamespaceSpecifier=function(_ImportSpecifier2){\"use strict\";function ImportNamespaceSpecifier(){return _classCallCheck(this,ImportNamespaceSpecifier),_super68.apply(this,arguments)}_inherits(ImportNamespaceSpecifier,_ImportSpecifier2);var _super68=_createSuper(ImportNamespaceSpecifier);return _createClass(ImportNamespaceSpecifier,[{key:\"astProperties\",value:function astProperties(o){return{local:this.alias.ast(o)}}}]),ImportNamespaceSpecifier}(ImportSpecifier),exports.ExportSpecifier=ExportSpecifier=function(_ModuleSpecifier2){\"use strict\";function ExportSpecifier(local,exported){return _classCallCheck(this,ExportSpecifier),_super69.call(this,local,exported,\"export\")}_inherits(ExportSpecifier,_ModuleSpecifier2);var _super69=_createSuper(ExportSpecifier);return _createClass(ExportSpecifier,[{key:\"astProperties\",value:function astProperties(o){var originalAst,ref1,ref2;return originalAst=this.original.ast(o),{local:originalAst,exported:null==(ref1=null==(ref2=this.alias)?void 0:ref2.ast(o))?originalAst:ref1}}}]),ExportSpecifier}(ModuleSpecifier),exports.DynamicImport=DynamicImport=function(_Base37){\"use strict\";function DynamicImport(){return _classCallCheck(this,DynamicImport),_super70.apply(this,arguments)}_inherits(DynamicImport,_Base37);var _super70=_createSuper(DynamicImport);return _createClass(DynamicImport,[{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\"import\")]}},{key:\"astType\",value:function astType(){return\"Import\"}}]),DynamicImport}(Base),exports.DynamicImportCall=DynamicImportCall=function(_Call3){\"use strict\";function DynamicImportCall(){return _classCallCheck(this,DynamicImportCall),_super71.apply(this,arguments)}_inherits(DynamicImportCall,_Call3);var _super71=_createSuper(DynamicImportCall);return _createClass(DynamicImportCall,[{key:\"compileNode\",value:function compileNode(o){return this.checkArguments(),_get(_getPrototypeOf(DynamicImportCall.prototype),\"compileNode\",this).call(this,o)}},{key:\"checkArguments\",value:function checkArguments(){var ref1;if(!(1<=(ref1=this.args.length)&&2>=ref1))return this.error(\"import() accepts either one or two arguments\")}},{key:\"astNode\",value:function astNode(o){return this.checkArguments(),_get(_getPrototypeOf(DynamicImportCall.prototype),\"astNode\",this).call(this,o)}}]),DynamicImportCall}(Call),exports.Assign=Assign=function(){var Assign=function(_Base38){\"use strict\";function Assign(variable1,value1,context1){var options=3<arguments.length&&void 0!==arguments[3]?arguments[3]:{},_this56;_classCallCheck(this,Assign),_this56=_super72.call(this),_this56.variable=variable1,_this56.value=value1,_this56.context=context1,_this56.param=options.param,_this56.subpattern=options.subpattern,_this56.operatorToken=options.operatorToken,_this56.moduleDeclaration=options.moduleDeclaration;var _options$originalCont=options.originalContext;return _this56.originalContext=void 0===_options$originalCont?_this56.context:_options$originalCont,_this56.propagateLhs(),_this56}_inherits(Assign,_Base38);var _super72=_createSuper(Assign);return _createClass(Assign,[{key:\"isStatement\",value:function isStatement(o){return(null==o?void 0:o.level)===LEVEL_TOP&&null!=this.context&&(this.moduleDeclaration||0<=indexOf.call(this.context,\"?\"))}},{key:\"checkNameAssignability\",value:function checkNameAssignability(o,varBase){if(\"import\"===o.scope.type(varBase.value))return varBase.error(\"'\".concat(varBase.value,\"' is read-only\"))}},{key:\"assigns\",value:function assigns(name){return this[\"object\"===this.context?\"value\":\"variable\"].assigns(name)}},{key:\"unfoldSoak\",value:function unfoldSoak(o){return _unfoldSoak(o,this,\"variable\")}},{key:\"addScopeVariables\",value:function addScopeVariables(o){var _this57=this,_ref46=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref46$allowAssignmen=_ref46.allowAssignmentToExpansion,_ref46$allowAssignmen2=_ref46.allowAssignmentToNontrailingSplat,_ref46$allowAssignmen3=_ref46.allowAssignmentToEmptyArray,_ref46$allowAssignmen4=_ref46.allowAssignmentToComplexSplat,varBase;if(!(this.context&&\"**=\"!==this.context))return varBase=this.variable.unwrapAll(),varBase.isAssignable({allowExpansion:void 0!==_ref46$allowAssignmen&&_ref46$allowAssignmen,allowNontrailingSplat:void 0!==_ref46$allowAssignmen2&&_ref46$allowAssignmen2,allowEmptyArray:void 0!==_ref46$allowAssignmen3&&_ref46$allowAssignmen3,allowComplexSplat:void 0!==_ref46$allowAssignmen4&&_ref46$allowAssignmen4})||this.variable.error(\"'\".concat(this.variable.compile(o),\"' can't be assigned\")),varBase.eachName(function(name){var alreadyDeclared,commentFragments,commentsNode,message;if(\"function\"!=typeof name.hasProperties||!name.hasProperties())return(message=isUnassignable(name.value),message&&name.error(message),_this57.checkNameAssignability(o,name),_this57.moduleDeclaration)?(o.scope.add(name.value,_this57.moduleDeclaration),name.isDeclaration=!0):_this57.param?o.scope.add(name.value,\"alwaysDeclare\"===_this57.param?\"var\":\"param\"):(alreadyDeclared=o.scope.find(name.value),null==name.isDeclaration&&(name.isDeclaration=!alreadyDeclared),name.comments&&!o.scope.comments[name.value]&&!(_this57.value instanceof Class)&&name.comments.every(function(comment){return comment.here&&!comment.multiline}))?(commentsNode=new IdentifierLiteral(name.value),commentsNode.comments=name.comments,commentFragments=[],_this57.compileCommentFragments(o,commentsNode,commentFragments),o.scope.comments[name.value]=commentFragments):void 0})}},{key:\"compileNode\",value:function compileNode(o){var answer,compiledName,isValue,name,properties,prototype,ref1,ref2,ref3,ref4,val;if(isValue=this.variable instanceof Value,isValue){if((this.variable.isArray()||this.variable.isObject())&&!this.variable.isAssignable())return this.variable.isObject()&&this.variable.base.hasSplat()?this.compileObjectDestruct(o):this.compileDestructuring(o);if(this.variable.isSplice())return this.compileSplice(o);if(this.isConditional())return this.compileConditional(o);if(\"//=\"===(ref1=this.context)||\"%%=\"===ref1)return this.compileSpecialMath(o)}if(this.addScopeVariables(o),this.value instanceof Code)if(this.value.isStatic)this.value.name=this.variable.properties[0];else if(2<=(null==(ref2=this.variable.properties)?void 0:ref2.length)){var _ref47,_ref48,_splice$call,_splice$call2;ref3=this.variable.properties,_ref47=ref3,_ref48=_toArray(_ref47),properties=_ref48.slice(0),_ref47,_splice$call=splice.call(properties,-2),_splice$call2=_slicedToArray(_splice$call,2),prototype=_splice$call2[0],name=_splice$call2[1],_splice$call,\"prototype\"===(null==(ref4=prototype.name)?void 0:ref4.value)&&(this.value.name=name)}return(val=this.value.compileToFragments(o,LEVEL_LIST),compiledName=this.variable.compileToFragments(o,LEVEL_LIST),\"object\"===this.context)?(this.variable.shouldCache()&&(compiledName.unshift(this.makeCode(\"[\")),compiledName.push(this.makeCode(\"]\"))),compiledName.concat(this.makeCode(\": \"),val)):(answer=compiledName.concat(this.makeCode(\" \".concat(this.context||\"=\",\" \")),val),o.level>LEVEL_LIST||isValue&&this.variable.base instanceof Obj&&!this.nestedLhs&&!0!==this.param?this.wrapInParentheses(answer):answer)}},{key:\"compileObjectDestruct\",value:function compileObjectDestruct(o){var assigns,props,refVal,splat,splatProp;this.variable.base.reorderProperties(),props=this.variable.base.properties;var _slice1$call15=slice1.call(props,-1),_slice1$call16=_slicedToArray(_slice1$call15,1);return splat=_slice1$call16[0],splatProp=splat.name,assigns=[],refVal=new Value(new IdentifierLiteral(o.scope.freeVariable(\"ref\"))),props.splice(-1,1,new Splat(refVal)),assigns.push(new Assign(new Value(new Obj(props)),this.value).compileToFragments(o,LEVEL_LIST)),assigns.push(new Assign(new Value(splatProp),refVal).compileToFragments(o,LEVEL_LIST)),this.joinFragmentArrays(assigns,\", \")}},{key:\"compileDestructuring\",value:function compileDestructuring(o){var _this58=this,assignObjects,assigns,code,compSlice,compSplice,complexObjects,expIdx,expans,fragments,hasObjAssigns,isExpans,isSplat,leftObjs,loopObjects,obj,objIsUnassignable,objects,olen,processObjects,pushAssign,ref,refExp,restVar,rightObjs,slicer,splatVar,splatVarAssign,splatVarRef,splats,splatsAndExpans,top,value,vvar,vvarText;if(top=o.level===LEVEL_TOP,value=this.value,objects=this.variable.base.objects,olen=objects.length,0===olen)return code=value.compileToFragments(o),o.level>=LEVEL_OP?this.wrapInParentheses(code):code;var _objects=objects,_objects2=_slicedToArray(_objects,1);obj=_objects2[0],this.disallowLoneExpansion();var _this$getAndCheckSpla=this.getAndCheckSplatsAndExpansions();return splats=_this$getAndCheckSpla.splats,expans=_this$getAndCheckSpla.expans,splatsAndExpans=_this$getAndCheckSpla.splatsAndExpans,isSplat=0<(null==splats?void 0:splats.length),isExpans=0<(null==expans?void 0:expans.length),vvar=value.compileToFragments(o,LEVEL_LIST),vvarText=fragmentsToText(vvar),assigns=[],pushAssign=function(variable,val){return assigns.push(new Assign(variable,val,null,{param:_this58.param,subpattern:!0}).compileToFragments(o,LEVEL_LIST))},isSplat&&(splatVar=objects[splats[0]].name.unwrap(),(splatVar instanceof Arr||splatVar instanceof Obj)&&(splatVarRef=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),objects[splats[0]].name=splatVarRef,splatVarAssign=function(){return pushAssign(new Value(splatVar),splatVarRef)})),(!(value.unwrap()instanceof IdentifierLiteral)||this.variable.assigns(vvarText))&&(ref=o.scope.freeVariable(\"ref\"),assigns.push([this.makeCode(ref+\" = \")].concat(_toConsumableArray(vvar))),vvar=[this.makeCode(ref)],vvarText=ref),slicer=function(type){return function(vvar,start){var end=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],args,slice;return vvar instanceof Value||(vvar=new IdentifierLiteral(vvar)),args=[vvar,new NumberLiteral(start)],end&&args.push(new NumberLiteral(end)),slice=new Value(new IdentifierLiteral(utility(type,o)),[new Access(new PropertyName(\"call\"))]),new Value(new Call(slice,args))}},compSlice=slicer(\"slice\"),compSplice=slicer(\"splice\"),hasObjAssigns=function(objs){var i,j,len1,results1;for(results1=[],i=j=0,len1=objs.length;j<len1;i=++j)obj=objs[i],obj instanceof Assign&&\"object\"===obj.context&&results1.push(i);return results1},objIsUnassignable=function(objs){var j,len1;for(j=0,len1=objs.length;j<len1;j++)if(obj=objs[j],!obj.isAssignable())return!0;return!1},complexObjects=function(objs){return hasObjAssigns(objs).length||objIsUnassignable(objs)||1===olen},loopObjects=function(objs,vvar,vvarTxt){var acc,i,idx,j,len1,message,results1,vval;for(results1=[],i=j=0,len1=objs.length;j<len1;i=++j)if(obj=objs[i],!(obj instanceof Elision)){if(obj instanceof Assign&&\"object\"===obj.context){var _obj=obj;if(idx=_obj.variable.base,vvar=_obj.value,vvar instanceof Assign){var _vvar=vvar;vvar=_vvar.variable}idx=vvar[\"this\"]?vvar.properties[0].name:new PropertyName(vvar.unwrap().value),acc=idx.unwrap()instanceof PropertyName,vval=new Value(value,[new(acc?Access:Index)(idx)])}else vvar=function(){switch(!1){case!(obj instanceof Splat):return new Value(obj.name);default:return obj;}}(),vval=function(){switch(!1){case!(obj instanceof Splat):return compSlice(vvarTxt,i);default:return new Value(new Literal(vvarTxt),[new Index(new NumberLiteral(i))]);}}();message=isUnassignable(vvar.unwrap().value),message&&vvar.error(message),results1.push(pushAssign(vvar,vval))}return results1},assignObjects=function(objs,vvar,vvarTxt){var vval;return vvar=new Value(new Arr(objs,!0)),vval=vvarTxt instanceof Value?vvarTxt:new Value(new Literal(vvarTxt)),pushAssign(vvar,vval)},processObjects=function(objs,vvar,vvarTxt){return complexObjects(objs)?loopObjects(objs,vvar,vvarTxt):assignObjects(objs,vvar,vvarTxt)},splatsAndExpans.length?(expIdx=splatsAndExpans[0],leftObjs=objects.slice(0,expIdx+(isSplat?1:0)),rightObjs=objects.slice(expIdx+1),0!==leftObjs.length&&processObjects(leftObjs,vvar,vvarText),0!==rightObjs.length&&(refExp=function(){switch(!1){case!isSplat:return compSplice(new Value(objects[expIdx].name),-1*rightObjs.length);case!isExpans:return compSlice(vvarText,-1*rightObjs.length);}}(),complexObjects(rightObjs)&&(restVar=refExp,refExp=o.scope.freeVariable(\"ref\"),assigns.push([this.makeCode(refExp+\" = \")].concat(_toConsumableArray(restVar.compileToFragments(o,LEVEL_LIST))))),processObjects(rightObjs,vvar,refExp))):processObjects(objects,vvar,vvarText),\"function\"==typeof splatVarAssign&&splatVarAssign(),top||this.subpattern||assigns.push(vvar),fragments=this.joinFragmentArrays(assigns,\", \"),o.level<LEVEL_LIST?fragments:this.wrapInParentheses(fragments)}},{key:\"disallowLoneExpansion\",value:function disallowLoneExpansion(){var loneObject,objects;if(this.variable.base instanceof Arr&&(objects=this.variable.base.objects,1===(null==objects?void 0:objects.length))){var _objects3=objects,_objects4=_slicedToArray(_objects3,1);if(loneObject=_objects4[0],loneObject instanceof Expansion)return loneObject.error(\"Destructuring assignment has no target\")}}},{key:\"getAndCheckSplatsAndExpansions\",value:function getAndCheckSplatsAndExpansions(){var expans,i,obj,objects,splats,splatsAndExpans;return this.variable.base instanceof Arr?(objects=this.variable.base.objects,splats=function(){var j,len1,results1;for(results1=[],i=j=0,len1=objects.length;j<len1;i=++j)obj=objects[i],obj instanceof Splat&&results1.push(i);return results1}(),expans=function(){var j,len1,results1;for(results1=[],i=j=0,len1=objects.length;j<len1;i=++j)obj=objects[i],obj instanceof Expansion&&results1.push(i);return results1}(),splatsAndExpans=[].concat(_toConsumableArray(splats),_toConsumableArray(expans)),1<splatsAndExpans.length&&objects[splatsAndExpans.sort()[1]].error(\"multiple splats/expansions are disallowed in an assignment\"),{splats:splats,expans:expans,splatsAndExpans:splatsAndExpans}):{splats:[],expans:[],splatsAndExpans:[]}}},{key:\"compileConditional\",value:function compileConditional(o){var _this$variable$cacheR=this.variable.cacheReference(o),_this$variable$cacheR2=_slicedToArray(_this$variable$cacheR,2),fragments,left,right;return left=_this$variable$cacheR2[0],right=_this$variable$cacheR2[1],left.properties.length||!(left.base instanceof Literal)||left.base instanceof ThisLiteral||o.scope.check(left.base.value)||this.throwUnassignableConditionalError(left.base.value),0<=indexOf.call(this.context,\"?\")?(o.isExistentialEquals=!0,new If(new Existence(left),right,{type:\"if\"}).addElse(new Assign(right,this.value,\"=\")).compileToFragments(o)):(fragments=new Op(this.context.slice(0,-1),left,new Assign(right,this.value,\"=\")).compileToFragments(o),o.level<=LEVEL_LIST?fragments:this.wrapInParentheses(fragments))}},{key:\"compileSpecialMath\",value:function compileSpecialMath(o){var _this$variable$cacheR3=this.variable.cacheReference(o),_this$variable$cacheR4=_slicedToArray(_this$variable$cacheR3,2),left,right;return left=_this$variable$cacheR4[0],right=_this$variable$cacheR4[1],new Assign(left,new Op(this.context.slice(0,-1),right,this.value)).compileToFragments(o)}},{key:\"compileSplice\",value:function compileSplice(o){var _this$variable$proper=this.variable.properties.pop(),_this$variable$proper2=_this$variable$proper.range,answer,exclusive,from,fromDecl,fromRef,name,to,unwrappedVar,valDef,valRef;if(from=_this$variable$proper2.from,to=_this$variable$proper2.to,exclusive=_this$variable$proper2.exclusive,unwrappedVar=this.variable.unwrapAll(),unwrappedVar.comments&&(moveComments(unwrappedVar,this),delete this.variable.comments),name=this.variable.compile(o),from){var _this$cacheToCodeFrag7=this.cacheToCodeFragments(from.cache(o,LEVEL_OP)),_this$cacheToCodeFrag8=_slicedToArray(_this$cacheToCodeFrag7,2);fromDecl=_this$cacheToCodeFrag8[0],fromRef=_this$cacheToCodeFrag8[1]}else fromDecl=fromRef=\"0\";to?(null==from?void 0:from.isNumber())&&to.isNumber()?(to=to.compile(o)-fromRef,!exclusive&&(to+=1)):(to=to.compile(o,LEVEL_ACCESS)+\" - \"+fromRef,!exclusive&&(to+=\" + 1\")):to=\"9e9\";var _this$value$cache=this.value.cache(o,LEVEL_LIST),_this$value$cache2=_slicedToArray(_this$value$cache,2);return valDef=_this$value$cache2[0],valRef=_this$value$cache2[1],answer=[].concat(this.makeCode(\"\".concat(utility(\"splice\",o),\".apply(\").concat(name,\", [\").concat(fromDecl,\", \").concat(to,\"].concat(\")),valDef,this.makeCode(\")), \"),valRef),o.level>LEVEL_TOP?this.wrapInParentheses(answer):answer}},{key:\"eachName\",value:function eachName(iterator){return this.variable.unwrapAll().eachName(iterator)}},{key:\"isDefaultAssignment\",value:function isDefaultAssignment(){return this.param||this.nestedLhs}},{key:\"propagateLhs\",value:function propagateLhs(){var ref1,ref2;return(null==(ref1=this.variable)?void 0:\"function\"==typeof ref1.isArray?ref1.isArray():void 0)||(null==(ref2=this.variable)?void 0:\"function\"==typeof ref2.isObject?ref2.isObject():void 0)?this.variable.base.propagateLhs(!0):void 0}},{key:\"throwUnassignableConditionalError\",value:function throwUnassignableConditionalError(name){return this.variable.error(\"the variable \\\"\".concat(name,\"\\\" can't be assigned with \").concat(this.context,\" because it has not been declared before\"))}},{key:\"isConditional\",value:function isConditional(){var ref1;return\"||=\"===(ref1=this.context)||\"&&=\"===ref1||\"?=\"===ref1}},{key:\"astNode\",value:function astNode(o){var variable;return this.disallowLoneExpansion(),this.getAndCheckSplatsAndExpansions(),this.isConditional()&&(variable=this.variable.unwrap(),variable instanceof IdentifierLiteral&&!o.scope.check(variable.value)&&this.throwUnassignableConditionalError(variable.value)),this.addScopeVariables(o,{allowAssignmentToExpansion:!0,allowAssignmentToNontrailingSplat:!0,allowAssignmentToEmptyArray:!0,allowAssignmentToComplexSplat:!0}),_get(_getPrototypeOf(Assign.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isDefaultAssignment()?\"AssignmentPattern\":\"AssignmentExpression\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ret;return ret={right:this.value.ast(o,LEVEL_LIST),left:this.variable.ast(o,LEVEL_LIST)},this.isDefaultAssignment()||(ret.operator=null==(ref1=this.originalContext)?\"=\":ref1),ret}}]),Assign}(Base);return Assign.prototype.children=[\"variable\",\"value\"],Assign.prototype.isAssignable=YES,Assign.prototype.isStatementAst=NO,Assign}.call(this),exports.FuncGlyph=FuncGlyph=function(_Base39){\"use strict\";function FuncGlyph(glyph){var _this59;return _classCallCheck(this,FuncGlyph),_this59=_super73.call(this),_this59.glyph=glyph,_this59}_inherits(FuncGlyph,_Base39);var _super73=_createSuper(FuncGlyph);return _createClass(FuncGlyph)}(Base),exports.Code=Code=function(){var Code=function(_Base40){\"use strict\";function Code(params,body,funcGlyph,paramStart){var _this60;_classCallCheck(this,Code);var ref1;return _this60=_super74.call(this),_this60.funcGlyph=funcGlyph,_this60.paramStart=paramStart,_this60.params=params||[],_this60.body=body||new Block,_this60.bound=\"=>\"===(null==(ref1=_this60.funcGlyph)?void 0:ref1.glyph),_this60.isGenerator=!1,_this60.isAsync=!1,_this60.isMethod=!1,_this60.body.traverseChildren(!1,function(node){if((node instanceof Op&&node.isYield()||node instanceof YieldReturn)&&(_this60.isGenerator=!0),(node instanceof Op&&node.isAwait()||node instanceof AwaitReturn)&&(_this60.isAsync=!0),node instanceof For&&node.isAwait())return _this60.isAsync=!0}),_this60.propagateLhs(),_this60}_inherits(Code,_Base40);var _super74=_createSuper(Code);return _createClass(Code,[{key:\"isStatement\",value:function isStatement(){return this.isMethod}},{key:\"makeScope\",value:function makeScope(parentScope){return new Scope(parentScope,this.body,this)}},{key:\"compileNode\",value:function compileNode(o){var _this$body$expression3,_answer4,answer,body,boundMethodCheck,comment,condition,exprs,generatedVariables,haveBodyParam,haveSplatParam,i,ifTrue,j,k,l,len1,len2,len3,m,methodScope,modifiers,name,param,paramToAddToScope,params,paramsAfterSplat,ref,ref1,ref2,ref3,ref4,ref5,ref6,ref7,ref8,scopeVariablesCount,signature,splatParamName,thisAssignments,wasEmpty,yieldNode;for(this.checkForAsyncOrGeneratorConstructor(),this.bound&&((null==(ref1=o.scope.method)?void 0:ref1.bound)&&(this.context=o.scope.method.context),!this.context&&(this.context=\"this\")),this.updateOptions(o),params=[],exprs=[],thisAssignments=null==(ref2=null==(ref3=this.thisAssignments)?void 0:ref3.slice())?[]:ref2,paramsAfterSplat=[],haveSplatParam=!1,haveBodyParam=!1,this.checkForDuplicateParams(),this.disallowLoneExpansionAndMultipleSplats(),this.eachParamName(function(name,node,param,obj){var replacement,target;if(node[\"this\"])return name=node.properties[0].name.value,0<=indexOf.call(JS_FORBIDDEN,name)&&(name=\"_\".concat(name)),target=new IdentifierLiteral(o.scope.freeVariable(name,{reserve:!1})),replacement=param.name instanceof Obj&&obj instanceof Assign&&\"=\"===obj.operatorToken.value?new Assign(new IdentifierLiteral(name),target,\"object\"):target,param.renameParam(node,replacement),thisAssignments.push(new Assign(node,target))}),ref4=this.params,(i=j=0,len1=ref4.length);j<len1;i=++j)param=ref4[i],param.splat||param instanceof Expansion?(haveSplatParam=!0,param.splat?(param.name instanceof Arr||param.name instanceof Obj?(splatParamName=o.scope.freeVariable(\"arg\"),params.push(ref=new Value(new IdentifierLiteral(splatParamName))),exprs.push(new Assign(new Value(param.name),ref))):(params.push(ref=param.asReference(o)),splatParamName=fragmentsToText(ref.compileNodeWithoutComments(o))),param.shouldCache()&&exprs.push(new Assign(new Value(param.name),ref))):(splatParamName=o.scope.freeVariable(\"args\"),params.push(new Value(new IdentifierLiteral(splatParamName)))),o.scope.parameter(splatParamName)):((param.shouldCache()||haveBodyParam)&&(param.assignedInBody=!0,haveBodyParam=!0,null==param.value?exprs.push(new Assign(new Value(param.name),param.asReference(o),null,{param:\"alwaysDeclare\"})):(condition=new Op(\"===\",param,new UndefinedLiteral()),ifTrue=new Assign(new Value(param.name),param.value),exprs.push(new If(condition,ifTrue)))),haveSplatParam?(paramsAfterSplat.push(param),null!=param.value&&!param.shouldCache()&&(condition=new Op(\"===\",param,new UndefinedLiteral()),ifTrue=new Assign(new Value(param.name),param.value),exprs.push(new If(condition,ifTrue))),null!=(null==(ref5=param.name)?void 0:ref5.value)&&o.scope.add(param.name.value,\"var\",!0)):(ref=param.shouldCache()?param.asReference(o):null==param.value||param.assignedInBody?param:new Assign(new Value(param.name),param.value,null,{param:!0}),param.name instanceof Arr||param.name instanceof Obj?(param.name.lhs=!0,!param.shouldCache()&&param.name.eachName(function(prop){return o.scope.parameter(prop.value)})):(paramToAddToScope=null==param.value?ref:param,o.scope.parameter(fragmentsToText(paramToAddToScope.compileToFragmentsWithoutComments(o)))),params.push(ref)));if(0!==paramsAfterSplat.length&&exprs.unshift(new Assign(new Value(new Arr([new Splat(new IdentifierLiteral(splatParamName))].concat(_toConsumableArray(function(){var k,len2,results1;for(results1=[],k=0,len2=paramsAfterSplat.length;k<len2;k++)param=paramsAfterSplat[k],results1.push(param.asReference(o));return results1}())))),new Value(new IdentifierLiteral(splatParamName)))),wasEmpty=this.body.isEmpty(),this.disallowSuperInParamDefaults(),this.checkSuperCallsInConstructorBody(),!this.expandCtorSuper(thisAssignments)){var _this$body$expression2;(_this$body$expression2=this.body.expressions).unshift.apply(_this$body$expression2,_toConsumableArray(thisAssignments))}for((_this$body$expression3=this.body.expressions).unshift.apply(_this$body$expression3,_toConsumableArray(exprs)),this.isMethod&&this.bound&&!this.isStatic&&this.classVariable&&(boundMethodCheck=new Value(new Literal(utility(\"boundMethodCheck\",o))),this.body.expressions.unshift(new Call(boundMethodCheck,[new Value(new ThisLiteral()),this.classVariable]))),wasEmpty||this.noReturn||this.body.makeReturn(),this.bound&&this.isGenerator&&(yieldNode=this.body.contains(function(node){return node instanceof Op&&\"yield\"===node.operator}),(yieldNode||this).error(\"yield cannot occur inside bound (fat arrow) functions\")),modifiers=[],this.isMethod&&this.isStatic&&modifiers.push(\"static\"),this.isAsync&&modifiers.push(\"async\"),this.isMethod||this.bound?this.isGenerator&&modifiers.push(\"*\"):modifiers.push(\"function\".concat(this.isGenerator?\"*\":\"\")),signature=[this.makeCode(\"(\")],null!=(null==(ref6=this.paramStart)?void 0:ref6.comments)&&this.compileCommentFragments(o,this.paramStart,signature),(i=k=0,len2=params.length);k<len2;i=++k){var _signature;if(param=params[i],0!==i&&signature.push(this.makeCode(\", \")),haveSplatParam&&i===params.length-1&&signature.push(this.makeCode(\"...\")),scopeVariablesCount=o.scope.variables.length,(_signature=signature).push.apply(_signature,_toConsumableArray(param.compileToFragments(o,LEVEL_PAREN))),scopeVariablesCount!==o.scope.variables.length){var _o$scope$parent$varia;generatedVariables=o.scope.variables.splice(scopeVariablesCount),(_o$scope$parent$varia=o.scope.parent.variables).push.apply(_o$scope$parent$varia,_toConsumableArray(generatedVariables))}}if(signature.push(this.makeCode(\")\")),null!=(null==(ref7=this.funcGlyph)?void 0:ref7.comments)){for(ref8=this.funcGlyph.comments,l=0,len3=ref8.length;l<len3;l++)comment=ref8[l],comment.unshift=!1;this.compileCommentFragments(o,this.funcGlyph,signature)}if(this.body.isEmpty()||(body=this.body.compileWithDeclarations(o)),this.isMethod){var _ref49=[o.scope,o.scope.parent];methodScope=_ref49[0],o.scope=_ref49[1],name=this.name.compileToFragments(o),\".\"===name[0].code&&name.shift(),o.scope=methodScope}if(answer=this.joinFragmentArrays(function(){var len4,p,results1;for(results1=[],p=0,len4=modifiers.length;p<len4;p++)m=modifiers[p],results1.push(this.makeCode(m));return results1}.call(this),\" \"),modifiers.length&&name&&answer.push(this.makeCode(\" \")),name){var _answer3;(_answer3=answer).push.apply(_answer3,_toConsumableArray(name))}if((_answer4=answer).push.apply(_answer4,_toConsumableArray(signature)),this.bound&&!this.isMethod&&answer.push(this.makeCode(\" =>\")),answer.push(this.makeCode(\" {\")),null==body?void 0:body.length){var _answer5;(_answer5=answer).push.apply(_answer5,[this.makeCode(\"\\n\")].concat(_toConsumableArray(body),[this.makeCode(\"\\n\".concat(this.tab))]))}return answer.push(this.makeCode(\"}\")),this.isMethod?indentInitial(answer,this):this.front||o.level>=LEVEL_ACCESS?this.wrapInParentheses(answer):answer}},{key:\"updateOptions\",value:function updateOptions(o){return o.scope=del(o,\"classScope\")||this.makeScope(o.scope),o.scope.shared=del(o,\"sharedScope\"),o.indent+=TAB,delete o.bare,delete o.isExistentialEquals}},{key:\"checkForDuplicateParams\",value:function checkForDuplicateParams(){var paramNames;return paramNames=[],this.eachParamName(function(name,node){return 0<=indexOf.call(paramNames,name)&&node.error(\"multiple parameters named '\".concat(name,\"'\")),paramNames.push(name)})}},{key:\"eachParamName\",value:function eachParamName(iterator){var j,len1,param,ref1,results1;for(ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],results1.push(param.eachName(iterator));return results1}},{key:\"traverseChildren\",value:function traverseChildren(crossScope,func){if(crossScope)return _get(_getPrototypeOf(Code.prototype),\"traverseChildren\",this).call(this,crossScope,func)}},{key:\"replaceInContext\",value:function replaceInContext(child,replacement){return!!this.bound&&_get(_getPrototypeOf(Code.prototype),\"replaceInContext\",this).call(this,child,replacement)}},{key:\"disallowSuperInParamDefaults\",value:function disallowSuperInParamDefaults(){var _ref50=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},forAst=_ref50.forAst;return!!this.ctor&&this.eachSuperCall(Block.wrap(this.params),function(superCall){return superCall.error(\"'super' is not allowed in constructor parameter defaults\")},{checkForThisBeforeSuper:!forAst})}},{key:\"checkSuperCallsInConstructorBody\",value:function checkSuperCallsInConstructorBody(){var _this61=this,seenSuper;return!!this.ctor&&(seenSuper=this.eachSuperCall(this.body,function(superCall){if(\"base\"===_this61.ctor)return superCall.error(\"'super' is only allowed in derived class constructors\")}),seenSuper)}},{key:\"flagThisParamInDerivedClassConstructorWithoutCallingSuper\",value:function flagThisParamInDerivedClassConstructorWithoutCallingSuper(param){return param.error(\"Can't use @params in derived class constructors without calling super\")}},{key:\"checkForAsyncOrGeneratorConstructor\",value:function checkForAsyncOrGeneratorConstructor(){if(this.ctor&&(this.isAsync&&this.name.error(\"Class constructor may not be async\"),this.isGenerator))return this.name.error(\"Class constructor may not be a generator\")}},{key:\"disallowLoneExpansionAndMultipleSplats\",value:function disallowLoneExpansionAndMultipleSplats(){var j,len1,param,ref1,results1,seenSplatParam;for(seenSplatParam=!1,ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],param.splat||param instanceof Expansion?(seenSplatParam?param.error(\"only one splat or expansion parameter is allowed per function definition\"):param instanceof Expansion&&1===this.params.length&&param.error(\"an expansion parameter cannot be the only parameter in a function definition\"),results1.push(seenSplatParam=!0)):results1.push(void 0);return results1}},{key:\"expandCtorSuper\",value:function expandCtorSuper(thisAssignments){var haveThisParam,param,ref1,seenSuper;return!!this.ctor&&(seenSuper=this.eachSuperCall(this.body,function(superCall){return superCall.expressions=thisAssignments}),haveThisParam=thisAssignments.length&&thisAssignments.length!==(null==(ref1=this.thisAssignments)?void 0:ref1.length),\"derived\"===this.ctor&&!seenSuper&&haveThisParam&&(param=thisAssignments[0].variable,this.flagThisParamInDerivedClassConstructorWithoutCallingSuper(param)),seenSuper)}},{key:\"eachSuperCall\",value:function eachSuperCall(context,iterator){var _this62=this,_ref51=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_ref51$checkForThisBe=_ref51.checkForThisBeforeSuper,seenSuper;return seenSuper=!1,context.traverseChildren(!0,function(child){var childArgs;return child instanceof SuperCall?(!child.variable.accessor&&(childArgs=child.args.filter(function(arg){return!(arg instanceof Class)&&(!(arg instanceof Code)||arg.bound)}),Block.wrap(childArgs).traverseChildren(!0,function(node){if(node[\"this\"])return node.error(\"Can't call super with @params in derived class constructors\")})),seenSuper=!0,iterator(child)):(void 0===_ref51$checkForThisBe||_ref51$checkForThisBe)&&child instanceof ThisLiteral&&\"derived\"===_this62.ctor&&!seenSuper&&child.error(\"Can't reference 'this' before calling super in derived class constructors\"),!(child instanceof SuperCall)&&(!(child instanceof Code)||child.bound)}),seenSuper}},{key:\"propagateLhs\",value:function propagateLhs(){var j,len1,name,param,ref1,results1;for(ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++){param=ref1[j];var _param=param;name=_param.name,name instanceof Arr||name instanceof Obj?results1.push(name.propagateLhs(!0)):param instanceof Expansion?results1.push(param.lhs=!0):results1.push(void 0)}return results1}},{key:\"astAddParamsToScope\",value:function astAddParamsToScope(o){return this.eachParamName(function(name){return o.scope.add(name,\"param\")})}},{key:\"astNode\",value:function astNode(o){var _this63=this,seenSuper;return this.updateOptions(o),this.checkForAsyncOrGeneratorConstructor(),this.checkForDuplicateParams(),this.disallowSuperInParamDefaults({forAst:!0}),this.disallowLoneExpansionAndMultipleSplats(),seenSuper=this.checkSuperCallsInConstructorBody(),\"derived\"!==this.ctor||seenSuper||this.eachParamName(function(name,node){if(node[\"this\"])return _this63.flagThisParamInDerivedClassConstructorWithoutCallingSuper(node)}),this.astAddParamsToScope(o),this.body.isEmpty()||this.noReturn||this.body.makeReturn(null,!0),_get(_getPrototypeOf(Code.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isMethod?\"ClassMethod\":this.bound?\"ArrowFunctionExpression\":\"FunctionExpression\"}},{key:\"paramForAst\",value:function paramForAst(param){var name,splat,value;return param instanceof Expansion?param:(name=param.name,value=param.value,splat=param.splat,splat?new Splat(name,{lhs:!0,postfix:splat.postfix}).withLocationDataFrom(param):null==value?name:new Assign(name,value,null,{param:!0}).withLocationDataFrom({locationData:mergeLocationData(name.locationData,value.locationData)}))}},{key:\"methodAstProperties\",value:function methodAstProperties(o){var _this64=this,getIsComputed,ref1,ref2,ref3,ref4;return getIsComputed=function(){return!!(_this64.name instanceof Index)||!!(_this64.name instanceof ComputedPropertyName)||!!(_this64.name.name instanceof ComputedPropertyName)},{static:!!this.isStatic,key:this.name.ast(o),computed:getIsComputed(),kind:this.ctor?\"constructor\":\"method\",operator:null==(ref1=null==(ref2=this.operatorToken)?void 0:ref2.value)?\"=\":ref1,staticClassName:null==(ref3=null==(ref4=this.isStatic.staticClassName)?void 0:ref4.ast(o))?null:ref3,bound:!!this.bound}}},{key:\"astProperties\",value:function astProperties(o){var param,ref1;return Object.assign({params:function(){var j,len1,ref1,results1;for(ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],results1.push(this.paramForAst(param).ast(o));return results1}.call(this),body:this.body.ast(Object.assign({},o,{checkForDirectives:!0}),LEVEL_TOP),generator:!!this.isGenerator,async:!!this.isAsync,id:null,hasIndentedBody:this.body.locationData.first_line>(null==(ref1=this.funcGlyph)?void 0:ref1.locationData.first_line)},this.isMethod?this.methodAstProperties(o):{})}},{key:\"astLocationData\",value:function(){var astLocationData,functionLocationData;return(functionLocationData=_get(_getPrototypeOf(Code.prototype),\"astLocationData\",this).call(this),!this.isMethod)?functionLocationData:(astLocationData=mergeAstLocationData(this.name.astLocationData(),functionLocationData),null!=this.isStatic.staticClassName&&(astLocationData=mergeAstLocationData(this.isStatic.staticClassName.astLocationData(),astLocationData)),astLocationData)}}]),Code}(Base);return Code.prototype.children=[\"params\",\"body\"],Code.prototype.jumps=NO,Code}.call(this),exports.Param=Param=function(){var Param=function(_Base41){\"use strict\";function Param(name1,value1,splat1){var _this65;_classCallCheck(this,Param);var message,token;return _this65=_super75.call(this),_this65.name=name1,_this65.value=value1,_this65.splat=splat1,message=isUnassignable(_this65.name.unwrapAll().value),message&&_this65.name.error(message),_this65.name instanceof Obj&&_this65.name.generated&&(token=_this65.name.objects[0].operatorToken,token.error(\"unexpected \".concat(token.value))),_this65}_inherits(Param,_Base41);var _super75=_createSuper(Param);return _createClass(Param,[{key:\"compileToFragments\",value:function compileToFragments(o){return this.name.compileToFragments(o,LEVEL_LIST)}},{key:\"compileToFragmentsWithoutComments\",value:function compileToFragmentsWithoutComments(o){return this.name.compileToFragmentsWithoutComments(o,LEVEL_LIST)}},{key:\"asReference\",value:function asReference(o){var name,node;return this.reference?this.reference:(node=this.name,node[\"this\"]?(name=node.properties[0].name.value,0<=indexOf.call(JS_FORBIDDEN,name)&&(name=\"_\".concat(name)),node=new IdentifierLiteral(o.scope.freeVariable(name))):node.shouldCache()&&(node=new IdentifierLiteral(o.scope.freeVariable(\"arg\"))),node=new Value(node),node.updateLocationDataIfMissing(this.locationData),this.reference=node)}},{key:\"shouldCache\",value:function shouldCache(){return this.name.shouldCache()}},{key:\"eachName\",value:function eachName(iterator){var _this66=this,name=1<arguments.length&&void 0!==arguments[1]?arguments[1]:this.name,atParam,checkAssignabilityOfLiteral,j,len1,nObj,node,obj,ref1,ref2;if(checkAssignabilityOfLiteral=function(literal){var message;if(message=isUnassignable(literal.value),message&&literal.error(message),!literal.isAssignable())return literal.error(\"'\".concat(literal.value,\"' can't be assigned\"))},atParam=function(obj){var originalObj=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;return iterator(\"@\".concat(obj.properties[0].name.value),obj,_this66,originalObj)},name instanceof Call&&name.error(\"Function invocation can't be assigned\"),name instanceof Literal)return checkAssignabilityOfLiteral(name),iterator(name.value,name,this);if(name instanceof Value)return atParam(name);for(ref2=null==(ref1=name.objects)?[]:ref1,j=0,len1=ref2.length;j<len1;j++)obj=ref2[j],nObj=obj,obj instanceof Assign&&null==obj.context&&(obj=obj.variable),obj instanceof Assign?(obj=obj.value instanceof Assign?obj.value.variable:obj.value,this.eachName(iterator,obj.unwrap())):obj instanceof Splat?(node=obj.name.unwrap(),iterator(node.value,node,this)):obj instanceof Value?obj.isArray()||obj.isObject()?this.eachName(iterator,obj.base):obj[\"this\"]?atParam(obj,nObj):(checkAssignabilityOfLiteral(obj.base),iterator(obj.base.value,obj.base,this)):obj instanceof Elision?obj:!(obj instanceof Expansion)&&obj.error(\"illegal parameter \".concat(obj.compile()))}},{key:\"renameParam\",value:function renameParam(node,newNode){var isNode,replacement;return isNode=function(candidate){return candidate===node},replacement=function(node,parent){var key;return parent instanceof Obj?(key=node,node[\"this\"]&&(key=node.properties[0].name),node[\"this\"]&&key.value===newNode.value?new Value(newNode):new Assign(new Value(key),newNode,\"object\")):newNode},this.replaceInContext(isNode,replacement)}}]),Param}(Base);return Param.prototype.children=[\"name\",\"value\"],Param}.call(this),exports.Splat=Splat=function(){var Splat=function(_Base42){\"use strict\";function Splat(name){var _ref52=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},lhs1=_ref52.lhs,_ref52$postfix=_ref52.postfix,_this67;return _classCallCheck(this,Splat),_this67=_super76.call(this),_this67.lhs=lhs1,_this67.postfix=void 0===_ref52$postfix||_ref52$postfix,_this67.name=name.compile?name:new Literal(name),_this67}_inherits(Splat,_Base42);var _super76=_createSuper(Splat);return _createClass(Splat,[{key:\"shouldCache\",value:function shouldCache(){return!1}},{key:\"isAssignable\",value:function isAssignable(){var _ref53=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},_ref53$allowComplexSp=_ref53.allowComplexSplat;return this.name instanceof Obj||this.name instanceof Parens?void 0!==_ref53$allowComplexSp&&_ref53$allowComplexSp:this.name.isAssignable()&&(!this.name.isAtomic||this.name.isAtomic())}},{key:\"assigns\",value:function assigns(name){return this.name.assigns(name)}},{key:\"compileNode\",value:function compileNode(o){var compiledSplat;return compiledSplat=[this.makeCode(\"...\")].concat(_toConsumableArray(this.name.compileToFragments(o,LEVEL_OP))),this.jsx?[this.makeCode(\"{\")].concat(_toConsumableArray(compiledSplat),[this.makeCode(\"}\")]):compiledSplat}},{key:\"unwrap\",value:function unwrap(){return this.name}},{key:\"propagateLhs\",value:function propagateLhs(setLhs){var base1;return setLhs&&(this.lhs=!0),this.lhs?\"function\"==typeof(base1=this.name).propagateLhs?base1.propagateLhs(!0):void 0:void 0}},{key:\"astType\",value:function astType(){return this.jsx?\"JSXSpreadAttribute\":this.lhs?\"RestElement\":\"SpreadElement\"}},{key:\"astProperties\",value:function astProperties(o){return{argument:this.name.ast(o,LEVEL_OP),postfix:this.postfix}}}]),Splat}(Base);return Splat.prototype.children=[\"name\"],Splat}.call(this),exports.Expansion=Expansion=function(){var Expansion=function(_Base43){\"use strict\";function Expansion(){return _classCallCheck(this,Expansion),_super77.apply(this,arguments)}_inherits(Expansion,_Base43);var _super77=_createSuper(Expansion);return _createClass(Expansion,[{key:\"compileNode\",value:function compileNode(){return this.throwLhsError()}},{key:\"asReference\",value:function asReference(){return this}},{key:\"eachName\",value:function eachName(){}},{key:\"throwLhsError\",value:function throwLhsError(){return this.error(\"Expansion must be used inside a destructuring assignment or parameter list\")}},{key:\"astNode\",value:function astNode(o){return this.lhs||this.throwLhsError(),_get(_getPrototypeOf(Expansion.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"RestElement\"}},{key:\"astProperties\",value:function astProperties(){return{argument:null}}}]),Expansion}(Base);return Expansion.prototype.shouldCache=NO,Expansion}.call(this),exports.Elision=Elision=function(){var Elision=function(_Base44){\"use strict\";function Elision(){return _classCallCheck(this,Elision),_super78.apply(this,arguments)}_inherits(Elision,_Base44);var _super78=_createSuper(Elision);return _createClass(Elision,[{key:\"compileToFragments\",value:function compileToFragments(o,level){var fragment;return fragment=_get(_getPrototypeOf(Elision.prototype),\"compileToFragments\",this).call(this,o,level),fragment.isElision=!0,fragment}},{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\", \")]}},{key:\"asReference\",value:function asReference(){return this}},{key:\"eachName\",value:function eachName(){}},{key:\"astNode\",value:function astNode(){return null}}]),Elision}(Base);return Elision.prototype.isAssignable=YES,Elision.prototype.shouldCache=NO,Elision}.call(this),exports.While=While=function(){var While=function(_Base45){\"use strict\";function While(condition1){var _ref54=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},inverted=_ref54.invert,guard=_ref54.guard,isLoop=_ref54.isLoop,_this68;return _classCallCheck(this,While),_this68=_super79.call(this),_this68.condition=condition1,_this68.inverted=inverted,_this68.guard=guard,_this68.isLoop=isLoop,_this68}_inherits(While,_Base45);var _super79=_createSuper(While);return _createClass(While,[{key:\"makeReturn\",value:function makeReturn(results,mark){return results?_get(_getPrototypeOf(While.prototype),\"makeReturn\",this).call(this,results,mark):(this.returns=!this.jumps(),mark?void(this.returns&&this.body.makeReturn(results,mark)):this)}},{key:\"addBody\",value:function addBody(body1){return this.body=body1,this}},{key:\"jumps\",value:function jumps(){var expressions,j,jumpNode,len1,node;if(expressions=this.body.expressions,!expressions.length)return!1;for(j=0,len1=expressions.length;j<len1;j++)if(node=expressions[j],jumpNode=node.jumps({loop:!0}))return jumpNode;return!1}},{key:\"compileNode\",value:function compileNode(o){var answer,body,rvar,set;return o.indent+=TAB,set=\"\",body=this.body,body.isEmpty()?body=this.makeCode(\"\"):(this.returns&&(body.makeReturn(rvar=o.scope.freeVariable(\"results\")),set=\"\".concat(this.tab).concat(rvar,\" = [];\\n\")),this.guard&&(1<body.expressions.length?body.expressions.unshift(new If(new Parens(this.guard).invert(),new StatementLiteral(\"continue\"))):this.guard&&(body=Block.wrap([new If(this.guard,body)]))),body=[].concat(this.makeCode(\"\\n\"),body.compileToFragments(o,LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab)))),answer=[].concat(this.makeCode(set+this.tab+\"while (\"),this.processedCondition().compileToFragments(o,LEVEL_PAREN),this.makeCode(\") {\"),body,this.makeCode(\"}\")),this.returns&&answer.push(this.makeCode(\"\\n\".concat(this.tab,\"return \").concat(rvar,\";\"))),answer}},{key:\"processedCondition\",value:function processedCondition(){return null==this.processedConditionCache?this.processedConditionCache=this.inverted?this.condition.invert():this.condition:this.processedConditionCache}},{key:\"astType\",value:function astType(){return\"WhileStatement\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{test:this.condition.ast(o,LEVEL_PAREN),body:this.body.ast(o,LEVEL_TOP),guard:null==(ref1=null==(ref2=this.guard)?void 0:ref2.ast(o))?null:ref1,inverted:!!this.inverted,postfix:!!this.postfix,loop:!!this.isLoop}}}]),While}(Base);return While.prototype.children=[\"condition\",\"guard\",\"body\"],While.prototype.isStatement=YES,While}.call(this),exports.Op=Op=function(){var Op=function(_Base46){\"use strict\";function Op(op,first,second,flip){var _ref55=4<arguments.length&&void 0!==arguments[4]?arguments[4]:{},invertOperator=_ref55.invertOperator,_ref55$originalOperat=_ref55.originalOperator,originalOperator=void 0===_ref55$originalOperat?op:_ref55$originalOperat,_this69;_classCallCheck(this,Op);var call,firstCall,message,ref1,unwrapped;return(_this69=_super80.call(this),_this69.invertOperator=invertOperator,_this69.originalOperator=originalOperator,\"new\"===op)?((firstCall=unwrapped=first.unwrap())instanceof Call||(firstCall=unwrapped.base)instanceof Call)&&!firstCall[\"do\"]&&!firstCall.isNew?_possibleConstructorReturn(_this69,new Value(firstCall.newInstance(),firstCall===unwrapped?[]:unwrapped.properties)):(first instanceof Parens||first.unwrap()instanceof IdentifierLiteral||(\"function\"==typeof first.hasProperties?first.hasProperties():void 0)||(first=new Parens(first)),call=new Call(first,[]),call.locationData=_this69.locationData,call.isNew=!0,_possibleConstructorReturn(_this69,call)):(_this69.operator=CONVERSIONS[op]||op,_this69.first=first,_this69.second=second,_this69.flip=!!flip,(\"--\"===(ref1=_this69.operator)||\"++\"===ref1)&&(message=isUnassignable(_this69.first.unwrapAll().value),message&&_this69.first.error(message)),_possibleConstructorReturn(_this69,_assertThisInitialized(_this69)))}_inherits(Op,_Base46);var _super80=_createSuper(Op);return _createClass(Op,[{key:\"isNumber\",value:function(){var ref1;return this.isUnary()&&(\"+\"===(ref1=this.operator)||\"-\"===ref1)&&this.first instanceof Value&&this.first.isNumber()}},{key:\"isAwait\",value:function isAwait(){return\"await\"===this.operator}},{key:\"isYield\",value:function isYield(){var ref1;return\"yield\"===(ref1=this.operator)||\"yield*\"===ref1}},{key:\"isUnary\",value:function isUnary(){return!this.second}},{key:\"shouldCache\",value:function shouldCache(){return!this.isNumber()}},{key:\"isChainable\",value:function isChainable(){var ref1;return\"<\"===(ref1=this.operator)||\">\"===ref1||\">=\"===ref1||\"<=\"===ref1||\"===\"===ref1||\"!==\"===ref1}},{key:\"isChain\",value:function isChain(){return this.isChainable()&&this.first.isChainable()}},{key:\"invert\",value:function invert(){var allInvertable,curr,fst,op,ref1;if(this.isInOperator())return this.invertOperator=\"!\",this;if(this.isChain()){for(allInvertable=!0,curr=this;curr&&curr.operator;)allInvertable&&(allInvertable=curr.operator in INVERSIONS),curr=curr.first;if(!allInvertable)return new Parens(this).invert();for(curr=this;curr&&curr.operator;)curr.invert=!curr.invert,curr.operator=INVERSIONS[curr.operator],curr=curr.first;return this}return(op=INVERSIONS[this.operator])?(this.operator=op,this.first.unwrap()instanceof Op&&this.first.invert(),this):this.second?new Parens(this).invert():\"!\"===this.operator&&(fst=this.first.unwrap())instanceof Op&&(\"!\"===(ref1=fst.operator)||\"in\"===ref1||\"instanceof\"===ref1)?fst:new Op(\"!\",this)}},{key:\"unfoldSoak\",value:function unfoldSoak(o){var ref1;return(\"++\"===(ref1=this.operator)||\"--\"===ref1||\"delete\"===ref1)&&_unfoldSoak(o,this,\"first\")}},{key:\"generateDo\",value:function generateDo(exp){var call,func,j,len1,param,passedParams,ref,ref1;for(passedParams=[],func=exp instanceof Assign&&(ref=exp.value.unwrap())instanceof Code?ref:exp,ref1=func.params||[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],param.value?(passedParams.push(param.value),delete param.value):passedParams.push(param);return call=new Call(exp,passedParams),call[\"do\"]=!0,call}},{key:\"isInOperator\",value:function isInOperator(){return\"in\"===this.originalOperator}},{key:\"compileNode\",value:function compileNode(o){var answer,inNode,isChain,lhs,rhs;if(this.isInOperator())return inNode=new In(this.first,this.second),(this.invertOperator?inNode.invert():inNode).compileNode(o);if(this.invertOperator)return this.invertOperator=null,this.invert().compileNode(o);if(\"do\"===this.operator)return Op.prototype.generateDo(this.first).compileNode(o);if(isChain=this.isChain(),isChain||(this.first.front=this.front),this.checkDeleteOperand(o),this.isYield()||this.isAwait())return this.compileContinuation(o);if(this.isUnary())return this.compileUnary(o);if(isChain)return this.compileChain(o);switch(this.operator){case\"?\":return this.compileExistence(o,this.second.isDefaultValue);case\"//\":return this.compileFloorDivision(o);case\"%%\":return this.compileModulo(o);default:return lhs=this.first.compileToFragments(o,LEVEL_OP),rhs=this.second.compileToFragments(o,LEVEL_OP),answer=[].concat(lhs,this.makeCode(\" \".concat(this.operator,\" \")),rhs),o.level<=LEVEL_OP?answer:this.wrapInParentheses(answer);}}},{key:\"compileChain\",value:function compileChain(o){var _this$first$second$ca=this.first.second.cache(o),_this$first$second$ca2=_slicedToArray(_this$first$second$ca,2),fragments,fst,shared;return this.first.second=_this$first$second$ca2[0],shared=_this$first$second$ca2[1],fst=this.first.compileToFragments(o,LEVEL_OP),fragments=fst.concat(this.makeCode(\" \".concat(this.invert?\"&&\":\"||\",\" \")),shared.compileToFragments(o),this.makeCode(\" \".concat(this.operator,\" \")),this.second.compileToFragments(o,LEVEL_OP)),this.wrapInParentheses(fragments)}},{key:\"compileExistence\",value:function compileExistence(o,checkOnlyUndefined){var fst,ref;return this.first.shouldCache()?(ref=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),fst=new Parens(new Assign(ref,this.first))):(fst=this.first,ref=fst),new If(new Existence(fst,checkOnlyUndefined),ref,{type:\"if\"}).addElse(this.second).compileToFragments(o)}},{key:\"compileUnary\",value:function compileUnary(o){var op,parts,plusMinus;return(parts=[],op=this.operator,parts.push([this.makeCode(op)]),\"!\"===op&&this.first instanceof Existence)?(this.first.negated=!this.first.negated,this.first.compileToFragments(o)):o.level>=LEVEL_ACCESS?new Parens(this).compileToFragments(o):(plusMinus=\"+\"===op||\"-\"===op,(\"typeof\"===op||\"delete\"===op||plusMinus&&this.first instanceof Op&&this.first.operator===op)&&parts.push([this.makeCode(\" \")]),plusMinus&&this.first instanceof Op&&(this.first=new Parens(this.first)),parts.push(this.first.compileToFragments(o,LEVEL_OP)),this.flip&&parts.reverse(),this.joinFragmentArrays(parts,\"\"))}},{key:\"compileContinuation\",value:function compileContinuation(o){var op,parts,ref1;return parts=[],op=this.operator,this.isAwait()||this.checkContinuation(o),0<=indexOf.call(Object.keys(this.first),\"expression\")&&!(this.first instanceof Throw)?null!=this.first.expression&&parts.push(this.first.expression.compileToFragments(o,LEVEL_OP)):(o.level>=LEVEL_PAREN&&parts.push([this.makeCode(\"(\")]),parts.push([this.makeCode(op)]),\"\"!==(null==(ref1=this.first.base)?void 0:ref1.value)&&parts.push([this.makeCode(\" \")]),parts.push(this.first.compileToFragments(o,LEVEL_OP)),o.level>=LEVEL_PAREN&&parts.push([this.makeCode(\")\")])),this.joinFragmentArrays(parts,\"\")}},{key:\"checkContinuation\",value:function checkContinuation(o){var ref1;if(null==o.scope.parent&&this.error(\"\".concat(this.operator,\" can only occur inside functions\")),(null==(ref1=o.scope.method)?void 0:ref1.bound)&&o.scope.method.isGenerator)return this.error(\"yield cannot occur inside bound (fat arrow) functions\")}},{key:\"compileFloorDivision\",value:function compileFloorDivision(o){var div,floor,second;return floor=new Value(new IdentifierLiteral(\"Math\"),[new Access(new PropertyName(\"floor\"))]),second=this.second.shouldCache()?new Parens(this.second):this.second,div=new Op(\"/\",this.first,second),new Call(floor,[div]).compileToFragments(o)}},{key:\"compileModulo\",value:function compileModulo(o){var mod;return mod=new Value(new Literal(utility(\"modulo\",o))),new Call(mod,[this.first,this.second]).compileToFragments(o)}},{key:\"toString\",value:function toString(idt){return _get(_getPrototypeOf(Op.prototype),\"toString\",this).call(this,idt,this.constructor.name+\" \"+this.operator)}},{key:\"checkDeleteOperand\",value:function checkDeleteOperand(o){if(\"delete\"===this.operator&&o.scope.check(this.first.unwrapAll().value))return this.error(\"delete operand may not be argument or var\")}},{key:\"astNode\",value:function astNode(o){return this.isYield()&&this.checkContinuation(o),this.checkDeleteOperand(o),_get(_getPrototypeOf(Op.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){if(this.isAwait())return\"AwaitExpression\";if(this.isYield())return\"YieldExpression\";if(this.isChain())return\"ChainedComparison\";switch(this.operator){case\"||\":case\"&&\":case\"?\":return\"LogicalExpression\";case\"++\":case\"--\":return\"UpdateExpression\";default:return this.isUnary()?\"UnaryExpression\":\"BinaryExpression\";}}},{key:\"operatorAst\",value:function operatorAst(){return\"\".concat(this.invertOperator?\"\".concat(this.invertOperator,\" \"):\"\").concat(this.originalOperator)}},{key:\"chainAstProperties\",value:function chainAstProperties(o){var currentOp,operand,operands,operators;for(operators=[this.operatorAst()],operands=[this.second],currentOp=this.first;;)if(operators.unshift(currentOp.operatorAst()),operands.unshift(currentOp.second),currentOp=currentOp.first,!currentOp.isChainable()){operands.unshift(currentOp);break}return{operators:operators,operands:function(){var j,len1,results1;for(results1=[],j=0,len1=operands.length;j<len1;j++)operand=operands[j],results1.push(operand.ast(o,LEVEL_OP));return results1}()}}},{key:\"astProperties\",value:function astProperties(o){var argument,firstAst,operatorAst,ref1,secondAst;if(this.isChain())return this.chainAstProperties(o);switch(firstAst=this.first.ast(o,LEVEL_OP),secondAst=null==(ref1=this.second)?void 0:ref1.ast(o,LEVEL_OP),operatorAst=this.operatorAst(),!1){case!this.isUnary():return argument=this.isYield()&&\"\"===this.first.unwrap().value?null:firstAst,this.isAwait()?{argument:argument}:this.isYield()?{argument:argument,delegate:\"yield*\"===this.operator}:{argument:argument,operator:operatorAst,prefix:!this.flip};default:return{left:firstAst,right:secondAst,operator:operatorAst};}}}]),Op}(Base),CONVERSIONS,INVERSIONS;return CONVERSIONS={\"==\":\"===\",\"!=\":\"!==\",of:\"in\",yieldfrom:\"yield*\"},INVERSIONS={\"!==\":\"===\",\"===\":\"!==\"},Op.prototype.children=[\"first\",\"second\"],Op}.call(this),exports.In=In=function(){var In=function(_Base47){\"use strict\";function In(object1,array){var _this70;return _classCallCheck(this,In),_this70=_super81.call(this),_this70.object=object1,_this70.array=array,_this70}_inherits(In,_Base47);var _super81=_createSuper(In);return _createClass(In,[{key:\"compileNode\",value:function compileNode(o){var hasSplat,j,len1,obj,ref1;if(this.array instanceof Value&&this.array.isArray()&&this.array.base.objects.length){for(ref1=this.array.base.objects,j=0,len1=ref1.length;j<len1;j++)if(obj=ref1[j],!!(obj instanceof Splat)){hasSplat=!0;break}if(!hasSplat)return this.compileOrTest(o)}return this.compileLoopTest(o)}},{key:\"compileOrTest\",value:function compileOrTest(o){var _this$object$cache=this.object.cache(o,LEVEL_OP),_this$object$cache2=_slicedToArray(_this$object$cache,2),cmp,cnj,i,item,j,len1,ref,ref1,sub,tests;sub=_this$object$cache2[0],ref=_this$object$cache2[1];var _ref56=this.negated?[\" !== \",\" && \"]:[\" === \",\" || \"],_ref57=_slicedToArray(_ref56,2);for(cmp=_ref57[0],cnj=_ref57[1],tests=[],ref1=this.array.base.objects,(i=j=0,len1=ref1.length);j<len1;i=++j)item=ref1[i],i&&tests.push(this.makeCode(cnj)),tests=tests.concat(i?ref:sub,this.makeCode(cmp),item.compileToFragments(o,LEVEL_ACCESS));return o.level<LEVEL_OP?tests:this.wrapInParentheses(tests)}},{key:\"compileLoopTest\",value:function compileLoopTest(o){var _this$object$cache3=this.object.cache(o,LEVEL_LIST),_this$object$cache4=_slicedToArray(_this$object$cache3,2),fragments,ref,sub;return(sub=_this$object$cache4[0],ref=_this$object$cache4[1],fragments=[].concat(this.makeCode(utility(\"indexOf\",o)+\".call(\"),this.array.compileToFragments(o,LEVEL_LIST),this.makeCode(\", \"),ref,this.makeCode(\") \"+(this.negated?\"< 0\":\">= 0\"))),fragmentsToText(sub)===fragmentsToText(ref))?fragments:(fragments=sub.concat(this.makeCode(\", \"),fragments),o.level<LEVEL_LIST?fragments:this.wrapInParentheses(fragments))}},{key:\"toString\",value:function toString(idt){return _get(_getPrototypeOf(In.prototype),\"toString\",this).call(this,idt,this.constructor.name+(this.negated?\"!\":\"\"))}}]),In}(Base);return In.prototype.children=[\"object\",\"array\"],In.prototype.invert=NEGATE,In}.call(this),exports.Try=Try=function(){var Try=function(_Base48){\"use strict\";function Try(attempt,_catch,ensure,finallyTag){var _this71;return _classCallCheck(this,Try),_this71=_super82.call(this),_this71.attempt=attempt,_this71[\"catch\"]=_catch,_this71.ensure=ensure,_this71.finallyTag=finallyTag,_this71}_inherits(Try,_Base48);var _super82=_createSuper(Try);return _createClass(Try,[{key:\"jumps\",value:function jumps(o){var ref1;return this.attempt.jumps(o)||(null==(ref1=this[\"catch\"])?void 0:ref1.jumps(o))}},{key:\"makeReturn\",value:function makeReturn(results,mark){var ref1,ref2;return mark?(null!=(ref1=this.attempt)&&ref1.makeReturn(results,mark),void(null!=(ref2=this[\"catch\"])&&ref2.makeReturn(results,mark))):(this.attempt&&(this.attempt=this.attempt.makeReturn(results)),this[\"catch\"]&&(this[\"catch\"]=this[\"catch\"].makeReturn(results)),this)}},{key:\"compileNode\",value:function compileNode(o){var catchPart,ensurePart,generatedErrorVariableName,originalIndent,tryPart;return originalIndent=o.indent,o.indent+=TAB,tryPart=this.attempt.compileToFragments(o,LEVEL_TOP),catchPart=this[\"catch\"]?this[\"catch\"].compileToFragments(merge(o,{indent:originalIndent}),LEVEL_TOP):this.ensure||this[\"catch\"]?[]:(generatedErrorVariableName=o.scope.freeVariable(\"error\",{reserve:!1}),[this.makeCode(\" catch (\".concat(generatedErrorVariableName,\") {}\"))]),ensurePart=this.ensure?[].concat(this.makeCode(\" finally {\\n\"),this.ensure.compileToFragments(o,LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab,\"}\"))):[],[].concat(this.makeCode(\"\".concat(this.tab,\"try {\\n\")),tryPart,this.makeCode(\"\\n\".concat(this.tab,\"}\")),catchPart,ensurePart)}},{key:\"astType\",value:function astType(){return\"TryStatement\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{block:this.attempt.ast(o,LEVEL_TOP),handler:null==(ref1=null==(ref2=this[\"catch\"])?void 0:ref2.ast(o))?null:ref1,finalizer:null==this.ensure?null:Object.assign(this.ensure.ast(o,LEVEL_TOP),mergeAstLocationData(jisonLocationDataToAstLocationData(this.finallyTag.locationData),this.ensure.astLocationData()))}}}]),Try}(Base);return Try.prototype.children=[\"attempt\",\"catch\",\"ensure\"],Try.prototype.isStatement=YES,Try}.call(this),exports.Catch=Catch=function(){var Catch=function(_Base49){\"use strict\";function Catch(recovery,errorVariable){var _this72;_classCallCheck(this,Catch);var base1,ref1;return _this72=_super83.call(this),_this72.recovery=recovery,_this72.errorVariable=errorVariable,null!=(ref1=_this72.errorVariable)&&\"function\"==typeof(base1=ref1.unwrap()).propagateLhs&&base1.propagateLhs(!0),_this72}_inherits(Catch,_Base49);var _super83=_createSuper(Catch);return _createClass(Catch,[{key:\"jumps\",value:function jumps(o){return this.recovery.jumps(o)}},{key:\"makeReturn\",value:function makeReturn(results,mark){var ret;if(ret=this.recovery.makeReturn(results,mark),!mark)return this.recovery=ret,this}},{key:\"compileNode\",value:function compileNode(o){var generatedErrorVariableName,placeholder;return o.indent+=TAB,generatedErrorVariableName=o.scope.freeVariable(\"error\",{reserve:!1}),placeholder=new IdentifierLiteral(generatedErrorVariableName),this.checkUnassignable(),this.errorVariable&&this.recovery.unshift(new Assign(this.errorVariable,placeholder)),[].concat(this.makeCode(\" catch (\"),placeholder.compileToFragments(o),this.makeCode(\") {\\n\"),this.recovery.compileToFragments(o,LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab,\"}\")))}},{key:\"checkUnassignable\",value:function checkUnassignable(){var message;if(this.errorVariable&&(message=isUnassignable(this.errorVariable.unwrapAll().value),message))return this.errorVariable.error(message)}},{key:\"astNode\",value:function astNode(o){var ref1;return this.checkUnassignable(),null!=(ref1=this.errorVariable)&&ref1.eachName(function(name){var alreadyDeclared;return alreadyDeclared=o.scope.find(name.value),name.isDeclaration=!alreadyDeclared}),_get(_getPrototypeOf(Catch.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"CatchClause\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{param:null==(ref1=null==(ref2=this.errorVariable)?void 0:ref2.ast(o))?null:ref1,body:this.recovery.ast(o,LEVEL_TOP)}}}]),Catch}(Base);return Catch.prototype.children=[\"recovery\",\"errorVariable\"],Catch.prototype.isStatement=YES,Catch}.call(this),exports.Throw=Throw=function(){var Throw=function(_Base50){\"use strict\";function Throw(expression1){var _this73;return _classCallCheck(this,Throw),_this73=_super84.call(this),_this73.expression=expression1,_this73}_inherits(Throw,_Base50);var _super84=_createSuper(Throw);return _createClass(Throw,[{key:\"compileNode\",value:function compileNode(o){var fragments;return fragments=this.expression.compileToFragments(o,LEVEL_LIST),unshiftAfterComments(fragments,this.makeCode(\"throw \")),fragments.unshift(this.makeCode(this.tab)),fragments.push(this.makeCode(\";\")),fragments}},{key:\"astType\",value:function astType(){return\"ThrowStatement\"}},{key:\"astProperties\",value:function astProperties(o){return{argument:this.expression.ast(o,LEVEL_LIST)}}}]),Throw}(Base);return Throw.prototype.children=[\"expression\"],Throw.prototype.isStatement=YES,Throw.prototype.jumps=NO,Throw.prototype.makeReturn=THIS,Throw}.call(this),exports.Existence=Existence=function(){var Existence=function(_Base51){\"use strict\";function Existence(expression1){var onlyNotUndefined=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],_this74;_classCallCheck(this,Existence);var salvagedComments;return _this74=_super85.call(this),_this74.expression=expression1,_this74.comparisonTarget=onlyNotUndefined?\"undefined\":\"null\",salvagedComments=[],_this74.expression.traverseChildren(!0,function(child){var comment,j,len1,ref1;if(child.comments){for(ref1=child.comments,j=0,len1=ref1.length;j<len1;j++)comment=ref1[j],0>indexOf.call(salvagedComments,comment)&&salvagedComments.push(comment);return delete child.comments}}),attachCommentsToNode(salvagedComments,_assertThisInitialized(_this74)),moveComments(_this74.expression,_assertThisInitialized(_this74)),_this74}_inherits(Existence,_Base51);var _super85=_createSuper(Existence);return _createClass(Existence,[{key:\"compileNode\",value:function compileNode(o){var cmp,cnj,code;if(this.expression.front=this.front,code=this.expression.compile(o,LEVEL_OP),this.expression.unwrap()instanceof IdentifierLiteral&&!o.scope.check(code)){var _ref58=this.negated?[\"===\",\"||\"]:[\"!==\",\"&&\"],_ref59=_slicedToArray(_ref58,2);cmp=_ref59[0],cnj=_ref59[1],code=\"typeof \".concat(code,\" \").concat(cmp,\" \\\"undefined\\\"\")+(\"undefined\"===this.comparisonTarget?\"\":\" \".concat(cnj,\" \").concat(code,\" \").concat(cmp,\" \").concat(this.comparisonTarget))}else cmp=\"null\"===this.comparisonTarget?this.negated?\"==\":\"!=\":this.negated?\"===\":\"!==\",code=\"\".concat(code,\" \").concat(cmp,\" \").concat(this.comparisonTarget);return[this.makeCode(o.level<=LEVEL_COND?code:\"(\".concat(code,\")\"))]}},{key:\"astType\",value:function astType(){return\"UnaryExpression\"}},{key:\"astProperties\",value:function astProperties(o){return{argument:this.expression.ast(o),operator:\"?\",prefix:!1}}}]),Existence}(Base);return Existence.prototype.children=[\"expression\"],Existence.prototype.invert=NEGATE,Existence}.call(this),exports.Parens=Parens=function(){var Parens=function(_Base52){\"use strict\";function Parens(body1){var _this75;return _classCallCheck(this,Parens),_this75=_super86.call(this),_this75.body=body1,_this75}_inherits(Parens,_Base52);var _super86=_createSuper(Parens);return _createClass(Parens,[{key:\"unwrap\",value:function unwrap(){return this.body}},{key:\"shouldCache\",value:function shouldCache(){return this.body.shouldCache()}},{key:\"compileNode\",value:function compileNode(o){var bare,expr,fragments,ref1,shouldWrapComment;return(expr=this.body.unwrap(),shouldWrapComment=null==(ref1=expr.comments)?void 0:ref1.some(function(comment){return comment.here&&!comment.unshift&&!comment.newLine}),expr instanceof Value&&expr.isAtomic()&&!this.jsxAttribute&&!shouldWrapComment)?(expr.front=this.front,expr.compileToFragments(o)):(fragments=expr.compileToFragments(o,LEVEL_PAREN),bare=o.level<LEVEL_OP&&!shouldWrapComment&&(expr instanceof Op&&!expr.isInOperator()||expr.unwrap()instanceof Call||expr instanceof For&&expr.returns)&&(o.level<LEVEL_COND||3>=fragments.length),this.jsxAttribute?this.wrapInBraces(fragments):bare?fragments:this.wrapInParentheses(fragments))}},{key:\"astNode\",value:function astNode(o){return this.body.unwrap().ast(o,LEVEL_PAREN)}}]),Parens}(Base);return Parens.prototype.children=[\"body\"],Parens}.call(this),exports.StringWithInterpolations=StringWithInterpolations=function(){var StringWithInterpolations=function(_Base53){\"use strict\";function StringWithInterpolations(body1){var _ref60=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},quote=_ref60.quote,startQuote=_ref60.startQuote,jsxAttribute=_ref60.jsxAttribute,_this76;return _classCallCheck(this,StringWithInterpolations),_this76=_super87.call(this),_this76.body=body1,_this76.quote=quote,_this76.startQuote=startQuote,_this76.jsxAttribute=jsxAttribute,_this76}_inherits(StringWithInterpolations,_Base53);var _super87=_createSuper(StringWithInterpolations);return _createClass(StringWithInterpolations,[{key:\"unwrap\",value:function unwrap(){return this}},{key:\"shouldCache\",value:function shouldCache(){return this.body.shouldCache()}},{key:\"extractElements\",value:function extractElements(o){var _ref61=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},includeInterpolationWrappers=_ref61.includeInterpolationWrappers,isJsx=_ref61.isJsx,elements,expr,salvagedComments;return expr=this.body.unwrap(),elements=[],salvagedComments=[],expr.traverseChildren(!1,function(node){var comment,commentPlaceholder,empty,j,k,len1,len2,ref1,ref2,ref3,unwrapped;if(node instanceof StringLiteral){if(node.comments){var _salvagedComments;(_salvagedComments=salvagedComments).push.apply(_salvagedComments,_toConsumableArray(node.comments)),delete node.comments}return elements.push(node),!0}if(node instanceof Interpolation){if(0!==salvagedComments.length){for(j=0,len1=salvagedComments.length;j<len1;j++)comment=salvagedComments[j],comment.unshift=!0,comment.newLine=!0;attachCommentsToNode(salvagedComments,node)}if((unwrapped=null==(ref1=node.expression)?void 0:ref1.unwrapAll())instanceof PassthroughLiteral&&unwrapped.generated&&!(isJsx&&o.compiling)){if(o.compiling){if(commentPlaceholder=new StringLiteral(\"\").withLocationDataFrom(node),commentPlaceholder.comments=unwrapped.comments,node.comments){var _ref62;(_ref62=null==commentPlaceholder.comments?commentPlaceholder.comments=[]:commentPlaceholder.comments).push.apply(_ref62,_toConsumableArray(node.comments))}elements.push(new Value(commentPlaceholder))}else empty=new Interpolation().withLocationDataFrom(node),empty.comments=node.comments,elements.push(empty);}else if(node.expression||includeInterpolationWrappers){if(node.comments){var _ref63;(_ref63=null==(ref2=node.expression)?void 0:null==ref2.comments?ref2.comments=[]:ref2.comments).push.apply(_ref63,_toConsumableArray(node.comments))}elements.push(includeInterpolationWrappers?node:node.expression)}return!1}if(node.comments){if(0!==elements.length&&!(elements[elements.length-1]instanceof StringLiteral)){for(ref3=node.comments,k=0,len2=ref3.length;k<len2;k++)comment=ref3[k],comment.unshift=!1,comment.newLine=!0;attachCommentsToNode(node.comments,elements[elements.length-1])}else{var _salvagedComments2;(_salvagedComments2=salvagedComments).push.apply(_salvagedComments2,_toConsumableArray(node.comments))}delete node.comments}return!0}),elements}},{key:\"compileNode\",value:function compileNode(o){var code,element,elements,fragments,j,len1,ref1,unquotedElementValue,wrapped;if(null==this.comments&&(this.comments=null==(ref1=this.startQuote)?void 0:ref1.comments),this.jsxAttribute)return wrapped=new Parens(new StringWithInterpolations(this.body)),wrapped.jsxAttribute=!0,wrapped.compileNode(o);for(elements=this.extractElements(o,{isJsx:this.jsx}),fragments=[],this.jsx||fragments.push(this.makeCode(\"`\")),(j=0,len1=elements.length);j<len1;j++)if(element=elements[j],element instanceof StringLiteral)unquotedElementValue=this.jsx?element.unquotedValueForJSX:element.unquotedValueForTemplateLiteral,fragments.push(this.makeCode(unquotedElementValue));else{var _fragments12;this.jsx||fragments.push(this.makeCode(\"$\")),code=element.compileToFragments(o,LEVEL_PAREN),(!this.isNestedTag(element)||code.some(function(fragment){var ref2;return null==(ref2=fragment.comments)?void 0:ref2.some(function(comment){return!1===comment.here})}))&&(code=this.wrapInBraces(code),code[0].isStringWithInterpolations=!0,code[code.length-1].isStringWithInterpolations=!0),(_fragments12=fragments).push.apply(_fragments12,_toConsumableArray(code))}return this.jsx||fragments.push(this.makeCode(\"`\")),fragments}},{key:\"isNestedTag\",value:function isNestedTag(element){var call;return call=\"function\"==typeof element.unwrapAll?element.unwrapAll():void 0,this.jsx&&call instanceof JSXElement}},{key:\"astType\",value:function astType(){return\"TemplateLiteral\"}},{key:\"astProperties\",value:function astProperties(o){var element,elements,emptyInterpolation,expression,expressions,index,j,last,len1,node,quasis;elements=this.extractElements(o,{includeInterpolationWrappers:!0});var _slice1$call17=slice1.call(elements,-1),_slice1$call18=_slicedToArray(_slice1$call17,1);for(last=_slice1$call18[0],quasis=[],expressions=[],(index=j=0,len1=elements.length);j<len1;index=++j)if(element=elements[index],element instanceof StringLiteral)quasis.push(new TemplateElement(element.originalValue,{tail:element===last}).withLocationDataFrom(element).ast(o));else{var _element2=element;expression=_element2.expression,node=null==expression?(emptyInterpolation=new EmptyInterpolation,emptyInterpolation.locationData=emptyExpressionLocationData({interpolationNode:element,openingBrace:\"#{\",closingBrace:\"}\"}),emptyInterpolation):expression.unwrapAll(),expressions.push(astAsBlockIfNeeded(node,o))}return{expressions:expressions,quasis:quasis,quote:this.quote}}}],[{key:\"fromStringLiteral\",value:function fromStringLiteral(stringLiteral){var updatedString,updatedStringValue;return updatedString=stringLiteral.withoutQuotesInLocationData(),updatedStringValue=new Value(updatedString).withLocationDataFrom(updatedString),new StringWithInterpolations(Block.wrap([updatedStringValue]),{quote:stringLiteral.quote,jsxAttribute:stringLiteral.jsxAttribute}).withLocationDataFrom(stringLiteral)}}]),StringWithInterpolations}(Base);return StringWithInterpolations.prototype.children=[\"body\"],StringWithInterpolations}.call(this),exports.TemplateElement=TemplateElement=function(_Base54){\"use strict\";function TemplateElement(value1){var _ref64=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},tail1=_ref64.tail,_this77;return _classCallCheck(this,TemplateElement),_this77=_super88.call(this),_this77.value=value1,_this77.tail=tail1,_this77}_inherits(TemplateElement,_Base54);var _super88=_createSuper(TemplateElement);return _createClass(TemplateElement,[{key:\"astProperties\",value:function astProperties(){return{value:{raw:this.value},tail:!!this.tail}}}]),TemplateElement}(Base),exports.Interpolation=Interpolation=function(){var Interpolation=function(_Base55){\"use strict\";function Interpolation(expression1){var _this78;return _classCallCheck(this,Interpolation),_this78=_super89.call(this),_this78.expression=expression1,_this78}_inherits(Interpolation,_Base55);var _super89=_createSuper(Interpolation);return _createClass(Interpolation)}(Base);return Interpolation.prototype.children=[\"expression\"],Interpolation}.call(this),exports.EmptyInterpolation=EmptyInterpolation=function(_Base56){\"use strict\";function EmptyInterpolation(){return _classCallCheck(this,EmptyInterpolation),_super90.call(this)}_inherits(EmptyInterpolation,_Base56);var _super90=_createSuper(EmptyInterpolation);return _createClass(EmptyInterpolation)}(Base),exports.For=For=function(){var For=function(_While){\"use strict\";function For(body,source){var _this79;return _classCallCheck(this,For),_this79=_super91.call(this),_this79.addBody(body),_this79.addSource(source),_this79}_inherits(For,_While);var _super91=_createSuper(For);return _createClass(For,[{key:\"isAwait\",value:function isAwait(){var ref1;return null!=(ref1=this[\"await\"])&&ref1}},{key:\"addBody\",value:function addBody(body){var base1,expressions;return this.body=Block.wrap([body]),expressions=this.body.expressions,expressions.length&&null==(base1=this.body).locationData&&(base1.locationData=mergeLocationData(expressions[0].locationData,expressions[expressions.length-1].locationData)),this}},{key:\"addSource\",value:function addSource(source){var _this80=this,_source$source=source.source,attr,attribs,attribute,base1,j,k,len1,len2,ref1,ref2,ref3,ref4;for(this.source=void 0!==_source$source&&_source$source,attribs=[\"name\",\"index\",\"guard\",\"step\",\"own\",\"ownTag\",\"await\",\"awaitTag\",\"object\",\"from\"],(j=0,len1=attribs.length);j<len1;j++)attr=attribs[j],this[attr]=null==(ref1=source[attr])?this[attr]:ref1;if(!this.source)return this;if(this.from&&this.index&&this.index.error(\"cannot use index with for-from\"),this.own&&!this.object&&this.ownTag.error(\"cannot use own with for-\".concat(this.from?\"from\":\"in\")),this.object){var _ref65=[this.index,this.name];this.name=_ref65[0],this.index=_ref65[1]}for(((null==(ref2=this.index)?void 0:\"function\"==typeof ref2.isArray?ref2.isArray():void 0)||(null==(ref3=this.index)?void 0:\"function\"==typeof ref3.isObject?ref3.isObject():void 0))&&this.index.error(\"index cannot be a pattern matching expression\"),this[\"await\"]&&!this.from&&this.awaitTag.error(\"await must be used with for-from\"),this.range=this.source instanceof Value&&this.source.base instanceof Range&&!this.source.properties.length&&!this.from,this.pattern=this.name instanceof Value,this.pattern&&\"function\"==typeof(base1=this.name.unwrap()).propagateLhs&&base1.propagateLhs(!0),this.range&&this.index&&this.index.error(\"indexes do not apply to range loops\"),this.range&&this.pattern&&this.name.error(\"cannot pattern match over range loops\"),this.returns=!1,ref4=[\"source\",\"guard\",\"step\",\"name\",\"index\"],(k=0,len2=ref4.length);k<len2;k++)(attribute=ref4[k],!!this[attribute])&&(this[attribute].traverseChildren(!0,function(node){var comment,l,len3,ref5;if(node.comments){for(ref5=node.comments,l=0,len3=ref5.length;l<len3;l++)comment=ref5[l],comment.newLine=comment.unshift=!0;return moveComments(node,_this80[attribute])}}),moveComments(this[attribute],this));return this}},{key:\"compileNode\",value:function compileNode(o){var _slice1$call19,_slice1$call20,body,bodyFragments,compare,compareDown,declare,declareDown,defPart,down,forClose,forCode,forPartFragments,fragments,guardPart,idt1,increment,index,ivar,kvar,kvarAssign,last,lvar,name,namePart,ref,ref1,resultPart,returnResult,rvar,scope,source,step,stepNum,stepVar,svar,varPart;if(body=Block.wrap([this.body]),ref1=body.expressions,_slice1$call19=slice1.call(ref1,-1),_slice1$call20=_slicedToArray(_slice1$call19,1),last=_slice1$call20[0],_slice1$call19,(null==last?void 0:last.jumps())instanceof Return&&(this.returns=!1),source=this.range?this.source.base:this.source,scope=o.scope,this.pattern||(name=this.name&&this.name.compile(o,LEVEL_LIST)),index=this.index&&this.index.compile(o,LEVEL_LIST),name&&!this.pattern&&scope.find(name),index&&!(this.index instanceof Value)&&scope.find(index),this.returns&&(rvar=scope.freeVariable(\"results\")),this.from?this.pattern&&(ivar=scope.freeVariable(\"x\",{single:!0})):ivar=this.object&&index||scope.freeVariable(\"i\",{single:!0}),kvar=(this.range||this.from)&&name||index||ivar,kvarAssign=kvar===ivar?\"\":\"\".concat(kvar,\" = \"),this.step&&!this.range){var _this$cacheToCodeFrag9=this.cacheToCodeFragments(this.step.cache(o,LEVEL_LIST,shouldCacheOrIsAssignable)),_this$cacheToCodeFrag10=_slicedToArray(_this$cacheToCodeFrag9,2);step=_this$cacheToCodeFrag10[0],stepVar=_this$cacheToCodeFrag10[1],this.step.isNumber()&&(stepNum=parseNumber(stepVar))}return this.pattern&&(name=ivar),varPart=\"\",guardPart=\"\",defPart=\"\",idt1=this.tab+TAB,this.range?forPartFragments=source.compileToFragments(merge(o,{index:ivar,name:name,step:this.step,shouldCache:shouldCacheOrIsAssignable})):(svar=this.source.compile(o,LEVEL_LIST),(name||this.own)&&!this.from&&!(this.source.unwrap()instanceof IdentifierLiteral)&&(defPart+=\"\".concat(this.tab).concat(ref=scope.freeVariable(\"ref\"),\" = \").concat(svar,\";\\n\"),svar=ref),name&&!this.pattern&&!this.from&&(namePart=\"\".concat(name,\" = \").concat(svar,\"[\").concat(kvar,\"]\")),!this.object&&!this.from&&(step!==stepVar&&(defPart+=\"\".concat(this.tab).concat(step,\";\\n\")),down=0>stepNum,!(this.step&&null!=stepNum&&down)&&(lvar=scope.freeVariable(\"len\")),declare=\"\".concat(kvarAssign).concat(ivar,\" = 0, \").concat(lvar,\" = \").concat(svar,\".length\"),declareDown=\"\".concat(kvarAssign).concat(ivar,\" = \").concat(svar,\".length - 1\"),compare=\"\".concat(ivar,\" < \").concat(lvar),compareDown=\"\".concat(ivar,\" >= 0\"),this.step?(null==stepNum?(compare=\"\".concat(stepVar,\" > 0 ? \").concat(compare,\" : \").concat(compareDown),declare=\"(\".concat(stepVar,\" > 0 ? (\").concat(declare,\") : \").concat(declareDown,\")\")):down&&(compare=compareDown,declare=declareDown),increment=\"\".concat(ivar,\" += \").concat(stepVar)):increment=\"\".concat(kvar===ivar?\"\".concat(ivar,\"++\"):\"++\".concat(ivar)),forPartFragments=[this.makeCode(\"\".concat(declare,\"; \").concat(compare,\"; \").concat(kvarAssign).concat(increment))])),this.returns&&(resultPart=\"\".concat(this.tab).concat(rvar,\" = [];\\n\"),returnResult=\"\\n\".concat(this.tab,\"return \").concat(rvar,\";\"),body.makeReturn(rvar)),this.guard&&(1<body.expressions.length?body.expressions.unshift(new If(new Parens(this.guard).invert(),new StatementLiteral(\"continue\"))):this.guard&&(body=Block.wrap([new If(this.guard,body)]))),this.pattern&&body.expressions.unshift(new Assign(this.name,this.from?new IdentifierLiteral(kvar):new Literal(\"\".concat(svar,\"[\").concat(kvar,\"]\")))),namePart&&(varPart=\"\\n\".concat(idt1).concat(namePart,\";\")),this.object?(forPartFragments=[this.makeCode(\"\".concat(kvar,\" in \").concat(svar))],this.own&&(guardPart=\"\\n\".concat(idt1,\"if (!\").concat(utility(\"hasProp\",o),\".call(\").concat(svar,\", \").concat(kvar,\")) continue;\"))):this.from&&(this[\"await\"]?(forPartFragments=new Op(\"await\",new Parens(new Literal(\"\".concat(kvar,\" of \").concat(svar)))),forPartFragments=forPartFragments.compileToFragments(o,LEVEL_TOP)):forPartFragments=[this.makeCode(\"\".concat(kvar,\" of \").concat(svar))]),bodyFragments=body.compileToFragments(merge(o,{indent:idt1}),LEVEL_TOP),bodyFragments&&0<bodyFragments.length&&(bodyFragments=[].concat(this.makeCode(\"\\n\"),bodyFragments,this.makeCode(\"\\n\"))),fragments=[this.makeCode(defPart)],resultPart&&fragments.push(this.makeCode(resultPart)),forCode=this[\"await\"]?\"for \":\"for (\",forClose=this[\"await\"]?\"\":\")\",fragments=fragments.concat(this.makeCode(this.tab),this.makeCode(forCode),forPartFragments,this.makeCode(\"\".concat(forClose,\" {\").concat(guardPart).concat(varPart)),bodyFragments,this.makeCode(this.tab),this.makeCode(\"}\")),returnResult&&fragments.push(this.makeCode(returnResult)),fragments}},{key:\"astNode\",value:function astNode(o){var addToScope,ref1,ref2;return addToScope=function(name){var alreadyDeclared;return alreadyDeclared=o.scope.find(name.value),name.isDeclaration=!alreadyDeclared},null!=(ref1=this.name)&&ref1.eachName(addToScope,{checkAssignability:!1}),null!=(ref2=this.index)&&ref2.eachName(addToScope,{checkAssignability:!1}),_get(_getPrototypeOf(For.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"For\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4,ref5,ref6,ref7,ref8,ref9;return{source:null==(ref1=this.source)?void 0:ref1.ast(o),body:this.body.ast(o,LEVEL_TOP),guard:null==(ref2=null==(ref3=this.guard)?void 0:ref3.ast(o))?null:ref2,name:null==(ref4=null==(ref5=this.name)?void 0:ref5.ast(o))?null:ref4,index:null==(ref6=null==(ref7=this.index)?void 0:ref7.ast(o))?null:ref6,step:null==(ref8=null==(ref9=this.step)?void 0:ref9.ast(o))?null:ref8,postfix:!!this.postfix,own:!!this.own,await:!!this[\"await\"],style:function(){switch(!1){case!this.from:return\"from\";case!this.object:return\"of\";case!this.name:return\"in\";default:return\"range\";}}.call(this)}}}]),For}(While);return For.prototype.children=[\"body\",\"source\",\"guard\",\"step\"],For}.call(this),exports.Switch=Switch=function(){var Switch=function(_Base57){\"use strict\";function Switch(subject,cases1,otherwise){var _this81;return _classCallCheck(this,Switch),_this81=_super92.call(this),_this81.subject=subject,_this81.cases=cases1,_this81.otherwise=otherwise,_this81}_inherits(Switch,_Base57);var _super92=_createSuper(Switch);return _createClass(Switch,[{key:\"jumps\",value:function jumps(){var o=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{block:!0},block,j,jumpNode,len1,ref1,ref2;for(ref1=this.cases,j=0,len1=ref1.length;j<len1;j++)if(block=ref1[j].block,jumpNode=block.jumps(o))return jumpNode;return null==(ref2=this.otherwise)?void 0:ref2.jumps(o)}},{key:\"makeReturn\",value:function makeReturn(results,mark){var block,j,len1,ref1,ref2;for(ref1=this.cases,j=0,len1=ref1.length;j<len1;j++)block=ref1[j].block,block.makeReturn(results,mark);return results&&(this.otherwise||(this.otherwise=new Block([new Literal(\"void 0\")]))),null!=(ref2=this.otherwise)&&ref2.makeReturn(results,mark),this}},{key:\"compileNode\",value:function compileNode(o){var block,body,cond,conditions,expr,fragments,i,idt1,idt2,j,k,len1,len2,ref1,ref2;for(idt1=o.indent+TAB,idt2=o.indent=idt1+TAB,fragments=[].concat(this.makeCode(this.tab+\"switch (\"),this.subject?this.subject.compileToFragments(o,LEVEL_PAREN):this.makeCode(\"false\"),this.makeCode(\") {\\n\")),ref1=this.cases,(i=j=0,len1=ref1.length);j<len1;i=++j){var _ref1$i=ref1[i];for(conditions=_ref1$i.conditions,block=_ref1$i.block,ref2=flatten([conditions]),(k=0,len2=ref2.length);k<len2;k++)cond=ref2[k],this.subject||(cond=cond.invert()),fragments=fragments.concat(this.makeCode(idt1+\"case \"),cond.compileToFragments(o,LEVEL_PAREN),this.makeCode(\":\\n\"));if(0<(body=block.compileToFragments(o,LEVEL_TOP)).length&&(fragments=fragments.concat(body,this.makeCode(\"\\n\"))),i===this.cases.length-1&&!this.otherwise)break;(expr=this.lastNode(block.expressions),!(expr instanceof Return||expr instanceof Throw||expr instanceof Literal&&expr.jumps()&&\"debugger\"!==expr.value))&&fragments.push(cond.makeCode(idt2+\"break;\\n\"))}if(this.otherwise&&this.otherwise.expressions.length){var _fragments13;(_fragments13=fragments).push.apply(_fragments13,[this.makeCode(idt1+\"default:\\n\")].concat(_toConsumableArray(this.otherwise.compileToFragments(o,LEVEL_TOP)),[this.makeCode(\"\\n\")]))}return fragments.push(this.makeCode(this.tab+\"}\")),fragments}},{key:\"astType\",value:function astType(){return\"SwitchStatement\"}},{key:\"casesAst\",value:function casesAst(o){var caseIndex,caseLocationData,cases,consequent,j,k,kase,l,lastTestIndex,len1,len2,len3,ref1,ref2,results1,test,testConsequent,testIndex,tests;for(cases=[],ref1=this.cases,(caseIndex=j=0,len1=ref1.length);j<len1;caseIndex=++j){kase=ref1[caseIndex];var _kase=kase;for(tests=_kase.conditions,consequent=_kase.block,tests=flatten([tests]),lastTestIndex=tests.length-1,(testIndex=k=0,len2=tests.length);k<len2;testIndex=++k)test=tests[testIndex],testConsequent=testIndex===lastTestIndex?consequent:null,caseLocationData=test.locationData,(null==testConsequent?void 0:testConsequent.expressions.length)&&(caseLocationData=mergeLocationData(caseLocationData,testConsequent.expressions[testConsequent.expressions.length-1].locationData)),0===testIndex&&(caseLocationData=mergeLocationData(caseLocationData,kase.locationData,{justLeading:!0})),testIndex===lastTestIndex&&(caseLocationData=mergeLocationData(caseLocationData,kase.locationData,{justEnding:!0})),cases.push(new SwitchCase(test,testConsequent,{trailing:testIndex===lastTestIndex}).withLocationDataFrom({locationData:caseLocationData}))}for((null==(ref2=this.otherwise)?void 0:ref2.expressions.length)&&cases.push(new SwitchCase(null,this.otherwise).withLocationDataFrom(this.otherwise)),results1=[],(l=0,len3=cases.length);l<len3;l++)kase=cases[l],results1.push(kase.ast(o));return results1}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{discriminant:null==(ref1=null==(ref2=this.subject)?void 0:ref2.ast(o,LEVEL_PAREN))?null:ref1,cases:this.casesAst(o)}}}]),Switch}(Base);return Switch.prototype.children=[\"subject\",\"cases\",\"otherwise\"],Switch.prototype.isStatement=YES,Switch}.call(this),SwitchCase=function(){var SwitchCase=function(_Base58){\"use strict\";function SwitchCase(test1,block1){var _ref66=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},trailing=_ref66.trailing,_this82;return _classCallCheck(this,SwitchCase),_this82=_super93.call(this),_this82.test=test1,_this82.block=block1,_this82.trailing=trailing,_this82}_inherits(SwitchCase,_Base58);var _super93=_createSuper(SwitchCase);return _createClass(SwitchCase,[{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{test:null==(ref1=null==(ref2=this.test)?void 0:ref2.ast(o,LEVEL_PAREN))?null:ref1,consequent:null==(ref3=null==(ref4=this.block)?void 0:ref4.ast(o,LEVEL_TOP).body)?[]:ref3,trailing:!!this.trailing}}}]),SwitchCase}(Base);return SwitchCase.prototype.children=[\"test\",\"block\"],SwitchCase}.call(this),exports.SwitchWhen=SwitchWhen=function(){var SwitchWhen=function(_Base59){\"use strict\";function SwitchWhen(conditions1,block1){var _this83;return _classCallCheck(this,SwitchWhen),_this83=_super94.call(this),_this83.conditions=conditions1,_this83.block=block1,_this83}_inherits(SwitchWhen,_Base59);var _super94=_createSuper(SwitchWhen);return _createClass(SwitchWhen)}(Base);return SwitchWhen.prototype.children=[\"conditions\",\"block\"],SwitchWhen}.call(this),exports.If=If=function(){var If=function(_Base60){\"use strict\";function If(condition1,body1){var options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_this84;return _classCallCheck(this,If),_this84=_super95.call(this),_this84.condition=condition1,_this84.body=body1,_this84.elseBody=null,_this84.isChain=!1,_this84.soak=options.soak,_this84.postfix=options.postfix,_this84.type=options.type,_this84.condition.comments&&moveComments(_this84.condition,_assertThisInitialized(_this84)),_this84}_inherits(If,_Base60);var _super95=_createSuper(If);return _createClass(If,[{key:\"bodyNode\",value:function bodyNode(){var ref1;return null==(ref1=this.body)?void 0:ref1.unwrap()}},{key:\"elseBodyNode\",value:function elseBodyNode(){var ref1;return null==(ref1=this.elseBody)?void 0:ref1.unwrap()}},{key:\"addElse\",value:function addElse(elseBody){return this.isChain?(this.elseBodyNode().addElse(elseBody),this.locationData=mergeLocationData(this.locationData,this.elseBodyNode().locationData)):(this.isChain=elseBody instanceof If,this.elseBody=this.ensureBlock(elseBody),this.elseBody.updateLocationDataIfMissing(elseBody.locationData),null!=this.locationData&&null!=this.elseBody.locationData&&(this.locationData=mergeLocationData(this.locationData,this.elseBody.locationData))),this}},{key:\"isStatement\",value:function isStatement(o){var ref1;return(null==o?void 0:o.level)===LEVEL_TOP||this.bodyNode().isStatement(o)||(null==(ref1=this.elseBodyNode())?void 0:ref1.isStatement(o))}},{key:\"jumps\",value:function jumps(o){var ref1;return this.body.jumps(o)||(null==(ref1=this.elseBody)?void 0:ref1.jumps(o))}},{key:\"compileNode\",value:function compileNode(o){return this.isStatement(o)?this.compileStatement(o):this.compileExpression(o)}},{key:\"makeReturn\",value:function makeReturn(results,mark){var ref1,ref2;return mark?(null!=(ref1=this.body)&&ref1.makeReturn(results,mark),void(null!=(ref2=this.elseBody)&&ref2.makeReturn(results,mark))):(results&&(this.elseBody||(this.elseBody=new Block([new Literal(\"void 0\")]))),this.body&&(this.body=new Block([this.body.makeReturn(results)])),this.elseBody&&(this.elseBody=new Block([this.elseBody.makeReturn(results)])),this)}},{key:\"ensureBlock\",value:function ensureBlock(node){return node instanceof Block?node:new Block([node])}},{key:\"compileStatement\",value:function compileStatement(o){var answer,body,child,cond,exeq,ifPart,indent;return(child=del(o,\"chainChild\"),exeq=del(o,\"isExistentialEquals\"),exeq)?new If(this.processedCondition().invert(),this.elseBodyNode(),{type:\"if\"}).compileToFragments(o):(indent=o.indent+TAB,cond=this.processedCondition().compileToFragments(o,LEVEL_PAREN),body=this.ensureBlock(this.body).compileToFragments(merge(o,{indent:indent})),ifPart=[].concat(this.makeCode(\"if (\"),cond,this.makeCode(\") {\\n\"),body,this.makeCode(\"\\n\".concat(this.tab,\"}\"))),child||ifPart.unshift(this.makeCode(this.tab)),!this.elseBody)?ifPart:(answer=ifPart.concat(this.makeCode(\" else \")),this.isChain?(o.chainChild=!0,answer=answer.concat(this.elseBody.unwrap().compileToFragments(o,LEVEL_TOP))):answer=answer.concat(this.makeCode(\"{\\n\"),this.elseBody.compileToFragments(merge(o,{indent:indent}),LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab,\"}\"))),answer)}},{key:\"compileExpression\",value:function compileExpression(o){var alt,body,cond,fragments;return cond=this.processedCondition().compileToFragments(o,LEVEL_COND),body=this.bodyNode().compileToFragments(o,LEVEL_LIST),alt=this.elseBodyNode()?this.elseBodyNode().compileToFragments(o,LEVEL_LIST):[this.makeCode(\"void 0\")],fragments=cond.concat(this.makeCode(\" ? \"),body,this.makeCode(\" : \"),alt),o.level>=LEVEL_COND?this.wrapInParentheses(fragments):fragments}},{key:\"unfoldSoak\",value:function unfoldSoak(){return this.soak&&this}},{key:\"processedCondition\",value:function processedCondition(){return null==this.processedConditionCache?this.processedConditionCache=\"unless\"===this.type?this.condition.invert():this.condition:this.processedConditionCache}},{key:\"isStatementAst\",value:function isStatementAst(o){return o.level===LEVEL_TOP}},{key:\"astType\",value:function astType(o){return this.isStatementAst(o)?\"IfStatement\":\"ConditionalExpression\"}},{key:\"astProperties\",value:function astProperties(o){var isStatement,ref1,ref2,ref3,ref4;return isStatement=this.isStatementAst(o),{test:this.condition.ast(o,isStatement?LEVEL_PAREN:LEVEL_COND),consequent:isStatement?this.body.ast(o,LEVEL_TOP):this.bodyNode().ast(o,LEVEL_TOP),alternate:this.isChain?this.elseBody.unwrap().ast(o,isStatement?LEVEL_TOP:LEVEL_COND):isStatement||1!==(null==(ref1=this.elseBody)||null==(ref2=ref1.expressions)?void 0:ref2.length)?null==(ref3=null==(ref4=this.elseBody)?void 0:ref4.ast(o,LEVEL_TOP))?null:ref3:this.elseBody.expressions[0].ast(o,LEVEL_TOP),postfix:!!this.postfix,inverted:\"unless\"===this.type}}}]),If}(Base);return If.prototype.children=[\"condition\",\"body\",\"elseBody\"],If}.call(this),exports.Sequence=Sequence=function(){var Sequence=function(_Base61){\"use strict\";function Sequence(expressions1){var _this85;return _classCallCheck(this,Sequence),_this85=_super96.call(this),_this85.expressions=expressions1,_this85}_inherits(Sequence,_Base61);var _super96=_createSuper(Sequence);return _createClass(Sequence,[{key:\"astNode\",value:function astNode(o){return 1===this.expressions.length?this.expressions[0].ast(o):_get(_getPrototypeOf(Sequence.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"SequenceExpression\"}},{key:\"astProperties\",value:function astProperties(o){var expression;return{expressions:function(){var j,len1,ref1,results1;for(ref1=this.expressions,results1=[],(j=0,len1=ref1.length);j<len1;j++)expression=ref1[j],results1.push(expression.ast(o));return results1}.call(this)}}}]),Sequence}(Base);return Sequence.prototype.children=[\"expressions\"],Sequence}.call(this),UTILITIES={modulo:function modulo(){return\"function(a, b) { return (+a % (b = +b) + b) % b; }\"},boundMethodCheck:function boundMethodCheck(){return\"function(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new Error('Bound instance method accessed before binding'); } }\"},hasProp:function hasProp(){return\"{}.hasOwnProperty\"},indexOf:function(){return\"[].indexOf\"},slice:function slice(){return\"[].slice\"},splice:function(){return\"[].splice\"}},LEVEL_TOP=1,LEVEL_PAREN=2,LEVEL_LIST=3,LEVEL_COND=4,LEVEL_OP=5,LEVEL_ACCESS=6,TAB=\"  \",SIMPLENUM=/^[+-]?\\d+(?:_\\d+)*$/,SIMPLE_STRING_OMIT=/\\s*\\n\\s*/g,LEADING_BLANK_LINE=/^[^\\n\\S]*\\n/,TRAILING_BLANK_LINE=/\\n[^\\n\\S]*$/,STRING_OMIT=/((?:\\\\\\\\)+)|\\\\[^\\S\\n]*\\n\\s*/g,HEREGEX_OMIT=/((?:\\\\\\\\)+)|\\\\(\\s)|\\s+(?:#.*)?/g,utility=function(name,o){var ref,root;return root=o.scope.root,name in root.utilities?root.utilities[name]:(ref=root.freeVariable(name),root.assign(ref,UTILITIES[name](o)),root.utilities[name]=ref)},multident=function(code,tab){var includingFirstLine=!(2<arguments.length&&void 0!==arguments[2])||arguments[2],endsWithNewLine;return endsWithNewLine=\"\\n\"===code[code.length-1],code=(includingFirstLine?tab:\"\")+code.replace(/\\n/g,\"$&\".concat(tab)),code=code.replace(/\\s+$/,\"\"),endsWithNewLine&&(code+=\"\\n\"),code},indentInitial=function(fragments,node){var fragment,fragmentIndex,j,len1;for(fragmentIndex=j=0,len1=fragments.length;j<len1;fragmentIndex=++j)if(fragment=fragments[fragmentIndex],fragment.isHereComment)fragment.code=multident(fragment.code,node.tab);else{fragments.splice(fragmentIndex,0,node.makeCode(\"\".concat(node.tab)));break}return fragments},hasLineComments=function(node){var comment,j,len1,ref1;if(!node.comments)return!1;for(ref1=node.comments,j=0,len1=ref1.length;j<len1;j++)if(comment=ref1[j],!1===comment.here)return!0;return!1},moveComments=function(from,to){if(null!=from&&from.comments)return attachCommentsToNode(from.comments,to),delete from.comments},unshiftAfterComments=function(fragments,fragmentToInsert){var fragment,fragmentIndex,inserted,j,len1;for(inserted=!1,fragmentIndex=j=0,len1=fragments.length;j<len1;fragmentIndex=++j)if(fragment=fragments[fragmentIndex],!!!fragment.isComment){fragments.splice(fragmentIndex,0,fragmentToInsert),inserted=!0;break}return inserted||fragments.push(fragmentToInsert),fragments},isLiteralArguments=function(node){return node instanceof IdentifierLiteral&&\"arguments\"===node.value},isLiteralThis=function(node){return node instanceof ThisLiteral||node instanceof Code&&node.bound},shouldCacheOrIsAssignable=function(node){return node.shouldCache()||(\"function\"==typeof node.isAssignable?node.isAssignable():void 0)},_unfoldSoak=function(o,parent,name){var ifn;if(ifn=parent[name].unfoldSoak(o))return parent[name]=ifn.body,ifn.body=new Value(parent),ifn},makeDelimitedLiteral=function(body){var _ref67=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},delimiterOption=_ref67.delimiter,escapeNewlines=_ref67.escapeNewlines,_double2=_ref67.double,_ref67$includeDelimit=_ref67.includeDelimiters,_ref67$escapeDelimite=_ref67.escapeDelimiter,escapeDelimiter=void 0===_ref67$escapeDelimite||_ref67$escapeDelimite,convertTrailingNullEscapes=_ref67.convertTrailingNullEscapes,escapeTemplateLiteralCurlies,printedDelimiter,regex;return\"\"===body&&\"/\"===delimiterOption&&(body=\"(?:)\"),escapeTemplateLiteralCurlies=\"`\"===delimiterOption,regex=RegExp(\"(\\\\\\\\\\\\\\\\)|(\\\\\\\\0(?=\\\\d))\".concat(convertTrailingNullEscapes?/|(\\\\0)$/.source:\"\").concat(escapeDelimiter?RegExp(\"|\\\\\\\\?(\".concat(delimiterOption,\")\")).source:\"\").concat(escapeTemplateLiteralCurlies?/|\\\\?(\\$\\{)/.source:\"\",\"|\\\\\\\\?(?:\").concat(escapeNewlines?\"(\\n)|\":\"\",\"(\\\\r)|(\\\\u2028)|(\\\\u2029))|(\\\\\\\\.)\"),\"g\"),body=body.replace(regex,function(match,backslash,nul){for(var _len2=arguments.length,args=Array(3<_len2?_len2-3:0),_key2=3,cr,delimiter,lf,ls,other,ps,templateLiteralCurly,trailingNullEscape;_key2<_len2;_key2++)args[_key2-3]=arguments[_key2];switch(trailingNullEscape=convertTrailingNullEscapes?args.shift():void 0,delimiter=escapeDelimiter?args.shift():void 0,templateLiteralCurly=escapeTemplateLiteralCurlies?args.shift():void 0,lf=escapeNewlines?args.shift():void 0,cr=args[0],ls=args[1],ps=args[2],other=args[3],!1){case!backslash:return _double2?backslash+backslash:backslash;case!nul:return\"\\\\x00\";case!trailingNullEscape:return\"\\\\x00\";case!delimiter:return\"\\\\\".concat(delimiter);case!templateLiteralCurly:return\"\\\\${\";case!lf:return\"\\\\n\";case!cr:return\"\\\\r\";case!ls:return\"\\\\u2028\";case!ps:return\"\\\\u2029\";case!other:return _double2?\"\\\\\".concat(other):other;}}),printedDelimiter=void 0===_ref67$includeDelimit||_ref67$includeDelimit?delimiterOption:\"\",\"\".concat(printedDelimiter).concat(body).concat(printedDelimiter)},sniffDirectives=function(expressions){var _ref68=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},notFinalExpression=_ref68.notFinalExpression,expression,index,lastIndex,results1,unwrapped;for(index=0,lastIndex=expressions.length-1,results1=[];index<=lastIndex&&!(index===lastIndex&&notFinalExpression);){if(expression=expressions[index],(unwrapped=null==expression?void 0:\"function\"==typeof expression.unwrap?expression.unwrap():void 0)instanceof PassthroughLiteral&&unwrapped.generated){index++;continue}if(!(expression instanceof Value&&expression.isString()&&!expression.unwrap().shouldGenerateTemplateLiteral()))break;expressions[index]=new Directive(expression).withLocationDataFrom(expression),results1.push(index++)}return results1},astAsBlockIfNeeded=function(node,o){var unwrapped;return unwrapped=node.unwrap(),unwrapped instanceof Block&&1<unwrapped.expressions.length?(unwrapped.makeReturn(null,!0),unwrapped.ast(o,LEVEL_TOP)):node.ast(o,LEVEL_PAREN)},lesser=function(a,b){return a<b?a:b},greater=function(a,b){return a>b?a:b},isAstLocGreater=function(a,b){return!!(a.line>b.line)||a.line===b.line&&a.column>b.column},isLocationDataStartGreater=function(a,b){return!!(a.first_line>b.first_line)||a.first_line===b.first_line&&a.first_column>b.first_column},isLocationDataEndGreater=function(a,b){return!!(a.last_line>b.last_line)||a.last_line===b.last_line&&a.last_column>b.last_column},exports.mergeLocationData=mergeLocationData=function(locationDataA,locationDataB){var _ref69=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},justLeading=_ref69.justLeading,justEnding=_ref69.justEnding;return Object.assign(justEnding?{first_line:locationDataA.first_line,first_column:locationDataA.first_column}:isLocationDataStartGreater(locationDataA,locationDataB)?{first_line:locationDataB.first_line,first_column:locationDataB.first_column}:{first_line:locationDataA.first_line,first_column:locationDataA.first_column},justLeading?{last_line:locationDataA.last_line,last_column:locationDataA.last_column,last_line_exclusive:locationDataA.last_line_exclusive,last_column_exclusive:locationDataA.last_column_exclusive}:isLocationDataEndGreater(locationDataA,locationDataB)?{last_line:locationDataA.last_line,last_column:locationDataA.last_column,last_line_exclusive:locationDataA.last_line_exclusive,last_column_exclusive:locationDataA.last_column_exclusive}:{last_line:locationDataB.last_line,last_column:locationDataB.last_column,last_line_exclusive:locationDataB.last_line_exclusive,last_column_exclusive:locationDataB.last_column_exclusive},{range:[justEnding?locationDataA.range[0]:lesser(locationDataA.range[0],locationDataB.range[0]),justLeading?locationDataA.range[1]:greater(locationDataA.range[1],locationDataB.range[1])]})},exports.mergeAstLocationData=mergeAstLocationData=function(nodeA,nodeB){var _ref70=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},justLeading=_ref70.justLeading,justEnding=_ref70.justEnding;return{loc:{start:justEnding?nodeA.loc.start:isAstLocGreater(nodeA.loc.start,nodeB.loc.start)?nodeB.loc.start:nodeA.loc.start,end:justLeading?nodeA.loc.end:isAstLocGreater(nodeA.loc.end,nodeB.loc.end)?nodeA.loc.end:nodeB.loc.end},range:[justEnding?nodeA.range[0]:lesser(nodeA.range[0],nodeB.range[0]),justLeading?nodeA.range[1]:greater(nodeA.range[1],nodeB.range[1])],start:justEnding?nodeA.start:lesser(nodeA.start,nodeB.start),end:justLeading?nodeA.end:greater(nodeA.end,nodeB.end)}},exports.jisonLocationDataToAstLocationData=jisonLocationDataToAstLocationData=function(_ref71){var first_line=_ref71.first_line,first_column=_ref71.first_column,last_line_exclusive=_ref71.last_line_exclusive,last_column_exclusive=_ref71.last_column_exclusive,range=_ref71.range;return{loc:{start:{line:first_line+1,column:first_column},end:{line:last_line_exclusive+1,column:last_column_exclusive}},range:[range[0],range[1]],start:range[0],end:range[1]}},zeroWidthLocationDataFromEndLocation=function(_ref72){var _ref72$range=_slicedToArray(_ref72.range,2),endRange=_ref72$range[1],last_line_exclusive=_ref72.last_line_exclusive,last_column_exclusive=_ref72.last_column_exclusive;return{first_line:last_line_exclusive,first_column:last_column_exclusive,last_line:last_line_exclusive,last_column:last_column_exclusive,last_line_exclusive:last_line_exclusive,last_column_exclusive:last_column_exclusive,range:[endRange,endRange]}},extractSameLineLocationDataFirst=function(numChars){return function(_ref73){var _ref73$range=_slicedToArray(_ref73.range,1),startRange=_ref73$range[0],first_line=_ref73.first_line,first_column=_ref73.first_column;return{first_line:first_line,first_column:first_column,last_line:first_line,last_column:first_column+numChars-1,last_line_exclusive:first_line,last_column_exclusive:first_column+numChars,range:[startRange,startRange+numChars]}}},extractSameLineLocationDataLast=function(numChars){return function(_ref74){var _ref74$range=_slicedToArray(_ref74.range,2),endRange=_ref74$range[1],last_line=_ref74.last_line,last_column=_ref74.last_column,last_line_exclusive=_ref74.last_line_exclusive,last_column_exclusive=_ref74.last_column_exclusive;return{first_line:last_line,first_column:last_column-(numChars-1),last_line:last_line,last_column:last_column,last_line_exclusive:last_line_exclusive,last_column_exclusive:last_column_exclusive,range:[endRange-numChars,endRange]}}},emptyExpressionLocationData=function(_ref75){var element=_ref75.interpolationNode,openingBrace=_ref75.openingBrace,closingBrace=_ref75.closingBrace;return{first_line:element.locationData.first_line,first_column:element.locationData.first_column+openingBrace.length,last_line:element.locationData.last_line,last_column:element.locationData.last_column-closingBrace.length,last_line_exclusive:element.locationData.last_line,last_column_exclusive:element.locationData.last_column,range:[element.locationData.range[0]+openingBrace.length,element.locationData.range[1]-closingBrace.length]}}}.call(this),{exports:exports}.exports}(),require[\"./sourcemap\"]=function(){var module={exports:{}};return function(){var LineMap,SourceMap;LineMap=function(){\"use strict\";function LineMap(line1){_classCallCheck(this,LineMap),this.line=line1,this.columns=[]}return _createClass(LineMap,[{key:\"add\",value:function add(column,_ref76){var _ref77=_slicedToArray(_ref76,2),sourceLine=_ref77[0],sourceColumn=_ref77[1],options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};return this.columns[column]&&options.noReplace?void 0:this.columns[column]={line:this.line,column:column,sourceLine:sourceLine,sourceColumn:sourceColumn}}},{key:\"sourceLocation\",value:function sourceLocation(column){for(var mapping;!((mapping=this.columns[column])||0>=column);)column--;return mapping&&[mapping.sourceLine,mapping.sourceColumn]}}]),LineMap}(),SourceMap=function(){var SourceMap=function(){\"use strict\";function SourceMap(){_classCallCheck(this,SourceMap),this.lines=[]}return _createClass(SourceMap,[{key:\"add\",value:function add(sourceLocation,generatedLocation){var options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_generatedLocation=_slicedToArray(generatedLocation,2),base,column,line,lineMap;return line=_generatedLocation[0],column=_generatedLocation[1],lineMap=(base=this.lines)[line]||(base[line]=new LineMap(line)),lineMap.add(column,sourceLocation,options)}},{key:\"sourceLocation\",value:function sourceLocation(_ref78){for(var _ref79=_slicedToArray(_ref78,2),line=_ref79[0],column=_ref79[1],lineMap;!((lineMap=this.lines[line])||0>=line);)line--;return lineMap&&lineMap.sourceLocation(column)}},{key:\"generate\",value:function generate(){var options=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},code=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null,buffer,i,j,lastColumn,lastSourceColumn,lastSourceLine,len,len1,lineMap,lineNumber,mapping,needComma,ref,ref1,sources,v3,writingline;for(writingline=0,lastColumn=0,lastSourceLine=0,lastSourceColumn=0,needComma=!1,buffer=\"\",ref=this.lines,(lineNumber=i=0,len=ref.length);i<len;lineNumber=++i)if(lineMap=ref[lineNumber],lineMap)for(ref1=lineMap.columns,j=0,len1=ref1.length;j<len1;j++)if(mapping=ref1[j],!!mapping){for(;writingline<mapping.line;)lastColumn=0,needComma=!1,buffer+=\";\",writingline++;needComma&&(buffer+=\",\",needComma=!1),buffer+=this.encodeVlq(mapping.column-lastColumn),lastColumn=mapping.column,buffer+=this.encodeVlq(0),buffer+=this.encodeVlq(mapping.sourceLine-lastSourceLine),lastSourceLine=mapping.sourceLine,buffer+=this.encodeVlq(mapping.sourceColumn-lastSourceColumn),lastSourceColumn=mapping.sourceColumn,needComma=!0}return sources=options.sourceFiles?options.sourceFiles:options.filename?[options.filename]:[\"<anonymous>\"],v3={version:3,file:options.generatedFile||\"\",sourceRoot:options.sourceRoot||\"\",sources:sources,names:[],mappings:buffer},(options.sourceMap||options.inlineMap)&&(v3.sourcesContent=[code]),v3}},{key:\"encodeVlq\",value:function encodeVlq(value){var answer,nextChunk,signBit,valueToEncode;for(answer=\"\",signBit=0>value?1:0,valueToEncode=(_Mathabs(value)<<1)+signBit;valueToEncode||!answer;)nextChunk=valueToEncode&VLQ_VALUE_MASK,valueToEncode>>=VLQ_SHIFT,valueToEncode&&(nextChunk|=VLQ_CONTINUATION_BIT),answer+=this.encodeBase64(nextChunk);return answer}},{key:\"encodeBase64\",value:function encodeBase64(value){return BASE64_CHARS[value]||function(){throw new Error(\"Cannot Base64 encode value: \".concat(value))}()}}],[{key:\"registerCompiled\",value:function registerCompiled(filename,source,sourcemap){if(null!=sourcemap)return SourceMap.sourceMaps[filename]=sourcemap}},{key:\"getSourceMap\",value:function getSourceMap(filename){return SourceMap.sourceMaps[filename]}}]),SourceMap}(),BASE64_CHARS,VLQ_CONTINUATION_BIT,VLQ_SHIFT,VLQ_VALUE_MASK;return SourceMap.sourceMaps=Object.create(null),VLQ_SHIFT=5,VLQ_CONTINUATION_BIT=1<<VLQ_SHIFT,VLQ_VALUE_MASK=VLQ_CONTINUATION_BIT-1,BASE64_CHARS=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",SourceMap}.call(this),module.exports=SourceMap}.call(this),module.exports}(),require[\"./coffeescript\"]=function(){var exports={};return function(){var _require7=require(\"./lexer\"),FILE_EXTENSIONS,Lexer,SourceMap,base64encode,checkShebangLine,compile,getSourceMap,helpers,lexer,packageJson,parser,registerCompiled,withPrettyErrors;Lexer=_require7.Lexer;var _require8=require(\"./parser\");parser=_require8.parser,helpers=require(\"./helpers\"),SourceMap=require(\"./sourcemap\"),packageJson=require(\"../../package.json\"),exports.VERSION=packageJson.version,exports.FILE_EXTENSIONS=FILE_EXTENSIONS=[\".coffee\",\".litcoffee\",\".coffee.md\"],exports.helpers=helpers;var _SourceMap=SourceMap;getSourceMap=_SourceMap.getSourceMap,registerCompiled=_SourceMap.registerCompiled,exports.registerCompiled=registerCompiled,base64encode=function(src){switch(!1){case\"function\"!=typeof Buffer:return Buffer.from(src).toString(\"base64\");case\"function\"!=typeof btoa:return btoa(encodeURIComponent(src).replace(/%([0-9A-F]{2})/g,function(match,p1){return _StringfromCharCode(\"0x\"+p1)}));default:throw new Error(\"Unable to base64 encode inline sourcemap.\");}},withPrettyErrors=function(fn){return function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},err;try{return fn.call(this,code,options)}catch(error){if(err=error,\"string\"!=typeof code)throw err;throw helpers.updateSyntaxError(err,code,options.filename)}}},exports.compile=compile=withPrettyErrors(function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},ast,currentColumn,currentLine,encoded,filename,fragment,fragments,generateSourceMap,header,i,j,js,len,len1,map,newLines,nodes,range,ref,sourceCodeLastLine,sourceCodeNumberOfLines,sourceMapDataURI,sourceURL,token,tokens,transpiler,transpilerOptions,transpilerOutput,v3SourceMap;if(options=Object.assign({},options),generateSourceMap=options.sourceMap||options.inlineMap||null==options.filename,filename=options.filename||helpers.anonymousFileName(),checkShebangLine(filename,code),generateSourceMap&&(map=new SourceMap),tokens=lexer.tokenize(code,options),options.referencedVars=function(){var i,len,results;for(results=[],i=0,len=tokens.length;i<len;i++)token=tokens[i],\"IDENTIFIER\"===token[0]&&results.push(token[1]);return results}(),null==options.bare||!0!==options.bare)for(i=0,len=tokens.length;i<len;i++)if(token=tokens[i],\"IMPORT\"===(ref=token[0])||\"EXPORT\"===ref){options.bare=!0;break}if(nodes=parser.parse(tokens),options.ast)return nodes.allCommentTokens=helpers.extractAllCommentTokens(tokens),sourceCodeNumberOfLines=(code.match(/\\r?\\n/g)||\"\").length+1,sourceCodeLastLine=/.*$/.exec(code)[0],ast=nodes.ast(options),range=[0,code.length],ast.start=ast.program.start=range[0],ast.end=ast.program.end=range[1],ast.range=ast.program.range=range,ast.loc.start=ast.program.loc.start={line:1,column:0},ast.loc.end.line=ast.program.loc.end.line=sourceCodeNumberOfLines,ast.loc.end.column=ast.program.loc.end.column=sourceCodeLastLine.length,ast.tokens=tokens,ast;for(fragments=nodes.compileToFragments(options),currentLine=0,options.header&&(currentLine+=1),options.shiftLine&&(currentLine+=1),currentColumn=0,js=\"\",(j=0,len1=fragments.length);j<len1;j++)fragment=fragments[j],generateSourceMap&&(fragment.locationData&&!/^[;\\s]*$/.test(fragment.code)&&map.add([fragment.locationData.first_line,fragment.locationData.first_column],[currentLine,currentColumn],{noReplace:!0}),newLines=helpers.count(fragment.code,\"\\n\"),currentLine+=newLines,newLines?currentColumn=fragment.code.length-(fragment.code.lastIndexOf(\"\\n\")+1):currentColumn+=fragment.code.length),js+=fragment.code;if(options.header&&(header=\"Generated by CoffeeScript \".concat(this.VERSION),js=\"// \".concat(header,\"\\n\").concat(js)),generateSourceMap&&(v3SourceMap=map.generate(options,code)),options.transpile){if(\"object\"!==_typeof(options.transpile))throw new Error(\"The transpile option must be given an object with options to pass to Babel\");transpiler=options.transpile.transpile,delete options.transpile.transpile,transpilerOptions=Object.assign({},options.transpile),v3SourceMap&&null==transpilerOptions.inputSourceMap&&(transpilerOptions.inputSourceMap=v3SourceMap),transpilerOutput=transpiler(js,transpilerOptions),js=transpilerOutput.code,v3SourceMap&&transpilerOutput.map&&(v3SourceMap=transpilerOutput.map)}return options.inlineMap&&(encoded=base64encode(JSON.stringify(v3SourceMap)),sourceMapDataURI=\"//# sourceMappingURL=data:application/json;base64,\".concat(encoded),sourceURL=\"//# sourceURL=\".concat(filename),js=\"\".concat(js,\"\\n\").concat(sourceMapDataURI,\"\\n\").concat(sourceURL)),registerCompiled(filename,code,map),options.sourceMap?{js:js,sourceMap:map,v3SourceMap:JSON.stringify(v3SourceMap,null,2)}:js}),exports.tokens=withPrettyErrors(function(code,options){return lexer.tokenize(code,options)}),exports.nodes=withPrettyErrors(function(source,options){return\"string\"==typeof source&&(source=lexer.tokenize(source,options)),parser.parse(source)}),exports.run=exports.eval=exports.register=function(){throw new Error(\"require index.coffee, not this file\")},lexer=new Lexer,parser.lexer={yylloc:{range:[]},options:{ranges:!0},lex:function lex(){var tag,token;if(token=parser.tokens[this.pos++],token){var _token6=token,_token7=_slicedToArray(_token6,3);tag=_token7[0],this.yytext=_token7[1],this.yylloc=_token7[2],parser.errorToken=token.origin||token,this.yylineno=this.yylloc.first_line}else tag=\"\";return tag},setInput:function setInput(tokens){return parser.tokens=tokens,this.pos=0},upcomingInput:function upcomingInput(){return\"\"}},parser.yy=require(\"./nodes\"),parser.yy.parseError=function(message,_ref80){var token=_ref80.token,_parser=parser,errorLoc,errorTag,errorText,errorToken,tokens;errorToken=_parser.errorToken,tokens=_parser.tokens;var _errorToken=errorToken,_errorToken2=_slicedToArray(_errorToken,3);return errorTag=_errorToken2[0],errorText=_errorToken2[1],errorLoc=_errorToken2[2],errorText=function(){switch(!1){case errorToken!==tokens[tokens.length-1]:return\"end of input\";case\"INDENT\"!==errorTag&&\"OUTDENT\"!==errorTag:return\"indentation\";case\"IDENTIFIER\"!==errorTag&&\"NUMBER\"!==errorTag&&\"INFINITY\"!==errorTag&&\"STRING\"!==errorTag&&\"STRING_START\"!==errorTag&&\"REGEX\"!==errorTag&&\"REGEX_START\"!==errorTag:return errorTag.replace(/_START$/,\"\").toLowerCase();default:return helpers.nameWhitespaceCharacter(errorText);}}(),helpers.throwSyntaxError(\"unexpected \".concat(errorText),errorLoc)},exports.patchStackTrace=function(){var formatSourcePosition,getSourceMapping;return formatSourcePosition=function(frame,getSourceMapping){var as,column,fileLocation,filename,functionName,isConstructor,isMethodCall,line,methodName,source,tp,typeName;return filename=void 0,fileLocation=\"\",frame.isNative()?fileLocation=\"native\":(frame.isEval()?(filename=frame.getScriptNameOrSourceURL(),!filename&&(fileLocation=\"\".concat(frame.getEvalOrigin(),\", \"))):filename=frame.getFileName(),filename||(filename=\"<anonymous>\"),line=frame.getLineNumber(),column=frame.getColumnNumber(),source=getSourceMapping(filename,line,column),fileLocation=source?\"\".concat(filename,\":\").concat(source[0],\":\").concat(source[1]):\"\".concat(filename,\":\").concat(line,\":\").concat(column)),functionName=frame.getFunctionName(),isConstructor=frame.isConstructor(),isMethodCall=!(frame.isToplevel()||isConstructor),isMethodCall?(methodName=frame.getMethodName(),typeName=frame.getTypeName(),functionName?(tp=as=\"\",typeName&&functionName.indexOf(typeName)&&(tp=\"\".concat(typeName,\".\")),methodName&&functionName.indexOf(\".\".concat(methodName))!==functionName.length-methodName.length-1&&(as=\" [as \".concat(methodName,\"]\")),\"\".concat(tp).concat(functionName).concat(as,\" (\").concat(fileLocation,\")\")):\"\".concat(typeName,\".\").concat(methodName||\"<anonymous>\",\" (\").concat(fileLocation,\")\")):isConstructor?\"new \".concat(functionName||\"<anonymous>\",\" (\").concat(fileLocation,\")\"):functionName?\"\".concat(functionName,\" (\").concat(fileLocation,\")\"):fileLocation},getSourceMapping=function(filename,line,column){var answer,sourceMap;return sourceMap=getSourceMap(filename,line,column),null!=sourceMap&&(answer=sourceMap.sourceLocation([line-1,column-1])),null==answer?null:[answer[0]+1,answer[1]+1]},Error.prepareStackTrace=function(err,stack){var frame,frames;return frames=function(){var i,len,results;for(results=[],i=0,len=stack.length;i<len&&(frame=stack[i],frame.getFunction()!==exports.run);i++)results.push(\"    at \".concat(formatSourcePosition(frame,getSourceMapping)));return results}(),\"\".concat(err.toString(),\"\\n\").concat(frames.join(\"\\n\"),\"\\n\")}},checkShebangLine=function(file,input){var args,firstLine,ref,rest;if(firstLine=input.split(/$/m,1)[0],rest=null==firstLine?void 0:firstLine.match(/^#!\\s*([^\\s]+\\s*)(.*)/),args=null==rest||null==(ref=rest[2])?void 0:ref.split(/\\s/).filter(function(s){return\"\"!==s}),1<(null==args?void 0:args.length))return console.error(\"The script to be run begins with a shebang line with more than one\\nargument. This script will fail on platforms such as Linux which only\\nallow a single argument.\"),console.error(\"The shebang line was: '\".concat(firstLine,\"' in file '\").concat(file,\"'\")),console.error(\"The arguments were: \".concat(JSON.stringify(args)))}}.call(this),{exports:exports}.exports}(),require[\"./browser\"]=function(){var module={exports:{}};return function(){var indexOf=[].indexOf,CoffeeScript,compile;CoffeeScript=require(\"./coffeescript\");var _CoffeeScript=CoffeeScript;compile=_CoffeeScript.compile,CoffeeScript.eval=function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},globalRoot;return null==options.bare&&(options.bare=!0),globalRoot=\"undefined\"!=typeof window&&null!==window?window:global,globalRoot.eval(compile(code,options))},CoffeeScript.run=function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};return options.bare=!0,options.shiftLine=!0,Function(compile(code,options))()},module.exports=CoffeeScript,\"undefined\"==typeof window||null===window||(\"undefined\"!=typeof btoa&&null!==btoa&&\"undefined\"!=typeof JSON&&null!==JSON&&(compile=function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};return options.inlineMap=!0,CoffeeScript.compile(code,options)}),CoffeeScript.load=function(url,callback){var options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},hold=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3],xhr;return options.sourceFiles=[url],xhr=window.ActiveXObject?new window.ActiveXObject(\"Microsoft.XMLHTTP\"):new window.XMLHttpRequest,xhr.open(\"GET\",url,!0),\"overrideMimeType\"in xhr&&xhr.overrideMimeType(\"text/plain\"),xhr.onreadystatechange=function(){var param,ref;if(4===xhr.readyState){if(0!==(ref=xhr.status)&&200!==ref)throw new Error(\"Could not load \".concat(url));else if(param=[xhr.responseText,options],!hold){var _CoffeeScript2;(_CoffeeScript2=CoffeeScript).run.apply(_CoffeeScript2,_toConsumableArray(param))}if(callback)return callback(param)}},xhr.send(null)},CoffeeScript.runScripts=function(){var coffees,coffeetypes,_execute,i,index,j,len,s,script,scripts;for(scripts=window.document.getElementsByTagName(\"script\"),coffeetypes=[\"text/coffeescript\",\"text/literate-coffeescript\"],coffees=function(){var j,len,ref,results;for(results=[],j=0,len=scripts.length;j<len;j++)s=scripts[j],(ref=s.type,0<=indexOf.call(coffeetypes,ref))&&results.push(s);return results}(),index=0,_execute=function execute(){var param;if(param=coffees[index],param instanceof Array){var _CoffeeScript3;return(_CoffeeScript3=CoffeeScript).run.apply(_CoffeeScript3,_toConsumableArray(param)),index++,_execute()}},(i=j=0,len=coffees.length);j<len;i=++j)script=coffees[i],function(script,i){var options,source;return options={literate:script.type===coffeetypes[1]},source=script.src||script.getAttribute(\"data-src\"),source?(options.filename=source,CoffeeScript.load(source,function(param){return coffees[i]=param,_execute()},options,!0)):(options.filename=script.id&&\"\"!==script.id?script.id:\"coffeescript\".concat(0===i?\"\":i),options.sourceFiles=[\"embedded\"],coffees[i]=[script.innerHTML,options])}(script,i);return _execute()},this===window&&(window.addEventListener?window.addEventListener(\"DOMContentLoaded\",CoffeeScript.runScripts,!1):window.attachEvent(\"onload\",CoffeeScript.runScripts)))}.call(this),module.exports}(),require[\"./browser\"]}();\"function\"==typeof define&&define.amd?define(function(){return CoffeeScript}):root.CoffeeScript=CoffeeScript})(this);"
  },
  {
    "path": "lib/coffeescript-browser-compiler-modern/coffeescript.js",
    "content": "/**\n * CoffeeScript Compiler v2.7.0\n * https://coffeescript.org\n *\n * Copyright 2011-2023, Jeremy Ashkenas\n * Released under the MIT License\n */\nfunction _get(){return _get=\"undefined\"!=typeof Reflect&&Reflect.get?Reflect.get:function(target,property,receiver){var base=_superPropBase(target,property);if(base){var desc=Object.getOwnPropertyDescriptor(base,property);return desc.get?desc.get.call(3>arguments.length?target:receiver):desc.value}},_get.apply(this,arguments)}function _superPropBase(object,property){for(;!Object.prototype.hasOwnProperty.call(object,property)&&(object=_getPrototypeOf(object),null!==object););return object}function _inherits(subClass,superClass){if(\"function\"!=typeof superClass&&null!==superClass)throw new TypeError(\"Super expression must either be null or a function\");subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:!0,configurable:!0}}),Object.defineProperty(subClass,\"prototype\",{writable:!1}),superClass&&_setPrototypeOf(subClass,superClass)}function _setPrototypeOf(o,p){return _setPrototypeOf=Object.setPrototypeOf||function(o,p){return o.__proto__=p,o},_setPrototypeOf(o,p)}function _createSuper(Derived){var hasNativeReflectConstruct=_isNativeReflectConstruct();return function(){var Super=_getPrototypeOf(Derived),result;if(hasNativeReflectConstruct){var NewTarget=_getPrototypeOf(this).constructor;result=Reflect.construct(Super,arguments,NewTarget)}else result=Super.apply(this,arguments);return _possibleConstructorReturn(this,result)}}function _possibleConstructorReturn(self,call){if(call&&(\"object\"===_typeof(call)||\"function\"==typeof call))return call;if(void 0!==call)throw new TypeError(\"Derived constructors may only return object or undefined\");return _assertThisInitialized(self)}function _assertThisInitialized(self){if(void 0===self)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return self}function _isNativeReflectConstruct(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}function _getPrototypeOf(o){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function(o){return o.__proto__||Object.getPrototypeOf(o)},_getPrototypeOf(o)}function _toArray(arr){return _arrayWithHoles(arr)||_iterableToArray(arr)||_unsupportedIterableToArray(arr)||_nonIterableRest()}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_unsupportedIterableToArray(arr,i)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}function _iterableToArrayLimit(arr,i){var _i=null==arr?null:\"undefined\"!=typeof Symbol&&arr[Symbol.iterator]||arr[\"@@iterator\"];if(null!=_i){var _arr=[],_n=!0,_d=!1,_s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!(i&&_arr.length===i));_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i[\"return\"]||_i[\"return\"]()}finally{if(_d)throw _e}}return _arr}}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(target,props){for(var i=0,descriptor;i<props.length;i++)descriptor=props[i],descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,\"value\"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}function _createClass(Constructor,protoProps,staticProps){return protoProps&&_defineProperties(Constructor.prototype,protoProps),staticProps&&_defineProperties(Constructor,staticProps),Object.defineProperty(Constructor,\"prototype\",{writable:!1}),Constructor}function _typeof(obj){\"@babel/helpers - typeof\";return _typeof=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(obj){return typeof obj}:function(obj){return obj&&\"function\"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?\"symbol\":typeof obj},_typeof(obj)}function _toConsumableArray(arr){return _arrayWithoutHoles(arr)||_iterableToArray(arr)||_unsupportedIterableToArray(arr)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}function _unsupportedIterableToArray(o,minLen){if(o){if(\"string\"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);return\"Object\"===n&&o.constructor&&(n=o.constructor.name),\"Map\"===n||\"Set\"===n?Array.from(o):\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(o,minLen):void 0}}function _iterableToArray(iter){if(\"undefined\"!=typeof Symbol&&null!=iter[Symbol.iterator]||null!=iter[\"@@iterator\"])return Array.from(iter)}function _arrayWithoutHoles(arr){if(Array.isArray(arr))return _arrayLikeToArray(arr)}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=Array(len);i<len;i++)arr2[i]=arr[i];return arr2}var CoffeeScript=function(){var _Mathabs=Math.abs,_StringfromCharCode=String.fromCharCode,_Mathfloor=Math.floor;function require(path){return require[path]}return require[\"../../package.json\"]=function(){return{name:\"coffeescript\",description:\"Unfancy JavaScript\",keywords:[\"javascript\",\"language\",\"coffeescript\",\"compiler\"],author:\"Jeremy Ashkenas\",version:\"2.7.0\",license:\"MIT\",engines:{node:\">=6\"},directories:{lib:\"./lib/coffeescript\"},main:\"./lib/coffeescript/index\",module:\"./lib/coffeescript-browser-compiler-modern/coffeescript.js\",browser:\"./lib/coffeescript-browser-compiler-legacy/coffeescript.js\",bin:{coffee:\"./bin/coffee\",cake:\"./bin/cake\"},files:[\"bin\",\"lib\",\"register.js\",\"repl.js\"],scripts:{test:\"node ./bin/cake test\",\"test-harmony\":\"node --harmony ./bin/cake test\"},homepage:\"https://coffeescript.org\",bugs:\"https://github.com/jashkenas/coffeescript/issues\",repository:{type:\"git\",url:\"git://github.com/jashkenas/coffeescript.git\"},devDependencies:{\"@babel/core\":\"~7.17.9\",\"@babel/preset-env\":\"~7.16.11\",\"babel-preset-minify\":\"~0.5.1\",codemirror:\"~5.65.3\",docco:\"~0.9.1\",\"highlight.js\":\"~11.5.1\",jison:\"~0.4.18\",\"markdown-it\":\"~13.0.0\",puppeteer:\"~13.6.0\",underscore:\"~1.13.3\",webpack:\"~5.72.0\"}}}(),require[\"./helpers\"]=function(){var exports={};return function(){var indexOf=[].indexOf,UNICODE_CODE_POINT_ESCAPE,attachCommentsToNode,buildLocationData,buildLocationHash,buildTokenDataDictionary,extend,flatten,isBoolean,isNumber,isString,ref,repeat,syntaxErrorToString,unicodeCodePointToUnicodeEscapes;exports.starts=function(string,literal,start){return literal===string.substr(start,literal.length)},exports.ends=function(string,literal,back){var len;return len=literal.length,literal===string.substr(string.length-len-(back||0),len)},exports.repeat=repeat=function(str,n){var res;for(res=\"\";0<n;)1&n&&(res+=str),n>>>=1,str+=str;return res},exports.compact=function(array){var i,item,len1,results;for(results=[],i=0,len1=array.length;i<len1;i++)item=array[i],item&&results.push(item);return results},exports.count=function(string,substr){var num,pos;if(num=pos=0,!substr.length)return 1/0;for(;pos=1+string.indexOf(substr,pos);)num++;return num},exports.merge=function(options,overrides){return extend(extend({},options),overrides)},extend=exports.extend=function(object,properties){var key,val;for(key in properties)val=properties[key],object[key]=val;return object},exports.flatten=flatten=function(array){return array.flat(2e308)},exports.del=function(obj,key){var val;return val=obj[key],delete obj[key],val},exports.some=null==(ref=Array.prototype.some)?function(fn){var e,i,len1,ref1;for(ref1=this,i=0,len1=ref1.length;i<len1;i++)if(e=ref1[i],fn(e))return!0;return!1}:ref,exports.invertLiterate=function(code){var blankLine,i,indented,insideComment,len1,line,listItemStart,out,ref1;for(out=[],blankLine=/^\\s*$/,indented=/^[\\t ]/,listItemStart=/^(?:\\t?| {0,3})(?:[\\*\\-\\+]|[0-9]{1,9}\\.)[ \\t]/,insideComment=!1,ref1=code.split(\"\\n\"),(i=0,len1=ref1.length);i<len1;i++)line=ref1[i],blankLine.test(line)?(insideComment=!1,out.push(line)):insideComment||listItemStart.test(line)?(insideComment=!0,out.push(\"# \".concat(line))):!insideComment&&indented.test(line)?out.push(line):(insideComment=!0,out.push(\"# \".concat(line)));return out.join(\"\\n\")},buildLocationData=function(first,last){return last?{first_line:first.first_line,first_column:first.first_column,last_line:last.last_line,last_column:last.last_column,last_line_exclusive:last.last_line_exclusive,last_column_exclusive:last.last_column_exclusive,range:[first.range[0],last.range[1]]}:first},exports.extractAllCommentTokens=function(tokens){var allCommentsObj,comment,commentKey,i,j,k,key,len1,len2,len3,ref1,results,sortedKeys,token;for(allCommentsObj={},i=0,len1=tokens.length;i<len1;i++)if(token=tokens[i],token.comments)for(ref1=token.comments,j=0,len2=ref1.length;j<len2;j++)comment=ref1[j],commentKey=comment.locationData.range[0],allCommentsObj[commentKey]=comment;for(sortedKeys=Object.keys(allCommentsObj).sort(function(a,b){return a-b}),results=[],(k=0,len3=sortedKeys.length);k<len3;k++)key=sortedKeys[k],results.push(allCommentsObj[key]);return results},buildLocationHash=function(loc){return\"\".concat(loc.range[0],\"-\").concat(loc.range[1])},exports.buildTokenDataDictionary=buildTokenDataDictionary=function(tokens){var base1,i,len1,token,tokenData,tokenHash;for(tokenData={},i=0,len1=tokens.length;i<len1;i++)if((token=tokens[i],!!token.comments)&&(tokenHash=buildLocationHash(token[2]),null==tokenData[tokenHash]&&(tokenData[tokenHash]={}),token.comments)){var _ref;(_ref=null==(base1=tokenData[tokenHash]).comments?base1.comments=[]:base1.comments).push.apply(_ref,_toConsumableArray(token.comments))}return tokenData},exports.addDataToNode=function(parserState,firstLocationData,firstValue,lastLocationData,lastValue){var forceUpdateLocation=!(5<arguments.length&&void 0!==arguments[5])||arguments[5];return function(obj){var locationData,objHash,ref1,ref2,ref3;return locationData=buildLocationData(null==(ref1=null==firstValue?void 0:firstValue.locationData)?firstLocationData:ref1,null==(ref2=null==lastValue?void 0:lastValue.locationData)?lastLocationData:ref2),null!=(null==obj?void 0:obj.updateLocationDataIfMissing)&&null!=firstLocationData?obj.updateLocationDataIfMissing(locationData,forceUpdateLocation):obj.locationData=locationData,null==parserState.tokenData&&(parserState.tokenData=buildTokenDataDictionary(parserState.parser.tokens)),null!=obj.locationData&&(objHash=buildLocationHash(obj.locationData),null!=(null==(ref3=parserState.tokenData[objHash])?void 0:ref3.comments)&&attachCommentsToNode(parserState.tokenData[objHash].comments,obj)),obj}},exports.attachCommentsToNode=attachCommentsToNode=function(comments,node){var _node$comments;if(null!=comments&&0!==comments.length)return null==node.comments&&(node.comments=[]),(_node$comments=node.comments).push.apply(_node$comments,_toConsumableArray(comments))},exports.locationDataToString=function(obj){var locationData;return\"2\"in obj&&\"first_line\"in obj[2]?locationData=obj[2]:\"first_line\"in obj&&(locationData=obj),locationData?\"\".concat(locationData.first_line+1,\":\").concat(locationData.first_column+1,\"-\")+\"\".concat(locationData.last_line+1,\":\").concat(locationData.last_column+1):\"No location data\"},exports.anonymousFileName=function(){var n;return n=0,function(){return\"<anonymous-\".concat(n++,\">\")}}(),exports.baseFileName=function(file){var stripExt=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],useWinPathSep=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],parts,pathSep;return(pathSep=useWinPathSep?/\\\\|\\//:/\\//,parts=file.split(pathSep),file=parts[parts.length-1],!(stripExt&&0<=file.indexOf(\".\")))?file:(parts=file.split(\".\"),parts.pop(),\"coffee\"===parts[parts.length-1]&&1<parts.length&&parts.pop(),parts.join(\".\"))},exports.isCoffee=function(file){return /\\.((lit)?coffee|coffee\\.md)$/.test(file)},exports.isLiterate=function(file){return /\\.(litcoffee|coffee\\.md)$/.test(file)},exports.throwSyntaxError=function(message,location){var error;throw error=new SyntaxError(message),error.location=location,error.toString=syntaxErrorToString,error.stack=error.toString(),error},exports.updateSyntaxError=function(error,code,filename){return error.toString===syntaxErrorToString&&(error.code||(error.code=code),error.filename||(error.filename=filename),error.stack=error.toString()),error},syntaxErrorToString=function(){var codeLine,colorize,colorsEnabled,end,filename,first_column,first_line,last_column,last_line,marker,ref1,ref2,ref3,ref4,start;if(!(this.code&&this.location))return Error.prototype.toString.call(this);var _this$location=this.location;return first_line=_this$location.first_line,first_column=_this$location.first_column,last_line=_this$location.last_line,last_column=_this$location.last_column,null==last_line&&(last_line=first_line),null==last_column&&(last_column=first_column),filename=(null==(ref1=this.filename)?void 0:ref1.startsWith(\"<anonymous\"))?\"[stdin]\":this.filename||\"[stdin]\",codeLine=this.code.split(\"\\n\")[first_line],start=first_column,end=first_line===last_line?last_column+1:codeLine.length,marker=codeLine.slice(0,start).replace(/[^\\s]/g,\" \")+repeat(\"^\",end-start),\"undefined\"!=typeof process&&null!==process&&(colorsEnabled=(null==(ref2=process.stdout)?void 0:ref2.isTTY)&&(null==(ref3=process.env)||!ref3.NODE_DISABLE_COLORS)),(null==(ref4=this.colorful)?colorsEnabled:ref4)&&(colorize=function(str){return\"\\x1B[1;31m\".concat(str,\"\\x1B[0m\")},codeLine=codeLine.slice(0,start)+colorize(codeLine.slice(start,end))+codeLine.slice(end),marker=colorize(marker)),\"\".concat(filename,\":\").concat(first_line+1,\":\").concat(first_column+1,\": error: \").concat(this.message,\"\\n\").concat(codeLine,\"\\n\").concat(marker)},exports.nameWhitespaceCharacter=function(string){return\" \"===string?\"space\":\"\\n\"===string?\"newline\":\"\\r\"===string?\"carriage return\":\"\\t\"===string?\"tab\":string},exports.parseNumber=function(string){var base;return null==string?0/0:(base=function(){switch(string.charAt(1)){case\"b\":return 2;case\"o\":return 8;case\"x\":return 16;default:return null;}}(),null==base?parseFloat(string.replace(/_/g,\"\")):parseInt(string.slice(2).replace(/_/g,\"\"),base))},exports.isFunction=function(obj){return\"[object Function]\"===Object.prototype.toString.call(obj)},exports.isNumber=isNumber=function(obj){return\"[object Number]\"===Object.prototype.toString.call(obj)},exports.isString=isString=function(obj){return\"[object String]\"===Object.prototype.toString.call(obj)},exports.isBoolean=isBoolean=function(obj){return!0===obj||!1===obj||\"[object Boolean]\"===Object.prototype.toString.call(obj)},exports.isPlainObject=function(obj){return\"object\"===_typeof(obj)&&!!obj&&!Array.isArray(obj)&&!isNumber(obj)&&!isString(obj)&&!isBoolean(obj)},unicodeCodePointToUnicodeEscapes=function(codePoint){var high,low,toUnicodeEscape;return(toUnicodeEscape=function(val){var str;return str=val.toString(16),\"\\\\u\".concat(repeat(\"0\",4-str.length)).concat(str)},65536>codePoint)?toUnicodeEscape(codePoint):(high=_Mathfloor((codePoint-65536)/1024)+55296,low=(codePoint-65536)%1024+56320,\"\".concat(toUnicodeEscape(high)).concat(toUnicodeEscape(low)))},exports.replaceUnicodeCodePointEscapes=function(str){var _ref2=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},flags=_ref2.flags,error=_ref2.error,_ref2$delimiter=_ref2.delimiter,delimiter=void 0===_ref2$delimiter?\"\":_ref2$delimiter,shouldReplace;return shouldReplace=null!=flags&&0>indexOf.call(flags,\"u\"),str.replace(UNICODE_CODE_POINT_ESCAPE,function(match,escapedBackslash,codePointHex,offset){var codePointDecimal;return escapedBackslash?escapedBackslash:(codePointDecimal=parseInt(codePointHex,16),1114111<codePointDecimal&&error(\"unicode code point escapes greater than \\\\u{10ffff} are not allowed\",{offset:offset+delimiter.length,length:codePointHex.length+4}),shouldReplace?unicodeCodePointToUnicodeEscapes(codePointDecimal):match)})},UNICODE_CODE_POINT_ESCAPE=/(\\\\\\\\)|\\\\u\\{([\\da-fA-F]+)\\}/g}.call(this),{exports:exports}.exports}(),require[\"./rewriter\"]=function(){var exports={};return function(){var indexOf=[].indexOf,hasProp={}.hasOwnProperty,_require=require(\"./helpers\"),BALANCED_PAIRS,CALL_CLOSERS,CONTROL_IN_IMPLICIT,DISCARDED,EXPRESSION_CLOSE,EXPRESSION_END,EXPRESSION_START,IMPLICIT_CALL,IMPLICIT_END,IMPLICIT_FUNC,IMPLICIT_UNSPACED_CALL,INVERSES,LINEBREAKS,Rewriter,SINGLE_CLOSERS,SINGLE_LINERS,UNFINISHED,extractAllCommentTokens,generate,k,left,len,moveComments,right,throwSyntaxError;for(throwSyntaxError=_require.throwSyntaxError,extractAllCommentTokens=_require.extractAllCommentTokens,moveComments=function(fromToken,toToken){var comment,k,len,ref,unshiftedComments;if(fromToken.comments){if(toToken.comments&&0!==toToken.comments.length){for(unshiftedComments=[],ref=fromToken.comments,(k=0,len=ref.length);k<len;k++)comment=ref[k],comment.unshift?unshiftedComments.push(comment):toToken.comments.push(comment);toToken.comments=unshiftedComments.concat(toToken.comments)}else toToken.comments=fromToken.comments;return delete fromToken.comments}},generate=function(tag,value,origin,commentsToken){var token;return token=[tag,value],token.generated=!0,origin&&(token.origin=origin),commentsToken&&moveComments(commentsToken,token),token},exports.Rewriter=Rewriter=function(){var Rewriter=function(){function Rewriter(){_classCallCheck(this,Rewriter)}return _createClass(Rewriter,[{key:\"rewrite\",value:function rewrite(tokens1){var ref,ref1,t;return this.tokens=tokens1,(\"undefined\"!=typeof process&&null!==process?null==(ref=process.env)?void 0:ref.DEBUG_TOKEN_STREAM:void 0)&&(process.env.DEBUG_REWRITTEN_TOKEN_STREAM&&console.log(\"Initial token stream:\"),console.log(function(){var k,len,ref1,results;for(ref1=this.tokens,results=[],(k=0,len=ref1.length);k<len;k++)t=ref1[k],results.push(t[0]+\"/\"+t[1]+(t.comments?\"*\":\"\"));return results}.call(this).join(\" \"))),this.removeLeadingNewlines(),this.closeOpenCalls(),this.closeOpenIndexes(),this.normalizeLines(),this.tagPostfixConditionals(),this.addImplicitBracesAndParens(),this.rescueStowawayComments(),this.addLocationDataToGeneratedTokens(),this.enforceValidJSXAttributes(),this.fixIndentationLocationData(),this.exposeTokenDataToGrammar(),(\"undefined\"!=typeof process&&null!==process?null==(ref1=process.env)?void 0:ref1.DEBUG_REWRITTEN_TOKEN_STREAM:void 0)&&(process.env.DEBUG_TOKEN_STREAM&&console.log(\"Rewritten token stream:\"),console.log(function(){var k,len,ref2,results;for(ref2=this.tokens,results=[],(k=0,len=ref2.length);k<len;k++)t=ref2[k],results.push(t[0]+\"/\"+t[1]+(t.comments?\"*\":\"\"));return results}.call(this).join(\" \"))),this.tokens}},{key:\"scanTokens\",value:function scanTokens(block){var i,token,tokens;for(tokens=this.tokens,i=0;token=tokens[i];)i+=block.call(this,token,i,tokens);return!0}},{key:\"detectEnd\",value:function detectEnd(i,condition,action){var opts=3<arguments.length&&void 0!==arguments[3]?arguments[3]:{},levels,ref,ref1,token,tokens;for(tokens=this.tokens,levels=0;token=tokens[i];){if(0===levels&&condition.call(this,token,i))return action.call(this,token,i);if((ref=token[0],0<=indexOf.call(EXPRESSION_START,ref))?levels+=1:(ref1=token[0],0<=indexOf.call(EXPRESSION_END,ref1))&&(levels-=1),0>levels)return opts.returnOnNegativeLevel?void 0:action.call(this,token,i);i+=1}return i-1}},{key:\"removeLeadingNewlines\",value:function removeLeadingNewlines(){var i,k,l,leadingNewlineToken,len,len1,ref,ref1,tag;for(ref=this.tokens,i=k=0,len=ref.length;k<len;i=++k){var _ref$i=_slicedToArray(ref[i],1);if(tag=_ref$i[0],\"TERMINATOR\"!==tag)break}if(0!==i){for(ref1=this.tokens.slice(0,i),l=0,len1=ref1.length;l<len1;l++)leadingNewlineToken=ref1[l],moveComments(leadingNewlineToken,this.tokens[i]);return this.tokens.splice(0,i)}}},{key:\"closeOpenCalls\",value:function closeOpenCalls(){var action,condition;return condition=function(token){var ref;return\")\"===(ref=token[0])||\"CALL_END\"===ref},action=function(token){return token[0]=\"CALL_END\"},this.scanTokens(function(token,i){return\"CALL_START\"===token[0]&&this.detectEnd(i+1,condition,action),1})}},{key:\"closeOpenIndexes\",value:function closeOpenIndexes(){var action,condition,startToken;return startToken=null,condition=function(token){var ref;return\"]\"===(ref=token[0])||\"INDEX_END\"===ref},action=function(token,i){return this.tokens.length>=i&&\":\"===this.tokens[i+1][0]?(startToken[0]=\"[\",token[0]=\"]\"):token[0]=\"INDEX_END\"},this.scanTokens(function(token,i){return\"INDEX_START\"===token[0]&&(startToken=token,this.detectEnd(i+1,condition,action)),1})}},{key:\"indexOfTag\",value:function indexOfTag(i){var fuzz,j,k,ref,ref1;fuzz=0;for(var _len=arguments.length,pattern=Array(1<_len?_len-1:0),_key=1;_key<_len;_key++)pattern[_key-1]=arguments[_key];for(j=k=0,ref=pattern.length;0<=ref?k<ref:k>ref;j=0<=ref?++k:--k)if(null!=pattern[j]&&(\"string\"==typeof pattern[j]&&(pattern[j]=[pattern[j]]),ref1=this.tag(i+j+fuzz),0>indexOf.call(pattern[j],ref1)))return-1;return i+j+fuzz-1}},{key:\"looksObjectish\",value:function looksObjectish(j){var end,index;return-1!==this.indexOfTag(j,\"@\",null,\":\")||-1!==this.indexOfTag(j,null,\":\")||(index=this.indexOfTag(j,EXPRESSION_START),!!(-1!==index&&(end=null,this.detectEnd(index+1,function(token){var ref;return ref=token[0],0<=indexOf.call(EXPRESSION_END,ref)},function(token,i){return end=i}),\":\"===this.tag(end+1))))}},{key:\"findTagsBackwards\",value:function findTagsBackwards(i,tags){var backStack,ref,ref1,ref2,ref3,ref4,ref5;for(backStack=[];0<=i&&(backStack.length||(ref2=this.tag(i),0>indexOf.call(tags,ref2))&&((ref3=this.tag(i),0>indexOf.call(EXPRESSION_START,ref3))||this.tokens[i].generated)&&(ref4=this.tag(i),0>indexOf.call(LINEBREAKS,ref4)));)(ref=this.tag(i),0<=indexOf.call(EXPRESSION_END,ref))&&backStack.push(this.tag(i)),(ref1=this.tag(i),0<=indexOf.call(EXPRESSION_START,ref1))&&backStack.length&&backStack.pop(),i-=1;return ref5=this.tag(i),0<=indexOf.call(tags,ref5)}},{key:\"addImplicitBracesAndParens\",value:function addImplicitBracesAndParens(){var stack,start;return stack=[],start=null,this.scanTokens(function(token,i,tokens){var _this=this,_token=_slicedToArray(token,1),endImplicitCall,endImplicitObject,forward,implicitObjectContinues,implicitObjectIndent,inControlFlow,inImplicit,inImplicitCall,inImplicitControl,inImplicitObject,isImplicit,isImplicitCall,isImplicitObject,k,newLine,nextTag,nextToken,offset,preContinuationLineIndent,preObjectToken,prevTag,prevToken,ref,ref1,ref2,ref3,ref4,ref5,s,sameLine,stackIdx,stackItem,stackNext,stackTag,stackTop,startIdx,startImplicitCall,startImplicitObject,startIndex,startTag,startsLine,tag;tag=_token[0];var _prevToken=prevToken=0<i?tokens[i-1]:[],_prevToken2=_slicedToArray(_prevToken,1);prevTag=_prevToken2[0];var _nextToken=nextToken=i<tokens.length-1?tokens[i+1]:[],_nextToken2=_slicedToArray(_nextToken,1);if(nextTag=_nextToken2[0],stackTop=function(){return stack[stack.length-1]},startIdx=i,forward=function(n){return i-startIdx+n},isImplicit=function(stackItem){var ref;return null==stackItem||null==(ref=stackItem[2])?void 0:ref.ours},isImplicitObject=function(stackItem){return isImplicit(stackItem)&&\"{\"===(null==stackItem?void 0:stackItem[0])},isImplicitCall=function(stackItem){return isImplicit(stackItem)&&\"(\"===(null==stackItem?void 0:stackItem[0])},inImplicit=function(){return isImplicit(stackTop())},inImplicitCall=function(){return isImplicitCall(stackTop())},inImplicitObject=function(){return isImplicitObject(stackTop())},inImplicitControl=function(){var ref;return inImplicit()&&\"CONTROL\"===(null==(ref=stackTop())?void 0:ref[0])},startImplicitCall=function(idx){return stack.push([\"(\",idx,{ours:!0}]),tokens.splice(idx,0,generate(\"CALL_START\",\"(\",[\"\",\"implicit function call\",token[2]],prevToken))},endImplicitCall=function(){return stack.pop(),tokens.splice(i,0,generate(\"CALL_END\",\")\",[\"\",\"end of input\",token[2]],prevToken)),i+=1},startImplicitObject=function(idx){var _ref3=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref3$startsLine=_ref3.startsLine,continuationLineIndent=_ref3.continuationLineIndent,val;return stack.push([\"{\",idx,{sameLine:!0,startsLine:void 0===_ref3$startsLine||_ref3$startsLine,ours:!0,continuationLineIndent:continuationLineIndent}]),val=new String(\"{\"),val.generated=!0,tokens.splice(idx,0,generate(\"{\",val,token,prevToken))},endImplicitObject=function(j){return j=null==j?i:j,stack.pop(),tokens.splice(j,0,generate(\"}\",\"}\",token,prevToken)),i+=1},implicitObjectContinues=function(j){var nextTerminatorIdx;return nextTerminatorIdx=null,_this.detectEnd(j,function(token){return\"TERMINATOR\"===token[0]},function(token,i){return nextTerminatorIdx=i},{returnOnNegativeLevel:!0}),null!=nextTerminatorIdx&&_this.looksObjectish(nextTerminatorIdx+1)},(inImplicitCall()||inImplicitObject())&&0<=indexOf.call(CONTROL_IN_IMPLICIT,tag)||inImplicitObject()&&\":\"===prevTag&&\"FOR\"===tag)return stack.push([\"CONTROL\",i,{ours:!0}]),forward(1);if(\"INDENT\"===tag&&inImplicit()){if(\"=>\"!==prevTag&&\"->\"!==prevTag&&\"[\"!==prevTag&&\"(\"!==prevTag&&\",\"!==prevTag&&\"{\"!==prevTag&&\"ELSE\"!==prevTag&&\"=\"!==prevTag)for(;inImplicitCall()||inImplicitObject()&&\":\"!==prevTag;)inImplicitCall()?endImplicitCall():endImplicitObject();return inImplicitControl()&&stack.pop(),stack.push([tag,i]),forward(1)}if(0<=indexOf.call(EXPRESSION_START,tag))return stack.push([tag,i]),forward(1);if(0<=indexOf.call(EXPRESSION_END,tag)){for(;inImplicit();)inImplicitCall()?endImplicitCall():inImplicitObject()?endImplicitObject():stack.pop();start=stack.pop()}if(inControlFlow=function(){var controlFlow,isFunc,seenFor,tagCurrentLine;return(seenFor=_this.findTagsBackwards(i,[\"FOR\"])&&_this.findTagsBackwards(i,[\"FORIN\",\"FOROF\",\"FORFROM\"]),controlFlow=seenFor||_this.findTagsBackwards(i,[\"WHILE\",\"UNTIL\",\"LOOP\",\"LEADING_WHEN\"]),!!controlFlow)&&(isFunc=!1,tagCurrentLine=token[2].first_line,_this.detectEnd(i,function(token){var ref;return ref=token[0],0<=indexOf.call(LINEBREAKS,ref)},function(token,i){var _ref4=tokens[i-1]||[],_ref5=_slicedToArray(_ref4,3),first_line;return prevTag=_ref5[0],first_line=_ref5[2].first_line,isFunc=tagCurrentLine===first_line&&(\"->\"===prevTag||\"=>\"===prevTag)},{returnOnNegativeLevel:!0}),isFunc)},(0<=indexOf.call(IMPLICIT_FUNC,tag)&&token.spaced||\"?\"===tag&&0<i&&!tokens[i-1].spaced)&&(0<=indexOf.call(IMPLICIT_CALL,nextTag)||\"...\"===nextTag&&(ref=this.tag(i+2),0<=indexOf.call(IMPLICIT_CALL,ref))&&!this.findTagsBackwards(i,[\"INDEX_START\",\"[\"])||0<=indexOf.call(IMPLICIT_UNSPACED_CALL,nextTag)&&!nextToken.spaced&&!nextToken.newLine)&&!inControlFlow())return\"?\"===tag&&(tag=token[0]=\"FUNC_EXIST\"),startImplicitCall(i+1),forward(2);if(0<=indexOf.call(IMPLICIT_FUNC,tag)&&-1<this.indexOfTag(i+1,\"INDENT\")&&this.looksObjectish(i+2)&&!this.findTagsBackwards(i,[\"CLASS\",\"EXTENDS\",\"IF\",\"CATCH\",\"SWITCH\",\"LEADING_WHEN\",\"FOR\",\"WHILE\",\"UNTIL\"])&&(\"{\"!==(ref1=s=null==(ref2=stackTop())?void 0:ref2[0])&&\"[\"!==ref1||isImplicit(stackTop())||!this.findTagsBackwards(i,s)))return startImplicitCall(i+1),stack.push([\"INDENT\",i+2]),forward(3);if(\":\"===tag){if(s=function(){var ref3;switch(!1){case(ref3=this.tag(i-1),0>indexOf.call(EXPRESSION_END,ref3)):var _start=start,_start2=_slicedToArray(_start,2);return startTag=_start2[0],startIndex=_start2[1],\"[\"===startTag&&0<startIndex&&\"@\"===this.tag(startIndex-1)&&!tokens[startIndex-1].spaced?startIndex-1:startIndex;break;case\"@\"!==this.tag(i-2):return i-2;default:return i-1;}}.call(this),startsLine=0>=s||(ref3=this.tag(s-1),0<=indexOf.call(LINEBREAKS,ref3))||tokens[s-1].newLine,stackTop()){var _stackTop=stackTop(),_stackTop2=_slicedToArray(_stackTop,2);if(stackTag=_stackTop2[0],stackIdx=_stackTop2[1],stackNext=stack[stack.length-2],(\"{\"===stackTag||\"INDENT\"===stackTag&&\"{\"===(null==stackNext?void 0:stackNext[0])&&!isImplicit(stackNext)&&this.findTagsBackwards(stackIdx-1,[\"{\"]))&&(startsLine||\",\"===this.tag(s-1)||\"{\"===this.tag(s-1))&&(ref4=this.tag(s-1),0>indexOf.call(UNFINISHED,ref4)))return forward(1)}return preObjectToken=1<i?tokens[i-2]:[],startImplicitObject(s,{startsLine:!!startsLine,continuationLineIndent:preObjectToken.continuationLineIndent}),forward(2)}if(0<=indexOf.call(LINEBREAKS,tag))for(k=stack.length-1;0<=k&&(stackItem=stack[k],!!isImplicit(stackItem));k+=-1)isImplicitObject(stackItem)&&(stackItem[2].sameLine=!1);if(\"TERMINATOR\"===tag&&token.endsContinuationLineIndentation)for(preContinuationLineIndent=token.endsContinuationLineIndentation.preContinuationLineIndent;inImplicitObject()&&null!=(implicitObjectIndent=stackTop()[2].continuationLineIndent)&&implicitObjectIndent>preContinuationLineIndent;)endImplicitObject();if(newLine=\"OUTDENT\"===prevTag||prevToken.newLine,0<=indexOf.call(IMPLICIT_END,tag)||0<=indexOf.call(CALL_CLOSERS,tag)&&newLine||(\"..\"===tag||\"...\"===tag)&&this.findTagsBackwards(i,[\"INDEX_START\"]))for(;inImplicit();){var _stackTop3=stackTop(),_stackTop4=_slicedToArray(_stackTop3,3);stackTag=_stackTop4[0],stackIdx=_stackTop4[1];var _stackTop4$=_stackTop4[2];if(sameLine=_stackTop4$.sameLine,startsLine=_stackTop4$.startsLine,inImplicitCall()&&\",\"!==prevTag||\",\"===prevTag&&\"TERMINATOR\"===tag&&null==nextTag)endImplicitCall();else if(inImplicitObject()&&sameLine&&\"TERMINATOR\"!==tag&&\":\"!==prevTag&&!((\"POST_IF\"===tag||\"FOR\"===tag||\"WHILE\"===tag||\"UNTIL\"===tag)&&startsLine&&implicitObjectContinues(i+1)))endImplicitObject();else if(inImplicitObject()&&\"TERMINATOR\"===tag&&\",\"!==prevTag&&!(startsLine&&this.looksObjectish(i+1)))endImplicitObject();else if(inImplicitControl()&&\"CLASS\"===tokens[stackTop()[1]][0]&&\"TERMINATOR\"===tag)stack.pop();else break}if(\",\"===tag&&!this.looksObjectish(i+1)&&inImplicitObject()&&\"FOROF\"!==(ref5=this.tag(i+2))&&\"FORIN\"!==ref5&&(\"TERMINATOR\"!==nextTag||!this.looksObjectish(i+2)))for(offset=\"OUTDENT\"===nextTag?1:0;inImplicitObject();)endImplicitObject(i+offset);return forward(1)})}},{key:\"enforceValidJSXAttributes\",value:function enforceValidJSXAttributes(){return this.scanTokens(function(token,i,tokens){var next,ref;return token.jsxColon&&(next=tokens[i+1],\"STRING_START\"!==(ref=next[0])&&\"STRING\"!==ref&&\"(\"!==ref&&throwSyntaxError(\"expected wrapped or quoted JSX attribute\",next[2])),1})}},{key:\"rescueStowawayComments\",value:function rescueStowawayComments(){var dontShiftForward,insertPlaceholder,shiftCommentsBackward,shiftCommentsForward;return insertPlaceholder=function(token,j,tokens,method){return\"TERMINATOR\"!==tokens[j][0]&&tokens[method](generate(\"TERMINATOR\",\"\\n\",tokens[j])),tokens[method](generate(\"JS\",\"\",tokens[j],token))},dontShiftForward=function(i,tokens){var j,ref;for(j=i+1;j!==tokens.length&&(ref=tokens[j][0],0<=indexOf.call(DISCARDED,ref));){if(\"INTERPOLATION_END\"===tokens[j][0])return!0;j++}return!1},shiftCommentsForward=function(token,i,tokens){var comment,j,k,len,ref,ref1,ref2;for(j=i;j!==tokens.length&&(ref=tokens[j][0],0<=indexOf.call(DISCARDED,ref));)j++;if(!(j===tokens.length||(ref1=tokens[j][0],0<=indexOf.call(DISCARDED,ref1)))){for(ref2=token.comments,k=0,len=ref2.length;k<len;k++)comment=ref2[k],comment.unshift=!0;return moveComments(token,tokens[j]),1}return j=tokens.length-1,insertPlaceholder(token,j,tokens,\"push\"),1},shiftCommentsBackward=function(token,i,tokens){var j,ref,ref1;for(j=i;-1!==j&&(ref=tokens[j][0],0<=indexOf.call(DISCARDED,ref));)j--;return-1===j||(ref1=tokens[j][0],0<=indexOf.call(DISCARDED,ref1))?(insertPlaceholder(token,0,tokens,\"unshift\"),3):(moveComments(token,tokens[j]),1)},this.scanTokens(function(token,i,tokens){var dummyToken,j,ref,ref1,ret;if(!token.comments)return 1;if(ret=1,ref=token[0],0<=indexOf.call(DISCARDED,ref)){for(dummyToken={comments:[]},j=token.comments.length-1;-1!==j;)!1===token.comments[j].newLine&&!1===token.comments[j].here&&(dummyToken.comments.unshift(token.comments[j]),token.comments.splice(j,1)),j--;0!==dummyToken.comments.length&&(ret=shiftCommentsBackward(dummyToken,i-1,tokens)),0!==token.comments.length&&shiftCommentsForward(token,i,tokens)}else if(!dontShiftForward(i,tokens)){for(dummyToken={comments:[]},j=token.comments.length-1;-1!==j;)!token.comments[j].newLine||token.comments[j].unshift||\"JS\"===token[0]&&token.generated||(dummyToken.comments.unshift(token.comments[j]),token.comments.splice(j,1)),j--;0!==dummyToken.comments.length&&(ret=shiftCommentsForward(dummyToken,i+1,tokens))}return 0===(null==(ref1=token.comments)?void 0:ref1.length)&&delete token.comments,ret})}},{key:\"addLocationDataToGeneratedTokens\",value:function addLocationDataToGeneratedTokens(){return this.scanTokens(function(token,i,tokens){var column,line,nextLocation,prevLocation,rangeIndex,ref,ref1;if(token[2])return 1;if(!(token.generated||token.explicit))return 1;if(token.fromThen&&\"INDENT\"===token[0])return token[2]=token.origin[2],1;if(\"{\"===token[0]&&(nextLocation=null==(ref=tokens[i+1])?void 0:ref[2])){var _nextLocation=nextLocation;line=_nextLocation.first_line,column=_nextLocation.first_column;var _nextLocation$range=_slicedToArray(_nextLocation.range,1);rangeIndex=_nextLocation$range[0]}else if(prevLocation=null==(ref1=tokens[i-1])?void 0:ref1[2]){var _prevLocation=prevLocation;line=_prevLocation.last_line,column=_prevLocation.last_column;var _prevLocation$range=_slicedToArray(_prevLocation.range,2);rangeIndex=_prevLocation$range[1],column+=1}else line=column=0,rangeIndex=0;return token[2]={first_line:line,first_column:column,last_line:line,last_column:column,last_line_exclusive:line,last_column_exclusive:column,range:[rangeIndex,rangeIndex]},1})}},{key:\"fixIndentationLocationData\",value:function fixIndentationLocationData(){var _this2=this,findPrecedingComment;return null==this.allComments&&(this.allComments=extractAllCommentTokens(this.tokens)),findPrecedingComment=function(token,_ref6){var afterPosition=_ref6.afterPosition,indentSize=_ref6.indentSize,first=_ref6.first,indented=_ref6.indented,comment,k,l,lastMatching,matches,ref,ref1,tokenStart;if(tokenStart=token[2].range[0],matches=function(comment){return(!comment.outdented||null!=indentSize&&comment.indentSize>indentSize)&&(!indented||comment.indented)&&!!(comment.locationData.range[0]<tokenStart)&&!!(comment.locationData.range[0]>afterPosition)},first){for(lastMatching=null,ref=_this2.allComments,k=ref.length-1;0<=k;k+=-1)if(comment=ref[k],matches(comment))lastMatching=comment;else if(lastMatching)return lastMatching;return lastMatching}for(ref1=_this2.allComments,l=ref1.length-1;0<=l;l+=-1)if(comment=ref1[l],matches(comment))return comment;return null},this.scanTokens(function(token,i,tokens){var isIndent,nextToken,nextTokenIndex,precedingComment,prevLocationData,prevToken,ref,ref1,ref2,useNextToken;if(\"INDENT\"!==(ref=token[0])&&\"OUTDENT\"!==ref&&(!token.generated||\"CALL_END\"!==token[0]||null!=(ref1=token.data)&&ref1.closingTagNameToken)&&(!token.generated||\"}\"!==token[0]))return 1;if(isIndent=\"INDENT\"===token[0],prevToken=null==(ref2=token.prevToken)?tokens[i-1]:ref2,prevLocationData=prevToken[2],useNextToken=token.explicit||token.generated,useNextToken)for(nextToken=token,nextTokenIndex=i;(nextToken.explicit||nextToken.generated)&&nextTokenIndex!==tokens.length-1;)nextToken=tokens[nextTokenIndex++];return(precedingComment=findPrecedingComment(useNextToken?nextToken:token,{afterPosition:prevLocationData.range[0],indentSize:token.indentSize,first:isIndent,indented:useNextToken}),isIndent&&(null==precedingComment||!precedingComment.newLine))?1:token.generated&&\"CALL_END\"===token[0]&&(null==precedingComment?void 0:precedingComment.indented)?1:(null!=precedingComment&&(prevLocationData=precedingComment.locationData),token[2]={first_line:null==precedingComment?prevLocationData.last_line:prevLocationData.first_line,first_column:null==precedingComment?prevLocationData.last_column:isIndent?0:prevLocationData.first_column,last_line:prevLocationData.last_line,last_column:prevLocationData.last_column,last_line_exclusive:prevLocationData.last_line_exclusive,last_column_exclusive:prevLocationData.last_column_exclusive,range:isIndent&&null!=precedingComment?[prevLocationData.range[0]-precedingComment.indentSize,prevLocationData.range[1]]:prevLocationData.range},1)})}},{key:\"normalizeLines\",value:function normalizeLines(){var _this3=this,action,closeElseTag,condition,ifThens,indent,leading_if_then,leading_switch_when,outdent,starter;return starter=indent=outdent=null,leading_switch_when=null,leading_if_then=null,ifThens=[],condition=function(token,i){var ref,ref1,ref2,ref3;return\";\"!==token[1]&&(ref=token[0],0<=indexOf.call(SINGLE_CLOSERS,ref))&&!(\"TERMINATOR\"===token[0]&&(ref1=this.tag(i+1),0<=indexOf.call(EXPRESSION_CLOSE,ref1)))&&!(\"ELSE\"===token[0]&&(\"THEN\"!==starter||leading_if_then||leading_switch_when))&&(\"CATCH\"!==(ref2=token[0])&&\"FINALLY\"!==ref2||\"->\"!==starter&&\"=>\"!==starter)||(ref3=token[0],0<=indexOf.call(CALL_CLOSERS,ref3))&&(this.tokens[i-1].newLine||\"OUTDENT\"===this.tokens[i-1][0])},action=function(token,i){return\"ELSE\"===token[0]&&\"THEN\"===starter&&ifThens.pop(),this.tokens.splice(\",\"===this.tag(i-1)?i-1:i,0,outdent)},closeElseTag=function(tokens,i){var lastThen,outdentElse,tlen;if(tlen=ifThens.length,!(0<tlen))return i;lastThen=ifThens.pop();var _this3$indentation=_this3.indentation(tokens[lastThen]),_this3$indentation2=_slicedToArray(_this3$indentation,2);return outdentElse=_this3$indentation2[1],outdentElse[1]=2*tlen,tokens.splice(i,0,outdentElse),outdentElse[1]=2,tokens.splice(i+1,0,outdentElse),_this3.detectEnd(i+2,function(token){var ref;return\"OUTDENT\"===(ref=token[0])||\"TERMINATOR\"===ref},function(token,i){if(\"OUTDENT\"===this.tag(i)&&\"OUTDENT\"===this.tag(i+1))return tokens.splice(i,2)}),i+2},this.scanTokens(function(token,i,tokens){var _token2=_slicedToArray(token,1),conditionTag,j,k,ref,ref1,ref2,tag;if(tag=_token2[0],conditionTag=(\"->\"===tag||\"=>\"===tag)&&this.findTagsBackwards(i,[\"IF\",\"WHILE\",\"FOR\",\"UNTIL\",\"SWITCH\",\"WHEN\",\"LEADING_WHEN\",\"[\",\"INDEX_START\"])&&!this.findTagsBackwards(i,[\"THEN\",\"..\",\"...\"]),\"TERMINATOR\"===tag){if(\"ELSE\"===this.tag(i+1)&&\"OUTDENT\"!==this.tag(i-1))return tokens.splice.apply(tokens,[i,1].concat(_toConsumableArray(this.indentation()))),1;if(ref=this.tag(i+1),0<=indexOf.call(EXPRESSION_CLOSE,ref))return\";\"===token[1]&&\"OUTDENT\"===this.tag(i+1)&&(tokens[i+1].prevToken=token,moveComments(token,tokens[i+1])),tokens.splice(i,1),0}if(\"CATCH\"===tag)for(j=k=1;2>=k;j=++k)if(\"OUTDENT\"===(ref1=this.tag(i+j))||\"TERMINATOR\"===ref1||\"FINALLY\"===ref1)return tokens.splice.apply(tokens,[i+j,0].concat(_toConsumableArray(this.indentation()))),2+j;if((\"->\"===tag||\"=>\"===tag)&&(\",\"===(ref2=this.tag(i+1))||\"]\"===ref2||\".\"===this.tag(i+1)&&token.newLine)){var _this$indentation=this.indentation(tokens[i]),_this$indentation2=_slicedToArray(_this$indentation,2);return indent=_this$indentation2[0],outdent=_this$indentation2[1],tokens.splice(i+1,0,indent,outdent),1}if(0<=indexOf.call(SINGLE_LINERS,tag)&&\"INDENT\"!==this.tag(i+1)&&(\"ELSE\"!==tag||\"IF\"!==this.tag(i+1))&&!conditionTag){starter=tag;var _this$indentation3=this.indentation(tokens[i]),_this$indentation4=_slicedToArray(_this$indentation3,2);return indent=_this$indentation4[0],outdent=_this$indentation4[1],\"THEN\"===starter&&(indent.fromThen=!0),\"THEN\"===tag&&(leading_switch_when=this.findTagsBackwards(i,[\"LEADING_WHEN\"])&&\"IF\"===this.tag(i+1),leading_if_then=this.findTagsBackwards(i,[\"IF\"])&&\"IF\"===this.tag(i+1)),\"THEN\"===tag&&this.findTagsBackwards(i,[\"IF\"])&&ifThens.push(i),\"ELSE\"===tag&&\"OUTDENT\"!==this.tag(i-1)&&(i=closeElseTag(tokens,i)),tokens.splice(i+1,0,indent),this.detectEnd(i+2,condition,action),\"THEN\"===tag&&tokens.splice(i,1),1}return 1})}},{key:\"tagPostfixConditionals\",value:function tagPostfixConditionals(){var action,condition,original;return original=null,condition=function(token,i){var _token3=_slicedToArray(token,1),prevTag,tag;tag=_token3[0];var _this$tokens=_slicedToArray(this.tokens[i-1],1);return prevTag=_this$tokens[0],\"TERMINATOR\"===tag||\"INDENT\"===tag&&0>indexOf.call(SINGLE_LINERS,prevTag)},action=function(token){if(\"INDENT\"!==token[0]||token.generated&&!token.fromThen)return original[0]=\"POST_\"+original[0]},this.scanTokens(function(token,i){return\"IF\"===token[0]?(original=token,this.detectEnd(i+1,condition,action),1):1})}},{key:\"exposeTokenDataToGrammar\",value:function exposeTokenDataToGrammar(){return this.scanTokens(function(token){var key,ref,ref1,val;if(token.generated||token.data&&0!==Object.keys(token.data).length){for(key in token[1]=new String(token[1]),ref1=null==(ref=token.data)?{}:ref,ref1)hasProp.call(ref1,key)&&(val=ref1[key],token[1][key]=val);token.generated&&(token[1].generated=!0)}return 1})}},{key:\"indentation\",value:function indentation(origin){var indent,outdent;return indent=[\"INDENT\",2],outdent=[\"OUTDENT\",2],origin?(indent.generated=outdent.generated=!0,indent.origin=outdent.origin=origin):indent.explicit=outdent.explicit=!0,[indent,outdent]}},{key:\"tag\",value:function tag(i){var ref;return null==(ref=this.tokens[i])?void 0:ref[0]}}]),Rewriter}();return Rewriter.prototype.generate=generate,Rewriter}.call(this),BALANCED_PAIRS=[[\"(\",\")\"],[\"[\",\"]\"],[\"{\",\"}\"],[\"INDENT\",\"OUTDENT\"],[\"CALL_START\",\"CALL_END\"],[\"PARAM_START\",\"PARAM_END\"],[\"INDEX_START\",\"INDEX_END\"],[\"STRING_START\",\"STRING_END\"],[\"INTERPOLATION_START\",\"INTERPOLATION_END\"],[\"REGEX_START\",\"REGEX_END\"]],exports.INVERSES=INVERSES={},EXPRESSION_START=[],EXPRESSION_END=[],(k=0,len=BALANCED_PAIRS.length);k<len;k++){var _BALANCED_PAIRS$k=_slicedToArray(BALANCED_PAIRS[k],2);left=_BALANCED_PAIRS$k[0],right=_BALANCED_PAIRS$k[1],EXPRESSION_START.push(INVERSES[right]=left),EXPRESSION_END.push(INVERSES[left]=right)}EXPRESSION_CLOSE=[\"CATCH\",\"THEN\",\"ELSE\",\"FINALLY\"].concat(EXPRESSION_END),IMPLICIT_FUNC=[\"IDENTIFIER\",\"PROPERTY\",\"SUPER\",\")\",\"CALL_END\",\"]\",\"INDEX_END\",\"@\",\"THIS\"],IMPLICIT_CALL=[\"IDENTIFIER\",\"JSX_TAG\",\"PROPERTY\",\"NUMBER\",\"INFINITY\",\"NAN\",\"STRING\",\"STRING_START\",\"REGEX\",\"REGEX_START\",\"JS\",\"NEW\",\"PARAM_START\",\"CLASS\",\"IF\",\"TRY\",\"SWITCH\",\"THIS\",\"DYNAMIC_IMPORT\",\"IMPORT_META\",\"NEW_TARGET\",\"UNDEFINED\",\"NULL\",\"BOOL\",\"UNARY\",\"DO\",\"DO_IIFE\",\"YIELD\",\"AWAIT\",\"UNARY_MATH\",\"SUPER\",\"THROW\",\"@\",\"->\",\"=>\",\"[\",\"(\",\"{\",\"--\",\"++\"],IMPLICIT_UNSPACED_CALL=[\"+\",\"-\"],IMPLICIT_END=[\"POST_IF\",\"FOR\",\"WHILE\",\"UNTIL\",\"WHEN\",\"BY\",\"LOOP\",\"TERMINATOR\"],SINGLE_LINERS=[\"ELSE\",\"->\",\"=>\",\"TRY\",\"FINALLY\",\"THEN\"],SINGLE_CLOSERS=[\"TERMINATOR\",\"CATCH\",\"FINALLY\",\"ELSE\",\"OUTDENT\",\"LEADING_WHEN\"],LINEBREAKS=[\"TERMINATOR\",\"INDENT\",\"OUTDENT\"],CALL_CLOSERS=[\".\",\"?.\",\"::\",\"?::\"],CONTROL_IN_IMPLICIT=[\"IF\",\"TRY\",\"FINALLY\",\"CATCH\",\"CLASS\",\"SWITCH\"],DISCARDED=[\"(\",\")\",\"[\",\"]\",\"{\",\"}\",\":\",\".\",\"..\",\"...\",\",\",\"=\",\"++\",\"--\",\"?\",\"AS\",\"AWAIT\",\"CALL_START\",\"CALL_END\",\"DEFAULT\",\"DO\",\"DO_IIFE\",\"ELSE\",\"EXTENDS\",\"EXPORT\",\"FORIN\",\"FOROF\",\"FORFROM\",\"IMPORT\",\"INDENT\",\"INDEX_SOAK\",\"INTERPOLATION_START\",\"INTERPOLATION_END\",\"LEADING_WHEN\",\"OUTDENT\",\"PARAM_END\",\"REGEX_START\",\"REGEX_END\",\"RETURN\",\"STRING_END\",\"THROW\",\"UNARY\",\"YIELD\"].concat(IMPLICIT_UNSPACED_CALL.concat(IMPLICIT_END.concat(CALL_CLOSERS.concat(CONTROL_IN_IMPLICIT)))),exports.UNFINISHED=UNFINISHED=[\"\\\\\",\".\",\"?.\",\"?::\",\"UNARY\",\"DO\",\"DO_IIFE\",\"MATH\",\"UNARY_MATH\",\"+\",\"-\",\"**\",\"SHIFT\",\"RELATION\",\"COMPARE\",\"&\",\"^\",\"|\",\"&&\",\"||\",\"BIN?\",\"EXTENDS\"]}.call(this),{exports:exports}.exports}(),require[\"./lexer\"]=function(){var exports={};return function(){var indexOf=[].indexOf,slice=[].slice,_require2=require(\"./rewriter\"),BOM,BOOL,CALLABLE,CODE,COFFEE_ALIASES,COFFEE_ALIAS_MAP,COFFEE_KEYWORDS,COMMENT,COMPARABLE_LEFT_SIDE,COMPARE,COMPOUND_ASSIGN,HERECOMMENT_ILLEGAL,HEREDOC_DOUBLE,HEREDOC_INDENT,HEREDOC_SINGLE,HEREGEX,HEREGEX_COMMENT,HERE_JSTOKEN,IDENTIFIER,INDENTABLE_CLOSERS,INDEXABLE,INSIDE_JSX,INVERSES,JSTOKEN,JSX_ATTRIBUTE,JSX_FRAGMENT_IDENTIFIER,JSX_IDENTIFIER,JSX_IDENTIFIER_PART,JSX_INTERPOLATION,JS_KEYWORDS,LINE_BREAK,LINE_CONTINUER,Lexer,MATH,MULTI_DENT,NOT_REGEX,NUMBER,OPERATOR,POSSIBLY_DIVISION,REGEX,REGEX_FLAGS,REGEX_ILLEGAL,REGEX_INVALID_ESCAPE,RELATION,RESERVED,Rewriter,SHIFT,STRICT_PROSCRIBED,STRING_DOUBLE,STRING_INVALID_ESCAPE,STRING_SINGLE,STRING_START,TRAILING_SPACES,UNARY,UNARY_MATH,UNFINISHED,VALID_FLAGS,WHITESPACE,addTokenData,attachCommentsToNode,compact,count,flatten,invertLiterate,isForFrom,isUnassignable,key,locationDataToString,merge,parseNumber,repeat,replaceUnicodeCodePointEscapes,starts,throwSyntaxError;Rewriter=_require2.Rewriter,INVERSES=_require2.INVERSES,UNFINISHED=_require2.UNFINISHED;var _require3=require(\"./helpers\");count=_require3.count,starts=_require3.starts,compact=_require3.compact,repeat=_require3.repeat,invertLiterate=_require3.invertLiterate,merge=_require3.merge,attachCommentsToNode=_require3.attachCommentsToNode,locationDataToString=_require3.locationDataToString,throwSyntaxError=_require3.throwSyntaxError,replaceUnicodeCodePointEscapes=_require3.replaceUnicodeCodePointEscapes,flatten=_require3.flatten,parseNumber=_require3.parseNumber,exports.Lexer=Lexer=function(){function Lexer(){_classCallCheck(this,Lexer),this.error=this.error.bind(this)}return _createClass(Lexer,[{key:\"tokenize\",value:function tokenize(code){var opts=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},consumed,end,i,ref;for(this.literate=opts.literate,this.indent=0,this.baseIndent=0,this.continuationLineAdditionalIndent=0,this.outdebt=0,this.indents=[],this.indentLiteral=\"\",this.ends=[],this.tokens=[],this.seenFor=!1,this.seenImport=!1,this.seenExport=!1,this.importSpecifierList=!1,this.exportSpecifierList=!1,this.jsxDepth=0,this.jsxObjAttribute={},this.chunkLine=opts.line||0,this.chunkColumn=opts.column||0,this.chunkOffset=opts.offset||0,this.locationDataCompensations=opts.locationDataCompensations||{},code=this.clean(code),i=0;this.chunk=code.slice(i);){consumed=this.identifierToken()||this.commentToken()||this.whitespaceToken()||this.lineToken()||this.stringToken()||this.numberToken()||this.jsxToken()||this.regexToken()||this.jsToken()||this.literalToken();var _this$getLineAndColum=this.getLineAndColumnFromChunk(consumed),_this$getLineAndColum2=_slicedToArray(_this$getLineAndColum,3);if(this.chunkLine=_this$getLineAndColum2[0],this.chunkColumn=_this$getLineAndColum2[1],this.chunkOffset=_this$getLineAndColum2[2],i+=consumed,opts.untilBalanced&&0===this.ends.length)return{tokens:this.tokens,index:i}}return this.closeIndentation(),(end=this.ends.pop())&&this.error(\"missing \".concat(end.tag),(null==(ref=end.origin)?end:ref)[2]),!1===opts.rewrite?this.tokens:new Rewriter().rewrite(this.tokens)}},{key:\"clean\",value:function clean(code){var _this4=this,base,thusFar;return thusFar=0,code.charCodeAt(0)===BOM&&(code=code.slice(1),this.locationDataCompensations[0]=1,thusFar+=1),WHITESPACE.test(code)&&(code=\"\\n\".concat(code),this.chunkLine--,null==(base=this.locationDataCompensations)[0]&&(base[0]=0),this.locationDataCompensations[0]-=1),code=code.replace(/\\r/g,function(match,offset){return _this4.locationDataCompensations[thusFar+offset]=1,\"\"}).replace(TRAILING_SPACES,\"\"),this.literate&&(code=invertLiterate(code)),code}},{key:\"identifierToken\",value:function identifierToken(){var alias,colon,colonOffset,colonToken,id,idLength,inJSXTag,input,match,poppedToken,prev,prevprev,ref,ref1,ref10,ref11,ref12,ref2,ref3,ref4,ref5,ref6,ref7,ref8,ref9,regExSuper,regex,sup,tag,tagToken,tokenData;if(inJSXTag=this.atJSXTag(),regex=inJSXTag?JSX_ATTRIBUTE:IDENTIFIER,!(match=regex.exec(this.chunk)))return 0;var _match=match,_match2=_slicedToArray(_match,3);if(input=_match2[0],id=_match2[1],colon=_match2[2],idLength=id.length,poppedToken=void 0,\"own\"===id&&\"FOR\"===this.tag())return this.token(\"OWN\",id),id.length;if(\"from\"===id&&\"YIELD\"===this.tag())return this.token(\"FROM\",id),id.length;if(\"as\"===id&&this.seenImport){if(\"*\"===this.value())this.tokens[this.tokens.length-1][0]=\"IMPORT_ALL\";else if(ref=this.value(!0),0<=indexOf.call(COFFEE_KEYWORDS,ref)){prev=this.prev();var _ref7=[\"IDENTIFIER\",this.value(!0)];prev[0]=_ref7[0],prev[1]=_ref7[1]}if(\"DEFAULT\"===(ref1=this.tag())||\"IMPORT_ALL\"===ref1||\"IDENTIFIER\"===ref1)return this.token(\"AS\",id),id.length}if(\"as\"===id&&this.seenExport){if(\"IDENTIFIER\"===(ref2=this.tag())||\"DEFAULT\"===ref2)return this.token(\"AS\",id),id.length;if(ref3=this.value(!0),0<=indexOf.call(COFFEE_KEYWORDS,ref3)){prev=this.prev();var _ref8=[\"IDENTIFIER\",this.value(!0)];return prev[0]=_ref8[0],prev[1]=_ref8[1],this.token(\"AS\",id),id.length}}if(\"default\"===id&&this.seenExport&&(\"EXPORT\"===(ref4=this.tag())||\"AS\"===ref4))return this.token(\"DEFAULT\",id),id.length;if(\"assert\"===id&&(this.seenImport||this.seenExport)&&\"STRING\"===this.tag())return this.token(\"ASSERT\",id),id.length;if(\"do\"===id&&(regExSuper=/^(\\s*super)(?!\\(\\))/.exec(this.chunk.slice(3)))){this.token(\"SUPER\",\"super\"),this.token(\"CALL_START\",\"(\"),this.token(\"CALL_END\",\")\");var _regExSuper=regExSuper,_regExSuper2=_slicedToArray(_regExSuper,2);return input=_regExSuper2[0],sup=_regExSuper2[1],sup.length+3}if(prev=this.prev(),tag=colon||null!=prev&&(\".\"===(ref5=prev[0])||\"?.\"===ref5||\"::\"===ref5||\"?::\"===ref5||!prev.spaced&&\"@\"===prev[0])?\"PROPERTY\":\"IDENTIFIER\",tokenData={},\"IDENTIFIER\"===tag&&(0<=indexOf.call(JS_KEYWORDS,id)||0<=indexOf.call(COFFEE_KEYWORDS,id))&&!(this.exportSpecifierList&&0<=indexOf.call(COFFEE_KEYWORDS,id))?(tag=id.toUpperCase(),\"WHEN\"===tag&&(ref6=this.tag(),0<=indexOf.call(LINE_BREAK,ref6))?tag=\"LEADING_WHEN\":\"FOR\"===tag?this.seenFor={endsLength:this.ends.length}:\"UNLESS\"===tag?tag=\"IF\":\"IMPORT\"===tag?this.seenImport=!0:\"EXPORT\"===tag?this.seenExport=!0:0<=indexOf.call(UNARY,tag)?tag=\"UNARY\":0<=indexOf.call(RELATION,tag)&&(\"INSTANCEOF\"!==tag&&this.seenFor?(tag=\"FOR\"+tag,this.seenFor=!1):(tag=\"RELATION\",\"!\"===this.value()&&(poppedToken=this.tokens.pop(),tokenData.invert=null==(ref7=null==(ref8=poppedToken.data)?void 0:ref8.original)?poppedToken[1]:ref7)))):\"IDENTIFIER\"===tag&&this.seenFor&&\"from\"===id&&isForFrom(prev)?(tag=\"FORFROM\",this.seenFor=!1):\"PROPERTY\"===tag&&prev&&(prev.spaced&&(ref9=prev[0],0<=indexOf.call(CALLABLE,ref9))&&/^[gs]et$/.test(prev[1])&&1<this.tokens.length&&\".\"!==(ref10=this.tokens[this.tokens.length-2][0])&&\"?.\"!==ref10&&\"@\"!==ref10?this.error(\"'\".concat(prev[1],\"' cannot be used as a keyword, or as a function call without parentheses\"),prev[2]):\".\"===prev[0]&&1<this.tokens.length&&\"UNARY\"===(prevprev=this.tokens[this.tokens.length-2])[0]&&\"new\"===prevprev[1]?prevprev[0]=\"NEW_TARGET\":\".\"===prev[0]&&1<this.tokens.length&&\"IMPORT\"===(prevprev=this.tokens[this.tokens.length-2])[0]&&\"import\"===prevprev[1]?(this.seenImport=!1,prevprev[0]=\"IMPORT_META\"):2<this.tokens.length&&(prevprev=this.tokens[this.tokens.length-2],(\"@\"===(ref11=prev[0])||\"THIS\"===ref11)&&prevprev&&prevprev.spaced&&/^[gs]et$/.test(prevprev[1])&&\".\"!==(ref12=this.tokens[this.tokens.length-3][0])&&\"?.\"!==ref12&&\"@\"!==ref12&&this.error(\"'\".concat(prevprev[1],\"' cannot be used as a keyword, or as a function call without parentheses\"),prevprev[2]))),\"IDENTIFIER\"===tag&&0<=indexOf.call(RESERVED,id)&&!inJSXTag&&this.error(\"reserved word '\".concat(id,\"'\"),{length:id.length}),\"PROPERTY\"===tag||this.exportSpecifierList||this.importSpecifierList||(0<=indexOf.call(COFFEE_ALIASES,id)&&(alias=id,id=COFFEE_ALIAS_MAP[id],tokenData.original=alias),tag=function(){return\"!\"===id?\"UNARY\":\"==\"===id||\"!=\"===id?\"COMPARE\":\"true\"===id||\"false\"===id?\"BOOL\":\"break\"===id||\"continue\"===id||\"debugger\"===id?\"STATEMENT\":\"&&\"===id||\"||\"===id?id:tag}()),tagToken=this.token(tag,id,{length:idLength,data:tokenData}),alias&&(tagToken.origin=[tag,alias,tagToken[2]]),poppedToken){var _ref9=[poppedToken[2].first_line,poppedToken[2].first_column,poppedToken[2].range[0]];tagToken[2].first_line=_ref9[0],tagToken[2].first_column=_ref9[1],tagToken[2].range[0]=_ref9[2]}return colon&&(colonOffset=input.lastIndexOf(inJSXTag?\"=\":\":\"),colonToken=this.token(\":\",\":\",{offset:colonOffset}),inJSXTag&&(colonToken.jsxColon=!0)),inJSXTag&&\"IDENTIFIER\"===tag&&\":\"!==prev[0]&&this.token(\",\",\",\",{length:0,origin:tagToken,generated:!0}),input.length}},{key:\"numberToken\",value:function numberToken(){var lexedLength,match,number,parsedValue,tag,tokenData;if(!(match=NUMBER.exec(this.chunk)))return 0;switch(number=match[0],lexedLength=number.length,!1){case!/^0[BOX]/.test(number):this.error(\"radix prefix in '\".concat(number,\"' must be lowercase\"),{offset:1});break;case!/^0\\d*[89]/.test(number):this.error(\"decimal literal '\".concat(number,\"' must not be prefixed with '0'\"),{length:lexedLength});break;case!/^0\\d+/.test(number):this.error(\"octal literal '\".concat(number,\"' must be prefixed with '0o'\"),{length:lexedLength});}return parsedValue=parseNumber(number),tokenData={parsedValue:parsedValue},tag=2e308===parsedValue?\"INFINITY\":\"NUMBER\",\"INFINITY\"===tag&&(tokenData.original=number),this.token(tag,number,{length:lexedLength,data:tokenData}),lexedLength}},{key:\"stringToken\",value:function stringToken(){var _this5=this,_ref10=STRING_START.exec(this.chunk)||[],_ref11=_slicedToArray(_ref10,1),attempt,delimiter,doc,end,heredoc,i,indent,match,prev,quote,ref,regex,token,tokens;if(quote=_ref11[0],!quote)return 0;prev=this.prev(),prev&&\"from\"===this.value()&&(this.seenImport||this.seenExport)&&(prev[0]=\"FROM\"),regex=function(){return\"'\"===quote?STRING_SINGLE:\"\\\"\"===quote?STRING_DOUBLE:\"'''\"===quote?HEREDOC_SINGLE:\"\\\"\\\"\\\"\"===quote?HEREDOC_DOUBLE:void 0}();var _this$matchWithInterp=this.matchWithInterpolations(regex,quote);if(tokens=_this$matchWithInterp.tokens,end=_this$matchWithInterp.index,heredoc=3===quote.length,heredoc)for(indent=null,doc=function(){var j,len,results;for(results=[],i=j=0,len=tokens.length;j<len;i=++j)token=tokens[i],\"NEOSTRING\"===token[0]&&results.push(token[1]);return results}().join(\"#{}\");match=HEREDOC_INDENT.exec(doc);)attempt=match[1],(null===indent||0<(ref=attempt.length)&&ref<indent.length)&&(indent=attempt);return delimiter=quote.charAt(0),this.mergeInterpolationTokens(tokens,{quote:quote,indent:indent,endOffset:end},function(value){return _this5.validateUnicodeCodePointEscapes(value,{delimiter:quote})}),this.atJSXTag()&&this.token(\",\",\",\",{length:0,origin:this.prev,generated:!0}),end}},{key:\"commentToken\",value:function commentToken(){var chunk=0<arguments.length&&void 0!==arguments[0]?arguments[0]:this.chunk,_ref12=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},heregex=_ref12.heregex,_ref12$returnCommentT=_ref12.returnCommentTokens,_ref12$offsetInChunk=_ref12.offsetInChunk,offsetInChunk=void 0===_ref12$offsetInChunk?0:_ref12$offsetInChunk,commentAttachment,commentAttachments,commentWithSurroundingWhitespace,content,contents,getIndentSize,hasSeenFirstCommentLine,hereComment,hereLeadingWhitespace,hereTrailingWhitespace,i,indentSize,leadingNewline,leadingNewlineOffset,leadingNewlines,leadingWhitespace,length,lineComment,match,matchIllegal,noIndent,nonInitial,placeholderToken,precededByBlankLine,precedingNonCommentLines,prev;if(!(match=chunk.match(COMMENT)))return 0;var _match3=match,_match4=_slicedToArray(_match3,5);return commentWithSurroundingWhitespace=_match4[0],hereLeadingWhitespace=_match4[1],hereComment=_match4[2],hereTrailingWhitespace=_match4[3],lineComment=_match4[4],contents=null,leadingNewline=/^\\s*\\n+\\s*#/.test(commentWithSurroundingWhitespace),hereComment?(matchIllegal=HERECOMMENT_ILLEGAL.exec(hereComment),matchIllegal&&this.error(\"block comments cannot contain \".concat(matchIllegal[0]),{offset:\"###\".length+matchIllegal.index,length:matchIllegal[0].length}),chunk=chunk.replace(\"###\".concat(hereComment,\"###\"),\"\"),chunk=chunk.replace(/^\\n+/,\"\"),this.lineToken({chunk:chunk}),content=hereComment,contents=[{content:content,length:commentWithSurroundingWhitespace.length-hereLeadingWhitespace.length-hereTrailingWhitespace.length,leadingWhitespace:hereLeadingWhitespace}]):(leadingNewlines=\"\",content=lineComment.replace(/^(\\n*)/,function(leading){return leadingNewlines=leading,\"\"}),precedingNonCommentLines=\"\",hasSeenFirstCommentLine=!1,contents=content.split(\"\\n\").map(function(line){var comment,leadingWhitespace;return-1<line.indexOf(\"#\")?(leadingWhitespace=\"\",content=line.replace(/^([ |\\t]*)#/,function(_,whitespace){return leadingWhitespace=whitespace,\"\"}),comment={content:content,length:\"#\".length+content.length,leadingWhitespace:\"\".concat(hasSeenFirstCommentLine?\"\":leadingNewlines).concat(precedingNonCommentLines).concat(leadingWhitespace),precededByBlankLine:!!precedingNonCommentLines},hasSeenFirstCommentLine=!0,precedingNonCommentLines=\"\",comment):void(precedingNonCommentLines+=\"\\n\".concat(line))}).filter(function(comment){return comment})),getIndentSize=function(_ref13){var leadingWhitespace=_ref13.leadingWhitespace,nonInitial=_ref13.nonInitial,lastNewlineIndex;if(lastNewlineIndex=leadingWhitespace.lastIndexOf(\"\\n\"),null==hereComment&&nonInitial)null==lastNewlineIndex&&(lastNewlineIndex=-1);else if(!(-1<lastNewlineIndex))return null;return leadingWhitespace.length-1-lastNewlineIndex},commentAttachments=function(){var j,len,results;for(results=[],i=j=0,len=contents.length;j<len;i=++j){var _contents$i=contents[i];content=_contents$i.content,length=_contents$i.length,leadingWhitespace=_contents$i.leadingWhitespace,precededByBlankLine=_contents$i.precededByBlankLine,nonInitial=0!==i,leadingNewlineOffset=nonInitial?1:0,offsetInChunk+=leadingNewlineOffset+leadingWhitespace.length,indentSize=getIndentSize({leadingWhitespace:leadingWhitespace,nonInitial:nonInitial}),noIndent=null==indentSize||-1===indentSize,commentAttachment={content:content,here:null!=hereComment,newLine:leadingNewline||nonInitial,locationData:this.makeLocationData({offsetInChunk:offsetInChunk,length:length}),precededByBlankLine:precededByBlankLine,indentSize:indentSize,indented:!noIndent&&indentSize>this.indent,outdented:!noIndent&&indentSize<this.indent},heregex&&(commentAttachment.heregex=!0),offsetInChunk+=length,results.push(commentAttachment)}return results}.call(this),prev=this.prev(),prev?attachCommentsToNode(commentAttachments,prev):(commentAttachments[0].newLine=!0,this.lineToken({chunk:this.chunk.slice(commentWithSurroundingWhitespace.length),offset:commentWithSurroundingWhitespace.length}),placeholderToken=this.makeToken(\"JS\",\"\",{offset:commentWithSurroundingWhitespace.length,generated:!0}),placeholderToken.comments=commentAttachments,this.tokens.push(placeholderToken),this.newlineToken(commentWithSurroundingWhitespace.length)),void 0!==_ref12$returnCommentT&&_ref12$returnCommentT?commentAttachments:commentWithSurroundingWhitespace.length}},{key:\"jsToken\",value:function jsToken(){var length,match,matchedHere,script;return\"`\"===this.chunk.charAt(0)&&(match=(matchedHere=HERE_JSTOKEN.exec(this.chunk))||JSTOKEN.exec(this.chunk))?(script=match[1],length=match[0].length,this.token(\"JS\",script,{length:length,data:{here:!!matchedHere}}),length):0}},{key:\"regexToken\",value:function regexToken(){var _this6=this,body,closed,comment,commentIndex,commentOpts,commentTokens,comments,delimiter,end,flags,fullMatch,index,leadingWhitespace,match,matchedComment,origin,prev,ref,ref1,regex,tokens;switch(!1){case!(match=REGEX_ILLEGAL.exec(this.chunk)):this.error(\"regular expressions cannot begin with \".concat(match[2]),{offset:match.index+match[1].length});break;case!(match=this.matchWithInterpolations(HEREGEX,\"///\")):var _match5=match;for(tokens=_match5.tokens,index=_match5.index,comments=[];matchedComment=HEREGEX_COMMENT.exec(this.chunk.slice(0,index));){var _matchedComment=matchedComment;commentIndex=_matchedComment.index;var _matchedComment2=matchedComment,_matchedComment3=_slicedToArray(_matchedComment2,3);fullMatch=_matchedComment3[0],leadingWhitespace=_matchedComment3[1],comment=_matchedComment3[2],comments.push({comment:comment,offsetInChunk:commentIndex+leadingWhitespace.length})}commentTokens=flatten(function(){var j,len,results;for(results=[],j=0,len=comments.length;j<len;j++)commentOpts=comments[j],results.push(this.commentToken(commentOpts.comment,Object.assign(commentOpts,{heregex:!0,returnCommentTokens:!0})));return results}.call(this));break;case!(match=REGEX.exec(this.chunk)):var _match6=match,_match7=_slicedToArray(_match6,3);if(regex=_match7[0],body=_match7[1],closed=_match7[2],this.validateEscapes(body,{isRegex:!0,offsetInChunk:1}),index=regex.length,prev=this.prev(),prev)if(prev.spaced&&(ref=prev[0],0<=indexOf.call(CALLABLE,ref))){if(!closed||POSSIBLY_DIVISION.test(regex))return 0;}else if(ref1=prev[0],0<=indexOf.call(NOT_REGEX,ref1))return 0;closed||this.error(\"missing / (unclosed regex)\");break;default:return 0;}var _REGEX_FLAGS$exec=REGEX_FLAGS.exec(this.chunk.slice(index)),_REGEX_FLAGS$exec2=_slicedToArray(_REGEX_FLAGS$exec,1);switch(flags=_REGEX_FLAGS$exec2[0],end=index+flags.length,origin=this.makeToken(\"REGEX\",null,{length:end}),!1){case!!VALID_FLAGS.test(flags):this.error(\"invalid regular expression flags \".concat(flags),{offset:index,length:flags.length});break;case!(regex||1===tokens.length):delimiter=body?\"/\":\"///\",null==body&&(body=tokens[0][1]),this.validateUnicodeCodePointEscapes(body,{delimiter:delimiter}),this.token(\"REGEX\",\"/\".concat(body,\"/\").concat(flags),{length:end,origin:origin,data:{delimiter:delimiter}});break;default:this.token(\"REGEX_START\",\"(\",{length:0,origin:origin,generated:!0}),this.token(\"IDENTIFIER\",\"RegExp\",{length:0,generated:!0}),this.token(\"CALL_START\",\"(\",{length:0,generated:!0}),this.mergeInterpolationTokens(tokens,{double:!0,heregex:{flags:flags},endOffset:end-flags.length,quote:\"///\"},function(str){return _this6.validateUnicodeCodePointEscapes(str,{delimiter:delimiter})}),flags&&(this.token(\",\",\",\",{offset:index-1,length:0,generated:!0}),this.token(\"STRING\",\"\\\"\"+flags+\"\\\"\",{offset:index,length:flags.length})),this.token(\")\",\")\",{offset:end,length:0,generated:!0}),this.token(\"REGEX_END\",\")\",{offset:end,length:0,generated:!0});}return(null==commentTokens?void 0:commentTokens.length)&&addTokenData(this.tokens[this.tokens.length-1],{heregexCommentTokens:commentTokens}),end}},{key:\"lineToken\",value:function lineToken(){var _Mathmin=Math.min,_ref14=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},_ref14$chunk=_ref14.chunk,chunk=void 0===_ref14$chunk?this.chunk:_ref14$chunk,_ref14$offset=_ref14.offset,offset=void 0===_ref14$offset?0:_ref14$offset,backslash,diff,endsContinuationLineIndentation,indent,match,minLiteralLength,newIndentLiteral,noNewlines,prev,ref,size;if(!(match=MULTI_DENT.exec(chunk)))return 0;if(indent=match[0],prev=this.prev(),backslash=\"\\\\\"===(null==prev?void 0:prev[0]),(backslash||(null==(ref=this.seenFor)?void 0:ref.endsLength)<this.ends.length)&&this.seenFor||(this.seenFor=!1),backslash&&this.seenImport||this.importSpecifierList||(this.seenImport=!1),backslash&&this.seenExport||this.exportSpecifierList||(this.seenExport=!1),size=indent.length-1-indent.lastIndexOf(\"\\n\"),noNewlines=this.unfinished(),newIndentLiteral=0<size?indent.slice(-size):\"\",!/^(.?)\\1*$/.exec(newIndentLiteral))return this.error(\"mixed indentation\",{offset:indent.length}),indent.length;if(minLiteralLength=_Mathmin(newIndentLiteral.length,this.indentLiteral.length),newIndentLiteral.slice(0,minLiteralLength)!==this.indentLiteral.slice(0,minLiteralLength))return this.error(\"indentation mismatch\",{offset:indent.length}),indent.length;if(size-this.continuationLineAdditionalIndent===this.indent)return noNewlines?this.suppressNewlines():this.newlineToken(offset),indent.length;if(size>this.indent){if(noNewlines)return backslash||(this.continuationLineAdditionalIndent=size-this.indent),this.continuationLineAdditionalIndent&&(prev.continuationLineIndent=this.indent+this.continuationLineAdditionalIndent),this.suppressNewlines(),indent.length;if(!this.tokens.length)return this.baseIndent=this.indent=size,this.indentLiteral=newIndentLiteral,indent.length;diff=size-this.indent+this.outdebt,this.token(\"INDENT\",diff,{offset:offset+indent.length-size,length:size}),this.indents.push(diff),this.ends.push({tag:\"OUTDENT\"}),this.outdebt=this.continuationLineAdditionalIndent=0,this.indent=size,this.indentLiteral=newIndentLiteral}else size<this.baseIndent?this.error(\"missing indentation\",{offset:offset+indent.length}):(endsContinuationLineIndentation=0<this.continuationLineAdditionalIndent,this.continuationLineAdditionalIndent=0,this.outdentToken({moveOut:this.indent-size,noNewlines:noNewlines,outdentLength:indent.length,offset:offset,indentSize:size,endsContinuationLineIndentation:endsContinuationLineIndentation}));return indent.length}},{key:\"outdentToken\",value:function outdentToken(_ref15){var moveOut=_ref15.moveOut,noNewlines=_ref15.noNewlines,_ref15$outdentLength=_ref15.outdentLength,outdentLength=void 0===_ref15$outdentLength?0:_ref15$outdentLength,_ref15$offset=_ref15.offset,offset=void 0===_ref15$offset?0:_ref15$offset,indentSize=_ref15.indentSize,endsContinuationLineIndentation=_ref15.endsContinuationLineIndentation,decreasedIndent,dent,lastIndent,ref,terminatorToken;for(decreasedIndent=this.indent-moveOut;0<moveOut;)lastIndent=this.indents[this.indents.length-1],lastIndent?this.outdebt&&moveOut<=this.outdebt?(this.outdebt-=moveOut,moveOut=0):(dent=this.indents.pop()+this.outdebt,outdentLength&&(ref=this.chunk[outdentLength],0<=indexOf.call(INDENTABLE_CLOSERS,ref))&&(decreasedIndent-=dent-moveOut,moveOut=dent),this.outdebt=0,this.pair(\"OUTDENT\"),this.token(\"OUTDENT\",moveOut,{length:outdentLength,indentSize:indentSize+moveOut-dent}),moveOut-=dent):this.outdebt=moveOut=0;return dent&&(this.outdebt-=moveOut),this.suppressSemicolons(),\"TERMINATOR\"===this.tag()||noNewlines||(terminatorToken=this.token(\"TERMINATOR\",\"\\n\",{offset:offset+outdentLength,length:0}),endsContinuationLineIndentation&&(terminatorToken.endsContinuationLineIndentation={preContinuationLineIndent:this.indent})),this.indent=decreasedIndent,this.indentLiteral=this.indentLiteral.slice(0,decreasedIndent),this}},{key:\"whitespaceToken\",value:function whitespaceToken(){var match,nline,prev;return(match=WHITESPACE.exec(this.chunk))||(nline=\"\\n\"===this.chunk.charAt(0))?(prev=this.prev(),prev&&(prev[match?\"spaced\":\"newLine\"]=!0),match?match[0].length:0):0}},{key:\"newlineToken\",value:function newlineToken(offset){return this.suppressSemicolons(),\"TERMINATOR\"!==this.tag()&&this.token(\"TERMINATOR\",\"\\n\",{offset:offset,length:0}),this}},{key:\"suppressNewlines\",value:function suppressNewlines(){var prev;return prev=this.prev(),\"\\\\\"===prev[1]&&(prev.comments&&1<this.tokens.length&&attachCommentsToNode(prev.comments,this.tokens[this.tokens.length-2]),this.tokens.pop()),this}},{key:\"jsxToken\",value:function jsxToken(){var _this7=this,afterTag,end,endToken,firstChar,fullId,fullTagName,id,input,j,jsxTag,len,match,offset,openingTagToken,prev,prevChar,properties,property,ref,tagToken,token,tokens;if(firstChar=this.chunk[0],prevChar=0<this.tokens.length?this.tokens[this.tokens.length-1][0]:\"\",\"<\"===firstChar){if(match=JSX_IDENTIFIER.exec(this.chunk.slice(1))||JSX_FRAGMENT_IDENTIFIER.exec(this.chunk.slice(1)),!(match&&(0<this.jsxDepth||!(prev=this.prev())||prev.spaced||(ref=prev[0],0>indexOf.call(COMPARABLE_LEFT_SIDE,ref)))))return 0;var _match8=match,_match9=_slicedToArray(_match8,2);if(input=_match9[0],id=_match9[1],fullId=id,0<=indexOf.call(id,\".\")){var _id$split=id.split(\".\"),_id$split2=_toArray(_id$split);id=_id$split2[0],properties=_id$split2.slice(1)}else properties=[];for(tagToken=this.token(\"JSX_TAG\",id,{length:id.length+1,data:{openingBracketToken:this.makeToken(\"<\",\"<\"),tagNameToken:this.makeToken(\"IDENTIFIER\",id,{offset:1})}}),offset=id.length+1,(j=0,len=properties.length);j<len;j++)property=properties[j],this.token(\".\",\".\",{offset:offset}),offset+=1,this.token(\"PROPERTY\",property,{offset:offset}),offset+=property.length;return this.token(\"CALL_START\",\"(\",{generated:!0}),this.token(\"[\",\"[\",{generated:!0}),this.ends.push({tag:\"/>\",origin:tagToken,name:id,properties:properties}),this.jsxDepth++,fullId.length+1}if(jsxTag=this.atJSXTag()){if(\"/>\"===this.chunk.slice(0,2))return this.pair(\"/>\"),this.token(\"]\",\"]\",{length:2,generated:!0}),this.token(\"CALL_END\",\")\",{length:2,generated:!0,data:{selfClosingSlashToken:this.makeToken(\"/\",\"/\"),closingBracketToken:this.makeToken(\">\",\">\",{offset:1})}}),this.jsxDepth--,2;if(\"{\"===firstChar)return\":\"===prevChar?(token=this.token(\"(\",\"{\"),this.jsxObjAttribute[this.jsxDepth]=!1,addTokenData(this.tokens[this.tokens.length-3],{jsx:!0})):(token=this.token(\"{\",\"{\"),this.jsxObjAttribute[this.jsxDepth]=!0),this.ends.push({tag:\"}\",origin:token}),1;if(\">\"===firstChar){var _this$pair=this.pair(\"/>\");openingTagToken=_this$pair.origin,this.token(\"]\",\"]\",{generated:!0,data:{closingBracketToken:this.makeToken(\">\",\">\")}}),this.token(\",\",\"JSX_COMMA\",{generated:!0});var _this$matchWithInterp2=this.matchWithInterpolations(INSIDE_JSX,\">\",\"</\",JSX_INTERPOLATION);tokens=_this$matchWithInterp2.tokens,end=_this$matchWithInterp2.index,this.mergeInterpolationTokens(tokens,{endOffset:end,jsx:!0},function(value){return _this7.validateUnicodeCodePointEscapes(value,{delimiter:\">\"})}),match=JSX_IDENTIFIER.exec(this.chunk.slice(end))||JSX_FRAGMENT_IDENTIFIER.exec(this.chunk.slice(end)),match&&match[1]===\"\".concat(jsxTag.name).concat(function(){var k,len1,ref1,results;for(ref1=jsxTag.properties,results=[],(k=0,len1=ref1.length);k<len1;k++)property=ref1[k],results.push(\".\".concat(property));return results}().join(\"\"))||this.error(\"expected corresponding JSX closing tag for \".concat(jsxTag.name),jsxTag.origin.data.tagNameToken[2]);var _match10=match,_match11=_slicedToArray(_match10,2);return fullTagName=_match11[1],afterTag=end+fullTagName.length,\">\"!==this.chunk[afterTag]&&this.error(\"missing closing > after tag name\",{offset:afterTag,length:1}),endToken=this.token(\"CALL_END\",\")\",{offset:end-2,length:fullTagName.length+3,generated:!0,data:{closingTagOpeningBracketToken:this.makeToken(\"<\",\"<\",{offset:end-2}),closingTagSlashToken:this.makeToken(\"/\",\"/\",{offset:end-1}),closingTagNameToken:this.makeToken(\"IDENTIFIER\",fullTagName,{offset:end}),closingTagClosingBracketToken:this.makeToken(\">\",\">\",{offset:end+fullTagName.length})}}),addTokenData(openingTagToken,endToken.data),this.jsxDepth--,afterTag+1}return 0}return this.atJSXTag(1)?\"}\"===firstChar?(this.pair(firstChar),this.jsxObjAttribute[this.jsxDepth]?(this.token(\"}\",\"}\"),this.jsxObjAttribute[this.jsxDepth]=!1):this.token(\")\",\"}\"),this.token(\",\",\",\",{generated:!0}),1):0:0}},{key:\"atJSXTag\",value:function atJSXTag(){var depth=0<arguments.length&&void 0!==arguments[0]?arguments[0]:0,i,last,ref;if(0===this.jsxDepth)return!1;for(i=this.ends.length-1;\"OUTDENT\"===(null==(ref=this.ends[i])?void 0:ref.tag)||0<depth--;)i--;return last=this.ends[i],\"/>\"===(null==last?void 0:last.tag)&&last}},{key:\"literalToken\",value:function literalToken(){var match,message,origin,prev,ref,ref1,ref2,ref3,ref4,ref5,skipToken,tag,token,value;if(match=OPERATOR.exec(this.chunk)){var _match12=match,_match13=_slicedToArray(_match12,1);value=_match13[0],CODE.test(value)&&this.tagParameters()}else value=this.chunk.charAt(0);if(tag=value,prev=this.prev(),prev&&0<=indexOf.call([\"=\"].concat(_toConsumableArray(COMPOUND_ASSIGN)),value)&&(skipToken=!1,\"=\"!==value||\"||\"!==(ref=prev[1])&&\"&&\"!==ref||prev.spaced||(prev[0]=\"COMPOUND_ASSIGN\",prev[1]+=\"=\",(null==(ref1=prev.data)?void 0:ref1.original)&&(prev.data.original+=\"=\"),prev[2].range=[prev[2].range[0],prev[2].range[1]+1],prev[2].last_column+=1,prev[2].last_column_exclusive+=1,prev=this.tokens[this.tokens.length-2],skipToken=!0),prev&&\"PROPERTY\"!==prev[0]&&(origin=null==(ref2=prev.origin)?prev:ref2,message=isUnassignable(prev[1],origin[1]),message&&this.error(message,origin[2])),skipToken))return value.length;if(\"(\"===value&&\"IMPORT\"===(null==prev?void 0:prev[0])&&(prev[0]=\"DYNAMIC_IMPORT\"),\"{\"===value&&this.seenImport?this.importSpecifierList=!0:this.importSpecifierList&&\"}\"===value?this.importSpecifierList=!1:\"{\"===value&&\"EXPORT\"===(null==prev?void 0:prev[0])?this.exportSpecifierList=!0:this.exportSpecifierList&&\"}\"===value&&(this.exportSpecifierList=!1),\";\"===value)(ref3=null==prev?void 0:prev[0],0<=indexOf.call([\"=\"].concat(_toConsumableArray(UNFINISHED)),ref3))&&this.error(\"unexpected ;\"),this.seenFor=this.seenImport=this.seenExport=!1,tag=\"TERMINATOR\";else if(\"*\"===value&&\"EXPORT\"===(null==prev?void 0:prev[0]))tag=\"EXPORT_ALL\";else if(0<=indexOf.call(MATH,value))tag=\"MATH\";else if(0<=indexOf.call(COMPARE,value))tag=\"COMPARE\";else if(0<=indexOf.call(COMPOUND_ASSIGN,value))tag=\"COMPOUND_ASSIGN\";else if(0<=indexOf.call(UNARY,value))tag=\"UNARY\";else if(0<=indexOf.call(UNARY_MATH,value))tag=\"UNARY_MATH\";else if(0<=indexOf.call(SHIFT,value))tag=\"SHIFT\";else if(\"?\"===value&&(null==prev?void 0:prev.spaced))tag=\"BIN?\";else if(prev)if(\"(\"===value&&!prev.spaced&&(ref4=prev[0],0<=indexOf.call(CALLABLE,ref4)))\"?\"===prev[0]&&(prev[0]=\"FUNC_EXIST\"),tag=\"CALL_START\";else if(\"[\"===value&&((ref5=prev[0],0<=indexOf.call(INDEXABLE,ref5))&&!prev.spaced||\"::\"===prev[0]))switch(tag=\"INDEX_START\",prev[0]){case\"?\":prev[0]=\"INDEX_SOAK\";}return token=this.makeToken(tag,value),\"(\"===value||\"{\"===value||\"[\"===value?this.ends.push({tag:INVERSES[value],origin:token}):\")\"===value||\"}\"===value||\"]\"===value?this.pair(value):void 0,(this.tokens.push(this.makeToken(tag,value)),value.length)}},{key:\"tagParameters\",value:function tagParameters(){var i,paramEndToken,stack,tok,tokens;if(\")\"!==this.tag())return this.tagDoIife();for(stack=[],tokens=this.tokens,i=tokens.length,paramEndToken=tokens[--i],paramEndToken[0]=\"PARAM_END\";tok=tokens[--i];)switch(tok[0]){case\")\":stack.push(tok);break;case\"(\":case\"CALL_START\":if(stack.length)stack.pop();else return\"(\"===tok[0]?(tok[0]=\"PARAM_START\",this.tagDoIife(i-1)):(paramEndToken[0]=\"CALL_END\",this);}return this}},{key:\"tagDoIife\",value:function tagDoIife(tokenIndex){var tok;return(tok=this.tokens[null==tokenIndex?this.tokens.length-1:tokenIndex],\"DO\"!==(null==tok?void 0:tok[0]))?this:(tok[0]=\"DO_IIFE\",this)}},{key:\"closeIndentation\",value:function closeIndentation(){return this.outdentToken({moveOut:this.indent,indentSize:0})}},{key:\"matchWithInterpolations\",value:function matchWithInterpolations(regex,delimiter){var closingDelimiter=2<arguments.length&&void 0!==arguments[2]?arguments[2]:delimiter,interpolators=3<arguments.length&&void 0!==arguments[3]?arguments[3]:/^#\\{/,braceInterpolator,close,column,index,interpolationOffset,interpolator,line,match,nested,offset,offsetInChunk,open,ref,ref1,rest,str,strPart,tokens;if(tokens=[],offsetInChunk=delimiter.length,this.chunk.slice(0,offsetInChunk)!==delimiter)return null;for(str=this.chunk.slice(offsetInChunk);;){var _regex$exec=regex.exec(str),_regex$exec2=_slicedToArray(_regex$exec,1);if(strPart=_regex$exec2[0],this.validateEscapes(strPart,{isRegex:\"/\"===delimiter.charAt(0),offsetInChunk:offsetInChunk}),tokens.push(this.makeToken(\"NEOSTRING\",strPart,{offset:offsetInChunk})),str=str.slice(strPart.length),offsetInChunk+=strPart.length,!(match=interpolators.exec(str)))break;var _match14=match,_match15=_slicedToArray(_match14,1);interpolator=_match15[0],interpolationOffset=interpolator.length-1;var _this$getLineAndColum3=this.getLineAndColumnFromChunk(offsetInChunk+interpolationOffset),_this$getLineAndColum4=_slicedToArray(_this$getLineAndColum3,3);line=_this$getLineAndColum4[0],column=_this$getLineAndColum4[1],offset=_this$getLineAndColum4[2],rest=str.slice(interpolationOffset);var _Lexer$tokenize=new Lexer().tokenize(rest,{line:line,column:column,offset:offset,untilBalanced:!0,locationDataCompensations:this.locationDataCompensations});if(nested=_Lexer$tokenize.tokens,index=_Lexer$tokenize.index,index+=interpolationOffset,braceInterpolator=\"}\"===str[index-1],braceInterpolator){var _nested,_nested2,_slice$call,_slice$call2;_nested=nested,_nested2=_slicedToArray(_nested,1),open=_nested2[0],_nested,_slice$call=slice.call(nested,-1),_slice$call2=_slicedToArray(_slice$call,1),close=_slice$call2[0],_slice$call,open[0]=\"INTERPOLATION_START\",open[1]=\"(\",open[2].first_column-=interpolationOffset,open[2].range=[open[2].range[0]-interpolationOffset,open[2].range[1]],close[0]=\"INTERPOLATION_END\",close[1]=\")\",close.origin=[\"\",\"end of interpolation\",close[2]]}\"TERMINATOR\"===(null==(ref=nested[1])?void 0:ref[0])&&nested.splice(1,1),\"INDENT\"===(null==(ref1=nested[nested.length-3])?void 0:ref1[0])&&\"OUTDENT\"===nested[nested.length-2][0]&&nested.splice(-3,2),braceInterpolator||(open=this.makeToken(\"INTERPOLATION_START\",\"(\",{offset:offsetInChunk,length:0,generated:!0}),close=this.makeToken(\"INTERPOLATION_END\",\")\",{offset:offsetInChunk+index,length:0,generated:!0}),nested=[open].concat(_toConsumableArray(nested),[close])),tokens.push([\"TOKENS\",nested]),str=str.slice(index),offsetInChunk+=index}return str.slice(0,closingDelimiter.length)!==closingDelimiter&&this.error(\"missing \".concat(closingDelimiter),{length:delimiter.length}),{tokens:tokens,index:offsetInChunk+closingDelimiter.length}}},{key:\"mergeInterpolationTokens\",value:function mergeInterpolationTokens(tokens,options,fn){var $,converted,_double,endOffset,firstIndex,heregex,i,indent,j,jsx,k,lastToken,len,len1,locationToken,lparen,placeholderToken,quote,ref,ref1,rparen,tag,token,tokensToPush,val,value;for(quote=options.quote,indent=options.indent,_double=options.double,heregex=options.heregex,endOffset=options.endOffset,jsx=options.jsx,1<tokens.length&&(lparen=this.token(\"STRING_START\",\"(\",{length:null==(ref=null==quote?void 0:quote.length)?0:ref,data:{quote:quote},generated:null==quote||!quote.length})),firstIndex=this.tokens.length,$=tokens.length-1,(i=j=0,len=tokens.length);j<len;i=++j){var _this$tokens2;token=tokens[i];var _token4=token,_token5=_slicedToArray(_token4,2);switch(tag=_token5[0],value=_token5[1],tag){case\"TOKENS\":if(2===value.length&&(value[0].comments||value[1].comments)){for(placeholderToken=this.makeToken(\"JS\",\"\",{generated:!0}),placeholderToken[2]=value[0][2],(k=0,len1=value.length);k<len1;k++){var _placeholderToken$com;(val=value[k],!!val.comments)&&(null==placeholderToken.comments&&(placeholderToken.comments=[]),(_placeholderToken$com=placeholderToken.comments).push.apply(_placeholderToken$com,_toConsumableArray(val.comments)))}value.splice(1,0,placeholderToken)}locationToken=value[0],tokensToPush=value;break;case\"NEOSTRING\":converted=fn.call(this,token[1],i),0===i&&addTokenData(token,{initialChunk:!0}),i===$&&addTokenData(token,{finalChunk:!0}),addTokenData(token,{indent:indent,quote:quote,double:_double}),heregex&&addTokenData(token,{heregex:heregex}),jsx&&addTokenData(token,{jsx:jsx}),token[0]=\"STRING\",token[1]=\"\\\"\"+converted+\"\\\"\",1===tokens.length&&null!=quote&&(token[2].first_column-=quote.length,\"\\n\"===token[1].substr(-2,1)?(token[2].last_line+=1,token[2].last_column=quote.length-1):(token[2].last_column+=quote.length,2===token[1].length&&(token[2].last_column-=1)),token[2].last_column_exclusive+=quote.length,token[2].range=[token[2].range[0]-quote.length,token[2].range[1]+quote.length]),locationToken=token,tokensToPush=[token];}(_this$tokens2=this.tokens).push.apply(_this$tokens2,_toConsumableArray(tokensToPush))}if(lparen){var _slice$call3=slice.call(tokens,-1),_slice$call4=_slicedToArray(_slice$call3,1);return lastToken=_slice$call4[0],lparen.origin=[\"STRING\",null,{first_line:lparen[2].first_line,first_column:lparen[2].first_column,last_line:lastToken[2].last_line,last_column:lastToken[2].last_column,last_line_exclusive:lastToken[2].last_line_exclusive,last_column_exclusive:lastToken[2].last_column_exclusive,range:[lparen[2].range[0],lastToken[2].range[1]]}],(null==quote?void 0:quote.length)||(lparen[2]=lparen.origin[2]),rparen=this.token(\"STRING_END\",\")\",{offset:endOffset-(null==quote?\"\":quote).length,length:null==(ref1=null==quote?void 0:quote.length)?0:ref1,generated:null==quote||!quote.length})}}},{key:\"pair\",value:function pair(tag){var _slice$call5,_slice$call6,lastIndent,prev,ref,ref1,wanted;if(ref=this.ends,_slice$call5=slice.call(ref,-1),_slice$call6=_slicedToArray(_slice$call5,1),prev=_slice$call6[0],_slice$call5,tag!==(wanted=null==prev?void 0:prev.tag)){var _slice$call7,_slice$call8;return\"OUTDENT\"!==wanted&&this.error(\"unmatched \".concat(tag)),ref1=this.indents,_slice$call7=slice.call(ref1,-1),_slice$call8=_slicedToArray(_slice$call7,1),lastIndent=_slice$call8[0],_slice$call7,this.outdentToken({moveOut:lastIndent,noNewlines:!0}),this.pair(tag)}return this.ends.pop()}},{key:\"getLocationDataCompensation\",value:function getLocationDataCompensation(start,end){var compensation,current,initialEnd,totalCompensation;for(totalCompensation=0,initialEnd=end,current=start;current<=end&&(current!==end||start===initialEnd);)compensation=this.locationDataCompensations[current],null!=compensation&&(totalCompensation+=compensation,end+=compensation),current++;return totalCompensation}},{key:\"getLineAndColumnFromChunk\",value:function getLineAndColumnFromChunk(offset){var column,columnCompensation,compensation,lastLine,lineCount,previousLinesCompensation,ref,string;if(compensation=this.getLocationDataCompensation(this.chunkOffset,this.chunkOffset+offset),0===offset)return[this.chunkLine,this.chunkColumn+compensation,this.chunkOffset+compensation];if(string=offset>=this.chunk.length?this.chunk:this.chunk.slice(0,+(offset-1)+1||9e9),lineCount=count(string,\"\\n\"),column=this.chunkColumn,0<lineCount){var _slice$call9,_slice$call10;ref=string.split(\"\\n\"),_slice$call9=slice.call(ref,-1),_slice$call10=_slicedToArray(_slice$call9,1),lastLine=_slice$call10[0],_slice$call9,column=lastLine.length,previousLinesCompensation=this.getLocationDataCompensation(this.chunkOffset,this.chunkOffset+offset-column),0>previousLinesCompensation&&(previousLinesCompensation=0),columnCompensation=this.getLocationDataCompensation(this.chunkOffset+offset+previousLinesCompensation-column,this.chunkOffset+offset+previousLinesCompensation)}else column+=string.length,columnCompensation=compensation;return[this.chunkLine+lineCount,column+columnCompensation,this.chunkOffset+offset+compensation]}},{key:\"makeLocationData\",value:function makeLocationData(_ref16){var offsetInChunk=_ref16.offsetInChunk,length=_ref16.length,endOffset,lastCharacter,locationData;locationData={range:[]};var _this$getLineAndColum5=this.getLineAndColumnFromChunk(offsetInChunk),_this$getLineAndColum6=_slicedToArray(_this$getLineAndColum5,3);locationData.first_line=_this$getLineAndColum6[0],locationData.first_column=_this$getLineAndColum6[1],locationData.range[0]=_this$getLineAndColum6[2],lastCharacter=0<length?length-1:0;var _this$getLineAndColum7=this.getLineAndColumnFromChunk(offsetInChunk+lastCharacter),_this$getLineAndColum8=_slicedToArray(_this$getLineAndColum7,3);locationData.last_line=_this$getLineAndColum8[0],locationData.last_column=_this$getLineAndColum8[1],endOffset=_this$getLineAndColum8[2];var _this$getLineAndColum9=this.getLineAndColumnFromChunk(offsetInChunk+lastCharacter+(0<length?1:0)),_this$getLineAndColum10=_slicedToArray(_this$getLineAndColum9,2);return locationData.last_line_exclusive=_this$getLineAndColum10[0],locationData.last_column_exclusive=_this$getLineAndColum10[1],locationData.range[1]=0<length?endOffset+1:endOffset,locationData}},{key:\"makeToken\",value:function makeToken(tag,value){var _ref17=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_ref17$offset=_ref17.offset,offsetInChunk=void 0===_ref17$offset?0:_ref17$offset,_ref17$length=_ref17.length,length=void 0===_ref17$length?value.length:_ref17$length,origin=_ref17.origin,generated=_ref17.generated,indentSize=_ref17.indentSize,token;return token=[tag,value,this.makeLocationData({offsetInChunk:offsetInChunk,length:length})],origin&&(token.origin=origin),generated&&(token.generated=!0),null!=indentSize&&(token.indentSize=indentSize),token}},{key:\"token\",value:function(tag,value){var _ref18=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},offset=_ref18.offset,length=_ref18.length,origin=_ref18.origin,data=_ref18.data,generated=_ref18.generated,indentSize=_ref18.indentSize,token;return token=this.makeToken(tag,value,{offset:offset,length:length,origin:origin,generated:generated,indentSize:indentSize}),data&&addTokenData(token,data),this.tokens.push(token),token}},{key:\"tag\",value:function tag(){var _slice$call11,_slice$call12,ref,token;return ref=this.tokens,_slice$call11=slice.call(ref,-1),_slice$call12=_slicedToArray(_slice$call11,1),token=_slice$call12[0],_slice$call11,null==token?void 0:token[0]}},{key:\"value\",value:function value(){var useOrigin=!!(0<arguments.length&&void 0!==arguments[0])&&arguments[0],_slice$call13,_slice$call14,ref,token;return ref=this.tokens,_slice$call13=slice.call(ref,-1),_slice$call14=_slicedToArray(_slice$call13,1),token=_slice$call14[0],_slice$call13,useOrigin&&null!=(null==token?void 0:token.origin)?token.origin[1]:null==token?void 0:token[1]}},{key:\"prev\",value:function prev(){return this.tokens[this.tokens.length-1]}},{key:\"unfinished\",value:function unfinished(){var ref;return LINE_CONTINUER.test(this.chunk)||(ref=this.tag(),0<=indexOf.call(UNFINISHED,ref))}},{key:\"validateUnicodeCodePointEscapes\",value:function validateUnicodeCodePointEscapes(str,options){return replaceUnicodeCodePointEscapes(str,merge(options,{error:this.error}))}},{key:\"validateEscapes\",value:function validateEscapes(str){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},before,hex,invalidEscape,invalidEscapeRegex,match,message,octal,ref,unicode,unicodeCodePoint;if(invalidEscapeRegex=options.isRegex?REGEX_INVALID_ESCAPE:STRING_INVALID_ESCAPE,match=invalidEscapeRegex.exec(str),!!match)return match[0],before=match[1],octal=match[2],hex=match[3],unicodeCodePoint=match[4],unicode=match[5],message=octal?\"octal escape sequences are not allowed\":\"invalid escape sequence\",invalidEscape=\"\\\\\".concat(octal||hex||unicodeCodePoint||unicode),this.error(\"\".concat(message,\" \").concat(invalidEscape),{offset:(null==(ref=options.offsetInChunk)?0:ref)+match.index+before.length,length:invalidEscape.length})}},{key:\"suppressSemicolons\",value:function suppressSemicolons(){var ref,ref1,results;for(results=[];\";\"===this.value();)this.tokens.pop(),(ref=null==(ref1=this.prev())?void 0:ref1[0],0<=indexOf.call([\"=\"].concat(_toConsumableArray(UNFINISHED)),ref))?results.push(this.error(\"unexpected ;\")):results.push(void 0);return results}},{key:\"error\",value:function error(message){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_this$getLineAndColum11,_this$getLineAndColum12,first_column,first_line,location,ref,ref1;return location=\"first_line\"in options?options:(_this$getLineAndColum11=this.getLineAndColumnFromChunk(null==(ref=options.offset)?0:ref),_this$getLineAndColum12=_slicedToArray(_this$getLineAndColum11,2),first_line=_this$getLineAndColum12[0],first_column=_this$getLineAndColum12[1],_this$getLineAndColum11,{first_line:first_line,first_column:first_column,last_column:first_column+(null==(ref1=options.length)?1:ref1)-1}),throwSyntaxError(message,location)}}]),Lexer}(),isUnassignable=function(name){var displayName=1<arguments.length&&void 0!==arguments[1]?arguments[1]:name;switch(!1){case 0>indexOf.call([].concat(_toConsumableArray(JS_KEYWORDS),_toConsumableArray(COFFEE_KEYWORDS)),name):return\"keyword '\".concat(displayName,\"' can't be assigned\");case 0>indexOf.call(STRICT_PROSCRIBED,name):return\"'\".concat(displayName,\"' can't be assigned\");case 0>indexOf.call(RESERVED,name):return\"reserved word '\".concat(displayName,\"' can't be assigned\");default:return!1;}},exports.isUnassignable=isUnassignable,isForFrom=function(prev){var ref;return\"IDENTIFIER\"===prev[0]||\"FOR\"!==prev[0]&&\"{\"!==(ref=prev[1])&&\"[\"!==ref&&\",\"!==ref&&\":\"!==ref},addTokenData=function(token,data){return Object.assign(null==token.data?token.data={}:token.data,data)},JS_KEYWORDS=[\"true\",\"false\",\"null\",\"this\",\"new\",\"delete\",\"typeof\",\"in\",\"instanceof\",\"return\",\"throw\",\"break\",\"continue\",\"debugger\",\"yield\",\"await\",\"if\",\"else\",\"switch\",\"for\",\"while\",\"do\",\"try\",\"catch\",\"finally\",\"class\",\"extends\",\"super\",\"import\",\"export\",\"default\"],COFFEE_KEYWORDS=[\"undefined\",\"Infinity\",\"NaN\",\"then\",\"unless\",\"until\",\"loop\",\"of\",\"by\",\"when\"],COFFEE_ALIAS_MAP={and:\"&&\",or:\"||\",is:\"==\",isnt:\"!=\",not:\"!\",yes:\"true\",no:\"false\",on:\"true\",off:\"false\"},COFFEE_ALIASES=function(){var results;for(key in results=[],COFFEE_ALIAS_MAP)results.push(key);return results}(),COFFEE_KEYWORDS=COFFEE_KEYWORDS.concat(COFFEE_ALIASES),RESERVED=[\"case\",\"function\",\"var\",\"void\",\"with\",\"const\",\"let\",\"enum\",\"native\",\"implements\",\"interface\",\"package\",\"private\",\"protected\",\"public\",\"static\"],STRICT_PROSCRIBED=[\"arguments\",\"eval\"],exports.JS_FORBIDDEN=JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED),BOM=65279,IDENTIFIER=/^(?!\\d)((?:(?!\\s)[$\\w\\x7f-\\uffff])+)([^\\n\\S]*:(?!:))?/,JSX_IDENTIFIER_PART=/(?:(?!\\s)[\\-$\\w\\x7f-\\uffff])+/.source,JSX_IDENTIFIER=RegExp(\"^(?![\\\\d<])(\".concat(JSX_IDENTIFIER_PART,\"(?:\\\\s*:\\\\s*\").concat(JSX_IDENTIFIER_PART,\"|(?:\\\\s*\\\\.\\\\s*\").concat(JSX_IDENTIFIER_PART,\")+)?)\")),JSX_FRAGMENT_IDENTIFIER=/^()>/,JSX_ATTRIBUTE=RegExp(\"^(?!\\\\d)(\".concat(JSX_IDENTIFIER_PART,\"(?:\\\\s*:\\\\s*\").concat(JSX_IDENTIFIER_PART,\")?)([^\\\\S]*=(?!=))?\")),NUMBER=/^0b[01](?:_?[01])*n?|^0o[0-7](?:_?[0-7])*n?|^0x[\\da-f](?:_?[\\da-f])*n?|^\\d+(?:_\\d+)*n|^(?:\\d+(?:_\\d+)*)?\\.?\\d+(?:_\\d+)*(?:e[+-]?\\d+(?:_\\d+)*)?/i,OPERATOR=/^(?:[-=]>|[-+*\\/%<>&|^!?=]=|>>>=?|([-+:])\\1|([&|<>*\\/%])\\2=?|\\?(\\.|::)|\\.{2,3})/,WHITESPACE=/^[^\\n\\S]+/,COMMENT=/^(\\s*)###([^#][\\s\\S]*?)(?:###([^\\n\\S]*)|###$)|^((?:\\s*#(?!##[^#]).*)+)/,CODE=/^[-=]>/,MULTI_DENT=/^(?:\\n[^\\n\\S]*)+/,JSTOKEN=/^`(?!``)((?:[^`\\\\]|\\\\[\\s\\S])*)`/,HERE_JSTOKEN=/^```((?:[^`\\\\]|\\\\[\\s\\S]|`(?!``))*)```/,STRING_START=/^(?:'''|\"\"\"|'|\")/,STRING_SINGLE=/^(?:[^\\\\']|\\\\[\\s\\S])*/,STRING_DOUBLE=/^(?:[^\\\\\"#]|\\\\[\\s\\S]|\\#(?!\\{))*/,HEREDOC_SINGLE=/^(?:[^\\\\']|\\\\[\\s\\S]|'(?!''))*/,HEREDOC_DOUBLE=/^(?:[^\\\\\"#]|\\\\[\\s\\S]|\"(?!\"\")|\\#(?!\\{))*/,INSIDE_JSX=/^(?:[^\\{<])*/,JSX_INTERPOLATION=/^(?:\\{|<(?!\\/))/,HEREDOC_INDENT=/\\n+([^\\n\\S]*)(?=\\S)/g,REGEX=/^\\/(?!\\/)((?:[^[\\/\\n\\\\]|\\\\[^\\n]|\\[(?:\\\\[^\\n]|[^\\]\\n\\\\])*\\])*)(\\/)?/,REGEX_FLAGS=/^\\w*/,VALID_FLAGS=/^(?!.*(.).*\\1)[gimsuy]*$/,HEREGEX=/^(?:[^\\\\\\/#\\s]|\\\\[\\s\\S]|\\/(?!\\/\\/)|\\#(?!\\{)|\\s+(?:#(?!\\{).*)?)*/,HEREGEX_COMMENT=/(\\s+)(#(?!{).*)/gm,REGEX_ILLEGAL=/^(\\/|\\/{3}\\s*)(\\*)/,POSSIBLY_DIVISION=/^\\/=?\\s/,HERECOMMENT_ILLEGAL=/\\*\\//,LINE_CONTINUER=/^\\s*(?:,|\\??\\.(?![.\\d])|\\??::)/,STRING_INVALID_ESCAPE=/((?:^|[^\\\\])(?:\\\\\\\\)*)\\\\(?:(0\\d|[1-7])|(x(?![\\da-fA-F]{2}).{0,2})|(u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?)|(u(?!\\{|[\\da-fA-F]{4}).{0,4}))/,REGEX_INVALID_ESCAPE=/((?:^|[^\\\\])(?:\\\\\\\\)*)\\\\(?:(0\\d)|(x(?![\\da-fA-F]{2}).{0,2})|(u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?)|(u(?!\\{|[\\da-fA-F]{4}).{0,4}))/,TRAILING_SPACES=/\\s+$/,COMPOUND_ASSIGN=[\"-=\",\"+=\",\"/=\",\"*=\",\"%=\",\"||=\",\"&&=\",\"?=\",\"<<=\",\">>=\",\">>>=\",\"&=\",\"^=\",\"|=\",\"**=\",\"//=\",\"%%=\"],UNARY=[\"NEW\",\"TYPEOF\",\"DELETE\"],UNARY_MATH=[\"!\",\"~\"],SHIFT=[\"<<\",\">>\",\">>>\"],COMPARE=[\"==\",\"!=\",\"<\",\">\",\"<=\",\">=\"],MATH=[\"*\",\"/\",\"%\",\"//\",\"%%\"],RELATION=[\"IN\",\"OF\",\"INSTANCEOF\"],BOOL=[\"TRUE\",\"FALSE\"],CALLABLE=[\"IDENTIFIER\",\"PROPERTY\",\")\",\"]\",\"?\",\"@\",\"THIS\",\"SUPER\",\"DYNAMIC_IMPORT\"],INDEXABLE=CALLABLE.concat([\"NUMBER\",\"INFINITY\",\"NAN\",\"STRING\",\"STRING_END\",\"REGEX\",\"REGEX_END\",\"BOOL\",\"NULL\",\"UNDEFINED\",\"}\",\"::\"]),COMPARABLE_LEFT_SIDE=[\"IDENTIFIER\",\")\",\"]\",\"NUMBER\"],NOT_REGEX=INDEXABLE.concat([\"++\",\"--\"]),LINE_BREAK=[\"INDENT\",\"OUTDENT\",\"TERMINATOR\"],INDENTABLE_CLOSERS=[\")\",\"}\",\"]\"]}.call(this),{exports:exports}.exports}(),require[\"./parser\"]=function(){var exports={},module={exports:exports},parser=function(){function Parser(){this.yy={}}var o=function(k,v,_o,l){for(_o=_o||{},l=k.length;l--;_o[k[l]]=v);return _o},$V0=[1,24],$V1=[1,59],$V2=[1,98],$V3=[1,99],$V4=[1,94],$V5=[1,100],$V6=[1,101],$V7=[1,96],$V8=[1,97],$V9=[1,68],$Va=[1,70],$Vb=[1,71],$Vc=[1,72],$Vd=[1,73],$Ve=[1,74],$Vf=[1,76],$Vg=[1,80],$Vh=[1,77],$Vi=[1,78],$Vj=[1,62],$Vk=[1,45],$Vl=[1,38],$Vm=[1,83],$Vn=[1,84],$Vo=[1,81],$Vp=[1,82],$Vq=[1,93],$Vr=[1,57],$Vs=[1,63],$Vt=[1,64],$Vu=[1,79],$Vv=[1,50],$Vw=[1,58],$Vx=[1,75],$Vy=[1,88],$Vz=[1,89],$VA=[1,90],$VB=[1,91],$VC=[1,56],$VD=[1,87],$VE=[1,40],$VF=[1,41],$VG=[1,61],$VH=[1,42],$VI=[1,43],$VJ=[1,44],$VK=[1,46],$VL=[1,47],$VM=[1,102],$VN=[1,6,35,52,155],$VO=[1,6,33,35,52,74,76,96,137,144,155,158,166],$VP=[1,120],$VQ=[1,121],$VR=[1,122],$VS=[1,117],$VT=[1,105],$VU=[1,104],$VV=[1,103],$VW=[1,106],$VX=[1,107],$VY=[1,108],$VZ=[1,109],$V_=[1,110],$V$=[1,111],$V01=[1,112],$V11=[1,113],$V21=[1,114],$V31=[1,115],$V41=[1,116],$V51=[1,124],$V61=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V71=[2,222],$V81=[1,130],$V91=[1,135],$Va1=[1,131],$Vb1=[1,132],$Vc1=[1,133],$Vd1=[1,136],$Ve1=[1,129],$Vf1=[1,6,33,35,52,74,76,96,137,144,155,157,158,159,165,166,183],$Vg1=[1,6,33,35,46,47,52,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vh1=[2,129],$Vi1=[2,133],$Vj1=[6,33,91,96],$Vk1=[2,106],$Vl1=[1,148],$Vm1=[1,147],$Vn1=[1,142],$Vo1=[1,151],$Vp1=[1,156],$Vq1=[1,154],$Vr1=[1,160],$Vs1=[1,166],$Vt1=[1,162],$Vu1=[1,163],$Vv1=[1,165],$Vw1=[1,170],$Vx1=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vy1=[2,126],$Vz1=[1,6,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VA1=[2,31],$VB1=[1,195],$VC1=[1,196],$VD1=[2,93],$VE1=[1,202],$VF1=[1,208],$VG1=[1,223],$VH1=[1,218],$VI1=[1,227],$VJ1=[1,224],$VK1=[1,229],$VL1=[1,230],$VM1=[1,232],$VN1=[2,227],$VO1=[1,234],$VP1=[14,32,33,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VQ1=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,121,135,136,137,144,155,157,158,159,165,166,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$VR1=[1,247],$VS1=[1,248],$VT1=[2,156],$VU1=[1,264],$VV1=[1,265],$VW1=[1,267],$VX1=[1,277],$VY1=[1,278],$VZ1=[1,6,33,35,46,47,52,70,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V_1=[1,6,33,35,36,46,47,52,66,70,74,76,91,96,105,106,107,110,111,112,115,119,121,128,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$V$1=[1,6,33,35,46,47,49,51,52,57,70,74,76,91,96,105,106,107,110,111,112,115,119,123,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V02=[1,283],$V12=[46,47,136],$V22=[1,322],$V32=[1,321],$V42=[6,33],$V52=[2,104],$V62=[1,328],$V72=[6,33,35,91,96],$V82=[6,33,35,66,76,91,96],$V92=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,194,195,196,197,198,199,200,201,202,203,204],$Va2=[2,377],$Vb2=[2,378],$Vc2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,194,196,197,198,199,200,201,202,203,204],$Vd2=[46,47,105,106,110,111,112,115,135,136],$Ve2=[1,357],$Vf2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183],$Vg2=[2,91],$Vh2=[1,375],$Vi2=[1,377],$Vj2=[1,382],$Vk2=[1,384],$Vl2=[6,33,74,96],$Vm2=[2,247],$Vn2=[2,248],$Vo2=[1,6,33,35,46,47,52,66,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vp2=[1,398],$Vq2=[14,32,33,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,74,75,76,82,85,87,88,89,93,94,96,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$Vr2=[1,400],$Vs2=[6,33,35,74,96],$Vt2=[6,14,32,33,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,74,75,76,82,85,87,88,89,93,94,96,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$Vu2=[6,33,35,74,96,137],$Vv2=[1,6,33,35,46,47,52,57,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vw2=[1,411],$Vx2=[1,6,33,35,46,47,52,66,70,74,76,91,96,105,106,107,110,111,112,115,119,121,135,136,137,144,155,157,158,159,165,166,173,174,175,183,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205],$Vy2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,166,183],$Vz2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,158,166,183],$VA2=[2,300],$VB2=[173,174,175],$VC2=[96,173,174,175],$VD2=[6,33,119],$VE2=[1,431],$VF2=[6,33,35,96,119],$VG2=[6,33,35,70,96,119],$VH2=[6,33,35,66,70,76,96,105,106,110,111,112,115,119,135,136],$VI2=[6,33,35,76,96,105,106,110,111,112,115,119,135,136],$VJ2=[46,47,49,51],$VK2=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,189,190,196,197,198,199,200,201,202,203,204],$VL2=[2,367],$VM2=[2,366],$VN2=[35,107],$VO2=[14,32,35,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,107,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VP2=[2,233],$VQ2=[6,33,35],$VR2=[2,105],$VS2=[1,470],$VT2=[1,471],$VU2=[1,6,33,35,46,47,52,74,76,91,96,105,106,107,110,111,112,115,119,135,136,137,144,151,152,155,157,158,159,165,166,178,180,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VV2=[1,337],$VW2=[35,178,180],$VX2=[1,6,35,52,74,76,91,96,107,119,137,144,155,158,166,183],$VY2=[1,509],$VZ2=[1,516],$V_2=[1,6,33,35,52,74,76,96,137,144,155,158,166,183],$V$2=[2,120],$V03=[1,529],$V13=[33,35,74],$V23=[1,537],$V33=[6,33,35,96,137],$V43=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,178,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$V53=[1,6,33,35,52,74,76,96,137,144,155,158,166,178],$V63=[2,314],$V73=[2,315],$V83=[2,330],$V93=[1,557],$Va3=[1,558],$Vb3=[6,33,35,119],$Vc3=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,159,165,166,183],$Vd3=[6,33,35,96],$Ve3=[1,6,33,35,52,74,76,91,96,107,119,137,144,151,155,157,158,159,165,166,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$Vf3=[33,96],$Vg3=[1,611],$Vh3=[1,612],$Vi3=[1,619],$Vj3=[1,620],$Vk3=[1,638],$Vl3=[1,639],$Vm3=[2,285],$Vn3=[2,288],$Vo3=[2,301],$Vp3=[2,316],$Vq3=[2,320],$Vr3=[2,317],$Vs3=[2,321],$Vt3=[2,318],$Vu3=[2,319],$Vv3=[2,331],$Vw3=[2,332],$Vx3=[1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,183],$Vy3=[2,322],$Vz3=[2,324],$VA3=[2,326],$VB3=[2,328],$VC3=[2,323],$VD3=[2,325],$VE3=[2,327],$VF3=[2,329],parser={trace:function(){},yy:{},symbols_:{error:2,Root:3,Body:4,Line:5,TERMINATOR:6,Expression:7,ExpressionLine:8,Statement:9,FuncDirective:10,YieldReturn:11,AwaitReturn:12,Return:13,STATEMENT:14,Import:15,Export:16,Value:17,Code:18,Operation:19,Assign:20,If:21,Try:22,While:23,For:24,Switch:25,Class:26,Throw:27,Yield:28,CodeLine:29,IfLine:30,OperationLine:31,YIELD:32,INDENT:33,Object:34,OUTDENT:35,FROM:36,Block:37,Identifier:38,IDENTIFIER:39,JSX_TAG:40,Property:41,PROPERTY:42,AlphaNumeric:43,NUMBER:44,String:45,STRING:46,STRING_START:47,Interpolations:48,STRING_END:49,InterpolationChunk:50,INTERPOLATION_START:51,INTERPOLATION_END:52,Regex:53,REGEX:54,REGEX_START:55,Invocation:56,REGEX_END:57,Literal:58,JS:59,UNDEFINED:60,NULL:61,BOOL:62,INFINITY:63,NAN:64,Assignable:65,\"=\":66,AssignObj:67,ObjAssignable:68,ObjRestValue:69,\":\":70,SimpleObjAssignable:71,ThisProperty:72,\"[\":73,\"]\":74,\"@\":75,\"...\":76,ObjSpreadExpr:77,ObjSpreadIdentifier:78,Parenthetical:79,Super:80,This:81,SUPER:82,OptFuncExist:83,Arguments:84,DYNAMIC_IMPORT:85,Accessor:86,RETURN:87,AWAIT:88,PARAM_START:89,ParamList:90,PARAM_END:91,FuncGlyph:92,\"->\":93,\"=>\":94,OptComma:95,\",\":96,Param:97,ParamVar:98,Array:99,Splat:100,SimpleAssignable:101,Range:102,DoIife:103,MetaProperty:104,\".\":105,INDEX_START:106,INDEX_END:107,NEW_TARGET:108,IMPORT_META:109,\"?.\":110,\"::\":111,\"?::\":112,Index:113,IndexValue:114,INDEX_SOAK:115,Slice:116,\"{\":117,AssignList:118,\"}\":119,CLASS:120,EXTENDS:121,IMPORT:122,ASSERT:123,ImportDefaultSpecifier:124,ImportNamespaceSpecifier:125,ImportSpecifierList:126,ImportSpecifier:127,AS:128,DEFAULT:129,IMPORT_ALL:130,EXPORT:131,ExportSpecifierList:132,EXPORT_ALL:133,ExportSpecifier:134,FUNC_EXIST:135,CALL_START:136,CALL_END:137,ArgList:138,THIS:139,Elisions:140,ArgElisionList:141,OptElisions:142,RangeDots:143,\"..\":144,Arg:145,ArgElision:146,Elision:147,SimpleArgs:148,TRY:149,Catch:150,FINALLY:151,CATCH:152,THROW:153,\"(\":154,\")\":155,WhileLineSource:156,WHILE:157,WHEN:158,UNTIL:159,WhileSource:160,Loop:161,LOOP:162,ForBody:163,ForLineBody:164,FOR:165,BY:166,ForStart:167,ForSource:168,ForLineSource:169,ForVariables:170,OWN:171,ForValue:172,FORIN:173,FOROF:174,FORFROM:175,SWITCH:176,Whens:177,ELSE:178,When:179,LEADING_WHEN:180,IfBlock:181,IF:182,POST_IF:183,IfBlockLine:184,UNARY:185,DO:186,DO_IIFE:187,UNARY_MATH:188,\"-\":189,\"+\":190,\"--\":191,\"++\":192,\"?\":193,MATH:194,\"**\":195,SHIFT:196,COMPARE:197,\"&\":198,\"^\":199,\"|\":200,\"&&\":201,\"||\":202,\"BIN?\":203,RELATION:204,COMPOUND_ASSIGN:205,$accept:0,$end:1},terminals_:{2:\"error\",6:\"TERMINATOR\",14:\"STATEMENT\",32:\"YIELD\",33:\"INDENT\",35:\"OUTDENT\",36:\"FROM\",39:\"IDENTIFIER\",40:\"JSX_TAG\",42:\"PROPERTY\",44:\"NUMBER\",46:\"STRING\",47:\"STRING_START\",49:\"STRING_END\",51:\"INTERPOLATION_START\",52:\"INTERPOLATION_END\",54:\"REGEX\",55:\"REGEX_START\",57:\"REGEX_END\",59:\"JS\",60:\"UNDEFINED\",61:\"NULL\",62:\"BOOL\",63:\"INFINITY\",64:\"NAN\",66:\"=\",70:\":\",73:\"[\",74:\"]\",75:\"@\",76:\"...\",82:\"SUPER\",85:\"DYNAMIC_IMPORT\",87:\"RETURN\",88:\"AWAIT\",89:\"PARAM_START\",91:\"PARAM_END\",93:\"->\",94:\"=>\",96:\",\",105:\".\",106:\"INDEX_START\",107:\"INDEX_END\",108:\"NEW_TARGET\",109:\"IMPORT_META\",110:\"?.\",111:\"::\",112:\"?::\",115:\"INDEX_SOAK\",117:\"{\",119:\"}\",120:\"CLASS\",121:\"EXTENDS\",122:\"IMPORT\",123:\"ASSERT\",128:\"AS\",129:\"DEFAULT\",130:\"IMPORT_ALL\",131:\"EXPORT\",133:\"EXPORT_ALL\",135:\"FUNC_EXIST\",136:\"CALL_START\",137:\"CALL_END\",139:\"THIS\",144:\"..\",149:\"TRY\",151:\"FINALLY\",152:\"CATCH\",153:\"THROW\",154:\"(\",155:\")\",157:\"WHILE\",158:\"WHEN\",159:\"UNTIL\",162:\"LOOP\",165:\"FOR\",166:\"BY\",171:\"OWN\",173:\"FORIN\",174:\"FOROF\",175:\"FORFROM\",176:\"SWITCH\",178:\"ELSE\",180:\"LEADING_WHEN\",182:\"IF\",183:\"POST_IF\",185:\"UNARY\",186:\"DO\",187:\"DO_IIFE\",188:\"UNARY_MATH\",189:\"-\",190:\"+\",191:\"--\",192:\"++\",193:\"?\",194:\"MATH\",195:\"**\",196:\"SHIFT\",197:\"COMPARE\",198:\"&\",199:\"^\",200:\"|\",201:\"&&\",202:\"||\",203:\"BIN?\",204:\"RELATION\",205:\"COMPOUND_ASSIGN\"},productions_:[0,[3,0],[3,1],[4,1],[4,3],[4,2],[5,1],[5,1],[5,1],[5,1],[10,1],[10,1],[9,1],[9,1],[9,1],[9,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[8,1],[8,1],[8,1],[28,1],[28,2],[28,4],[28,3],[37,2],[37,3],[38,1],[38,1],[41,1],[43,1],[43,1],[45,1],[45,3],[48,1],[48,2],[50,3],[50,5],[50,2],[50,1],[53,1],[53,3],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[20,3],[20,4],[20,5],[67,1],[67,1],[67,3],[67,5],[67,3],[67,5],[71,1],[71,1],[71,1],[68,1],[68,3],[68,4],[68,1],[69,2],[69,2],[69,2],[69,2],[77,1],[77,1],[77,1],[77,1],[77,1],[77,3],[77,2],[77,3],[77,3],[78,2],[78,2],[13,2],[13,4],[13,1],[11,3],[11,2],[12,3],[12,2],[18,5],[18,2],[29,5],[29,2],[92,1],[92,1],[95,0],[95,1],[90,0],[90,1],[90,3],[90,4],[90,6],[97,1],[97,2],[97,2],[97,3],[97,1],[98,1],[98,1],[98,1],[98,1],[100,2],[100,2],[101,1],[101,2],[101,2],[101,1],[65,1],[65,1],[65,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[80,3],[80,4],[80,6],[104,3],[104,3],[86,2],[86,2],[86,2],[86,2],[86,1],[86,1],[86,1],[113,3],[113,5],[113,2],[114,1],[114,1],[34,4],[118,0],[118,1],[118,3],[118,4],[118,6],[26,1],[26,2],[26,3],[26,4],[26,2],[26,3],[26,4],[26,5],[15,2],[15,4],[15,4],[15,6],[15,4],[15,6],[15,5],[15,7],[15,7],[15,9],[15,6],[15,8],[15,9],[15,11],[126,1],[126,3],[126,4],[126,4],[126,6],[127,1],[127,3],[127,1],[127,3],[124,1],[125,3],[16,3],[16,5],[16,2],[16,4],[16,5],[16,6],[16,3],[16,5],[16,4],[16,6],[16,5],[16,7],[16,7],[16,9],[132,1],[132,3],[132,4],[132,4],[132,6],[134,1],[134,3],[134,3],[134,1],[134,3],[56,3],[56,3],[56,3],[56,2],[83,0],[83,1],[84,2],[84,4],[81,1],[81,1],[72,2],[99,2],[99,3],[99,4],[143,1],[143,1],[102,5],[102,5],[116,3],[116,2],[116,3],[116,2],[116,2],[116,1],[138,1],[138,3],[138,4],[138,4],[138,6],[145,1],[145,1],[145,1],[145,1],[141,1],[141,3],[141,4],[141,4],[141,6],[146,1],[146,2],[142,1],[142,2],[140,1],[140,2],[147,1],[147,2],[148,1],[148,1],[148,3],[148,3],[22,2],[22,3],[22,4],[22,5],[150,3],[150,3],[150,2],[27,2],[27,4],[79,3],[79,5],[156,2],[156,4],[156,2],[156,4],[160,2],[160,4],[160,4],[160,2],[160,4],[160,4],[23,2],[23,2],[23,2],[23,2],[23,1],[161,2],[161,2],[24,2],[24,2],[24,2],[24,2],[163,2],[163,4],[163,2],[164,4],[164,2],[167,2],[167,3],[167,3],[172,1],[172,1],[172,1],[172,1],[170,1],[170,3],[168,2],[168,2],[168,4],[168,4],[168,4],[168,4],[168,4],[168,4],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,6],[168,2],[168,4],[168,4],[169,2],[169,2],[169,4],[169,4],[169,4],[169,4],[169,4],[169,4],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,6],[169,2],[169,4],[169,4],[25,5],[25,5],[25,7],[25,7],[25,4],[25,6],[177,1],[177,2],[179,3],[179,4],[181,3],[181,5],[21,1],[21,3],[21,3],[21,3],[184,3],[184,5],[30,1],[30,3],[30,3],[30,3],[31,2],[31,2],[31,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,4],[19,2],[19,2],[19,2],[19,2],[19,2],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,3],[19,5],[19,4],[103,2]],performAction:function(yytext,yyleng,yylineno,yy,yystate,$$,_$){var $0=$$.length-1;switch(yystate){case 1:return this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Root(new yy.Block()));break;case 2:return this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Root($$[$0]));break;case 3:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(yy.Block.wrap([$$[$0]]));break;case 4:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-2].push($$[$0]));break;case 5:this.$=$$[$0-1];break;case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 41:case 52:case 54:case 64:case 69:case 70:case 71:case 72:case 75:case 80:case 81:case 82:case 83:case 84:case 104:case 105:case 116:case 117:case 118:case 119:case 125:case 126:case 129:case 135:case 149:case 247:case 248:case 249:case 251:case 264:case 265:case 308:case 309:case 364:case 370:this.$=$$[$0];break;case 13:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.StatementLiteral($$[$0]));break;case 31:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Op($$[$0],new yy.Value(new yy.Literal(\"\"))));break;case 32:case 374:case 375:case 376:case 378:case 379:case 382:case 405:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1],$$[$0]));break;case 33:case 383:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Op($$[$0-3],$$[$0-1]));break;case 34:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op($$[$0-2].concat($$[$0-1]),$$[$0]));break;case 35:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Block);break;case 36:case 150:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-1]);break;case 37:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.IdentifierLiteral($$[$0]));break;case 38:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(function(){var ref,ref1,ref2,ref3;return new yy.JSXTag($$[$0].toString(),{tagNameLocationData:$$[$0].tagNameToken[2],closingTagOpeningBracketLocationData:null==(ref=$$[$0].closingTagOpeningBracketToken)?void 0:ref[2],closingTagSlashLocationData:null==(ref1=$$[$0].closingTagSlashToken)?void 0:ref1[2],closingTagNameLocationData:null==(ref2=$$[$0].closingTagNameToken)?void 0:ref2[2],closingTagClosingBracketLocationData:null==(ref3=$$[$0].closingTagClosingBracketToken)?void 0:ref3[2]})}());break;case 39:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.PropertyName($$[$0].toString()));break;case 40:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.NumberLiteral($$[$0].toString(),{parsedValue:$$[$0].parsedValue}));break;case 42:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.StringLiteral($$[$0].slice(1,-1),{quote:$$[$0].quote,initialChunk:$$[$0].initialChunk,finalChunk:$$[$0].finalChunk,indent:$$[$0].indent,double:$$[$0].double,heregex:$$[$0].heregex}));break;case 43:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.StringWithInterpolations(yy.Block.wrap($$[$0-1]),{quote:$$[$0-2].quote,startQuote:yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Literal($$[$0-2].toString()))}));break;case 44:case 107:case 157:case 183:case 208:case 242:case 256:case 260:case 312:case 358:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)([$$[$0]]);break;case 45:case 257:case 261:case 359:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].concat($$[$0]));break;case 46:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Interpolation($$[$0-1]));break;case 47:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Interpolation($$[$0-2]));break;case 48:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Interpolation);break;case 49:case 293:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)($$[$0]);break;case 50:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.RegexLiteral($$[$0].toString(),{delimiter:$$[$0].delimiter,heregexCommentTokens:$$[$0].heregexCommentTokens}));break;case 51:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.RegexWithInterpolations($$[$0-1],{heregexCommentTokens:$$[$0].heregexCommentTokens}));break;case 53:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.PassthroughLiteral($$[$0].toString(),{here:$$[$0].here,generated:$$[$0].generated}));break;case 55:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.UndefinedLiteral($$[$0]));break;case 56:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.NullLiteral($$[$0]));break;case 57:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.BooleanLiteral($$[$0].toString(),{originalValue:$$[$0].original}));break;case 58:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.InfinityLiteral($$[$0].toString(),{originalValue:$$[$0].original}));break;case 59:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.NaNLiteral($$[$0]));break;case 60:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-2],$$[$0]));break;case 61:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-3],$$[$0]));break;case 62:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-4],$$[$0-1]));break;case 63:case 122:case 127:case 128:case 130:case 131:case 132:case 133:case 134:case 136:case 137:case 310:case 311:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Value($$[$0]));break;case 65:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Value($$[$0-2])),$$[$0],\"object\",{operatorToken:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 66:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Value($$[$0-4])),$$[$0-1],\"object\",{operatorToken:yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.Literal($$[$0-3]))}));break;case 67:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Value($$[$0-2])),$$[$0],null,{operatorToken:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 68:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign(yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Value($$[$0-4])),$$[$0-1],null,{operatorToken:yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.Literal($$[$0-3]))}));break;case 73:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Value(new yy.ComputedPropertyName($$[$0-1])));break;case 74:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Value(yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.ThisLiteral($$[$0-3])),[yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.ComputedPropertyName($$[$0-1]))],\"this\"));break;case 76:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat(new yy.Value($$[$0-1])));break;case 77:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat(new yy.Value($$[$0]),{postfix:!1}));break;case 78:case 120:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat($$[$0-1]));break;case 79:case 121:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Splat($$[$0],{postfix:!1}));break;case 85:case 220:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.SuperCall(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Super),$$[$0],$$[$0-1].soak,$$[$0-2]));break;case 86:case 221:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.DynamicImportCall(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.DynamicImport),$$[$0]));break;case 87:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Call(new yy.Value($$[$0-2]),$$[$0],$$[$0-1].soak));break;case 88:case 219:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Call($$[$0-2],$$[$0],$$[$0-1].soak));break;case 89:case 90:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Value($$[$0-1]).add($$[$0]));break;case 91:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Return($$[$0]));break;case 92:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Return(new yy.Value($$[$0-1])));break;case 93:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Return);break;case 94:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.YieldReturn($$[$0],{returnKeyword:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 95:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.YieldReturn(null,{returnKeyword:yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Literal($$[$0]))}));break;case 96:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.AwaitReturn($$[$0],{returnKeyword:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))}));break;case 97:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.AwaitReturn(null,{returnKeyword:yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Literal($$[$0]))}));break;case 98:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Code($$[$0-3],$$[$0],$$[$0-1],yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Literal($$[$0-4]))));break;case 99:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Code([],$$[$0],$$[$0-1]));break;case 100:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Code($$[$0-3],yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(yy.Block.wrap([$$[$0]])),$$[$0-1],yy.addDataToNode(yy,_$[$0-4],$$[$0-4],null,null,!0)(new yy.Literal($$[$0-4]))));break;case 101:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Code([],yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(yy.Block.wrap([$$[$0]])),$$[$0-1]));break;case 102:case 103:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.FuncGlyph($$[$0]));break;case 106:case 156:case 258:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)([]);break;case 108:case 158:case 184:case 209:case 243:case 252:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-2].concat($$[$0]));break;case 109:case 159:case 185:case 210:case 244:case 253:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)($$[$0-3].concat($$[$0]));break;case 110:case 160:case 187:case 212:case 246:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)($$[$0-5].concat($$[$0-2]));break;case 111:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Param($$[$0]));break;case 112:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Param($$[$0-1],null,!0));break;case 113:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Param($$[$0],null,{postfix:!1}));break;case 114:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Param($$[$0-2],$$[$0]));break;case 115:case 250:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Expansion);break;case 123:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].add($$[$0]));break;case 124:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Value($$[$0-1]).add($$[$0]));break;case 138:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Super(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0])),yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Literal($$[$0-2]))));break;case 139:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Super(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Index($$[$0-1])),yy.addDataToNode(yy,_$[$0-3],$$[$0-3],null,null,!0)(new yy.Literal($$[$0-3]))));break;case 140:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.Super(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Index($$[$0-2])),yy.addDataToNode(yy,_$[$0-5],$$[$0-5],null,null,!0)(new yy.Literal($$[$0-5]))));break;case 141:case 142:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.MetaProperty(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.IdentifierLiteral($$[$0-2])),yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))));break;case 143:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Access($$[$0]));break;case 144:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Access($$[$0],{soak:!0}));break;case 145:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0})),yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))]);break;case 146:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0,soak:!0})),yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))]);break;case 147:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0}));break;case 148:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Access(new yy.PropertyName(\"prototype\"),{shorthand:!0,soak:!0}));break;case 151:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)($$[$0-2]);break;case 152:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(yy.extend($$[$0],{soak:!0}));break;case 153:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Index($$[$0]));break;case 154:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Slice($$[$0]));break;case 155:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Obj($$[$0-2],$$[$0-3].generated));break;case 161:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Class);break;case 162:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Class(null,null,$$[$0]));break;case 163:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Class(null,$$[$0]));break;case 164:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Class(null,$$[$0-1],$$[$0]));break;case 165:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Class($$[$0]));break;case 166:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Class($$[$0-1],null,$$[$0]));break;case 167:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Class($$[$0-2],$$[$0]));break;case 168:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Class($$[$0-3],$$[$0-1],$$[$0]));break;case 169:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(null,$$[$0]));break;case 170:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(null,$$[$0-2],$$[$0]));break;case 171:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-2],null),$$[$0]));break;case 172:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-4],null),$$[$0-2],$$[$0]));break;case 173:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,$$[$0-2]),$$[$0]));break;case 174:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,$$[$0-4]),$$[$0-2],$$[$0]));break;case 175:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList([])),$$[$0]));break;case 176:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList([])),$$[$0-2],$$[$0]));break;case 177:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList($$[$0-4])),$$[$0]));break;case 178:this.$=yy.addDataToNode(yy,_$[$0-8],$$[$0-8],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause(null,new yy.ImportSpecifierList($$[$0-6])),$$[$0-2],$$[$0]));break;case 179:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-4],$$[$0-2]),$$[$0]));break;case 180:this.$=yy.addDataToNode(yy,_$[$0-7],$$[$0-7],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-6],$$[$0-4]),$$[$0-2],$$[$0]));break;case 181:this.$=yy.addDataToNode(yy,_$[$0-8],$$[$0-8],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-7],new yy.ImportSpecifierList($$[$0-4])),$$[$0]));break;case 182:this.$=yy.addDataToNode(yy,_$[$0-10],$$[$0-10],_$[$0],$$[$0],!0)(new yy.ImportDeclaration(new yy.ImportClause($$[$0-9],new yy.ImportSpecifierList($$[$0-6])),$$[$0-2],$$[$0]));break;case 186:case 211:case 245:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)($$[$0-2]);break;case 188:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ImportSpecifier($$[$0]));break;case 189:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ImportSpecifier($$[$0-2],$$[$0]));break;case 190:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ImportSpecifier(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.DefaultLiteral($$[$0]))));break;case 191:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ImportSpecifier(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.DefaultLiteral($$[$0-2])),$$[$0]));break;case 192:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ImportDefaultSpecifier($$[$0]));break;case 193:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ImportNamespaceSpecifier(new yy.Literal($$[$0-2]),$$[$0]));break;case 194:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([])));break;case 195:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-2])));break;case 196:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration($$[$0]));break;case 197:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-2],$$[$0],null,{moduleDeclaration:\"export\"}))));break;case 198:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-3],$$[$0],null,{moduleDeclaration:\"export\"}))));break;case 199:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-4],$$[$0-1],null,{moduleDeclaration:\"export\"}))));break;case 200:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportDefaultDeclaration($$[$0]));break;case 201:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportDefaultDeclaration(new yy.Value($$[$0-1])));break;case 202:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.ExportAllDeclaration(new yy.Literal($$[$0-2]),$$[$0]));break;case 203:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.ExportAllDeclaration(new yy.Literal($$[$0-4]),$$[$0-2],$$[$0]));break;case 204:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([]),$$[$0]));break;case 205:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList([]),$$[$0-2],$$[$0]));break;case 206:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-4]),$$[$0]));break;case 207:this.$=yy.addDataToNode(yy,_$[$0-8],$$[$0-8],_$[$0],$$[$0],!0)(new yy.ExportNamedDeclaration(new yy.ExportSpecifierList($$[$0-6]),$$[$0-2],$$[$0]));break;case 213:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ExportSpecifier($$[$0]));break;case 214:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportSpecifier($$[$0-2],$$[$0]));break;case 215:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportSpecifier($$[$0-2],yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.DefaultLiteral($$[$0]))));break;case 216:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.ExportSpecifier(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.DefaultLiteral($$[$0]))));break;case 217:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.ExportSpecifier(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.DefaultLiteral($$[$0-2])),$$[$0]));break;case 218:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.TaggedTemplateCall($$[$0-2],$$[$0],$$[$0-1].soak));break;case 222:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({soak:!1});break;case 223:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({soak:!0});break;case 224:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([]);break;case 225:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(function(){return $$[$0-2].implicit=$$[$0-3].generated,$$[$0-2]}());break;case 226:case 227:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Value(new yy.ThisLiteral($$[$0])));break;case 228:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Value(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.ThisLiteral($$[$0-1])),[yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Access($$[$0]))],\"this\"));break;case 229:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Arr([]));break;case 230:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Arr($$[$0-1]));break;case 231:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Arr([].concat($$[$0-2],$$[$0-1])));break;case 232:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({exclusive:!1});break;case 233:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)({exclusive:!0});break;case 234:case 235:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Range($$[$0-3],$$[$0-1],$$[$0-2].exclusive?\"exclusive\":\"inclusive\"));break;case 236:case 238:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Range($$[$0-2],$$[$0],$$[$0-1].exclusive?\"exclusive\":\"inclusive\"));break;case 237:case 239:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Range($$[$0-1],null,$$[$0].exclusive?\"exclusive\":\"inclusive\"));break;case 240:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Range(null,$$[$0],$$[$0-1].exclusive?\"exclusive\":\"inclusive\"));break;case 241:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Range(null,null,$$[$0].exclusive?\"exclusive\":\"inclusive\"));break;case 254:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)($$[$0-2].concat($$[$0-1]));break;case 255:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)($$[$0-5].concat($$[$0-4],$$[$0-2],$$[$0-1]));break;case 259:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)([].concat($$[$0]));break;case 262:this.$=yy.addDataToNode(yy,_$[$0],$$[$0],_$[$0],$$[$0],!0)(new yy.Elision);break;case 263:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1]);break;case 266:case 267:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)([].concat($$[$0-2],$$[$0]));break;case 268:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Try($$[$0]));break;case 269:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Try($$[$0-1],$$[$0]));break;case 270:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Try($$[$0-2],null,$$[$0],yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))));break;case 271:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Try($$[$0-3],$$[$0-2],$$[$0],yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))));break;case 272:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Catch($$[$0],$$[$0-1]));break;case 273:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Catch($$[$0],yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Value($$[$0-1]))));break;case 274:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Catch($$[$0]));break;case 275:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Throw($$[$0]));break;case 276:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Throw(new yy.Value($$[$0-1])));break;case 277:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Parens($$[$0-1]));break;case 278:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Parens($$[$0-2]));break;case 279:case 283:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While($$[$0]));break;case 280:case 284:case 285:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.While($$[$0-2],{guard:$$[$0]}));break;case 281:case 286:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While($$[$0],{invert:!0}));break;case 282:case 287:case 288:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.While($$[$0-2],{invert:!0,guard:$$[$0]}));break;case 289:case 290:case 298:case 299:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].addBody($$[$0]));break;case 291:case 292:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(Object.assign($$[$0],{postfix:!0}).addBody(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(yy.Block.wrap([$$[$0-1]]))));break;case 294:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.BooleanLiteral(\"true\")),{isLoop:!0}).addBody($$[$0]));break;case 295:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.While(yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.BooleanLiteral(\"true\")),{isLoop:!0}).addBody(yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(yy.Block.wrap([$$[$0]]))));break;case 296:case 297:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(function(){return $$[$0].postfix=!0,$$[$0].addBody($$[$0-1])}());break;case 300:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.For([],{source:yy.addDataToNode(yy,_$[$0],$$[$0],null,null,!0)(new yy.Value($$[$0]))}));break;case 301:case 303:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.For([],{source:yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(new yy.Value($$[$0-2])),step:$$[$0]}));break;case 302:case 304:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)($$[$0-1].addSource($$[$0]));break;case 305:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.For([],{name:$$[$0][0],index:$$[$0][1]}));break;case 306:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(function(){var _$$$$=_slicedToArray($$[$0],2),index,name;return name=_$$$$[0],index=_$$$$[1],new yy.For([],{name:name,index:index,await:!0,awaitTag:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))})}());break;case 307:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(function(){var _$$$$2=_slicedToArray($$[$0],2),index,name;return name=_$$$$2[0],index=_$$$$2[1],new yy.For([],{name:name,index:index,own:!0,ownTag:yy.addDataToNode(yy,_$[$0-1],$$[$0-1],null,null,!0)(new yy.Literal($$[$0-1]))})}());break;case 313:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)([$$[$0-2],$$[$0]]);break;case 314:case 333:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)({source:$$[$0]});break;case 315:case 334:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)({source:$$[$0],object:!0});break;case 316:case 317:case 335:case 336:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],guard:$$[$0]});break;case 318:case 319:case 337:case 338:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],guard:$$[$0],object:!0});break;case 320:case 321:case 339:case 340:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],step:$$[$0]});break;case 322:case 323:case 324:case 325:case 341:case 342:case 343:case 344:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)({source:$$[$0-4],guard:$$[$0-2],step:$$[$0]});break;case 326:case 327:case 328:case 329:case 345:case 346:case 347:case 348:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)({source:$$[$0-4],step:$$[$0-2],guard:$$[$0]});break;case 330:case 349:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)({source:$$[$0],from:!0});break;case 331:case 332:case 350:case 351:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)({source:$$[$0-2],guard:$$[$0],from:!0});break;case 352:case 353:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Switch($$[$0-3],$$[$0-1]));break;case 354:case 355:this.$=yy.addDataToNode(yy,_$[$0-6],$$[$0-6],_$[$0],$$[$0],!0)(new yy.Switch($$[$0-5],$$[$0-3],yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0-1],$$[$0-1],!0)($$[$0-1])));break;case 356:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Switch(null,$$[$0-1]));break;case 357:this.$=yy.addDataToNode(yy,_$[$0-5],$$[$0-5],_$[$0],$$[$0],!0)(new yy.Switch(null,$$[$0-3],yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0-1],$$[$0-1],!0)($$[$0-1])));break;case 360:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.SwitchWhen($$[$0-1],$$[$0]));break;case 361:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!1)(yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0-1],$$[$0-1],!0)(new yy.SwitchWhen($$[$0-2],$$[$0-1])));break;case 362:case 368:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.If($$[$0-1],$$[$0],{type:$$[$0-2]}));break;case 363:case 369:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)($$[$0-4].addElse(yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.If($$[$0-1],$$[$0],{type:$$[$0-2]}))));break;case 365:case 371:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)($$[$0-2].addElse($$[$0]));break;case 366:case 367:case 372:case 373:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.If($$[$0],yy.addDataToNode(yy,_$[$0-2],$$[$0-2],null,null,!0)(yy.Block.wrap([$$[$0-2]])),{type:$$[$0-1],postfix:!0}));break;case 377:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1].toString(),$$[$0],void 0,void 0,{originalOperator:$$[$0-1].original}));break;case 380:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"-\",$$[$0]));break;case 381:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"+\",$$[$0]));break;case 384:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"--\",$$[$0]));break;case 385:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"++\",$$[$0]));break;case 386:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"--\",$$[$0-1],null,!0));break;case 387:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Op(\"++\",$$[$0-1],null,!0));break;case 388:this.$=yy.addDataToNode(yy,_$[$0-1],$$[$0-1],_$[$0],$$[$0],!0)(new yy.Existence($$[$0-1]));break;case 389:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op(\"+\",$$[$0-2],$$[$0]));break;case 390:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op(\"-\",$$[$0-2],$$[$0]));break;case 391:case 392:case 393:case 395:case 396:case 397:case 400:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1],$$[$0-2],$$[$0]));break;case 394:case 398:case 399:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Op($$[$0-1].toString(),$$[$0-2],$$[$0],void 0,{originalOperator:$$[$0-1].original}));break;case 401:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(function(){var ref,ref1;return new yy.Op($$[$0-1].toString(),$$[$0-2],$$[$0],void 0,{invertOperator:null==(ref=null==(ref1=$$[$0-1].invert)?void 0:ref1.original)?$$[$0-1].invert:ref})}());break;case 402:this.$=yy.addDataToNode(yy,_$[$0-2],$$[$0-2],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-2],$$[$0],$$[$0-1].toString(),{originalContext:$$[$0-1].original}));break;case 403:this.$=yy.addDataToNode(yy,_$[$0-4],$$[$0-4],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-4],$$[$0-1],$$[$0-3].toString(),{originalContext:$$[$0-3].original}));break;case 404:this.$=yy.addDataToNode(yy,_$[$0-3],$$[$0-3],_$[$0],$$[$0],!0)(new yy.Assign($$[$0-3],$$[$0],$$[$0-2].toString(),{originalContext:$$[$0-2].original}));}},table:[{1:[2,1],3:1,4:2,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{1:[3]},{1:[2,2],6:$VM},o($VN,[2,3]),o($VO,[2,6],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,7]),o($VO,[2,8],{167:123,160:125,163:126,157:$VP,159:$VQ,165:$VR,183:$V51}),o($VO,[2,9]),o($V61,[2,16],{83:127,86:128,113:134,46:$V71,47:$V71,136:$V71,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1}),o($V61,[2,17],{113:134,86:137,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1}),o($V61,[2,18]),o($V61,[2,19]),o($V61,[2,20]),o($V61,[2,21]),o($V61,[2,22]),o($V61,[2,23]),o($V61,[2,24]),o($V61,[2,25]),o($V61,[2,26]),o($V61,[2,27]),o($VO,[2,28]),o($VO,[2,29]),o($VO,[2,30]),o($Vf1,[2,12]),o($Vf1,[2,13]),o($Vf1,[2,14]),o($Vf1,[2,15]),o($VO,[2,10]),o($VO,[2,11]),o($Vg1,$Vh1,{66:[1,138]}),o($Vg1,[2,130]),o($Vg1,[2,131]),o($Vg1,[2,132]),o($Vg1,$Vi1),o($Vg1,[2,134]),o($Vg1,[2,135]),o($Vg1,[2,136]),o($Vg1,[2,137]),o($Vj1,$Vk1,{90:139,97:140,98:141,38:143,72:144,99:145,34:146,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{5:150,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:$Vo1,34:66,37:149,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:152,8:153,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:157,8:158,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:159,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:167,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:168,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:169,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vw1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:[1,171],88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:172,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:176,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},o($Vx1,$Vy1,{191:[1,177],192:[1,178],205:[1,179]}),o($V61,[2,364],{178:[1,180]}),{33:$Vo1,37:181},{33:$Vo1,37:182},{33:$Vo1,37:183},o($V61,[2,293]),{33:$Vo1,37:184},{33:$Vo1,37:185},{7:186,8:187,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:[1,188],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz1,[2,161],{58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,99:65,34:66,43:67,53:69,38:85,72:86,45:95,92:161,17:173,18:174,65:175,37:189,101:191,33:$Vo1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,121:[1,190],139:$Vu,154:$Vx,187:$Vv1}),{7:192,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,193],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,35,52,74,76,96,137,144,155,157,158,159,165,166,183,193,194,195,196,197,198,199,200,201,202,203,204],$VA1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:194,14:$V0,32:$Vp1,33:$VB1,36:$VC1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:[1,197],88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VO,[2,370],{178:[1,198]}),{18:200,29:199,89:$Vl,92:39,93:$Vm,94:$Vn},o([1,6,35,52,74,76,96,137,144,155,157,158,159,165,166,183],$VD1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:201,14:$V0,32:$Vp1,33:$VE1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{38:207,39:$V2,40:$V3,45:203,46:$V5,47:$V6,117:[1,206],124:204,125:205,130:$VF1},{26:210,38:211,39:$V2,40:$V3,117:[1,209],120:$Vr,129:[1,212],133:[1,213]},o($Vx1,[2,127]),o($Vx1,[2,128]),o($Vg1,[2,52]),o($Vg1,[2,53]),o($Vg1,[2,54]),o($Vg1,[2,55]),o($Vg1,[2,56]),o($Vg1,[2,57]),o($Vg1,[2,58]),o($Vg1,[2,59]),{4:214,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:[1,215],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:216,8:217,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:$VH1,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:219,141:220,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{83:228,105:$VK1,106:$VL1,135:$Ve1,136:$V71},{84:231,136:$VM1},o($Vg1,[2,226]),o($Vg1,$VN1,{41:233,42:$VO1}),{105:[1,235]},{105:[1,236]},o($VP1,[2,102]),o($VP1,[2,103]),o($VQ1,[2,122]),o($VQ1,[2,125]),{7:237,8:238,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:239,8:240,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:241,8:242,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:244,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vo1,34:66,37:243,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vf,75:$Vm1,88:$VR1,99:252,102:245,117:$Vq,170:246,171:$VS1,172:249},{168:254,169:255,173:[1,256],174:[1,257],175:[1,258]},o([6,33,96,119],$VT1,{45:95,118:259,67:260,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),o($VZ1,[2,40]),o($VZ1,[2,41]),o($Vg1,[2,50]),{17:173,18:174,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:279,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:175,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:280,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,139:$Vu,154:$Vx,187:$Vv1},o($V_1,[2,37]),o($V_1,[2,38]),o($V$1,[2,42]),{45:284,46:$V5,47:$V6,48:281,50:282,51:$V02},o($VN,[2,5],{7:4,8:5,9:6,10:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,11:27,12:28,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,5:285,14:$V0,32:$V1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V61,[2,388]),{7:286,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:287,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:288,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:289,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:290,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:291,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:292,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:293,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:294,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:295,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:296,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:297,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:298,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:299,8:300,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,292]),o($V61,[2,297]),{7:239,8:301,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:241,8:302,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vf,75:$Vm1,88:$VR1,99:252,102:303,117:$Vq,170:246,171:$VS1,172:249},{168:254,173:[1,304],174:[1,305],175:[1,306]},{7:307,8:308,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,291]),o($V61,[2,296]),{45:309,46:$V5,47:$V6,84:310,136:$VM1},o($VQ1,[2,123]),o($V12,[2,223]),{41:311,42:$VO1},{41:312,42:$VO1},o($VQ1,[2,147],{41:313,42:$VO1}),o($VQ1,[2,148],{41:314,42:$VO1}),o($VQ1,[2,149]),{7:317,8:319,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:[1,316],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$V22,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,114:315,116:318,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,143:320,144:$V32,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{106:$V91,113:323,115:$Vd1},o($VQ1,[2,124]),{6:[1,325],7:324,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,326],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V42,$V52,{95:329,91:[1,327],96:$V62}),o($V72,[2,107]),o($V72,[2,111],{66:[1,331],76:[1,330]}),o($V72,[2,115],{38:143,72:144,99:145,34:146,98:332,39:$V2,40:$V3,73:$Vl1,75:$Vm1,117:$Vq}),o($V82,[2,116]),o($V82,[2,117]),o($V82,[2,118]),o($V82,[2,119]),{41:233,42:$VO1},{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:$VH1,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:219,141:220,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vg1,[2,99]),o($VO,[2,101]),{4:336,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,35:[1,335],38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V92,$Va2,{160:118,163:119,167:123,193:$VV}),o($VO,[2,374]),{7:169,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:$Vw1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{157:$VP,159:$VQ,160:125,163:126,165:$VR,167:123,183:$V51},o([1,6,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,193,194,195,196,197,198,199,200,201,202,203,204],$VA1,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:194,14:$V0,32:$Vp1,33:$VB1,36:$VC1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V92,$Vb2,{160:118,163:119,167:123,193:$VV}),o($VO,[2,375]),o($Vc2,[2,379],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vj1,$Vk1,{97:140,98:141,38:143,72:144,99:145,34:146,90:338,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{33:$Vo1,37:149},{7:339,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:340,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{157:$VP,159:$VQ,160:125,163:126,165:$VR,167:123,183:[1,341]},{18:200,89:$Vr1,92:161,93:$Vm,94:$Vn},{7:342,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vc2,[2,380],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vc2,[2,381],{160:118,163:119,167:123,193:$VV,195:$VX}),o($V92,[2,382],{160:118,163:119,167:123,193:$VV}),{34:343,117:$Vq},o($VO,[2,97],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:344,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$VD1,159:$VD1,165:$VD1,183:$VD1,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V61,[2,384],{46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1}),o($V12,$V71,{83:127,86:128,113:134,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1}),{86:137,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,113:134,115:$Vd1},o($Vd2,$Vh1),o($V61,[2,385],{46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1}),o($V61,[2,386]),o($V61,[2,387]),{6:[1,347],7:345,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,346],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$Vo1,37:348,182:[1,349]},o($V61,[2,268],{150:350,151:[1,351],152:[1,352]}),o($V61,[2,289]),o($V61,[2,290]),o($V61,[2,298]),o($V61,[2,299]),{33:[1,353],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[1,354]},{177:355,179:356,180:$Ve2},o($V61,[2,162]),{7:358,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz1,[2,165],{37:359,33:$Vo1,46:$Vy1,47:$Vy1,105:$Vy1,106:$Vy1,110:$Vy1,111:$Vy1,112:$Vy1,115:$Vy1,135:$Vy1,136:$Vy1,121:[1,360]}),o($Vf2,[2,275],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:361,117:$Vq},o($Vf2,[2,32],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:362,117:$Vq},{7:363,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,35,52,74,76,96,137,144,155,158,166],[2,95],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:364,14:$V0,32:$Vp1,33:$VE1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$VD1,159:$VD1,165:$VD1,183:$VD1,162:$VA,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{33:$Vo1,37:365,182:[1,366]},o($VO,[2,376]),o($Vg1,[2,405]),o($Vf1,$Vg2,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:367,117:$Vq},o($Vf1,[2,169],{123:[1,368]}),{36:[1,369],96:[1,370]},{36:[1,371]},{33:$Vh2,38:376,39:$V2,40:$V3,119:[1,372],126:373,127:374,129:$Vi2},o([36,96],[2,192]),{128:[1,378]},{33:$Vj2,38:383,39:$V2,40:$V3,119:[1,379],129:$Vk2,132:380,134:381},o($Vf1,[2,196]),{66:[1,385]},{7:386,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,387],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{36:[1,388]},{6:$VM,155:[1,389]},{4:390,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vl2,$Vm2,{160:118,163:119,167:123,143:391,76:[1,392],144:$V32,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vl2,$Vn2,{143:393,76:$V22,144:$V32}),o($Vo2,[2,229]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,74:[1,394],75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:396,147:395,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([6,33,74],$V52,{142:397,95:399,96:$Vp2}),o($Vq2,[2,260],{6:$Vr2}),o($Vs2,[2,251]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,141:401,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vt2,[2,262]),o($Vs2,[2,256]),o($Vu2,[2,249]),o($Vu2,[2,250],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:403,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{84:404,136:$VM1},{41:405,42:$VO1},{7:406,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,407],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vv2,[2,221]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,137:[1,408],138:409,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vx2,[2,228]),o($Vx2,[2,39]),{41:412,42:$VO1},{41:413,42:$VO1},{33:$Vo1,37:414,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:$Vo1,37:415},o($Vy2,[2,283],{160:118,163:119,167:123,157:$VP,158:[1,416],159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:[2,279],158:[1,417]},o($Vy2,[2,286],{160:118,163:119,167:123,157:$VP,158:[1,418],159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:[2,281],158:[1,419]},o($V61,[2,294]),o($Vz2,[2,295],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$VA2,166:[1,420]},o($VB2,[2,305]),{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,170:421,172:249},{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,170:422,172:249},o($VB2,[2,312],{96:[1,423]}),o($VC2,[2,308]),o($VC2,[2,309]),o($VC2,[2,310]),o($VC2,[2,311]),o($V61,[2,302]),{33:[2,304]},{7:424,8:425,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:426,8:427,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:428,8:429,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VD2,$V52,{95:430,96:$VE2}),o($VF2,[2,157]),o($VF2,[2,63],{70:[1,432]}),o($VF2,[2,64]),o($VG2,[2,72],{113:134,83:435,86:436,66:[1,433],76:[1,434],105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),{7:437,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([76,105,106,110,111,112,115,135,136],$VN1,{41:233,42:$VO1,73:[1,438]}),o($VG2,[2,75]),{34:273,38:269,39:$V2,40:$V3,41:270,42:$VO1,71:439,72:271,75:$Vg,77:440,78:272,79:274,80:275,81:276,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx},{76:[1,441],83:442,86:443,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,113:134,115:$Vd1,135:$Ve1,136:$V71},o($VH2,[2,69]),o($VH2,[2,70]),o($VH2,[2,71]),o($VI2,[2,80]),o($VI2,[2,81]),o($VI2,[2,82]),o($VI2,[2,83]),o($VI2,[2,84]),{83:444,105:$VK1,106:$VL1,135:$Ve1,136:$V71},{84:445,136:$VM1},o($Vd2,$Vi1,{57:[1,446]}),o($Vd2,$Vy1),{45:284,46:$V5,47:$V6,49:[1,447],50:448,51:$V02},o($VJ2,[2,44]),{4:449,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:[1,450],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,52:[1,451],53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VJ2,[2,49]),o($VN,[2,4]),o($VK2,[2,389],{160:118,163:119,167:123,193:$VV,194:$VW,195:$VX}),o($VK2,[2,390],{160:118,163:119,167:123,193:$VV,194:$VW,195:$VX}),o($Vc2,[2,391],{160:118,163:119,167:123,193:$VV,195:$VX}),o($Vc2,[2,392],{160:118,163:119,167:123,193:$VV,195:$VX}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,196,197,198,199,200,201,202,203,204],[2,393],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,197,198,199,200,201,202,203],[2,394],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,198,199,200,201,202,203],[2,395],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,199,200,201,202,203],[2,396],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,200,201,202,203],[2,397],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,201,202,203],[2,398],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,202,203],[2,399],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,203],[2,400],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,204:$V41}),o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,166,183,197,198,199,200,201,202,203,204],[2,401],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY}),o($Vz2,$VL2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,373]),{158:[1,452]},{158:[1,453]},o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,158,159,165,183,189,190,193,194,195,196,197,198,199,200,201,202,203,204],$VA2,{166:[1,454]}),{7:455,8:456,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:457,8:458,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:459,8:460,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vz2,$VM2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,372]),o($Vv2,[2,218]),o($Vv2,[2,219]),o($VQ1,[2,143]),o($VQ1,[2,144]),o($VQ1,[2,145]),o($VQ1,[2,146]),{107:[1,461]},{7:317,8:319,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$V22,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,114:462,116:318,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,143:320,144:$V32,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VN2,[2,153],{160:118,163:119,167:123,143:463,76:$V22,144:$V32,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VN2,[2,154]),{76:$V22,143:464,144:$V32},o($VN2,[2,241],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:465,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VO2,[2,232]),o($VO2,$VP2),o($VQ1,[2,152]),o($Vf2,[2,60],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:466,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:467,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{92:468,93:$Vm,94:$Vn},o($VQ2,$VR2,{98:141,38:143,72:144,99:145,34:146,97:469,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),{6:$VS2,33:$VT2},o($V72,[2,112]),{7:472,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,113]),o($Vu2,$Vm2,{160:118,163:119,167:123,76:[1,473],157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vu2,$Vn2),o($VU2,[2,35]),{6:$VM,35:[1,474]},{7:475,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V42,$V52,{95:329,91:[1,476],96:$V62}),o($V92,$Va2,{160:118,163:119,167:123,193:$VV}),o($V92,$Vb2,{160:118,163:119,167:123,193:$VV}),{7:477,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$Vo1,37:414,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{35:[1,478]},o($VO,[2,96],{160:118,163:119,167:123,157:$Vg2,159:$Vg2,165:$Vg2,183:$Vg2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,[2,402],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:479,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:480,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,365]),{7:481,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,269],{151:[1,482]}),{33:$Vo1,37:483},{33:$Vo1,34:485,37:486,38:484,39:$V2,40:$V3,117:$Vq},{177:487,179:356,180:$Ve2},{177:488,179:356,180:$Ve2},{35:[1,489],178:[1,490],179:491,180:$Ve2},o($VW2,[2,358]),{7:493,8:494,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,148:492,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VX2,[2,163],{160:118,163:119,167:123,37:495,33:$Vo1,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,166]),{7:496,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,497]},{35:[1,498]},o($Vf2,[2,34],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,94],{160:118,163:119,167:123,157:$Vg2,159:$Vg2,165:$Vg2,183:$Vg2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VO,[2,371]),{7:500,8:499,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,501]},{34:502,117:$Vq},{45:503,46:$V5,47:$V6},{117:[1,505],125:504,130:$VF1},{45:506,46:$V5,47:$V6},{36:[1,507]},o($VD2,$V52,{95:508,96:$VY2}),o($VF2,[2,183]),{33:$Vh2,38:376,39:$V2,40:$V3,126:510,127:374,129:$Vi2},o($VF2,[2,188],{128:[1,511]}),o($VF2,[2,190],{128:[1,512]}),{38:513,39:$V2,40:$V3},o($Vf1,[2,194],{36:[1,514]}),o($VD2,$V52,{95:515,96:$VZ2}),o($VF2,[2,208]),{33:$Vj2,38:383,39:$V2,40:$V3,129:$Vk2,132:517,134:381},o($VF2,[2,213],{128:[1,518]}),o($VF2,[2,216],{128:[1,519]}),{6:[1,521],7:520,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,522],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V_2,[2,200],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{34:523,117:$Vq},{45:524,46:$V5,47:$V6},o($Vg1,[2,277]),{6:$VM,35:[1,525]},{7:526,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([14,32,39,40,44,46,47,54,55,59,60,61,62,63,64,73,75,82,85,87,88,89,93,94,108,109,117,120,122,131,139,149,153,154,157,159,162,165,176,182,185,186,187,188,189,190,191,192],$VP2,{6:$V$2,33:$V$2,74:$V$2,96:$V$2}),{7:527,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vo2,[2,230]),o($Vq2,[2,261],{6:$Vr2}),o($Vs2,[2,257]),{33:$V03,74:[1,528]},o([6,33,35,74],$VR2,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,147:221,145:225,100:226,7:333,8:334,146:530,140:531,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,96:$VJ1,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($V13,[2,258],{6:[1,532]}),o($Vt2,[2,263]),o($VQ2,$V52,{95:399,142:533,96:$Vp2}),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:396,147:395,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vu2,[2,121],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vv2,[2,220]),o($Vg1,[2,138]),{107:[1,534],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{7:535,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vv2,[2,224]),o([6,33,137],$V52,{95:536,96:$V23}),o($V33,[2,242]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,138:538,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vg1,[2,141]),o($Vg1,[2,142]),o($V43,[2,362]),o($V53,[2,368]),{7:539,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:540,8:541,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:542,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:543,8:544,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:545,8:546,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VB2,[2,306]),o($VB2,[2,307]),{34:253,38:250,39:$V2,40:$V3,72:251,73:$Vl1,75:$Vm1,99:252,117:$Vq,172:547},{33:$V63,157:$VP,158:[1,548],159:$VQ,160:118,163:119,165:$VR,166:[1,549],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,333],158:[1,550],166:[1,551]},{33:$V73,157:$VP,158:[1,552],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,334],158:[1,553]},{33:$V83,157:$VP,158:[1,554],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,349],158:[1,555]},{6:$V93,33:$Va3,119:[1,556]},o($Vb3,$VR2,{45:95,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,67:559,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),{7:560,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,561],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:562,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,33:[1,563],34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,76]),{84:564,136:$VM1},o($VI2,[2,89]),{74:[1,565],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{7:566,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,77],{113:134,83:435,86:436,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),o($VF2,[2,79],{113:134,83:442,86:443,105:$V81,106:$V91,110:$Va1,111:$Vb1,112:$Vc1,115:$Vd1,135:$Ve1,136:$V71}),o($VF2,[2,78]),{84:567,136:$VM1},o($VI2,[2,90]),{84:568,136:$VM1},o($VI2,[2,86]),o($Vg1,[2,51]),o($V$1,[2,43]),o($VJ2,[2,45]),{6:$VM,52:[1,569]},{4:570,5:3,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VJ2,[2,48]),{7:571,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:572,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:573,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o([1,6,33,35,52,74,76,91,96,107,119,137,144,155,157,159,165,183],$V63,{160:118,163:119,167:123,158:[1,574],166:[1,575],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,576],166:[1,577]},o($Vc3,$V73,{160:118,163:119,167:123,158:[1,578],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,579]},o($Vc3,$V83,{160:118,163:119,167:123,158:[1,580],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,581]},o($VQ1,[2,150]),{35:[1,582]},o($VN2,[2,237],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:583,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VN2,[2,239],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,101:48,181:49,160:51,156:52,161:53,163:54,164:55,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,92:161,9:164,7:584,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VN2,[2,240],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,[2,61],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{35:[1,585],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{5:587,7:4,8:5,9:6,10:7,11:27,12:28,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$V1,33:$Vo1,34:66,37:586,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vk,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,108]),{34:146,38:143,39:$V2,40:$V3,72:144,73:$Vl1,75:$Vm1,76:$Vn1,97:588,98:141,99:145,117:$Vq},o($Vd3,$Vk1,{97:140,98:141,38:143,72:144,99:145,34:146,90:589,39:$V2,40:$V3,73:$Vl1,75:$Vm1,76:$Vn1,117:$Vq}),o($V72,[2,114],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vu2,$V$2),o($VU2,[2,36]),o($Vz2,$VL2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{92:590,93:$Vm,94:$Vn},o($Vz2,$VM2,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,383]),{35:[1,591],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf2,[2,404],{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vo1,37:592,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:$Vo1,37:593},o($V61,[2,270]),{33:$Vo1,37:594},{33:$Vo1,37:595},o($Ve3,[2,274]),{35:[1,596],178:[1,597],179:491,180:$Ve2},{35:[1,598],178:[1,599],179:491,180:$Ve2},o($V61,[2,356]),{33:$Vo1,37:600},o($VW2,[2,359]),{33:$Vo1,37:601,96:[1,602]},o($Vf3,[2,264],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf3,[2,265]),o($V61,[2,164]),o($VX2,[2,167],{160:118,163:119,167:123,37:603,33:$Vo1,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,276]),o($V61,[2,33]),{33:$Vo1,37:604},{157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf1,[2,92]),o($Vf1,[2,170]),o($Vf1,[2,171],{123:[1,605]}),{36:[1,606]},{33:$Vh2,38:376,39:$V2,40:$V3,126:607,127:374,129:$Vi2},o($Vf1,[2,173],{123:[1,608]}),{45:609,46:$V5,47:$V6},{6:$Vg3,33:$Vh3,119:[1,610]},o($Vb3,$VR2,{38:376,127:613,39:$V2,40:$V3,129:$Vi2}),o($VQ2,$V52,{95:614,96:$VY2}),{38:615,39:$V2,40:$V3},{38:616,39:$V2,40:$V3},{36:[2,193]},{45:617,46:$V5,47:$V6},{6:$Vi3,33:$Vj3,119:[1,618]},o($Vb3,$VR2,{38:383,134:621,39:$V2,40:$V3,129:$Vk2}),o($VQ2,$V52,{95:622,96:$VZ2}),{38:623,39:$V2,40:$V3,129:[1,624]},{38:625,39:$V2,40:$V3},o($V_2,[2,197],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:626,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:627,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{35:[1,628]},o($Vf1,[2,202],{123:[1,629]}),{155:[1,630]},{74:[1,631],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{74:[1,632],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vo2,[2,231]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$VG1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,141:633,145:225,146:222,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vs2,[2,252]),o($V13,[2,259],{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,100:226,7:333,8:334,147:395,145:396,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,96:$VJ1,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,96:$VJ1,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,140:402,145:225,146:634,147:221,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{33:$V03,35:[1,635]},o($Vg1,[2,139]),{35:[1,636],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{6:$Vk3,33:$Vl3,137:[1,637]},o([6,33,35,137],$VR2,{17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,13:23,15:25,16:26,65:29,58:30,79:31,102:32,56:33,103:34,81:35,80:36,104:37,92:39,101:48,181:49,160:51,156:52,161:53,163:54,164:55,184:60,99:65,34:66,43:67,53:69,38:85,72:86,167:92,45:95,9:155,100:226,7:333,8:334,145:640,14:$V0,32:$Vp1,39:$V2,40:$V3,44:$V4,46:$V5,47:$V6,54:$V7,55:$V8,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,73:$Vf,75:$Vg,76:$VI1,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,93:$Vm,94:$Vn,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,157:$Vy,159:$Vz,162:$VA,165:$VB,176:$VC,182:$VD,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL}),o($VQ2,$V52,{95:641,96:$V23}),o($Vz2,[2,284],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vm3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,280]},o($Vz2,[2,287],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{33:$Vn3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,282]},{33:$Vo3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,303]},o($VB2,[2,313]),{7:642,8:643,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:644,8:645,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:646,8:647,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:648,8:649,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:650,8:651,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:652,8:653,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:654,8:655,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:656,8:657,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($Vo2,[2,155]),{34:273,38:269,39:$V2,40:$V3,41:270,42:$VO1,43:266,44:$V4,45:95,46:$V5,47:$V6,67:658,68:261,69:262,71:263,72:271,73:$VU1,75:$VV1,76:$VW1,77:268,78:272,79:274,80:275,81:276,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx},o($Vd3,$VT1,{45:95,67:260,68:261,69:262,71:263,43:266,77:268,38:269,41:270,72:271,78:272,34:273,79:274,80:275,81:276,118:659,39:$V2,40:$V3,42:$VO1,44:$V4,46:$V5,47:$V6,73:$VU1,75:$VV1,76:$VW1,82:$VX1,85:$VY1,117:$Vq,139:$Vu,154:$Vx}),o($VF2,[2,158]),o($VF2,[2,65],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:660,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VF2,[2,67],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:661,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($VI2,[2,87]),o($VG2,[2,73]),{74:[1,662],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($VI2,[2,88]),o($VI2,[2,85]),o($VJ2,[2,46]),{6:$VM,35:[1,663]},o($Vz2,$Vm3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vz2,$Vn3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vz2,$Vo3,{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{7:664,8:665,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:666,8:667,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:668,8:669,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:670,8:671,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:672,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:673,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:674,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:675,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{107:[1,676]},o($VN2,[2,236],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VN2,[2,238],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($V61,[2,62]),o($Vg1,[2,98]),o($VO,[2,100]),o($V72,[2,109]),o($VQ2,$V52,{95:677,96:$V62}),{33:$Vo1,37:586},o($V61,[2,403]),o($V43,[2,363]),o($V61,[2,271]),o($Ve3,[2,272]),o($Ve3,[2,273]),o($V61,[2,352]),{33:$Vo1,37:678},o($V61,[2,353]),{33:$Vo1,37:679},{35:[1,680]},o($VW2,[2,360],{6:[1,681]}),{7:682,8:683,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V61,[2,168]),o($V53,[2,369]),{34:684,117:$Vq},{45:685,46:$V5,47:$V6},o($VD2,$V52,{95:686,96:$VY2}),{34:687,117:$Vq},o($Vf1,[2,175],{123:[1,688]}),{36:[1,689]},{38:376,39:$V2,40:$V3,127:690,129:$Vi2},{33:$Vh2,38:376,39:$V2,40:$V3,126:691,127:374,129:$Vi2},o($VF2,[2,184]),{6:$Vg3,33:$Vh3,35:[1,692]},o($VF2,[2,189]),o($VF2,[2,191]),o($Vf1,[2,204],{123:[1,693]}),o($Vf1,[2,195],{36:[1,694]}),{38:383,39:$V2,40:$V3,129:$Vk2,134:695},{33:$Vj2,38:383,39:$V2,40:$V3,129:$Vk2,132:696,134:381},o($VF2,[2,209]),{6:$Vi3,33:$Vj3,35:[1,697]},o($VF2,[2,214]),o($VF2,[2,215]),o($VF2,[2,217]),o($V_2,[2,198],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{35:[1,698],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($Vf1,[2,201]),{34:699,117:$Vq},o($Vg1,[2,278]),o($Vg1,[2,234]),o($Vg1,[2,235]),o($VQ2,$V52,{95:399,142:700,96:$Vp2}),o($Vs2,[2,253]),o($Vs2,[2,254]),{107:[1,701]},o($Vv2,[2,225]),{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,145:702,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:333,8:334,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,33:$Vw2,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,76:$VI1,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,100:226,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,138:703,139:$Vu,145:410,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V33,[2,243]),{6:$Vk3,33:$Vl3,35:[1,704]},{33:$Vp3,157:$VP,159:$VQ,160:118,163:119,165:$VR,166:[1,705],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,335],166:[1,706]},{33:$Vq3,157:$VP,158:[1,707],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,339],158:[1,708]},{33:$Vr3,157:$VP,159:$VQ,160:118,163:119,165:$VR,166:[1,709],167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,336],166:[1,710]},{33:$Vs3,157:$VP,158:[1,711],159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,340],158:[1,712]},{33:$Vt3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,337]},{33:$Vu3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,338]},{33:$Vv3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,350]},{33:$Vw3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,351]},o($VF2,[2,159]),o($VQ2,$V52,{95:713,96:$VE2}),{35:[1,714],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{35:[1,715],157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VV2,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},o($VG2,[2,74]),{52:[1,716]},o($Vx3,$Vp3,{160:118,163:119,167:123,166:[1,717],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{166:[1,718]},o($Vc3,$Vq3,{160:118,163:119,167:123,158:[1,719],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,720]},o($Vx3,$Vr3,{160:118,163:119,167:123,166:[1,721],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{166:[1,722]},o($Vc3,$Vs3,{160:118,163:119,167:123,158:[1,723],189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),{158:[1,724]},o($Vf2,$Vt3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vu3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vv3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vw3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($VQ1,[2,151]),{6:$VS2,33:$VT2,35:[1,725]},{35:[1,726]},{35:[1,727]},o($V61,[2,357]),o($VW2,[2,361]),o($Vf3,[2,266],{160:118,163:119,167:123,157:$VP,159:$VQ,165:$VR,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf3,[2,267]),o($Vf1,[2,172]),o($Vf1,[2,179],{123:[1,728]}),{6:$Vg3,33:$Vh3,119:[1,729]},o($Vf1,[2,174]),{34:730,117:$Vq},{45:731,46:$V5,47:$V6},o($VF2,[2,185]),o($VQ2,$V52,{95:732,96:$VY2}),o($VF2,[2,186]),{34:733,117:$Vq},{45:734,46:$V5,47:$V6},o($VF2,[2,210]),o($VQ2,$V52,{95:735,96:$VZ2}),o($VF2,[2,211]),o($Vf1,[2,199]),o($Vf1,[2,203]),{33:$V03,35:[1,736]},o($Vg1,[2,140]),o($V33,[2,244]),o($VQ2,$V52,{95:737,96:$V23}),o($V33,[2,245]),{7:738,8:739,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:740,8:741,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:742,8:743,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:744,8:745,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:746,8:747,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:748,8:749,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:750,8:751,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:752,8:753,9:155,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vl,92:39,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$VD,184:60,185:$VE,186:$VF,187:$VG,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{6:$V93,33:$Va3,35:[1,754]},o($VF2,[2,66]),o($VF2,[2,68]),o($VJ2,[2,47]),{7:755,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:756,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:757,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:758,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:759,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:760,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:761,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},{7:762,9:164,13:23,14:$V0,15:25,16:26,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,32:$Vp1,34:66,38:85,39:$V2,40:$V3,43:67,44:$V4,45:95,46:$V5,47:$V6,53:69,54:$V7,55:$V8,56:33,58:30,59:$V9,60:$Va,61:$Vb,62:$Vc,63:$Vd,64:$Ve,65:29,72:86,73:$Vf,75:$Vg,79:31,80:36,81:35,82:$Vh,85:$Vi,87:$Vj,88:$Vq1,89:$Vr1,92:161,93:$Vm,94:$Vn,99:65,101:48,102:32,103:34,104:37,108:$Vo,109:$Vp,117:$Vq,120:$Vr,122:$Vs,131:$Vt,139:$Vu,149:$Vv,153:$Vw,154:$Vx,156:52,157:$Vy,159:$Vz,160:51,161:53,162:$VA,163:54,164:55,165:$VB,167:92,176:$VC,181:49,182:$Vs1,185:$Vt1,186:$Vu1,187:$Vv1,188:$VH,189:$VI,190:$VJ,191:$VK,192:$VL},o($V72,[2,110]),o($V61,[2,354]),o($V61,[2,355]),{34:763,117:$Vq},{36:[1,764]},o($Vf1,[2,176]),o($Vf1,[2,177],{123:[1,765]}),{6:$Vg3,33:$Vh3,35:[1,766]},o($Vf1,[2,205]),o($Vf1,[2,206],{123:[1,767]}),{6:$Vi3,33:$Vj3,35:[1,768]},o($Vs2,[2,255]),{6:$Vk3,33:$Vl3,35:[1,769]},{33:$Vy3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,341]},{33:$Vz3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,343]},{33:$VA3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,345]},{33:$VB3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,347]},{33:$VC3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,342]},{33:$VD3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,344]},{33:$VE3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,346]},{33:$VF3,157:$VP,159:$VQ,160:118,163:119,165:$VR,167:123,183:$VS,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41},{33:[2,348]},o($VF2,[2,160]),o($Vf2,$Vy3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$Vz3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VA3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VB3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VC3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VD3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VE3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf2,$VF3,{160:118,163:119,167:123,189:$VT,190:$VU,193:$VV,194:$VW,195:$VX,196:$VY,197:$VZ,198:$V_,199:$V$,200:$V01,201:$V11,202:$V21,203:$V31,204:$V41}),o($Vf1,[2,180]),{45:770,46:$V5,47:$V6},{34:771,117:$Vq},o($VF2,[2,187]),{34:772,117:$Vq},o($VF2,[2,212]),o($V33,[2,246]),o($Vf1,[2,181],{123:[1,773]}),o($Vf1,[2,178]),o($Vf1,[2,207]),{34:774,117:$Vq},o($Vf1,[2,182])],defaultActions:{255:[2,304],513:[2,193],541:[2,280],544:[2,282],546:[2,303],651:[2,337],653:[2,338],655:[2,350],657:[2,351],739:[2,341],741:[2,343],743:[2,345],745:[2,347],747:[2,342],749:[2,344],751:[2,346],753:[2,348]},parseError:function(str,hash){if(hash.recoverable)this.trace(str);else{var error=new Error(str);throw error.hash=hash,error}},parse:function(input){var self=this,stack=[0],vstack=[null],lstack=[],table=this.table,yytext=\"\",yylineno=0,yyleng=0,recovering=0,EOF=1,args=lstack.slice.call(arguments,1),lexer=Object.create(this.lexer),sharedState={yy:{}};for(var k in this.yy)Object.prototype.hasOwnProperty.call(this.yy,k)&&(sharedState.yy[k]=this.yy[k]);lexer.setInput(input,sharedState.yy),sharedState.yy.lexer=lexer,sharedState.yy.parser=this,\"undefined\"==typeof lexer.yylloc&&(lexer.yylloc={});var yyloc=lexer.yylloc;lstack.push(yyloc);var ranges=lexer.options&&lexer.options.ranges;this.parseError=\"function\"==typeof sharedState.yy.parseError?sharedState.yy.parseError:Object.getPrototypeOf(this).parseError;_token_stack:var lex=function(){var token;return token=lexer.lex()||EOF,\"number\"!=typeof token&&(token=self.symbols_[token]||token),token};for(var yyval={},symbol,preErrorSymbol,state,action,r,p,len,newState,expected;;){if(state=stack[stack.length-1],this.defaultActions[state]?action=this.defaultActions[state]:((null===symbol||\"undefined\"==typeof symbol)&&(symbol=lex()),action=table[state]&&table[state][symbol]),\"undefined\"==typeof action||!action.length||!action[0]){var errStr=\"\";for(p in expected=[],table[state])this.terminals_[p]&&p>2&&expected.push(\"'\"+this.terminals_[p]+\"'\");errStr=lexer.showPosition?\"Parse error on line \"+(yylineno+1)+\":\\n\"+lexer.showPosition()+\"\\nExpecting \"+expected.join(\", \")+\", got '\"+(this.terminals_[symbol]||symbol)+\"'\":\"Parse error on line \"+(yylineno+1)+\": Unexpected \"+(symbol==EOF?\"end of input\":\"'\"+(this.terminals_[symbol]||symbol)+\"'\"),this.parseError(errStr,{text:lexer.match,token:this.terminals_[symbol]||symbol,line:lexer.yylineno,loc:yyloc,expected:expected})}if(action[0]instanceof Array&&1<action.length)throw new Error(\"Parse Error: multiple actions possible at state: \"+state+\", token: \"+symbol);switch(action[0]){case 1:stack.push(symbol),vstack.push(lexer.yytext),lstack.push(lexer.yylloc),stack.push(action[1]),symbol=null,preErrorSymbol?(symbol=preErrorSymbol,preErrorSymbol=null):(yyleng=lexer.yyleng,yytext=lexer.yytext,yylineno=lexer.yylineno,yyloc=lexer.yylloc,0<recovering&&recovering--);break;case 2:if(len=this.productions_[action[1]][1],yyval.$=vstack[vstack.length-len],yyval._$={first_line:lstack[lstack.length-(len||1)].first_line,last_line:lstack[lstack.length-1].last_line,first_column:lstack[lstack.length-(len||1)].first_column,last_column:lstack[lstack.length-1].last_column},ranges&&(yyval._$.range=[lstack[lstack.length-(len||1)].range[0],lstack[lstack.length-1].range[1]]),r=this.performAction.apply(yyval,[yytext,yyleng,yylineno,sharedState.yy,action[1],vstack,lstack].concat(args)),\"undefined\"!=typeof r)return r;len&&(stack=stack.slice(0,2*(-1*len)),vstack=vstack.slice(0,-1*len),lstack=lstack.slice(0,-1*len)),stack.push(this.productions_[action[1]][0]),vstack.push(yyval.$),lstack.push(yyval._$),newState=table[stack[stack.length-2]][stack[stack.length-1]],stack.push(newState);break;case 3:return!0;}}return!0}};return Parser.prototype=parser,parser.Parser=Parser,new Parser}();return\"undefined\"!=typeof require&&\"undefined\"!=typeof exports&&(exports.parser=parser,exports.Parser=parser.Parser,exports.parse=function(){return parser.parse.apply(parser,arguments)},exports.main=function(){},require.main===module&&exports.main(process.argv.slice(1))),module.exports}(),require[\"./scope\"]=function(){var exports={};return function(){var indexOf=[].indexOf,Scope;exports.Scope=Scope=function(){function Scope(parent,expressions,method,referencedVars){_classCallCheck(this,Scope);var ref,ref1;this.parent=parent,this.expressions=expressions,this.method=method,this.referencedVars=referencedVars,this.variables=[{name:\"arguments\",type:\"arguments\"}],this.comments={},this.positions={},this.parent||(this.utilities={}),this.root=null==(ref=null==(ref1=this.parent)?void 0:ref1.root)?this:ref}return _createClass(Scope,[{key:\"add\",value:function add(name,type,immediate){return this.shared&&!immediate?this.parent.add(name,type,immediate):Object.prototype.hasOwnProperty.call(this.positions,name)?this.variables[this.positions[name]].type=type:this.positions[name]=this.variables.push({name:name,type:type})-1}},{key:\"namedMethod\",value:function namedMethod(){var ref;return(null==(ref=this.method)?void 0:ref.name)||!this.parent?this.method:this.parent.namedMethod()}},{key:\"find\",value:function find(name){var type=1<arguments.length&&void 0!==arguments[1]?arguments[1]:\"var\";return!!this.check(name)||(this.add(name,type),!1)}},{key:\"parameter\",value:function parameter(name){return this.shared&&this.parent.check(name,!0)?void 0:this.add(name,\"param\")}},{key:\"check\",value:function check(name){var ref;return!!(this.type(name)||(null==(ref=this.parent)?void 0:ref.check(name)))}},{key:\"temporary\",value:function temporary(name,index){var single=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],diff,endCode,letter,newCode,num,startCode;return single?(startCode=name.charCodeAt(0),endCode=\"z\".charCodeAt(0),diff=endCode-startCode,newCode=startCode+index%(diff+1),letter=_StringfromCharCode(newCode),num=_Mathfloor(index/(diff+1)),\"\".concat(letter).concat(num||\"\")):\"\".concat(name).concat(index||\"\")}},{key:\"type\",value:function type(name){var i,len,ref,v;for(ref=this.variables,i=0,len=ref.length;i<len;i++)if(v=ref[i],v.name===name)return v.type;return null}},{key:\"freeVariable\",value:function freeVariable(name){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},index,ref,temp;for(index=0;temp=this.temporary(name,index,options.single),!!(this.check(temp)||0<=indexOf.call(this.root.referencedVars,temp));)index++;return(null==(ref=options.reserve)||ref)&&this.add(temp,\"var\",!0),temp}},{key:\"assign\",value:function assign(name,value){return this.add(name,{value:value,assigned:!0},!0),this.hasAssignments=!0}},{key:\"hasDeclarations\",value:function hasDeclarations(){return!!this.declaredVariables().length}},{key:\"declaredVariables\",value:function declaredVariables(){var v;return function(){var i,len,ref,results;for(ref=this.variables,results=[],(i=0,len=ref.length);i<len;i++)v=ref[i],\"var\"===v.type&&results.push(v.name);return results}.call(this).sort()}},{key:\"assignedVariables\",value:function assignedVariables(){var i,len,ref,results,v;for(ref=this.variables,results=[],(i=0,len=ref.length);i<len;i++)v=ref[i],v.type.assigned&&results.push(\"\".concat(v.name,\" = \").concat(v.type.value));return results}}]),Scope}()}.call(this),{exports:exports}.exports}(),require[\"./nodes\"]=function(){var exports={};return function(){var indexOf=[].indexOf,splice=[].splice,slice1=[].slice,Access,Arr,Assign,AwaitReturn,Base,Block,BooleanLiteral,Call,Catch,Class,ClassProperty,ClassPrototypeProperty,Code,CodeFragment,ComputedPropertyName,DefaultLiteral,Directive,DynamicImport,DynamicImportCall,Elision,EmptyInterpolation,ExecutableClassBody,Existence,Expansion,ExportAllDeclaration,ExportDeclaration,ExportDefaultDeclaration,ExportNamedDeclaration,ExportSpecifier,ExportSpecifierList,Extends,For,FuncDirectiveReturn,FuncGlyph,HEREGEX_OMIT,HereComment,HoistTarget,IdentifierLiteral,If,ImportClause,ImportDeclaration,ImportDefaultSpecifier,ImportNamespaceSpecifier,ImportSpecifier,ImportSpecifierList,In,Index,InfinityLiteral,Interpolation,JSXAttribute,JSXAttributes,JSXElement,JSXEmptyExpression,JSXExpressionContainer,JSXIdentifier,JSXNamespacedName,JSXTag,JSXText,JS_FORBIDDEN,LEADING_BLANK_LINE,LEVEL_ACCESS,LEVEL_COND,LEVEL_LIST,LEVEL_OP,LEVEL_PAREN,LEVEL_TOP,LineComment,Literal,MetaProperty,ModuleDeclaration,ModuleSpecifier,ModuleSpecifierList,NEGATE,NO,NaNLiteral,NullLiteral,NumberLiteral,Obj,ObjectProperty,Op,Param,Parens,PassthroughLiteral,PropertyName,Range,RegexLiteral,RegexWithInterpolations,Return,Root,SIMPLENUM,SIMPLE_STRING_OMIT,STRING_OMIT,Scope,Sequence,Slice,Splat,StatementLiteral,StringLiteral,StringWithInterpolations,Super,SuperCall,Switch,SwitchCase,SwitchWhen,TAB,THIS,TRAILING_BLANK_LINE,TaggedTemplateCall,TemplateElement,ThisLiteral,Throw,Try,UTILITIES,UndefinedLiteral,Value,While,YES,YieldReturn,addDataToNode,astAsBlockIfNeeded,attachCommentsToNode,compact,del,emptyExpressionLocationData,ends,extend,extractSameLineLocationDataFirst,extractSameLineLocationDataLast,flatten,fragmentsToText,greater,hasLineComments,indentInitial,isAstLocGreater,isFunction,isLiteralArguments,isLiteralThis,isLocationDataEndGreater,isLocationDataStartGreater,isNumber,isPlainObject,isUnassignable,jisonLocationDataToAstLocationData,lesser,locationDataToString,makeDelimitedLiteral,merge,mergeAstLocationData,mergeLocationData,moveComments,multident,parseNumber,replaceUnicodeCodePointEscapes,shouldCacheOrIsAssignable,sniffDirectives,some,starts,throwSyntaxError,_unfoldSoak,unshiftAfterComments,utility,zeroWidthLocationDataFromEndLocation;Error.stackTraceLimit=2e308;var _require4=require(\"./scope\");Scope=_require4.Scope;var _require5=require(\"./lexer\");isUnassignable=_require5.isUnassignable,JS_FORBIDDEN=_require5.JS_FORBIDDEN;var _require6=require(\"./helpers\");compact=_require6.compact,flatten=_require6.flatten,extend=_require6.extend,merge=_require6.merge,del=_require6.del,starts=_require6.starts,ends=_require6.ends,some=_require6.some,addDataToNode=_require6.addDataToNode,attachCommentsToNode=_require6.attachCommentsToNode,locationDataToString=_require6.locationDataToString,throwSyntaxError=_require6.throwSyntaxError,replaceUnicodeCodePointEscapes=_require6.replaceUnicodeCodePointEscapes,isFunction=_require6.isFunction,isPlainObject=_require6.isPlainObject,isNumber=_require6.isNumber,parseNumber=_require6.parseNumber,exports.extend=extend,exports.addDataToNode=addDataToNode,YES=function(){return!0},NO=function(){return!1},THIS=function(){return this},NEGATE=function(){return this.negated=!this.negated,this},exports.CodeFragment=CodeFragment=function(){function CodeFragment(parent,code){_classCallCheck(this,CodeFragment);var ref1;this.code=\"\".concat(code),this.type=(null==parent||null==(ref1=parent.constructor)?void 0:ref1.name)||\"unknown\",this.locationData=null==parent?void 0:parent.locationData,this.comments=null==parent?void 0:parent.comments}return _createClass(CodeFragment,[{key:\"toString\",value:function toString(){return\"\".concat(this.code).concat(this.locationData?\": \"+locationDataToString(this.locationData):\"\")}}]),CodeFragment}(),fragmentsToText=function(fragments){var fragment;return function(){var j,len1,results1;for(results1=[],j=0,len1=fragments.length;j<len1;j++)fragment=fragments[j],results1.push(fragment.code);return results1}().join(\"\")},exports.Base=Base=function(){var Base=function(){function Base(){_classCallCheck(this,Base)}return _createClass(Base,[{key:\"compile\",value:function(o,lvl){return fragmentsToText(this.compileToFragments(o,lvl))}},{key:\"compileWithoutComments\",value:function compileWithoutComments(o,lvl){var method=2<arguments.length&&void 0!==arguments[2]?arguments[2]:\"compile\",fragments,unwrapped;return this.comments&&(this.ignoreTheseCommentsTemporarily=this.comments,delete this.comments),unwrapped=this.unwrapAll(),unwrapped.comments&&(unwrapped.ignoreTheseCommentsTemporarily=unwrapped.comments,delete unwrapped.comments),fragments=this[method](o,lvl),this.ignoreTheseCommentsTemporarily&&(this.comments=this.ignoreTheseCommentsTemporarily,delete this.ignoreTheseCommentsTemporarily),unwrapped.ignoreTheseCommentsTemporarily&&(unwrapped.comments=unwrapped.ignoreTheseCommentsTemporarily,delete unwrapped.ignoreTheseCommentsTemporarily),fragments}},{key:\"compileNodeWithoutComments\",value:function compileNodeWithoutComments(o,lvl){return this.compileWithoutComments(o,lvl,\"compileNode\")}},{key:\"compileToFragments\",value:function compileToFragments(o,lvl){var fragments,node;return o=extend({},o),lvl&&(o.level=lvl),node=this.unfoldSoak(o)||this,node.tab=o.indent,fragments=o.level!==LEVEL_TOP&&node.isStatement(o)?node.compileClosure(o):node.compileNode(o),this.compileCommentFragments(o,node,fragments),fragments}},{key:\"compileToFragmentsWithoutComments\",value:function compileToFragmentsWithoutComments(o,lvl){return this.compileWithoutComments(o,lvl,\"compileToFragments\")}},{key:\"compileClosure\",value:function compileClosure(o){var args,argumentsNode,func,meth,parts,ref1,ref2;switch(this.checkForPureStatementInExpression(),o.sharedScope=!0,func=new Code([],Block.wrap([this])),args=[],this.contains(function(node){return node instanceof SuperCall})?func.bound=!0:((argumentsNode=this.contains(isLiteralArguments))||this.contains(isLiteralThis))&&(args=[new ThisLiteral],argumentsNode?(meth=\"apply\",args.push(new IdentifierLiteral(\"arguments\"))):meth=\"call\",func=new Value(func,[new Access(new PropertyName(meth))])),parts=new Call(func,args).compileNode(o),!1){case!(func.isGenerator||(null==(ref1=func.base)?void 0:ref1.isGenerator)):parts.unshift(this.makeCode(\"(yield* \")),parts.push(this.makeCode(\")\"));break;case!(func.isAsync||(null==(ref2=func.base)?void 0:ref2.isAsync)):parts.unshift(this.makeCode(\"(await \")),parts.push(this.makeCode(\")\"));}return parts}},{key:\"compileCommentFragments\",value:function compileCommentFragments(o,node,fragments){var base1,base2,comment,commentFragment,j,len1,ref1,unshiftCommentFragment;if(!node.comments)return fragments;for(unshiftCommentFragment=function(commentFragment){var precedingFragment;return commentFragment.unshift?unshiftAfterComments(fragments,commentFragment):(0!==fragments.length&&(precedingFragment=fragments[fragments.length-1],commentFragment.newLine&&\"\"!==precedingFragment.code&&!/\\n\\s*$/.test(precedingFragment.code)&&(commentFragment.code=\"\\n\".concat(commentFragment.code))),fragments.push(commentFragment))},ref1=node.comments,(j=0,len1=ref1.length);j<len1;j++)(comment=ref1[j],!!(0>indexOf.call(this.compiledComments,comment)))&&(this.compiledComments.push(comment),commentFragment=comment.here?new HereComment(comment).compileNode(o):new LineComment(comment).compileNode(o),commentFragment.isHereComment&&!commentFragment.newLine||node.includeCommentFragments()?unshiftCommentFragment(commentFragment):(0===fragments.length&&fragments.push(this.makeCode(\"\")),commentFragment.unshift?(null==(base1=fragments[0]).precedingComments&&(base1.precedingComments=[]),fragments[0].precedingComments.push(commentFragment)):(null==(base2=fragments[fragments.length-1]).followingComments&&(base2.followingComments=[]),fragments[fragments.length-1].followingComments.push(commentFragment))));return fragments}},{key:\"cache\",value:function cache(o,level,shouldCache){var complex,ref,sub;return complex=null==shouldCache?this.shouldCache():shouldCache(this),complex?(ref=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),sub=new Assign(ref,this),level?[sub.compileToFragments(o,level),[this.makeCode(ref.value)]]:[sub,ref]):(ref=level?this.compileToFragments(o,level):this,[ref,ref])}},{key:\"hoist\",value:function hoist(){var compileNode,compileToFragments,target;return this.hoisted=!0,target=new HoistTarget(this),compileNode=this.compileNode,compileToFragments=this.compileToFragments,this.compileNode=function(o){return target.update(compileNode,o)},this.compileToFragments=function(o){return target.update(compileToFragments,o)},target}},{key:\"cacheToCodeFragments\",value:function cacheToCodeFragments(cacheValues){return[fragmentsToText(cacheValues[0]),fragmentsToText(cacheValues[1])]}},{key:\"makeReturn\",value:function makeReturn(results,mark){var node;return mark?void(this.canBeReturned=!0):(node=this.unwrapAll(),results?new Call(new Literal(\"\".concat(results,\".push\")),[node]):new Return(node))}},{key:\"contains\",value:function contains(pred){var node;return node=void 0,this.traverseChildren(!1,function(n){if(pred(n))return node=n,!1}),node}},{key:\"lastNode\",value:function lastNode(list){return 0===list.length?null:list[list.length-1]}},{key:\"toString\",value:function toString(){var idt=0<arguments.length&&void 0!==arguments[0]?arguments[0]:\"\",name=1<arguments.length&&void 0!==arguments[1]?arguments[1]:this.constructor.name,tree;return tree=\"\\n\"+idt+name,this.soak&&(tree+=\"?\"),this.eachChild(function(node){return tree+=node.toString(idt+TAB)}),tree}},{key:\"checkForPureStatementInExpression\",value:function checkForPureStatementInExpression(){var jumpNode;if(jumpNode=this.jumps())return jumpNode.error(\"cannot use a pure statement in an expression\")}},{key:\"ast\",value:function ast(o,level){var astNode;return o=this.astInitialize(o,level),astNode=this.astNode(o),null!=this.astNode&&this.canBeReturned&&Object.assign(astNode,{returns:!0}),astNode}},{key:\"astInitialize\",value:function astInitialize(o,level){return o=Object.assign({},o),null!=level&&(o.level=level),o.level>LEVEL_TOP&&this.checkForPureStatementInExpression(),this.isStatement(o)&&o.level!==LEVEL_TOP&&null!=o.scope&&this.makeReturn(null,!0),o}},{key:\"astNode\",value:function astNode(o){return Object.assign({},{type:this.astType(o)},this.astProperties(o),this.astLocationData())}},{key:\"astProperties\",value:function astProperties(){return{}}},{key:\"astType\",value:function astType(){return this.constructor.name}},{key:\"astLocationData\",value:function astLocationData(){return jisonLocationDataToAstLocationData(this.locationData)}},{key:\"isStatementAst\",value:function isStatementAst(o){return this.isStatement(o)}},{key:\"eachChild\",value:function eachChild(func){var attr,child,j,k,len1,len2,ref1,ref2;if(!this.children)return this;for(ref1=this.children,j=0,len1=ref1.length;j<len1;j++)if(attr=ref1[j],this[attr])for(ref2=flatten([this[attr]]),k=0,len2=ref2.length;k<len2;k++)if(child=ref2[k],!1===func(child))return this;return this}},{key:\"traverseChildren\",value:function traverseChildren(crossScope,func){return this.eachChild(function(child){var recur;if(recur=func(child),!1!==recur)return child.traverseChildren(crossScope,func)})}},{key:\"replaceInContext\",value:function replaceInContext(match,replacement){var attr,child,children,i,j,k,len1,len2,ref1,ref2;if(!this.children)return!1;for(ref1=this.children,j=0,len1=ref1.length;j<len1;j++)if(attr=ref1[j],children=this[attr])if(Array.isArray(children))for(i=k=0,len2=children.length;k<len2;i=++k){if(child=children[i],match(child))return splice.apply(children,[i,i-i+1].concat(ref2=replacement(child,this))),ref2,!0;if(child.replaceInContext(match,replacement))return!0}else{if(match(children))return this[attr]=replacement(children,this),!0;if(children.replaceInContext(match,replacement))return!0}}},{key:\"invert\",value:function invert(){return new Op(\"!\",this)}},{key:\"unwrapAll\",value:function unwrapAll(){var node;for(node=this;node!==(node=node.unwrap());)continue;return node}},{key:\"updateLocationDataIfMissing\",value:function updateLocationDataIfMissing(locationData,force){return(force&&(this.forceUpdateLocation=!0),this.locationData&&!this.forceUpdateLocation)?this:(delete this.forceUpdateLocation,this.locationData=locationData,this.eachChild(function(child){return child.updateLocationDataIfMissing(locationData)}))}},{key:\"withLocationDataFrom\",value:function withLocationDataFrom(_ref19){var locationData=_ref19.locationData;return this.updateLocationDataIfMissing(locationData)}},{key:\"withLocationDataAndCommentsFrom\",value:function withLocationDataAndCommentsFrom(node){var comments;return this.withLocationDataFrom(node),comments=node.comments,(null==comments?void 0:comments.length)&&(this.comments=comments),this}},{key:\"error\",value:function error(message){return throwSyntaxError(message,this.locationData)}},{key:\"makeCode\",value:function makeCode(code){return new CodeFragment(this,code)}},{key:\"wrapInParentheses\",value:function wrapInParentheses(fragments){return[this.makeCode(\"(\")].concat(_toConsumableArray(fragments),[this.makeCode(\")\")])}},{key:\"wrapInBraces\",value:function wrapInBraces(fragments){return[this.makeCode(\"{\")].concat(_toConsumableArray(fragments),[this.makeCode(\"}\")])}},{key:\"joinFragmentArrays\",value:function joinFragmentArrays(fragmentsList,joinStr){var answer,fragments,i,j,len1;for(answer=[],i=j=0,len1=fragmentsList.length;j<len1;i=++j)fragments=fragmentsList[i],i&&answer.push(this.makeCode(joinStr)),answer=answer.concat(fragments);return answer}}]),Base}();return Base.prototype.children=[],Base.prototype.isStatement=NO,Base.prototype.compiledComments=[],Base.prototype.includeCommentFragments=NO,Base.prototype.jumps=NO,Base.prototype.shouldCache=YES,Base.prototype.isChainable=NO,Base.prototype.isAssignable=NO,Base.prototype.isNumber=NO,Base.prototype.unwrap=THIS,Base.prototype.unfoldSoak=NO,Base.prototype.assigns=NO,Base}.call(this),exports.HoistTarget=HoistTarget=function(_Base){function HoistTarget(source1){var _this8;return _classCallCheck(this,HoistTarget),_this8=_super.call(this),_this8.source=source1,_this8.options={},_this8.targetFragments={fragments:[]},_this8}_inherits(HoistTarget,_Base);var _super=_createSuper(HoistTarget);return _createClass(HoistTarget,[{key:\"isStatement\",value:function isStatement(o){return this.source.isStatement(o)}},{key:\"update\",value:function update(compile,o){return this.targetFragments.fragments=compile.call(this.source,merge(o,this.options))}},{key:\"compileToFragments\",value:function compileToFragments(o,level){return this.options.indent=o.indent,this.options.level=null==level?o.level:level,[this.targetFragments]}},{key:\"compileNode\",value:function compileNode(o){return this.compileToFragments(o)}},{key:\"compileClosure\",value:function compileClosure(o){return this.compileToFragments(o)}}],[{key:\"expand\",value:function expand(fragments){var fragment,i,j,ref1;for(i=j=fragments.length-1;0<=j;i=j+=-1)fragment=fragments[i],fragment.fragments&&(splice.apply(fragments,[i,i-i+1].concat(ref1=this.expand(fragment.fragments))),ref1);return fragments}}]),HoistTarget}(Base),exports.Root=Root=function(){var Root=function(_Base2){function Root(body1){var _this9;return _classCallCheck(this,Root),_this9=_super2.call(this),_this9.body=body1,_this9.isAsync=new Code([],_this9.body).isAsync,_this9}_inherits(Root,_Base2);var _super2=_createSuper(Root);return _createClass(Root,[{key:\"compileNode\",value:function compileNode(o){var fragments,functionKeyword;return(o.indent=o.bare?\"\":TAB,o.level=LEVEL_TOP,o.compiling=!0,this.initializeScope(o),fragments=this.body.compileRoot(o),o.bare)?fragments:(functionKeyword=\"\".concat(this.isAsync?\"async \":\"\",\"function\"),[].concat(this.makeCode(\"(\".concat(functionKeyword,\"() {\\n\")),fragments,this.makeCode(\"\\n}).call(this);\\n\")))}},{key:\"initializeScope\",value:function initializeScope(o){var j,len1,name,ref1,ref2,results1;for(o.scope=new Scope(null,this.body,null,null==(ref1=o.referencedVars)?[]:ref1),ref2=o.locals||[],results1=[],(j=0,len1=ref2.length);j<len1;j++)name=ref2[j],results1.push(o.scope.parameter(name));return results1}},{key:\"commentsAst\",value:function commentsAst(){var comment,commentToken,j,len1,ref1,results1;for(null==this.allComments&&(this.allComments=function(){var j,len1,ref1,ref2,results1;for(ref2=null==(ref1=this.allCommentTokens)?[]:ref1,results1=[],(j=0,len1=ref2.length);j<len1;j++)commentToken=ref2[j],commentToken.heregex||(commentToken.here?results1.push(new HereComment(commentToken)):results1.push(new LineComment(commentToken)));return results1}.call(this)),ref1=this.allComments,results1=[],(j=0,len1=ref1.length);j<len1;j++)comment=ref1[j],results1.push(comment.ast());return results1}},{key:\"astNode\",value:function astNode(o){return o.level=LEVEL_TOP,this.initializeScope(o),_get(_getPrototypeOf(Root.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"File\"}},{key:\"astProperties\",value:function astProperties(o){return this.body.isRootBlock=!0,{program:Object.assign(this.body.ast(o),this.astLocationData()),comments:this.commentsAst()}}}]),Root}(Base);return Root.prototype.children=[\"body\"],Root}.call(this),exports.Block=Block=function(){var Block=function(_Base3){function Block(nodes){var _this10;return _classCallCheck(this,Block),_this10=_super3.call(this),_this10.expressions=compact(flatten(nodes||[])),_this10}_inherits(Block,_Base3);var _super3=_createSuper(Block);return _createClass(Block,[{key:\"push\",value:function push(node){return this.expressions.push(node),this}},{key:\"pop\",value:function pop(){return this.expressions.pop()}},{key:\"unshift\",value:function unshift(node){return this.expressions.unshift(node),this}},{key:\"unwrap\",value:function unwrap(){return 1===this.expressions.length?this.expressions[0]:this}},{key:\"isEmpty\",value:function isEmpty(){return!this.expressions.length}},{key:\"isStatement\",value:function isStatement(o){var exp,j,len1,ref1;for(ref1=this.expressions,j=0,len1=ref1.length;j<len1;j++)if(exp=ref1[j],exp.isStatement(o))return!0;return!1}},{key:\"jumps\",value:function jumps(o){var exp,j,jumpNode,len1,ref1;for(ref1=this.expressions,j=0,len1=ref1.length;j<len1;j++)if(exp=ref1[j],jumpNode=exp.jumps(o))return jumpNode}},{key:\"makeReturn\",value:function makeReturn(results,mark){var _slice1$call,_slice1$call2,expr,expressions,last,lastExp,len,penult,ref1,ref2;if(len=this.expressions.length,ref1=this.expressions,_slice1$call=slice1.call(ref1,-1),_slice1$call2=_slicedToArray(_slice1$call,1),lastExp=_slice1$call2[0],_slice1$call,lastExp=(null==lastExp?void 0:lastExp.unwrap())||!1,lastExp&&lastExp instanceof Parens&&1<lastExp.body.expressions.length){var _lastExp=lastExp;expressions=_lastExp.body.expressions;var _slice1$call3=slice1.call(expressions,-2),_slice1$call4=_slicedToArray(_slice1$call3,2);penult=_slice1$call4[0],last=_slice1$call4[1],penult=penult.unwrap(),last=last.unwrap(),penult instanceof JSXElement&&last instanceof JSXElement&&expressions[expressions.length-1].error(\"Adjacent JSX elements must be wrapped in an enclosing tag\")}if(mark)return void(null!=(ref2=this.expressions[len-1])&&ref2.makeReturn(results,mark));for(;len--;){expr=this.expressions[len],this.expressions[len]=expr.makeReturn(results),expr instanceof Return&&!expr.expression&&this.expressions.splice(len,1);break}return this}},{key:\"compile\",value:function(o,lvl){return o.scope?_get(_getPrototypeOf(Block.prototype),\"compile\",this).call(this,o,lvl):new Root(this).withLocationDataFrom(this).compile(o,lvl)}},{key:\"compileNode\",value:function compileNode(o){var answer,compiledNodes,fragments,index,j,lastFragment,len1,node,ref1,top;for(this.tab=o.indent,top=o.level===LEVEL_TOP,compiledNodes=[],ref1=this.expressions,(index=j=0,len1=ref1.length);j<len1;index=++j){if(node=ref1[index],node.hoisted){node.compileToFragments(o);continue}if(node=node.unfoldSoak(o)||node,node instanceof Block)compiledNodes.push(node.compileNode(o));else if(top){if(node.front=!0,fragments=node.compileToFragments(o),!node.isStatement(o)){fragments=indentInitial(fragments,this);var _slice1$call5=slice1.call(fragments,-1),_slice1$call6=_slicedToArray(_slice1$call5,1);lastFragment=_slice1$call6[0],\"\"===lastFragment.code||lastFragment.isComment||fragments.push(this.makeCode(\";\"))}compiledNodes.push(fragments)}else compiledNodes.push(node.compileToFragments(o,LEVEL_LIST))}return top?this.spaced?[].concat(this.joinFragmentArrays(compiledNodes,\"\\n\\n\"),this.makeCode(\"\\n\")):this.joinFragmentArrays(compiledNodes,\"\\n\"):(answer=compiledNodes.length?this.joinFragmentArrays(compiledNodes,\", \"):[this.makeCode(\"void 0\")],1<compiledNodes.length&&o.level>=LEVEL_LIST?this.wrapInParentheses(answer):answer)}},{key:\"compileRoot\",value:function compileRoot(o){var fragments;return this.spaced=!0,fragments=this.compileWithDeclarations(o),HoistTarget.expand(fragments),this.compileComments(fragments)}},{key:\"compileWithDeclarations\",value:function compileWithDeclarations(o){var assigns,declaredVariable,declaredVariables,declaredVariablesIndex,declars,exp,fragments,i,j,k,len1,len2,post,ref1,rest,scope,spaced;for(fragments=[],post=[],ref1=this.expressions,(i=j=0,len1=ref1.length);j<len1&&(exp=ref1[i],exp=exp.unwrap(),!!(exp instanceof Literal));i=++j);if(o=merge(o,{level:LEVEL_TOP}),i){rest=this.expressions.splice(i,9e9);var _ref20=[this.spaced,!1];spaced=_ref20[0],this.spaced=_ref20[1];var _ref21=[this.compileNode(o),spaced];fragments=_ref21[0],this.spaced=_ref21[1],this.expressions=rest}post=this.compileNode(o);var _o2=o;if(scope=_o2.scope,scope.expressions===this)if(declars=o.scope.hasDeclarations(),assigns=scope.hasAssignments,declars||assigns){if(i&&fragments.push(this.makeCode(\"\\n\")),fragments.push(this.makeCode(\"\".concat(this.tab,\"var \"))),declars)for(declaredVariables=scope.declaredVariables(),declaredVariablesIndex=k=0,len2=declaredVariables.length;k<len2;declaredVariablesIndex=++k){if(declaredVariable=declaredVariables[declaredVariablesIndex],fragments.push(this.makeCode(declaredVariable)),Object.prototype.hasOwnProperty.call(o.scope.comments,declaredVariable)){var _fragments;(_fragments=fragments).push.apply(_fragments,_toConsumableArray(o.scope.comments[declaredVariable]))}declaredVariablesIndex!==declaredVariables.length-1&&fragments.push(this.makeCode(\", \"))}assigns&&(declars&&fragments.push(this.makeCode(\",\\n\".concat(this.tab+TAB))),fragments.push(this.makeCode(scope.assignedVariables().join(\",\\n\".concat(this.tab+TAB))))),fragments.push(this.makeCode(\";\\n\".concat(this.spaced?\"\\n\":\"\")))}else fragments.length&&post.length&&fragments.push(this.makeCode(\"\\n\"));return fragments.concat(post)}},{key:\"compileComments\",value:function compileComments(fragments){var code,commentFragment,fragment,fragmentIndent,fragmentIndex,indent,j,k,l,len1,len2,len3,newLineIndex,onNextLine,p,pastFragment,pastFragmentIndex,q,ref1,ref2,ref3,ref4,trail,upcomingFragment,upcomingFragmentIndex;for(fragmentIndex=j=0,len1=fragments.length;j<len1;fragmentIndex=++j){if(fragment=fragments[fragmentIndex],fragment.precedingComments){for(fragmentIndent=\"\",ref1=fragments.slice(0,fragmentIndex+1),k=ref1.length-1;0<=k;k+=-1)if(pastFragment=ref1[k],indent=/^ {2,}/m.exec(pastFragment.code),indent){fragmentIndent=indent[0];break}else if(0<=indexOf.call(pastFragment.code,\"\\n\"))break;for(code=\"\\n\".concat(fragmentIndent)+function(){var l,len2,ref2,results1;for(ref2=fragment.precedingComments,results1=[],(l=0,len2=ref2.length);l<len2;l++)commentFragment=ref2[l],commentFragment.isHereComment&&commentFragment.multiline?results1.push(multident(commentFragment.code,fragmentIndent,!1)):results1.push(commentFragment.code);return results1}().join(\"\\n\".concat(fragmentIndent)).replace(/^(\\s*)$/gm,\"\"),ref2=fragments.slice(0,fragmentIndex+1),pastFragmentIndex=l=ref2.length-1;0<=l;pastFragmentIndex=l+=-1){if(pastFragment=ref2[pastFragmentIndex],newLineIndex=pastFragment.code.lastIndexOf(\"\\n\"),-1===newLineIndex)if(0===pastFragmentIndex)pastFragment.code=\"\\n\"+pastFragment.code,newLineIndex=0;else if(pastFragment.isStringWithInterpolations&&\"{\"===pastFragment.code)code=code.slice(1)+\"\\n\",newLineIndex=1;else continue;delete fragment.precedingComments,pastFragment.code=pastFragment.code.slice(0,newLineIndex)+code+pastFragment.code.slice(newLineIndex);break}}if(fragment.followingComments){if(trail=fragment.followingComments[0].trail,fragmentIndent=\"\",!(trail&&1===fragment.followingComments.length))for(onNextLine=!1,ref3=fragments.slice(fragmentIndex),(p=0,len2=ref3.length);p<len2;p++)if(upcomingFragment=ref3[p],!onNextLine){if(0<=indexOf.call(upcomingFragment.code,\"\\n\"))onNextLine=!0;else continue;}else if(indent=/^ {2,}/m.exec(upcomingFragment.code),indent){fragmentIndent=indent[0];break}else if(0<=indexOf.call(upcomingFragment.code,\"\\n\"))break;for(code=1===fragmentIndex&&/^\\s+$/.test(fragments[0].code)?\"\":trail?\" \":\"\\n\".concat(fragmentIndent),code+=function(){var len3,q,ref4,results1;for(ref4=fragment.followingComments,results1=[],(q=0,len3=ref4.length);q<len3;q++)commentFragment=ref4[q],commentFragment.isHereComment&&commentFragment.multiline?results1.push(multident(commentFragment.code,fragmentIndent,!1)):results1.push(commentFragment.code);return results1}().join(\"\\n\".concat(fragmentIndent)).replace(/^(\\s*)$/gm,\"\"),ref4=fragments.slice(fragmentIndex),(upcomingFragmentIndex=q=0,len3=ref4.length);q<len3;upcomingFragmentIndex=++q){if(upcomingFragment=ref4[upcomingFragmentIndex],newLineIndex=upcomingFragment.code.indexOf(\"\\n\"),-1===newLineIndex)if(upcomingFragmentIndex===fragments.length-1)upcomingFragment.code+=\"\\n\",newLineIndex=upcomingFragment.code.length;else if(upcomingFragment.isStringWithInterpolations&&\"}\"===upcomingFragment.code)code=\"\".concat(code,\"\\n\"),newLineIndex=0;else continue;delete fragment.followingComments,\"\\n\"===upcomingFragment.code&&(code=code.replace(/^\\n/,\"\")),upcomingFragment.code=upcomingFragment.code.slice(0,newLineIndex)+code+upcomingFragment.code.slice(newLineIndex);break}}}return fragments}},{key:\"astNode\",value:function astNode(o){return null!=o.level&&o.level!==LEVEL_TOP&&this.expressions.length?new Sequence(this.expressions).withLocationDataFrom(this).ast(o):_get(_getPrototypeOf(Block.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isRootBlock?\"Program\":this.isClassBody?\"ClassBody\":\"BlockStatement\"}},{key:\"astProperties\",value:function astProperties(o){var body,checkForDirectives,directives,expression,expressionAst,j,len1,ref1;for(checkForDirectives=del(o,\"checkForDirectives\"),(this.isRootBlock||checkForDirectives)&&sniffDirectives(this.expressions,{notFinalExpression:checkForDirectives}),directives=[],body=[],ref1=this.expressions,(j=0,len1=ref1.length);j<len1;j++)if(expression=ref1[j],expressionAst=expression.ast(o),null==expressionAst)continue;else expression instanceof Directive?directives.push(expressionAst):expression.isStatementAst(o)?body.push(expressionAst):body.push(Object.assign({type:\"ExpressionStatement\",expression:expressionAst},expression.astLocationData()));return{body:body,directives:directives}}},{key:\"astLocationData\",value:function astLocationData(){return this.isRootBlock&&null==this.locationData?void 0:_get(_getPrototypeOf(Block.prototype),\"astLocationData\",this).call(this)}}],[{key:\"wrap\",value:function wrap(nodes){return 1===nodes.length&&nodes[0]instanceof Block?nodes[0]:new Block(nodes)}}]),Block}(Base);return Block.prototype.children=[\"expressions\"],Block}.call(this),exports.Directive=Directive=function(_Base4){function Directive(value1){var _this11;return _classCallCheck(this,Directive),_this11=_super4.call(this),_this11.value=value1,_this11}_inherits(Directive,_Base4);var _super4=_createSuper(Directive);return _createClass(Directive,[{key:\"astProperties\",value:function astProperties(o){return{value:Object.assign({},this.value.ast(o),{type:\"DirectiveLiteral\"})}}}]),Directive}(Base),exports.Literal=Literal=function(){var Literal=function(_Base5){function Literal(value1){var _this12;return _classCallCheck(this,Literal),_this12=_super5.call(this),_this12.value=value1,_this12}_inherits(Literal,_Base5);var _super5=_createSuper(Literal);return _createClass(Literal,[{key:\"assigns\",value:function assigns(name){return name===this.value}},{key:\"compileNode\",value:function compileNode(){return[this.makeCode(this.value)]}},{key:\"astProperties\",value:function astProperties(){return{value:this.value}}},{key:\"toString\",value:function toString(){return\" \".concat(this.isStatement()?_get(_getPrototypeOf(Literal.prototype),\"toString\",this).call(this):this.constructor.name,\": \").concat(this.value)}}]),Literal}(Base);return Literal.prototype.shouldCache=NO,Literal}.call(this),exports.NumberLiteral=NumberLiteral=function(_Literal){function NumberLiteral(value1){var _ref22=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},parsedValue=_ref22.parsedValue,_this13;return _classCallCheck(this,NumberLiteral),_this13=_super6.call(this),_this13.value=value1,_this13.parsedValue=parsedValue,null==_this13.parsedValue&&(isNumber(_this13.value)?(_this13.parsedValue=_this13.value,_this13.value=\"\".concat(_this13.value)):_this13.parsedValue=parseNumber(_this13.value)),_this13}_inherits(NumberLiteral,_Literal);var _super6=_createSuper(NumberLiteral);return _createClass(NumberLiteral,[{key:\"isBigInt\",value:function isBigInt(){return /n$/.test(this.value)}},{key:\"astType\",value:function astType(){return this.isBigInt()?\"BigIntLiteral\":\"NumericLiteral\"}},{key:\"astProperties\",value:function astProperties(){return{value:this.isBigInt()?this.parsedValue.toString():this.parsedValue,extra:{rawValue:this.isBigInt()?this.parsedValue.toString():this.parsedValue,raw:this.value}}}}]),NumberLiteral}(Literal),exports.InfinityLiteral=InfinityLiteral=function(_NumberLiteral){function InfinityLiteral(value1){var _ref23=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref23$originalValue=_ref23.originalValue,originalValue=void 0===_ref23$originalValue?\"Infinity\":_ref23$originalValue,_this14;return _classCallCheck(this,InfinityLiteral),_this14=_super7.call(this),_this14.value=value1,_this14.originalValue=originalValue,_this14}_inherits(InfinityLiteral,_NumberLiteral);var _super7=_createSuper(InfinityLiteral);return _createClass(InfinityLiteral,[{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\"2e308\")]}},{key:\"astNode\",value:function astNode(o){return\"Infinity\"===this.originalValue?_get(_getPrototypeOf(InfinityLiteral.prototype),\"astNode\",this).call(this,o):new NumberLiteral(this.value).withLocationDataFrom(this).ast(o)}},{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:\"Infinity\",declaration:!1}}}]),InfinityLiteral}(NumberLiteral),exports.NaNLiteral=NaNLiteral=function(_NumberLiteral2){function NaNLiteral(){return _classCallCheck(this,NaNLiteral),_super8.call(this,\"NaN\")}_inherits(NaNLiteral,_NumberLiteral2);var _super8=_createSuper(NaNLiteral);return _createClass(NaNLiteral,[{key:\"compileNode\",value:function compileNode(o){var code;return code=[this.makeCode(\"0/0\")],o.level>=LEVEL_OP?this.wrapInParentheses(code):code}},{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:\"NaN\",declaration:!1}}}]),NaNLiteral}(NumberLiteral),exports.StringLiteral=StringLiteral=function(_Literal2){function StringLiteral(originalValue){var _ref24=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},quote=_ref24.quote,initialChunk=_ref24.initialChunk,finalChunk=_ref24.finalChunk,indent1=_ref24.indent,double1=_ref24.double,heregex1=_ref24.heregex,_this15;_classCallCheck(this,StringLiteral);var heredoc,indentRegex,val;return _this15=_super9.call(this,\"\"),_this15.originalValue=originalValue,_this15.quote=quote,_this15.initialChunk=initialChunk,_this15.finalChunk=finalChunk,_this15.indent=indent1,_this15.double=double1,_this15.heregex=heregex1,\"///\"===_this15.quote&&(_this15.quote=null),_this15.fromSourceString=null!=_this15.quote,null==_this15.quote&&(_this15.quote=\"\\\"\"),heredoc=_this15.isFromHeredoc(),val=_this15.originalValue,_this15.heregex?(val=val.replace(HEREGEX_OMIT,\"$1$2\"),val=replaceUnicodeCodePointEscapes(val,{flags:_this15.heregex.flags})):(val=val.replace(STRING_OMIT,\"$1\"),val=_this15.fromSourceString?heredoc?(_this15.indent?indentRegex=RegExp(\"\\\\n\".concat(_this15.indent),\"g\"):void 0,indentRegex?val=val.replace(indentRegex,\"\\n\"):void 0,_this15.initialChunk?val=val.replace(LEADING_BLANK_LINE,\"\"):void 0,_this15.finalChunk?val=val.replace(TRAILING_BLANK_LINE,\"\"):void 0,val):val.replace(SIMPLE_STRING_OMIT,function(match,offset){return _this15.initialChunk&&0===offset||_this15.finalChunk&&offset+match.length===val.length?\"\":\" \"}):val),_this15.delimiter=_this15.quote.charAt(0),_this15.value=makeDelimitedLiteral(val,{delimiter:_this15.delimiter,double:_this15.double}),_this15.unquotedValueForTemplateLiteral=makeDelimitedLiteral(val,{delimiter:\"`\",double:_this15.double,escapeNewlines:!1,includeDelimiters:!1,convertTrailingNullEscapes:!0}),_this15.unquotedValueForJSX=makeDelimitedLiteral(val,{double:_this15.double,escapeNewlines:!1,includeDelimiters:!1,escapeDelimiter:!1}),_this15}_inherits(StringLiteral,_Literal2);var _super9=_createSuper(StringLiteral);return _createClass(StringLiteral,[{key:\"compileNode\",value:function compileNode(o){return this.shouldGenerateTemplateLiteral()?StringWithInterpolations.fromStringLiteral(this).compileNode(o):this.jsx?[this.makeCode(this.unquotedValueForJSX)]:_get(_getPrototypeOf(StringLiteral.prototype),\"compileNode\",this).call(this,o)}},{key:\"withoutQuotesInLocationData\",value:function withoutQuotesInLocationData(){var copy,endsWithNewline,locationData;return endsWithNewline=\"\\n\"===this.originalValue.slice(-1),locationData=Object.assign({},this.locationData),locationData.first_column+=this.quote.length,endsWithNewline?(locationData.last_line-=1,locationData.last_column=locationData.last_line===locationData.first_line?locationData.first_column+this.originalValue.length-\"\\n\".length:this.originalValue.slice(0,-1).length-\"\\n\".length-this.originalValue.slice(0,-1).lastIndexOf(\"\\n\")):locationData.last_column-=this.quote.length,locationData.last_column_exclusive-=this.quote.length,locationData.range=[locationData.range[0]+this.quote.length,locationData.range[1]-this.quote.length],copy=new StringLiteral(this.originalValue,{quote:this.quote,initialChunk:this.initialChunk,finalChunk:this.finalChunk,indent:this.indent,double:this.double,heregex:this.heregex}),copy.locationData=locationData,copy}},{key:\"isFromHeredoc\",value:function isFromHeredoc(){return 3===this.quote.length}},{key:\"shouldGenerateTemplateLiteral\",value:function shouldGenerateTemplateLiteral(){return this.isFromHeredoc()}},{key:\"astNode\",value:function astNode(o){return this.shouldGenerateTemplateLiteral()?StringWithInterpolations.fromStringLiteral(this).ast(o):_get(_getPrototypeOf(StringLiteral.prototype),\"astNode\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(){return{value:this.originalValue,extra:{raw:\"\".concat(this.delimiter).concat(this.originalValue).concat(this.delimiter)}}}}]),StringLiteral}(Literal),exports.RegexLiteral=RegexLiteral=function(){var RegexLiteral=function(_Literal3){function RegexLiteral(value){var _ref25=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref25$delimiter=_ref25.delimiter,delimiter1=void 0===_ref25$delimiter?\"/\":_ref25$delimiter,_ref25$heregexComment=_ref25.heregexCommentTokens,heregexCommentTokens=void 0===_ref25$heregexComment?[]:_ref25$heregexComment,_this16;_classCallCheck(this,RegexLiteral);var endDelimiterIndex,heregex,val;return _this16=_super10.call(this,\"\"),_this16.delimiter=delimiter1,_this16.heregexCommentTokens=heregexCommentTokens,heregex=\"///\"===_this16.delimiter,endDelimiterIndex=value.lastIndexOf(\"/\"),_this16.flags=value.slice(endDelimiterIndex+1),val=_this16.originalValue=value.slice(1,endDelimiterIndex),heregex&&(val=val.replace(HEREGEX_OMIT,\"$1$2\")),val=replaceUnicodeCodePointEscapes(val,{flags:_this16.flags}),_this16.value=\"\".concat(makeDelimitedLiteral(val,{delimiter:\"/\"})).concat(_this16.flags),_this16}_inherits(RegexLiteral,_Literal3);var _super10=_createSuper(RegexLiteral);return _createClass(RegexLiteral,[{key:\"astType\",value:function astType(){return\"RegExpLiteral\"}},{key:\"astProperties\",value:function astProperties(o){var _this$REGEX_REGEX$exe=this.REGEX_REGEX.exec(this.value),_this$REGEX_REGEX$exe2=_slicedToArray(_this$REGEX_REGEX$exe,2),heregexCommentToken,pattern;return pattern=_this$REGEX_REGEX$exe2[1],{value:void 0,pattern:pattern,flags:this.flags,delimiter:this.delimiter,originalPattern:this.originalValue,extra:{raw:this.value,originalRaw:\"\".concat(this.delimiter).concat(this.originalValue).concat(this.delimiter).concat(this.flags),rawValue:void 0},comments:function(){var j,len1,ref1,results1;for(ref1=this.heregexCommentTokens,results1=[],(j=0,len1=ref1.length);j<len1;j++)heregexCommentToken=ref1[j],heregexCommentToken.here?results1.push(new HereComment(heregexCommentToken).ast(o)):results1.push(new LineComment(heregexCommentToken).ast(o));return results1}.call(this)}}}]),RegexLiteral}(Literal);return RegexLiteral.prototype.REGEX_REGEX=/^\\/(.*)\\/\\w*$/,RegexLiteral}.call(this),exports.PassthroughLiteral=PassthroughLiteral=function(_Literal4){function PassthroughLiteral(originalValue){var _ref26=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},here=_ref26.here,generated=_ref26.generated,_this17;return _classCallCheck(this,PassthroughLiteral),_this17=_super11.call(this,\"\"),_this17.originalValue=originalValue,_this17.here=here,_this17.generated=generated,_this17.value=_this17.originalValue.replace(/\\\\+(`|$)/g,function(string){var _Mathceil=Math.ceil;return string.slice(-_Mathceil(string.length/2))}),_this17}_inherits(PassthroughLiteral,_Literal4);var _super11=_createSuper(PassthroughLiteral);return _createClass(PassthroughLiteral,[{key:\"astNode\",value:function astNode(o){return this.generated?null:_get(_getPrototypeOf(PassthroughLiteral.prototype),\"astNode\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(){return{value:this.originalValue,here:!!this.here}}}]),PassthroughLiteral}(Literal),exports.IdentifierLiteral=IdentifierLiteral=function(){var IdentifierLiteral=function(_Literal5){function IdentifierLiteral(){return _classCallCheck(this,IdentifierLiteral),_super12.apply(this,arguments)}_inherits(IdentifierLiteral,_Literal5);var _super12=_createSuper(IdentifierLiteral);return _createClass(IdentifierLiteral,[{key:\"eachName\",value:function eachName(iterator){return iterator(this)}},{key:\"astType\",value:function astType(){return this.jsx?\"JSXIdentifier\":\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:this.value,declaration:!!this.isDeclaration}}}]),IdentifierLiteral}(Literal);return IdentifierLiteral.prototype.isAssignable=YES,IdentifierLiteral}.call(this),exports.PropertyName=PropertyName=function(){var PropertyName=function(_Literal6){function PropertyName(){return _classCallCheck(this,PropertyName),_super13.apply(this,arguments)}_inherits(PropertyName,_Literal6);var _super13=_createSuper(PropertyName);return _createClass(PropertyName,[{key:\"astType\",value:function astType(){return this.jsx?\"JSXIdentifier\":\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:this.value,declaration:!1}}}]),PropertyName}(Literal);return PropertyName.prototype.isAssignable=YES,PropertyName}.call(this),exports.ComputedPropertyName=ComputedPropertyName=function(_PropertyName){function ComputedPropertyName(){return _classCallCheck(this,ComputedPropertyName),_super14.apply(this,arguments)}_inherits(ComputedPropertyName,_PropertyName);var _super14=_createSuper(ComputedPropertyName);return _createClass(ComputedPropertyName,[{key:\"compileNode\",value:function compileNode(o){return[this.makeCode(\"[\")].concat(_toConsumableArray(this.value.compileToFragments(o,LEVEL_LIST)),[this.makeCode(\"]\")])}},{key:\"astNode\",value:function astNode(o){return this.value.ast(o)}}]),ComputedPropertyName}(PropertyName),exports.StatementLiteral=StatementLiteral=function(){var StatementLiteral=function(_Literal7){function StatementLiteral(){return _classCallCheck(this,StatementLiteral),_super15.apply(this,arguments)}_inherits(StatementLiteral,_Literal7);var _super15=_createSuper(StatementLiteral);return _createClass(StatementLiteral,[{key:\"jumps\",value:function jumps(o){return\"break\"!==this.value||(null==o?void 0:o.loop)||(null==o?void 0:o.block)?\"continue\"!==this.value||null!=o&&o.loop?void 0:this:this}},{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\"\".concat(this.tab).concat(this.value,\";\"))]}},{key:\"astType\",value:function astType(){switch(this.value){case\"continue\":return\"ContinueStatement\";case\"break\":return\"BreakStatement\";case\"debugger\":return\"DebuggerStatement\";}}}]),StatementLiteral}(Literal);return StatementLiteral.prototype.isStatement=YES,StatementLiteral.prototype.makeReturn=THIS,StatementLiteral}.call(this),exports.ThisLiteral=ThisLiteral=function(_Literal8){function ThisLiteral(value){var _this18;return _classCallCheck(this,ThisLiteral),_this18=_super16.call(this,\"this\"),_this18.shorthand=\"@\"===value,_this18}_inherits(ThisLiteral,_Literal8);var _super16=_createSuper(ThisLiteral);return _createClass(ThisLiteral,[{key:\"compileNode\",value:function compileNode(o){var code,ref1;return code=(null==(ref1=o.scope.method)?void 0:ref1.bound)?o.scope.method.context:this.value,[this.makeCode(code)]}},{key:\"astType\",value:function astType(){return\"ThisExpression\"}},{key:\"astProperties\",value:function astProperties(){return{shorthand:this.shorthand}}}]),ThisLiteral}(Literal),exports.UndefinedLiteral=UndefinedLiteral=function(_Literal9){function UndefinedLiteral(){return _classCallCheck(this,UndefinedLiteral),_super17.call(this,\"undefined\")}_inherits(UndefinedLiteral,_Literal9);var _super17=_createSuper(UndefinedLiteral);return _createClass(UndefinedLiteral,[{key:\"compileNode\",value:function compileNode(o){return[this.makeCode(o.level>=LEVEL_ACCESS?\"(void 0)\":\"void 0\")]}},{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:this.value,declaration:!1}}}]),UndefinedLiteral}(Literal),exports.NullLiteral=NullLiteral=function(_Literal10){function NullLiteral(){return _classCallCheck(this,NullLiteral),_super18.call(this,\"null\")}_inherits(NullLiteral,_Literal10);var _super18=_createSuper(NullLiteral);return _createClass(NullLiteral)}(Literal),exports.BooleanLiteral=BooleanLiteral=function(_Literal11){function BooleanLiteral(value){var _ref27=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},originalValue=_ref27.originalValue,_this19;return _classCallCheck(this,BooleanLiteral),_this19=_super19.call(this,value),_this19.originalValue=originalValue,null==_this19.originalValue&&(_this19.originalValue=_this19.value),_this19}_inherits(BooleanLiteral,_Literal11);var _super19=_createSuper(BooleanLiteral);return _createClass(BooleanLiteral,[{key:\"astProperties\",value:function astProperties(){return{value:\"true\"===this.value,name:this.originalValue}}}]),BooleanLiteral}(Literal),exports.DefaultLiteral=DefaultLiteral=function(_Literal12){function DefaultLiteral(){return _classCallCheck(this,DefaultLiteral),_super20.apply(this,arguments)}_inherits(DefaultLiteral,_Literal12);var _super20=_createSuper(DefaultLiteral);return _createClass(DefaultLiteral,[{key:\"astType\",value:function astType(){return\"Identifier\"}},{key:\"astProperties\",value:function astProperties(){return{name:\"default\",declaration:!1}}}]),DefaultLiteral}(Literal),exports.Return=Return=function(){var Return=function(_Base6){function Return(expression1){var _ref28=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},belongsToFuncDirectiveReturn=_ref28.belongsToFuncDirectiveReturn,_this20;return _classCallCheck(this,Return),_this20=_super21.call(this),_this20.expression=expression1,_this20.belongsToFuncDirectiveReturn=belongsToFuncDirectiveReturn,_this20}_inherits(Return,_Base6);var _super21=_createSuper(Return);return _createClass(Return,[{key:\"compileToFragments\",value:function compileToFragments(o,level){var expr,ref1;return expr=null==(ref1=this.expression)?void 0:ref1.makeReturn(),expr&&!(expr instanceof Return)?expr.compileToFragments(o,level):_get(_getPrototypeOf(Return.prototype),\"compileToFragments\",this).call(this,o,level)}},{key:\"compileNode\",value:function compileNode(o){var answer,fragment,j,len1;if(answer=[],this.expression){for(answer=this.expression.compileToFragments(o,LEVEL_PAREN),unshiftAfterComments(answer,this.makeCode(\"\".concat(this.tab,\"return \"))),(j=0,len1=answer.length);j<len1;j++)if(fragment=answer[j],fragment.isHereComment&&0<=indexOf.call(fragment.code,\"\\n\"))fragment.code=multident(fragment.code,this.tab);else if(fragment.isLineComment)fragment.code=\"\".concat(this.tab).concat(fragment.code);else break;}else answer.push(this.makeCode(\"\".concat(this.tab,\"return\")));return answer.push(this.makeCode(\";\")),answer}},{key:\"checkForPureStatementInExpression\",value:function checkForPureStatementInExpression(){return this.belongsToFuncDirectiveReturn?void 0:_get(_getPrototypeOf(Return.prototype),\"checkForPureStatementInExpression\",this).call(this)}},{key:\"astType\",value:function astType(){return\"ReturnStatement\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{argument:null==(ref1=null==(ref2=this.expression)?void 0:ref2.ast(o,LEVEL_PAREN))?null:ref1}}}]),Return}(Base);return Return.prototype.children=[\"expression\"],Return.prototype.isStatement=YES,Return.prototype.makeReturn=THIS,Return.prototype.jumps=THIS,Return}.call(this),exports.FuncDirectiveReturn=FuncDirectiveReturn=function(){var FuncDirectiveReturn=function(_Return){function FuncDirectiveReturn(expression,_ref29){var returnKeyword=_ref29.returnKeyword,_this21;return _classCallCheck(this,FuncDirectiveReturn),_this21=_super22.call(this,expression),_this21.returnKeyword=returnKeyword,_this21}_inherits(FuncDirectiveReturn,_Return);var _super22=_createSuper(FuncDirectiveReturn);return _createClass(FuncDirectiveReturn,[{key:\"compileNode\",value:function compileNode(o){return this.checkScope(o),_get(_getPrototypeOf(FuncDirectiveReturn.prototype),\"compileNode\",this).call(this,o)}},{key:\"checkScope\",value:function checkScope(o){if(null==o.scope.parent)return this.error(\"\".concat(this.keyword,\" can only occur inside functions\"))}},{key:\"astNode\",value:function astNode(o){return this.checkScope(o),new Op(this.keyword,new Return(this.expression,{belongsToFuncDirectiveReturn:!0}).withLocationDataFrom(null==this.expression?this.returnKeyword:{locationData:mergeLocationData(this.returnKeyword.locationData,this.expression.locationData)})).withLocationDataFrom(this).ast(o)}}]),FuncDirectiveReturn}(Return);return FuncDirectiveReturn.prototype.isStatementAst=NO,FuncDirectiveReturn}.call(this),exports.YieldReturn=YieldReturn=function(){var YieldReturn=function(_FuncDirectiveReturn){function YieldReturn(){return _classCallCheck(this,YieldReturn),_super23.apply(this,arguments)}_inherits(YieldReturn,_FuncDirectiveReturn);var _super23=_createSuper(YieldReturn);return _createClass(YieldReturn)}(FuncDirectiveReturn);return YieldReturn.prototype.keyword=\"yield\",YieldReturn}.call(this),exports.AwaitReturn=AwaitReturn=function(){var AwaitReturn=function(_FuncDirectiveReturn2){function AwaitReturn(){return _classCallCheck(this,AwaitReturn),_super24.apply(this,arguments)}_inherits(AwaitReturn,_FuncDirectiveReturn2);var _super24=_createSuper(AwaitReturn);return _createClass(AwaitReturn)}(FuncDirectiveReturn);return AwaitReturn.prototype.keyword=\"await\",AwaitReturn}.call(this),exports.Value=Value=function(){var Value=function(_Base7){function Value(base,props,tag){var isDefaultValue=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3],_this22;_classCallCheck(this,Value);var ref1,ref2;return(_this22=_super25.call(this),!props&&base instanceof Value)?_possibleConstructorReturn(_this22,base):(_this22.base=base,_this22.properties=props||[],_this22.tag=tag,tag&&(_this22[tag]=!0),_this22.isDefaultValue=isDefaultValue,(null==(ref1=_this22.base)?void 0:ref1.comments)&&_this22.base instanceof ThisLiteral&&null!=(null==(ref2=_this22.properties[0])?void 0:ref2.name)&&moveComments(_this22.base,_this22.properties[0].name),_this22)}_inherits(Value,_Base7);var _super25=_createSuper(Value);return _createClass(Value,[{key:\"add\",value:function add(props){return this.properties=this.properties.concat(props),this.forceUpdateLocation=!0,this}},{key:\"hasProperties\",value:function hasProperties(){return 0!==this.properties.length}},{key:\"bareLiteral\",value:function bareLiteral(type){return!this.properties.length&&this.base instanceof type}},{key:\"isArray\",value:function isArray(){return this.bareLiteral(Arr)}},{key:\"isRange\",value:function isRange(){return this.bareLiteral(Range)}},{key:\"shouldCache\",value:function shouldCache(){return this.hasProperties()||this.base.shouldCache()}},{key:\"isAssignable\",value:function isAssignable(opts){return this.hasProperties()||this.base.isAssignable(opts)}},{key:\"isNumber\",value:function(){return this.bareLiteral(NumberLiteral)}},{key:\"isString\",value:function isString(){return this.bareLiteral(StringLiteral)}},{key:\"isRegex\",value:function isRegex(){return this.bareLiteral(RegexLiteral)}},{key:\"isUndefined\",value:function isUndefined(){return this.bareLiteral(UndefinedLiteral)}},{key:\"isNull\",value:function isNull(){return this.bareLiteral(NullLiteral)}},{key:\"isBoolean\",value:function isBoolean(){return this.bareLiteral(BooleanLiteral)}},{key:\"isAtomic\",value:function isAtomic(){var j,len1,node,ref1;for(ref1=this.properties.concat(this.base),j=0,len1=ref1.length;j<len1;j++)if(node=ref1[j],node.soak||node instanceof Call||node instanceof Op&&\"do\"===node.operator)return!1;return!0}},{key:\"isNotCallable\",value:function isNotCallable(){return this.isNumber()||this.isString()||this.isRegex()||this.isArray()||this.isRange()||this.isSplice()||this.isObject()||this.isUndefined()||this.isNull()||this.isBoolean()}},{key:\"isStatement\",value:function isStatement(o){return!this.properties.length&&this.base.isStatement(o)}},{key:\"isJSXTag\",value:function isJSXTag(){return this.base instanceof JSXTag}},{key:\"assigns\",value:function assigns(name){return!this.properties.length&&this.base.assigns(name)}},{key:\"jumps\",value:function jumps(o){return!this.properties.length&&this.base.jumps(o)}},{key:\"isObject\",value:function isObject(onlyGenerated){return!this.properties.length&&this.base instanceof Obj&&(!onlyGenerated||this.base.generated)}},{key:\"isElision\",value:function isElision(){return!!(this.base instanceof Arr)&&this.base.hasElision()}},{key:\"isSplice\",value:function isSplice(){var _slice1$call7,_slice1$call8,lastProperty,ref1;return ref1=this.properties,_slice1$call7=slice1.call(ref1,-1),_slice1$call8=_slicedToArray(_slice1$call7,1),lastProperty=_slice1$call8[0],_slice1$call7,lastProperty instanceof Slice}},{key:\"looksStatic\",value:function looksStatic(className){var name,ref1,thisLiteral;return!!(((thisLiteral=this.base)instanceof ThisLiteral||(name=this.base).value===className)&&1===this.properties.length&&\"prototype\"!==(null==(ref1=this.properties[0].name)?void 0:ref1.value))&&{staticClassName:null==thisLiteral?name:thisLiteral}}},{key:\"unwrap\",value:function unwrap(){return this.properties.length?this:this.base}},{key:\"cacheReference\",value:function cacheReference(o){var _slice1$call9,_slice1$call10,base,bref,name,nref,ref1;return(ref1=this.properties,_slice1$call9=slice1.call(ref1,-1),_slice1$call10=_slicedToArray(_slice1$call9,1),name=_slice1$call10[0],_slice1$call9,2>this.properties.length&&!this.base.shouldCache()&&(null==name||!name.shouldCache()))?[this,this]:(base=new Value(this.base,this.properties.slice(0,-1)),base.shouldCache()&&(bref=new IdentifierLiteral(o.scope.freeVariable(\"base\")),base=new Value(new Parens(new Assign(bref,base)))),!name)?[base,bref]:(name.shouldCache()&&(nref=new IdentifierLiteral(o.scope.freeVariable(\"name\")),name=new Index(new Assign(nref,name.index)),nref=new Index(nref)),[base.add(name),new Value(bref||base.base,[nref||name])])}},{key:\"compileNode\",value:function compileNode(o){var fragments,j,len1,prop,props;for(this.base.front=this.front,props=this.properties,fragments=props.length&&null!=this.base.cached?this.base.cached:this.base.compileToFragments(o,props.length?LEVEL_ACCESS:null),props.length&&SIMPLENUM.test(fragmentsToText(fragments))&&fragments.push(this.makeCode(\".\")),(j=0,len1=props.length);j<len1;j++){var _fragments2;prop=props[j],(_fragments2=fragments).push.apply(_fragments2,_toConsumableArray(prop.compileToFragments(o)))}return fragments}},{key:\"unfoldSoak\",value:function unfoldSoak(o){var _this23=this;return null==this.unfoldedSoak?this.unfoldedSoak=function(){var fst,i,ifn,j,len1,prop,ref,ref1,snd;if(ifn=_this23.base.unfoldSoak(o),ifn){var _ifn$body$properties;return(_ifn$body$properties=ifn.body.properties).push.apply(_ifn$body$properties,_toConsumableArray(_this23.properties)),ifn}for(ref1=_this23.properties,i=j=0,len1=ref1.length;j<len1;i=++j)if(prop=ref1[i],!!prop.soak)return prop.soak=!1,fst=new Value(_this23.base,_this23.properties.slice(0,i)),snd=new Value(_this23.base,_this23.properties.slice(i)),fst.shouldCache()&&(ref=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),fst=new Parens(new Assign(ref,fst)),snd.base=ref),new If(new Existence(fst),snd,{soak:!0});return!1}():this.unfoldedSoak}},{key:\"eachName\",value:function eachName(iterator){var _ref30=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref30$checkAssignabi=_ref30.checkAssignability;return this.hasProperties()?iterator(this):!(void 0===_ref30$checkAssignabi||_ref30$checkAssignabi)||this.base.isAssignable()?this.base.eachName(iterator):this.error(\"tried to assign to unassignable value\")}},{key:\"object\",value:function(){var initialProperties,object;return this.hasProperties()?(initialProperties=this.properties.slice(0,this.properties.length-1),object=new Value(this.base,initialProperties,this.tag,this.isDefaultValue),object.locationData=0===initialProperties.length?this.base.locationData:mergeLocationData(this.base.locationData,initialProperties[initialProperties.length-1].locationData),object):this}},{key:\"containsSoak\",value:function containsSoak(){var j,len1,property,ref1;if(!this.hasProperties())return!1;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(property=ref1[j],property.soak)return!0;return!!(this.base instanceof Call&&this.base.soak)}},{key:\"astNode\",value:function astNode(o){return this.hasProperties()?_get(_getPrototypeOf(Value.prototype),\"astNode\",this).call(this,o):this.base.ast(o)}},{key:\"astType\",value:function astType(){return this.isJSXTag()?\"JSXMemberExpression\":this.containsSoak()?\"OptionalMemberExpression\":\"MemberExpression\"}},{key:\"astProperties\",value:function astProperties(o){var _slice1$call11,_slice1$call12,computed,property,ref1,ref2;return ref1=this.properties,_slice1$call11=slice1.call(ref1,-1),_slice1$call12=_slicedToArray(_slice1$call11,1),property=_slice1$call12[0],_slice1$call11,this.isJSXTag()&&(property.name.jsx=!0),computed=property instanceof Index||!((null==(ref2=property.name)?void 0:ref2.unwrap())instanceof PropertyName),{object:this.object().ast(o,LEVEL_ACCESS),property:property.ast(o,computed?LEVEL_PAREN:void 0),computed:computed,optional:!!property.soak,shorthand:!!property.shorthand}}},{key:\"astLocationData\",value:function astLocationData(){return this.isJSXTag()?mergeAstLocationData(jisonLocationDataToAstLocationData(this.base.tagNameLocationData),jisonLocationDataToAstLocationData(this.properties[this.properties.length-1].locationData)):_get(_getPrototypeOf(Value.prototype),\"astLocationData\",this).call(this)}}]),Value}(Base);return Value.prototype.children=[\"base\",\"properties\"],Value}.call(this),exports.MetaProperty=MetaProperty=function(){var MetaProperty=function(_Base8){function MetaProperty(meta,property1){var _this24;return _classCallCheck(this,MetaProperty),_this24=_super26.call(this),_this24.meta=meta,_this24.property=property1,_this24}_inherits(MetaProperty,_Base8);var _super26=_createSuper(MetaProperty);return _createClass(MetaProperty,[{key:\"checkValid\",value:function checkValid(o){if(\"new\"===this.meta.value){if(!(this.property instanceof Access&&\"target\"===this.property.name.value))return this.error(\"the only valid meta property for new is new.target\");if(null==o.scope.parent)return this.error(\"new.target can only occur inside functions\")}else if(\"import\"===this.meta.value&&!(this.property instanceof Access&&\"meta\"===this.property.name.value))return this.error(\"the only valid meta property for import is import.meta\")}},{key:\"compileNode\",value:function compileNode(o){var _fragments3,_fragments4,fragments;return this.checkValid(o),fragments=[],(_fragments3=fragments).push.apply(_fragments3,_toConsumableArray(this.meta.compileToFragments(o,LEVEL_ACCESS))),(_fragments4=fragments).push.apply(_fragments4,_toConsumableArray(this.property.compileToFragments(o))),fragments}},{key:\"astProperties\",value:function astProperties(o){return this.checkValid(o),{meta:this.meta.ast(o,LEVEL_ACCESS),property:this.property.ast(o)}}}]),MetaProperty}(Base);return MetaProperty.prototype.children=[\"meta\",\"property\"],MetaProperty}.call(this),exports.HereComment=HereComment=function(_Base9){function HereComment(_ref31){var content1=_ref31.content,newLine=_ref31.newLine,unshift=_ref31.unshift,locationData1=_ref31.locationData,_this25;return _classCallCheck(this,HereComment),_this25=_super27.call(this),_this25.content=content1,_this25.newLine=newLine,_this25.unshift=unshift,_this25.locationData=locationData1,_this25}_inherits(HereComment,_Base9);var _super27=_createSuper(HereComment);return _createClass(HereComment,[{key:\"compileNode\",value:function compileNode(){var fragment,hasLeadingMarks,indent,j,leadingWhitespace,len1,line,multiline,ref1;if(multiline=0<=indexOf.call(this.content,\"\\n\"),multiline){for(indent=null,ref1=this.content.split(\"\\n\"),(j=0,len1=ref1.length);j<len1;j++)line=ref1[j],leadingWhitespace=/^\\s*/.exec(line)[0],(!indent||leadingWhitespace.length<indent.length)&&(indent=leadingWhitespace);indent&&(this.content=this.content.replace(RegExp(\"\\\\n\".concat(indent),\"g\"),\"\\n\"))}return hasLeadingMarks=/\\n\\s*[#|\\*]/.test(this.content),hasLeadingMarks&&(this.content=this.content.replace(/^([ \\t]*)#(?=\\s)/gm,\" *\")),this.content=\"/*\".concat(this.content).concat(hasLeadingMarks?\" \":\"\",\"*/\"),fragment=this.makeCode(this.content),fragment.newLine=this.newLine,fragment.unshift=this.unshift,fragment.multiline=multiline,fragment.isComment=fragment.isHereComment=!0,fragment}},{key:\"astType\",value:function astType(){return\"CommentBlock\"}},{key:\"astProperties\",value:function astProperties(){return{value:this.content}}}]),HereComment}(Base),exports.LineComment=LineComment=function(_Base10){function LineComment(_ref32){var content1=_ref32.content,newLine=_ref32.newLine,unshift=_ref32.unshift,locationData1=_ref32.locationData,precededByBlankLine=_ref32.precededByBlankLine,_this26;return _classCallCheck(this,LineComment),_this26=_super28.call(this),_this26.content=content1,_this26.newLine=newLine,_this26.unshift=unshift,_this26.locationData=locationData1,_this26.precededByBlankLine=precededByBlankLine,_this26}_inherits(LineComment,_Base10);var _super28=_createSuper(LineComment);return _createClass(LineComment,[{key:\"compileNode\",value:function compileNode(o){var fragment;return fragment=this.makeCode(/^\\s*$/.test(this.content)?\"\":\"\".concat(this.precededByBlankLine?\"\\n\".concat(o.indent):\"\",\"//\").concat(this.content)),fragment.newLine=this.newLine,fragment.unshift=this.unshift,fragment.trail=!this.newLine&&!this.unshift,fragment.isComment=fragment.isLineComment=!0,fragment}},{key:\"astType\",value:function astType(){return\"CommentLine\"}},{key:\"astProperties\",value:function astProperties(){return{value:this.content}}}]),LineComment}(Base),exports.JSXIdentifier=JSXIdentifier=function(_IdentifierLiteral){function JSXIdentifier(){return _classCallCheck(this,JSXIdentifier),_super29.apply(this,arguments)}_inherits(JSXIdentifier,_IdentifierLiteral);var _super29=_createSuper(JSXIdentifier);return _createClass(JSXIdentifier,[{key:\"astType\",value:function astType(){return\"JSXIdentifier\"}}]),JSXIdentifier}(IdentifierLiteral),exports.JSXTag=JSXTag=function(_JSXIdentifier){function JSXTag(value,_ref33){var tagNameLocationData=_ref33.tagNameLocationData,closingTagOpeningBracketLocationData=_ref33.closingTagOpeningBracketLocationData,closingTagSlashLocationData=_ref33.closingTagSlashLocationData,closingTagNameLocationData=_ref33.closingTagNameLocationData,closingTagClosingBracketLocationData=_ref33.closingTagClosingBracketLocationData,_this27;return _classCallCheck(this,JSXTag),_this27=_super30.call(this,value),_this27.tagNameLocationData=tagNameLocationData,_this27.closingTagOpeningBracketLocationData=closingTagOpeningBracketLocationData,_this27.closingTagSlashLocationData=closingTagSlashLocationData,_this27.closingTagNameLocationData=closingTagNameLocationData,_this27.closingTagClosingBracketLocationData=closingTagClosingBracketLocationData,_this27}_inherits(JSXTag,_JSXIdentifier);var _super30=_createSuper(JSXTag);return _createClass(JSXTag,[{key:\"astProperties\",value:function astProperties(){return{name:this.value}}}]),JSXTag}(JSXIdentifier),exports.JSXExpressionContainer=JSXExpressionContainer=function(){var JSXExpressionContainer=function(_Base11){function JSXExpressionContainer(expression1){var _ref34=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},locationData=_ref34.locationData,_this28;return _classCallCheck(this,JSXExpressionContainer),_this28=_super31.call(this),_this28.expression=expression1,_this28.expression.jsxAttribute=!0,_this28.locationData=null==locationData?_this28.expression.locationData:locationData,_this28}_inherits(JSXExpressionContainer,_Base11);var _super31=_createSuper(JSXExpressionContainer);return _createClass(JSXExpressionContainer,[{key:\"compileNode\",value:function compileNode(o){return this.expression.compileNode(o)}},{key:\"astProperties\",value:function astProperties(o){return{expression:astAsBlockIfNeeded(this.expression,o)}}}]),JSXExpressionContainer}(Base);return JSXExpressionContainer.prototype.children=[\"expression\"],JSXExpressionContainer}.call(this),exports.JSXEmptyExpression=JSXEmptyExpression=function(_Base12){function JSXEmptyExpression(){return _classCallCheck(this,JSXEmptyExpression),_super32.apply(this,arguments)}_inherits(JSXEmptyExpression,_Base12);var _super32=_createSuper(JSXEmptyExpression);return _createClass(JSXEmptyExpression)}(Base),exports.JSXText=JSXText=function(_Base13){function JSXText(stringLiteral){var _this29;return _classCallCheck(this,JSXText),_this29=_super33.call(this),_this29.value=stringLiteral.unquotedValueForJSX,_this29.locationData=stringLiteral.locationData,_this29}_inherits(JSXText,_Base13);var _super33=_createSuper(JSXText);return _createClass(JSXText,[{key:\"astProperties\",value:function astProperties(){return{value:this.value,extra:{raw:this.value}}}}]),JSXText}(Base),exports.JSXAttribute=JSXAttribute=function(){var JSXAttribute=function(_Base14){function JSXAttribute(_ref35){var name1=_ref35.name,value=_ref35.value,_this30;_classCallCheck(this,JSXAttribute);var ref1;return _this30=_super34.call(this),_this30.name=name1,_this30.value=null==value?null:(value=value.base,value instanceof StringLiteral&&!value.shouldGenerateTemplateLiteral()?value:new JSXExpressionContainer(value)),null!=(ref1=_this30.value)&&(ref1.comments=value.comments),_this30}_inherits(JSXAttribute,_Base14);var _super34=_createSuper(JSXAttribute);return _createClass(JSXAttribute,[{key:\"compileNode\",value:function compileNode(o){var compiledName,val;return(compiledName=this.name.compileToFragments(o,LEVEL_LIST),null==this.value)?compiledName:(val=this.value.compileToFragments(o,LEVEL_LIST),compiledName.concat(this.makeCode(\"=\"),val))}},{key:\"astProperties\",value:function astProperties(o){var name,ref1,ref2;return name=this.name,0<=indexOf.call(name.value,\":\")&&(name=new JSXNamespacedName(name)),{name:name.ast(o),value:null==(ref1=null==(ref2=this.value)?void 0:ref2.ast(o))?null:ref1}}}]),JSXAttribute}(Base);return JSXAttribute.prototype.children=[\"name\",\"value\"],JSXAttribute}.call(this),exports.JSXAttributes=JSXAttributes=function(){var JSXAttributes=function(_Base15){function JSXAttributes(arr){var _this31;_classCallCheck(this,JSXAttributes);var attribute,base,j,k,len1,len2,object,property,ref1,ref2,value,variable;for(_this31=_super35.call(this),_this31.attributes=[],ref1=arr.objects,(j=0,len1=ref1.length);j<len1;j++){object=ref1[j],_this31.checkValidAttribute(object);var _object=object;if(base=_object.base,base instanceof IdentifierLiteral)attribute=new JSXAttribute({name:new JSXIdentifier(base.value).withLocationDataAndCommentsFrom(base)}),attribute.locationData=base.locationData,_this31.attributes.push(attribute);else if(!base.generated)attribute=base.properties[0],attribute.jsx=!0,attribute.locationData=base.locationData,_this31.attributes.push(attribute);else for(ref2=base.properties,k=0,len2=ref2.length;k<len2;k++){property=ref2[k];var _property=property;variable=_property.variable,value=_property.value,attribute=new JSXAttribute({name:new JSXIdentifier(variable.base.value).withLocationDataAndCommentsFrom(variable.base),value:value}),attribute.locationData=property.locationData,_this31.attributes.push(attribute)}}return _this31.locationData=arr.locationData,_this31}_inherits(JSXAttributes,_Base15);var _super35=_createSuper(JSXAttributes);return _createClass(JSXAttributes,[{key:\"checkValidAttribute\",value:function checkValidAttribute(object){var attribute,properties;if(attribute=object.base,properties=(null==attribute?void 0:attribute.properties)||[],!(attribute instanceof Obj||attribute instanceof IdentifierLiteral)||attribute instanceof Obj&&!attribute.generated&&(1<properties.length||!(properties[0]instanceof Splat)))return object.error(\"Unexpected token. Allowed JSX attributes are: id=\\\"val\\\", src={source}, {props...} or attribute.\")}},{key:\"compileNode\",value:function compileNode(o){var attribute,fragments,j,len1,ref1;for(fragments=[],ref1=this.attributes,(j=0,len1=ref1.length);j<len1;j++){var _fragments5;attribute=ref1[j],fragments.push(this.makeCode(\" \")),(_fragments5=fragments).push.apply(_fragments5,_toConsumableArray(attribute.compileToFragments(o,LEVEL_TOP)))}return fragments}},{key:\"astNode\",value:function astNode(o){var attribute,j,len1,ref1,results1;for(ref1=this.attributes,results1=[],(j=0,len1=ref1.length);j<len1;j++)attribute=ref1[j],results1.push(attribute.ast(o));return results1}}]),JSXAttributes}(Base);return JSXAttributes.prototype.children=[\"attributes\"],JSXAttributes}.call(this),exports.JSXNamespacedName=JSXNamespacedName=function(){var JSXNamespacedName=function(_Base16){function JSXNamespacedName(tag){var _this32;_classCallCheck(this,JSXNamespacedName);var name,namespace;_this32=_super36.call(this);var _tag$value$split=tag.value.split(\":\"),_tag$value$split2=_slicedToArray(_tag$value$split,2);return namespace=_tag$value$split2[0],name=_tag$value$split2[1],_this32.namespace=new JSXIdentifier(namespace).withLocationDataFrom({locationData:extractSameLineLocationDataFirst(namespace.length)(tag.locationData)}),_this32.name=new JSXIdentifier(name).withLocationDataFrom({locationData:extractSameLineLocationDataLast(name.length)(tag.locationData)}),_this32.locationData=tag.locationData,_this32}_inherits(JSXNamespacedName,_Base16);var _super36=_createSuper(JSXNamespacedName);return _createClass(JSXNamespacedName,[{key:\"astProperties\",value:function astProperties(o){return{namespace:this.namespace.ast(o),name:this.name.ast(o)}}}]),JSXNamespacedName}(Base);return JSXNamespacedName.prototype.children=[\"namespace\",\"name\"],JSXNamespacedName}.call(this),exports.JSXElement=JSXElement=function(){var JSXElement=function(_Base17){function JSXElement(_ref36){var tagName1=_ref36.tagName,attributes=_ref36.attributes,content1=_ref36.content,_this33;return _classCallCheck(this,JSXElement),_this33=_super37.call(this),_this33.tagName=tagName1,_this33.attributes=attributes,_this33.content=content1,_this33}_inherits(JSXElement,_Base17);var _super37=_createSuper(JSXElement);return _createClass(JSXElement,[{key:\"compileNode\",value:function compileNode(o){var _fragments6,_fragments7,fragments,ref1,tag;if(null!=(ref1=this.content)&&(ref1.base.jsx=!0),fragments=[this.makeCode(\"<\")],(_fragments6=fragments).push.apply(_fragments6,_toConsumableArray(tag=this.tagName.compileToFragments(o,LEVEL_ACCESS))),(_fragments7=fragments).push.apply(_fragments7,_toConsumableArray(this.attributes.compileToFragments(o))),this.content){var _fragments8,_fragments9;fragments.push(this.makeCode(\">\")),(_fragments8=fragments).push.apply(_fragments8,_toConsumableArray(this.content.compileNode(o,LEVEL_LIST))),(_fragments9=fragments).push.apply(_fragments9,[this.makeCode(\"</\")].concat(_toConsumableArray(tag),[this.makeCode(\">\")]))}else fragments.push(this.makeCode(\" />\"));return fragments}},{key:\"isFragment\",value:function isFragment(){return!this.tagName.base.value.length}},{key:\"astNode\",value:function astNode(o){var tagName;return this.openingElementLocationData=jisonLocationDataToAstLocationData(this.attributes.locationData),tagName=this.tagName.base,tagName.locationData=tagName.tagNameLocationData,null!=this.content&&(this.closingElementLocationData=mergeAstLocationData(jisonLocationDataToAstLocationData(tagName.closingTagOpeningBracketLocationData),jisonLocationDataToAstLocationData(tagName.closingTagClosingBracketLocationData))),_get(_getPrototypeOf(JSXElement.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isFragment()?\"JSXFragment\":\"JSXElement\"}},{key:\"elementAstProperties\",value:function elementAstProperties(o){var _this34=this,closingElement,columnDiff,currentExpr,openingElement,rangeDiff,ref1,shiftAstLocationData,tagNameAst;if(tagNameAst=function(){var tag;return tag=_this34.tagName.unwrap(),(null==tag?void 0:tag.value)&&0<=indexOf.call(tag.value,\":\")&&(tag=new JSXNamespacedName(tag)),tag.ast(o)},openingElement=Object.assign({type:\"JSXOpeningElement\",name:tagNameAst(),selfClosing:null==this.closingElementLocationData,attributes:this.attributes.ast(o)},this.openingElementLocationData),closingElement=null,null!=this.closingElementLocationData&&(closingElement=Object.assign({type:\"JSXClosingElement\",name:Object.assign(tagNameAst(),jisonLocationDataToAstLocationData(this.tagName.base.closingTagNameLocationData))},this.closingElementLocationData),\"JSXMemberExpression\"===(ref1=closingElement.name.type)||\"JSXNamespacedName\"===ref1))if(rangeDiff=closingElement.range[0]-openingElement.range[0]+\"/\".length,columnDiff=closingElement.loc.start.column-openingElement.loc.start.column+\"/\".length,shiftAstLocationData=function(node){return node.range=[node.range[0]+rangeDiff,node.range[1]+rangeDiff],node.start+=rangeDiff,node.end+=rangeDiff,node.loc.start={line:_this34.closingElementLocationData.loc.start.line,column:node.loc.start.column+columnDiff},node.loc.end={line:_this34.closingElementLocationData.loc.start.line,column:node.loc.end.column+columnDiff}},\"JSXMemberExpression\"===closingElement.name.type){for(currentExpr=closingElement.name;\"JSXMemberExpression\"===currentExpr.type;)currentExpr!==closingElement.name&&shiftAstLocationData(currentExpr),shiftAstLocationData(currentExpr.property),currentExpr=currentExpr.object;shiftAstLocationData(currentExpr)}else shiftAstLocationData(closingElement.name.namespace),shiftAstLocationData(closingElement.name.name);return{openingElement:openingElement,closingElement:closingElement}}},{key:\"fragmentAstProperties\",value:function fragmentAstProperties(){var closingFragment,openingFragment;return openingFragment=Object.assign({type:\"JSXOpeningFragment\"},this.openingElementLocationData),closingFragment=Object.assign({type:\"JSXClosingFragment\"},this.closingElementLocationData),{openingFragment:openingFragment,closingFragment:closingFragment}}},{key:\"contentAst\",value:function contentAst(o){var base1,child,children,content,element,emptyExpression,expression,j,len1,results1,unwrapped;if(!this.content||(\"function\"==typeof(base1=this.content.base).isEmpty?base1.isEmpty():void 0))return[];for(content=this.content.unwrapAll(),children=function(){var j,len1,ref1,results1;if(content instanceof StringLiteral)return[new JSXText(content)];for(ref1=this.content.unwrapAll().extractElements(o,{includeInterpolationWrappers:!0,isJsx:!0}),results1=[],(j=0,len1=ref1.length);j<len1;j++)if(element=ref1[j],element instanceof StringLiteral)results1.push(new JSXText(element));else{var _element=element;expression=_element.expression,null==expression?(emptyExpression=new JSXEmptyExpression,emptyExpression.locationData=emptyExpressionLocationData({interpolationNode:element,openingBrace:\"{\",closingBrace:\"}\"}),results1.push(new JSXExpressionContainer(emptyExpression,{locationData:element.locationData}))):(unwrapped=expression.unwrapAll(),unwrapped instanceof JSXElement&&unwrapped.locationData.range[0]===element.locationData.range[0]?results1.push(unwrapped):results1.push(new JSXExpressionContainer(unwrapped,{locationData:element.locationData})))}return results1}.call(this),results1=[],(j=0,len1=children.length);j<len1;j++)child=children[j],child instanceof JSXText&&0===child.value.length||results1.push(child.ast(o));return results1}},{key:\"astProperties\",value:function astProperties(o){return Object.assign(this.isFragment()?this.fragmentAstProperties(o):this.elementAstProperties(o),{children:this.contentAst(o)})}},{key:\"astLocationData\",value:function astLocationData(){return null==this.closingElementLocationData?this.openingElementLocationData:mergeAstLocationData(this.openingElementLocationData,this.closingElementLocationData)}}]),JSXElement}(Base);return JSXElement.prototype.children=[\"tagName\",\"attributes\",\"content\"],JSXElement}.call(this),exports.Call=Call=function(){var Call=function(_Base18){function Call(variable1){var args1=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[],soak1=2<arguments.length?arguments[2]:void 0,token1=3<arguments.length?arguments[3]:void 0,_this35;_classCallCheck(this,Call);var ref1;return(_this35=_super38.call(this),_this35.variable=variable1,_this35.args=args1,_this35.soak=soak1,_this35.token=token1,_this35.implicit=_this35.args.implicit,_this35.isNew=!1,_this35.variable instanceof Value&&_this35.variable.isNotCallable()&&_this35.variable.error(\"literal is not a function\"),_this35.variable.base instanceof JSXTag)?_possibleConstructorReturn(_this35,new JSXElement({tagName:_this35.variable,attributes:new JSXAttributes(_this35.args[0].base),content:_this35.args[1]})):(\"RegExp\"===(null==(ref1=_this35.variable.base)?void 0:ref1.value)&&0!==_this35.args.length&&moveComments(_this35.variable,_this35.args[0]),_this35)}_inherits(Call,_Base18);var _super38=_createSuper(Call);return _createClass(Call,[{key:\"updateLocationDataIfMissing\",value:function updateLocationDataIfMissing(locationData){var base,ref1;return this.locationData&&this.needsUpdatedStartLocation&&(this.locationData=Object.assign({},this.locationData,{first_line:locationData.first_line,first_column:locationData.first_column,range:[locationData.range[0],this.locationData.range[1]]}),base=(null==(ref1=this.variable)?void 0:ref1.base)||this.variable,base.needsUpdatedStartLocation&&(this.variable.locationData=Object.assign({},this.variable.locationData,{first_line:locationData.first_line,first_column:locationData.first_column,range:[locationData.range[0],this.variable.locationData.range[1]]}),base.updateLocationDataIfMissing(locationData)),delete this.needsUpdatedStartLocation),_get(_getPrototypeOf(Call.prototype),\"updateLocationDataIfMissing\",this).call(this,locationData)}},{key:\"newInstance\",value:function newInstance(){var base,ref1;return base=(null==(ref1=this.variable)?void 0:ref1.base)||this.variable,base instanceof Call&&!base.isNew?base.newInstance():this.isNew=!0,this.needsUpdatedStartLocation=!0,this}},{key:\"unfoldSoak\",value:function unfoldSoak(o){var call,ifn,j,left,len1,list,ref1,rite;if(this.soak){if(this.variable instanceof Super)left=new Literal(this.variable.compile(o)),rite=new Value(left),null==this.variable.accessor&&this.variable.error(\"Unsupported reference to 'super'\");else{if(ifn=_unfoldSoak(o,this,\"variable\"))return ifn;var _Value$cacheReference=new Value(this.variable).cacheReference(o),_Value$cacheReference2=_slicedToArray(_Value$cacheReference,2);left=_Value$cacheReference2[0],rite=_Value$cacheReference2[1]}return rite=new Call(rite,this.args),rite.isNew=this.isNew,left=new Literal(\"typeof \".concat(left.compile(o),\" === \\\"function\\\"\")),new If(left,new Value(rite),{soak:!0})}for(call=this,list=[];;){if(call.variable instanceof Call){list.push(call),call=call.variable;continue}if(!(call.variable instanceof Value))break;if(list.push(call),!((call=call.variable.base)instanceof Call))break}for(ref1=list.reverse(),j=0,len1=ref1.length;j<len1;j++)call=ref1[j],ifn&&(call.variable instanceof Call?call.variable=ifn:call.variable.base=ifn),ifn=_unfoldSoak(o,call,\"variable\");return ifn}},{key:\"compileNode\",value:function compileNode(o){var _fragments10,_fragments11,arg,argCode,argIndex,cache,compiledArgs,fragments,j,len1,ref1,ref2,ref3,ref4,varAccess;if(this.checkForNewSuper(),null!=(ref1=this.variable)&&(ref1.front=this.front),compiledArgs=[],varAccess=(null==(ref2=this.variable)||null==(ref3=ref2.properties)?void 0:ref3[0])instanceof Access,argCode=function(){var j,len1,ref4,results1;for(ref4=this.args||[],results1=[],(j=0,len1=ref4.length);j<len1;j++)arg=ref4[j],arg instanceof Code&&results1.push(arg);return results1}.call(this),0<argCode.length&&varAccess&&!this.variable.base.cached){var _this$variable$base$c=this.variable.base.cache(o,LEVEL_ACCESS,function(){return!1}),_this$variable$base$c2=_slicedToArray(_this$variable$base$c,1);cache=_this$variable$base$c2[0],this.variable.base.cached=cache}for(ref4=this.args,argIndex=j=0,len1=ref4.length;j<len1;argIndex=++j){var _compiledArgs;arg=ref4[argIndex],argIndex&&compiledArgs.push(this.makeCode(\", \")),(_compiledArgs=compiledArgs).push.apply(_compiledArgs,_toConsumableArray(arg.compileToFragments(o,LEVEL_LIST)))}return fragments=[],this.isNew&&fragments.push(this.makeCode(\"new \")),(_fragments10=fragments).push.apply(_fragments10,_toConsumableArray(this.variable.compileToFragments(o,LEVEL_ACCESS))),(_fragments11=fragments).push.apply(_fragments11,[this.makeCode(\"(\")].concat(_toConsumableArray(compiledArgs),[this.makeCode(\")\")])),fragments}},{key:\"checkForNewSuper\",value:function checkForNewSuper(){if(this.isNew&&this.variable instanceof Super)return this.variable.error(\"Unsupported reference to 'super'\")}},{key:\"containsSoak\",value:function containsSoak(){var ref1;return!!this.soak||null!=(ref1=this.variable)&&\"function\"==typeof ref1.containsSoak&&ref1.containsSoak()}},{key:\"astNode\",value:function astNode(o){var ref1;return this.soak&&this.variable instanceof Super&&(null==(ref1=o.scope.namedMethod())?void 0:ref1.ctor)&&this.variable.error(\"Unsupported reference to 'super'\"),this.checkForNewSuper(),_get(_getPrototypeOf(Call.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isNew?\"NewExpression\":this.containsSoak()?\"OptionalCallExpression\":\"CallExpression\"}},{key:\"astProperties\",value:function astProperties(o){var arg;return{callee:this.variable.ast(o,LEVEL_ACCESS),arguments:function(){var j,len1,ref1,results1;for(ref1=this.args,results1=[],(j=0,len1=ref1.length);j<len1;j++)arg=ref1[j],results1.push(arg.ast(o,LEVEL_LIST));return results1}.call(this),optional:!!this.soak,implicit:!!this.implicit}}}]),Call}(Base);return Call.prototype.children=[\"variable\",\"args\"],Call}.call(this),exports.SuperCall=SuperCall=function(){var SuperCall=function(_Call){function SuperCall(){return _classCallCheck(this,SuperCall),_super39.apply(this,arguments)}_inherits(SuperCall,_Call);var _super39=_createSuper(SuperCall);return _createClass(SuperCall,[{key:\"isStatement\",value:function isStatement(o){var ref1;return(null==(ref1=this.expressions)?void 0:ref1.length)&&o.level===LEVEL_TOP}},{key:\"compileNode\",value:function compileNode(o){var ref,ref1,replacement,superCall;if(null==(ref1=this.expressions)||!ref1.length)return _get(_getPrototypeOf(SuperCall.prototype),\"compileNode\",this).call(this,o);if(superCall=new Literal(fragmentsToText(_get(_getPrototypeOf(SuperCall.prototype),\"compileNode\",this).call(this,o))),replacement=new Block(this.expressions.slice()),o.level>LEVEL_TOP){var _superCall$cache=superCall.cache(o,null,YES),_superCall$cache2=_slicedToArray(_superCall$cache,2);superCall=_superCall$cache2[0],ref=_superCall$cache2[1],replacement.push(ref)}return replacement.unshift(superCall),replacement.compileToFragments(o,o.level===LEVEL_TOP?o.level:LEVEL_LIST)}}]),SuperCall}(Call);return SuperCall.prototype.children=Call.prototype.children.concat([\"expressions\"]),SuperCall}.call(this),exports.Super=Super=function(){var Super=function(_Base19){function Super(accessor,superLiteral){var _this36;return _classCallCheck(this,Super),_this36=_super40.call(this),_this36.accessor=accessor,_this36.superLiteral=superLiteral,_this36}_inherits(Super,_Base19);var _super40=_createSuper(Super);return _createClass(Super,[{key:\"compileNode\",value:function compileNode(o){var fragments,method,name,nref,ref1,ref2,salvagedComments,variable;if(this.checkInInstanceMethod(o),method=o.scope.namedMethod(),null==method.ctor&&null==this.accessor){var _method=method;name=_method.name,variable=_method.variable,(name.shouldCache()||name instanceof Index&&name.index.isAssignable())&&(nref=new IdentifierLiteral(o.scope.parent.freeVariable(\"name\")),name.index=new Assign(nref,name.index)),this.accessor=null==nref?name:new Index(nref)}return(null==(ref1=this.accessor)||null==(ref2=ref1.name)?void 0:ref2.comments)&&(salvagedComments=this.accessor.name.comments,delete this.accessor.name.comments),fragments=new Value(new Literal(\"super\"),this.accessor?[this.accessor]:[]).compileToFragments(o),salvagedComments&&attachCommentsToNode(salvagedComments,this.accessor.name),fragments}},{key:\"checkInInstanceMethod\",value:function checkInInstanceMethod(o){var method;if(method=o.scope.namedMethod(),null==method||!method.isMethod)return this.error(\"cannot use super outside of an instance method\")}},{key:\"astNode\",value:function astNode(o){var ref1;return this.checkInInstanceMethod(o),null==this.accessor?_get(_getPrototypeOf(Super.prototype),\"astNode\",this).call(this,o):new Value(new Super().withLocationDataFrom(null==(ref1=this.superLiteral)?this:ref1),[this.accessor]).withLocationDataFrom(this).ast(o)}}]),Super}(Base);return Super.prototype.children=[\"accessor\"],Super}.call(this),exports.RegexWithInterpolations=RegexWithInterpolations=function(){var RegexWithInterpolations=function(_Base20){function RegexWithInterpolations(call1){var _ref37=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref37$heregexComment=_ref37.heregexCommentTokens,heregexCommentTokens=void 0===_ref37$heregexComment?[]:_ref37$heregexComment,_this37;return _classCallCheck(this,RegexWithInterpolations),_this37=_super41.call(this),_this37.call=call1,_this37.heregexCommentTokens=heregexCommentTokens,_this37}_inherits(RegexWithInterpolations,_Base20);var _super41=_createSuper(RegexWithInterpolations);return _createClass(RegexWithInterpolations,[{key:\"compileNode\",value:function compileNode(o){return this.call.compileNode(o)}},{key:\"astType\",value:function astType(){return\"InterpolatedRegExpLiteral\"}},{key:\"astProperties\",value:function astProperties(o){var heregexCommentToken,ref1,ref2;return{interpolatedPattern:this.call.args[0].ast(o),flags:null==(ref1=null==(ref2=this.call.args[1])?void 0:ref2.unwrap().originalValue)?\"\":ref1,comments:function(){var j,len1,ref3,results1;for(ref3=this.heregexCommentTokens,results1=[],(j=0,len1=ref3.length);j<len1;j++)heregexCommentToken=ref3[j],heregexCommentToken.here?results1.push(new HereComment(heregexCommentToken).ast(o)):results1.push(new LineComment(heregexCommentToken).ast(o));return results1}.call(this)}}}]),RegexWithInterpolations}(Base);return RegexWithInterpolations.prototype.children=[\"call\"],RegexWithInterpolations}.call(this),exports.TaggedTemplateCall=TaggedTemplateCall=function(_Call2){function TaggedTemplateCall(variable,arg,soak){return _classCallCheck(this,TaggedTemplateCall),arg instanceof StringLiteral&&(arg=StringWithInterpolations.fromStringLiteral(arg)),_super42.call(this,variable,[arg],soak)}_inherits(TaggedTemplateCall,_Call2);var _super42=_createSuper(TaggedTemplateCall);return _createClass(TaggedTemplateCall,[{key:\"compileNode\",value:function compileNode(o){return this.variable.compileToFragments(o,LEVEL_ACCESS).concat(this.args[0].compileToFragments(o,LEVEL_LIST))}},{key:\"astType\",value:function astType(){return\"TaggedTemplateExpression\"}},{key:\"astProperties\",value:function astProperties(o){return{tag:this.variable.ast(o,LEVEL_ACCESS),quasi:this.args[0].ast(o,LEVEL_LIST)}}}]),TaggedTemplateCall}(Call),exports.Extends=Extends=function(){var Extends=function(_Base21){function Extends(child1,parent1){var _this38;return _classCallCheck(this,Extends),_this38=_super43.call(this),_this38.child=child1,_this38.parent=parent1,_this38}_inherits(Extends,_Base21);var _super43=_createSuper(Extends);return _createClass(Extends,[{key:\"compileToFragments\",value:function compileToFragments(o){return new Call(new Value(new Literal(utility(\"extend\",o))),[this.child,this.parent]).compileToFragments(o)}}]),Extends}(Base);return Extends.prototype.children=[\"child\",\"parent\"],Extends}.call(this),exports.Access=Access=function(){var Access=function(_Base22){function Access(name1){var _ref38=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},soak1=_ref38.soak,shorthand=_ref38.shorthand,_this39;return _classCallCheck(this,Access),_this39=_super44.call(this),_this39.name=name1,_this39.soak=soak1,_this39.shorthand=shorthand,_this39}_inherits(Access,_Base22);var _super44=_createSuper(Access);return _createClass(Access,[{key:\"compileToFragments\",value:function compileToFragments(o){var name,node;return name=this.name.compileToFragments(o),node=this.name.unwrap(),node instanceof PropertyName?[this.makeCode(\".\")].concat(_toConsumableArray(name)):[this.makeCode(\"[\")].concat(_toConsumableArray(name),[this.makeCode(\"]\")])}},{key:\"astNode\",value:function astNode(o){return this.name.ast(o)}}]),Access}(Base);return Access.prototype.children=[\"name\"],Access.prototype.shouldCache=NO,Access}.call(this),exports.Index=Index=function(){var Index=function(_Base23){function Index(index1){var _this40;return _classCallCheck(this,Index),_this40=_super45.call(this),_this40.index=index1,_this40}_inherits(Index,_Base23);var _super45=_createSuper(Index);return _createClass(Index,[{key:\"compileToFragments\",value:function compileToFragments(o){return[].concat(this.makeCode(\"[\"),this.index.compileToFragments(o,LEVEL_PAREN),this.makeCode(\"]\"))}},{key:\"shouldCache\",value:function shouldCache(){return this.index.shouldCache()}},{key:\"astNode\",value:function astNode(o){return this.index.ast(o)}}]),Index}(Base);return Index.prototype.children=[\"index\"],Index}.call(this),exports.Range=Range=function(){var Range=function(_Base24){function Range(from1,to1,tag){var _this41;return _classCallCheck(this,Range),_this41=_super46.call(this),_this41.from=from1,_this41.to=to1,_this41.exclusive=\"exclusive\"===tag,_this41.equals=_this41.exclusive?\"\":\"=\",_this41}_inherits(Range,_Base24);var _super46=_createSuper(Range);return _createClass(Range,[{key:\"compileVariables\",value:function compileVariables(o){var shouldCache,step;o=merge(o,{top:!0}),shouldCache=del(o,\"shouldCache\");var _this$cacheToCodeFrag=this.cacheToCodeFragments(this.from.cache(o,LEVEL_LIST,shouldCache)),_this$cacheToCodeFrag2=_slicedToArray(_this$cacheToCodeFrag,2);this.fromC=_this$cacheToCodeFrag2[0],this.fromVar=_this$cacheToCodeFrag2[1];var _this$cacheToCodeFrag3=this.cacheToCodeFragments(this.to.cache(o,LEVEL_LIST,shouldCache)),_this$cacheToCodeFrag4=_slicedToArray(_this$cacheToCodeFrag3,2);if(this.toC=_this$cacheToCodeFrag4[0],this.toVar=_this$cacheToCodeFrag4[1],step=del(o,\"step\")){var _this$cacheToCodeFrag5=this.cacheToCodeFragments(step.cache(o,LEVEL_LIST,shouldCache)),_this$cacheToCodeFrag6=_slicedToArray(_this$cacheToCodeFrag5,2);this.step=_this$cacheToCodeFrag6[0],this.stepVar=_this$cacheToCodeFrag6[1]}return this.fromNum=this.from.isNumber()?parseNumber(this.fromVar):null,this.toNum=this.to.isNumber()?parseNumber(this.toVar):null,this.stepNum=(null==step?void 0:step.isNumber())?parseNumber(this.stepVar):null}},{key:\"compileNode\",value:function compileNode(o){var cond,condPart,from,gt,idx,idxName,known,lowerBound,lt,namedIndex,ref1,ref2,stepCond,stepNotZero,stepPart,to,upperBound,varPart;if(this.fromVar||this.compileVariables(o),!o.index)return this.compileArray(o);known=null!=this.fromNum&&null!=this.toNum,idx=del(o,\"index\"),idxName=del(o,\"name\"),namedIndex=idxName&&idxName!==idx,varPart=known&&!namedIndex?\"var \".concat(idx,\" = \").concat(this.fromC):\"\".concat(idx,\" = \").concat(this.fromC),this.toC!==this.toVar&&(varPart+=\", \".concat(this.toC)),this.step!==this.stepVar&&(varPart+=\", \".concat(this.step)),lt=\"\".concat(idx,\" <\").concat(this.equals),gt=\"\".concat(idx,\" >\").concat(this.equals);var _ref39=[this.fromNum,this.toNum];return from=_ref39[0],to=_ref39[1],stepNotZero=\"\".concat(null==(ref1=this.stepNum)?this.stepVar:ref1,\" !== 0\"),stepCond=\"\".concat(null==(ref2=this.stepNum)?this.stepVar:ref2,\" > 0\"),lowerBound=\"\".concat(lt,\" \").concat(known?to:this.toVar),upperBound=\"\".concat(gt,\" \").concat(known?to:this.toVar),condPart=null==this.step?known?\"\".concat(from<=to?lt:gt,\" \").concat(to):\"(\".concat(this.fromVar,\" <= \").concat(this.toVar,\" ? \").concat(lowerBound,\" : \").concat(upperBound,\")\"):null!=this.stepNum&&0!==this.stepNum?0<this.stepNum?\"\".concat(lowerBound):\"\".concat(upperBound):\"\".concat(stepNotZero,\" && (\").concat(stepCond,\" ? \").concat(lowerBound,\" : \").concat(upperBound,\")\"),cond=this.stepVar?\"\".concat(this.stepVar,\" > 0\"):\"\".concat(this.fromVar,\" <= \").concat(this.toVar),stepPart=this.stepVar?\"\".concat(idx,\" += \").concat(this.stepVar):known?namedIndex?from<=to?\"++\".concat(idx):\"--\".concat(idx):from<=to?\"\".concat(idx,\"++\"):\"\".concat(idx,\"--\"):namedIndex?\"\".concat(cond,\" ? ++\").concat(idx,\" : --\").concat(idx):\"\".concat(cond,\" ? \").concat(idx,\"++ : \").concat(idx,\"--\"),namedIndex&&(varPart=\"\".concat(idxName,\" = \").concat(varPart)),namedIndex&&(stepPart=\"\".concat(idxName,\" = \").concat(stepPart)),[this.makeCode(\"\".concat(varPart,\"; \").concat(condPart,\"; \").concat(stepPart))]}},{key:\"compileArray\",value:function compileArray(o){var args,body,cond,hasArgs,i,idt,known,post,pre,range,ref1,result,vars;return(known=null!=this.fromNum&&null!=this.toNum,known&&20>=_Mathabs(this.fromNum-this.toNum))?(range=function(){for(var results1=[],j=ref1=this.fromNum,ref2=this.toNum;ref1<=ref2?j<=ref2:j>=ref2;ref1<=ref2?j++:j--)results1.push(j);return results1}.apply(this),this.exclusive&&range.pop(),[this.makeCode(\"[\".concat(range.join(\", \"),\"]\"))]):(idt=this.tab+TAB,i=o.scope.freeVariable(\"i\",{single:!0,reserve:!1}),result=o.scope.freeVariable(\"results\",{reserve:!1}),pre=\"\\n\".concat(idt,\"var \").concat(result,\" = [];\"),known?(o.index=i,body=fragmentsToText(this.compileNode(o))):(vars=\"\".concat(i,\" = \").concat(this.fromC)+(this.toC===this.toVar?\"\":\", \".concat(this.toC)),cond=\"\".concat(this.fromVar,\" <= \").concat(this.toVar),body=\"var \".concat(vars,\"; \").concat(cond,\" ? \").concat(i,\" <\").concat(this.equals,\" \").concat(this.toVar,\" : \").concat(i,\" >\").concat(this.equals,\" \").concat(this.toVar,\"; \").concat(cond,\" ? \").concat(i,\"++ : \").concat(i,\"--\")),post=\"{ \".concat(result,\".push(\").concat(i,\"); }\\n\").concat(idt,\"return \").concat(result,\";\\n\").concat(o.indent),hasArgs=function(node){return null==node?void 0:node.contains(isLiteralArguments)},(hasArgs(this.from)||hasArgs(this.to))&&(args=\", arguments\"),[this.makeCode(\"(function() {\".concat(pre,\"\\n\").concat(idt,\"for (\").concat(body,\")\").concat(post,\"}).apply(this\").concat(null==args?\"\":args,\")\"))])}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{from:null==(ref1=null==(ref2=this.from)?void 0:ref2.ast(o))?null:ref1,to:null==(ref3=null==(ref4=this.to)?void 0:ref4.ast(o))?null:ref3,exclusive:this.exclusive}}}]),Range}(Base);return Range.prototype.children=[\"from\",\"to\"],Range}.call(this),exports.Slice=Slice=function(){var Slice=function(_Base25){function Slice(range1){var _this42;return _classCallCheck(this,Slice),_this42=_super47.call(this),_this42.range=range1,_this42}_inherits(Slice,_Base25);var _super47=_createSuper(Slice);return _createClass(Slice,[{key:\"compileNode\",value:function compileNode(o){var _this$range=this.range,compiled,compiledText,from,fromCompiled,to,toStr;return to=_this$range.to,from=_this$range.from,(null==from?void 0:from.shouldCache())&&(from=new Value(new Parens(from))),(null==to?void 0:to.shouldCache())&&(to=new Value(new Parens(to))),fromCompiled=(null==from?void 0:from.compileToFragments(o,LEVEL_PAREN))||[this.makeCode(\"0\")],to&&(compiled=to.compileToFragments(o,LEVEL_PAREN),compiledText=fragmentsToText(compiled),(this.range.exclusive||-1!=+compiledText)&&(toStr=\", \"+(this.range.exclusive?compiledText:to.isNumber()?\"\".concat(+compiledText+1):(compiled=to.compileToFragments(o,LEVEL_ACCESS),\"+\".concat(fragmentsToText(compiled),\" + 1 || 9e9\"))))),[this.makeCode(\".slice(\".concat(fragmentsToText(fromCompiled)).concat(toStr||\"\",\")\"))]}},{key:\"astNode\",value:function astNode(o){return this.range.ast(o)}}]),Slice}(Base);return Slice.prototype.children=[\"range\"],Slice}.call(this),exports.Obj=Obj=function(){var Obj=function(_Base26){function Obj(props){var generated=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],_this43;return _classCallCheck(this,Obj),_this43=_super48.call(this),_this43.generated=generated,_this43.objects=_this43.properties=props||[],_this43}_inherits(Obj,_Base26);var _super48=_createSuper(Obj);return _createClass(Obj,[{key:\"isAssignable\",value:function isAssignable(opts){var j,len1,message,prop,ref1,ref2;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(prop=ref1[j],message=isUnassignable(prop.unwrapAll().value),message&&prop.error(message),prop instanceof Assign&&\"object\"===prop.context&&!((null==(ref2=prop.value)?void 0:ref2.base)instanceof Arr)&&(prop=prop.value),!prop.isAssignable(opts))return!1;return!0}},{key:\"shouldCache\",value:function shouldCache(){return!this.isAssignable()}},{key:\"hasSplat\",value:function hasSplat(){var j,len1,prop,ref1;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(prop=ref1[j],prop instanceof Splat)return!0;return!1}},{key:\"reorderProperties\",value:function reorderProperties(){var props,splatProp,splatProps;return props=this.properties,splatProps=this.getAndCheckSplatProps(),splatProp=props.splice(splatProps[0],1),this.objects=this.properties=[].concat(props,splatProp)}},{key:\"compileNode\",value:function compileNode(o){var answer,i,idt,indent,isCompact,j,join,k,key,l,lastNode,len1,len2,len3,node,prop,props,ref1,value;if(this.hasSplat()&&this.lhs&&this.reorderProperties(),props=this.properties,this.generated)for(j=0,len1=props.length;j<len1;j++)node=props[j],node instanceof Value&&node.error(\"cannot have an implicit value in an implicit object\");for(idt=o.indent+=TAB,lastNode=this.lastNode(this.properties),this.propagateLhs(),isCompact=!0,ref1=this.properties,(k=0,len2=ref1.length);k<len2;k++)prop=ref1[k],prop instanceof Assign&&\"object\"===prop.context&&(isCompact=!1);for(answer=[],answer.push(this.makeCode(isCompact?\"\":\"\\n\")),(i=l=0,len3=props.length);l<len3;i=++l){var _answer;if(prop=props[i],join=i===props.length-1?\"\":isCompact?\", \":prop===lastNode?\"\\n\":\",\\n\",indent=isCompact?\"\":idt,key=prop instanceof Assign&&\"object\"===prop.context?prop.variable:prop instanceof Assign?(this.lhs?void 0:prop.operatorToken.error(\"unexpected \".concat(prop.operatorToken.value)),prop.variable):prop,key instanceof Value&&key.hasProperties()&&((\"object\"===prop.context||!key[\"this\"])&&key.error(\"invalid object key\"),key=key.properties[0].name,prop=new Assign(key,prop,\"object\")),key===prop)if(prop.shouldCache()){var _prop$base$cache=prop.base.cache(o),_prop$base$cache2=_slicedToArray(_prop$base$cache,2);key=_prop$base$cache2[0],value=_prop$base$cache2[1],key instanceof IdentifierLiteral&&(key=new PropertyName(key.value)),prop=new Assign(key,value,\"object\")}else if(!(key instanceof Value&&key.base instanceof ComputedPropertyName))\"function\"==typeof prop.bareLiteral&&prop.bareLiteral(IdentifierLiteral)||prop instanceof Splat||(prop=new Assign(prop,prop,\"object\"));else if(prop.base.value.shouldCache()){var _prop$base$value$cach=prop.base.value.cache(o),_prop$base$value$cach2=_slicedToArray(_prop$base$value$cach,2);key=_prop$base$value$cach2[0],value=_prop$base$value$cach2[1],key instanceof IdentifierLiteral&&(key=new ComputedPropertyName(key.value)),prop=new Assign(key,value,\"object\")}else prop=new Assign(key,prop.base.value,\"object\");indent&&answer.push(this.makeCode(indent)),(_answer=answer).push.apply(_answer,_toConsumableArray(prop.compileToFragments(o,LEVEL_TOP))),join&&answer.push(this.makeCode(join))}return answer.push(this.makeCode(isCompact?\"\":\"\\n\".concat(this.tab))),answer=this.wrapInBraces(answer),this.front?this.wrapInParentheses(answer):answer}},{key:\"getAndCheckSplatProps\",value:function getAndCheckSplatProps(){var i,prop,props,splatProps;if(this.hasSplat()&&this.lhs)return props=this.properties,splatProps=function(){var j,len1,results1;for(results1=[],i=j=0,len1=props.length;j<len1;i=++j)prop=props[i],prop instanceof Splat&&results1.push(i);return results1}(),1<(null==splatProps?void 0:splatProps.length)&&props[splatProps[1]].error(\"multiple spread elements are disallowed\"),splatProps}},{key:\"assigns\",value:function assigns(name){var j,len1,prop,ref1;for(ref1=this.properties,j=0,len1=ref1.length;j<len1;j++)if(prop=ref1[j],prop.assigns(name))return!0;return!1}},{key:\"eachName\",value:function eachName(iterator){var j,len1,prop,ref1,results1;for(ref1=this.properties,results1=[],(j=0,len1=ref1.length);j<len1;j++)prop=ref1[j],prop instanceof Assign&&\"object\"===prop.context&&(prop=prop.value),prop=prop.unwrapAll(),null==prop.eachName?results1.push(void 0):results1.push(prop.eachName(iterator));return results1}},{key:\"expandProperty\",value:function expandProperty(property){var context,key,operatorToken,variable;return variable=property.variable,context=property.context,operatorToken=property.operatorToken,key=property instanceof Assign&&\"object\"===context?variable:property instanceof Assign?(this.lhs?void 0:operatorToken.error(\"unexpected \".concat(operatorToken.value)),variable):property,key instanceof Value&&key.hasProperties()?(\"object\"!==context&&key[\"this\"]||key.error(\"invalid object key\"),property instanceof Assign?new ObjectProperty({fromAssign:property}):new ObjectProperty({key:property})):key===property?property instanceof Splat?property:new ObjectProperty({key:property}):new ObjectProperty({fromAssign:property})}},{key:\"expandProperties\",value:function expandProperties(){var j,len1,property,ref1,results1;for(ref1=this.properties,results1=[],(j=0,len1=ref1.length);j<len1;j++)property=ref1[j],results1.push(this.expandProperty(property));return results1}},{key:\"propagateLhs\",value:function propagateLhs(setLhs){var j,len1,property,ref1,results1,unwrappedValue,value;if(setLhs&&(this.lhs=!0),!!this.lhs){for(ref1=this.properties,results1=[],(j=0,len1=ref1.length);j<len1;j++)if(property=ref1[j],property instanceof Assign&&\"object\"===property.context){var _property2=property;value=_property2.value,unwrappedValue=value.unwrapAll(),unwrappedValue instanceof Arr||unwrappedValue instanceof Obj?results1.push(unwrappedValue.propagateLhs(!0)):unwrappedValue instanceof Assign?results1.push(unwrappedValue.nestedLhs=!0):results1.push(void 0)}else property instanceof Assign?results1.push(property.nestedLhs=!0):property instanceof Splat?results1.push(property.propagateLhs(!0)):results1.push(void 0);return results1}}},{key:\"astNode\",value:function astNode(o){return this.getAndCheckSplatProps(),_get(_getPrototypeOf(Obj.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.lhs?\"ObjectPattern\":\"ObjectExpression\"}},{key:\"astProperties\",value:function astProperties(o){var property;return{implicit:!!this.generated,properties:function(){var j,len1,ref1,results1;for(ref1=this.expandProperties(),results1=[],(j=0,len1=ref1.length);j<len1;j++)property=ref1[j],results1.push(property.ast(o));return results1}.call(this)}}}]),Obj}(Base);return Obj.prototype.children=[\"properties\"],Obj}.call(this),exports.ObjectProperty=ObjectProperty=function(_Base27){function ObjectProperty(_ref40){var key=_ref40.key,fromAssign=_ref40.fromAssign,_this44;_classCallCheck(this,ObjectProperty);var context,value;return _this44=_super49.call(this),fromAssign?(_this44.key=fromAssign.variable,value=fromAssign.value,context=fromAssign.context,\"object\"===context?_this44.value=value:(_this44.value=fromAssign,_this44.shorthand=!0),_this44.locationData=fromAssign.locationData):(_this44.key=key,_this44.shorthand=!0,_this44.locationData=key.locationData),_this44}_inherits(ObjectProperty,_Base27);var _super49=_createSuper(ObjectProperty);return _createClass(ObjectProperty,[{key:\"astProperties\",value:function astProperties(o){var isComputedPropertyName,keyAst,ref1,ref2;return isComputedPropertyName=this.key instanceof Value&&this.key.base instanceof ComputedPropertyName||this.key.unwrap()instanceof StringWithInterpolations,keyAst=this.key.ast(o,LEVEL_LIST),{key:(null==keyAst?void 0:keyAst.declaration)?Object.assign({},keyAst,{declaration:!1}):keyAst,value:null==(ref1=null==(ref2=this.value)?void 0:ref2.ast(o,LEVEL_LIST))?keyAst:ref1,shorthand:!!this.shorthand,computed:!!isComputedPropertyName,method:!1}}}]),ObjectProperty}(Base),exports.Arr=Arr=function(){var Arr=function(_Base28){function Arr(objs){var lhs1=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],_this45;return _classCallCheck(this,Arr),_this45=_super50.call(this),_this45.lhs=lhs1,_this45.objects=objs||[],_this45.propagateLhs(),_this45}_inherits(Arr,_Base28);var _super50=_createSuper(Arr);return _createClass(Arr,[{key:\"hasElision\",value:function hasElision(){var j,len1,obj,ref1;for(ref1=this.objects,j=0,len1=ref1.length;j<len1;j++)if(obj=ref1[j],obj instanceof Elision)return!0;return!1}},{key:\"isAssignable\",value:function isAssignable(opts){var _ref41=null==opts?{}:opts,allowEmptyArray,allowExpansion,allowNontrailingSplat,i,j,len1,obj,ref1;allowExpansion=_ref41.allowExpansion,allowNontrailingSplat=_ref41.allowNontrailingSplat;var _ref41$allowEmptyArra=_ref41.allowEmptyArray;if(allowEmptyArray=void 0!==_ref41$allowEmptyArra&&_ref41$allowEmptyArra,!this.objects.length)return allowEmptyArray;for(ref1=this.objects,i=j=0,len1=ref1.length;j<len1;i=++j){if(obj=ref1[i],!allowNontrailingSplat&&obj instanceof Splat&&i+1!==this.objects.length)return!1;if(!(allowExpansion&&obj instanceof Expansion||obj.isAssignable(opts)&&(!obj.isAtomic||obj.isAtomic())))return!1}return!0}},{key:\"shouldCache\",value:function shouldCache(){return!this.isAssignable()}},{key:\"compileNode\",value:function compileNode(o){var answer,compiledObjs,fragment,fragmentIndex,fragmentIsElision,fragments,includesLineCommentsOnNonFirstElement,index,j,k,l,len1,len2,len3,len4,len5,obj,objIndex,olen,p,passedElision,q,ref1,ref2,unwrappedObj;if(!this.objects.length)return[this.makeCode(\"[]\")];for(o.indent+=TAB,fragmentIsElision=function(_ref42){var _ref43=_slicedToArray(_ref42,1),fragment=_ref43[0];return\"Elision\"===fragment.type&&\",\"===fragment.code.trim()},passedElision=!1,answer=[],ref1=this.objects,(objIndex=j=0,len1=ref1.length);j<len1;objIndex=++j)obj=ref1[objIndex],unwrappedObj=obj.unwrapAll(),unwrappedObj.comments&&0===unwrappedObj.comments.filter(function(comment){return!comment.here}).length&&(unwrappedObj.includeCommentFragments=YES);for(compiledObjs=function(){var k,len2,ref2,results1;for(ref2=this.objects,results1=[],(k=0,len2=ref2.length);k<len2;k++)obj=ref2[k],results1.push(obj.compileToFragments(o,LEVEL_LIST));return results1}.call(this),olen=compiledObjs.length,includesLineCommentsOnNonFirstElement=!1,(index=k=0,len2=compiledObjs.length);k<len2;index=++k){var _answer2;for(fragments=compiledObjs[index],l=0,len3=fragments.length;l<len3;l++)fragment=fragments[l],fragment.isHereComment?fragment.code=fragment.code.trim():0!==index&&!1===includesLineCommentsOnNonFirstElement&&hasLineComments(fragment)&&(includesLineCommentsOnNonFirstElement=!0);0!==index&&passedElision&&(!fragmentIsElision(fragments)||index===olen-1)&&answer.push(this.makeCode(\", \")),passedElision=passedElision||!fragmentIsElision(fragments),(_answer2=answer).push.apply(_answer2,_toConsumableArray(fragments))}if(includesLineCommentsOnNonFirstElement||0<=indexOf.call(fragmentsToText(answer),\"\\n\")){for(fragmentIndex=p=0,len4=answer.length;p<len4;fragmentIndex=++p)fragment=answer[fragmentIndex],fragment.isHereComment?fragment.code=\"\".concat(multident(fragment.code,o.indent,!1),\"\\n\").concat(o.indent):\", \"===fragment.code&&(null==fragment||!fragment.isElision)&&\"StringLiteral\"!==(ref2=fragment.type)&&\"StringWithInterpolations\"!==ref2&&(fragment.code=\",\\n\".concat(o.indent));answer.unshift(this.makeCode(\"[\\n\".concat(o.indent))),answer.push(this.makeCode(\"\\n\".concat(this.tab,\"]\")))}else{for(q=0,len5=answer.length;q<len5;q++)fragment=answer[q],fragment.isHereComment&&(fragment.code=\"\".concat(fragment.code,\" \"));answer.unshift(this.makeCode(\"[\")),answer.push(this.makeCode(\"]\"))}return answer}},{key:\"assigns\",value:function assigns(name){var j,len1,obj,ref1;for(ref1=this.objects,j=0,len1=ref1.length;j<len1;j++)if(obj=ref1[j],obj.assigns(name))return!0;return!1}},{key:\"eachName\",value:function eachName(iterator){var j,len1,obj,ref1,results1;for(ref1=this.objects,results1=[],(j=0,len1=ref1.length);j<len1;j++)obj=ref1[j],obj=obj.unwrapAll(),results1.push(obj.eachName(iterator));return results1}},{key:\"propagateLhs\",value:function propagateLhs(setLhs){var j,len1,object,ref1,results1,unwrappedObject;if(setLhs&&(this.lhs=!0),!!this.lhs){for(ref1=this.objects,results1=[],(j=0,len1=ref1.length);j<len1;j++)object=ref1[j],(object instanceof Splat||object instanceof Expansion)&&(object.lhs=!0),unwrappedObject=object.unwrapAll(),unwrappedObject instanceof Arr||unwrappedObject instanceof Obj?results1.push(unwrappedObject.propagateLhs(!0)):unwrappedObject instanceof Assign?results1.push(unwrappedObject.nestedLhs=!0):results1.push(void 0);return results1}}},{key:\"astType\",value:function astType(){return this.lhs?\"ArrayPattern\":\"ArrayExpression\"}},{key:\"astProperties\",value:function astProperties(o){var object;return{elements:function(){var j,len1,ref1,results1;for(ref1=this.objects,results1=[],(j=0,len1=ref1.length);j<len1;j++)object=ref1[j],results1.push(object.ast(o,LEVEL_LIST));return results1}.call(this)}}}]),Arr}(Base);return Arr.prototype.children=[\"objects\"],Arr}.call(this),exports.Class=Class=function(){var Class=function(_Base29){function Class(variable1,parent1,body1){var _this46;return _classCallCheck(this,Class),_this46=_super51.call(this),_this46.variable=variable1,_this46.parent=parent1,_this46.body=body1,null==_this46.body&&(_this46.body=new Block,_this46.hasGeneratedBody=!0),_this46}_inherits(Class,_Base29);var _super51=_createSuper(Class);return _createClass(Class,[{key:\"compileNode\",value:function compileNode(o){var executableBody,node,parentName;if(this.name=this.determineName(),executableBody=this.walkBody(o),this.parent instanceof Value&&!this.parent.hasProperties()&&(parentName=this.parent.base.value),this.hasNameClash=null!=this.name&&this.name===parentName,node=this,executableBody||this.hasNameClash?node=new ExecutableClassBody(node,executableBody):null==this.name&&o.level===LEVEL_TOP&&(node=new Parens(node)),this.boundMethods.length&&this.parent&&(null==this.variable&&(this.variable=new IdentifierLiteral(o.scope.freeVariable(\"_class\"))),null==this.variableRef)){var _this$variable$cache=this.variable.cache(o),_this$variable$cache2=_slicedToArray(_this$variable$cache,2);this.variable=_this$variable$cache2[0],this.variableRef=_this$variable$cache2[1]}this.variable&&(node=new Assign(this.variable,node,null,{moduleDeclaration:this.moduleDeclaration})),this.compileNode=this.compileClassDeclaration;try{return node.compileToFragments(o)}finally{delete this.compileNode}}},{key:\"compileClassDeclaration\",value:function compileClassDeclaration(o){var ref1,ref2,result;if((this.externalCtor||this.boundMethods.length)&&null==this.ctor&&(this.ctor=this.makeDefaultConstructor()),null!=(ref1=this.ctor)&&(ref1.noReturn=!0),this.boundMethods.length&&this.proxyBoundMethods(),o.indent+=TAB,result=[],result.push(this.makeCode(\"class \")),this.name&&result.push(this.makeCode(this.name)),null!=(null==(ref2=this.variable)?void 0:ref2.comments)&&this.compileCommentFragments(o,this.variable,result),this.name&&result.push(this.makeCode(\" \")),this.parent){var _result;(_result=result).push.apply(_result,[this.makeCode(\"extends \")].concat(_toConsumableArray(this.parent.compileToFragments(o)),[this.makeCode(\" \")]))}if(result.push(this.makeCode(\"{\")),!this.body.isEmpty()){var _result2;this.body.spaced=!0,result.push(this.makeCode(\"\\n\")),(_result2=result).push.apply(_result2,_toConsumableArray(this.body.compileToFragments(o,LEVEL_TOP))),result.push(this.makeCode(\"\\n\".concat(this.tab)))}return result.push(this.makeCode(\"}\")),result}},{key:\"determineName\",value:function determineName(){var _slice1$call13,_slice1$call14,message,name,node,ref1,tail;return this.variable?(ref1=this.variable.properties,_slice1$call13=slice1.call(ref1,-1),_slice1$call14=_slicedToArray(_slice1$call13,1),tail=_slice1$call14[0],_slice1$call13,node=tail?tail instanceof Access&&tail.name:this.variable.base,!(node instanceof IdentifierLiteral||node instanceof PropertyName))?null:(name=node.value,tail||(message=isUnassignable(name),message&&this.variable.error(message)),0<=indexOf.call(JS_FORBIDDEN,name)?\"_\".concat(name):name):null}},{key:\"walkBody\",value:function walkBody(o){var assign,end,executableBody,expression,expressions,exprs,i,initializer,initializerExpression,j,k,len1,len2,method,properties,pushSlice,ref1,start;for(this.ctor=null,this.boundMethods=[],executableBody=null,initializer=[],expressions=this.body.expressions,i=0,ref1=expressions.slice(),(j=0,len1=ref1.length);j<len1;j++)if(expression=ref1[j],expression instanceof Value&&expression.isObject(!0)){for(properties=expression.base.properties,exprs=[],end=0,start=0,pushSlice=function(){if(end>start)return exprs.push(new Value(new Obj(properties.slice(start,end),!0)))};assign=properties[end];)(initializerExpression=this.addInitializerExpression(assign,o))&&(pushSlice(),exprs.push(initializerExpression),initializer.push(initializerExpression),start=end+1),end++;pushSlice(),splice.apply(expressions,[i,i-i+1].concat(exprs)),exprs,i+=exprs.length}else(initializerExpression=this.addInitializerExpression(expression,o))&&(initializer.push(initializerExpression),expressions[i]=initializerExpression),i+=1;for(k=0,len2=initializer.length;k<len2;k++)method=initializer[k],method instanceof Code&&(method.ctor?(this.ctor&&method.error(\"Cannot define more than one constructor in a class\"),this.ctor=method):method.isStatic&&method.bound?method.context=this.name:method.bound&&this.boundMethods.push(method));return o.compiling?initializer.length===expressions.length?void 0:(this.body.expressions=function(){var l,len3,results1;for(results1=[],l=0,len3=initializer.length;l<len3;l++)expression=initializer[l],results1.push(expression.hoist());return results1}(),new Block(expressions)):void 0}},{key:\"addInitializerExpression\",value:function addInitializerExpression(node,o){return node.unwrapAll()instanceof PassthroughLiteral?node:this.validInitializerMethod(node)?this.addInitializerMethod(node):!o.compiling&&this.validClassProperty(node)?this.addClassProperty(node):!o.compiling&&this.validClassPrototypeProperty(node)?this.addClassPrototypeProperty(node):null}},{key:\"validInitializerMethod\",value:function validInitializerMethod(node){return!!(node instanceof Assign&&node.value instanceof Code)&&(!(\"object\"!==node.context||node.variable.hasProperties())||node.variable.looksStatic(this.name)&&(this.name||!node.value.bound))}},{key:\"addInitializerMethod\",value:function addInitializerMethod(assign){var isConstructor,method,methodName,operatorToken,variable;return variable=assign.variable,method=assign.value,operatorToken=assign.operatorToken,method.isMethod=!0,method.isStatic=variable.looksStatic(this.name),method.isStatic?method.name=variable.properties[0]:(methodName=variable.base,method.name=new(methodName.shouldCache()?Index:Access)(methodName),method.name.updateLocationDataIfMissing(methodName.locationData),isConstructor=methodName instanceof StringLiteral?\"constructor\"===methodName.originalValue:\"constructor\"===methodName.value,isConstructor&&(method.ctor=this.parent?\"derived\":\"base\"),method.bound&&method.ctor&&method.error(\"Cannot define a constructor as a bound (fat arrow) function\")),method.operatorToken=operatorToken,method}},{key:\"validClassProperty\",value:function validClassProperty(node){return!!(node instanceof Assign)&&node.variable.looksStatic(this.name)}},{key:\"addClassProperty\",value:function addClassProperty(assign){var operatorToken,staticClassName,value,variable;variable=assign.variable,value=assign.value,operatorToken=assign.operatorToken;var _variable$looksStatic=variable.looksStatic(this.name);return staticClassName=_variable$looksStatic.staticClassName,new ClassProperty({name:variable.properties[0],isStatic:!0,staticClassName:staticClassName,value:value,operatorToken:operatorToken}).withLocationDataFrom(assign)}},{key:\"validClassPrototypeProperty\",value:function validClassPrototypeProperty(node){return!!(node instanceof Assign)&&\"object\"===node.context&&!node.variable.hasProperties()}},{key:\"addClassPrototypeProperty\",value:function addClassPrototypeProperty(assign){var value,variable;return variable=assign.variable,value=assign.value,new ClassPrototypeProperty({name:variable.base,value:value}).withLocationDataFrom(assign)}},{key:\"makeDefaultConstructor\",value:function makeDefaultConstructor(){var applyArgs,applyCtor,ctor;return ctor=this.addInitializerMethod(new Assign(new Value(new PropertyName(\"constructor\")),new Code())),this.body.unshift(ctor),this.parent&&ctor.body.push(new SuperCall(new Super(),[new Splat(new IdentifierLiteral(\"arguments\"))])),this.externalCtor&&(applyCtor=new Value(this.externalCtor,[new Access(new PropertyName(\"apply\"))]),applyArgs=[new ThisLiteral,new IdentifierLiteral(\"arguments\")],ctor.body.push(new Call(applyCtor,applyArgs)),ctor.body.makeReturn()),ctor}},{key:\"proxyBoundMethods\",value:function proxyBoundMethods(){var method,name;return this.ctor.thisAssignments=function(){var j,len1,ref1,results1;for(ref1=this.boundMethods,results1=[],(j=0,len1=ref1.length);j<len1;j++)method=ref1[j],this.parent&&(method.classVariable=this.variableRef),name=new Value(new ThisLiteral(),[method.name]),results1.push(new Assign(name,new Call(new Value(name,[new Access(new PropertyName(\"bind\"))]),[new ThisLiteral])));return results1}.call(this),null}},{key:\"declareName\",value:function declareName(o){var alreadyDeclared,name,ref1;if((name=null==(ref1=this.variable)?void 0:ref1.unwrap())instanceof IdentifierLiteral)return alreadyDeclared=o.scope.find(name.value),name.isDeclaration=!alreadyDeclared}},{key:\"isStatementAst\",value:function isStatementAst(){return!0}},{key:\"astNode\",value:function astNode(o){var argumentsNode,jumpNode,ref1;return(jumpNode=this.body.jumps())&&jumpNode.error(\"Class bodies cannot contain pure statements\"),(argumentsNode=this.body.contains(isLiteralArguments))&&argumentsNode.error(\"Class bodies shouldn't reference arguments\"),this.declareName(o),this.name=this.determineName(),this.body.isClassBody=!0,this.hasGeneratedBody&&(this.body.locationData=zeroWidthLocationDataFromEndLocation(this.locationData)),this.walkBody(o),sniffDirectives(this.body.expressions),null!=(ref1=this.ctor)&&(ref1.noReturn=!0),_get(_getPrototypeOf(Class.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(o){return o.level===LEVEL_TOP?\"ClassDeclaration\":\"ClassExpression\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{id:null==(ref1=null==(ref2=this.variable)?void 0:ref2.ast(o))?null:ref1,superClass:null==(ref3=null==(ref4=this.parent)?void 0:ref4.ast(o,LEVEL_PAREN))?null:ref3,body:this.body.ast(o,LEVEL_TOP)}}}]),Class}(Base);return Class.prototype.children=[\"variable\",\"parent\",\"body\"],Class}.call(this),exports.ExecutableClassBody=ExecutableClassBody=function(){var ExecutableClassBody=function(_Base30){function ExecutableClassBody(_class){var body1=1<arguments.length&&void 0!==arguments[1]?arguments[1]:new Block,_this47;return _classCallCheck(this,ExecutableClassBody),_this47=_super52.call(this),_this47[\"class\"]=_class,_this47.body=body1,_this47}_inherits(ExecutableClassBody,_Base30);var _super52=_createSuper(ExecutableClassBody);return _createClass(ExecutableClassBody,[{key:\"compileNode\",value:function compileNode(o){var _this$body$expression,args,argumentsNode,directives,externalCtor,ident,jumpNode,klass,params,parent,ref1,wrapper;return(jumpNode=this.body.jumps())&&jumpNode.error(\"Class bodies cannot contain pure statements\"),(argumentsNode=this.body.contains(isLiteralArguments))&&argumentsNode.error(\"Class bodies shouldn't reference arguments\"),params=[],args=[new ThisLiteral],wrapper=new Code(params,this.body),klass=new Parens(new Call(new Value(wrapper,[new Access(new PropertyName(\"call\"))]),args)),this.body.spaced=!0,o.classScope=wrapper.makeScope(o.scope),this.name=null==(ref1=this[\"class\"].name)?o.classScope.freeVariable(this.defaultClassVariableName):ref1,ident=new IdentifierLiteral(this.name),directives=this.walkBody(),this.setContext(),this[\"class\"].hasNameClash&&(parent=new IdentifierLiteral(o.classScope.freeVariable(\"superClass\")),wrapper.params.push(new Param(parent)),args.push(this[\"class\"].parent),this[\"class\"].parent=parent),this.externalCtor&&(externalCtor=new IdentifierLiteral(o.classScope.freeVariable(\"ctor\",{reserve:!1})),this[\"class\"].externalCtor=externalCtor,this.externalCtor.variable.base=externalCtor),this.name===this[\"class\"].name?this.body.expressions.unshift(this[\"class\"]):this.body.expressions.unshift(new Assign(new IdentifierLiteral(this.name),this[\"class\"])),(_this$body$expression=this.body.expressions).unshift.apply(_this$body$expression,_toConsumableArray(directives)),this.body.push(ident),klass.compileToFragments(o)}},{key:\"walkBody\",value:function walkBody(){var _this48=this,directives,expr,index;for(directives=[],index=0;(expr=this.body.expressions[index])&&!!(expr instanceof Value&&expr.isString());)if(expr.hoisted)index++;else{var _directives;(_directives=directives).push.apply(_directives,_toConsumableArray(this.body.expressions.splice(index,1)))}return this.traverseChildren(!1,function(child){var cont,i,j,len1,node,ref1;if(child instanceof Class||child instanceof HoistTarget)return!1;if(cont=!0,child instanceof Block){for(ref1=child.expressions,i=j=0,len1=ref1.length;j<len1;i=++j)node=ref1[i],node instanceof Value&&node.isObject(!0)?(cont=!1,child.expressions[i]=_this48.addProperties(node.base.properties)):node instanceof Assign&&node.variable.looksStatic(_this48.name)&&(node.value.isStatic=!0);child.expressions=flatten(child.expressions)}return cont}),directives}},{key:\"setContext\",value:function setContext(){var _this49=this;return this.body.traverseChildren(!1,function(node){return node instanceof ThisLiteral?node.value=_this49.name:node instanceof Code&&node.bound&&(node.isStatic||!node.name)?node.context=_this49.name:void 0})}},{key:\"addProperties\",value:function addProperties(assigns){var assign,base,name,prototype,result,value,variable;return result=function(){var j,len1,results1;for(results1=[],j=0,len1=assigns.length;j<len1;j++)assign=assigns[j],variable=assign.variable,base=null==variable?void 0:variable.base,value=assign.value,delete assign.context,\"constructor\"===base.value?(value instanceof Code&&base.error(\"constructors must be defined at the top level of a class body\"),assign=this.externalCtor=new Assign(new Value(),value)):assign.variable[\"this\"]?assign.value instanceof Code&&(assign.value.isStatic=!0):(name=base instanceof ComputedPropertyName?new Index(base.value):new(base.shouldCache()?Index:Access)(base),prototype=new Access(new PropertyName(\"prototype\")),variable=new Value(new ThisLiteral(),[prototype,name]),assign.variable=variable),results1.push(assign);return results1}.call(this),compact(result)}}]),ExecutableClassBody}(Base);return ExecutableClassBody.prototype.children=[\"class\",\"body\"],ExecutableClassBody.prototype.defaultClassVariableName=\"_Class\",ExecutableClassBody}.call(this),exports.ClassProperty=ClassProperty=function(){var ClassProperty=function(_Base31){function ClassProperty(_ref44){var name1=_ref44.name,isStatic=_ref44.isStatic,staticClassName1=_ref44.staticClassName,value1=_ref44.value,operatorToken1=_ref44.operatorToken,_this50;return _classCallCheck(this,ClassProperty),_this50=_super53.call(this),_this50.name=name1,_this50.isStatic=isStatic,_this50.staticClassName=staticClassName1,_this50.value=value1,_this50.operatorToken=operatorToken1,_this50}_inherits(ClassProperty,_Base31);var _super53=_createSuper(ClassProperty);return _createClass(ClassProperty,[{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{key:this.name.ast(o,LEVEL_LIST),value:this.value.ast(o,LEVEL_LIST),static:!!this.isStatic,computed:this.name instanceof Index||this.name instanceof ComputedPropertyName,operator:null==(ref1=null==(ref2=this.operatorToken)?void 0:ref2.value)?\"=\":ref1,staticClassName:null==(ref3=null==(ref4=this.staticClassName)?void 0:ref4.ast(o))?null:ref3}}}]),ClassProperty}(Base);return ClassProperty.prototype.children=[\"name\",\"value\",\"staticClassName\"],ClassProperty.prototype.isStatement=YES,ClassProperty}.call(this),exports.ClassPrototypeProperty=ClassPrototypeProperty=function(){var ClassPrototypeProperty=function(_Base32){function ClassPrototypeProperty(_ref45){var name1=_ref45.name,value1=_ref45.value,_this51;return _classCallCheck(this,ClassPrototypeProperty),_this51=_super54.call(this),_this51.name=name1,_this51.value=value1,_this51}_inherits(ClassPrototypeProperty,_Base32);var _super54=_createSuper(ClassPrototypeProperty);return _createClass(ClassPrototypeProperty,[{key:\"astProperties\",value:function astProperties(o){return{key:this.name.ast(o,LEVEL_LIST),value:this.value.ast(o,LEVEL_LIST),computed:this.name instanceof ComputedPropertyName||this.name instanceof StringWithInterpolations}}}]),ClassPrototypeProperty}(Base);return ClassPrototypeProperty.prototype.children=[\"name\",\"value\"],ClassPrototypeProperty.prototype.isStatement=YES,ClassPrototypeProperty}.call(this),exports.ModuleDeclaration=ModuleDeclaration=function(){var ModuleDeclaration=function(_Base33){function ModuleDeclaration(clause,source1,assertions){var _this52;return _classCallCheck(this,ModuleDeclaration),_this52=_super55.call(this),_this52.clause=clause,_this52.source=source1,_this52.assertions=assertions,_this52.checkSource(),_this52}_inherits(ModuleDeclaration,_Base33);var _super55=_createSuper(ModuleDeclaration);return _createClass(ModuleDeclaration,[{key:\"checkSource\",value:function checkSource(){if(null!=this.source&&this.source instanceof StringWithInterpolations)return this.source.error(\"the name of the module to be imported from must be an uninterpolated string\")}},{key:\"checkScope\",value:function checkScope(o,moduleDeclarationType){if(0!==o.indent.length)return this.error(\"\".concat(moduleDeclarationType,\" statements must be at top-level scope\"))}},{key:\"astAssertions\",value:function astAssertions(o){var ref1;return null==(null==(ref1=this.assertions)?void 0:ref1.properties)?[]:this.assertions.properties.map(function(assertion){var _assertion$ast=assertion.ast(o),end,left,loc,right,start;return start=_assertion$ast.start,end=_assertion$ast.end,loc=_assertion$ast.loc,left=_assertion$ast.left,right=_assertion$ast.right,{type:\"ImportAttribute\",start:start,end:end,loc:loc,key:left,value:right}})}}]),ModuleDeclaration}(Base);return ModuleDeclaration.prototype.children=[\"clause\",\"source\",\"assertions\"],ModuleDeclaration.prototype.isStatement=YES,ModuleDeclaration.prototype.jumps=THIS,ModuleDeclaration.prototype.makeReturn=THIS,ModuleDeclaration}.call(this),exports.ImportDeclaration=ImportDeclaration=function(_ModuleDeclaration){function ImportDeclaration(){return _classCallCheck(this,ImportDeclaration),_super56.apply(this,arguments)}_inherits(ImportDeclaration,_ModuleDeclaration);var _super56=_createSuper(ImportDeclaration);return _createClass(ImportDeclaration,[{key:\"compileNode\",value:function compileNode(o){var code,ref1;if(this.checkScope(o,\"import\"),o.importedSymbols=[],code=[],code.push(this.makeCode(\"\".concat(this.tab,\"import \"))),null!=this.clause){var _code;(_code=code).push.apply(_code,_toConsumableArray(this.clause.compileNode(o)))}if(null!=(null==(ref1=this.source)?void 0:ref1.value)&&(null!==this.clause&&code.push(this.makeCode(\" from \")),code.push(this.makeCode(this.source.value)),null!=this.assertions)){var _code2;code.push(this.makeCode(\" assert \")),(_code2=code).push.apply(_code2,_toConsumableArray(this.assertions.compileToFragments(o)))}return code.push(this.makeCode(\";\")),code}},{key:\"astNode\",value:function astNode(o){return o.importedSymbols=[],_get(_getPrototypeOf(ImportDeclaration.prototype),\"astNode\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ret;return ret={specifiers:null==(ref1=null==(ref2=this.clause)?void 0:ref2.ast(o))?[]:ref1,source:this.source.ast(o),assertions:this.astAssertions(o)},this.clause&&(ret.importKind=\"value\"),ret}}]),ImportDeclaration}(ModuleDeclaration),exports.ImportClause=ImportClause=function(){var ImportClause=function(_Base34){function ImportClause(defaultBinding,namedImports){var _this53;return _classCallCheck(this,ImportClause),_this53=_super57.call(this),_this53.defaultBinding=defaultBinding,_this53.namedImports=namedImports,_this53}_inherits(ImportClause,_Base34);var _super57=_createSuper(ImportClause);return _createClass(ImportClause,[{key:\"compileNode\",value:function compileNode(o){var code;if(code=[],null!=this.defaultBinding){var _code3;(_code3=code).push.apply(_code3,_toConsumableArray(this.defaultBinding.compileNode(o))),null!=this.namedImports&&code.push(this.makeCode(\", \"))}if(null!=this.namedImports){var _code4;(_code4=code).push.apply(_code4,_toConsumableArray(this.namedImports.compileNode(o)))}return code}},{key:\"astNode\",value:function astNode(o){var ref1,ref2;return compact(flatten([null==(ref1=this.defaultBinding)?void 0:ref1.ast(o),null==(ref2=this.namedImports)?void 0:ref2.ast(o)]))}}]),ImportClause}(Base);return ImportClause.prototype.children=[\"defaultBinding\",\"namedImports\"],ImportClause}.call(this),exports.ExportDeclaration=ExportDeclaration=function(_ModuleDeclaration2){function ExportDeclaration(){return _classCallCheck(this,ExportDeclaration),_super58.apply(this,arguments)}_inherits(ExportDeclaration,_ModuleDeclaration2);var _super58=_createSuper(ExportDeclaration);return _createClass(ExportDeclaration,[{key:\"compileNode\",value:function compileNode(o){var code,ref1;if(this.checkScope(o,\"export\"),this.checkForAnonymousClassExport(),code=[],code.push(this.makeCode(\"\".concat(this.tab,\"export \"))),this instanceof ExportDefaultDeclaration&&code.push(this.makeCode(\"default \")),!(this instanceof ExportDefaultDeclaration)&&(this.clause instanceof Assign||this.clause instanceof Class)&&(code.push(this.makeCode(\"var \")),this.clause.moduleDeclaration=\"export\"),code=null!=this.clause.body&&this.clause.body instanceof Block?code.concat(this.clause.compileToFragments(o,LEVEL_TOP)):code.concat(this.clause.compileNode(o)),null!=(null==(ref1=this.source)?void 0:ref1.value)&&(code.push(this.makeCode(\" from \".concat(this.source.value))),null!=this.assertions)){var _code5;code.push(this.makeCode(\" assert \")),(_code5=code).push.apply(_code5,_toConsumableArray(this.assertions.compileToFragments(o)))}return code.push(this.makeCode(\";\")),code}},{key:\"checkForAnonymousClassExport\",value:function checkForAnonymousClassExport(){if(!(this instanceof ExportDefaultDeclaration)&&this.clause instanceof Class&&!this.clause.variable)return this.clause.error(\"anonymous classes cannot be exported\")}},{key:\"astNode\",value:function astNode(o){return this.checkForAnonymousClassExport(),_get(_getPrototypeOf(ExportDeclaration.prototype),\"astNode\",this).call(this,o)}}]),ExportDeclaration}(ModuleDeclaration),exports.ExportNamedDeclaration=ExportNamedDeclaration=function(_ExportDeclaration){function ExportNamedDeclaration(){return _classCallCheck(this,ExportNamedDeclaration),_super59.apply(this,arguments)}_inherits(ExportNamedDeclaration,_ExportDeclaration);var _super59=_createSuper(ExportNamedDeclaration);return _createClass(ExportNamedDeclaration,[{key:\"astProperties\",value:function astProperties(o){var clauseAst,ref1,ref2,ret;return ret={source:null==(ref1=null==(ref2=this.source)?void 0:ref2.ast(o))?null:ref1,assertions:this.astAssertions(o),exportKind:\"value\"},clauseAst=this.clause.ast(o),this.clause instanceof ExportSpecifierList?(ret.specifiers=clauseAst,ret.declaration=null):(ret.specifiers=[],ret.declaration=clauseAst),ret}}]),ExportNamedDeclaration}(ExportDeclaration),exports.ExportDefaultDeclaration=ExportDefaultDeclaration=function(_ExportDeclaration2){function ExportDefaultDeclaration(){return _classCallCheck(this,ExportDefaultDeclaration),_super60.apply(this,arguments)}_inherits(ExportDefaultDeclaration,_ExportDeclaration2);var _super60=_createSuper(ExportDefaultDeclaration);return _createClass(ExportDefaultDeclaration,[{key:\"astProperties\",value:function astProperties(o){return{declaration:this.clause.ast(o),assertions:this.astAssertions(o)}}}]),ExportDefaultDeclaration}(ExportDeclaration),exports.ExportAllDeclaration=ExportAllDeclaration=function(_ExportDeclaration3){function ExportAllDeclaration(){return _classCallCheck(this,ExportAllDeclaration),_super61.apply(this,arguments)}_inherits(ExportAllDeclaration,_ExportDeclaration3);var _super61=_createSuper(ExportAllDeclaration);return _createClass(ExportAllDeclaration,[{key:\"astProperties\",value:function astProperties(o){return{source:this.source.ast(o),assertions:this.astAssertions(o),exportKind:\"value\"}}}]),ExportAllDeclaration}(ExportDeclaration),exports.ModuleSpecifierList=ModuleSpecifierList=function(){var ModuleSpecifierList=function(_Base35){function ModuleSpecifierList(specifiers){var _this54;return _classCallCheck(this,ModuleSpecifierList),_this54=_super62.call(this),_this54.specifiers=specifiers,_this54}_inherits(ModuleSpecifierList,_Base35);var _super62=_createSuper(ModuleSpecifierList);return _createClass(ModuleSpecifierList,[{key:\"compileNode\",value:function compileNode(o){var code,compiledList,fragments,index,j,len1,specifier;if(code=[],o.indent+=TAB,compiledList=function(){var j,len1,ref1,results1;for(ref1=this.specifiers,results1=[],(j=0,len1=ref1.length);j<len1;j++)specifier=ref1[j],results1.push(specifier.compileToFragments(o,LEVEL_LIST));return results1}.call(this),0!==this.specifiers.length){for(code.push(this.makeCode(\"{\\n\".concat(o.indent))),index=j=0,len1=compiledList.length;j<len1;index=++j){var _code6;fragments=compiledList[index],index&&code.push(this.makeCode(\",\\n\".concat(o.indent))),(_code6=code).push.apply(_code6,_toConsumableArray(fragments))}code.push(this.makeCode(\"\\n}\"))}else code.push(this.makeCode(\"{}\"));return code}},{key:\"astNode\",value:function astNode(o){var j,len1,ref1,results1,specifier;for(ref1=this.specifiers,results1=[],(j=0,len1=ref1.length);j<len1;j++)specifier=ref1[j],results1.push(specifier.ast(o));return results1}}]),ModuleSpecifierList}(Base);return ModuleSpecifierList.prototype.children=[\"specifiers\"],ModuleSpecifierList}.call(this),exports.ImportSpecifierList=ImportSpecifierList=function(_ModuleSpecifierList){function ImportSpecifierList(){return _classCallCheck(this,ImportSpecifierList),_super63.apply(this,arguments)}_inherits(ImportSpecifierList,_ModuleSpecifierList);var _super63=_createSuper(ImportSpecifierList);return _createClass(ImportSpecifierList)}(ModuleSpecifierList),exports.ExportSpecifierList=ExportSpecifierList=function(_ModuleSpecifierList2){function ExportSpecifierList(){return _classCallCheck(this,ExportSpecifierList),_super64.apply(this,arguments)}_inherits(ExportSpecifierList,_ModuleSpecifierList2);var _super64=_createSuper(ExportSpecifierList);return _createClass(ExportSpecifierList)}(ModuleSpecifierList),exports.ModuleSpecifier=ModuleSpecifier=function(){var ModuleSpecifier=function(_Base36){function ModuleSpecifier(original,alias,moduleDeclarationType1){var _this55;_classCallCheck(this,ModuleSpecifier);var ref1,ref2;if(_this55=_super65.call(this),_this55.original=original,_this55.alias=alias,_this55.moduleDeclarationType=moduleDeclarationType1,_this55.original.comments||(null==(ref1=_this55.alias)?void 0:ref1.comments)){if(_this55.comments=[],_this55.original.comments){var _this55$comments;(_this55$comments=_this55.comments).push.apply(_this55$comments,_toConsumableArray(_this55.original.comments))}if(null==(ref2=_this55.alias)?void 0:ref2.comments){var _this55$comments2;(_this55$comments2=_this55.comments).push.apply(_this55$comments2,_toConsumableArray(_this55.alias.comments))}}return _this55.identifier=null==_this55.alias?_this55.original.value:_this55.alias.value,_this55}_inherits(ModuleSpecifier,_Base36);var _super65=_createSuper(ModuleSpecifier);return _createClass(ModuleSpecifier,[{key:\"compileNode\",value:function compileNode(o){var code;return this.addIdentifierToScope(o),code=[],code.push(this.makeCode(this.original.value)),null!=this.alias&&code.push(this.makeCode(\" as \".concat(this.alias.value))),code}},{key:\"addIdentifierToScope\",value:function addIdentifierToScope(o){return o.scope.find(this.identifier,this.moduleDeclarationType)}},{key:\"astNode\",value:function astNode(o){return this.addIdentifierToScope(o),_get(_getPrototypeOf(ModuleSpecifier.prototype),\"astNode\",this).call(this,o)}}]),ModuleSpecifier}(Base);return ModuleSpecifier.prototype.children=[\"original\",\"alias\"],ModuleSpecifier}.call(this),exports.ImportSpecifier=ImportSpecifier=function(_ModuleSpecifier){function ImportSpecifier(imported,local){return _classCallCheck(this,ImportSpecifier),_super66.call(this,imported,local,\"import\")}_inherits(ImportSpecifier,_ModuleSpecifier);var _super66=_createSuper(ImportSpecifier);return _createClass(ImportSpecifier,[{key:\"addIdentifierToScope\",value:function addIdentifierToScope(o){var ref1;return(ref1=this.identifier,0<=indexOf.call(o.importedSymbols,ref1))||o.scope.check(this.identifier)?this.error(\"'\".concat(this.identifier,\"' has already been declared\")):o.importedSymbols.push(this.identifier),_get(_getPrototypeOf(ImportSpecifier.prototype),\"addIdentifierToScope\",this).call(this,o)}},{key:\"astProperties\",value:function astProperties(o){var originalAst,ref1,ref2;return originalAst=this.original.ast(o),{imported:originalAst,local:null==(ref1=null==(ref2=this.alias)?void 0:ref2.ast(o))?originalAst:ref1,importKind:null}}}]),ImportSpecifier}(ModuleSpecifier),exports.ImportDefaultSpecifier=ImportDefaultSpecifier=function(_ImportSpecifier){function ImportDefaultSpecifier(){return _classCallCheck(this,ImportDefaultSpecifier),_super67.apply(this,arguments)}_inherits(ImportDefaultSpecifier,_ImportSpecifier);var _super67=_createSuper(ImportDefaultSpecifier);return _createClass(ImportDefaultSpecifier,[{key:\"astProperties\",value:function astProperties(o){return{local:this.original.ast(o)}}}]),ImportDefaultSpecifier}(ImportSpecifier),exports.ImportNamespaceSpecifier=ImportNamespaceSpecifier=function(_ImportSpecifier2){function ImportNamespaceSpecifier(){return _classCallCheck(this,ImportNamespaceSpecifier),_super68.apply(this,arguments)}_inherits(ImportNamespaceSpecifier,_ImportSpecifier2);var _super68=_createSuper(ImportNamespaceSpecifier);return _createClass(ImportNamespaceSpecifier,[{key:\"astProperties\",value:function astProperties(o){return{local:this.alias.ast(o)}}}]),ImportNamespaceSpecifier}(ImportSpecifier),exports.ExportSpecifier=ExportSpecifier=function(_ModuleSpecifier2){function ExportSpecifier(local,exported){return _classCallCheck(this,ExportSpecifier),_super69.call(this,local,exported,\"export\")}_inherits(ExportSpecifier,_ModuleSpecifier2);var _super69=_createSuper(ExportSpecifier);return _createClass(ExportSpecifier,[{key:\"astProperties\",value:function astProperties(o){var originalAst,ref1,ref2;return originalAst=this.original.ast(o),{local:originalAst,exported:null==(ref1=null==(ref2=this.alias)?void 0:ref2.ast(o))?originalAst:ref1}}}]),ExportSpecifier}(ModuleSpecifier),exports.DynamicImport=DynamicImport=function(_Base37){function DynamicImport(){return _classCallCheck(this,DynamicImport),_super70.apply(this,arguments)}_inherits(DynamicImport,_Base37);var _super70=_createSuper(DynamicImport);return _createClass(DynamicImport,[{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\"import\")]}},{key:\"astType\",value:function astType(){return\"Import\"}}]),DynamicImport}(Base),exports.DynamicImportCall=DynamicImportCall=function(_Call3){function DynamicImportCall(){return _classCallCheck(this,DynamicImportCall),_super71.apply(this,arguments)}_inherits(DynamicImportCall,_Call3);var _super71=_createSuper(DynamicImportCall);return _createClass(DynamicImportCall,[{key:\"compileNode\",value:function compileNode(o){return this.checkArguments(),_get(_getPrototypeOf(DynamicImportCall.prototype),\"compileNode\",this).call(this,o)}},{key:\"checkArguments\",value:function checkArguments(){var ref1;if(!(1<=(ref1=this.args.length)&&2>=ref1))return this.error(\"import() accepts either one or two arguments\")}},{key:\"astNode\",value:function astNode(o){return this.checkArguments(),_get(_getPrototypeOf(DynamicImportCall.prototype),\"astNode\",this).call(this,o)}}]),DynamicImportCall}(Call),exports.Assign=Assign=function(){var Assign=function(_Base38){function Assign(variable1,value1,context1){var options=3<arguments.length&&void 0!==arguments[3]?arguments[3]:{},_this56;_classCallCheck(this,Assign),_this56=_super72.call(this),_this56.variable=variable1,_this56.value=value1,_this56.context=context1,_this56.param=options.param,_this56.subpattern=options.subpattern,_this56.operatorToken=options.operatorToken,_this56.moduleDeclaration=options.moduleDeclaration;var _options$originalCont=options.originalContext;return _this56.originalContext=void 0===_options$originalCont?_this56.context:_options$originalCont,_this56.propagateLhs(),_this56}_inherits(Assign,_Base38);var _super72=_createSuper(Assign);return _createClass(Assign,[{key:\"isStatement\",value:function isStatement(o){return(null==o?void 0:o.level)===LEVEL_TOP&&null!=this.context&&(this.moduleDeclaration||0<=indexOf.call(this.context,\"?\"))}},{key:\"checkNameAssignability\",value:function checkNameAssignability(o,varBase){if(\"import\"===o.scope.type(varBase.value))return varBase.error(\"'\".concat(varBase.value,\"' is read-only\"))}},{key:\"assigns\",value:function assigns(name){return this[\"object\"===this.context?\"value\":\"variable\"].assigns(name)}},{key:\"unfoldSoak\",value:function unfoldSoak(o){return _unfoldSoak(o,this,\"variable\")}},{key:\"addScopeVariables\",value:function addScopeVariables(o){var _this57=this,_ref46=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},_ref46$allowAssignmen=_ref46.allowAssignmentToExpansion,_ref46$allowAssignmen2=_ref46.allowAssignmentToNontrailingSplat,_ref46$allowAssignmen3=_ref46.allowAssignmentToEmptyArray,_ref46$allowAssignmen4=_ref46.allowAssignmentToComplexSplat,varBase;if(!(this.context&&\"**=\"!==this.context))return varBase=this.variable.unwrapAll(),varBase.isAssignable({allowExpansion:void 0!==_ref46$allowAssignmen&&_ref46$allowAssignmen,allowNontrailingSplat:void 0!==_ref46$allowAssignmen2&&_ref46$allowAssignmen2,allowEmptyArray:void 0!==_ref46$allowAssignmen3&&_ref46$allowAssignmen3,allowComplexSplat:void 0!==_ref46$allowAssignmen4&&_ref46$allowAssignmen4})||this.variable.error(\"'\".concat(this.variable.compile(o),\"' can't be assigned\")),varBase.eachName(function(name){var alreadyDeclared,commentFragments,commentsNode,message;if(\"function\"!=typeof name.hasProperties||!name.hasProperties())return(message=isUnassignable(name.value),message&&name.error(message),_this57.checkNameAssignability(o,name),_this57.moduleDeclaration)?(o.scope.add(name.value,_this57.moduleDeclaration),name.isDeclaration=!0):_this57.param?o.scope.add(name.value,\"alwaysDeclare\"===_this57.param?\"var\":\"param\"):(alreadyDeclared=o.scope.find(name.value),null==name.isDeclaration&&(name.isDeclaration=!alreadyDeclared),name.comments&&!o.scope.comments[name.value]&&!(_this57.value instanceof Class)&&name.comments.every(function(comment){return comment.here&&!comment.multiline}))?(commentsNode=new IdentifierLiteral(name.value),commentsNode.comments=name.comments,commentFragments=[],_this57.compileCommentFragments(o,commentsNode,commentFragments),o.scope.comments[name.value]=commentFragments):void 0})}},{key:\"compileNode\",value:function compileNode(o){var answer,compiledName,isValue,name,properties,prototype,ref1,ref2,ref3,ref4,val;if(isValue=this.variable instanceof Value,isValue){if((this.variable.isArray()||this.variable.isObject())&&!this.variable.isAssignable())return this.variable.isObject()&&this.variable.base.hasSplat()?this.compileObjectDestruct(o):this.compileDestructuring(o);if(this.variable.isSplice())return this.compileSplice(o);if(this.isConditional())return this.compileConditional(o);if(\"//=\"===(ref1=this.context)||\"%%=\"===ref1)return this.compileSpecialMath(o)}if(this.addScopeVariables(o),this.value instanceof Code)if(this.value.isStatic)this.value.name=this.variable.properties[0];else if(2<=(null==(ref2=this.variable.properties)?void 0:ref2.length)){var _ref47,_ref48,_splice$call,_splice$call2;ref3=this.variable.properties,_ref47=ref3,_ref48=_toArray(_ref47),properties=_ref48.slice(0),_ref47,_splice$call=splice.call(properties,-2),_splice$call2=_slicedToArray(_splice$call,2),prototype=_splice$call2[0],name=_splice$call2[1],_splice$call,\"prototype\"===(null==(ref4=prototype.name)?void 0:ref4.value)&&(this.value.name=name)}return(val=this.value.compileToFragments(o,LEVEL_LIST),compiledName=this.variable.compileToFragments(o,LEVEL_LIST),\"object\"===this.context)?(this.variable.shouldCache()&&(compiledName.unshift(this.makeCode(\"[\")),compiledName.push(this.makeCode(\"]\"))),compiledName.concat(this.makeCode(\": \"),val)):(answer=compiledName.concat(this.makeCode(\" \".concat(this.context||\"=\",\" \")),val),o.level>LEVEL_LIST||isValue&&this.variable.base instanceof Obj&&!this.nestedLhs&&!0!==this.param?this.wrapInParentheses(answer):answer)}},{key:\"compileObjectDestruct\",value:function compileObjectDestruct(o){var assigns,props,refVal,splat,splatProp;this.variable.base.reorderProperties(),props=this.variable.base.properties;var _slice1$call15=slice1.call(props,-1),_slice1$call16=_slicedToArray(_slice1$call15,1);return splat=_slice1$call16[0],splatProp=splat.name,assigns=[],refVal=new Value(new IdentifierLiteral(o.scope.freeVariable(\"ref\"))),props.splice(-1,1,new Splat(refVal)),assigns.push(new Assign(new Value(new Obj(props)),this.value).compileToFragments(o,LEVEL_LIST)),assigns.push(new Assign(new Value(splatProp),refVal).compileToFragments(o,LEVEL_LIST)),this.joinFragmentArrays(assigns,\", \")}},{key:\"compileDestructuring\",value:function compileDestructuring(o){var _this58=this,assignObjects,assigns,code,compSlice,compSplice,complexObjects,expIdx,expans,fragments,hasObjAssigns,isExpans,isSplat,leftObjs,loopObjects,obj,objIsUnassignable,objects,olen,processObjects,pushAssign,ref,refExp,restVar,rightObjs,slicer,splatVar,splatVarAssign,splatVarRef,splats,splatsAndExpans,top,value,vvar,vvarText;if(top=o.level===LEVEL_TOP,value=this.value,objects=this.variable.base.objects,olen=objects.length,0===olen)return code=value.compileToFragments(o),o.level>=LEVEL_OP?this.wrapInParentheses(code):code;var _objects=objects,_objects2=_slicedToArray(_objects,1);obj=_objects2[0],this.disallowLoneExpansion();var _this$getAndCheckSpla=this.getAndCheckSplatsAndExpansions();return splats=_this$getAndCheckSpla.splats,expans=_this$getAndCheckSpla.expans,splatsAndExpans=_this$getAndCheckSpla.splatsAndExpans,isSplat=0<(null==splats?void 0:splats.length),isExpans=0<(null==expans?void 0:expans.length),vvar=value.compileToFragments(o,LEVEL_LIST),vvarText=fragmentsToText(vvar),assigns=[],pushAssign=function(variable,val){return assigns.push(new Assign(variable,val,null,{param:_this58.param,subpattern:!0}).compileToFragments(o,LEVEL_LIST))},isSplat&&(splatVar=objects[splats[0]].name.unwrap(),(splatVar instanceof Arr||splatVar instanceof Obj)&&(splatVarRef=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),objects[splats[0]].name=splatVarRef,splatVarAssign=function(){return pushAssign(new Value(splatVar),splatVarRef)})),(!(value.unwrap()instanceof IdentifierLiteral)||this.variable.assigns(vvarText))&&(ref=o.scope.freeVariable(\"ref\"),assigns.push([this.makeCode(ref+\" = \")].concat(_toConsumableArray(vvar))),vvar=[this.makeCode(ref)],vvarText=ref),slicer=function(type){return function(vvar,start){var end=!!(2<arguments.length&&void 0!==arguments[2])&&arguments[2],args,slice;return vvar instanceof Value||(vvar=new IdentifierLiteral(vvar)),args=[vvar,new NumberLiteral(start)],end&&args.push(new NumberLiteral(end)),slice=new Value(new IdentifierLiteral(utility(type,o)),[new Access(new PropertyName(\"call\"))]),new Value(new Call(slice,args))}},compSlice=slicer(\"slice\"),compSplice=slicer(\"splice\"),hasObjAssigns=function(objs){var i,j,len1,results1;for(results1=[],i=j=0,len1=objs.length;j<len1;i=++j)obj=objs[i],obj instanceof Assign&&\"object\"===obj.context&&results1.push(i);return results1},objIsUnassignable=function(objs){var j,len1;for(j=0,len1=objs.length;j<len1;j++)if(obj=objs[j],!obj.isAssignable())return!0;return!1},complexObjects=function(objs){return hasObjAssigns(objs).length||objIsUnassignable(objs)||1===olen},loopObjects=function(objs,vvar,vvarTxt){var acc,i,idx,j,len1,message,results1,vval;for(results1=[],i=j=0,len1=objs.length;j<len1;i=++j)if(obj=objs[i],!(obj instanceof Elision)){if(obj instanceof Assign&&\"object\"===obj.context){var _obj=obj;if(idx=_obj.variable.base,vvar=_obj.value,vvar instanceof Assign){var _vvar=vvar;vvar=_vvar.variable}idx=vvar[\"this\"]?vvar.properties[0].name:new PropertyName(vvar.unwrap().value),acc=idx.unwrap()instanceof PropertyName,vval=new Value(value,[new(acc?Access:Index)(idx)])}else vvar=function(){switch(!1){case!(obj instanceof Splat):return new Value(obj.name);default:return obj;}}(),vval=function(){switch(!1){case!(obj instanceof Splat):return compSlice(vvarTxt,i);default:return new Value(new Literal(vvarTxt),[new Index(new NumberLiteral(i))]);}}();message=isUnassignable(vvar.unwrap().value),message&&vvar.error(message),results1.push(pushAssign(vvar,vval))}return results1},assignObjects=function(objs,vvar,vvarTxt){var vval;return vvar=new Value(new Arr(objs,!0)),vval=vvarTxt instanceof Value?vvarTxt:new Value(new Literal(vvarTxt)),pushAssign(vvar,vval)},processObjects=function(objs,vvar,vvarTxt){return complexObjects(objs)?loopObjects(objs,vvar,vvarTxt):assignObjects(objs,vvar,vvarTxt)},splatsAndExpans.length?(expIdx=splatsAndExpans[0],leftObjs=objects.slice(0,expIdx+(isSplat?1:0)),rightObjs=objects.slice(expIdx+1),0!==leftObjs.length&&processObjects(leftObjs,vvar,vvarText),0!==rightObjs.length&&(refExp=function(){switch(!1){case!isSplat:return compSplice(new Value(objects[expIdx].name),-1*rightObjs.length);case!isExpans:return compSlice(vvarText,-1*rightObjs.length);}}(),complexObjects(rightObjs)&&(restVar=refExp,refExp=o.scope.freeVariable(\"ref\"),assigns.push([this.makeCode(refExp+\" = \")].concat(_toConsumableArray(restVar.compileToFragments(o,LEVEL_LIST))))),processObjects(rightObjs,vvar,refExp))):processObjects(objects,vvar,vvarText),\"function\"==typeof splatVarAssign&&splatVarAssign(),top||this.subpattern||assigns.push(vvar),fragments=this.joinFragmentArrays(assigns,\", \"),o.level<LEVEL_LIST?fragments:this.wrapInParentheses(fragments)}},{key:\"disallowLoneExpansion\",value:function disallowLoneExpansion(){var loneObject,objects;if(this.variable.base instanceof Arr&&(objects=this.variable.base.objects,1===(null==objects?void 0:objects.length))){var _objects3=objects,_objects4=_slicedToArray(_objects3,1);if(loneObject=_objects4[0],loneObject instanceof Expansion)return loneObject.error(\"Destructuring assignment has no target\")}}},{key:\"getAndCheckSplatsAndExpansions\",value:function getAndCheckSplatsAndExpansions(){var expans,i,obj,objects,splats,splatsAndExpans;return this.variable.base instanceof Arr?(objects=this.variable.base.objects,splats=function(){var j,len1,results1;for(results1=[],i=j=0,len1=objects.length;j<len1;i=++j)obj=objects[i],obj instanceof Splat&&results1.push(i);return results1}(),expans=function(){var j,len1,results1;for(results1=[],i=j=0,len1=objects.length;j<len1;i=++j)obj=objects[i],obj instanceof Expansion&&results1.push(i);return results1}(),splatsAndExpans=[].concat(_toConsumableArray(splats),_toConsumableArray(expans)),1<splatsAndExpans.length&&objects[splatsAndExpans.sort()[1]].error(\"multiple splats/expansions are disallowed in an assignment\"),{splats:splats,expans:expans,splatsAndExpans:splatsAndExpans}):{splats:[],expans:[],splatsAndExpans:[]}}},{key:\"compileConditional\",value:function compileConditional(o){var _this$variable$cacheR=this.variable.cacheReference(o),_this$variable$cacheR2=_slicedToArray(_this$variable$cacheR,2),fragments,left,right;return left=_this$variable$cacheR2[0],right=_this$variable$cacheR2[1],left.properties.length||!(left.base instanceof Literal)||left.base instanceof ThisLiteral||o.scope.check(left.base.value)||this.throwUnassignableConditionalError(left.base.value),0<=indexOf.call(this.context,\"?\")?(o.isExistentialEquals=!0,new If(new Existence(left),right,{type:\"if\"}).addElse(new Assign(right,this.value,\"=\")).compileToFragments(o)):(fragments=new Op(this.context.slice(0,-1),left,new Assign(right,this.value,\"=\")).compileToFragments(o),o.level<=LEVEL_LIST?fragments:this.wrapInParentheses(fragments))}},{key:\"compileSpecialMath\",value:function compileSpecialMath(o){var _this$variable$cacheR3=this.variable.cacheReference(o),_this$variable$cacheR4=_slicedToArray(_this$variable$cacheR3,2),left,right;return left=_this$variable$cacheR4[0],right=_this$variable$cacheR4[1],new Assign(left,new Op(this.context.slice(0,-1),right,this.value)).compileToFragments(o)}},{key:\"compileSplice\",value:function compileSplice(o){var _this$variable$proper=this.variable.properties.pop(),_this$variable$proper2=_this$variable$proper.range,answer,exclusive,from,fromDecl,fromRef,name,to,unwrappedVar,valDef,valRef;if(from=_this$variable$proper2.from,to=_this$variable$proper2.to,exclusive=_this$variable$proper2.exclusive,unwrappedVar=this.variable.unwrapAll(),unwrappedVar.comments&&(moveComments(unwrappedVar,this),delete this.variable.comments),name=this.variable.compile(o),from){var _this$cacheToCodeFrag7=this.cacheToCodeFragments(from.cache(o,LEVEL_OP)),_this$cacheToCodeFrag8=_slicedToArray(_this$cacheToCodeFrag7,2);fromDecl=_this$cacheToCodeFrag8[0],fromRef=_this$cacheToCodeFrag8[1]}else fromDecl=fromRef=\"0\";to?(null==from?void 0:from.isNumber())&&to.isNumber()?(to=to.compile(o)-fromRef,!exclusive&&(to+=1)):(to=to.compile(o,LEVEL_ACCESS)+\" - \"+fromRef,!exclusive&&(to+=\" + 1\")):to=\"9e9\";var _this$value$cache=this.value.cache(o,LEVEL_LIST),_this$value$cache2=_slicedToArray(_this$value$cache,2);return valDef=_this$value$cache2[0],valRef=_this$value$cache2[1],answer=[].concat(this.makeCode(\"\".concat(utility(\"splice\",o),\".apply(\").concat(name,\", [\").concat(fromDecl,\", \").concat(to,\"].concat(\")),valDef,this.makeCode(\")), \"),valRef),o.level>LEVEL_TOP?this.wrapInParentheses(answer):answer}},{key:\"eachName\",value:function eachName(iterator){return this.variable.unwrapAll().eachName(iterator)}},{key:\"isDefaultAssignment\",value:function isDefaultAssignment(){return this.param||this.nestedLhs}},{key:\"propagateLhs\",value:function propagateLhs(){var ref1,ref2;return(null==(ref1=this.variable)?void 0:\"function\"==typeof ref1.isArray?ref1.isArray():void 0)||(null==(ref2=this.variable)?void 0:\"function\"==typeof ref2.isObject?ref2.isObject():void 0)?this.variable.base.propagateLhs(!0):void 0}},{key:\"throwUnassignableConditionalError\",value:function throwUnassignableConditionalError(name){return this.variable.error(\"the variable \\\"\".concat(name,\"\\\" can't be assigned with \").concat(this.context,\" because it has not been declared before\"))}},{key:\"isConditional\",value:function isConditional(){var ref1;return\"||=\"===(ref1=this.context)||\"&&=\"===ref1||\"?=\"===ref1}},{key:\"astNode\",value:function astNode(o){var variable;return this.disallowLoneExpansion(),this.getAndCheckSplatsAndExpansions(),this.isConditional()&&(variable=this.variable.unwrap(),variable instanceof IdentifierLiteral&&!o.scope.check(variable.value)&&this.throwUnassignableConditionalError(variable.value)),this.addScopeVariables(o,{allowAssignmentToExpansion:!0,allowAssignmentToNontrailingSplat:!0,allowAssignmentToEmptyArray:!0,allowAssignmentToComplexSplat:!0}),_get(_getPrototypeOf(Assign.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isDefaultAssignment()?\"AssignmentPattern\":\"AssignmentExpression\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ret;return ret={right:this.value.ast(o,LEVEL_LIST),left:this.variable.ast(o,LEVEL_LIST)},this.isDefaultAssignment()||(ret.operator=null==(ref1=this.originalContext)?\"=\":ref1),ret}}]),Assign}(Base);return Assign.prototype.children=[\"variable\",\"value\"],Assign.prototype.isAssignable=YES,Assign.prototype.isStatementAst=NO,Assign}.call(this),exports.FuncGlyph=FuncGlyph=function(_Base39){function FuncGlyph(glyph){var _this59;return _classCallCheck(this,FuncGlyph),_this59=_super73.call(this),_this59.glyph=glyph,_this59}_inherits(FuncGlyph,_Base39);var _super73=_createSuper(FuncGlyph);return _createClass(FuncGlyph)}(Base),exports.Code=Code=function(){var Code=function(_Base40){function Code(params,body,funcGlyph,paramStart){var _this60;_classCallCheck(this,Code);var ref1;return _this60=_super74.call(this),_this60.funcGlyph=funcGlyph,_this60.paramStart=paramStart,_this60.params=params||[],_this60.body=body||new Block,_this60.bound=\"=>\"===(null==(ref1=_this60.funcGlyph)?void 0:ref1.glyph),_this60.isGenerator=!1,_this60.isAsync=!1,_this60.isMethod=!1,_this60.body.traverseChildren(!1,function(node){if((node instanceof Op&&node.isYield()||node instanceof YieldReturn)&&(_this60.isGenerator=!0),(node instanceof Op&&node.isAwait()||node instanceof AwaitReturn)&&(_this60.isAsync=!0),node instanceof For&&node.isAwait())return _this60.isAsync=!0}),_this60.propagateLhs(),_this60}_inherits(Code,_Base40);var _super74=_createSuper(Code);return _createClass(Code,[{key:\"isStatement\",value:function isStatement(){return this.isMethod}},{key:\"makeScope\",value:function makeScope(parentScope){return new Scope(parentScope,this.body,this)}},{key:\"compileNode\",value:function compileNode(o){var _this$body$expression3,_answer4,answer,body,boundMethodCheck,comment,condition,exprs,generatedVariables,haveBodyParam,haveSplatParam,i,ifTrue,j,k,l,len1,len2,len3,m,methodScope,modifiers,name,param,paramToAddToScope,params,paramsAfterSplat,ref,ref1,ref2,ref3,ref4,ref5,ref6,ref7,ref8,scopeVariablesCount,signature,splatParamName,thisAssignments,wasEmpty,yieldNode;for(this.checkForAsyncOrGeneratorConstructor(),this.bound&&((null==(ref1=o.scope.method)?void 0:ref1.bound)&&(this.context=o.scope.method.context),!this.context&&(this.context=\"this\")),this.updateOptions(o),params=[],exprs=[],thisAssignments=null==(ref2=null==(ref3=this.thisAssignments)?void 0:ref3.slice())?[]:ref2,paramsAfterSplat=[],haveSplatParam=!1,haveBodyParam=!1,this.checkForDuplicateParams(),this.disallowLoneExpansionAndMultipleSplats(),this.eachParamName(function(name,node,param,obj){var replacement,target;if(node[\"this\"])return name=node.properties[0].name.value,0<=indexOf.call(JS_FORBIDDEN,name)&&(name=\"_\".concat(name)),target=new IdentifierLiteral(o.scope.freeVariable(name,{reserve:!1})),replacement=param.name instanceof Obj&&obj instanceof Assign&&\"=\"===obj.operatorToken.value?new Assign(new IdentifierLiteral(name),target,\"object\"):target,param.renameParam(node,replacement),thisAssignments.push(new Assign(node,target))}),ref4=this.params,(i=j=0,len1=ref4.length);j<len1;i=++j)param=ref4[i],param.splat||param instanceof Expansion?(haveSplatParam=!0,param.splat?(param.name instanceof Arr||param.name instanceof Obj?(splatParamName=o.scope.freeVariable(\"arg\"),params.push(ref=new Value(new IdentifierLiteral(splatParamName))),exprs.push(new Assign(new Value(param.name),ref))):(params.push(ref=param.asReference(o)),splatParamName=fragmentsToText(ref.compileNodeWithoutComments(o))),param.shouldCache()&&exprs.push(new Assign(new Value(param.name),ref))):(splatParamName=o.scope.freeVariable(\"args\"),params.push(new Value(new IdentifierLiteral(splatParamName)))),o.scope.parameter(splatParamName)):((param.shouldCache()||haveBodyParam)&&(param.assignedInBody=!0,haveBodyParam=!0,null==param.value?exprs.push(new Assign(new Value(param.name),param.asReference(o),null,{param:\"alwaysDeclare\"})):(condition=new Op(\"===\",param,new UndefinedLiteral()),ifTrue=new Assign(new Value(param.name),param.value),exprs.push(new If(condition,ifTrue)))),haveSplatParam?(paramsAfterSplat.push(param),null!=param.value&&!param.shouldCache()&&(condition=new Op(\"===\",param,new UndefinedLiteral()),ifTrue=new Assign(new Value(param.name),param.value),exprs.push(new If(condition,ifTrue))),null!=(null==(ref5=param.name)?void 0:ref5.value)&&o.scope.add(param.name.value,\"var\",!0)):(ref=param.shouldCache()?param.asReference(o):null==param.value||param.assignedInBody?param:new Assign(new Value(param.name),param.value,null,{param:!0}),param.name instanceof Arr||param.name instanceof Obj?(param.name.lhs=!0,!param.shouldCache()&&param.name.eachName(function(prop){return o.scope.parameter(prop.value)})):(paramToAddToScope=null==param.value?ref:param,o.scope.parameter(fragmentsToText(paramToAddToScope.compileToFragmentsWithoutComments(o)))),params.push(ref)));if(0!==paramsAfterSplat.length&&exprs.unshift(new Assign(new Value(new Arr([new Splat(new IdentifierLiteral(splatParamName))].concat(_toConsumableArray(function(){var k,len2,results1;for(results1=[],k=0,len2=paramsAfterSplat.length;k<len2;k++)param=paramsAfterSplat[k],results1.push(param.asReference(o));return results1}())))),new Value(new IdentifierLiteral(splatParamName)))),wasEmpty=this.body.isEmpty(),this.disallowSuperInParamDefaults(),this.checkSuperCallsInConstructorBody(),!this.expandCtorSuper(thisAssignments)){var _this$body$expression2;(_this$body$expression2=this.body.expressions).unshift.apply(_this$body$expression2,_toConsumableArray(thisAssignments))}for((_this$body$expression3=this.body.expressions).unshift.apply(_this$body$expression3,_toConsumableArray(exprs)),this.isMethod&&this.bound&&!this.isStatic&&this.classVariable&&(boundMethodCheck=new Value(new Literal(utility(\"boundMethodCheck\",o))),this.body.expressions.unshift(new Call(boundMethodCheck,[new Value(new ThisLiteral()),this.classVariable]))),wasEmpty||this.noReturn||this.body.makeReturn(),this.bound&&this.isGenerator&&(yieldNode=this.body.contains(function(node){return node instanceof Op&&\"yield\"===node.operator}),(yieldNode||this).error(\"yield cannot occur inside bound (fat arrow) functions\")),modifiers=[],this.isMethod&&this.isStatic&&modifiers.push(\"static\"),this.isAsync&&modifiers.push(\"async\"),this.isMethod||this.bound?this.isGenerator&&modifiers.push(\"*\"):modifiers.push(\"function\".concat(this.isGenerator?\"*\":\"\")),signature=[this.makeCode(\"(\")],null!=(null==(ref6=this.paramStart)?void 0:ref6.comments)&&this.compileCommentFragments(o,this.paramStart,signature),(i=k=0,len2=params.length);k<len2;i=++k){var _signature;if(param=params[i],0!==i&&signature.push(this.makeCode(\", \")),haveSplatParam&&i===params.length-1&&signature.push(this.makeCode(\"...\")),scopeVariablesCount=o.scope.variables.length,(_signature=signature).push.apply(_signature,_toConsumableArray(param.compileToFragments(o,LEVEL_PAREN))),scopeVariablesCount!==o.scope.variables.length){var _o$scope$parent$varia;generatedVariables=o.scope.variables.splice(scopeVariablesCount),(_o$scope$parent$varia=o.scope.parent.variables).push.apply(_o$scope$parent$varia,_toConsumableArray(generatedVariables))}}if(signature.push(this.makeCode(\")\")),null!=(null==(ref7=this.funcGlyph)?void 0:ref7.comments)){for(ref8=this.funcGlyph.comments,l=0,len3=ref8.length;l<len3;l++)comment=ref8[l],comment.unshift=!1;this.compileCommentFragments(o,this.funcGlyph,signature)}if(this.body.isEmpty()||(body=this.body.compileWithDeclarations(o)),this.isMethod){var _ref49=[o.scope,o.scope.parent];methodScope=_ref49[0],o.scope=_ref49[1],name=this.name.compileToFragments(o),\".\"===name[0].code&&name.shift(),o.scope=methodScope}if(answer=this.joinFragmentArrays(function(){var len4,p,results1;for(results1=[],p=0,len4=modifiers.length;p<len4;p++)m=modifiers[p],results1.push(this.makeCode(m));return results1}.call(this),\" \"),modifiers.length&&name&&answer.push(this.makeCode(\" \")),name){var _answer3;(_answer3=answer).push.apply(_answer3,_toConsumableArray(name))}if((_answer4=answer).push.apply(_answer4,_toConsumableArray(signature)),this.bound&&!this.isMethod&&answer.push(this.makeCode(\" =>\")),answer.push(this.makeCode(\" {\")),null==body?void 0:body.length){var _answer5;(_answer5=answer).push.apply(_answer5,[this.makeCode(\"\\n\")].concat(_toConsumableArray(body),[this.makeCode(\"\\n\".concat(this.tab))]))}return answer.push(this.makeCode(\"}\")),this.isMethod?indentInitial(answer,this):this.front||o.level>=LEVEL_ACCESS?this.wrapInParentheses(answer):answer}},{key:\"updateOptions\",value:function updateOptions(o){return o.scope=del(o,\"classScope\")||this.makeScope(o.scope),o.scope.shared=del(o,\"sharedScope\"),o.indent+=TAB,delete o.bare,delete o.isExistentialEquals}},{key:\"checkForDuplicateParams\",value:function checkForDuplicateParams(){var paramNames;return paramNames=[],this.eachParamName(function(name,node){return 0<=indexOf.call(paramNames,name)&&node.error(\"multiple parameters named '\".concat(name,\"'\")),paramNames.push(name)})}},{key:\"eachParamName\",value:function eachParamName(iterator){var j,len1,param,ref1,results1;for(ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],results1.push(param.eachName(iterator));return results1}},{key:\"traverseChildren\",value:function traverseChildren(crossScope,func){if(crossScope)return _get(_getPrototypeOf(Code.prototype),\"traverseChildren\",this).call(this,crossScope,func)}},{key:\"replaceInContext\",value:function replaceInContext(child,replacement){return!!this.bound&&_get(_getPrototypeOf(Code.prototype),\"replaceInContext\",this).call(this,child,replacement)}},{key:\"disallowSuperInParamDefaults\",value:function disallowSuperInParamDefaults(){var _ref50=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},forAst=_ref50.forAst;return!!this.ctor&&this.eachSuperCall(Block.wrap(this.params),function(superCall){return superCall.error(\"'super' is not allowed in constructor parameter defaults\")},{checkForThisBeforeSuper:!forAst})}},{key:\"checkSuperCallsInConstructorBody\",value:function checkSuperCallsInConstructorBody(){var _this61=this,seenSuper;return!!this.ctor&&(seenSuper=this.eachSuperCall(this.body,function(superCall){if(\"base\"===_this61.ctor)return superCall.error(\"'super' is only allowed in derived class constructors\")}),seenSuper)}},{key:\"flagThisParamInDerivedClassConstructorWithoutCallingSuper\",value:function flagThisParamInDerivedClassConstructorWithoutCallingSuper(param){return param.error(\"Can't use @params in derived class constructors without calling super\")}},{key:\"checkForAsyncOrGeneratorConstructor\",value:function checkForAsyncOrGeneratorConstructor(){if(this.ctor&&(this.isAsync&&this.name.error(\"Class constructor may not be async\"),this.isGenerator))return this.name.error(\"Class constructor may not be a generator\")}},{key:\"disallowLoneExpansionAndMultipleSplats\",value:function disallowLoneExpansionAndMultipleSplats(){var j,len1,param,ref1,results1,seenSplatParam;for(seenSplatParam=!1,ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],param.splat||param instanceof Expansion?(seenSplatParam?param.error(\"only one splat or expansion parameter is allowed per function definition\"):param instanceof Expansion&&1===this.params.length&&param.error(\"an expansion parameter cannot be the only parameter in a function definition\"),results1.push(seenSplatParam=!0)):results1.push(void 0);return results1}},{key:\"expandCtorSuper\",value:function expandCtorSuper(thisAssignments){var haveThisParam,param,ref1,seenSuper;return!!this.ctor&&(seenSuper=this.eachSuperCall(this.body,function(superCall){return superCall.expressions=thisAssignments}),haveThisParam=thisAssignments.length&&thisAssignments.length!==(null==(ref1=this.thisAssignments)?void 0:ref1.length),\"derived\"===this.ctor&&!seenSuper&&haveThisParam&&(param=thisAssignments[0].variable,this.flagThisParamInDerivedClassConstructorWithoutCallingSuper(param)),seenSuper)}},{key:\"eachSuperCall\",value:function eachSuperCall(context,iterator){var _this62=this,_ref51=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_ref51$checkForThisBe=_ref51.checkForThisBeforeSuper,seenSuper;return seenSuper=!1,context.traverseChildren(!0,function(child){var childArgs;return child instanceof SuperCall?(!child.variable.accessor&&(childArgs=child.args.filter(function(arg){return!(arg instanceof Class)&&(!(arg instanceof Code)||arg.bound)}),Block.wrap(childArgs).traverseChildren(!0,function(node){if(node[\"this\"])return node.error(\"Can't call super with @params in derived class constructors\")})),seenSuper=!0,iterator(child)):(void 0===_ref51$checkForThisBe||_ref51$checkForThisBe)&&child instanceof ThisLiteral&&\"derived\"===_this62.ctor&&!seenSuper&&child.error(\"Can't reference 'this' before calling super in derived class constructors\"),!(child instanceof SuperCall)&&(!(child instanceof Code)||child.bound)}),seenSuper}},{key:\"propagateLhs\",value:function propagateLhs(){var j,len1,name,param,ref1,results1;for(ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++){param=ref1[j];var _param=param;name=_param.name,name instanceof Arr||name instanceof Obj?results1.push(name.propagateLhs(!0)):param instanceof Expansion?results1.push(param.lhs=!0):results1.push(void 0)}return results1}},{key:\"astAddParamsToScope\",value:function astAddParamsToScope(o){return this.eachParamName(function(name){return o.scope.add(name,\"param\")})}},{key:\"astNode\",value:function astNode(o){var _this63=this,seenSuper;return this.updateOptions(o),this.checkForAsyncOrGeneratorConstructor(),this.checkForDuplicateParams(),this.disallowSuperInParamDefaults({forAst:!0}),this.disallowLoneExpansionAndMultipleSplats(),seenSuper=this.checkSuperCallsInConstructorBody(),\"derived\"!==this.ctor||seenSuper||this.eachParamName(function(name,node){if(node[\"this\"])return _this63.flagThisParamInDerivedClassConstructorWithoutCallingSuper(node)}),this.astAddParamsToScope(o),this.body.isEmpty()||this.noReturn||this.body.makeReturn(null,!0),_get(_getPrototypeOf(Code.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return this.isMethod?\"ClassMethod\":this.bound?\"ArrowFunctionExpression\":\"FunctionExpression\"}},{key:\"paramForAst\",value:function paramForAst(param){var name,splat,value;return param instanceof Expansion?param:(name=param.name,value=param.value,splat=param.splat,splat?new Splat(name,{lhs:!0,postfix:splat.postfix}).withLocationDataFrom(param):null==value?name:new Assign(name,value,null,{param:!0}).withLocationDataFrom({locationData:mergeLocationData(name.locationData,value.locationData)}))}},{key:\"methodAstProperties\",value:function methodAstProperties(o){var _this64=this,getIsComputed,ref1,ref2,ref3,ref4;return getIsComputed=function(){return!!(_this64.name instanceof Index)||!!(_this64.name instanceof ComputedPropertyName)||!!(_this64.name.name instanceof ComputedPropertyName)},{static:!!this.isStatic,key:this.name.ast(o),computed:getIsComputed(),kind:this.ctor?\"constructor\":\"method\",operator:null==(ref1=null==(ref2=this.operatorToken)?void 0:ref2.value)?\"=\":ref1,staticClassName:null==(ref3=null==(ref4=this.isStatic.staticClassName)?void 0:ref4.ast(o))?null:ref3,bound:!!this.bound}}},{key:\"astProperties\",value:function astProperties(o){var param,ref1;return Object.assign({params:function(){var j,len1,ref1,results1;for(ref1=this.params,results1=[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],results1.push(this.paramForAst(param).ast(o));return results1}.call(this),body:this.body.ast(Object.assign({},o,{checkForDirectives:!0}),LEVEL_TOP),generator:!!this.isGenerator,async:!!this.isAsync,id:null,hasIndentedBody:this.body.locationData.first_line>(null==(ref1=this.funcGlyph)?void 0:ref1.locationData.first_line)},this.isMethod?this.methodAstProperties(o):{})}},{key:\"astLocationData\",value:function(){var astLocationData,functionLocationData;return(functionLocationData=_get(_getPrototypeOf(Code.prototype),\"astLocationData\",this).call(this),!this.isMethod)?functionLocationData:(astLocationData=mergeAstLocationData(this.name.astLocationData(),functionLocationData),null!=this.isStatic.staticClassName&&(astLocationData=mergeAstLocationData(this.isStatic.staticClassName.astLocationData(),astLocationData)),astLocationData)}}]),Code}(Base);return Code.prototype.children=[\"params\",\"body\"],Code.prototype.jumps=NO,Code}.call(this),exports.Param=Param=function(){var Param=function(_Base41){function Param(name1,value1,splat1){var _this65;_classCallCheck(this,Param);var message,token;return _this65=_super75.call(this),_this65.name=name1,_this65.value=value1,_this65.splat=splat1,message=isUnassignable(_this65.name.unwrapAll().value),message&&_this65.name.error(message),_this65.name instanceof Obj&&_this65.name.generated&&(token=_this65.name.objects[0].operatorToken,token.error(\"unexpected \".concat(token.value))),_this65}_inherits(Param,_Base41);var _super75=_createSuper(Param);return _createClass(Param,[{key:\"compileToFragments\",value:function compileToFragments(o){return this.name.compileToFragments(o,LEVEL_LIST)}},{key:\"compileToFragmentsWithoutComments\",value:function compileToFragmentsWithoutComments(o){return this.name.compileToFragmentsWithoutComments(o,LEVEL_LIST)}},{key:\"asReference\",value:function asReference(o){var name,node;return this.reference?this.reference:(node=this.name,node[\"this\"]?(name=node.properties[0].name.value,0<=indexOf.call(JS_FORBIDDEN,name)&&(name=\"_\".concat(name)),node=new IdentifierLiteral(o.scope.freeVariable(name))):node.shouldCache()&&(node=new IdentifierLiteral(o.scope.freeVariable(\"arg\"))),node=new Value(node),node.updateLocationDataIfMissing(this.locationData),this.reference=node)}},{key:\"shouldCache\",value:function shouldCache(){return this.name.shouldCache()}},{key:\"eachName\",value:function eachName(iterator){var _this66=this,name=1<arguments.length&&void 0!==arguments[1]?arguments[1]:this.name,atParam,checkAssignabilityOfLiteral,j,len1,nObj,node,obj,ref1,ref2;if(checkAssignabilityOfLiteral=function(literal){var message;if(message=isUnassignable(literal.value),message&&literal.error(message),!literal.isAssignable())return literal.error(\"'\".concat(literal.value,\"' can't be assigned\"))},atParam=function(obj){var originalObj=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null;return iterator(\"@\".concat(obj.properties[0].name.value),obj,_this66,originalObj)},name instanceof Call&&name.error(\"Function invocation can't be assigned\"),name instanceof Literal)return checkAssignabilityOfLiteral(name),iterator(name.value,name,this);if(name instanceof Value)return atParam(name);for(ref2=null==(ref1=name.objects)?[]:ref1,j=0,len1=ref2.length;j<len1;j++)obj=ref2[j],nObj=obj,obj instanceof Assign&&null==obj.context&&(obj=obj.variable),obj instanceof Assign?(obj=obj.value instanceof Assign?obj.value.variable:obj.value,this.eachName(iterator,obj.unwrap())):obj instanceof Splat?(node=obj.name.unwrap(),iterator(node.value,node,this)):obj instanceof Value?obj.isArray()||obj.isObject()?this.eachName(iterator,obj.base):obj[\"this\"]?atParam(obj,nObj):(checkAssignabilityOfLiteral(obj.base),iterator(obj.base.value,obj.base,this)):obj instanceof Elision?obj:!(obj instanceof Expansion)&&obj.error(\"illegal parameter \".concat(obj.compile()))}},{key:\"renameParam\",value:function renameParam(node,newNode){var isNode,replacement;return isNode=function(candidate){return candidate===node},replacement=function(node,parent){var key;return parent instanceof Obj?(key=node,node[\"this\"]&&(key=node.properties[0].name),node[\"this\"]&&key.value===newNode.value?new Value(newNode):new Assign(new Value(key),newNode,\"object\")):newNode},this.replaceInContext(isNode,replacement)}}]),Param}(Base);return Param.prototype.children=[\"name\",\"value\"],Param}.call(this),exports.Splat=Splat=function(){var Splat=function(_Base42){function Splat(name){var _ref52=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},lhs1=_ref52.lhs,_ref52$postfix=_ref52.postfix,_this67;return _classCallCheck(this,Splat),_this67=_super76.call(this),_this67.lhs=lhs1,_this67.postfix=void 0===_ref52$postfix||_ref52$postfix,_this67.name=name.compile?name:new Literal(name),_this67}_inherits(Splat,_Base42);var _super76=_createSuper(Splat);return _createClass(Splat,[{key:\"shouldCache\",value:function shouldCache(){return!1}},{key:\"isAssignable\",value:function isAssignable(){var _ref53=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},_ref53$allowComplexSp=_ref53.allowComplexSplat;return this.name instanceof Obj||this.name instanceof Parens?void 0!==_ref53$allowComplexSp&&_ref53$allowComplexSp:this.name.isAssignable()&&(!this.name.isAtomic||this.name.isAtomic())}},{key:\"assigns\",value:function assigns(name){return this.name.assigns(name)}},{key:\"compileNode\",value:function compileNode(o){var compiledSplat;return compiledSplat=[this.makeCode(\"...\")].concat(_toConsumableArray(this.name.compileToFragments(o,LEVEL_OP))),this.jsx?[this.makeCode(\"{\")].concat(_toConsumableArray(compiledSplat),[this.makeCode(\"}\")]):compiledSplat}},{key:\"unwrap\",value:function unwrap(){return this.name}},{key:\"propagateLhs\",value:function propagateLhs(setLhs){var base1;return setLhs&&(this.lhs=!0),this.lhs?\"function\"==typeof(base1=this.name).propagateLhs?base1.propagateLhs(!0):void 0:void 0}},{key:\"astType\",value:function astType(){return this.jsx?\"JSXSpreadAttribute\":this.lhs?\"RestElement\":\"SpreadElement\"}},{key:\"astProperties\",value:function astProperties(o){return{argument:this.name.ast(o,LEVEL_OP),postfix:this.postfix}}}]),Splat}(Base);return Splat.prototype.children=[\"name\"],Splat}.call(this),exports.Expansion=Expansion=function(){var Expansion=function(_Base43){function Expansion(){return _classCallCheck(this,Expansion),_super77.apply(this,arguments)}_inherits(Expansion,_Base43);var _super77=_createSuper(Expansion);return _createClass(Expansion,[{key:\"compileNode\",value:function compileNode(){return this.throwLhsError()}},{key:\"asReference\",value:function asReference(){return this}},{key:\"eachName\",value:function eachName(){}},{key:\"throwLhsError\",value:function throwLhsError(){return this.error(\"Expansion must be used inside a destructuring assignment or parameter list\")}},{key:\"astNode\",value:function astNode(o){return this.lhs||this.throwLhsError(),_get(_getPrototypeOf(Expansion.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"RestElement\"}},{key:\"astProperties\",value:function astProperties(){return{argument:null}}}]),Expansion}(Base);return Expansion.prototype.shouldCache=NO,Expansion}.call(this),exports.Elision=Elision=function(){var Elision=function(_Base44){function Elision(){return _classCallCheck(this,Elision),_super78.apply(this,arguments)}_inherits(Elision,_Base44);var _super78=_createSuper(Elision);return _createClass(Elision,[{key:\"compileToFragments\",value:function compileToFragments(o,level){var fragment;return fragment=_get(_getPrototypeOf(Elision.prototype),\"compileToFragments\",this).call(this,o,level),fragment.isElision=!0,fragment}},{key:\"compileNode\",value:function compileNode(){return[this.makeCode(\", \")]}},{key:\"asReference\",value:function asReference(){return this}},{key:\"eachName\",value:function eachName(){}},{key:\"astNode\",value:function astNode(){return null}}]),Elision}(Base);return Elision.prototype.isAssignable=YES,Elision.prototype.shouldCache=NO,Elision}.call(this),exports.While=While=function(){var While=function(_Base45){function While(condition1){var _ref54=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},inverted=_ref54.invert,guard=_ref54.guard,isLoop=_ref54.isLoop,_this68;return _classCallCheck(this,While),_this68=_super79.call(this),_this68.condition=condition1,_this68.inverted=inverted,_this68.guard=guard,_this68.isLoop=isLoop,_this68}_inherits(While,_Base45);var _super79=_createSuper(While);return _createClass(While,[{key:\"makeReturn\",value:function makeReturn(results,mark){return results?_get(_getPrototypeOf(While.prototype),\"makeReturn\",this).call(this,results,mark):(this.returns=!this.jumps(),mark?void(this.returns&&this.body.makeReturn(results,mark)):this)}},{key:\"addBody\",value:function addBody(body1){return this.body=body1,this}},{key:\"jumps\",value:function jumps(){var expressions,j,jumpNode,len1,node;if(expressions=this.body.expressions,!expressions.length)return!1;for(j=0,len1=expressions.length;j<len1;j++)if(node=expressions[j],jumpNode=node.jumps({loop:!0}))return jumpNode;return!1}},{key:\"compileNode\",value:function compileNode(o){var answer,body,rvar,set;return o.indent+=TAB,set=\"\",body=this.body,body.isEmpty()?body=this.makeCode(\"\"):(this.returns&&(body.makeReturn(rvar=o.scope.freeVariable(\"results\")),set=\"\".concat(this.tab).concat(rvar,\" = [];\\n\")),this.guard&&(1<body.expressions.length?body.expressions.unshift(new If(new Parens(this.guard).invert(),new StatementLiteral(\"continue\"))):this.guard&&(body=Block.wrap([new If(this.guard,body)]))),body=[].concat(this.makeCode(\"\\n\"),body.compileToFragments(o,LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab)))),answer=[].concat(this.makeCode(set+this.tab+\"while (\"),this.processedCondition().compileToFragments(o,LEVEL_PAREN),this.makeCode(\") {\"),body,this.makeCode(\"}\")),this.returns&&answer.push(this.makeCode(\"\\n\".concat(this.tab,\"return \").concat(rvar,\";\"))),answer}},{key:\"processedCondition\",value:function processedCondition(){return null==this.processedConditionCache?this.processedConditionCache=this.inverted?this.condition.invert():this.condition:this.processedConditionCache}},{key:\"astType\",value:function astType(){return\"WhileStatement\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{test:this.condition.ast(o,LEVEL_PAREN),body:this.body.ast(o,LEVEL_TOP),guard:null==(ref1=null==(ref2=this.guard)?void 0:ref2.ast(o))?null:ref1,inverted:!!this.inverted,postfix:!!this.postfix,loop:!!this.isLoop}}}]),While}(Base);return While.prototype.children=[\"condition\",\"guard\",\"body\"],While.prototype.isStatement=YES,While}.call(this),exports.Op=Op=function(){var Op=function(_Base46){function Op(op,first,second,flip){var _ref55=4<arguments.length&&void 0!==arguments[4]?arguments[4]:{},invertOperator=_ref55.invertOperator,_ref55$originalOperat=_ref55.originalOperator,originalOperator=void 0===_ref55$originalOperat?op:_ref55$originalOperat,_this69;_classCallCheck(this,Op);var call,firstCall,message,ref1,unwrapped;return(_this69=_super80.call(this),_this69.invertOperator=invertOperator,_this69.originalOperator=originalOperator,\"new\"===op)?((firstCall=unwrapped=first.unwrap())instanceof Call||(firstCall=unwrapped.base)instanceof Call)&&!firstCall[\"do\"]&&!firstCall.isNew?_possibleConstructorReturn(_this69,new Value(firstCall.newInstance(),firstCall===unwrapped?[]:unwrapped.properties)):(first instanceof Parens||first.unwrap()instanceof IdentifierLiteral||(\"function\"==typeof first.hasProperties?first.hasProperties():void 0)||(first=new Parens(first)),call=new Call(first,[]),call.locationData=_this69.locationData,call.isNew=!0,_possibleConstructorReturn(_this69,call)):(_this69.operator=CONVERSIONS[op]||op,_this69.first=first,_this69.second=second,_this69.flip=!!flip,(\"--\"===(ref1=_this69.operator)||\"++\"===ref1)&&(message=isUnassignable(_this69.first.unwrapAll().value),message&&_this69.first.error(message)),_possibleConstructorReturn(_this69,_assertThisInitialized(_this69)))}_inherits(Op,_Base46);var _super80=_createSuper(Op);return _createClass(Op,[{key:\"isNumber\",value:function(){var ref1;return this.isUnary()&&(\"+\"===(ref1=this.operator)||\"-\"===ref1)&&this.first instanceof Value&&this.first.isNumber()}},{key:\"isAwait\",value:function isAwait(){return\"await\"===this.operator}},{key:\"isYield\",value:function isYield(){var ref1;return\"yield\"===(ref1=this.operator)||\"yield*\"===ref1}},{key:\"isUnary\",value:function isUnary(){return!this.second}},{key:\"shouldCache\",value:function shouldCache(){return!this.isNumber()}},{key:\"isChainable\",value:function isChainable(){var ref1;return\"<\"===(ref1=this.operator)||\">\"===ref1||\">=\"===ref1||\"<=\"===ref1||\"===\"===ref1||\"!==\"===ref1}},{key:\"isChain\",value:function isChain(){return this.isChainable()&&this.first.isChainable()}},{key:\"invert\",value:function invert(){var allInvertable,curr,fst,op,ref1;if(this.isInOperator())return this.invertOperator=\"!\",this;if(this.isChain()){for(allInvertable=!0,curr=this;curr&&curr.operator;)allInvertable&&(allInvertable=curr.operator in INVERSIONS),curr=curr.first;if(!allInvertable)return new Parens(this).invert();for(curr=this;curr&&curr.operator;)curr.invert=!curr.invert,curr.operator=INVERSIONS[curr.operator],curr=curr.first;return this}return(op=INVERSIONS[this.operator])?(this.operator=op,this.first.unwrap()instanceof Op&&this.first.invert(),this):this.second?new Parens(this).invert():\"!\"===this.operator&&(fst=this.first.unwrap())instanceof Op&&(\"!\"===(ref1=fst.operator)||\"in\"===ref1||\"instanceof\"===ref1)?fst:new Op(\"!\",this)}},{key:\"unfoldSoak\",value:function unfoldSoak(o){var ref1;return(\"++\"===(ref1=this.operator)||\"--\"===ref1||\"delete\"===ref1)&&_unfoldSoak(o,this,\"first\")}},{key:\"generateDo\",value:function generateDo(exp){var call,func,j,len1,param,passedParams,ref,ref1;for(passedParams=[],func=exp instanceof Assign&&(ref=exp.value.unwrap())instanceof Code?ref:exp,ref1=func.params||[],(j=0,len1=ref1.length);j<len1;j++)param=ref1[j],param.value?(passedParams.push(param.value),delete param.value):passedParams.push(param);return call=new Call(exp,passedParams),call[\"do\"]=!0,call}},{key:\"isInOperator\",value:function isInOperator(){return\"in\"===this.originalOperator}},{key:\"compileNode\",value:function compileNode(o){var answer,inNode,isChain,lhs,rhs;if(this.isInOperator())return inNode=new In(this.first,this.second),(this.invertOperator?inNode.invert():inNode).compileNode(o);if(this.invertOperator)return this.invertOperator=null,this.invert().compileNode(o);if(\"do\"===this.operator)return Op.prototype.generateDo(this.first).compileNode(o);if(isChain=this.isChain(),isChain||(this.first.front=this.front),this.checkDeleteOperand(o),this.isYield()||this.isAwait())return this.compileContinuation(o);if(this.isUnary())return this.compileUnary(o);if(isChain)return this.compileChain(o);switch(this.operator){case\"?\":return this.compileExistence(o,this.second.isDefaultValue);case\"//\":return this.compileFloorDivision(o);case\"%%\":return this.compileModulo(o);default:return lhs=this.first.compileToFragments(o,LEVEL_OP),rhs=this.second.compileToFragments(o,LEVEL_OP),answer=[].concat(lhs,this.makeCode(\" \".concat(this.operator,\" \")),rhs),o.level<=LEVEL_OP?answer:this.wrapInParentheses(answer);}}},{key:\"compileChain\",value:function compileChain(o){var _this$first$second$ca=this.first.second.cache(o),_this$first$second$ca2=_slicedToArray(_this$first$second$ca,2),fragments,fst,shared;return this.first.second=_this$first$second$ca2[0],shared=_this$first$second$ca2[1],fst=this.first.compileToFragments(o,LEVEL_OP),fragments=fst.concat(this.makeCode(\" \".concat(this.invert?\"&&\":\"||\",\" \")),shared.compileToFragments(o),this.makeCode(\" \".concat(this.operator,\" \")),this.second.compileToFragments(o,LEVEL_OP)),this.wrapInParentheses(fragments)}},{key:\"compileExistence\",value:function compileExistence(o,checkOnlyUndefined){var fst,ref;return this.first.shouldCache()?(ref=new IdentifierLiteral(o.scope.freeVariable(\"ref\")),fst=new Parens(new Assign(ref,this.first))):(fst=this.first,ref=fst),new If(new Existence(fst,checkOnlyUndefined),ref,{type:\"if\"}).addElse(this.second).compileToFragments(o)}},{key:\"compileUnary\",value:function compileUnary(o){var op,parts,plusMinus;return(parts=[],op=this.operator,parts.push([this.makeCode(op)]),\"!\"===op&&this.first instanceof Existence)?(this.first.negated=!this.first.negated,this.first.compileToFragments(o)):o.level>=LEVEL_ACCESS?new Parens(this).compileToFragments(o):(plusMinus=\"+\"===op||\"-\"===op,(\"typeof\"===op||\"delete\"===op||plusMinus&&this.first instanceof Op&&this.first.operator===op)&&parts.push([this.makeCode(\" \")]),plusMinus&&this.first instanceof Op&&(this.first=new Parens(this.first)),parts.push(this.first.compileToFragments(o,LEVEL_OP)),this.flip&&parts.reverse(),this.joinFragmentArrays(parts,\"\"))}},{key:\"compileContinuation\",value:function compileContinuation(o){var op,parts,ref1;return parts=[],op=this.operator,this.isAwait()||this.checkContinuation(o),0<=indexOf.call(Object.keys(this.first),\"expression\")&&!(this.first instanceof Throw)?null!=this.first.expression&&parts.push(this.first.expression.compileToFragments(o,LEVEL_OP)):(o.level>=LEVEL_PAREN&&parts.push([this.makeCode(\"(\")]),parts.push([this.makeCode(op)]),\"\"!==(null==(ref1=this.first.base)?void 0:ref1.value)&&parts.push([this.makeCode(\" \")]),parts.push(this.first.compileToFragments(o,LEVEL_OP)),o.level>=LEVEL_PAREN&&parts.push([this.makeCode(\")\")])),this.joinFragmentArrays(parts,\"\")}},{key:\"checkContinuation\",value:function checkContinuation(o){var ref1;if(null==o.scope.parent&&this.error(\"\".concat(this.operator,\" can only occur inside functions\")),(null==(ref1=o.scope.method)?void 0:ref1.bound)&&o.scope.method.isGenerator)return this.error(\"yield cannot occur inside bound (fat arrow) functions\")}},{key:\"compileFloorDivision\",value:function compileFloorDivision(o){var div,floor,second;return floor=new Value(new IdentifierLiteral(\"Math\"),[new Access(new PropertyName(\"floor\"))]),second=this.second.shouldCache()?new Parens(this.second):this.second,div=new Op(\"/\",this.first,second),new Call(floor,[div]).compileToFragments(o)}},{key:\"compileModulo\",value:function compileModulo(o){var mod;return mod=new Value(new Literal(utility(\"modulo\",o))),new Call(mod,[this.first,this.second]).compileToFragments(o)}},{key:\"toString\",value:function toString(idt){return _get(_getPrototypeOf(Op.prototype),\"toString\",this).call(this,idt,this.constructor.name+\" \"+this.operator)}},{key:\"checkDeleteOperand\",value:function checkDeleteOperand(o){if(\"delete\"===this.operator&&o.scope.check(this.first.unwrapAll().value))return this.error(\"delete operand may not be argument or var\")}},{key:\"astNode\",value:function astNode(o){return this.isYield()&&this.checkContinuation(o),this.checkDeleteOperand(o),_get(_getPrototypeOf(Op.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){if(this.isAwait())return\"AwaitExpression\";if(this.isYield())return\"YieldExpression\";if(this.isChain())return\"ChainedComparison\";switch(this.operator){case\"||\":case\"&&\":case\"?\":return\"LogicalExpression\";case\"++\":case\"--\":return\"UpdateExpression\";default:return this.isUnary()?\"UnaryExpression\":\"BinaryExpression\";}}},{key:\"operatorAst\",value:function operatorAst(){return\"\".concat(this.invertOperator?\"\".concat(this.invertOperator,\" \"):\"\").concat(this.originalOperator)}},{key:\"chainAstProperties\",value:function chainAstProperties(o){var currentOp,operand,operands,operators;for(operators=[this.operatorAst()],operands=[this.second],currentOp=this.first;;)if(operators.unshift(currentOp.operatorAst()),operands.unshift(currentOp.second),currentOp=currentOp.first,!currentOp.isChainable()){operands.unshift(currentOp);break}return{operators:operators,operands:function(){var j,len1,results1;for(results1=[],j=0,len1=operands.length;j<len1;j++)operand=operands[j],results1.push(operand.ast(o,LEVEL_OP));return results1}()}}},{key:\"astProperties\",value:function astProperties(o){var argument,firstAst,operatorAst,ref1,secondAst;if(this.isChain())return this.chainAstProperties(o);switch(firstAst=this.first.ast(o,LEVEL_OP),secondAst=null==(ref1=this.second)?void 0:ref1.ast(o,LEVEL_OP),operatorAst=this.operatorAst(),!1){case!this.isUnary():return argument=this.isYield()&&\"\"===this.first.unwrap().value?null:firstAst,this.isAwait()?{argument:argument}:this.isYield()?{argument:argument,delegate:\"yield*\"===this.operator}:{argument:argument,operator:operatorAst,prefix:!this.flip};default:return{left:firstAst,right:secondAst,operator:operatorAst};}}}]),Op}(Base),CONVERSIONS,INVERSIONS;return CONVERSIONS={\"==\":\"===\",\"!=\":\"!==\",of:\"in\",yieldfrom:\"yield*\"},INVERSIONS={\"!==\":\"===\",\"===\":\"!==\"},Op.prototype.children=[\"first\",\"second\"],Op}.call(this),exports.In=In=function(){var In=function(_Base47){function In(object1,array){var _this70;return _classCallCheck(this,In),_this70=_super81.call(this),_this70.object=object1,_this70.array=array,_this70}_inherits(In,_Base47);var _super81=_createSuper(In);return _createClass(In,[{key:\"compileNode\",value:function compileNode(o){var hasSplat,j,len1,obj,ref1;if(this.array instanceof Value&&this.array.isArray()&&this.array.base.objects.length){for(ref1=this.array.base.objects,j=0,len1=ref1.length;j<len1;j++)if(obj=ref1[j],!!(obj instanceof Splat)){hasSplat=!0;break}if(!hasSplat)return this.compileOrTest(o)}return this.compileLoopTest(o)}},{key:\"compileOrTest\",value:function compileOrTest(o){var _this$object$cache=this.object.cache(o,LEVEL_OP),_this$object$cache2=_slicedToArray(_this$object$cache,2),cmp,cnj,i,item,j,len1,ref,ref1,sub,tests;sub=_this$object$cache2[0],ref=_this$object$cache2[1];var _ref56=this.negated?[\" !== \",\" && \"]:[\" === \",\" || \"],_ref57=_slicedToArray(_ref56,2);for(cmp=_ref57[0],cnj=_ref57[1],tests=[],ref1=this.array.base.objects,(i=j=0,len1=ref1.length);j<len1;i=++j)item=ref1[i],i&&tests.push(this.makeCode(cnj)),tests=tests.concat(i?ref:sub,this.makeCode(cmp),item.compileToFragments(o,LEVEL_ACCESS));return o.level<LEVEL_OP?tests:this.wrapInParentheses(tests)}},{key:\"compileLoopTest\",value:function compileLoopTest(o){var _this$object$cache3=this.object.cache(o,LEVEL_LIST),_this$object$cache4=_slicedToArray(_this$object$cache3,2),fragments,ref,sub;return(sub=_this$object$cache4[0],ref=_this$object$cache4[1],fragments=[].concat(this.makeCode(utility(\"indexOf\",o)+\".call(\"),this.array.compileToFragments(o,LEVEL_LIST),this.makeCode(\", \"),ref,this.makeCode(\") \"+(this.negated?\"< 0\":\">= 0\"))),fragmentsToText(sub)===fragmentsToText(ref))?fragments:(fragments=sub.concat(this.makeCode(\", \"),fragments),o.level<LEVEL_LIST?fragments:this.wrapInParentheses(fragments))}},{key:\"toString\",value:function toString(idt){return _get(_getPrototypeOf(In.prototype),\"toString\",this).call(this,idt,this.constructor.name+(this.negated?\"!\":\"\"))}}]),In}(Base);return In.prototype.children=[\"object\",\"array\"],In.prototype.invert=NEGATE,In}.call(this),exports.Try=Try=function(){var Try=function(_Base48){function Try(attempt,_catch,ensure,finallyTag){var _this71;return _classCallCheck(this,Try),_this71=_super82.call(this),_this71.attempt=attempt,_this71[\"catch\"]=_catch,_this71.ensure=ensure,_this71.finallyTag=finallyTag,_this71}_inherits(Try,_Base48);var _super82=_createSuper(Try);return _createClass(Try,[{key:\"jumps\",value:function jumps(o){var ref1;return this.attempt.jumps(o)||(null==(ref1=this[\"catch\"])?void 0:ref1.jumps(o))}},{key:\"makeReturn\",value:function makeReturn(results,mark){var ref1,ref2;return mark?(null!=(ref1=this.attempt)&&ref1.makeReturn(results,mark),void(null!=(ref2=this[\"catch\"])&&ref2.makeReturn(results,mark))):(this.attempt&&(this.attempt=this.attempt.makeReturn(results)),this[\"catch\"]&&(this[\"catch\"]=this[\"catch\"].makeReturn(results)),this)}},{key:\"compileNode\",value:function compileNode(o){var catchPart,ensurePart,generatedErrorVariableName,originalIndent,tryPart;return originalIndent=o.indent,o.indent+=TAB,tryPart=this.attempt.compileToFragments(o,LEVEL_TOP),catchPart=this[\"catch\"]?this[\"catch\"].compileToFragments(merge(o,{indent:originalIndent}),LEVEL_TOP):this.ensure||this[\"catch\"]?[]:(generatedErrorVariableName=o.scope.freeVariable(\"error\",{reserve:!1}),[this.makeCode(\" catch (\".concat(generatedErrorVariableName,\") {}\"))]),ensurePart=this.ensure?[].concat(this.makeCode(\" finally {\\n\"),this.ensure.compileToFragments(o,LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab,\"}\"))):[],[].concat(this.makeCode(\"\".concat(this.tab,\"try {\\n\")),tryPart,this.makeCode(\"\\n\".concat(this.tab,\"}\")),catchPart,ensurePart)}},{key:\"astType\",value:function astType(){return\"TryStatement\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{block:this.attempt.ast(o,LEVEL_TOP),handler:null==(ref1=null==(ref2=this[\"catch\"])?void 0:ref2.ast(o))?null:ref1,finalizer:null==this.ensure?null:Object.assign(this.ensure.ast(o,LEVEL_TOP),mergeAstLocationData(jisonLocationDataToAstLocationData(this.finallyTag.locationData),this.ensure.astLocationData()))}}}]),Try}(Base);return Try.prototype.children=[\"attempt\",\"catch\",\"ensure\"],Try.prototype.isStatement=YES,Try}.call(this),exports.Catch=Catch=function(){var Catch=function(_Base49){function Catch(recovery,errorVariable){var _this72;_classCallCheck(this,Catch);var base1,ref1;return _this72=_super83.call(this),_this72.recovery=recovery,_this72.errorVariable=errorVariable,null!=(ref1=_this72.errorVariable)&&\"function\"==typeof(base1=ref1.unwrap()).propagateLhs&&base1.propagateLhs(!0),_this72}_inherits(Catch,_Base49);var _super83=_createSuper(Catch);return _createClass(Catch,[{key:\"jumps\",value:function jumps(o){return this.recovery.jumps(o)}},{key:\"makeReturn\",value:function makeReturn(results,mark){var ret;if(ret=this.recovery.makeReturn(results,mark),!mark)return this.recovery=ret,this}},{key:\"compileNode\",value:function compileNode(o){var generatedErrorVariableName,placeholder;return o.indent+=TAB,generatedErrorVariableName=o.scope.freeVariable(\"error\",{reserve:!1}),placeholder=new IdentifierLiteral(generatedErrorVariableName),this.checkUnassignable(),this.errorVariable&&this.recovery.unshift(new Assign(this.errorVariable,placeholder)),[].concat(this.makeCode(\" catch (\"),placeholder.compileToFragments(o),this.makeCode(\") {\\n\"),this.recovery.compileToFragments(o,LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab,\"}\")))}},{key:\"checkUnassignable\",value:function checkUnassignable(){var message;if(this.errorVariable&&(message=isUnassignable(this.errorVariable.unwrapAll().value),message))return this.errorVariable.error(message)}},{key:\"astNode\",value:function astNode(o){var ref1;return this.checkUnassignable(),null!=(ref1=this.errorVariable)&&ref1.eachName(function(name){var alreadyDeclared;return alreadyDeclared=o.scope.find(name.value),name.isDeclaration=!alreadyDeclared}),_get(_getPrototypeOf(Catch.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"CatchClause\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{param:null==(ref1=null==(ref2=this.errorVariable)?void 0:ref2.ast(o))?null:ref1,body:this.recovery.ast(o,LEVEL_TOP)}}}]),Catch}(Base);return Catch.prototype.children=[\"recovery\",\"errorVariable\"],Catch.prototype.isStatement=YES,Catch}.call(this),exports.Throw=Throw=function(){var Throw=function(_Base50){function Throw(expression1){var _this73;return _classCallCheck(this,Throw),_this73=_super84.call(this),_this73.expression=expression1,_this73}_inherits(Throw,_Base50);var _super84=_createSuper(Throw);return _createClass(Throw,[{key:\"compileNode\",value:function compileNode(o){var fragments;return fragments=this.expression.compileToFragments(o,LEVEL_LIST),unshiftAfterComments(fragments,this.makeCode(\"throw \")),fragments.unshift(this.makeCode(this.tab)),fragments.push(this.makeCode(\";\")),fragments}},{key:\"astType\",value:function astType(){return\"ThrowStatement\"}},{key:\"astProperties\",value:function astProperties(o){return{argument:this.expression.ast(o,LEVEL_LIST)}}}]),Throw}(Base);return Throw.prototype.children=[\"expression\"],Throw.prototype.isStatement=YES,Throw.prototype.jumps=NO,Throw.prototype.makeReturn=THIS,Throw}.call(this),exports.Existence=Existence=function(){var Existence=function(_Base51){function Existence(expression1){var onlyNotUndefined=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],_this74;_classCallCheck(this,Existence);var salvagedComments;return _this74=_super85.call(this),_this74.expression=expression1,_this74.comparisonTarget=onlyNotUndefined?\"undefined\":\"null\",salvagedComments=[],_this74.expression.traverseChildren(!0,function(child){var comment,j,len1,ref1;if(child.comments){for(ref1=child.comments,j=0,len1=ref1.length;j<len1;j++)comment=ref1[j],0>indexOf.call(salvagedComments,comment)&&salvagedComments.push(comment);return delete child.comments}}),attachCommentsToNode(salvagedComments,_assertThisInitialized(_this74)),moveComments(_this74.expression,_assertThisInitialized(_this74)),_this74}_inherits(Existence,_Base51);var _super85=_createSuper(Existence);return _createClass(Existence,[{key:\"compileNode\",value:function compileNode(o){var cmp,cnj,code;if(this.expression.front=this.front,code=this.expression.compile(o,LEVEL_OP),this.expression.unwrap()instanceof IdentifierLiteral&&!o.scope.check(code)){var _ref58=this.negated?[\"===\",\"||\"]:[\"!==\",\"&&\"],_ref59=_slicedToArray(_ref58,2);cmp=_ref59[0],cnj=_ref59[1],code=\"typeof \".concat(code,\" \").concat(cmp,\" \\\"undefined\\\"\")+(\"undefined\"===this.comparisonTarget?\"\":\" \".concat(cnj,\" \").concat(code,\" \").concat(cmp,\" \").concat(this.comparisonTarget))}else cmp=\"null\"===this.comparisonTarget?this.negated?\"==\":\"!=\":this.negated?\"===\":\"!==\",code=\"\".concat(code,\" \").concat(cmp,\" \").concat(this.comparisonTarget);return[this.makeCode(o.level<=LEVEL_COND?code:\"(\".concat(code,\")\"))]}},{key:\"astType\",value:function astType(){return\"UnaryExpression\"}},{key:\"astProperties\",value:function astProperties(o){return{argument:this.expression.ast(o),operator:\"?\",prefix:!1}}}]),Existence}(Base);return Existence.prototype.children=[\"expression\"],Existence.prototype.invert=NEGATE,Existence}.call(this),exports.Parens=Parens=function(){var Parens=function(_Base52){function Parens(body1){var _this75;return _classCallCheck(this,Parens),_this75=_super86.call(this),_this75.body=body1,_this75}_inherits(Parens,_Base52);var _super86=_createSuper(Parens);return _createClass(Parens,[{key:\"unwrap\",value:function unwrap(){return this.body}},{key:\"shouldCache\",value:function shouldCache(){return this.body.shouldCache()}},{key:\"compileNode\",value:function compileNode(o){var bare,expr,fragments,ref1,shouldWrapComment;return(expr=this.body.unwrap(),shouldWrapComment=null==(ref1=expr.comments)?void 0:ref1.some(function(comment){return comment.here&&!comment.unshift&&!comment.newLine}),expr instanceof Value&&expr.isAtomic()&&!this.jsxAttribute&&!shouldWrapComment)?(expr.front=this.front,expr.compileToFragments(o)):(fragments=expr.compileToFragments(o,LEVEL_PAREN),bare=o.level<LEVEL_OP&&!shouldWrapComment&&(expr instanceof Op&&!expr.isInOperator()||expr.unwrap()instanceof Call||expr instanceof For&&expr.returns)&&(o.level<LEVEL_COND||3>=fragments.length),this.jsxAttribute?this.wrapInBraces(fragments):bare?fragments:this.wrapInParentheses(fragments))}},{key:\"astNode\",value:function astNode(o){return this.body.unwrap().ast(o,LEVEL_PAREN)}}]),Parens}(Base);return Parens.prototype.children=[\"body\"],Parens}.call(this),exports.StringWithInterpolations=StringWithInterpolations=function(){var StringWithInterpolations=function(_Base53){function StringWithInterpolations(body1){var _ref60=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},quote=_ref60.quote,startQuote=_ref60.startQuote,jsxAttribute=_ref60.jsxAttribute,_this76;return _classCallCheck(this,StringWithInterpolations),_this76=_super87.call(this),_this76.body=body1,_this76.quote=quote,_this76.startQuote=startQuote,_this76.jsxAttribute=jsxAttribute,_this76}_inherits(StringWithInterpolations,_Base53);var _super87=_createSuper(StringWithInterpolations);return _createClass(StringWithInterpolations,[{key:\"unwrap\",value:function unwrap(){return this}},{key:\"shouldCache\",value:function shouldCache(){return this.body.shouldCache()}},{key:\"extractElements\",value:function extractElements(o){var _ref61=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},includeInterpolationWrappers=_ref61.includeInterpolationWrappers,isJsx=_ref61.isJsx,elements,expr,salvagedComments;return expr=this.body.unwrap(),elements=[],salvagedComments=[],expr.traverseChildren(!1,function(node){var comment,commentPlaceholder,empty,j,k,len1,len2,ref1,ref2,ref3,unwrapped;if(node instanceof StringLiteral){if(node.comments){var _salvagedComments;(_salvagedComments=salvagedComments).push.apply(_salvagedComments,_toConsumableArray(node.comments)),delete node.comments}return elements.push(node),!0}if(node instanceof Interpolation){if(0!==salvagedComments.length){for(j=0,len1=salvagedComments.length;j<len1;j++)comment=salvagedComments[j],comment.unshift=!0,comment.newLine=!0;attachCommentsToNode(salvagedComments,node)}if((unwrapped=null==(ref1=node.expression)?void 0:ref1.unwrapAll())instanceof PassthroughLiteral&&unwrapped.generated&&!(isJsx&&o.compiling)){if(o.compiling){if(commentPlaceholder=new StringLiteral(\"\").withLocationDataFrom(node),commentPlaceholder.comments=unwrapped.comments,node.comments){var _ref62;(_ref62=null==commentPlaceholder.comments?commentPlaceholder.comments=[]:commentPlaceholder.comments).push.apply(_ref62,_toConsumableArray(node.comments))}elements.push(new Value(commentPlaceholder))}else empty=new Interpolation().withLocationDataFrom(node),empty.comments=node.comments,elements.push(empty);}else if(node.expression||includeInterpolationWrappers){if(node.comments){var _ref63;(_ref63=null==(ref2=node.expression)?void 0:null==ref2.comments?ref2.comments=[]:ref2.comments).push.apply(_ref63,_toConsumableArray(node.comments))}elements.push(includeInterpolationWrappers?node:node.expression)}return!1}if(node.comments){if(0!==elements.length&&!(elements[elements.length-1]instanceof StringLiteral)){for(ref3=node.comments,k=0,len2=ref3.length;k<len2;k++)comment=ref3[k],comment.unshift=!1,comment.newLine=!0;attachCommentsToNode(node.comments,elements[elements.length-1])}else{var _salvagedComments2;(_salvagedComments2=salvagedComments).push.apply(_salvagedComments2,_toConsumableArray(node.comments))}delete node.comments}return!0}),elements}},{key:\"compileNode\",value:function compileNode(o){var code,element,elements,fragments,j,len1,ref1,unquotedElementValue,wrapped;if(null==this.comments&&(this.comments=null==(ref1=this.startQuote)?void 0:ref1.comments),this.jsxAttribute)return wrapped=new Parens(new StringWithInterpolations(this.body)),wrapped.jsxAttribute=!0,wrapped.compileNode(o);for(elements=this.extractElements(o,{isJsx:this.jsx}),fragments=[],this.jsx||fragments.push(this.makeCode(\"`\")),(j=0,len1=elements.length);j<len1;j++)if(element=elements[j],element instanceof StringLiteral)unquotedElementValue=this.jsx?element.unquotedValueForJSX:element.unquotedValueForTemplateLiteral,fragments.push(this.makeCode(unquotedElementValue));else{var _fragments12;this.jsx||fragments.push(this.makeCode(\"$\")),code=element.compileToFragments(o,LEVEL_PAREN),(!this.isNestedTag(element)||code.some(function(fragment){var ref2;return null==(ref2=fragment.comments)?void 0:ref2.some(function(comment){return!1===comment.here})}))&&(code=this.wrapInBraces(code),code[0].isStringWithInterpolations=!0,code[code.length-1].isStringWithInterpolations=!0),(_fragments12=fragments).push.apply(_fragments12,_toConsumableArray(code))}return this.jsx||fragments.push(this.makeCode(\"`\")),fragments}},{key:\"isNestedTag\",value:function isNestedTag(element){var call;return call=\"function\"==typeof element.unwrapAll?element.unwrapAll():void 0,this.jsx&&call instanceof JSXElement}},{key:\"astType\",value:function astType(){return\"TemplateLiteral\"}},{key:\"astProperties\",value:function astProperties(o){var element,elements,emptyInterpolation,expression,expressions,index,j,last,len1,node,quasis;elements=this.extractElements(o,{includeInterpolationWrappers:!0});var _slice1$call17=slice1.call(elements,-1),_slice1$call18=_slicedToArray(_slice1$call17,1);for(last=_slice1$call18[0],quasis=[],expressions=[],(index=j=0,len1=elements.length);j<len1;index=++j)if(element=elements[index],element instanceof StringLiteral)quasis.push(new TemplateElement(element.originalValue,{tail:element===last}).withLocationDataFrom(element).ast(o));else{var _element2=element;expression=_element2.expression,node=null==expression?(emptyInterpolation=new EmptyInterpolation,emptyInterpolation.locationData=emptyExpressionLocationData({interpolationNode:element,openingBrace:\"#{\",closingBrace:\"}\"}),emptyInterpolation):expression.unwrapAll(),expressions.push(astAsBlockIfNeeded(node,o))}return{expressions:expressions,quasis:quasis,quote:this.quote}}}],[{key:\"fromStringLiteral\",value:function fromStringLiteral(stringLiteral){var updatedString,updatedStringValue;return updatedString=stringLiteral.withoutQuotesInLocationData(),updatedStringValue=new Value(updatedString).withLocationDataFrom(updatedString),new StringWithInterpolations(Block.wrap([updatedStringValue]),{quote:stringLiteral.quote,jsxAttribute:stringLiteral.jsxAttribute}).withLocationDataFrom(stringLiteral)}}]),StringWithInterpolations}(Base);return StringWithInterpolations.prototype.children=[\"body\"],StringWithInterpolations}.call(this),exports.TemplateElement=TemplateElement=function(_Base54){function TemplateElement(value1){var _ref64=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},tail1=_ref64.tail,_this77;return _classCallCheck(this,TemplateElement),_this77=_super88.call(this),_this77.value=value1,_this77.tail=tail1,_this77}_inherits(TemplateElement,_Base54);var _super88=_createSuper(TemplateElement);return _createClass(TemplateElement,[{key:\"astProperties\",value:function astProperties(){return{value:{raw:this.value},tail:!!this.tail}}}]),TemplateElement}(Base),exports.Interpolation=Interpolation=function(){var Interpolation=function(_Base55){function Interpolation(expression1){var _this78;return _classCallCheck(this,Interpolation),_this78=_super89.call(this),_this78.expression=expression1,_this78}_inherits(Interpolation,_Base55);var _super89=_createSuper(Interpolation);return _createClass(Interpolation)}(Base);return Interpolation.prototype.children=[\"expression\"],Interpolation}.call(this),exports.EmptyInterpolation=EmptyInterpolation=function(_Base56){function EmptyInterpolation(){return _classCallCheck(this,EmptyInterpolation),_super90.call(this)}_inherits(EmptyInterpolation,_Base56);var _super90=_createSuper(EmptyInterpolation);return _createClass(EmptyInterpolation)}(Base),exports.For=For=function(){var For=function(_While){function For(body,source){var _this79;return _classCallCheck(this,For),_this79=_super91.call(this),_this79.addBody(body),_this79.addSource(source),_this79}_inherits(For,_While);var _super91=_createSuper(For);return _createClass(For,[{key:\"isAwait\",value:function isAwait(){var ref1;return null!=(ref1=this[\"await\"])&&ref1}},{key:\"addBody\",value:function addBody(body){var base1,expressions;return this.body=Block.wrap([body]),expressions=this.body.expressions,expressions.length&&null==(base1=this.body).locationData&&(base1.locationData=mergeLocationData(expressions[0].locationData,expressions[expressions.length-1].locationData)),this}},{key:\"addSource\",value:function addSource(source){var _this80=this,_source$source=source.source,attr,attribs,attribute,base1,j,k,len1,len2,ref1,ref2,ref3,ref4;for(this.source=void 0!==_source$source&&_source$source,attribs=[\"name\",\"index\",\"guard\",\"step\",\"own\",\"ownTag\",\"await\",\"awaitTag\",\"object\",\"from\"],(j=0,len1=attribs.length);j<len1;j++)attr=attribs[j],this[attr]=null==(ref1=source[attr])?this[attr]:ref1;if(!this.source)return this;if(this.from&&this.index&&this.index.error(\"cannot use index with for-from\"),this.own&&!this.object&&this.ownTag.error(\"cannot use own with for-\".concat(this.from?\"from\":\"in\")),this.object){var _ref65=[this.index,this.name];this.name=_ref65[0],this.index=_ref65[1]}for(((null==(ref2=this.index)?void 0:\"function\"==typeof ref2.isArray?ref2.isArray():void 0)||(null==(ref3=this.index)?void 0:\"function\"==typeof ref3.isObject?ref3.isObject():void 0))&&this.index.error(\"index cannot be a pattern matching expression\"),this[\"await\"]&&!this.from&&this.awaitTag.error(\"await must be used with for-from\"),this.range=this.source instanceof Value&&this.source.base instanceof Range&&!this.source.properties.length&&!this.from,this.pattern=this.name instanceof Value,this.pattern&&\"function\"==typeof(base1=this.name.unwrap()).propagateLhs&&base1.propagateLhs(!0),this.range&&this.index&&this.index.error(\"indexes do not apply to range loops\"),this.range&&this.pattern&&this.name.error(\"cannot pattern match over range loops\"),this.returns=!1,ref4=[\"source\",\"guard\",\"step\",\"name\",\"index\"],(k=0,len2=ref4.length);k<len2;k++)(attribute=ref4[k],!!this[attribute])&&(this[attribute].traverseChildren(!0,function(node){var comment,l,len3,ref5;if(node.comments){for(ref5=node.comments,l=0,len3=ref5.length;l<len3;l++)comment=ref5[l],comment.newLine=comment.unshift=!0;return moveComments(node,_this80[attribute])}}),moveComments(this[attribute],this));return this}},{key:\"compileNode\",value:function compileNode(o){var _slice1$call19,_slice1$call20,body,bodyFragments,compare,compareDown,declare,declareDown,defPart,down,forClose,forCode,forPartFragments,fragments,guardPart,idt1,increment,index,ivar,kvar,kvarAssign,last,lvar,name,namePart,ref,ref1,resultPart,returnResult,rvar,scope,source,step,stepNum,stepVar,svar,varPart;if(body=Block.wrap([this.body]),ref1=body.expressions,_slice1$call19=slice1.call(ref1,-1),_slice1$call20=_slicedToArray(_slice1$call19,1),last=_slice1$call20[0],_slice1$call19,(null==last?void 0:last.jumps())instanceof Return&&(this.returns=!1),source=this.range?this.source.base:this.source,scope=o.scope,this.pattern||(name=this.name&&this.name.compile(o,LEVEL_LIST)),index=this.index&&this.index.compile(o,LEVEL_LIST),name&&!this.pattern&&scope.find(name),index&&!(this.index instanceof Value)&&scope.find(index),this.returns&&(rvar=scope.freeVariable(\"results\")),this.from?this.pattern&&(ivar=scope.freeVariable(\"x\",{single:!0})):ivar=this.object&&index||scope.freeVariable(\"i\",{single:!0}),kvar=(this.range||this.from)&&name||index||ivar,kvarAssign=kvar===ivar?\"\":\"\".concat(kvar,\" = \"),this.step&&!this.range){var _this$cacheToCodeFrag9=this.cacheToCodeFragments(this.step.cache(o,LEVEL_LIST,shouldCacheOrIsAssignable)),_this$cacheToCodeFrag10=_slicedToArray(_this$cacheToCodeFrag9,2);step=_this$cacheToCodeFrag10[0],stepVar=_this$cacheToCodeFrag10[1],this.step.isNumber()&&(stepNum=parseNumber(stepVar))}return this.pattern&&(name=ivar),varPart=\"\",guardPart=\"\",defPart=\"\",idt1=this.tab+TAB,this.range?forPartFragments=source.compileToFragments(merge(o,{index:ivar,name:name,step:this.step,shouldCache:shouldCacheOrIsAssignable})):(svar=this.source.compile(o,LEVEL_LIST),(name||this.own)&&!this.from&&!(this.source.unwrap()instanceof IdentifierLiteral)&&(defPart+=\"\".concat(this.tab).concat(ref=scope.freeVariable(\"ref\"),\" = \").concat(svar,\";\\n\"),svar=ref),name&&!this.pattern&&!this.from&&(namePart=\"\".concat(name,\" = \").concat(svar,\"[\").concat(kvar,\"]\")),!this.object&&!this.from&&(step!==stepVar&&(defPart+=\"\".concat(this.tab).concat(step,\";\\n\")),down=0>stepNum,!(this.step&&null!=stepNum&&down)&&(lvar=scope.freeVariable(\"len\")),declare=\"\".concat(kvarAssign).concat(ivar,\" = 0, \").concat(lvar,\" = \").concat(svar,\".length\"),declareDown=\"\".concat(kvarAssign).concat(ivar,\" = \").concat(svar,\".length - 1\"),compare=\"\".concat(ivar,\" < \").concat(lvar),compareDown=\"\".concat(ivar,\" >= 0\"),this.step?(null==stepNum?(compare=\"\".concat(stepVar,\" > 0 ? \").concat(compare,\" : \").concat(compareDown),declare=\"(\".concat(stepVar,\" > 0 ? (\").concat(declare,\") : \").concat(declareDown,\")\")):down&&(compare=compareDown,declare=declareDown),increment=\"\".concat(ivar,\" += \").concat(stepVar)):increment=\"\".concat(kvar===ivar?\"\".concat(ivar,\"++\"):\"++\".concat(ivar)),forPartFragments=[this.makeCode(\"\".concat(declare,\"; \").concat(compare,\"; \").concat(kvarAssign).concat(increment))])),this.returns&&(resultPart=\"\".concat(this.tab).concat(rvar,\" = [];\\n\"),returnResult=\"\\n\".concat(this.tab,\"return \").concat(rvar,\";\"),body.makeReturn(rvar)),this.guard&&(1<body.expressions.length?body.expressions.unshift(new If(new Parens(this.guard).invert(),new StatementLiteral(\"continue\"))):this.guard&&(body=Block.wrap([new If(this.guard,body)]))),this.pattern&&body.expressions.unshift(new Assign(this.name,this.from?new IdentifierLiteral(kvar):new Literal(\"\".concat(svar,\"[\").concat(kvar,\"]\")))),namePart&&(varPart=\"\\n\".concat(idt1).concat(namePart,\";\")),this.object?(forPartFragments=[this.makeCode(\"\".concat(kvar,\" in \").concat(svar))],this.own&&(guardPart=\"\\n\".concat(idt1,\"if (!\").concat(utility(\"hasProp\",o),\".call(\").concat(svar,\", \").concat(kvar,\")) continue;\"))):this.from&&(this[\"await\"]?(forPartFragments=new Op(\"await\",new Parens(new Literal(\"\".concat(kvar,\" of \").concat(svar)))),forPartFragments=forPartFragments.compileToFragments(o,LEVEL_TOP)):forPartFragments=[this.makeCode(\"\".concat(kvar,\" of \").concat(svar))]),bodyFragments=body.compileToFragments(merge(o,{indent:idt1}),LEVEL_TOP),bodyFragments&&0<bodyFragments.length&&(bodyFragments=[].concat(this.makeCode(\"\\n\"),bodyFragments,this.makeCode(\"\\n\"))),fragments=[this.makeCode(defPart)],resultPart&&fragments.push(this.makeCode(resultPart)),forCode=this[\"await\"]?\"for \":\"for (\",forClose=this[\"await\"]?\"\":\")\",fragments=fragments.concat(this.makeCode(this.tab),this.makeCode(forCode),forPartFragments,this.makeCode(\"\".concat(forClose,\" {\").concat(guardPart).concat(varPart)),bodyFragments,this.makeCode(this.tab),this.makeCode(\"}\")),returnResult&&fragments.push(this.makeCode(returnResult)),fragments}},{key:\"astNode\",value:function astNode(o){var addToScope,ref1,ref2;return addToScope=function(name){var alreadyDeclared;return alreadyDeclared=o.scope.find(name.value),name.isDeclaration=!alreadyDeclared},null!=(ref1=this.name)&&ref1.eachName(addToScope,{checkAssignability:!1}),null!=(ref2=this.index)&&ref2.eachName(addToScope,{checkAssignability:!1}),_get(_getPrototypeOf(For.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"For\"}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4,ref5,ref6,ref7,ref8,ref9;return{source:null==(ref1=this.source)?void 0:ref1.ast(o),body:this.body.ast(o,LEVEL_TOP),guard:null==(ref2=null==(ref3=this.guard)?void 0:ref3.ast(o))?null:ref2,name:null==(ref4=null==(ref5=this.name)?void 0:ref5.ast(o))?null:ref4,index:null==(ref6=null==(ref7=this.index)?void 0:ref7.ast(o))?null:ref6,step:null==(ref8=null==(ref9=this.step)?void 0:ref9.ast(o))?null:ref8,postfix:!!this.postfix,own:!!this.own,await:!!this[\"await\"],style:function(){switch(!1){case!this.from:return\"from\";case!this.object:return\"of\";case!this.name:return\"in\";default:return\"range\";}}.call(this)}}}]),For}(While);return For.prototype.children=[\"body\",\"source\",\"guard\",\"step\"],For}.call(this),exports.Switch=Switch=function(){var Switch=function(_Base57){function Switch(subject,cases1,otherwise){var _this81;return _classCallCheck(this,Switch),_this81=_super92.call(this),_this81.subject=subject,_this81.cases=cases1,_this81.otherwise=otherwise,_this81}_inherits(Switch,_Base57);var _super92=_createSuper(Switch);return _createClass(Switch,[{key:\"jumps\",value:function jumps(){var o=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{block:!0},block,j,jumpNode,len1,ref1,ref2;for(ref1=this.cases,j=0,len1=ref1.length;j<len1;j++)if(block=ref1[j].block,jumpNode=block.jumps(o))return jumpNode;return null==(ref2=this.otherwise)?void 0:ref2.jumps(o)}},{key:\"makeReturn\",value:function makeReturn(results,mark){var block,j,len1,ref1,ref2;for(ref1=this.cases,j=0,len1=ref1.length;j<len1;j++)block=ref1[j].block,block.makeReturn(results,mark);return results&&(this.otherwise||(this.otherwise=new Block([new Literal(\"void 0\")]))),null!=(ref2=this.otherwise)&&ref2.makeReturn(results,mark),this}},{key:\"compileNode\",value:function compileNode(o){var block,body,cond,conditions,expr,fragments,i,idt1,idt2,j,k,len1,len2,ref1,ref2;for(idt1=o.indent+TAB,idt2=o.indent=idt1+TAB,fragments=[].concat(this.makeCode(this.tab+\"switch (\"),this.subject?this.subject.compileToFragments(o,LEVEL_PAREN):this.makeCode(\"false\"),this.makeCode(\") {\\n\")),ref1=this.cases,(i=j=0,len1=ref1.length);j<len1;i=++j){var _ref1$i=ref1[i];for(conditions=_ref1$i.conditions,block=_ref1$i.block,ref2=flatten([conditions]),(k=0,len2=ref2.length);k<len2;k++)cond=ref2[k],this.subject||(cond=cond.invert()),fragments=fragments.concat(this.makeCode(idt1+\"case \"),cond.compileToFragments(o,LEVEL_PAREN),this.makeCode(\":\\n\"));if(0<(body=block.compileToFragments(o,LEVEL_TOP)).length&&(fragments=fragments.concat(body,this.makeCode(\"\\n\"))),i===this.cases.length-1&&!this.otherwise)break;(expr=this.lastNode(block.expressions),!(expr instanceof Return||expr instanceof Throw||expr instanceof Literal&&expr.jumps()&&\"debugger\"!==expr.value))&&fragments.push(cond.makeCode(idt2+\"break;\\n\"))}if(this.otherwise&&this.otherwise.expressions.length){var _fragments13;(_fragments13=fragments).push.apply(_fragments13,[this.makeCode(idt1+\"default:\\n\")].concat(_toConsumableArray(this.otherwise.compileToFragments(o,LEVEL_TOP)),[this.makeCode(\"\\n\")]))}return fragments.push(this.makeCode(this.tab+\"}\")),fragments}},{key:\"astType\",value:function astType(){return\"SwitchStatement\"}},{key:\"casesAst\",value:function casesAst(o){var caseIndex,caseLocationData,cases,consequent,j,k,kase,l,lastTestIndex,len1,len2,len3,ref1,ref2,results1,test,testConsequent,testIndex,tests;for(cases=[],ref1=this.cases,(caseIndex=j=0,len1=ref1.length);j<len1;caseIndex=++j){kase=ref1[caseIndex];var _kase=kase;for(tests=_kase.conditions,consequent=_kase.block,tests=flatten([tests]),lastTestIndex=tests.length-1,(testIndex=k=0,len2=tests.length);k<len2;testIndex=++k)test=tests[testIndex],testConsequent=testIndex===lastTestIndex?consequent:null,caseLocationData=test.locationData,(null==testConsequent?void 0:testConsequent.expressions.length)&&(caseLocationData=mergeLocationData(caseLocationData,testConsequent.expressions[testConsequent.expressions.length-1].locationData)),0===testIndex&&(caseLocationData=mergeLocationData(caseLocationData,kase.locationData,{justLeading:!0})),testIndex===lastTestIndex&&(caseLocationData=mergeLocationData(caseLocationData,kase.locationData,{justEnding:!0})),cases.push(new SwitchCase(test,testConsequent,{trailing:testIndex===lastTestIndex}).withLocationDataFrom({locationData:caseLocationData}))}for((null==(ref2=this.otherwise)?void 0:ref2.expressions.length)&&cases.push(new SwitchCase(null,this.otherwise).withLocationDataFrom(this.otherwise)),results1=[],(l=0,len3=cases.length);l<len3;l++)kase=cases[l],results1.push(kase.ast(o));return results1}},{key:\"astProperties\",value:function astProperties(o){var ref1,ref2;return{discriminant:null==(ref1=null==(ref2=this.subject)?void 0:ref2.ast(o,LEVEL_PAREN))?null:ref1,cases:this.casesAst(o)}}}]),Switch}(Base);return Switch.prototype.children=[\"subject\",\"cases\",\"otherwise\"],Switch.prototype.isStatement=YES,Switch}.call(this),SwitchCase=function(){var SwitchCase=function(_Base58){function SwitchCase(test1,block1){var _ref66=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},trailing=_ref66.trailing,_this82;return _classCallCheck(this,SwitchCase),_this82=_super93.call(this),_this82.test=test1,_this82.block=block1,_this82.trailing=trailing,_this82}_inherits(SwitchCase,_Base58);var _super93=_createSuper(SwitchCase);return _createClass(SwitchCase,[{key:\"astProperties\",value:function astProperties(o){var ref1,ref2,ref3,ref4;return{test:null==(ref1=null==(ref2=this.test)?void 0:ref2.ast(o,LEVEL_PAREN))?null:ref1,consequent:null==(ref3=null==(ref4=this.block)?void 0:ref4.ast(o,LEVEL_TOP).body)?[]:ref3,trailing:!!this.trailing}}}]),SwitchCase}(Base);return SwitchCase.prototype.children=[\"test\",\"block\"],SwitchCase}.call(this),exports.SwitchWhen=SwitchWhen=function(){var SwitchWhen=function(_Base59){function SwitchWhen(conditions1,block1){var _this83;return _classCallCheck(this,SwitchWhen),_this83=_super94.call(this),_this83.conditions=conditions1,_this83.block=block1,_this83}_inherits(SwitchWhen,_Base59);var _super94=_createSuper(SwitchWhen);return _createClass(SwitchWhen)}(Base);return SwitchWhen.prototype.children=[\"conditions\",\"block\"],SwitchWhen}.call(this),exports.If=If=function(){var If=function(_Base60){function If(condition1,body1){var options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_this84;return _classCallCheck(this,If),_this84=_super95.call(this),_this84.condition=condition1,_this84.body=body1,_this84.elseBody=null,_this84.isChain=!1,_this84.soak=options.soak,_this84.postfix=options.postfix,_this84.type=options.type,_this84.condition.comments&&moveComments(_this84.condition,_assertThisInitialized(_this84)),_this84}_inherits(If,_Base60);var _super95=_createSuper(If);return _createClass(If,[{key:\"bodyNode\",value:function bodyNode(){var ref1;return null==(ref1=this.body)?void 0:ref1.unwrap()}},{key:\"elseBodyNode\",value:function elseBodyNode(){var ref1;return null==(ref1=this.elseBody)?void 0:ref1.unwrap()}},{key:\"addElse\",value:function addElse(elseBody){return this.isChain?(this.elseBodyNode().addElse(elseBody),this.locationData=mergeLocationData(this.locationData,this.elseBodyNode().locationData)):(this.isChain=elseBody instanceof If,this.elseBody=this.ensureBlock(elseBody),this.elseBody.updateLocationDataIfMissing(elseBody.locationData),null!=this.locationData&&null!=this.elseBody.locationData&&(this.locationData=mergeLocationData(this.locationData,this.elseBody.locationData))),this}},{key:\"isStatement\",value:function isStatement(o){var ref1;return(null==o?void 0:o.level)===LEVEL_TOP||this.bodyNode().isStatement(o)||(null==(ref1=this.elseBodyNode())?void 0:ref1.isStatement(o))}},{key:\"jumps\",value:function jumps(o){var ref1;return this.body.jumps(o)||(null==(ref1=this.elseBody)?void 0:ref1.jumps(o))}},{key:\"compileNode\",value:function compileNode(o){return this.isStatement(o)?this.compileStatement(o):this.compileExpression(o)}},{key:\"makeReturn\",value:function makeReturn(results,mark){var ref1,ref2;return mark?(null!=(ref1=this.body)&&ref1.makeReturn(results,mark),void(null!=(ref2=this.elseBody)&&ref2.makeReturn(results,mark))):(results&&(this.elseBody||(this.elseBody=new Block([new Literal(\"void 0\")]))),this.body&&(this.body=new Block([this.body.makeReturn(results)])),this.elseBody&&(this.elseBody=new Block([this.elseBody.makeReturn(results)])),this)}},{key:\"ensureBlock\",value:function ensureBlock(node){return node instanceof Block?node:new Block([node])}},{key:\"compileStatement\",value:function compileStatement(o){var answer,body,child,cond,exeq,ifPart,indent;return(child=del(o,\"chainChild\"),exeq=del(o,\"isExistentialEquals\"),exeq)?new If(this.processedCondition().invert(),this.elseBodyNode(),{type:\"if\"}).compileToFragments(o):(indent=o.indent+TAB,cond=this.processedCondition().compileToFragments(o,LEVEL_PAREN),body=this.ensureBlock(this.body).compileToFragments(merge(o,{indent:indent})),ifPart=[].concat(this.makeCode(\"if (\"),cond,this.makeCode(\") {\\n\"),body,this.makeCode(\"\\n\".concat(this.tab,\"}\"))),child||ifPart.unshift(this.makeCode(this.tab)),!this.elseBody)?ifPart:(answer=ifPart.concat(this.makeCode(\" else \")),this.isChain?(o.chainChild=!0,answer=answer.concat(this.elseBody.unwrap().compileToFragments(o,LEVEL_TOP))):answer=answer.concat(this.makeCode(\"{\\n\"),this.elseBody.compileToFragments(merge(o,{indent:indent}),LEVEL_TOP),this.makeCode(\"\\n\".concat(this.tab,\"}\"))),answer)}},{key:\"compileExpression\",value:function compileExpression(o){var alt,body,cond,fragments;return cond=this.processedCondition().compileToFragments(o,LEVEL_COND),body=this.bodyNode().compileToFragments(o,LEVEL_LIST),alt=this.elseBodyNode()?this.elseBodyNode().compileToFragments(o,LEVEL_LIST):[this.makeCode(\"void 0\")],fragments=cond.concat(this.makeCode(\" ? \"),body,this.makeCode(\" : \"),alt),o.level>=LEVEL_COND?this.wrapInParentheses(fragments):fragments}},{key:\"unfoldSoak\",value:function unfoldSoak(){return this.soak&&this}},{key:\"processedCondition\",value:function processedCondition(){return null==this.processedConditionCache?this.processedConditionCache=\"unless\"===this.type?this.condition.invert():this.condition:this.processedConditionCache}},{key:\"isStatementAst\",value:function isStatementAst(o){return o.level===LEVEL_TOP}},{key:\"astType\",value:function astType(o){return this.isStatementAst(o)?\"IfStatement\":\"ConditionalExpression\"}},{key:\"astProperties\",value:function astProperties(o){var isStatement,ref1,ref2,ref3,ref4;return isStatement=this.isStatementAst(o),{test:this.condition.ast(o,isStatement?LEVEL_PAREN:LEVEL_COND),consequent:isStatement?this.body.ast(o,LEVEL_TOP):this.bodyNode().ast(o,LEVEL_TOP),alternate:this.isChain?this.elseBody.unwrap().ast(o,isStatement?LEVEL_TOP:LEVEL_COND):isStatement||1!==(null==(ref1=this.elseBody)||null==(ref2=ref1.expressions)?void 0:ref2.length)?null==(ref3=null==(ref4=this.elseBody)?void 0:ref4.ast(o,LEVEL_TOP))?null:ref3:this.elseBody.expressions[0].ast(o,LEVEL_TOP),postfix:!!this.postfix,inverted:\"unless\"===this.type}}}]),If}(Base);return If.prototype.children=[\"condition\",\"body\",\"elseBody\"],If}.call(this),exports.Sequence=Sequence=function(){var Sequence=function(_Base61){function Sequence(expressions1){var _this85;return _classCallCheck(this,Sequence),_this85=_super96.call(this),_this85.expressions=expressions1,_this85}_inherits(Sequence,_Base61);var _super96=_createSuper(Sequence);return _createClass(Sequence,[{key:\"astNode\",value:function astNode(o){return 1===this.expressions.length?this.expressions[0].ast(o):_get(_getPrototypeOf(Sequence.prototype),\"astNode\",this).call(this,o)}},{key:\"astType\",value:function astType(){return\"SequenceExpression\"}},{key:\"astProperties\",value:function astProperties(o){var expression;return{expressions:function(){var j,len1,ref1,results1;for(ref1=this.expressions,results1=[],(j=0,len1=ref1.length);j<len1;j++)expression=ref1[j],results1.push(expression.ast(o));return results1}.call(this)}}}]),Sequence}(Base);return Sequence.prototype.children=[\"expressions\"],Sequence}.call(this),UTILITIES={modulo:function modulo(){return\"function(a, b) { return (+a % (b = +b) + b) % b; }\"},boundMethodCheck:function boundMethodCheck(){return\"function(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new Error('Bound instance method accessed before binding'); } }\"},hasProp:function hasProp(){return\"{}.hasOwnProperty\"},indexOf:function(){return\"[].indexOf\"},slice:function slice(){return\"[].slice\"},splice:function(){return\"[].splice\"}},LEVEL_TOP=1,LEVEL_PAREN=2,LEVEL_LIST=3,LEVEL_COND=4,LEVEL_OP=5,LEVEL_ACCESS=6,TAB=\"  \",SIMPLENUM=/^[+-]?\\d+(?:_\\d+)*$/,SIMPLE_STRING_OMIT=/\\s*\\n\\s*/g,LEADING_BLANK_LINE=/^[^\\n\\S]*\\n/,TRAILING_BLANK_LINE=/\\n[^\\n\\S]*$/,STRING_OMIT=/((?:\\\\\\\\)+)|\\\\[^\\S\\n]*\\n\\s*/g,HEREGEX_OMIT=/((?:\\\\\\\\)+)|\\\\(\\s)|\\s+(?:#.*)?/g,utility=function(name,o){var ref,root;return root=o.scope.root,name in root.utilities?root.utilities[name]:(ref=root.freeVariable(name),root.assign(ref,UTILITIES[name](o)),root.utilities[name]=ref)},multident=function(code,tab){var includingFirstLine=!(2<arguments.length&&void 0!==arguments[2])||arguments[2],endsWithNewLine;return endsWithNewLine=\"\\n\"===code[code.length-1],code=(includingFirstLine?tab:\"\")+code.replace(/\\n/g,\"$&\".concat(tab)),code=code.replace(/\\s+$/,\"\"),endsWithNewLine&&(code+=\"\\n\"),code},indentInitial=function(fragments,node){var fragment,fragmentIndex,j,len1;for(fragmentIndex=j=0,len1=fragments.length;j<len1;fragmentIndex=++j)if(fragment=fragments[fragmentIndex],fragment.isHereComment)fragment.code=multident(fragment.code,node.tab);else{fragments.splice(fragmentIndex,0,node.makeCode(\"\".concat(node.tab)));break}return fragments},hasLineComments=function(node){var comment,j,len1,ref1;if(!node.comments)return!1;for(ref1=node.comments,j=0,len1=ref1.length;j<len1;j++)if(comment=ref1[j],!1===comment.here)return!0;return!1},moveComments=function(from,to){if(null!=from&&from.comments)return attachCommentsToNode(from.comments,to),delete from.comments},unshiftAfterComments=function(fragments,fragmentToInsert){var fragment,fragmentIndex,inserted,j,len1;for(inserted=!1,fragmentIndex=j=0,len1=fragments.length;j<len1;fragmentIndex=++j)if(fragment=fragments[fragmentIndex],!!!fragment.isComment){fragments.splice(fragmentIndex,0,fragmentToInsert),inserted=!0;break}return inserted||fragments.push(fragmentToInsert),fragments},isLiteralArguments=function(node){return node instanceof IdentifierLiteral&&\"arguments\"===node.value},isLiteralThis=function(node){return node instanceof ThisLiteral||node instanceof Code&&node.bound},shouldCacheOrIsAssignable=function(node){return node.shouldCache()||(\"function\"==typeof node.isAssignable?node.isAssignable():void 0)},_unfoldSoak=function(o,parent,name){var ifn;if(ifn=parent[name].unfoldSoak(o))return parent[name]=ifn.body,ifn.body=new Value(parent),ifn},makeDelimitedLiteral=function(body){var _ref67=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},delimiterOption=_ref67.delimiter,escapeNewlines=_ref67.escapeNewlines,_double2=_ref67.double,_ref67$includeDelimit=_ref67.includeDelimiters,_ref67$escapeDelimite=_ref67.escapeDelimiter,escapeDelimiter=void 0===_ref67$escapeDelimite||_ref67$escapeDelimite,convertTrailingNullEscapes=_ref67.convertTrailingNullEscapes,escapeTemplateLiteralCurlies,printedDelimiter,regex;return\"\"===body&&\"/\"===delimiterOption&&(body=\"(?:)\"),escapeTemplateLiteralCurlies=\"`\"===delimiterOption,regex=RegExp(\"(\\\\\\\\\\\\\\\\)|(\\\\\\\\0(?=\\\\d))\".concat(convertTrailingNullEscapes?/|(\\\\0)$/.source:\"\").concat(escapeDelimiter?RegExp(\"|\\\\\\\\?(\".concat(delimiterOption,\")\")).source:\"\").concat(escapeTemplateLiteralCurlies?/|\\\\?(\\$\\{)/.source:\"\",\"|\\\\\\\\?(?:\").concat(escapeNewlines?\"(\\n)|\":\"\",\"(\\\\r)|(\\\\u2028)|(\\\\u2029))|(\\\\\\\\.)\"),\"g\"),body=body.replace(regex,function(match,backslash,nul){for(var _len2=arguments.length,args=Array(3<_len2?_len2-3:0),_key2=3,cr,delimiter,lf,ls,other,ps,templateLiteralCurly,trailingNullEscape;_key2<_len2;_key2++)args[_key2-3]=arguments[_key2];switch(trailingNullEscape=convertTrailingNullEscapes?args.shift():void 0,delimiter=escapeDelimiter?args.shift():void 0,templateLiteralCurly=escapeTemplateLiteralCurlies?args.shift():void 0,lf=escapeNewlines?args.shift():void 0,cr=args[0],ls=args[1],ps=args[2],other=args[3],!1){case!backslash:return _double2?backslash+backslash:backslash;case!nul:return\"\\\\x00\";case!trailingNullEscape:return\"\\\\x00\";case!delimiter:return\"\\\\\".concat(delimiter);case!templateLiteralCurly:return\"\\\\${\";case!lf:return\"\\\\n\";case!cr:return\"\\\\r\";case!ls:return\"\\\\u2028\";case!ps:return\"\\\\u2029\";case!other:return _double2?\"\\\\\".concat(other):other;}}),printedDelimiter=void 0===_ref67$includeDelimit||_ref67$includeDelimit?delimiterOption:\"\",\"\".concat(printedDelimiter).concat(body).concat(printedDelimiter)},sniffDirectives=function(expressions){var _ref68=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},notFinalExpression=_ref68.notFinalExpression,expression,index,lastIndex,results1,unwrapped;for(index=0,lastIndex=expressions.length-1,results1=[];index<=lastIndex&&!(index===lastIndex&&notFinalExpression);){if(expression=expressions[index],(unwrapped=null==expression?void 0:\"function\"==typeof expression.unwrap?expression.unwrap():void 0)instanceof PassthroughLiteral&&unwrapped.generated){index++;continue}if(!(expression instanceof Value&&expression.isString()&&!expression.unwrap().shouldGenerateTemplateLiteral()))break;expressions[index]=new Directive(expression).withLocationDataFrom(expression),results1.push(index++)}return results1},astAsBlockIfNeeded=function(node,o){var unwrapped;return unwrapped=node.unwrap(),unwrapped instanceof Block&&1<unwrapped.expressions.length?(unwrapped.makeReturn(null,!0),unwrapped.ast(o,LEVEL_TOP)):node.ast(o,LEVEL_PAREN)},lesser=function(a,b){return a<b?a:b},greater=function(a,b){return a>b?a:b},isAstLocGreater=function(a,b){return!!(a.line>b.line)||a.line===b.line&&a.column>b.column},isLocationDataStartGreater=function(a,b){return!!(a.first_line>b.first_line)||a.first_line===b.first_line&&a.first_column>b.first_column},isLocationDataEndGreater=function(a,b){return!!(a.last_line>b.last_line)||a.last_line===b.last_line&&a.last_column>b.last_column},exports.mergeLocationData=mergeLocationData=function(locationDataA,locationDataB){var _ref69=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},justLeading=_ref69.justLeading,justEnding=_ref69.justEnding;return Object.assign(justEnding?{first_line:locationDataA.first_line,first_column:locationDataA.first_column}:isLocationDataStartGreater(locationDataA,locationDataB)?{first_line:locationDataB.first_line,first_column:locationDataB.first_column}:{first_line:locationDataA.first_line,first_column:locationDataA.first_column},justLeading?{last_line:locationDataA.last_line,last_column:locationDataA.last_column,last_line_exclusive:locationDataA.last_line_exclusive,last_column_exclusive:locationDataA.last_column_exclusive}:isLocationDataEndGreater(locationDataA,locationDataB)?{last_line:locationDataA.last_line,last_column:locationDataA.last_column,last_line_exclusive:locationDataA.last_line_exclusive,last_column_exclusive:locationDataA.last_column_exclusive}:{last_line:locationDataB.last_line,last_column:locationDataB.last_column,last_line_exclusive:locationDataB.last_line_exclusive,last_column_exclusive:locationDataB.last_column_exclusive},{range:[justEnding?locationDataA.range[0]:lesser(locationDataA.range[0],locationDataB.range[0]),justLeading?locationDataA.range[1]:greater(locationDataA.range[1],locationDataB.range[1])]})},exports.mergeAstLocationData=mergeAstLocationData=function(nodeA,nodeB){var _ref70=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},justLeading=_ref70.justLeading,justEnding=_ref70.justEnding;return{loc:{start:justEnding?nodeA.loc.start:isAstLocGreater(nodeA.loc.start,nodeB.loc.start)?nodeB.loc.start:nodeA.loc.start,end:justLeading?nodeA.loc.end:isAstLocGreater(nodeA.loc.end,nodeB.loc.end)?nodeA.loc.end:nodeB.loc.end},range:[justEnding?nodeA.range[0]:lesser(nodeA.range[0],nodeB.range[0]),justLeading?nodeA.range[1]:greater(nodeA.range[1],nodeB.range[1])],start:justEnding?nodeA.start:lesser(nodeA.start,nodeB.start),end:justLeading?nodeA.end:greater(nodeA.end,nodeB.end)}},exports.jisonLocationDataToAstLocationData=jisonLocationDataToAstLocationData=function(_ref71){var first_line=_ref71.first_line,first_column=_ref71.first_column,last_line_exclusive=_ref71.last_line_exclusive,last_column_exclusive=_ref71.last_column_exclusive,range=_ref71.range;return{loc:{start:{line:first_line+1,column:first_column},end:{line:last_line_exclusive+1,column:last_column_exclusive}},range:[range[0],range[1]],start:range[0],end:range[1]}},zeroWidthLocationDataFromEndLocation=function(_ref72){var _ref72$range=_slicedToArray(_ref72.range,2),endRange=_ref72$range[1],last_line_exclusive=_ref72.last_line_exclusive,last_column_exclusive=_ref72.last_column_exclusive;return{first_line:last_line_exclusive,first_column:last_column_exclusive,last_line:last_line_exclusive,last_column:last_column_exclusive,last_line_exclusive:last_line_exclusive,last_column_exclusive:last_column_exclusive,range:[endRange,endRange]}},extractSameLineLocationDataFirst=function(numChars){return function(_ref73){var _ref73$range=_slicedToArray(_ref73.range,1),startRange=_ref73$range[0],first_line=_ref73.first_line,first_column=_ref73.first_column;return{first_line:first_line,first_column:first_column,last_line:first_line,last_column:first_column+numChars-1,last_line_exclusive:first_line,last_column_exclusive:first_column+numChars,range:[startRange,startRange+numChars]}}},extractSameLineLocationDataLast=function(numChars){return function(_ref74){var _ref74$range=_slicedToArray(_ref74.range,2),endRange=_ref74$range[1],last_line=_ref74.last_line,last_column=_ref74.last_column,last_line_exclusive=_ref74.last_line_exclusive,last_column_exclusive=_ref74.last_column_exclusive;return{first_line:last_line,first_column:last_column-(numChars-1),last_line:last_line,last_column:last_column,last_line_exclusive:last_line_exclusive,last_column_exclusive:last_column_exclusive,range:[endRange-numChars,endRange]}}},emptyExpressionLocationData=function(_ref75){var element=_ref75.interpolationNode,openingBrace=_ref75.openingBrace,closingBrace=_ref75.closingBrace;return{first_line:element.locationData.first_line,first_column:element.locationData.first_column+openingBrace.length,last_line:element.locationData.last_line,last_column:element.locationData.last_column-closingBrace.length,last_line_exclusive:element.locationData.last_line,last_column_exclusive:element.locationData.last_column,range:[element.locationData.range[0]+openingBrace.length,element.locationData.range[1]-closingBrace.length]}}}.call(this),{exports:exports}.exports}(),require[\"./sourcemap\"]=function(){var module={exports:{}};return function(){var LineMap,SourceMap;LineMap=function(){function LineMap(line1){_classCallCheck(this,LineMap),this.line=line1,this.columns=[]}return _createClass(LineMap,[{key:\"add\",value:function add(column,_ref76){var _ref77=_slicedToArray(_ref76,2),sourceLine=_ref77[0],sourceColumn=_ref77[1],options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};return this.columns[column]&&options.noReplace?void 0:this.columns[column]={line:this.line,column:column,sourceLine:sourceLine,sourceColumn:sourceColumn}}},{key:\"sourceLocation\",value:function sourceLocation(column){for(var mapping;!((mapping=this.columns[column])||0>=column);)column--;return mapping&&[mapping.sourceLine,mapping.sourceColumn]}}]),LineMap}(),SourceMap=function(){var SourceMap=function(){function SourceMap(){_classCallCheck(this,SourceMap),this.lines=[]}return _createClass(SourceMap,[{key:\"add\",value:function add(sourceLocation,generatedLocation){var options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},_generatedLocation=_slicedToArray(generatedLocation,2),base,column,line,lineMap;return line=_generatedLocation[0],column=_generatedLocation[1],lineMap=(base=this.lines)[line]||(base[line]=new LineMap(line)),lineMap.add(column,sourceLocation,options)}},{key:\"sourceLocation\",value:function sourceLocation(_ref78){for(var _ref79=_slicedToArray(_ref78,2),line=_ref79[0],column=_ref79[1],lineMap;!((lineMap=this.lines[line])||0>=line);)line--;return lineMap&&lineMap.sourceLocation(column)}},{key:\"generate\",value:function generate(){var options=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},code=1<arguments.length&&void 0!==arguments[1]?arguments[1]:null,buffer,i,j,lastColumn,lastSourceColumn,lastSourceLine,len,len1,lineMap,lineNumber,mapping,needComma,ref,ref1,sources,v3,writingline;for(writingline=0,lastColumn=0,lastSourceLine=0,lastSourceColumn=0,needComma=!1,buffer=\"\",ref=this.lines,(lineNumber=i=0,len=ref.length);i<len;lineNumber=++i)if(lineMap=ref[lineNumber],lineMap)for(ref1=lineMap.columns,j=0,len1=ref1.length;j<len1;j++)if(mapping=ref1[j],!!mapping){for(;writingline<mapping.line;)lastColumn=0,needComma=!1,buffer+=\";\",writingline++;needComma&&(buffer+=\",\",needComma=!1),buffer+=this.encodeVlq(mapping.column-lastColumn),lastColumn=mapping.column,buffer+=this.encodeVlq(0),buffer+=this.encodeVlq(mapping.sourceLine-lastSourceLine),lastSourceLine=mapping.sourceLine,buffer+=this.encodeVlq(mapping.sourceColumn-lastSourceColumn),lastSourceColumn=mapping.sourceColumn,needComma=!0}return sources=options.sourceFiles?options.sourceFiles:options.filename?[options.filename]:[\"<anonymous>\"],v3={version:3,file:options.generatedFile||\"\",sourceRoot:options.sourceRoot||\"\",sources:sources,names:[],mappings:buffer},(options.sourceMap||options.inlineMap)&&(v3.sourcesContent=[code]),v3}},{key:\"encodeVlq\",value:function encodeVlq(value){var answer,nextChunk,signBit,valueToEncode;for(answer=\"\",signBit=0>value?1:0,valueToEncode=(_Mathabs(value)<<1)+signBit;valueToEncode||!answer;)nextChunk=valueToEncode&VLQ_VALUE_MASK,valueToEncode>>=VLQ_SHIFT,valueToEncode&&(nextChunk|=VLQ_CONTINUATION_BIT),answer+=this.encodeBase64(nextChunk);return answer}},{key:\"encodeBase64\",value:function encodeBase64(value){return BASE64_CHARS[value]||function(){throw new Error(\"Cannot Base64 encode value: \".concat(value))}()}}],[{key:\"registerCompiled\",value:function registerCompiled(filename,source,sourcemap){if(null!=sourcemap)return SourceMap.sourceMaps[filename]=sourcemap}},{key:\"getSourceMap\",value:function getSourceMap(filename){return SourceMap.sourceMaps[filename]}}]),SourceMap}(),BASE64_CHARS,VLQ_CONTINUATION_BIT,VLQ_SHIFT,VLQ_VALUE_MASK;return SourceMap.sourceMaps=Object.create(null),VLQ_SHIFT=5,VLQ_CONTINUATION_BIT=1<<VLQ_SHIFT,VLQ_VALUE_MASK=VLQ_CONTINUATION_BIT-1,BASE64_CHARS=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",SourceMap}.call(this),module.exports=SourceMap}.call(this),module.exports}(),require[\"./coffeescript\"]=function(){var exports={};return function(){var _require7=require(\"./lexer\"),FILE_EXTENSIONS,Lexer,SourceMap,base64encode,checkShebangLine,compile,getSourceMap,helpers,lexer,packageJson,parser,registerCompiled,withPrettyErrors;Lexer=_require7.Lexer;var _require8=require(\"./parser\");parser=_require8.parser,helpers=require(\"./helpers\"),SourceMap=require(\"./sourcemap\"),packageJson=require(\"../../package.json\"),exports.VERSION=packageJson.version,exports.FILE_EXTENSIONS=FILE_EXTENSIONS=[\".coffee\",\".litcoffee\",\".coffee.md\"],exports.helpers=helpers;var _SourceMap=SourceMap;getSourceMap=_SourceMap.getSourceMap,registerCompiled=_SourceMap.registerCompiled,exports.registerCompiled=registerCompiled,base64encode=function(src){switch(!1){case\"function\"!=typeof Buffer:return Buffer.from(src).toString(\"base64\");case\"function\"!=typeof btoa:return btoa(encodeURIComponent(src).replace(/%([0-9A-F]{2})/g,function(match,p1){return _StringfromCharCode(\"0x\"+p1)}));default:throw new Error(\"Unable to base64 encode inline sourcemap.\");}},withPrettyErrors=function(fn){return function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},err;try{return fn.call(this,code,options)}catch(error){if(err=error,\"string\"!=typeof code)throw err;throw helpers.updateSyntaxError(err,code,options.filename)}}},exports.compile=compile=withPrettyErrors(function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},ast,currentColumn,currentLine,encoded,filename,fragment,fragments,generateSourceMap,header,i,j,js,len,len1,map,newLines,nodes,range,ref,sourceCodeLastLine,sourceCodeNumberOfLines,sourceMapDataURI,sourceURL,token,tokens,transpiler,transpilerOptions,transpilerOutput,v3SourceMap;if(options=Object.assign({},options),generateSourceMap=options.sourceMap||options.inlineMap||null==options.filename,filename=options.filename||helpers.anonymousFileName(),checkShebangLine(filename,code),generateSourceMap&&(map=new SourceMap),tokens=lexer.tokenize(code,options),options.referencedVars=function(){var i,len,results;for(results=[],i=0,len=tokens.length;i<len;i++)token=tokens[i],\"IDENTIFIER\"===token[0]&&results.push(token[1]);return results}(),null==options.bare||!0!==options.bare)for(i=0,len=tokens.length;i<len;i++)if(token=tokens[i],\"IMPORT\"===(ref=token[0])||\"EXPORT\"===ref){options.bare=!0;break}if(nodes=parser.parse(tokens),options.ast)return nodes.allCommentTokens=helpers.extractAllCommentTokens(tokens),sourceCodeNumberOfLines=(code.match(/\\r?\\n/g)||\"\").length+1,sourceCodeLastLine=/.*$/.exec(code)[0],ast=nodes.ast(options),range=[0,code.length],ast.start=ast.program.start=range[0],ast.end=ast.program.end=range[1],ast.range=ast.program.range=range,ast.loc.start=ast.program.loc.start={line:1,column:0},ast.loc.end.line=ast.program.loc.end.line=sourceCodeNumberOfLines,ast.loc.end.column=ast.program.loc.end.column=sourceCodeLastLine.length,ast.tokens=tokens,ast;for(fragments=nodes.compileToFragments(options),currentLine=0,options.header&&(currentLine+=1),options.shiftLine&&(currentLine+=1),currentColumn=0,js=\"\",(j=0,len1=fragments.length);j<len1;j++)fragment=fragments[j],generateSourceMap&&(fragment.locationData&&!/^[;\\s]*$/.test(fragment.code)&&map.add([fragment.locationData.first_line,fragment.locationData.first_column],[currentLine,currentColumn],{noReplace:!0}),newLines=helpers.count(fragment.code,\"\\n\"),currentLine+=newLines,newLines?currentColumn=fragment.code.length-(fragment.code.lastIndexOf(\"\\n\")+1):currentColumn+=fragment.code.length),js+=fragment.code;if(options.header&&(header=\"Generated by CoffeeScript \".concat(this.VERSION),js=\"// \".concat(header,\"\\n\").concat(js)),generateSourceMap&&(v3SourceMap=map.generate(options,code)),options.transpile){if(\"object\"!==_typeof(options.transpile))throw new Error(\"The transpile option must be given an object with options to pass to Babel\");transpiler=options.transpile.transpile,delete options.transpile.transpile,transpilerOptions=Object.assign({},options.transpile),v3SourceMap&&null==transpilerOptions.inputSourceMap&&(transpilerOptions.inputSourceMap=v3SourceMap),transpilerOutput=transpiler(js,transpilerOptions),js=transpilerOutput.code,v3SourceMap&&transpilerOutput.map&&(v3SourceMap=transpilerOutput.map)}return options.inlineMap&&(encoded=base64encode(JSON.stringify(v3SourceMap)),sourceMapDataURI=\"//# sourceMappingURL=data:application/json;base64,\".concat(encoded),sourceURL=\"//# sourceURL=\".concat(filename),js=\"\".concat(js,\"\\n\").concat(sourceMapDataURI,\"\\n\").concat(sourceURL)),registerCompiled(filename,code,map),options.sourceMap?{js:js,sourceMap:map,v3SourceMap:JSON.stringify(v3SourceMap,null,2)}:js}),exports.tokens=withPrettyErrors(function(code,options){return lexer.tokenize(code,options)}),exports.nodes=withPrettyErrors(function(source,options){return\"string\"==typeof source&&(source=lexer.tokenize(source,options)),parser.parse(source)}),exports.run=exports.eval=exports.register=function(){throw new Error(\"require index.coffee, not this file\")},lexer=new Lexer,parser.lexer={yylloc:{range:[]},options:{ranges:!0},lex:function lex(){var tag,token;if(token=parser.tokens[this.pos++],token){var _token6=token,_token7=_slicedToArray(_token6,3);tag=_token7[0],this.yytext=_token7[1],this.yylloc=_token7[2],parser.errorToken=token.origin||token,this.yylineno=this.yylloc.first_line}else tag=\"\";return tag},setInput:function setInput(tokens){return parser.tokens=tokens,this.pos=0},upcomingInput:function upcomingInput(){return\"\"}},parser.yy=require(\"./nodes\"),parser.yy.parseError=function(message,_ref80){var token=_ref80.token,_parser=parser,errorLoc,errorTag,errorText,errorToken,tokens;errorToken=_parser.errorToken,tokens=_parser.tokens;var _errorToken=errorToken,_errorToken2=_slicedToArray(_errorToken,3);return errorTag=_errorToken2[0],errorText=_errorToken2[1],errorLoc=_errorToken2[2],errorText=function(){switch(!1){case errorToken!==tokens[tokens.length-1]:return\"end of input\";case\"INDENT\"!==errorTag&&\"OUTDENT\"!==errorTag:return\"indentation\";case\"IDENTIFIER\"!==errorTag&&\"NUMBER\"!==errorTag&&\"INFINITY\"!==errorTag&&\"STRING\"!==errorTag&&\"STRING_START\"!==errorTag&&\"REGEX\"!==errorTag&&\"REGEX_START\"!==errorTag:return errorTag.replace(/_START$/,\"\").toLowerCase();default:return helpers.nameWhitespaceCharacter(errorText);}}(),helpers.throwSyntaxError(\"unexpected \".concat(errorText),errorLoc)},exports.patchStackTrace=function(){var formatSourcePosition,getSourceMapping;return formatSourcePosition=function(frame,getSourceMapping){var as,column,fileLocation,filename,functionName,isConstructor,isMethodCall,line,methodName,source,tp,typeName;return filename=void 0,fileLocation=\"\",frame.isNative()?fileLocation=\"native\":(frame.isEval()?(filename=frame.getScriptNameOrSourceURL(),!filename&&(fileLocation=\"\".concat(frame.getEvalOrigin(),\", \"))):filename=frame.getFileName(),filename||(filename=\"<anonymous>\"),line=frame.getLineNumber(),column=frame.getColumnNumber(),source=getSourceMapping(filename,line,column),fileLocation=source?\"\".concat(filename,\":\").concat(source[0],\":\").concat(source[1]):\"\".concat(filename,\":\").concat(line,\":\").concat(column)),functionName=frame.getFunctionName(),isConstructor=frame.isConstructor(),isMethodCall=!(frame.isToplevel()||isConstructor),isMethodCall?(methodName=frame.getMethodName(),typeName=frame.getTypeName(),functionName?(tp=as=\"\",typeName&&functionName.indexOf(typeName)&&(tp=\"\".concat(typeName,\".\")),methodName&&functionName.indexOf(\".\".concat(methodName))!==functionName.length-methodName.length-1&&(as=\" [as \".concat(methodName,\"]\")),\"\".concat(tp).concat(functionName).concat(as,\" (\").concat(fileLocation,\")\")):\"\".concat(typeName,\".\").concat(methodName||\"<anonymous>\",\" (\").concat(fileLocation,\")\")):isConstructor?\"new \".concat(functionName||\"<anonymous>\",\" (\").concat(fileLocation,\")\"):functionName?\"\".concat(functionName,\" (\").concat(fileLocation,\")\"):fileLocation},getSourceMapping=function(filename,line,column){var answer,sourceMap;return sourceMap=getSourceMap(filename,line,column),null!=sourceMap&&(answer=sourceMap.sourceLocation([line-1,column-1])),null==answer?null:[answer[0]+1,answer[1]+1]},Error.prepareStackTrace=function(err,stack){var frame,frames;return frames=function(){var i,len,results;for(results=[],i=0,len=stack.length;i<len&&(frame=stack[i],frame.getFunction()!==exports.run);i++)results.push(\"    at \".concat(formatSourcePosition(frame,getSourceMapping)));return results}(),\"\".concat(err.toString(),\"\\n\").concat(frames.join(\"\\n\"),\"\\n\")}},checkShebangLine=function(file,input){var args,firstLine,ref,rest;if(firstLine=input.split(/$/m,1)[0],rest=null==firstLine?void 0:firstLine.match(/^#!\\s*([^\\s]+\\s*)(.*)/),args=null==rest||null==(ref=rest[2])?void 0:ref.split(/\\s/).filter(function(s){return\"\"!==s}),1<(null==args?void 0:args.length))return console.error(\"The script to be run begins with a shebang line with more than one\\nargument. This script will fail on platforms such as Linux which only\\nallow a single argument.\"),console.error(\"The shebang line was: '\".concat(firstLine,\"' in file '\").concat(file,\"'\")),console.error(\"The arguments were: \".concat(JSON.stringify(args)))}}.call(this),{exports:exports}.exports}(),require[\"./browser\"]=function(){var module={exports:{}};return function(){var indexOf=[].indexOf,CoffeeScript,compile;CoffeeScript=require(\"./coffeescript\");var _CoffeeScript=CoffeeScript;compile=_CoffeeScript.compile,CoffeeScript.eval=function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},globalRoot;return null==options.bare&&(options.bare=!0),globalRoot=\"undefined\"!=typeof window&&null!==window?window:global,globalRoot.eval(compile(code,options))},CoffeeScript.run=function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};return options.bare=!0,options.shiftLine=!0,Function(compile(code,options))()},module.exports=CoffeeScript,\"undefined\"==typeof window||null===window||(\"undefined\"!=typeof btoa&&null!==btoa&&\"undefined\"!=typeof JSON&&null!==JSON&&(compile=function(code){var options=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};return options.inlineMap=!0,CoffeeScript.compile(code,options)}),CoffeeScript.load=function(url,callback){var options=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{},hold=!!(3<arguments.length&&void 0!==arguments[3])&&arguments[3],xhr;return options.sourceFiles=[url],xhr=window.ActiveXObject?new window.ActiveXObject(\"Microsoft.XMLHTTP\"):new window.XMLHttpRequest,xhr.open(\"GET\",url,!0),\"overrideMimeType\"in xhr&&xhr.overrideMimeType(\"text/plain\"),xhr.onreadystatechange=function(){var param,ref;if(4===xhr.readyState){if(0!==(ref=xhr.status)&&200!==ref)throw new Error(\"Could not load \".concat(url));else if(param=[xhr.responseText,options],!hold){var _CoffeeScript2;(_CoffeeScript2=CoffeeScript).run.apply(_CoffeeScript2,_toConsumableArray(param))}if(callback)return callback(param)}},xhr.send(null)},CoffeeScript.runScripts=function(){var coffees,coffeetypes,_execute,i,index,j,len,s,script,scripts;for(scripts=window.document.getElementsByTagName(\"script\"),coffeetypes=[\"text/coffeescript\",\"text/literate-coffeescript\"],coffees=function(){var j,len,ref,results;for(results=[],j=0,len=scripts.length;j<len;j++)s=scripts[j],(ref=s.type,0<=indexOf.call(coffeetypes,ref))&&results.push(s);return results}(),index=0,_execute=function execute(){var param;if(param=coffees[index],param instanceof Array){var _CoffeeScript3;return(_CoffeeScript3=CoffeeScript).run.apply(_CoffeeScript3,_toConsumableArray(param)),index++,_execute()}},(i=j=0,len=coffees.length);j<len;i=++j)script=coffees[i],function(script,i){var options,source;return options={literate:script.type===coffeetypes[1]},source=script.src||script.getAttribute(\"data-src\"),source?(options.filename=source,CoffeeScript.load(source,function(param){return coffees[i]=param,_execute()},options,!0)):(options.filename=script.id&&\"\"!==script.id?script.id:\"coffeescript\".concat(0===i?\"\":i),options.sourceFiles=[\"embedded\"],coffees[i]=[script.innerHTML,options])}(script,i);return _execute()},this===window&&(window.addEventListener?window.addEventListener(\"DOMContentLoaded\",CoffeeScript.runScripts,!1):window.attachEvent(\"onload\",CoffeeScript.runScripts)))}.call(this),module.exports}(),require[\"./browser\"]}();export default CoffeeScript;var VERSION=CoffeeScript.VERSION,compile=CoffeeScript.compile,evaluate=CoffeeScript.eval,load=CoffeeScript.load,run=CoffeeScript.run,runScripts=CoffeeScript.runScripts;export{VERSION,compile,evaluate as eval,load,run,runScripts};"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"coffeescript\",\n  \"description\": \"Unfancy JavaScript\",\n  \"keywords\": [\n    \"javascript\",\n    \"language\",\n    \"coffeescript\",\n    \"compiler\"\n  ],\n  \"author\": \"Jeremy Ashkenas\",\n  \"version\": \"2.7.0\",\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">=6\"\n  },\n  \"directories\": {\n    \"lib\": \"./lib/coffeescript\"\n  },\n  \"main\": \"./lib/coffeescript/index\",\n  \"module\": \"./lib/coffeescript-browser-compiler-modern/coffeescript.js\",\n  \"browser\": \"./lib/coffeescript-browser-compiler-legacy/coffeescript.js\",\n  \"bin\": {\n    \"coffee\": \"./bin/coffee\",\n    \"cake\": \"./bin/cake\"\n  },\n  \"files\": [\n    \"bin\",\n    \"lib\",\n    \"register.js\",\n    \"repl.js\"\n  ],\n  \"scripts\": {\n    \"test\": \"node ./bin/cake test\",\n    \"test-harmony\": \"node --harmony ./bin/cake test\"\n  },\n  \"homepage\": \"https://coffeescript.org\",\n  \"bugs\": \"https://github.com/jashkenas/coffeescript/issues\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/jashkenas/coffeescript.git\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"~7.17.9\",\n    \"@babel/preset-env\": \"~7.16.11\",\n    \"babel-preset-minify\": \"~0.5.1\",\n    \"codemirror\": \"~5.65.3\",\n    \"docco\": \"~0.9.1\",\n    \"highlight.js\": \"~11.5.1\",\n    \"jison\": \"~0.4.18\",\n    \"markdown-it\": \"~13.0.0\",\n    \"puppeteer\": \"~13.6.0\",\n    \"underscore\": \"~1.13.3\",\n    \"webpack\": \"~5.72.0\"\n  }\n}\n"
  },
  {
    "path": "register.js",
    "content": "require('./lib/coffeescript/register');\n"
  },
  {
    "path": "repl.js",
    "content": "module.exports = require('./lib/coffeescript/repl');\n"
  },
  {
    "path": "src/browser.coffee",
    "content": "# This **Browser** compatibility layer extends core CoffeeScript functions\n# to make things work smoothly when compiling code directly in the browser.\n# We add support for loading remote Coffee scripts via **XHR**, and\n# `text/coffeescript` script tags, source maps via data-URLs, and so on.\n\nCoffeeScript = require './coffeescript'\n{ compile } = CoffeeScript\n\n# Use `window.eval` to evaluate code, rather than just `eval`, to run the\n# script in a clean global scope rather than inheriting the scope of the\n# CoffeeScript compiler. (So that `cake test:browser` also works in Node,\n# use either `window.eval` or `global.eval` as appropriate).\nCoffeeScript.eval = (code, options = {}) ->\n  options.bare ?= on\n  globalRoot = if window? then window else global\n  globalRoot['eval'] compile code, options\n\n# Running code does not provide access to this scope.\nCoffeeScript.run = (code, options = {}) ->\n  options.bare      = on\n  options.shiftLine = on\n  Function(compile code, options)()\n\n# Export this more limited `CoffeeScript` than what is exported by\n# `index.coffee`, which is intended for a Node environment.\nmodule.exports = CoffeeScript\n\n# If we’re not in a browser environment, we’re finished with the public API.\nreturn unless window?\n\n# Include source maps where possible. If we’ve got a base64 encoder, a\n# JSON serializer, and tools for escaping unicode characters, we’re good to go.\n# Ported from https://developer.mozilla.org/en-US/docs/DOM/window.btoa\nif btoa? and JSON?\n  compile = (code, options = {}) ->\n    options.inlineMap = true\n    CoffeeScript.compile code, options\n\n# Load a remote script from the current domain via XHR.\nCoffeeScript.load = (url, callback, options = {}, hold = false) ->\n  options.sourceFiles = [url]\n  xhr = if window.ActiveXObject\n    new window.ActiveXObject('Microsoft.XMLHTTP')\n  else\n    new window.XMLHttpRequest()\n  xhr.open 'GET', url, true\n  xhr.overrideMimeType 'text/plain' if 'overrideMimeType' of xhr\n  xhr.onreadystatechange = ->\n    if xhr.readyState is 4\n      if xhr.status in [0, 200]\n        param = [xhr.responseText, options]\n        CoffeeScript.run param... unless hold\n      else\n        throw new Error \"Could not load #{url}\"\n      callback param if callback\n  xhr.send null\n\n# Activate CoffeeScript in the browser by having it compile and evaluate\n# all script tags with a content-type of `text/coffeescript`.\n# This happens on page load.\nCoffeeScript.runScripts = ->\n  scripts = window.document.getElementsByTagName 'script'\n  coffeetypes = ['text/coffeescript', 'text/literate-coffeescript']\n  coffees = (s for s in scripts when s.type in coffeetypes)\n  index = 0\n\n  execute = ->\n    param = coffees[index]\n    if param instanceof Array\n      CoffeeScript.run param...\n      index++\n      execute()\n\n  for script, i in coffees\n    do (script, i) ->\n      options = literate: script.type is coffeetypes[1]\n      source = script.src or script.getAttribute('data-src')\n      if source\n        options.filename = source\n        CoffeeScript.load source,\n          (param) ->\n            coffees[i] = param\n            execute()\n          options\n          true\n      else\n        # `options.filename` defines the filename the source map appears as\n        # in Developer Tools. If a script tag has an `id`, use that as the\n        # filename; otherwise use `coffeescript`, or `coffeescript1` etc.,\n        # leaving the first one unnumbered for the common case that there’s\n        # only one CoffeeScript script block to parse.\n        options.filename = if script.id and script.id isnt '' then script.id else \"coffeescript#{if i isnt 0 then i else ''}\"\n        options.sourceFiles = ['embedded']\n        coffees[i] = [script.innerHTML, options]\n\n  execute()\n\n# Listen for window load, both in decent browsers and in IE.\n# Only attach this event handler on startup for the\n# non-ES module version of the browser compiler, to preserve\n# backward compatibility while letting the ES module version\n# be importable without side effects.\nif this is window\n  if window.addEventListener\n    window.addEventListener 'DOMContentLoaded', CoffeeScript.runScripts, no\n  else\n    window.attachEvent 'onload', CoffeeScript.runScripts\n"
  },
  {
    "path": "src/cake.coffee",
    "content": "# `cake` is a simplified version of [Make](http://www.gnu.org/software/make/)\n# ([Rake](http://rake.rubyforge.org/), [Jake](https://github.com/280north/jake))\n# for CoffeeScript. You define tasks with names and descriptions in a Cakefile,\n# and can call them from the command line, or invoke them from other tasks.\n#\n# Running `cake` with no arguments will print out a list of all the tasks in the\n# current directory's Cakefile.\n\n# External dependencies.\nfs           = require 'fs'\npath         = require 'path'\nhelpers      = require './helpers'\noptparse     = require './optparse'\nCoffeeScript = require './'\n\n# Register .coffee extension\nCoffeeScript.register()\n\n# Keep track of the list of defined tasks, the accepted options, and so on.\ntasks     = {}\noptions   = {}\nswitches  = []\noparse    = null\n\n# Mixin the top-level Cake functions for Cakefiles to use directly.\nhelpers.extend global,\n\n  # Define a Cake task with a short name, an optional sentence description,\n  # and the function to run as the action itself.\n  task: (name, description, action) ->\n    [action, description] = [description, action] unless action\n    tasks[name] = {name, description, action}\n\n  # Define an option that the Cakefile accepts. The parsed options hash,\n  # containing all of the command-line options passed, will be made available\n  # as the first argument to the action.\n  option: (letter, flag, description) ->\n    switches.push [letter, flag, description]\n\n  # Invoke another task in the current Cakefile.\n  invoke: (name) ->\n    missingTask name unless tasks[name]\n    tasks[name].action options\n\n# Run `cake`. Executes all of the tasks you pass, in order. Note that Node's\n# asynchrony may cause tasks to execute in a different order than you'd expect.\n# If no tasks are passed, print the help screen. Keep a reference to the\n# original directory name, when running Cake tasks from subdirectories.\nexports.run = ->\n  global.__originalDirname = fs.realpathSync '.'\n  process.chdir cakefileDirectory __originalDirname\n  args = process.argv[2..]\n  CoffeeScript.run fs.readFileSync('Cakefile').toString(), filename: 'Cakefile'\n  oparse = new optparse.OptionParser switches\n  return printTasks() unless args.length\n  try\n    options = oparse.parse(args)\n  catch e\n    return fatalError \"#{e}\"\n  invoke arg for arg in options.arguments\n\n# Display the list of Cake tasks in a format similar to `rake -T`\nprintTasks = ->\n  relative = path.relative or path.resolve\n  cakefilePath = path.join relative(__originalDirname, process.cwd()), 'Cakefile'\n  console.log \"#{cakefilePath} defines the following tasks:\\n\"\n  for name, task of tasks\n    spaces = 20 - name.length\n    spaces = if spaces > 0 then Array(spaces + 1).join(' ') else ''\n    desc   = if task.description then \"# #{task.description}\" else ''\n    console.log \"cake #{name}#{spaces} #{desc}\"\n  console.log oparse.help() if switches.length\n\n# Print an error and exit when attempting to use an invalid task/option.\nfatalError = (message) ->\n  console.error message + '\\n'\n  console.log 'To see a list of all tasks/options, run \"cake\"'\n  process.exit 1\n\nmissingTask = (task) -> fatalError \"No such task: #{task}\"\n\n# When `cake` is invoked, search in the current and all parent directories\n# to find the relevant Cakefile.\ncakefileDirectory = (dir) ->\n  return dir if fs.existsSync path.join dir, 'Cakefile'\n  parent = path.normalize path.join dir, '..'\n  return cakefileDirectory parent unless parent is dir\n  throw new Error \"Cakefile not found in #{process.cwd()}\"\n"
  },
  {
    "path": "src/coffeescript.coffee",
    "content": "# CoffeeScript can be used both on the server, as a command-line compiler based\n# on Node.js/V8, or to run CoffeeScript directly in the browser. This module\n# contains the main entry functions for tokenizing, parsing, and compiling\n# source CoffeeScript into JavaScript.\n\n{Lexer}       = require './lexer'\n{parser}      = require './parser'\nhelpers       = require './helpers'\nSourceMap     = require './sourcemap'\n# Require `package.json`, which is two levels above this file, as this file is\n# evaluated from `lib/coffeescript`.\npackageJson   = require '../../package.json'\n\n# The current CoffeeScript version number.\nexports.VERSION = packageJson.version\n\nexports.FILE_EXTENSIONS = FILE_EXTENSIONS = ['.coffee', '.litcoffee', '.coffee.md']\n\n# Expose helpers for testing.\nexports.helpers = helpers\n\n{getSourceMap, registerCompiled} = SourceMap\n# This is exported to enable an external module to implement caching of\n# sourcemaps. This is used only when `patchStackTrace` has been called to adjust\n# stack traces for files with cached source maps.\nexports.registerCompiled = registerCompiled\n\n# Function that allows for btoa in both nodejs and the browser.\nbase64encode = (src) -> switch\n  when typeof Buffer is 'function'\n    Buffer.from(src).toString('base64')\n  when typeof btoa is 'function'\n    # The contents of a `<script>` block are encoded via UTF-16, so if any extended\n    # characters are used in the block, btoa will fail as it maxes out at UTF-8.\n    # See https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem\n    # for the gory details, and for the solution implemented here.\n    btoa encodeURIComponent(src).replace /%([0-9A-F]{2})/g, (match, p1) ->\n      String.fromCharCode '0x' + p1\n  else\n    throw new Error('Unable to base64 encode inline sourcemap.')\n\n# Function wrapper to add source file information to SyntaxErrors thrown by the\n# lexer/parser/compiler.\nwithPrettyErrors = (fn) ->\n  (code, options = {}) ->\n    try\n      fn.call @, code, options\n    catch err\n      throw err if typeof code isnt 'string' # Support `CoffeeScript.nodes(tokens)`.\n      throw helpers.updateSyntaxError err, code, options.filename\n\n# Compile CoffeeScript code to JavaScript, using the Coffee/Jison compiler.\n#\n# If `options.sourceMap` is specified, then `options.filename` must also be\n# specified. All options that can be passed to `SourceMap#generate` may also\n# be passed here.\n#\n# This returns a javascript string, unless `options.sourceMap` is passed,\n# in which case this returns a `{js, v3SourceMap, sourceMap}`\n# object, where sourceMap is a sourcemap.coffee#SourceMap object, handy for\n# doing programmatic lookups.\nexports.compile = compile = withPrettyErrors (code, options = {}) ->\n  # Clone `options`, to avoid mutating the `options` object passed in.\n  options = Object.assign {}, options\n\n  generateSourceMap = options.sourceMap or options.inlineMap or not options.filename?\n  filename = options.filename or helpers.anonymousFileName()\n\n  checkShebangLine filename, code\n\n  map = new SourceMap if generateSourceMap\n\n  tokens = lexer.tokenize code, options\n\n  # Pass a list of referenced variables, so that generated variables won’t get\n  # the same name.\n  options.referencedVars = (\n    token[1] for token in tokens when token[0] is 'IDENTIFIER'\n  )\n\n  # Check for import or export; if found, force bare mode.\n  unless options.bare? and options.bare is yes\n    for token in tokens\n      if token[0] in ['IMPORT', 'EXPORT']\n        options.bare = yes\n        break\n\n  nodes = parser.parse tokens\n  # If all that was requested was a POJO representation of the nodes, e.g.\n  # the abstract syntax tree (AST), we can stop now and just return that\n  # (after fixing the location data for the root/`File`»`Program` node,\n  # which might’ve gotten misaligned from the original source due to the\n  # `clean` function in the lexer).\n  if options.ast\n    nodes.allCommentTokens = helpers.extractAllCommentTokens tokens\n    sourceCodeNumberOfLines = (code.match(/\\r?\\n/g) or '').length + 1\n    sourceCodeLastLine = /.*$/.exec(code)[0] # `.*` matches all but line break characters.\n    ast = nodes.ast options\n    range = [0, code.length]\n    ast.start = ast.program.start = range[0]\n    ast.end = ast.program.end = range[1]\n    ast.range = ast.program.range = range\n    ast.loc.start = ast.program.loc.start = {line: 1, column: 0}\n    ast.loc.end.line = ast.program.loc.end.line = sourceCodeNumberOfLines\n    ast.loc.end.column = ast.program.loc.end.column = sourceCodeLastLine.length\n    ast.tokens = tokens\n    return ast\n\n  fragments = nodes.compileToFragments options\n\n  currentLine = 0\n  currentLine += 1 if options.header\n  currentLine += 1 if options.shiftLine\n  currentColumn = 0\n  js = \"\"\n  for fragment in fragments\n    # Update the sourcemap with data from each fragment.\n    if generateSourceMap\n      # Do not include empty, whitespace, or semicolon-only fragments.\n      if fragment.locationData and not /^[;\\s]*$/.test fragment.code\n        map.add(\n          [fragment.locationData.first_line, fragment.locationData.first_column]\n          [currentLine, currentColumn]\n          {noReplace: true})\n      newLines = helpers.count fragment.code, \"\\n\"\n      currentLine += newLines\n      if newLines\n        currentColumn = fragment.code.length - (fragment.code.lastIndexOf(\"\\n\") + 1)\n      else\n        currentColumn += fragment.code.length\n\n    # Copy the code from each fragment into the final JavaScript.\n    js += fragment.code\n\n  if options.header\n    header = \"Generated by CoffeeScript #{@VERSION}\"\n    js = \"// #{header}\\n#{js}\"\n\n  if generateSourceMap\n    v3SourceMap = map.generate options, code\n\n  if options.transpile\n    if typeof options.transpile isnt 'object'\n      # This only happens if run via the Node API and `transpile` is set to\n      # something other than an object.\n      throw new Error 'The transpile option must be given an object with options to pass to Babel'\n\n    # Get the reference to Babel that we have been passed if this compiler\n    # is run via the CLI or Node API.\n    transpiler = options.transpile.transpile\n    delete options.transpile.transpile\n\n    transpilerOptions = Object.assign {}, options.transpile\n\n    # See https://github.com/babel/babel/issues/827#issuecomment-77573107:\n    # Babel can take a v3 source map object as input in `inputSourceMap`\n    # and it will return an *updated* v3 source map object in its output.\n    if v3SourceMap and not transpilerOptions.inputSourceMap?\n      transpilerOptions.inputSourceMap = v3SourceMap\n    transpilerOutput = transpiler js, transpilerOptions\n    js = transpilerOutput.code\n    if v3SourceMap and transpilerOutput.map\n      v3SourceMap = transpilerOutput.map\n\n  if options.inlineMap\n    encoded = base64encode JSON.stringify v3SourceMap\n    sourceMapDataURI = \"//# sourceMappingURL=data:application/json;base64,#{encoded}\"\n    sourceURL = \"//# sourceURL=#{filename}\"\n    js = \"#{js}\\n#{sourceMapDataURI}\\n#{sourceURL}\"\n\n  registerCompiled filename, code, map\n\n  if options.sourceMap\n    {\n      js\n      sourceMap: map\n      v3SourceMap: JSON.stringify v3SourceMap, null, 2\n    }\n  else\n    js\n\n# Tokenize a string of CoffeeScript code, and return the array of tokens.\nexports.tokens = withPrettyErrors (code, options) ->\n  lexer.tokenize code, options\n\n# Parse a string of CoffeeScript code or an array of lexed tokens, and\n# return the AST. You can then compile it by calling `.compile()` on the root,\n# or traverse it by using `.traverseChildren()` with a callback.\nexports.nodes = withPrettyErrors (source, options) ->\n  source = lexer.tokenize source, options if typeof source is 'string'\n  parser.parse source\n\n# This file used to export these methods; leave stubs that throw warnings\n# instead. These methods have been moved into `index.coffee` to provide\n# separate entrypoints for Node and non-Node environments, so that static\n# analysis tools don’t choke on Node packages when compiling for a non-Node\n# environment.\nexports.run = exports.eval = exports.register = ->\n  throw new Error 'require index.coffee, not this file'\n\n# Instantiate a Lexer for our use here.\nlexer = new Lexer\n\n# The real Lexer produces a generic stream of tokens. This object provides a\n# thin wrapper around it, compatible with the Jison API. We can then pass it\n# directly as a “Jison lexer.”\nparser.lexer =\n  yylloc:\n    range: []\n  options:\n    ranges: yes\n  lex: ->\n    token = parser.tokens[@pos++]\n    if token\n      [tag, @yytext, @yylloc] = token\n      parser.errorToken = token.origin or token\n      @yylineno = @yylloc.first_line\n    else\n      tag = ''\n    tag\n  setInput: (tokens) ->\n    parser.tokens = tokens\n    @pos = 0\n  upcomingInput: -> ''\n\n# Make all the AST nodes visible to the parser.\nparser.yy = require './nodes'\n\n# Override Jison's default error handling function.\nparser.yy.parseError = (message, {token}) ->\n  # Disregard Jison's message, it contains redundant line number information.\n  # Disregard the token, we take its value directly from the lexer in case\n  # the error is caused by a generated token which might refer to its origin.\n  {errorToken, tokens} = parser\n  [errorTag, errorText, errorLoc] = errorToken\n\n  errorText = switch\n    when errorToken is tokens[tokens.length - 1]\n      'end of input'\n    when errorTag in ['INDENT', 'OUTDENT']\n      'indentation'\n    when errorTag in ['IDENTIFIER', 'NUMBER', 'INFINITY', 'STRING', 'STRING_START', 'REGEX', 'REGEX_START']\n      errorTag.replace(/_START$/, '').toLowerCase()\n    else\n      helpers.nameWhitespaceCharacter errorText\n\n  # The second argument has a `loc` property, which should have the location\n  # data for this token. Unfortunately, Jison seems to send an outdated `loc`\n  # (from the previous token), so we take the location information directly\n  # from the lexer.\n  helpers.throwSyntaxError \"unexpected #{errorText}\", errorLoc\n\nexports.patchStackTrace = ->\n  # Based on http://v8.googlecode.com/svn/branches/bleeding_edge/src/messages.js\n  # Modified to handle sourceMap\n  formatSourcePosition = (frame, getSourceMapping) ->\n    filename = undefined\n    fileLocation = ''\n\n    if frame.isNative()\n      fileLocation = \"native\"\n    else\n      if frame.isEval()\n        filename = frame.getScriptNameOrSourceURL()\n        fileLocation = \"#{frame.getEvalOrigin()}, \" unless filename\n      else\n        filename = frame.getFileName()\n\n      filename or= \"<anonymous>\"\n\n      line = frame.getLineNumber()\n      column = frame.getColumnNumber()\n\n      # Check for a sourceMap position\n      source = getSourceMapping filename, line, column\n      fileLocation =\n        if source\n          \"#{filename}:#{source[0]}:#{source[1]}\"\n        else\n          \"#{filename}:#{line}:#{column}\"\n\n    functionName = frame.getFunctionName()\n    isConstructor = frame.isConstructor()\n    isMethodCall = not (frame.isToplevel() or isConstructor)\n\n    if isMethodCall\n      methodName = frame.getMethodName()\n      typeName = frame.getTypeName()\n\n      if functionName\n        tp = as = ''\n        if typeName and functionName.indexOf typeName\n          tp = \"#{typeName}.\"\n        if methodName and functionName.indexOf(\".#{methodName}\") isnt functionName.length - methodName.length - 1\n          as = \" [as #{methodName}]\"\n\n        \"#{tp}#{functionName}#{as} (#{fileLocation})\"\n      else\n        \"#{typeName}.#{methodName or '<anonymous>'} (#{fileLocation})\"\n    else if isConstructor\n      \"new #{functionName or '<anonymous>'} (#{fileLocation})\"\n    else if functionName\n      \"#{functionName} (#{fileLocation})\"\n    else\n      fileLocation\n\n  getSourceMapping = (filename, line, column) ->\n    sourceMap = getSourceMap filename, line, column\n\n    answer = sourceMap.sourceLocation [line - 1, column - 1] if sourceMap?\n    if answer? then [answer[0] + 1, answer[1] + 1] else null\n\n  # Based on [michaelficarra/CoffeeScriptRedux](http://goo.gl/ZTx1p)\n  # NodeJS / V8 have no support for transforming positions in stack traces using\n  # sourceMap, so we must monkey-patch Error to display CoffeeScript source\n  # positions.\n  Error.prepareStackTrace = (err, stack) ->\n    frames = for frame in stack\n      # Don’t display stack frames deeper than `CoffeeScript.run`.\n      break if frame.getFunction() is exports.run\n      \"    at #{formatSourcePosition frame, getSourceMapping}\"\n\n    \"#{err.toString()}\\n#{frames.join '\\n'}\\n\"\n\ncheckShebangLine = (file, input) ->\n  firstLine = input.split(/$/m, 1)[0]\n  rest = firstLine?.match(/^#!\\s*([^\\s]+\\s*)(.*)/)\n  args = rest?[2]?.split(/\\s/).filter (s) -> s isnt ''\n  if args?.length > 1\n    console.error '''\n      The script to be run begins with a shebang line with more than one\n      argument. This script will fail on platforms such as Linux which only\n      allow a single argument.\n    '''\n    console.error \"The shebang line was: '#{firstLine}' in file '#{file}'\"\n    console.error \"The arguments were: #{JSON.stringify args}\"\n"
  },
  {
    "path": "src/command.coffee",
    "content": "# The `coffee` utility. Handles command-line compilation of CoffeeScript\n# into various forms: saved into `.js` files or printed to stdout\n# or recompiled every time the source is saved,\n# printed as a token stream or as the syntax tree, or launch an\n# interactive REPL.\n\n# External dependencies.\nfs             = require 'fs'\npath           = require 'path'\nhelpers        = require './helpers'\noptparse       = require './optparse'\nCoffeeScript   = require './'\n{spawn, exec}  = require 'child_process'\n{EventEmitter} = require 'events'\n\nuseWinPathSep  = path.sep is '\\\\'\n\n# Allow CoffeeScript to emit Node.js events.\nhelpers.extend CoffeeScript, new EventEmitter\n\nprintLine = (line) -> process.stdout.write line + '\\n'\nprintWarn = (line) -> process.stderr.write line + '\\n'\n\nhidden = (file) -> /^\\.|~$/.test file\n\n# The help banner that is printed in conjunction with `-h`/`--help`.\nBANNER = '''\n  Usage: coffee [options] path/to/script.coffee [args]\n\n  If called without options, `coffee` will run your script.\n'''\n\n# The list of all the valid option flags that `coffee` knows how to handle.\nSWITCHES = [\n  [      '--ast',               'generate an abstract syntax tree of nodes']\n  ['-b', '--bare',              'compile without a top-level function wrapper']\n  ['-c', '--compile',           'compile to JavaScript and save as .js files']\n  ['-e', '--eval',              'pass a string from the command line as input']\n  ['-h', '--help',              'display this help message']\n  ['-i', '--interactive',       'run an interactive CoffeeScript REPL']\n  ['-j', '--join [FILE]',       'concatenate the source CoffeeScript before compiling']\n  ['-l', '--literate',          'treat stdio as literate style coffeescript']\n  ['-m', '--map',               'generate source map and save as .js.map files']\n  ['-M', '--inline-map',        'generate source map and include it directly in output']\n  ['-n', '--nodes',             'print out the parse tree that the parser produces']\n  [      '--nodejs [ARGS]',     'pass options directly to the \"node\" binary']\n  [      '--no-header',         'suppress the \"Generated by\" header']\n  ['-o', '--output [PATH]',     'set the output path or path/filename for compiled JavaScript']\n  ['-p', '--print',             'print out the compiled JavaScript']\n  ['-r', '--require [MODULE*]', 'require the given module before eval or REPL']\n  ['-s', '--stdio',             'listen for and compile scripts over stdio']\n  ['-t', '--transpile',         'pipe generated JavaScript through Babel']\n  [      '--tokens',            'print out the tokens that the lexer/rewriter produce']\n  ['-v', '--version',           'display the version number']\n  ['-w', '--watch',             'watch scripts for changes and rerun commands']\n]\n\n# Top-level objects shared by all the functions.\nopts         = {}\nsources      = []\nsourceCode   = []\nnotSources   = {}\nwatchedDirs  = {}\noptionParser = null\n\nexports.buildCSOptionParser = buildCSOptionParser = ->\n  new optparse.OptionParser SWITCHES, BANNER\n\n# Run `coffee` by parsing passed options and determining what action to take.\n# Many flags cause us to divert before compiling anything. Flags passed after\n# `--` will be passed verbatim to your script as arguments in `process.argv`\nexports.run = ->\n  optionParser = buildCSOptionParser()\n  try parseOptions()\n  catch err\n    console.error \"option parsing error: #{err.message}\"\n    process.exit 1\n\n  if (not opts.doubleDashed) and (opts.arguments[1] is '--')\n    printWarn '''\n      coffee was invoked with '--' as the second positional argument, which is\n      now deprecated. To pass '--' as an argument to a script to run, put an\n      additional '--' before the path to your script.\n\n      '--' will be removed from the argument list.\n    '''\n    printWarn \"The positional arguments were: #{JSON.stringify opts.arguments}\"\n    opts.arguments = [opts.arguments[0]].concat opts.arguments[2..]\n\n  # Make the REPL *CLI* use the global context so as to (a) be consistent with the\n  # `node` REPL CLI and, therefore, (b) make packages that modify native prototypes\n  # (such as 'colors' and 'sugar') work as expected.\n  replCliOpts = useGlobal: yes\n  opts.prelude = makePrelude opts.require       if opts.require\n  replCliOpts.prelude = opts.prelude\n  replCliOpts.transpile = opts.transpile\n  return forkNode()                             if opts.nodejs\n  return usage()                                if opts.help\n  return version()                              if opts.version\n  return require('./repl').start(replCliOpts)   if opts.interactive\n  return compileStdio()                         if opts.stdio\n  return compileScript null, opts.arguments[0]  if opts.eval\n  return require('./repl').start(replCliOpts)   unless opts.arguments.length\n  literals = if opts.run then opts.arguments.splice 1 else []\n  process.argv = process.argv[0..1].concat literals\n  process.argv[0] = 'coffee'\n\n  if opts.output\n    outputBasename = path.basename opts.output\n    if '.' in outputBasename and\n       outputBasename not in ['.', '..'] and\n       not helpers.ends(opts.output, path.sep)\n      # An output filename was specified, e.g. `/dist/scripts.js`.\n      opts.outputFilename = outputBasename\n      opts.outputPath = path.resolve path.dirname opts.output\n    else\n      # An output path was specified, e.g. `/dist`.\n      opts.outputFilename = null\n      opts.outputPath = path.resolve opts.output\n\n  if opts.join\n    opts.join = path.resolve opts.join\n    console.error '''\n\n    The --join option is deprecated and will be removed in a future version.\n\n    If for some reason it's necessary to share local variables between files,\n    replace...\n\n        $ coffee --compile --join bundle.js -- a.coffee b.coffee c.coffee\n\n    with...\n\n        $ cat a.coffee b.coffee c.coffee | coffee --compile --stdio > bundle.js\n\n    '''\n  for source in opts.arguments\n    source = path.resolve source\n    compilePath source, yes, source\n\nmakePrelude = (requires) ->\n  requires.map (module) ->\n    [full, name, module] = match if match = module.match(/^(.*)=(.*)$/)\n    name or= helpers.baseFileName module, yes, useWinPathSep\n    \"global['#{name}'] = require('#{module}')\"\n  .join ';'\n\n# Compile a path, which could be a script or a directory. If a directory\n# is passed, recursively compile all '.coffee', '.litcoffee', and '.coffee.md'\n# extension source files in it and all subdirectories.\ncompilePath = (source, topLevel, base) ->\n  return if source in sources   or\n            watchedDirs[source] or\n            not topLevel and (notSources[source] or hidden source)\n  try\n    stats = fs.statSync source\n  catch err\n    if err.code is 'ENOENT'\n      console.error \"File not found: #{source}\"\n      process.exit 1\n    throw err\n  if stats.isDirectory()\n    if path.basename(source) is 'node_modules'\n      notSources[source] = yes\n      return\n    if opts.run\n      compilePath findDirectoryIndex(source), topLevel, base\n      return\n    watchDir source, base if opts.watch\n    try\n      files = fs.readdirSync source\n    catch err\n      if err.code is 'ENOENT' then return else throw err\n    for file in files\n      compilePath (path.join source, file), no, base\n  else if topLevel or helpers.isCoffee source\n    sources.push source\n    sourceCode.push null\n    delete notSources[source]\n    watch source, base if opts.watch\n    try\n      code = fs.readFileSync source\n    catch err\n      if err.code is 'ENOENT' then return else throw err\n    compileScript source, code.toString(), base\n  else\n    notSources[source] = yes\n\nfindDirectoryIndex = (source) ->\n  for ext in CoffeeScript.FILE_EXTENSIONS\n    index = path.join source, \"index#{ext}\"\n    try\n      return index if (fs.statSync index).isFile()\n    catch err\n      throw err unless err.code is 'ENOENT'\n  console.error \"Missing index.coffee or index.litcoffee in #{source}\"\n  process.exit 1\n\n# Compile a single source script, containing the given code, according to the\n# requested options. If evaluating the script directly, set `__filename`,\n# `__dirname` and `module.filename` to be correct relative to the script's path.\ncompileScript = (file, input, base = null) ->\n  options = compileOptions file, base\n  try\n    task = {file, input, options}\n    CoffeeScript.emit 'compile', task\n    if opts.tokens\n      printTokens CoffeeScript.tokens task.input, task.options\n    else if opts.nodes\n      printLine CoffeeScript.nodes(task.input, task.options).toString().trim()\n    else if opts.ast\n      compiled = CoffeeScript.compile task.input, task.options\n      printLine JSON.stringify(compiled, null, 2)\n    else if opts.run\n      CoffeeScript.register()\n      CoffeeScript.eval opts.prelude, task.options if opts.prelude\n      CoffeeScript.run task.input, task.options\n    else if opts.join and task.file isnt opts.join\n      task.input = helpers.invertLiterate task.input if helpers.isLiterate file\n      sourceCode[sources.indexOf(task.file)] = task.input\n      compileJoin()\n    else\n      compiled = CoffeeScript.compile task.input, task.options\n      task.output = compiled\n      if opts.map\n        task.output = compiled.js\n        task.sourceMap = compiled.v3SourceMap\n\n      CoffeeScript.emit 'success', task\n      if opts.print\n        printLine task.output.trim()\n      else if opts.compile or opts.map\n        saveTo = if opts.outputFilename and sources.length is 1\n          path.join opts.outputPath, opts.outputFilename\n        else\n          options.jsPath\n        writeJs base, task.file, task.output, saveTo, task.sourceMap\n  catch err\n    CoffeeScript.emit 'failure', err, task\n    return if CoffeeScript.listeners('failure').length\n    message = err?.stack or \"#{err}\"\n    if opts.watch\n      printLine message + '\\x07'\n    else\n      printWarn message\n      process.exit 1\n\n# Attach the appropriate listeners to compile scripts incoming over **stdin**,\n# and write them back to **stdout**.\ncompileStdio = ->\n  if opts.map\n    console.error '--stdio and --map cannot be used together'\n    process.exit 1\n  buffers = []\n  stdin = process.openStdin()\n  stdin.on 'data', (buffer) ->\n    buffers.push buffer if buffer\n  stdin.on 'end', ->\n    compileScript null, Buffer.concat(buffers).toString()\n\n# If all of the source files are done being read, concatenate and compile\n# them together.\njoinTimeout = null\ncompileJoin = ->\n  return unless opts.join\n  unless sourceCode.some((code) -> code is null)\n    clearTimeout joinTimeout\n    joinTimeout = wait 100, ->\n      compileScript opts.join, sourceCode.join('\\n'), opts.join\n\n# Watch a source CoffeeScript file using `fs.watch`, recompiling it every\n# time the file is updated. May be used in combination with other options,\n# such as `--print`.\nwatch = (source, base) ->\n  watcher        = null\n  prevStats      = null\n  compileTimeout = null\n\n  watchErr = (err) ->\n    throw err unless err.code is 'ENOENT'\n    return unless source in sources\n    try\n      rewatch()\n      compile()\n    catch\n      removeSource source, base\n      compileJoin()\n\n  compile = ->\n    clearTimeout compileTimeout\n    compileTimeout = wait 25, ->\n      fs.stat source, (err, stats) ->\n        return watchErr err if err\n        return rewatch() if prevStats and\n                            stats.size is prevStats.size and\n                            stats.mtime.getTime() is prevStats.mtime.getTime()\n        prevStats = stats\n        fs.readFile source, (err, code) ->\n          return watchErr err if err\n          compileScript(source, code.toString(), base)\n          rewatch()\n\n  startWatcher = ->\n    watcher = fs.watch source\n    .on 'change', compile\n    .on 'error', (err) ->\n      throw err unless err.code is 'EPERM'\n      removeSource source, base\n\n  rewatch = ->\n    watcher?.close()\n    startWatcher()\n\n  try\n    startWatcher()\n  catch err\n    watchErr err\n\n# Watch a directory of files for new additions.\nwatchDir = (source, base) ->\n  watcher        = null\n  readdirTimeout = null\n\n  startWatcher = ->\n    watcher = fs.watch source\n    .on 'error', (err) ->\n      throw err unless err.code is 'EPERM'\n      stopWatcher()\n    .on 'change', ->\n      clearTimeout readdirTimeout\n      readdirTimeout = wait 25, ->\n        try\n          files = fs.readdirSync source\n        catch err\n          throw err unless err.code is 'ENOENT'\n          return stopWatcher()\n        for file in files\n          compilePath (path.join source, file), no, base\n\n  stopWatcher = ->\n    watcher.close()\n    removeSourceDir source, base\n\n  watchedDirs[source] = yes\n  try\n    startWatcher()\n  catch err\n    throw err unless err.code is 'ENOENT'\n\nremoveSourceDir = (source, base) ->\n  delete watchedDirs[source]\n  sourcesChanged = no\n  for file in sources when source is path.dirname file\n    removeSource file, base\n    sourcesChanged = yes\n  compileJoin() if sourcesChanged\n\n# Remove a file from our source list, and source code cache. Optionally remove\n# the compiled JS version as well.\nremoveSource = (source, base) ->\n  index = sources.indexOf source\n  sources.splice index, 1\n  sourceCode.splice index, 1\n  unless opts.join\n    silentUnlink outputPath source, base\n    silentUnlink outputPath source, base, '.js.map'\n    timeLog \"removed #{source}\"\n\nsilentUnlink = (path) ->\n  try\n    fs.unlinkSync path\n  catch err\n    throw err unless err.code in ['ENOENT', 'EPERM']\n\n# Get the corresponding output JavaScript path for a source file.\noutputPath = (source, base, extension=\".js\") ->\n  basename  = helpers.baseFileName source, yes, useWinPathSep\n  srcDir    = path.dirname source\n  dir = unless opts.outputPath\n    srcDir\n  else if source is base\n    opts.outputPath\n  else\n    path.join opts.outputPath, path.relative base, srcDir\n  path.join dir, basename + extension\n\n# Recursively mkdir, like `mkdir -p`.\nmkdirp = (dir, fn) ->\n  mode = 0o777 & ~process.umask()\n\n  do mkdirs = (p = dir, fn) ->\n    fs.exists p, (exists) ->\n      if exists\n        fn()\n      else\n        mkdirs path.dirname(p), ->\n          fs.mkdir p, mode, (err) ->\n            return fn err if err\n            fn()\n\n# Write out a JavaScript source file with the compiled code. By default, files\n# are written out in `cwd` as `.js` files with the same name, but the output\n# directory can be customized with `--output`.\n#\n# If `generatedSourceMap` is provided, this will write a `.js.map` file into the\n# same directory as the `.js` file.\nwriteJs = (base, sourcePath, js, jsPath, generatedSourceMap = null) ->\n  sourceMapPath = \"#{jsPath}.map\"\n  jsDir  = path.dirname jsPath\n  compile = ->\n    if opts.compile\n      js = ' ' if js.length <= 0\n      if generatedSourceMap then js = \"#{js}\\n//# sourceMappingURL=#{helpers.baseFileName sourceMapPath, no, useWinPathSep}\\n\"\n      fs.writeFile jsPath, js, (err) ->\n        if err\n          printLine err.message\n          process.exit 1\n        else if opts.compile and opts.watch\n          timeLog \"compiled #{sourcePath}\"\n    if generatedSourceMap\n      fs.writeFile sourceMapPath, generatedSourceMap, (err) ->\n        if err\n          printLine \"Could not write source map: #{err.message}\"\n          process.exit 1\n  fs.exists jsDir, (itExists) ->\n    if itExists then compile() else mkdirp jsDir, compile\n\n# Convenience for cleaner setTimeouts.\nwait = (milliseconds, func) -> setTimeout func, milliseconds\n\n# When watching scripts, it's useful to log changes with the timestamp.\ntimeLog = (message) ->\n  console.log \"#{(new Date).toLocaleTimeString()} - #{message}\"\n\n# Pretty-print a stream of tokens, sans location data.\nprintTokens = (tokens) ->\n  strings = for token in tokens\n    tag = token[0]\n    value = token[1].toString().replace(/\\n/, '\\\\n')\n    \"[#{tag} #{value}]\"\n  printLine strings.join(' ')\n\n# Use the [OptionParser module](optparse.html) to extract all options from\n# `process.argv` that are specified in `SWITCHES`.\nparseOptions = ->\n  o = opts      = optionParser.parse process.argv[2..]\n  o.compile     or=  !!o.output\n  o.run         = not (o.compile or o.print or o.map)\n  o.print       = !!  (o.print or (o.eval or o.stdio and o.compile))\n\n# The compile-time options to pass to the CoffeeScript compiler.\ncompileOptions = (filename, base) ->\n  if opts.transpile\n    # The user has requested that the CoffeeScript compiler also transpile\n    # via Babel. We don’t include Babel as a dependency because we want to\n    # avoid dependencies in general, and most users probably won’t be relying\n    # on us to transpile for them; we assume most users will probably either\n    # run CoffeeScript’s output without transpilation (modern Node or evergreen\n    # browsers) or use a proper build chain like Gulp or Webpack.\n    try\n      require '@babel/core'\n    catch\n      try\n        require 'babel-core'\n      catch\n        # Give appropriate instructions depending on whether `coffee` was run\n        # locally or globally.\n        if require.resolve('.').indexOf(process.cwd()) is 0\n          console.error '''\n            To use --transpile, you must have @babel/core installed:\n              npm install --save-dev @babel/core\n            And you must save options to configure Babel in one of the places it looks to find its options.\n            See https://coffeescript.org/#transpilation\n          '''\n        else\n          console.error '''\n            To use --transpile with globally-installed CoffeeScript, you must have @babel/core installed globally:\n              npm install --global @babel/core\n            And you must save options to configure Babel in one of the places it looks to find its options, relative to the file being compiled or to the current folder.\n            See https://coffeescript.org/#transpilation\n          '''\n        process.exit 1\n\n    opts.transpile = {} unless typeof opts.transpile is 'object'\n\n    # Pass a reference to Babel into the compiler, so that the transpile option\n    # is available for the CLI. We need to do this so that tools like Webpack\n    # can `require('coffeescript')` and build correctly, without trying to\n    # require Babel.\n    opts.transpile.transpile = CoffeeScript.transpile\n\n    # Babel searches for its options (a `.babelrc` file, a `.babelrc.js` file,\n    # a `package.json` file with a `babel` key, etc.) relative to the path\n    # given to it in its `filename` option. Make sure we have a path to pass\n    # along.\n    unless opts.transpile.filename\n      opts.transpile.filename = filename or path.resolve(base or process.cwd(), '<anonymous>')\n  else\n    opts.transpile = no\n\n  answer =\n    filename: filename\n    literate: opts.literate or helpers.isLiterate(filename)\n    bare: opts.bare\n    header: opts.compile and not opts['no-header']\n    transpile: opts.transpile\n    sourceMap: opts.map\n    inlineMap: opts['inline-map']\n    ast: opts.ast\n\n  if filename\n    if base\n      cwd = process.cwd()\n      jsPath = outputPath filename, base\n      jsDir = path.dirname jsPath\n      answer = helpers.merge answer, {\n        jsPath\n        sourceRoot: path.relative(jsDir, cwd) + path.sep\n        sourceFiles: [path.relative cwd, filename]\n        generatedFile: helpers.baseFileName(jsPath, no, useWinPathSep)\n      }\n    else\n      answer = helpers.merge answer,\n        sourceRoot: \"\"\n        sourceFiles: [helpers.baseFileName filename, no, useWinPathSep]\n        generatedFile: helpers.baseFileName(filename, yes, useWinPathSep) + \".js\"\n  answer\n\n# Start up a new Node.js instance with the arguments in `--nodejs` passed to\n# the `node` binary, preserving the other options.\nforkNode = ->\n  nodeArgs = opts.nodejs.split /\\s+/\n  args     = process.argv[1..]\n  args.splice args.indexOf('--nodejs'), 2\n  p = spawn process.execPath, nodeArgs.concat(args),\n    cwd:        process.cwd()\n    env:        process.env\n    stdio:      [0, 1, 2]\n  for signal in ['SIGINT', 'SIGTERM']\n    process.on signal, do (signal) ->\n      -> p.kill signal\n  p.on 'exit', (code) -> process.exit code\n\n# Print the `--help` usage message and exit. Deprecated switches are not\n# shown.\nusage = ->\n  printLine optionParser.help()\n\n# Print the `--version` message and exit.\nversion = ->\n  printLine \"CoffeeScript version #{CoffeeScript.VERSION}\"\n"
  },
  {
    "path": "src/grammar.coffee",
    "content": "# The CoffeeScript parser is generated by [Jison](https://github.com/zaach/jison)\n# from this grammar file. Jison is a bottom-up parser generator, similar in\n# style to [Bison](http://www.gnu.org/software/bison), implemented in JavaScript.\n# It can recognize [LALR(1), LR(0), SLR(1), and LR(1)](https://en.wikipedia.org/wiki/LR_grammar)\n# type grammars. To create the Jison parser, we list the pattern to match\n# on the left-hand side, and the action to take (usually the creation of syntax\n# tree nodes) on the right. As the parser runs, it\n# shifts tokens from our token stream, from left to right, and\n# [attempts to match](https://en.wikipedia.org/wiki/Bottom-up_parsing)\n# the token sequence against the rules below. When a match can be made, it\n# reduces into the [nonterminal](https://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols)\n# (the enclosing name at the top), and we proceed from there.\n#\n# If you run the `cake build:parser` command, Jison constructs a parse table\n# from our rules and saves it into `lib/parser.js`.\n\n# The only dependency is on the **Jison.Parser**.\n{Parser} = require 'jison'\n\n# Jison DSL\n# ---------\n\n# Since we're going to be wrapped in a function by Jison in any case, if our\n# action immediately returns a value, we can optimize by removing the function\n# wrapper and just returning the value directly.\nunwrap = /^function\\s*\\(\\)\\s*\\{\\s*return\\s*([\\s\\S]*);\\s*\\}/\n\n# Our handy DSL for Jison grammar generation, thanks to\n# [Tim Caswell](https://github.com/creationix). For every rule in the grammar,\n# we pass the pattern-defining string, the action to run, and extra options,\n# optionally. If no action is specified, we simply pass the value of the\n# previous nonterminal.\no = (patternString, action, options) ->\n  patternString = patternString.replace /\\s{2,}/g, ' '\n  patternCount = patternString.split(' ').length\n  if action\n    # This code block does string replacements in the generated `parser.js`\n    # file, replacing the calls to the `LOC` function and other strings as\n    # listed below.\n    action = if match = unwrap.exec action then match[1] else \"(#{action}())\"\n\n    # All runtime functions we need are defined on `yy`\n    action = action.replace /\\bnew /g, '$&yy.'\n    action = action.replace /\\b(?:Block\\.wrap|extend)\\b/g, 'yy.$&'\n\n    # Returns strings of functions to add to `parser.js` which add extra data\n    # that nodes may have, such as comments or location data. Location data\n    # is added to the first parameter passed in, and the parameter is returned.\n    # If the parameter is not a node, it will just be passed through unaffected.\n    getAddDataToNodeFunctionString = (first, last, forceUpdateLocation = yes) ->\n      \"yy.addDataToNode(yy, @#{first}, #{if first[0] is '$' then '$$' else '$'}#{first}, #{if last then \"@#{last}, #{if last[0] is '$' then '$$' else '$'}#{last}\" else 'null, null'}, #{if forceUpdateLocation then 'true' else 'false'})\"\n\n    # This code replaces the calls to `LOC` with the `yy.addDataToNode` string\n    # defined above. The `LOC` function, when used below in the grammar rules,\n    # is used to make sure that newly created node class objects get correct\n    # location data assigned to them. By default, the grammar will assign the\n    # location data spanned by *all* of the tokens on the left (e.g. a string\n    # such as `'Body TERMINATOR Line'`) to the “top-level” node returned by\n    # the grammar rule (the function on the right). But for “inner” node class\n    # objects created by grammar rules, they won’t get correct location data\n    # assigned to them without adding `LOC`.\n\n    # For example, consider the grammar rule `'NEW_TARGET . Property'`, which\n    # is handled by a function that returns\n    # `new MetaProperty LOC(1)(new IdentifierLiteral $1), LOC(3)(new Access $3)`.\n    # The `1` in `LOC(1)` refers to the first token (`NEW_TARGET`) and the `3`\n    # in `LOC(3)` refers to the third token (`Property`). In order for the\n    # `new IdentifierLiteral` to get assigned the location data corresponding\n    # to `new` in the source code, we use\n    # `LOC(1)(new IdentifierLiteral ...)` to mean “assign the location data of\n    # the *first* token of this grammar rule (`NEW_TARGET`) to this\n    # `new IdentifierLiteral`”. The `LOC(3)` means “assign the location data of\n    # the *third* token of this grammar rule (`Property`) to this\n    # `new Access`”.\n    returnsLoc = /^LOC/.test action\n    action = action.replace /LOC\\(([0-9]*)\\)/g, getAddDataToNodeFunctionString('$1')\n    # A call to `LOC` with two arguments, e.g. `LOC(2,4)`, sets the location\n    # data for the generated node on both of the referenced tokens  (the second\n    # and fourth in this example).\n    action = action.replace /LOC\\(([0-9]*),\\s*([0-9]*)\\)/g, getAddDataToNodeFunctionString('$1', '$2')\n    performActionFunctionString = \"$$ = #{getAddDataToNodeFunctionString(1, patternCount, not returnsLoc)}(#{action});\"\n  else\n    performActionFunctionString = '$$ = $1;'\n\n  [patternString, performActionFunctionString, options]\n\n# Grammatical Rules\n# -----------------\n\n# In all of the rules that follow, you'll see the name of the nonterminal as\n# the key to a list of alternative matches. With each match's action, the\n# dollar-sign variables are provided by Jison as references to the value of\n# their numeric position, so in this rule:\n#\n#     'Expression UNLESS Expression'\n#\n# `$1` would be the value of the first `Expression`, `$2` would be the token\n# for the `UNLESS` terminal, and `$3` would be the value of the second\n# `Expression`.\ngrammar =\n\n  # The **Root** is the top-level node in the syntax tree. Since we parse bottom-up,\n  # all parsing must end here.\n  Root: [\n    o '',                                       -> new Root new Block\n    o 'Body',                                   -> new Root $1\n  ]\n\n  # Any list of statements and expressions, separated by line breaks or semicolons.\n  Body: [\n    o 'Line',                                   -> Block.wrap [$1]\n    o 'Body TERMINATOR Line',                   -> $1.push $3\n    o 'Body TERMINATOR'\n  ]\n\n  # Block and statements, which make up a line in a body. FuncDirective is a\n  # statement, but not included in Statement because that results in an ambiguous\n  # grammar.\n  Line: [\n    o 'Expression'\n    o 'ExpressionLine'\n    o 'Statement'\n    o 'FuncDirective'\n  ]\n\n  FuncDirective: [\n    o 'YieldReturn'\n    o 'AwaitReturn'\n  ]\n\n  # Pure statements which cannot be expressions.\n  Statement: [\n    o 'Return'\n    o 'STATEMENT',                              -> new StatementLiteral $1\n    o 'Import'\n    o 'Export'\n  ]\n\n  # All the different types of expressions in our language. The basic unit of\n  # CoffeeScript is the **Expression** -- everything that can be an expression\n  # is one. Blocks serve as the building blocks of many other rules, making\n  # them somewhat circular.\n  Expression: [\n    o 'Value'\n    o 'Code'\n    o 'Operation'\n    o 'Assign'\n    o 'If'\n    o 'Try'\n    o 'While'\n    o 'For'\n    o 'Switch'\n    o 'Class'\n    o 'Throw'\n    o 'Yield'\n  ]\n\n  # Expressions which are written in single line and would otherwise require being\n  # wrapped in braces: E.g `a = b if do -> f a is 1`, `if f (a) -> a*2 then ...`,\n  # `for x in do (obj) -> f obj when x > 8 then f x`\n  ExpressionLine: [\n    o 'CodeLine'\n    o 'IfLine'\n    o 'OperationLine'\n  ]\n\n  Yield: [\n    o 'YIELD',                                  -> new Op $1, new Value new Literal ''\n    o 'YIELD Expression',                       -> new Op $1, $2\n    o 'YIELD INDENT Object OUTDENT',            -> new Op $1, $3\n    o 'YIELD FROM Expression',                  -> new Op $1.concat($2), $3\n  ]\n\n  # An indented block of expressions. Note that the [Rewriter](rewriter.html)\n  # will convert some postfix forms into blocks for us, by adjusting the\n  # token stream.\n  Block: [\n    o 'INDENT OUTDENT',                         -> new Block\n    o 'INDENT Body OUTDENT',                    -> $2\n  ]\n\n  Identifier: [\n    o 'IDENTIFIER',                             -> new IdentifierLiteral $1\n    o 'JSX_TAG',                                -> new JSXTag $1.toString(),\n                                                     tagNameLocationData:                  $1.tagNameToken[2]\n                                                     closingTagOpeningBracketLocationData: $1.closingTagOpeningBracketToken?[2]\n                                                     closingTagSlashLocationData:          $1.closingTagSlashToken?[2]\n                                                     closingTagNameLocationData:           $1.closingTagNameToken?[2]\n                                                     closingTagClosingBracketLocationData: $1.closingTagClosingBracketToken?[2]\n  ]\n\n  Property: [\n    o 'PROPERTY',                               -> new PropertyName $1.toString()\n  ]\n\n  # Alphanumerics are separated from the other **Literal** matchers because\n  # they can also serve as keys in object literals.\n  AlphaNumeric: [\n    o 'NUMBER',                                 -> new NumberLiteral $1.toString(), parsedValue: $1.parsedValue\n    o 'String'\n  ]\n\n  String: [\n    o 'STRING', ->\n      new StringLiteral(\n        $1.slice 1, -1 # strip artificial quotes and unwrap to primitive string\n        quote:        $1.quote\n        initialChunk: $1.initialChunk\n        finalChunk:   $1.finalChunk\n        indent:       $1.indent\n        double:       $1.double\n        heregex:      $1.heregex\n      )\n    o 'STRING_START Interpolations STRING_END', -> new StringWithInterpolations Block.wrap($2), quote: $1.quote, startQuote: LOC(1)(new Literal $1.toString())\n  ]\n\n  Interpolations: [\n    o 'InterpolationChunk',                     -> [$1]\n    o 'Interpolations InterpolationChunk',      -> $1.concat $2\n  ]\n\n  InterpolationChunk: [\n    o 'INTERPOLATION_START Body INTERPOLATION_END',                -> new Interpolation $2\n    o 'INTERPOLATION_START INDENT Body OUTDENT INTERPOLATION_END', -> new Interpolation $3\n    o 'INTERPOLATION_START INTERPOLATION_END',                     -> new Interpolation\n    o 'String',                                                    -> $1\n  ]\n\n  # The .toString() calls here and elsewhere are to convert `String` objects\n  # back to primitive strings now that we've retrieved stowaway extra properties\n  Regex: [\n    o 'REGEX',                                  -> new RegexLiteral $1.toString(), delimiter: $1.delimiter, heregexCommentTokens: $1.heregexCommentTokens\n    o 'REGEX_START Invocation REGEX_END',       -> new RegexWithInterpolations $2, heregexCommentTokens: $3.heregexCommentTokens\n  ]\n\n  # All of our immediate values. Generally these can be passed straight\n  # through and printed to JavaScript.\n  Literal: [\n    o 'AlphaNumeric'\n    o 'JS',                                     -> new PassthroughLiteral $1.toString(), here: $1.here, generated: $1.generated\n    o 'Regex'\n    o 'UNDEFINED',                              -> new UndefinedLiteral $1\n    o 'NULL',                                   -> new NullLiteral $1\n    o 'BOOL',                                   -> new BooleanLiteral $1.toString(), originalValue: $1.original\n    o 'INFINITY',                               -> new InfinityLiteral $1.toString(), originalValue: $1.original\n    o 'NAN',                                    -> new NaNLiteral $1\n  ]\n\n  # Assignment of a variable, property, or index to a value.\n  Assign: [\n    o 'Assignable = Expression',                -> new Assign $1, $3\n    o 'Assignable = TERMINATOR Expression',     -> new Assign $1, $4\n    o 'Assignable = INDENT Expression OUTDENT', -> new Assign $1, $4\n  ]\n\n  # Assignment when it happens within an object literal. The difference from\n  # the ordinary **Assign** is that these allow numbers and strings as keys.\n  AssignObj: [\n    o 'ObjAssignable',                          -> new Value $1\n    o 'ObjRestValue'\n    o 'ObjAssignable : Expression',             -> new Assign LOC(1)(new Value $1), $3, 'object',\n                                                              operatorToken: LOC(2)(new Literal $2)\n    o 'ObjAssignable :\n       INDENT Expression OUTDENT',              -> new Assign LOC(1)(new Value $1), $4, 'object',\n                                                              operatorToken: LOC(2)(new Literal $2)\n    o 'SimpleObjAssignable = Expression',       -> new Assign LOC(1)(new Value $1), $3, null,\n                                                              operatorToken: LOC(2)(new Literal $2)\n    o 'SimpleObjAssignable =\n       INDENT Expression OUTDENT',              -> new Assign LOC(1)(new Value $1), $4, null,\n                                                              operatorToken: LOC(2)(new Literal $2)\n  ]\n\n  SimpleObjAssignable: [\n    o 'Identifier'\n    o 'Property'\n    o 'ThisProperty'\n  ]\n\n  ObjAssignable: [\n    o 'SimpleObjAssignable'\n    o '[ Expression ]',          -> new Value new ComputedPropertyName $2\n    o '@ [ Expression ]',        -> new Value LOC(1)(new ThisLiteral $1), [LOC(3)(new ComputedPropertyName($3))], 'this'\n    o 'AlphaNumeric'\n  ]\n\n  # Object literal spread properties.\n  ObjRestValue: [\n    o 'SimpleObjAssignable ...', -> new Splat new Value $1\n    o '... SimpleObjAssignable', -> new Splat new Value($2), postfix: no\n    o 'ObjSpreadExpr ...',       -> new Splat $1\n    o '... ObjSpreadExpr',       -> new Splat $2, postfix: no\n  ]\n\n  ObjSpreadExpr: [\n    o 'ObjSpreadIdentifier'\n    o 'Object'\n    o 'Parenthetical'\n    o 'Super'\n    o 'This'\n    o 'SUPER OptFuncExist Arguments',               -> new SuperCall LOC(1)(new Super), $3, $2.soak, $1\n    o 'DYNAMIC_IMPORT Arguments',                   -> new DynamicImportCall LOC(1)(new DynamicImport), $2\n    o 'SimpleObjAssignable OptFuncExist Arguments', -> new Call (new Value $1), $3, $2.soak\n    o 'ObjSpreadExpr OptFuncExist Arguments',       -> new Call $1, $3, $2.soak\n  ]\n\n  ObjSpreadIdentifier: [\n    o 'SimpleObjAssignable Accessor', -> (new Value $1).add $2\n    o 'ObjSpreadExpr Accessor',       -> (new Value $1).add $2\n  ]\n\n  # A return statement from a function body.\n  Return: [\n    o 'RETURN Expression',                      -> new Return $2\n    o 'RETURN INDENT Object OUTDENT',           -> new Return new Value $3\n    o 'RETURN',                                 -> new Return\n  ]\n\n  YieldReturn: [\n    o 'YIELD RETURN Expression',                -> new YieldReturn $3,   returnKeyword: LOC(2)(new Literal $2)\n    o 'YIELD RETURN',                           -> new YieldReturn null, returnKeyword: LOC(2)(new Literal $2)\n  ]\n\n  AwaitReturn: [\n    o 'AWAIT RETURN Expression',                -> new AwaitReturn $3,   returnKeyword: LOC(2)(new Literal $2)\n    o 'AWAIT RETURN',                           -> new AwaitReturn null, returnKeyword: LOC(2)(new Literal $2)\n  ]\n\n  # The **Code** node is the function literal. It’s defined by an indented block\n  # of **Block** preceded by a function arrow, with an optional parameter list.\n  Code: [\n    o 'PARAM_START ParamList PARAM_END FuncGlyph Block', -> new Code $2, $5, $4, LOC(1)(new Literal $1)\n    o 'FuncGlyph Block',                                 -> new Code [], $2, $1\n  ]\n\n  # The Codeline is the **Code** node with **Line** instead of indented **Block**.\n  CodeLine: [\n    o 'PARAM_START ParamList PARAM_END FuncGlyph Line', -> new Code $2, LOC(5)(Block.wrap [$5]), $4,\n                                                              LOC(1)(new Literal $1)\n    o 'FuncGlyph Line',                                 -> new Code [], LOC(2)(Block.wrap [$2]), $1\n  ]\n\n  # CoffeeScript has two different symbols for functions. `->` is for ordinary\n  # functions, and `=>` is for functions bound to the current value of *this*.\n  FuncGlyph: [\n    o '->',                                     -> new FuncGlyph $1\n    o '=>',                                     -> new FuncGlyph $1\n  ]\n\n  # An optional, trailing comma.\n  OptComma: [\n    o ''\n    o ','\n  ]\n\n  # The list of parameters that a function accepts can be of any length.\n  ParamList: [\n    o '',                                       -> []\n    o 'Param',                                  -> [$1]\n    o 'ParamList , Param',                      -> $1.concat $3\n    o 'ParamList OptComma TERMINATOR Param',    -> $1.concat $4\n    o 'ParamList OptComma INDENT ParamList OptComma OUTDENT', -> $1.concat $4\n  ]\n\n  # A single parameter in a function definition can be ordinary, or a splat\n  # that hoovers up the remaining arguments.\n  Param: [\n    o 'ParamVar',                               -> new Param $1\n    o 'ParamVar ...',                           -> new Param $1, null, on\n    o '... ParamVar',                           -> new Param $2, null, postfix: no\n    o 'ParamVar = Expression',                  -> new Param $1, $3\n    o '...',                                    -> new Expansion\n  ]\n\n  # Function Parameters\n  ParamVar: [\n    o 'Identifier'\n    o 'ThisProperty'\n    o 'Array'\n    o 'Object'\n  ]\n\n  # A splat that occurs outside of a parameter list.\n  Splat: [\n    o 'Expression ...',                         -> new Splat $1\n    o '... Expression',                         -> new Splat $2, {postfix: no}\n  ]\n\n  # Variables and properties that can be assigned to.\n  SimpleAssignable: [\n    o 'Identifier',                             -> new Value $1\n    o 'Value Accessor',                         -> $1.add $2\n    o 'Code Accessor',                          -> new Value($1).add $2\n    o 'ThisProperty'\n  ]\n\n  # Everything that can be assigned to.\n  Assignable: [\n    o 'SimpleAssignable'\n    o 'Array',                                  -> new Value $1\n    o 'Object',                                 -> new Value $1\n  ]\n\n  # The types of things that can be treated as values -- assigned to, invoked\n  # as functions, indexed into, named as a class, etc.\n  Value: [\n    o 'Assignable'\n    o 'Literal',                                -> new Value $1\n    o 'Parenthetical',                          -> new Value $1\n    o 'Range',                                  -> new Value $1\n    o 'Invocation',                             -> new Value $1\n    o 'DoIife',                                 -> new Value $1\n    o 'This'\n    o 'Super',                                  -> new Value $1\n    o 'MetaProperty',                           -> new Value $1\n  ]\n\n  # A `super`-based expression that can be used as a value.\n  Super: [\n    o 'SUPER . Property',                                      -> new Super LOC(3)(new Access $3), LOC(1)(new Literal $1)\n    o 'SUPER INDEX_START Expression INDEX_END',                -> new Super LOC(3)(new Index $3),  LOC(1)(new Literal $1)\n    o 'SUPER INDEX_START INDENT Expression OUTDENT INDEX_END', -> new Super LOC(4)(new Index $4),  LOC(1)(new Literal $1)\n  ]\n\n  # A “meta-property” access e.g. `new.target` or `import.meta`, where\n  # something that looks like a property is referenced on a keyword.\n  MetaProperty: [\n    o 'NEW_TARGET . Property',                  -> new MetaProperty LOC(1)(new IdentifierLiteral $1), LOC(3)(new Access $3)\n    o 'IMPORT_META . Property',                 -> new MetaProperty LOC(1)(new IdentifierLiteral $1), LOC(3)(new Access $3)\n  ]\n\n  # The general group of accessors into an object, by property, by prototype\n  # or by array index or slice.\n  Accessor: [\n    o '.  Property',                            -> new Access $2\n    o '?. Property',                            -> new Access $2, soak: yes\n    o ':: Property',                            -> [LOC(1)(new Access new PropertyName('prototype'), shorthand: yes), LOC(2)(new Access $2)]\n    o '?:: Property',                           -> [LOC(1)(new Access new PropertyName('prototype'), shorthand: yes, soak: yes), LOC(2)(new Access $2)]\n    o '::',                                     -> new Access new PropertyName('prototype'), shorthand: yes\n    o '?::',                                    -> new Access new PropertyName('prototype'), shorthand: yes, soak: yes\n    o 'Index'\n  ]\n\n  # Indexing into an object or array using bracket notation.\n  Index: [\n    o 'INDEX_START IndexValue INDEX_END',                -> $2\n    o 'INDEX_START INDENT IndexValue OUTDENT INDEX_END', -> $3\n    o 'INDEX_SOAK  Index',                               -> extend $2, soak: yes\n  ]\n\n  IndexValue: [\n    o 'Expression',                             -> new Index $1\n    o 'Slice',                                  -> new Slice $1\n  ]\n\n  # In CoffeeScript, an object literal is simply a list of assignments.\n  Object: [\n    o '{ AssignList OptComma }',                -> new Obj $2, $1.generated\n  ]\n\n  # Assignment of properties within an object literal can be separated by\n  # comma, as in JavaScript, or simply by newline.\n  AssignList: [\n    o '',                                                       -> []\n    o 'AssignObj',                                              -> [$1]\n    o 'AssignList , AssignObj',                                 -> $1.concat $3\n    o 'AssignList OptComma TERMINATOR AssignObj',               -> $1.concat $4\n    o 'AssignList OptComma INDENT AssignList OptComma OUTDENT', -> $1.concat $4\n  ]\n\n  # Class definitions have optional bodies of prototype property assignments,\n  # and optional references to the superclass.\n  Class: [\n    o 'CLASS',                                           -> new Class\n    o 'CLASS Block',                                     -> new Class null, null, $2\n    o 'CLASS EXTENDS Expression',                        -> new Class null, $3\n    o 'CLASS EXTENDS Expression Block',                  -> new Class null, $3, $4\n    o 'CLASS SimpleAssignable',                          -> new Class $2\n    o 'CLASS SimpleAssignable Block',                    -> new Class $2, null, $3\n    o 'CLASS SimpleAssignable EXTENDS Expression',       -> new Class $2, $4\n    o 'CLASS SimpleAssignable EXTENDS Expression Block', -> new Class $2, $4, $5\n  ]\n\n  Import: [\n    o 'IMPORT String',                                                                              -> new ImportDeclaration null, $2\n    o 'IMPORT String ASSERT Object',                                                                -> new ImportDeclaration null, $2, $4\n    o 'IMPORT ImportDefaultSpecifier FROM String',                                                  -> new ImportDeclaration new ImportClause($2, null), $4\n    o 'IMPORT ImportDefaultSpecifier FROM String ASSERT Object',                                    -> new ImportDeclaration new ImportClause($2, null), $4, $6\n    o 'IMPORT ImportNamespaceSpecifier FROM String',                                                -> new ImportDeclaration new ImportClause(null, $2), $4\n    o 'IMPORT ImportNamespaceSpecifier FROM String ASSERT Object',                                  -> new ImportDeclaration new ImportClause(null, $2), $4, $6\n    o 'IMPORT { } FROM String',                                                                     -> new ImportDeclaration new ImportClause(null, new ImportSpecifierList []), $5\n    o 'IMPORT { } FROM String ASSERT Object',                                                       -> new ImportDeclaration new ImportClause(null, new ImportSpecifierList []), $5, $7\n    o 'IMPORT { ImportSpecifierList OptComma } FROM String',                                        -> new ImportDeclaration new ImportClause(null, new ImportSpecifierList $3), $7\n    o 'IMPORT { ImportSpecifierList OptComma } FROM String ASSERT Object',                          -> new ImportDeclaration new ImportClause(null, new ImportSpecifierList $3), $7, $9\n    o 'IMPORT ImportDefaultSpecifier , ImportNamespaceSpecifier FROM String',                       -> new ImportDeclaration new ImportClause($2, $4), $6\n    o 'IMPORT ImportDefaultSpecifier , ImportNamespaceSpecifier FROM String ASSERT Object',         -> new ImportDeclaration new ImportClause($2, $4), $6, $8\n    o 'IMPORT ImportDefaultSpecifier , { ImportSpecifierList OptComma } FROM String',               -> new ImportDeclaration new ImportClause($2, new ImportSpecifierList $5), $9\n    o 'IMPORT ImportDefaultSpecifier , { ImportSpecifierList OptComma } FROM String ASSERT Object', -> new ImportDeclaration new ImportClause($2, new ImportSpecifierList $5), $9, $11\n  ]\n\n  ImportSpecifierList: [\n    o 'ImportSpecifier',                                                          -> [$1]\n    o 'ImportSpecifierList , ImportSpecifier',                                    -> $1.concat $3\n    o 'ImportSpecifierList OptComma TERMINATOR ImportSpecifier',                  -> $1.concat $4\n    o 'INDENT ImportSpecifierList OptComma OUTDENT',                              -> $2\n    o 'ImportSpecifierList OptComma INDENT ImportSpecifierList OptComma OUTDENT', -> $1.concat $4\n  ]\n\n  ImportSpecifier: [\n    o 'Identifier',                             -> new ImportSpecifier $1\n    o 'Identifier AS Identifier',               -> new ImportSpecifier $1, $3\n    o 'DEFAULT',                                -> new ImportSpecifier LOC(1)(new DefaultLiteral $1)\n    o 'DEFAULT AS Identifier',                  -> new ImportSpecifier LOC(1)(new DefaultLiteral($1)), $3\n  ]\n\n  ImportDefaultSpecifier: [\n    o 'Identifier',                             -> new ImportDefaultSpecifier $1\n  ]\n\n  ImportNamespaceSpecifier: [\n    o 'IMPORT_ALL AS Identifier',               -> new ImportNamespaceSpecifier new Literal($1), $3\n  ]\n\n  Export: [\n    o 'EXPORT { }',                                                        -> new ExportNamedDeclaration new ExportSpecifierList []\n    o 'EXPORT { ExportSpecifierList OptComma }',                           -> new ExportNamedDeclaration new ExportSpecifierList $3\n    o 'EXPORT Class',                                                      -> new ExportNamedDeclaration $2\n    o 'EXPORT Identifier = Expression',                                    -> new ExportNamedDeclaration LOC(2,4)(new Assign $2, $4, null,\n                                                                                                      moduleDeclaration: 'export')\n    o 'EXPORT Identifier = TERMINATOR Expression',                         -> new ExportNamedDeclaration LOC(2,5)(new Assign $2, $5, null,\n                                                                                                      moduleDeclaration: 'export')\n    o 'EXPORT Identifier = INDENT Expression OUTDENT',                     -> new ExportNamedDeclaration LOC(2,6)(new Assign $2, $5, null,\n                                                                                                      moduleDeclaration: 'export')\n    o 'EXPORT DEFAULT Expression',                                         -> new ExportDefaultDeclaration $3\n    o 'EXPORT DEFAULT INDENT Object OUTDENT',                              -> new ExportDefaultDeclaration new Value $4\n    o 'EXPORT EXPORT_ALL FROM String',                                     -> new ExportAllDeclaration new Literal($2), $4\n    o 'EXPORT EXPORT_ALL FROM String ASSERT Object',                       -> new ExportAllDeclaration new Literal($2), $4, $6\n    o 'EXPORT { } FROM String',                                            -> new ExportNamedDeclaration new ExportSpecifierList([]), $5\n    o 'EXPORT { } FROM String ASSERT Object',                              -> new ExportNamedDeclaration new ExportSpecifierList([]), $5, $7\n    o 'EXPORT { ExportSpecifierList OptComma } FROM String',               -> new ExportNamedDeclaration new ExportSpecifierList($3), $7\n    o 'EXPORT { ExportSpecifierList OptComma } FROM String ASSERT Object', -> new ExportNamedDeclaration new ExportSpecifierList($3), $7, $9\n  ]\n\n  ExportSpecifierList: [\n    o 'ExportSpecifier',                                                          -> [$1]\n    o 'ExportSpecifierList , ExportSpecifier',                                    -> $1.concat $3\n    o 'ExportSpecifierList OptComma TERMINATOR ExportSpecifier',                  -> $1.concat $4\n    o 'INDENT ExportSpecifierList OptComma OUTDENT',                              -> $2\n    o 'ExportSpecifierList OptComma INDENT ExportSpecifierList OptComma OUTDENT', -> $1.concat $4\n  ]\n\n  ExportSpecifier: [\n    o 'Identifier',                             -> new ExportSpecifier $1\n    o 'Identifier AS Identifier',               -> new ExportSpecifier $1, $3\n    o 'Identifier AS DEFAULT',                  -> new ExportSpecifier $1, LOC(3)(new DefaultLiteral $3)\n    o 'DEFAULT',                                -> new ExportSpecifier LOC(1)(new DefaultLiteral $1)\n    o 'DEFAULT AS Identifier',                  -> new ExportSpecifier LOC(1)(new DefaultLiteral($1)), $3\n  ]\n\n  # Ordinary function invocation, or a chained series of calls.\n  Invocation: [\n    o 'Value OptFuncExist String',              -> new TaggedTemplateCall $1, $3, $2.soak\n    o 'Value OptFuncExist Arguments',           -> new Call $1, $3, $2.soak\n    o 'SUPER OptFuncExist Arguments',           -> new SuperCall LOC(1)(new Super), $3, $2.soak, $1\n    o 'DYNAMIC_IMPORT Arguments',               -> new DynamicImportCall LOC(1)(new DynamicImport), $2\n  ]\n\n  # An optional existence check on a function.\n  OptFuncExist: [\n    o '',                                       -> soak: no\n    o 'FUNC_EXIST',                             -> soak: yes\n  ]\n\n  # The list of arguments to a function call.\n  Arguments: [\n    o 'CALL_START CALL_END',                    -> []\n    o 'CALL_START ArgList OptComma CALL_END',   -> $2.implicit = $1.generated; $2\n  ]\n\n  # A reference to the *this* current object.\n  This: [\n    o 'THIS',                                   -> new Value new ThisLiteral $1\n    o '@',                                      -> new Value new ThisLiteral $1\n  ]\n\n  # A reference to a property on *this*.\n  ThisProperty: [\n    o '@ Property',                             -> new Value LOC(1)(new ThisLiteral $1), [LOC(2)(new Access($2))], 'this'\n  ]\n\n  # The array literal.\n  Array: [\n    o '[ ]',                                    -> new Arr []\n    o '[ Elisions ]',                           -> new Arr $2\n    o '[ ArgElisionList OptElisions ]',         -> new Arr [].concat $2, $3\n  ]\n\n  # Inclusive and exclusive range dots.\n  RangeDots: [\n    o '..',                                     -> exclusive: no\n    o '...',                                    -> exclusive: yes\n  ]\n\n  # The CoffeeScript range literal.\n  Range: [\n    o '[ Expression RangeDots Expression ]',      -> new Range $2, $4, if $3.exclusive then 'exclusive' else 'inclusive'\n    o '[ ExpressionLine RangeDots Expression ]',  -> new Range $2, $4, if $3.exclusive then 'exclusive' else 'inclusive'\n  ]\n\n  # Array slice literals.\n  Slice: [\n    o 'Expression RangeDots Expression',        -> new Range $1, $3, if $2.exclusive then 'exclusive' else 'inclusive'\n    o 'Expression RangeDots',                   -> new Range $1, null, if $2.exclusive then 'exclusive' else 'inclusive'\n    o 'ExpressionLine RangeDots Expression',    -> new Range $1, $3, if $2.exclusive then 'exclusive' else 'inclusive'\n    o 'ExpressionLine RangeDots',               -> new Range $1, null, if $2.exclusive then 'exclusive' else 'inclusive'\n    o 'RangeDots Expression',                   -> new Range null, $2, if $1.exclusive then 'exclusive' else 'inclusive'\n    o 'RangeDots',                              -> new Range null, null, if $1.exclusive then 'exclusive' else 'inclusive'\n  ]\n\n  # The **ArgList** is the list of objects passed into a function call\n  # (i.e. comma-separated expressions). Newlines work as well.\n  ArgList: [\n    o 'Arg',                                              -> [$1]\n    o 'ArgList , Arg',                                    -> $1.concat $3\n    o 'ArgList OptComma TERMINATOR Arg',                  -> $1.concat $4\n    o 'INDENT ArgList OptComma OUTDENT',                  -> $2\n    o 'ArgList OptComma INDENT ArgList OptComma OUTDENT', -> $1.concat $4\n  ]\n\n  # Valid arguments are Blocks or Splats.\n  Arg: [\n    o 'Expression'\n    o 'ExpressionLine'\n    o 'Splat'\n    o '...',                                     -> new Expansion\n  ]\n\n  # The **ArgElisionList** is the list of objects, contents of an array literal\n  # (i.e. comma-separated expressions and elisions). Newlines work as well.\n  ArgElisionList: [\n    o 'ArgElision'\n    o 'ArgElisionList , ArgElision',                                          -> $1.concat $3\n    o 'ArgElisionList OptComma TERMINATOR ArgElision',                        -> $1.concat $4\n    o 'INDENT ArgElisionList OptElisions OUTDENT',                            -> $2.concat $3\n    o 'ArgElisionList OptElisions INDENT ArgElisionList OptElisions OUTDENT', -> $1.concat $2, $4, $5\n  ]\n\n  ArgElision: [\n    o 'Arg',                  -> [$1]\n    o 'Elisions Arg',         -> $1.concat $2\n  ]\n\n  OptElisions: [\n    o 'OptComma',             -> []\n    o ', Elisions',           -> [].concat $2\n  ]\n\n  Elisions: [\n    o 'Elision',              -> [$1]\n    o 'Elisions Elision',     -> $1.concat $2\n  ]\n\n  Elision: [\n    o ',',                    -> new Elision\n    o 'Elision TERMINATOR',   -> $1\n  ]\n\n  # Just simple, comma-separated, required arguments (no fancy syntax). We need\n  # this to be separate from the **ArgList** for use in **Switch** blocks, where\n  # having the newlines wouldn't make sense.\n  SimpleArgs: [\n    o 'Expression'\n    o 'ExpressionLine'\n    o 'SimpleArgs , Expression',                -> [].concat $1, $3\n    o 'SimpleArgs , ExpressionLine',            -> [].concat $1, $3\n  ]\n\n  # The variants of *try/catch/finally* exception handling blocks.\n  Try: [\n    o 'TRY Block',                              -> new Try $2\n    o 'TRY Block Catch',                        -> new Try $2, $3\n    o 'TRY Block FINALLY Block',                -> new Try $2, null, $4, LOC(3)(new Literal $3)\n    o 'TRY Block Catch FINALLY Block',          -> new Try $2, $3, $5, LOC(4)(new Literal $4)\n  ]\n\n  # A catch clause names its error and runs a block of code.\n  Catch: [\n    o 'CATCH Identifier Block',                 -> new Catch $3, $2\n    o 'CATCH Object Block',                     -> new Catch $3, LOC(2)(new Value($2))\n    o 'CATCH Block',                            -> new Catch $2\n  ]\n\n  # Throw an exception object.\n  Throw: [\n    o 'THROW Expression',                       -> new Throw $2\n    o 'THROW INDENT Object OUTDENT',            -> new Throw new Value $3\n  ]\n\n  # Parenthetical expressions. Note that the **Parenthetical** is a **Value**,\n  # not an **Expression**, so if you need to use an expression in a place\n  # where only values are accepted, wrapping it in parentheses will always do\n  # the trick.\n  Parenthetical: [\n    o '( Body )',                               -> new Parens $2\n    o '( INDENT Body OUTDENT )',                -> new Parens $3\n  ]\n\n  # The condition portion of a while loop.\n  WhileLineSource: [\n    o 'WHILE ExpressionLine',                       -> new While $2\n    o 'WHILE ExpressionLine WHEN ExpressionLine',   -> new While $2, guard: $4\n    o 'UNTIL ExpressionLine',                       -> new While $2, invert: true\n    o 'UNTIL ExpressionLine WHEN ExpressionLine',   -> new While $2, invert: true, guard: $4\n  ]\n\n  WhileSource: [\n    o 'WHILE Expression',                       -> new While $2\n    o 'WHILE Expression WHEN Expression',       -> new While $2, guard: $4\n    o 'WHILE ExpressionLine WHEN Expression',   -> new While $2, guard: $4\n    o 'UNTIL Expression',                       -> new While $2, invert: true\n    o 'UNTIL Expression WHEN Expression',       -> new While $2, invert: true, guard: $4\n    o 'UNTIL ExpressionLine WHEN Expression',   -> new While $2, invert: true, guard: $4\n  ]\n\n  # The while loop can either be normal, with a block of expressions to execute,\n  # or postfix, with a single expression. There is no do..while.\n  While: [\n    o 'WhileSource Block',                      -> $1.addBody $2\n    o 'WhileLineSource Block',                  -> $1.addBody $2\n    o 'Statement  WhileSource',                 -> (Object.assign $2, postfix: yes).addBody LOC(1) Block.wrap([$1])\n    o 'Expression WhileSource',                 -> (Object.assign $2, postfix: yes).addBody LOC(1) Block.wrap([$1])\n    o 'Loop',                                   -> $1\n  ]\n\n  Loop: [\n    o 'LOOP Block',                             -> new While(LOC(1)(new BooleanLiteral 'true'), isLoop: yes).addBody $2\n    o 'LOOP Expression',                        -> new While(LOC(1)(new BooleanLiteral 'true'), isLoop: yes).addBody LOC(2) Block.wrap [$2]\n  ]\n\n  # Array, object, and range comprehensions, at the most generic level.\n  # Comprehensions can either be normal, with a block of expressions to execute,\n  # or postfix, with a single expression.\n  For: [\n    o 'Statement    ForBody',  -> $2.postfix = yes; $2.addBody $1\n    o 'Expression   ForBody',  -> $2.postfix = yes; $2.addBody $1\n    o 'ForBody      Block',    -> $1.addBody $2\n    o 'ForLineBody  Block',    -> $1.addBody $2\n  ]\n\n  ForBody: [\n    o 'FOR Range',                -> new For [], source: (LOC(2) new Value($2))\n    o 'FOR Range BY Expression',  -> new For [], source: (LOC(2) new Value($2)), step: $4\n    o 'ForStart ForSource',       -> $1.addSource $2\n  ]\n\n  ForLineBody: [\n    o 'FOR Range BY ExpressionLine',  -> new For [], source: (LOC(2) new Value($2)), step: $4\n    o 'ForStart ForLineSource',       -> $1.addSource $2\n  ]\n\n  ForStart: [\n    o 'FOR ForVariables',        -> new For [], name: $2[0], index: $2[1]\n    o 'FOR AWAIT ForVariables',  ->\n        [name, index] = $3\n        new For [], {name, index, await: yes, awaitTag: (LOC(2) new Literal($2))}\n    o 'FOR OWN ForVariables',    ->\n        [name, index] = $3\n        new For [], {name, index, own: yes, ownTag: (LOC(2) new Literal($2))}\n  ]\n\n  # An array of all accepted values for a variable inside the loop.\n  # This enables support for pattern matching.\n  ForValue: [\n    o 'Identifier'\n    o 'ThisProperty'\n    o 'Array',                                  -> new Value $1\n    o 'Object',                                 -> new Value $1\n  ]\n\n  # An array or range comprehension has variables for the current element\n  # and (optional) reference to the current index. Or, *key, value*, in the case\n  # of object comprehensions.\n  ForVariables: [\n    o 'ForValue',                               -> [$1]\n    o 'ForValue , ForValue',                    -> [$1, $3]\n  ]\n\n  # The source of a comprehension is an array or object with an optional guard\n  # clause. If it’s an array comprehension, you can also choose to step through\n  # in fixed-size increments.\n  ForSource: [\n    o 'FORIN Expression',                                           -> source: $2\n    o 'FOROF Expression',                                           -> source: $2, object: yes\n    o 'FORIN Expression WHEN Expression',                           -> source: $2, guard: $4\n    o 'FORIN ExpressionLine WHEN Expression',                       -> source: $2, guard: $4\n    o 'FOROF Expression WHEN Expression',                           -> source: $2, guard: $4, object: yes\n    o 'FOROF ExpressionLine WHEN Expression',                       -> source: $2, guard: $4, object: yes\n    o 'FORIN Expression BY Expression',                             -> source: $2, step:  $4\n    o 'FORIN ExpressionLine BY Expression',                         -> source: $2, step:  $4\n    o 'FORIN Expression WHEN Expression BY Expression',             -> source: $2, guard: $4, step: $6\n    o 'FORIN ExpressionLine WHEN Expression BY Expression',         -> source: $2, guard: $4, step: $6\n    o 'FORIN Expression WHEN ExpressionLine BY Expression',         -> source: $2, guard: $4, step: $6\n    o 'FORIN ExpressionLine WHEN ExpressionLine BY Expression',     -> source: $2, guard: $4, step: $6\n    o 'FORIN Expression BY Expression WHEN Expression',             -> source: $2, step:  $4, guard: $6\n    o 'FORIN ExpressionLine BY Expression WHEN Expression',         -> source: $2, step:  $4, guard: $6\n    o 'FORIN Expression BY ExpressionLine WHEN Expression',         -> source: $2, step:  $4, guard: $6\n    o 'FORIN ExpressionLine BY ExpressionLine WHEN Expression',     -> source: $2, step:  $4, guard: $6\n    o 'FORFROM Expression',                                         -> source: $2, from: yes\n    o 'FORFROM Expression WHEN Expression',                         -> source: $2, guard: $4, from: yes\n    o 'FORFROM ExpressionLine WHEN Expression',                     -> source: $2, guard: $4, from: yes\n  ]\n\n  ForLineSource: [\n    o 'FORIN ExpressionLine',                                       -> source: $2\n    o 'FOROF ExpressionLine',                                       -> source: $2, object: yes\n    o 'FORIN Expression WHEN ExpressionLine',                       -> source: $2, guard: $4\n    o 'FORIN ExpressionLine WHEN ExpressionLine',                   -> source: $2, guard: $4\n    o 'FOROF Expression WHEN ExpressionLine',                       -> source: $2, guard: $4, object: yes\n    o 'FOROF ExpressionLine WHEN ExpressionLine',                   -> source: $2, guard: $4, object: yes\n    o 'FORIN Expression BY ExpressionLine',                         -> source: $2, step:  $4\n    o 'FORIN ExpressionLine BY ExpressionLine',                     -> source: $2, step:  $4\n    o 'FORIN Expression WHEN Expression BY ExpressionLine',         -> source: $2, guard: $4, step: $6\n    o 'FORIN ExpressionLine WHEN Expression BY ExpressionLine',     -> source: $2, guard: $4, step: $6\n    o 'FORIN Expression WHEN ExpressionLine BY ExpressionLine',     -> source: $2, guard: $4, step: $6\n    o 'FORIN ExpressionLine WHEN ExpressionLine BY ExpressionLine', -> source: $2, guard: $4, step: $6\n    o 'FORIN Expression BY Expression WHEN ExpressionLine',         -> source: $2, step:  $4, guard: $6\n    o 'FORIN ExpressionLine BY Expression WHEN ExpressionLine',     -> source: $2, step:  $4, guard: $6\n    o 'FORIN Expression BY ExpressionLine WHEN ExpressionLine',     -> source: $2, step:  $4, guard: $6\n    o 'FORIN ExpressionLine BY ExpressionLine WHEN ExpressionLine', -> source: $2, step:  $4, guard: $6\n    o 'FORFROM ExpressionLine',                                     -> source: $2, from: yes\n    o 'FORFROM Expression WHEN ExpressionLine',                     -> source: $2, guard: $4, from: yes\n    o 'FORFROM ExpressionLine WHEN ExpressionLine',                 -> source: $2, guard: $4, from: yes\n  ]\n\n  Switch: [\n    o 'SWITCH Expression INDENT Whens OUTDENT',                -> new Switch $2, $4\n    o 'SWITCH ExpressionLine INDENT Whens OUTDENT',            -> new Switch $2, $4\n    o 'SWITCH Expression INDENT Whens ELSE Block OUTDENT',     -> new Switch $2, $4, LOC(5,6) $6\n    o 'SWITCH ExpressionLine INDENT Whens ELSE Block OUTDENT', -> new Switch $2, $4, LOC(5,6) $6\n    o 'SWITCH INDENT Whens OUTDENT',                           -> new Switch null, $3\n    o 'SWITCH INDENT Whens ELSE Block OUTDENT',                -> new Switch null, $3, LOC(4,5) $5\n  ]\n\n  Whens: [\n    o 'When',                                   -> [$1]\n    o 'Whens When',                             -> $1.concat $2\n  ]\n\n  # An individual **When** clause, with action.\n  When: [\n    o 'LEADING_WHEN SimpleArgs Block',            -> new SwitchWhen $2, $3\n    o 'LEADING_WHEN SimpleArgs Block TERMINATOR', -> LOC(1, 3) new SwitchWhen $2, $3\n  ]\n\n  # The most basic form of *if* is a condition and an action. The following\n  # if-related rules are broken up along these lines in order to avoid\n  # ambiguity.\n  IfBlock: [\n    o 'IF Expression Block',                    -> new If $2, $3, type: $1\n    o 'IfBlock ELSE IF Expression Block',       -> $1.addElse LOC(3,5) new If $4, $5, type: $3\n  ]\n\n  # The full complement of *if* expressions, including postfix one-liner\n  # *if* and *unless*.\n  If: [\n    o 'IfBlock'\n    o 'IfBlock ELSE Block',                     -> $1.addElse $3\n    o 'Statement  POST_IF Expression',          -> new If $3, LOC(1)(Block.wrap [$1]), type: $2, postfix: true\n    o 'Expression POST_IF Expression',          -> new If $3, LOC(1)(Block.wrap [$1]), type: $2, postfix: true\n  ]\n\n  IfBlockLine: [\n    o 'IF ExpressionLine Block',                  -> new If $2, $3, type: $1\n    o 'IfBlockLine ELSE IF ExpressionLine Block', -> $1.addElse LOC(3,5) new If $4, $5, type: $3\n  ]\n\n  IfLine: [\n    o 'IfBlockLine'\n    o 'IfBlockLine ELSE Block',               -> $1.addElse $3\n    o 'Statement  POST_IF ExpressionLine',    -> new If $3, LOC(1)(Block.wrap [$1]), type: $2, postfix: true\n    o 'Expression POST_IF ExpressionLine',    -> new If $3, LOC(1)(Block.wrap [$1]), type: $2, postfix: true\n  ]\n\n  # Arithmetic and logical operators, working on one or more operands.\n  # Here they are grouped by order of precedence. The actual precedence rules\n  # are defined at the bottom of the page. It would be shorter if we could\n  # combine most of these rules into a single generic *Operand OpSymbol Operand*\n  # -type rule, but in order to make the precedence binding possible, separate\n  # rules are necessary.\n  OperationLine: [\n    o 'UNARY ExpressionLine',                   -> new Op $1, $2\n    o 'DO ExpressionLine',                      -> new Op $1, $2\n    o 'DO_IIFE CodeLine',                       -> new Op $1, $2\n  ]\n\n  Operation: [\n    o 'UNARY Expression',                       -> new Op $1.toString(), $2, undefined, undefined, originalOperator: $1.original\n    o 'DO Expression',                          -> new Op $1, $2\n    o 'UNARY_MATH Expression',                  -> new Op $1, $2\n    o '-     Expression',                      (-> new Op '-', $2), prec: 'UNARY_MATH'\n    o '+     Expression',                      (-> new Op '+', $2), prec: 'UNARY_MATH'\n\n    o 'AWAIT Expression',                       -> new Op $1, $2\n    o 'AWAIT INDENT Object OUTDENT',            -> new Op $1, $3\n\n    o '-- SimpleAssignable',                    -> new Op '--', $2\n    o '++ SimpleAssignable',                    -> new Op '++', $2\n    o 'SimpleAssignable --',                    -> new Op '--', $1, null, true\n    o 'SimpleAssignable ++',                    -> new Op '++', $1, null, true\n\n    # [The existential operator](https://coffeescript.org/#existential-operator).\n    o 'Expression ?',                           -> new Existence $1\n\n    o 'Expression +  Expression',               -> new Op '+' , $1, $3\n    o 'Expression -  Expression',               -> new Op '-' , $1, $3\n\n    o 'Expression MATH     Expression',         -> new Op $2, $1, $3\n    o 'Expression **       Expression',         -> new Op $2, $1, $3\n    o 'Expression SHIFT    Expression',         -> new Op $2, $1, $3\n    o 'Expression COMPARE  Expression',         -> new Op $2.toString(), $1, $3, undefined, originalOperator: $2.original\n    o 'Expression &        Expression',         -> new Op $2, $1, $3\n    o 'Expression ^        Expression',         -> new Op $2, $1, $3\n    o 'Expression |        Expression',         -> new Op $2, $1, $3\n    o 'Expression &&       Expression',         -> new Op $2.toString(), $1, $3, undefined, originalOperator: $2.original\n    o 'Expression ||       Expression',         -> new Op $2.toString(), $1, $3, undefined, originalOperator: $2.original\n    o 'Expression BIN?     Expression',         -> new Op $2, $1, $3\n    o 'Expression RELATION Expression',         -> new Op $2.toString(), $1, $3, undefined, invertOperator: $2.invert?.original ? $2.invert\n\n    o 'SimpleAssignable COMPOUND_ASSIGN\n       Expression',                             -> new Assign $1, $3, $2.toString(), originalContext: $2.original\n    o 'SimpleAssignable COMPOUND_ASSIGN\n       INDENT Expression OUTDENT',              -> new Assign $1, $4, $2.toString(), originalContext: $2.original\n    o 'SimpleAssignable COMPOUND_ASSIGN TERMINATOR\n       Expression',                             -> new Assign $1, $4, $2.toString(), originalContext: $2.original\n  ]\n\n  DoIife: [\n    o 'DO_IIFE Code',                           -> new Op $1 , $2\n  ]\n\n# Precedence\n# ----------\n\n# Operators at the top of this list have higher precedence than the ones lower\n# down. Following these rules is what makes `2 + 3 * 4` parse as:\n#\n#     2 + (3 * 4)\n#\n# And not:\n#\n#     (2 + 3) * 4\noperators = [\n  ['right',     'DO_IIFE']\n  ['left',      '.', '?.', '::', '?::']\n  ['left',      'CALL_START', 'CALL_END']\n  ['nonassoc',  '++', '--']\n  ['left',      '?']\n  ['right',     'UNARY', 'DO']\n  ['right',     'AWAIT']\n  ['right',     '**']\n  ['right',     'UNARY_MATH']\n  ['left',      'MATH']\n  ['left',      '+', '-']\n  ['left',      'SHIFT']\n  ['left',      'RELATION']\n  ['left',      'COMPARE']\n  ['left',      '&']\n  ['left',      '^']\n  ['left',      '|']\n  ['left',      '&&']\n  ['left',      '||']\n  ['left',      'BIN?']\n  ['nonassoc',  'INDENT', 'OUTDENT']\n  ['right',     'YIELD']\n  ['right',     '=', ':', 'COMPOUND_ASSIGN', 'RETURN', 'THROW', 'EXTENDS']\n  ['right',     'FORIN', 'FOROF', 'FORFROM', 'BY', 'WHEN']\n  ['right',     'IF', 'ELSE', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS', 'IMPORT', 'EXPORT', 'DYNAMIC_IMPORT']\n  ['left',      'POST_IF']\n]\n\n# Wrapping Up\n# -----------\n\n# Finally, now that we have our **grammar** and our **operators**, we can create\n# our **Jison.Parser**. We do this by processing all of our rules, recording all\n# terminals (every symbol which does not appear as the name of a rule above)\n# as \"tokens\".\ntokens = []\nfor name, alternatives of grammar\n  grammar[name] = for alt in alternatives\n    for token in alt[0].split ' '\n      tokens.push token unless grammar[token]\n    alt[1] = \"return #{alt[1]}\" if name is 'Root'\n    alt\n\n# Initialize the **Parser** with our list of terminal **tokens**, our **grammar**\n# rules, and the name of the root. Reverse the operators because Jison orders\n# precedence from low to high, and we have it high to low\n# (as in [Yacc](http://dinosaur.compilertools.net/yacc/index.html)).\nexports.parser = new Parser\n  tokens      : tokens.join ' '\n  bnf         : grammar\n  operators   : operators.reverse()\n  startSymbol : 'Root'\n"
  },
  {
    "path": "src/helpers.coffee",
    "content": "# This file contains the common helper functions that we'd like to share among\n# the **Lexer**, **Rewriter**, and the **Nodes**. Merge objects, flatten\n# arrays, count characters, that sort of thing.\n\n# Peek at the beginning of a given string to see if it matches a sequence.\nexports.starts = (string, literal, start) ->\n  literal is string.substr start, literal.length\n\n# Peek at the end of a given string to see if it matches a sequence.\nexports.ends = (string, literal, back) ->\n  len = literal.length\n  literal is string.substr string.length - len - (back or 0), len\n\n# Repeat a string `n` times.\nexports.repeat = repeat = (str, n) ->\n  # Use clever algorithm to have O(log(n)) string concatenation operations.\n  res = ''\n  while n > 0\n    res += str if n & 1\n    n >>>= 1\n    str += str\n  res\n\n# Trim out all falsy values from an array.\nexports.compact = (array) ->\n  item for item in array when item\n\n# Count the number of occurrences of a string in a string.\nexports.count = (string, substr) ->\n  num = pos = 0\n  return 1/0 unless substr.length\n  num++ while pos = 1 + string.indexOf substr, pos\n  num\n\n# Merge objects, returning a fresh copy with attributes from both sides.\n# Used every time `Base#compile` is called, to allow properties in the\n# options hash to propagate down the tree without polluting other branches.\nexports.merge = (options, overrides) ->\n  extend (extend {}, options), overrides\n\n# Extend a source object with the properties of another object (shallow copy).\nextend = exports.extend = (object, properties) ->\n  for key, val of properties\n    object[key] = val\n  object\n\n# Return a flattened version of an array.\n# Handy for getting a list of `children` from the nodes.\nexports.flatten = flatten = (array) ->\n  array.flat(Infinity)\n\n# Delete a key from an object, returning the value. Useful when a node is\n# looking for a particular method in an options hash.\nexports.del = (obj, key) ->\n  val =  obj[key]\n  delete obj[key]\n  val\n\n# Typical Array::some\nexports.some = Array::some ? (fn) ->\n  return true for e in this when fn e\n  false\n\n# Helper function for extracting code from Literate CoffeeScript by stripping\n# out all non-code blocks, producing a string of CoffeeScript code that can\n# be compiled “normally.”\nexports.invertLiterate = (code) ->\n  out = []\n  blankLine = /^\\s*$/\n  indented = /^[\\t ]/\n  listItemStart = /// ^\n    (?:\\t?|\\ {0,3})   # Up to one tab, or up to three spaces, or neither;\n    (?:\n      [\\*\\-\\+] |      # followed by `*`, `-` or `+`;\n      [0-9]{1,9}\\.    # or by an integer up to 9 digits long, followed by a period;\n    )\n    [\\ \\t]            # followed by a space or a tab.\n  ///\n  insideComment = no\n  for line in code.split('\\n')\n    if blankLine.test(line)\n      insideComment = no\n      out.push line\n    else if insideComment or listItemStart.test(line)\n      insideComment = yes\n      out.push \"# #{line}\"\n    else if not insideComment and indented.test(line)\n      out.push line\n    else\n      insideComment = yes\n      out.push \"# #{line}\"\n  out.join '\\n'\n\n# Merge two jison-style location data objects together.\n# If `last` is not provided, this will simply return `first`.\nbuildLocationData = (first, last) ->\n  if not last\n    first\n  else\n    first_line: first.first_line\n    first_column: first.first_column\n    last_line: last.last_line\n    last_column: last.last_column\n    last_line_exclusive: last.last_line_exclusive\n    last_column_exclusive: last.last_column_exclusive\n    range: [\n      first.range[0]\n      last.range[1]\n    ]\n\n# Build a list of all comments attached to tokens.\nexports.extractAllCommentTokens = (tokens) ->\n  allCommentsObj = {}\n  for token in tokens when token.comments\n    for comment in token.comments\n      commentKey = comment.locationData.range[0]\n      allCommentsObj[commentKey] = comment\n  sortedKeys = Object.keys(allCommentsObj).sort (a, b) -> a - b\n  for key in sortedKeys\n    allCommentsObj[key]\n\n# Get a lookup hash for a token based on its location data.\n# Multiple tokens might have the same location hash, but using exclusive\n# location data distinguishes e.g. zero-length generated tokens from\n# actual source tokens.\nbuildLocationHash = (loc) ->\n  \"#{loc.range[0]}-#{loc.range[1]}\"\n\n# Build a dictionary of extra token properties organized by tokens’ locations\n# used as lookup hashes.\nexports.buildTokenDataDictionary = buildTokenDataDictionary = (tokens) ->\n  tokenData = {}\n  for token in tokens when token.comments\n    tokenHash = buildLocationHash token[2]\n    # Multiple tokens might have the same location hash, such as the generated\n    # `JS` tokens added at the start or end of the token stream to hold\n    # comments that start or end a file.\n    tokenData[tokenHash] ?= {}\n    if token.comments # `comments` is always an array.\n      # For “overlapping” tokens, that is tokens with the same location data\n      # and therefore matching `tokenHash`es, merge the comments from both/all\n      # tokens together into one array, even if there are duplicate comments;\n      # they will get sorted out later.\n      (tokenData[tokenHash].comments ?= []).push token.comments...\n  tokenData\n\n# This returns a function which takes an object as a parameter, and if that\n# object is an AST node, updates that object's locationData.\n# The object is returned either way.\nexports.addDataToNode = (parserState, firstLocationData, firstValue, lastLocationData, lastValue, forceUpdateLocation = yes) ->\n  (obj) ->\n    # Add location data.\n    locationData = buildLocationData(firstValue?.locationData ? firstLocationData, lastValue?.locationData ? lastLocationData)\n    if obj?.updateLocationDataIfMissing? and firstLocationData?\n      obj.updateLocationDataIfMissing locationData, forceUpdateLocation\n    else\n      obj.locationData = locationData\n\n    # Add comments, building the dictionary of token data if it hasn’t been\n    # built yet.\n    parserState.tokenData ?= buildTokenDataDictionary parserState.parser.tokens\n    if obj.locationData?\n      objHash = buildLocationHash obj.locationData\n      if parserState.tokenData[objHash]?.comments?\n        attachCommentsToNode parserState.tokenData[objHash].comments, obj\n    obj\n\nexports.attachCommentsToNode = attachCommentsToNode = (comments, node) ->\n  return if not comments? or comments.length is 0\n  node.comments ?= []\n  node.comments.push comments...\n\n# Convert jison location data to a string.\n# `obj` can be a token, or a locationData.\nexports.locationDataToString = (obj) ->\n  if (\"2\" of obj) and (\"first_line\" of obj[2]) then locationData = obj[2]\n  else if \"first_line\" of obj then locationData = obj\n\n  if locationData\n    \"#{locationData.first_line + 1}:#{locationData.first_column + 1}-\" +\n    \"#{locationData.last_line + 1}:#{locationData.last_column + 1}\"\n  else\n    \"No location data\"\n\n# Generate a unique anonymous file name so we can distinguish source map cache\n# entries for any number of anonymous scripts.\nexports.anonymousFileName = do ->\n  n = 0\n  ->\n    \"<anonymous-#{n++}>\"\n\n# A `.coffee.md` compatible version of `basename`, that returns the file sans-extension.\nexports.baseFileName = (file, stripExt = no, useWinPathSep = no) ->\n  pathSep = if useWinPathSep then /\\\\|\\// else /\\//\n  parts = file.split(pathSep)\n  file = parts[parts.length - 1]\n  return file unless stripExt and file.indexOf('.') >= 0\n  parts = file.split('.')\n  parts.pop()\n  parts.pop() if parts[parts.length - 1] is 'coffee' and parts.length > 1\n  parts.join('.')\n\n# Determine if a filename represents a CoffeeScript file.\nexports.isCoffee = (file) -> /\\.((lit)?coffee|coffee\\.md)$/.test file\n\n# Determine if a filename represents a Literate CoffeeScript file.\nexports.isLiterate = (file) -> /\\.(litcoffee|coffee\\.md)$/.test file\n\n# Throws a SyntaxError from a given location.\n# The error's `toString` will return an error message following the \"standard\"\n# format `<filename>:<line>:<col>: <message>` plus the line with the error and a\n# marker showing where the error is.\nexports.throwSyntaxError = (message, location) ->\n  error = new SyntaxError message\n  error.location = location\n  error.toString = syntaxErrorToString\n\n  # Instead of showing the compiler's stacktrace, show our custom error message\n  # (this is useful when the error bubbles up in Node.js applications that\n  # compile CoffeeScript for example).\n  error.stack = error.toString()\n\n  throw error\n\n# Update a compiler SyntaxError with source code information if it didn't have\n# it already.\nexports.updateSyntaxError = (error, code, filename) ->\n  # Avoid screwing up the `stack` property of other errors (i.e. possible bugs).\n  if error.toString is syntaxErrorToString\n    error.code or= code\n    error.filename or= filename\n    error.stack = error.toString()\n  error\n\nsyntaxErrorToString = ->\n  return Error::toString.call @ unless @code and @location\n\n  {first_line, first_column, last_line, last_column} = @location\n  last_line ?= first_line\n  last_column ?= first_column\n\n  if @filename?.startsWith '<anonymous'\n    filename = '[stdin]'\n  else\n    filename = @filename or '[stdin]'\n\n  codeLine = @code.split('\\n')[first_line]\n  start    = first_column\n  # Show only the first line on multi-line errors.\n  end      = if first_line is last_line then last_column + 1 else codeLine.length\n  marker   = codeLine[...start].replace(/[^\\s]/g, ' ') + repeat('^', end - start)\n\n  # Check to see if we're running on a color-enabled TTY.\n  if process?\n    colorsEnabled = process.stdout?.isTTY and not process.env?.NODE_DISABLE_COLORS\n\n  if @colorful ? colorsEnabled\n    colorize = (str) -> \"\\x1B[1;31m#{str}\\x1B[0m\"\n    codeLine = codeLine[...start] + colorize(codeLine[start...end]) + codeLine[end..]\n    marker   = colorize marker\n\n  \"\"\"\n    #{filename}:#{first_line + 1}:#{first_column + 1}: error: #{@message}\n    #{codeLine}\n    #{marker}\n  \"\"\"\n\nexports.nameWhitespaceCharacter = (string) ->\n  switch string\n    when ' ' then 'space'\n    when '\\n' then 'newline'\n    when '\\r' then 'carriage return'\n    when '\\t' then 'tab'\n    else string\n\nexports.parseNumber = (string) ->\n  return NaN unless string?\n\n  base = switch string.charAt 1\n    when 'b' then 2\n    when 'o' then 8\n    when 'x' then 16\n    else null\n\n  if base?\n    parseInt string[2..].replace(/_/g, ''), base\n  else\n    parseFloat string.replace(/_/g, '')\n\nexports.isFunction = (obj) -> Object::toString.call(obj) is '[object Function]'\nexports.isNumber = isNumber = (obj) -> Object::toString.call(obj) is '[object Number]'\nexports.isString = isString = (obj) -> Object::toString.call(obj) is '[object String]'\nexports.isBoolean = isBoolean = (obj) -> obj is yes or obj is no or Object::toString.call(obj) is '[object Boolean]'\nexports.isPlainObject = (obj) -> typeof obj is 'object' and !!obj and not Array.isArray(obj) and not isNumber(obj) and not isString(obj) and not isBoolean(obj)\n\nunicodeCodePointToUnicodeEscapes = (codePoint) ->\n  toUnicodeEscape = (val) ->\n    str = val.toString 16\n    \"\\\\u#{repeat '0', 4 - str.length}#{str}\"\n  return toUnicodeEscape(codePoint) if codePoint < 0x10000\n  # surrogate pair\n  high = Math.floor((codePoint - 0x10000) / 0x400) + 0xD800\n  low = (codePoint - 0x10000) % 0x400 + 0xDC00\n  \"#{toUnicodeEscape(high)}#{toUnicodeEscape(low)}\"\n\n# Replace `\\u{...}` with `\\uxxxx[\\uxxxx]` in regexes without `u` flag\nexports.replaceUnicodeCodePointEscapes = (str, {flags, error, delimiter = ''} = {}) ->\n  shouldReplace = flags? and 'u' not in flags\n  str.replace UNICODE_CODE_POINT_ESCAPE, (match, escapedBackslash, codePointHex, offset) ->\n    return escapedBackslash if escapedBackslash\n\n    codePointDecimal = parseInt codePointHex, 16\n    if codePointDecimal > 0x10ffff\n      error \"unicode code point escapes greater than \\\\u{10ffff} are not allowed\",\n        offset: offset + delimiter.length\n        length: codePointHex.length + 4\n    return match unless shouldReplace\n\n    unicodeCodePointToUnicodeEscapes codePointDecimal\n\nUNICODE_CODE_POINT_ESCAPE = ///\n  ( \\\\\\\\ )        # Make sure the escape isn’t escaped.\n  |\n  \\\\u\\{ ( [\\da-fA-F]+ ) \\}\n///g\n"
  },
  {
    "path": "src/index.coffee",
    "content": "# Node.js Implementation\nCoffeeScript  = require './coffeescript'\nfs            = require 'fs'\nvm            = require 'vm'\npath          = require 'path'\n\nhelpers       = CoffeeScript.helpers\n\nCoffeeScript.transpile = (js, options) ->\n  try\n    babel = require '@babel/core'\n  catch\n    try\n      babel = require 'babel-core'\n    catch\n      # This error is only for Node, as CLI users will see a different error\n      # earlier if they don’t have Babel installed.\n      throw new Error 'To use the transpile option, you must have the \\'@babel/core\\' module installed'\n  babel.transform js, options\n\n# The `compile` method shared by the CLI, Node and browser APIs.\nuniversalCompile = CoffeeScript.compile\n# The `compile` method particular to the Node API.\nCoffeeScript.compile = (code, options) ->\n  # Pass a reference to Babel into the compiler, so that the transpile option\n  # is available in the Node API. We need to do this so that tools like Webpack\n  # can `require('coffeescript')` and build correctly, without trying to\n  # require Babel.\n  if options?.transpile\n    options.transpile.transpile = CoffeeScript.transpile\n  universalCompile.call CoffeeScript, code, options\n\n# Compile and execute a string of CoffeeScript (on the server), correctly\n# setting `__filename`, `__dirname`, and relative `require()`.\nCoffeeScript.run = (code, options = {}) ->\n  mainModule = require.main\n\n  # Set the filename.\n  mainModule.filename = process.argv[1] =\n    if options.filename then fs.realpathSync(options.filename) else helpers.anonymousFileName()\n\n  # Clear the module cache.\n  mainModule.moduleCache and= {}\n\n  # Assign paths for node_modules loading\n  dir = if options.filename?\n    path.dirname fs.realpathSync options.filename\n  else\n    fs.realpathSync '.'\n  mainModule.paths = require('module')._nodeModulePaths dir\n\n  # Save the options for compiling child imports.\n  mainModule.options = options\n\n  options.filename = mainModule.filename\n  options.inlineMap = true\n\n  # Compile.\n  answer = CoffeeScript.compile code, options\n  code = answer.js ? answer\n\n  mainModule._compile code, mainModule.filename\n\n# Compile and evaluate a string of CoffeeScript (in a Node.js-like environment).\n# The CoffeeScript REPL uses this to run the input.\nCoffeeScript.eval = (code, options = {}) ->\n  return unless code = code.trim()\n  createContext = vm.Script.createContext ? vm.createContext\n\n  isContext = vm.isContext ? (ctx) ->\n    options.sandbox instanceof createContext().constructor\n\n  if createContext\n    if options.sandbox?\n      if isContext options.sandbox\n        sandbox = options.sandbox\n      else\n        sandbox = createContext()\n        sandbox[k] = v for own k, v of options.sandbox\n      sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox\n    else\n      sandbox = global\n    sandbox.__filename = options.filename || 'eval'\n    sandbox.__dirname  = path.dirname sandbox.__filename\n    # define module/require only if they chose not to specify their own\n    unless sandbox isnt global or sandbox.module or sandbox.require\n      Module = require 'module'\n      sandbox.module  = _module  = new Module(options.modulename || 'eval')\n      sandbox.require = _require = (path) ->  Module._load path, _module, true\n      _module.filename = sandbox.__filename\n      for r in Object.getOwnPropertyNames require when r not in ['paths', 'arguments', 'caller']\n        _require[r] = require[r]\n      # use the same hack node currently uses for their own REPL\n      _require.paths = _module.paths = Module._nodeModulePaths process.cwd()\n      _require.resolve = (request) -> Module._resolveFilename request, _module\n  o = {}\n  o[k] = v for own k, v of options\n  o.bare = on # ensure return value\n  js = CoffeeScript.compile code, o\n  if sandbox is global\n    vm.runInThisContext js\n  else\n    vm.runInContext js, sandbox\n\nCoffeeScript.register = -> require './register'\n\n# Throw error with deprecation warning when depending upon implicit `require.extensions` registration\nif require.extensions\n  for ext in CoffeeScript.FILE_EXTENSIONS then do (ext) ->\n    require.extensions[ext] ?= ->\n      throw new Error \"\"\"\n      Use CoffeeScript.register() or require the coffeescript/register module to require #{ext} files.\n      \"\"\"\n\nCoffeeScript._compileRawFileContent = (raw, filename, options = {}) ->\n\n  # Strip the Unicode byte order mark, if this file begins with one.\n  stripped = if raw.charCodeAt(0) is 0xFEFF then raw.substring 1 else raw\n\n  options = Object.assign {}, options,\n    filename: filename\n    literate: helpers.isLiterate filename\n    sourceFiles: [filename]\n\n  try\n    answer = CoffeeScript.compile stripped, options\n  catch err\n    # As the filename and code of a dynamically loaded file will be different\n    # from the original file compiled with CoffeeScript.run, add that\n    # information to error so it can be pretty-printed later.\n    throw helpers.updateSyntaxError err, stripped, filename\n\n  answer\n\nCoffeeScript._compileFile = (filename, options = {}) ->\n  raw = fs.readFileSync filename, 'utf8'\n\n  CoffeeScript._compileRawFileContent raw, filename, options\n\nmodule.exports = CoffeeScript\n\n# Explicitly define all named exports so that Node’s automatic detection of\n# named exports from CommonJS packages finds all of them. This enables consuming\n# packages to write code like `import { compile } from 'coffeescript'`.\n# Don’t simplify this into a loop or similar; the `module.exports.name` part is\n# essential for Node’s algorithm to successfully detect the name.\nmodule.exports.VERSION = CoffeeScript.VERSION\nmodule.exports.FILE_EXTENSIONS = CoffeeScript.FILE_EXTENSIONS\nmodule.exports.helpers = CoffeeScript.helpers\nmodule.exports.registerCompiled = CoffeeScript.registerCompiled\nmodule.exports.compile = CoffeeScript.compile\nmodule.exports.tokens = CoffeeScript.tokens\nmodule.exports.nodes = CoffeeScript.nodes\nmodule.exports.register = CoffeeScript.register\nmodule.exports.eval = CoffeeScript.eval\nmodule.exports.run = CoffeeScript.run\nmodule.exports.transpile = CoffeeScript.transpile\nmodule.exports.patchStackTrace = CoffeeScript.patchStackTrace\nmodule.exports._compileRawFileContent = CoffeeScript._compileRawFileContent\nmodule.exports._compileFile = CoffeeScript._compileFile\n"
  },
  {
    "path": "src/lexer.coffee",
    "content": "# The CoffeeScript Lexer. Uses a series of token-matching regexes to attempt\n# matches against the beginning of the source code. When a match is found,\n# a token is produced, we consume the match, and start again. Tokens are in the\n# form:\n#\n#     [tag, value, locationData]\n#\n# where locationData is {first_line, first_column, last_line, last_column, last_line_exclusive, last_column_exclusive}, which is a\n# format that can be fed directly into [Jison](https://github.com/zaach/jison).  These\n# are read by jison in the `parser.lexer` function defined in coffeescript.coffee.\n\n{Rewriter, INVERSES, UNFINISHED} = require './rewriter'\n\n# Import the helpers we need.\n{count, starts, compact, repeat, invertLiterate, merge,\nattachCommentsToNode, locationDataToString, throwSyntaxError\nreplaceUnicodeCodePointEscapes, flatten, parseNumber} = require './helpers'\n\n# The Lexer Class\n# ---------------\n\n# The Lexer class reads a stream of CoffeeScript and divvies it up into tagged\n# tokens. Some potential ambiguity in the grammar has been avoided by\n# pushing some extra smarts into the Lexer.\nexports.Lexer = class Lexer\n\n  # **tokenize** is the Lexer's main method. Scan by attempting to match tokens\n  # one at a time, using a regular expression anchored at the start of the\n  # remaining code, or a custom recursive token-matching method\n  # (for interpolations). When the next token has been recorded, we move forward\n  # within the code past the token, and begin again.\n  #\n  # Each tokenizing method is responsible for returning the number of characters\n  # it has consumed.\n  #\n  # Before returning the token stream, run it through the [Rewriter](rewriter.html).\n  tokenize: (code, opts = {}) ->\n    @literate   = opts.literate  # Are we lexing literate CoffeeScript?\n    @indent     = 0              # The current indentation level.\n    @baseIndent = 0              # The overall minimum indentation level.\n    @continuationLineAdditionalIndent = 0 # The over-indentation at the current level.\n    @outdebt    = 0              # The under-outdentation at the current level.\n    @indents    = []             # The stack of all current indentation levels.\n    @indentLiteral = ''          # The indentation.\n    @ends       = []             # The stack for pairing up tokens.\n    @tokens     = []             # Stream of parsed tokens in the form `['TYPE', value, location data]`.\n    @seenFor    = no             # Used to recognize `FORIN`, `FOROF` and `FORFROM` tokens.\n    @seenImport = no             # Used to recognize `IMPORT FROM? AS?` tokens.\n    @seenExport = no             # Used to recognize `EXPORT FROM? AS?` tokens.\n    @importSpecifierList = no    # Used to identify when in an `IMPORT {...} FROM? ...`.\n    @exportSpecifierList = no    # Used to identify when in an `EXPORT {...} FROM? ...`.\n    @jsxDepth = 0                # Used to optimize JSX checks, how deep in JSX we are.\n    @jsxObjAttribute = {}        # Used to detect if JSX attributes is wrapped in {} (<div {props...} />).\n\n    @chunkLine =\n      opts.line or 0             # The start line for the current @chunk.\n    @chunkColumn =\n      opts.column or 0           # The start column of the current @chunk.\n    @chunkOffset =\n      opts.offset or 0           # The start offset for the current @chunk.\n    @locationDataCompensations =\n      opts.locationDataCompensations or {} # The location data compensations for the current @chunk.\n    code = @clean code           # The stripped, cleaned original source code.\n\n    # At every position, run through this list of attempted matches,\n    # short-circuiting if any of them succeed. Their order determines precedence:\n    # `@literalToken` is the fallback catch-all.\n    i = 0\n    while @chunk = code[i..]\n      consumed = \\\n           @identifierToken() or\n           @commentToken()    or\n           @whitespaceToken() or\n           @lineToken()       or\n           @stringToken()     or\n           @numberToken()     or\n           @jsxToken()        or\n           @regexToken()      or\n           @jsToken()         or\n           @literalToken()\n\n      # Update position.\n      [@chunkLine, @chunkColumn, @chunkOffset] = @getLineAndColumnFromChunk consumed\n\n      i += consumed\n\n      return {@tokens, index: i} if opts.untilBalanced and @ends.length is 0\n\n    @closeIndentation()\n    @error \"missing #{end.tag}\", (end.origin ? end)[2] if end = @ends.pop()\n    return @tokens if opts.rewrite is off\n    (new Rewriter).rewrite @tokens\n\n  # Preprocess the code to remove leading and trailing whitespace, carriage\n  # returns, etc. If we’re lexing literate CoffeeScript, strip external Markdown\n  # by removing all lines that aren’t indented by at least four spaces or a tab.\n  clean: (code) ->\n    thusFar = 0\n    if code.charCodeAt(0) is BOM\n      code = code.slice 1\n      @locationDataCompensations[0] = 1\n      thusFar += 1\n    if WHITESPACE.test code\n      code = \"\\n#{code}\"\n      @chunkLine--\n      @locationDataCompensations[0] ?= 0\n      @locationDataCompensations[0] -= 1\n    code = code\n      .replace /\\r/g, (match, offset) =>\n        @locationDataCompensations[thusFar + offset] = 1\n        ''\n      .replace TRAILING_SPACES, ''\n    code = invertLiterate code if @literate\n    code\n\n  # Tokenizers\n  # ----------\n\n  # Matches identifying literals: variables, keywords, method names, etc.\n  # Check to ensure that JavaScript reserved words aren’t being used as\n  # identifiers. Because CoffeeScript reserves a handful of keywords that are\n  # allowed in JavaScript, we’re careful not to tag them as keywords when\n  # referenced as property names here, so you can still do `jQuery.is()` even\n  # though `is` means `===` otherwise.\n  identifierToken: ->\n    inJSXTag = @atJSXTag()\n    regex = if inJSXTag then JSX_ATTRIBUTE else IDENTIFIER\n    return 0 unless match = regex.exec @chunk\n    [input, id, colon] = match\n\n    # Preserve length of id for location data\n    idLength = id.length\n    poppedToken = undefined\n    if id is 'own' and @tag() is 'FOR'\n      @token 'OWN', id\n      return id.length\n    if id is 'from' and @tag() is 'YIELD'\n      @token 'FROM', id\n      return id.length\n    if id is 'as' and @seenImport\n      if @value() is '*'\n        @tokens[@tokens.length - 1][0] = 'IMPORT_ALL'\n      else if @value(yes) in COFFEE_KEYWORDS\n        prev = @prev()\n        [prev[0], prev[1]] = ['IDENTIFIER', @value(yes)]\n      if @tag() in ['DEFAULT', 'IMPORT_ALL', 'IDENTIFIER']\n        @token 'AS', id\n        return id.length\n    if id is 'as' and @seenExport\n      if @tag() in ['IDENTIFIER', 'DEFAULT']\n        @token 'AS', id\n        return id.length\n      if @value(yes) in COFFEE_KEYWORDS\n        prev = @prev()\n        [prev[0], prev[1]] = ['IDENTIFIER', @value(yes)]\n        @token 'AS', id\n        return id.length\n    if id is 'default' and @seenExport and @tag() in ['EXPORT', 'AS']\n      @token 'DEFAULT', id\n      return id.length\n    if id is 'assert' and (@seenImport or @seenExport) and @tag() is 'STRING'\n      @token 'ASSERT', id\n      return id.length\n    if id is 'do' and regExSuper = /^(\\s*super)(?!\\(\\))/.exec @chunk[3...]\n      @token 'SUPER', 'super'\n      @token 'CALL_START', '('\n      @token 'CALL_END', ')'\n      [input, sup] = regExSuper\n      return sup.length + 3\n\n    prev = @prev()\n\n    tag =\n      if colon or prev? and\n         (prev[0] in ['.', '?.', '::', '?::'] or\n         not prev.spaced and prev[0] is '@')\n        'PROPERTY'\n      else\n        'IDENTIFIER'\n\n    tokenData = {}\n    if tag is 'IDENTIFIER' and (id in JS_KEYWORDS or id in COFFEE_KEYWORDS) and\n       not (@exportSpecifierList and id in COFFEE_KEYWORDS)\n      tag = id.toUpperCase()\n      if tag is 'WHEN' and @tag() in LINE_BREAK\n        tag = 'LEADING_WHEN'\n      else if tag is 'FOR'\n        @seenFor = {endsLength: @ends.length}\n      else if tag is 'UNLESS'\n        tag = 'IF'\n      else if tag is 'IMPORT'\n        @seenImport = yes\n      else if tag is 'EXPORT'\n        @seenExport = yes\n      else if tag in UNARY\n        tag = 'UNARY'\n      else if tag in RELATION\n        if tag isnt 'INSTANCEOF' and @seenFor\n          tag = 'FOR' + tag\n          @seenFor = no\n        else\n          tag = 'RELATION'\n          if @value() is '!'\n            poppedToken = @tokens.pop()\n            tokenData.invert = poppedToken.data?.original ? poppedToken[1]\n    else if tag is 'IDENTIFIER' and @seenFor and id is 'from' and\n       isForFrom(prev)\n      tag = 'FORFROM'\n      @seenFor = no\n    # Throw an error on attempts to use `get` or `set` as keywords, or\n    # what CoffeeScript would normally interpret as calls to functions named\n    # `get` or `set`, i.e. `get({foo: function () {}})`.\n    else if tag is 'PROPERTY' and prev\n      if prev.spaced and prev[0] in CALLABLE and /^[gs]et$/.test(prev[1]) and\n         @tokens.length > 1 and @tokens[@tokens.length - 2][0] not in ['.', '?.', '@']\n        @error \"'#{prev[1]}' cannot be used as a keyword, or as a function call\n        without parentheses\", prev[2]\n      else if prev[0] is '.' and @tokens.length > 1 and (prevprev = @tokens[@tokens.length - 2])[0] is 'UNARY' and prevprev[1] is 'new'\n        prevprev[0] = 'NEW_TARGET'\n      else if prev[0] is '.' and @tokens.length > 1 and (prevprev = @tokens[@tokens.length - 2])[0] is 'IMPORT' and prevprev[1] is 'import'\n        @seenImport = no\n        prevprev[0] = 'IMPORT_META'\n      else if @tokens.length > 2\n        prevprev = @tokens[@tokens.length - 2]\n        if prev[0] in ['@', 'THIS'] and prevprev and prevprev.spaced and\n           /^[gs]et$/.test(prevprev[1]) and\n           @tokens[@tokens.length - 3][0] not in ['.', '?.', '@']\n          @error \"'#{prevprev[1]}' cannot be used as a keyword, or as a\n          function call without parentheses\", prevprev[2]\n\n    if tag is 'IDENTIFIER' and id in RESERVED and not inJSXTag\n      @error \"reserved word '#{id}'\", length: id.length\n\n    unless tag is 'PROPERTY' or @exportSpecifierList or @importSpecifierList\n      if id in COFFEE_ALIASES\n        alias = id\n        id = COFFEE_ALIAS_MAP[id]\n        tokenData.original = alias\n      tag = switch id\n        when '!'                 then 'UNARY'\n        when '==', '!='          then 'COMPARE'\n        when 'true', 'false'     then 'BOOL'\n        when 'break', 'continue', \\\n             'debugger'          then 'STATEMENT'\n        when '&&', '||'          then id\n        else  tag\n\n    tagToken = @token tag, id, length: idLength, data: tokenData\n    tagToken.origin = [tag, alias, tagToken[2]] if alias\n    if poppedToken\n      [tagToken[2].first_line, tagToken[2].first_column, tagToken[2].range[0]] =\n        [poppedToken[2].first_line, poppedToken[2].first_column, poppedToken[2].range[0]]\n    if colon\n      colonOffset = input.lastIndexOf if inJSXTag then '=' else ':'\n      colonToken = @token ':', ':', offset: colonOffset\n      colonToken.jsxColon = yes if inJSXTag # used by rewriter\n    if inJSXTag and tag is 'IDENTIFIER' and prev[0] isnt ':'\n      @token ',', ',', length: 0, origin: tagToken, generated: yes\n\n    input.length\n\n  # Matches numbers, including decimals, hex, and exponential notation.\n  # Be careful not to interfere with ranges in progress.\n  numberToken: ->\n    return 0 unless match = NUMBER.exec @chunk\n\n    number = match[0]\n    lexedLength = number.length\n\n    switch\n      when /^0[BOX]/.test number\n        @error \"radix prefix in '#{number}' must be lowercase\", offset: 1\n      when /^0\\d*[89]/.test number\n        @error \"decimal literal '#{number}' must not be prefixed with '0'\", length: lexedLength\n      when /^0\\d+/.test number\n        @error \"octal literal '#{number}' must be prefixed with '0o'\", length: lexedLength\n\n    parsedValue = parseNumber number\n    tokenData = {parsedValue}\n\n    tag = if parsedValue is Infinity then 'INFINITY' else 'NUMBER'\n    if tag is 'INFINITY'\n      tokenData.original = number\n    @token tag, number,\n      length: lexedLength\n      data: tokenData\n    lexedLength\n\n  # Matches strings, including multiline strings, as well as heredocs, with or without\n  # interpolation.\n  stringToken: ->\n    [quote] = STRING_START.exec(@chunk) || []\n    return 0 unless quote\n\n    # If the preceding token is `from` and this is an import or export statement,\n    # properly tag the `from`.\n    prev = @prev()\n    if prev and @value() is 'from' and (@seenImport or @seenExport)\n      prev[0] = 'FROM'\n\n    regex = switch quote\n      when \"'\"   then STRING_SINGLE\n      when '\"'   then STRING_DOUBLE\n      when \"'''\" then HEREDOC_SINGLE\n      when '\"\"\"' then HEREDOC_DOUBLE\n\n    {tokens, index: end} = @matchWithInterpolations regex, quote\n\n    heredoc = quote.length is 3\n    if heredoc\n      # Find the smallest indentation. It will be removed from all lines later.\n      indent = null\n      doc = (token[1] for token, i in tokens when token[0] is 'NEOSTRING').join '#{}'\n      while match = HEREDOC_INDENT.exec doc\n        attempt = match[1]\n        indent = attempt if indent is null or 0 < attempt.length < indent.length\n\n    delimiter = quote.charAt(0)\n    @mergeInterpolationTokens tokens, {quote, indent, endOffset: end}, (value) =>\n      @validateUnicodeCodePointEscapes value, delimiter: quote\n\n    if @atJSXTag()\n      @token ',', ',', length: 0, origin: @prev, generated: yes\n\n    end\n\n  # Matches and consumes comments. The comments are taken out of the token\n  # stream and saved for later, to be reinserted into the output after\n  # everything has been parsed and the JavaScript code generated.\n  commentToken: (chunk = @chunk, {heregex, returnCommentTokens = no, offsetInChunk = 0} = {}) ->\n    return 0 unless match = chunk.match COMMENT\n    [commentWithSurroundingWhitespace, hereLeadingWhitespace, hereComment, hereTrailingWhitespace, lineComment] = match\n    contents = null\n    # Does this comment follow code on the same line?\n    leadingNewline = /^\\s*\\n+\\s*#/.test commentWithSurroundingWhitespace\n    if hereComment\n      matchIllegal = HERECOMMENT_ILLEGAL.exec hereComment\n      if matchIllegal\n        @error \"block comments cannot contain #{matchIllegal[0]}\",\n          offset: '###'.length + matchIllegal.index, length: matchIllegal[0].length\n\n      # Parse indentation or outdentation as if this block comment didn’t exist.\n      chunk = chunk.replace \"####{hereComment}###\", ''\n      # Remove leading newlines, like `Rewriter::removeLeadingNewlines`, to\n      # avoid the creation of unwanted `TERMINATOR` tokens.\n      chunk = chunk.replace /^\\n+/, ''\n      @lineToken {chunk}\n\n      # Pull out the ###-style comment’s content, and format it.\n      content = hereComment\n      contents = [{\n        content\n        length: commentWithSurroundingWhitespace.length - hereLeadingWhitespace.length - hereTrailingWhitespace.length\n        leadingWhitespace: hereLeadingWhitespace\n      }]\n    else\n      # The `COMMENT` regex captures successive line comments as one token.\n      # Remove any leading newlines before the first comment, but preserve\n      # blank lines between line comments.\n      leadingNewlines = ''\n      content = lineComment.replace /^(\\n*)/, (leading) ->\n        leadingNewlines = leading\n        ''\n      precedingNonCommentLines = ''\n      hasSeenFirstCommentLine = no\n      contents =\n        content.split '\\n'\n        .map (line, index) ->\n          unless line.indexOf('#') > -1\n            precedingNonCommentLines += \"\\n#{line}\"\n            return\n          leadingWhitespace = ''\n          content = line.replace /^([ |\\t]*)#/, (_, whitespace) ->\n            leadingWhitespace = whitespace\n            ''\n          comment = {\n            content\n            length: '#'.length + content.length\n            leadingWhitespace: \"#{unless hasSeenFirstCommentLine then leadingNewlines else ''}#{precedingNonCommentLines}#{leadingWhitespace}\"\n            precededByBlankLine: !!precedingNonCommentLines\n          }\n          hasSeenFirstCommentLine = yes\n          precedingNonCommentLines = ''\n          comment\n        .filter (comment) -> comment\n\n    getIndentSize = ({leadingWhitespace, nonInitial}) ->\n      lastNewlineIndex = leadingWhitespace.lastIndexOf '\\n'\n      if hereComment? or not nonInitial\n        return null unless lastNewlineIndex > -1\n      else\n        lastNewlineIndex ?= -1\n      leadingWhitespace.length - 1 - lastNewlineIndex\n    commentAttachments = for {content, length, leadingWhitespace, precededByBlankLine}, i in contents\n      nonInitial = i isnt 0\n      leadingNewlineOffset = if nonInitial then 1 else 0\n      offsetInChunk += leadingNewlineOffset + leadingWhitespace.length\n      indentSize = getIndentSize {leadingWhitespace, nonInitial}\n      noIndent = not indentSize? or indentSize is -1\n      commentAttachment = {\n        content\n        here: hereComment?\n        newLine: leadingNewline or nonInitial # Line comments after the first one start new lines, by definition.\n        locationData: @makeLocationData {offsetInChunk, length}\n        precededByBlankLine\n        indentSize\n        indented:  not noIndent and indentSize > @indent\n        outdented: not noIndent and indentSize < @indent\n      }\n      commentAttachment.heregex = yes if heregex\n      offsetInChunk += length\n      commentAttachment\n\n    prev = @prev()\n    unless prev\n      # If there’s no previous token, create a placeholder token to attach\n      # this comment to; and follow with a newline.\n      commentAttachments[0].newLine = yes\n      @lineToken chunk: @chunk[commentWithSurroundingWhitespace.length..], offset: commentWithSurroundingWhitespace.length # Set the indent.\n      placeholderToken = @makeToken 'JS', '', offset: commentWithSurroundingWhitespace.length, generated: yes\n      placeholderToken.comments = commentAttachments\n      @tokens.push placeholderToken\n      @newlineToken commentWithSurroundingWhitespace.length\n    else\n      attachCommentsToNode commentAttachments, prev\n\n    return commentAttachments if returnCommentTokens\n    commentWithSurroundingWhitespace.length\n\n  # Matches JavaScript interpolated directly into the source via backticks.\n  jsToken: ->\n    return 0 unless @chunk.charAt(0) is '`' and\n      (match = (matchedHere = HERE_JSTOKEN.exec(@chunk)) or JSTOKEN.exec(@chunk))\n    # Convert escaped backticks to backticks, and escaped backslashes\n    # just before escaped backticks to backslashes\n    script = match[1]\n    {length} = match[0]\n    @token 'JS', script, {length, data: {here: !!matchedHere}}\n    length\n\n  # Matches regular expression literals, as well as multiline extended ones.\n  # Lexing regular expressions is difficult to distinguish from division, so we\n  # borrow some basic heuristics from JavaScript and Ruby.\n  regexToken: ->\n    switch\n      when match = REGEX_ILLEGAL.exec @chunk\n        @error \"regular expressions cannot begin with #{match[2]}\",\n          offset: match.index + match[1].length\n      when match = @matchWithInterpolations HEREGEX, '///'\n        {tokens, index} = match\n        comments = []\n        while matchedComment = HEREGEX_COMMENT.exec @chunk[0...index]\n          {index: commentIndex} = matchedComment\n          [fullMatch, leadingWhitespace, comment] = matchedComment\n          comments.push {comment, offsetInChunk: commentIndex + leadingWhitespace.length}\n        commentTokens = flatten(\n          for commentOpts in comments\n            @commentToken commentOpts.comment, Object.assign commentOpts, heregex: yes, returnCommentTokens: yes\n        )\n      when match = REGEX.exec @chunk\n        [regex, body, closed] = match\n        @validateEscapes body, isRegex: yes, offsetInChunk: 1\n        index = regex.length\n        prev = @prev()\n        if prev\n          if prev.spaced and prev[0] in CALLABLE\n            return 0 if not closed or POSSIBLY_DIVISION.test regex\n          else if prev[0] in NOT_REGEX\n            return 0\n        @error 'missing / (unclosed regex)' unless closed\n      else\n        return 0\n\n    [flags] = REGEX_FLAGS.exec @chunk[index..]\n    end = index + flags.length\n    origin = @makeToken 'REGEX', null, length: end\n    switch\n      when not VALID_FLAGS.test flags\n        @error \"invalid regular expression flags #{flags}\", offset: index, length: flags.length\n      when regex or tokens.length is 1\n        delimiter = if body then '/' else '///'\n        body ?= tokens[0][1]\n        @validateUnicodeCodePointEscapes body, {delimiter}\n        @token 'REGEX', \"/#{body}/#{flags}\", {length: end, origin, data: {delimiter}}\n      else\n        @token 'REGEX_START', '(',    {length: 0, origin, generated: yes}\n        @token 'IDENTIFIER', 'RegExp', length: 0, generated: yes\n        @token 'CALL_START', '(',      length: 0, generated: yes\n        @mergeInterpolationTokens tokens, {double: yes, heregex: {flags}, endOffset: end - flags.length, quote: '///'}, (str) =>\n          @validateUnicodeCodePointEscapes str, {delimiter}\n        if flags\n          @token ',', ',',                    offset: index - 1, length: 0, generated: yes\n          @token 'STRING', '\"' + flags + '\"', offset: index,     length: flags.length\n        @token ')', ')',                      offset: end,       length: 0, generated: yes\n        @token 'REGEX_END', ')',              offset: end,       length: 0, generated: yes\n\n    # Explicitly attach any heregex comments to the REGEX/REGEX_END token.\n    if commentTokens?.length\n      addTokenData @tokens[@tokens.length - 1],\n        heregexCommentTokens: commentTokens\n\n    end\n\n  # Matches newlines, indents, and outdents, and determines which is which.\n  # If we can detect that the current line is continued onto the next line,\n  # then the newline is suppressed:\n  #\n  #     elements\n  #       .each( ... )\n  #       .map( ... )\n  #\n  # Keeps track of the level of indentation, because a single outdent token\n  # can close multiple indents, so we need to know how far in we happen to be.\n  lineToken: ({chunk = @chunk, offset = 0} = {}) ->\n    return 0 unless match = MULTI_DENT.exec chunk\n    indent = match[0]\n\n    prev = @prev()\n    backslash = prev?[0] is '\\\\'\n    @seenFor = no unless (backslash or @seenFor?.endsLength < @ends.length) and @seenFor\n    @seenImport = no unless (backslash and @seenImport) or @importSpecifierList\n    @seenExport = no unless (backslash and @seenExport) or @exportSpecifierList\n\n    size = indent.length - 1 - indent.lastIndexOf '\\n'\n    noNewlines = @unfinished()\n\n    newIndentLiteral = if size > 0 then indent[-size..] else ''\n    unless /^(.?)\\1*$/.exec newIndentLiteral\n      @error 'mixed indentation', offset: indent.length\n      return indent.length\n\n    minLiteralLength = Math.min newIndentLiteral.length, @indentLiteral.length\n    if newIndentLiteral[...minLiteralLength] isnt @indentLiteral[...minLiteralLength]\n      @error 'indentation mismatch', offset: indent.length\n      return indent.length\n\n    if size - @continuationLineAdditionalIndent is @indent\n      if noNewlines then @suppressNewlines() else @newlineToken offset\n      return indent.length\n\n    if size > @indent\n      if noNewlines\n        @continuationLineAdditionalIndent = size - @indent unless backslash\n        if @continuationLineAdditionalIndent\n          prev.continuationLineIndent = @indent + @continuationLineAdditionalIndent\n        @suppressNewlines()\n        return indent.length\n      unless @tokens.length\n        @baseIndent = @indent = size\n        @indentLiteral = newIndentLiteral\n        return indent.length\n      diff = size - @indent + @outdebt\n      @token 'INDENT', diff, offset: offset + indent.length - size, length: size\n      @indents.push diff\n      @ends.push {tag: 'OUTDENT'}\n      @outdebt = @continuationLineAdditionalIndent = 0\n      @indent = size\n      @indentLiteral = newIndentLiteral\n    else if size < @baseIndent\n      @error 'missing indentation', offset: offset + indent.length\n    else\n      endsContinuationLineIndentation = @continuationLineAdditionalIndent > 0\n      @continuationLineAdditionalIndent = 0\n      @outdentToken {moveOut: @indent - size, noNewlines, outdentLength: indent.length, offset, indentSize: size, endsContinuationLineIndentation}\n    indent.length\n\n  # Record an outdent token or multiple tokens, if we happen to be moving back\n  # inwards past several recorded indents. Sets new @indent value.\n  outdentToken: ({moveOut, noNewlines, outdentLength = 0, offset = 0, indentSize, endsContinuationLineIndentation}) ->\n    decreasedIndent = @indent - moveOut\n    while moveOut > 0\n      lastIndent = @indents[@indents.length - 1]\n      if not lastIndent\n        @outdebt = moveOut = 0\n      else if @outdebt and moveOut <= @outdebt\n        @outdebt -= moveOut\n        moveOut   = 0\n      else\n        dent = @indents.pop() + @outdebt\n        if outdentLength and @chunk[outdentLength] in INDENTABLE_CLOSERS\n          decreasedIndent -= dent - moveOut\n          moveOut = dent\n        @outdebt = 0\n        # pair might call outdentToken, so preserve decreasedIndent\n        @pair 'OUTDENT'\n        @token 'OUTDENT', moveOut, length: outdentLength, indentSize: indentSize + moveOut - dent\n        moveOut -= dent\n    @outdebt -= moveOut if dent\n    @suppressSemicolons()\n\n    unless @tag() is 'TERMINATOR' or noNewlines\n      terminatorToken = @token 'TERMINATOR', '\\n', offset: offset + outdentLength, length: 0\n      terminatorToken.endsContinuationLineIndentation = {preContinuationLineIndent: @indent} if endsContinuationLineIndentation\n    @indent = decreasedIndent\n    @indentLiteral = @indentLiteral[...decreasedIndent]\n    this\n\n  # Matches and consumes non-meaningful whitespace. Tag the previous token\n  # as being “spaced”, because there are some cases where it makes a difference.\n  whitespaceToken: ->\n    return 0 unless (match = WHITESPACE.exec @chunk) or\n                    (nline = @chunk.charAt(0) is '\\n')\n    prev = @prev()\n    prev[if match then 'spaced' else 'newLine'] = true if prev\n    if match then match[0].length else 0\n\n  # Generate a newline token. Consecutive newlines get merged together.\n  newlineToken: (offset) ->\n    @suppressSemicolons()\n    @token 'TERMINATOR', '\\n', {offset, length: 0} unless @tag() is 'TERMINATOR'\n    this\n\n  # Use a `\\` at a line-ending to suppress the newline.\n  # The slash is removed here once its job is done.\n  suppressNewlines: ->\n    prev = @prev()\n    if prev[1] is '\\\\'\n      if prev.comments and @tokens.length > 1\n        # `@tokens.length` should be at least 2 (some code, then `\\`).\n        # If something puts a `\\` after nothing, they deserve to lose any\n        # comments that trail it.\n        attachCommentsToNode prev.comments, @tokens[@tokens.length - 2]\n      @tokens.pop()\n    this\n\n  jsxToken: ->\n    firstChar = @chunk[0]\n    # Check the previous token to detect if attribute is spread.\n    prevChar = if @tokens.length > 0 then @tokens[@tokens.length - 1][0] else ''\n    if firstChar is '<'\n      match = JSX_IDENTIFIER.exec(@chunk[1...]) or JSX_FRAGMENT_IDENTIFIER.exec(@chunk[1...])\n      return 0 unless match and (\n        @jsxDepth > 0 or\n        # Not the right hand side of an unspaced comparison (i.e. `a<b`).\n        not (prev = @prev()) or\n        prev.spaced or\n        prev[0] not in COMPARABLE_LEFT_SIDE\n      )\n      [input, id] = match\n      fullId = id\n      if '.' in id\n        [id, properties...] = id.split '.'\n      else\n        properties = []\n      tagToken = @token 'JSX_TAG', id,\n        length: id.length + 1\n        data:\n          openingBracketToken: @makeToken '<', '<'\n          tagNameToken: @makeToken 'IDENTIFIER', id, offset: 1\n      offset = id.length + 1\n      for property in properties\n        @token '.', '.', {offset}\n        offset += 1\n        @token 'PROPERTY', property, {offset}\n        offset += property.length\n      @token 'CALL_START', '(', generated: yes\n      @token '[', '[', generated: yes\n      @ends.push {tag: '/>', origin: tagToken, name: id, properties}\n      @jsxDepth++\n      return fullId.length + 1\n    else if jsxTag = @atJSXTag()\n      if @chunk[...2] is '/>' # Self-closing tag.\n        @pair '/>'\n        @token ']', ']',\n          length: 2\n          generated: yes\n        @token 'CALL_END', ')',\n          length: 2\n          generated: yes\n          data:\n            selfClosingSlashToken: @makeToken '/', '/'\n            closingBracketToken: @makeToken '>', '>', offset: 1\n        @jsxDepth--\n        return 2\n      else if firstChar is '{'\n        if prevChar is ':'\n          # This token represents the start of a JSX attribute value\n          # that’s an expression (e.g. the `{b}` in `<div a={b} />`).\n          # Our grammar represents the beginnings of expressions as `(`\n          # tokens, so make this into a `(` token that displays as `{`.\n          token = @token '(', '{'\n          @jsxObjAttribute[@jsxDepth] = no\n          # tag attribute name as JSX\n          addTokenData @tokens[@tokens.length - 3],\n            jsx: yes\n        else\n          token = @token '{', '{'\n          @jsxObjAttribute[@jsxDepth] = yes\n        @ends.push {tag: '}', origin: token}\n        return 1\n      else if firstChar is '>' # end of opening tag\n        # Ignore terminators inside a tag.\n        {origin: openingTagToken} = @pair '/>' # As if the current tag was self-closing.\n        @token ']', ']',\n          generated: yes\n          data:\n            closingBracketToken: @makeToken '>', '>'\n        @token ',', 'JSX_COMMA', generated: yes\n        {tokens, index: end} =\n          @matchWithInterpolations INSIDE_JSX, '>', '</', JSX_INTERPOLATION\n        @mergeInterpolationTokens tokens, {endOffset: end, jsx: yes}, (value) =>\n          @validateUnicodeCodePointEscapes value, delimiter: '>'\n        match = JSX_IDENTIFIER.exec(@chunk[end...]) or JSX_FRAGMENT_IDENTIFIER.exec(@chunk[end...])\n        if not match or match[1] isnt \"#{jsxTag.name}#{(\".#{property}\" for property in jsxTag.properties).join ''}\"\n          @error \"expected corresponding JSX closing tag for #{jsxTag.name}\",\n            jsxTag.origin.data.tagNameToken[2]\n        [, fullTagName] = match\n        afterTag = end + fullTagName.length\n        if @chunk[afterTag] isnt '>'\n          @error \"missing closing > after tag name\", offset: afterTag, length: 1\n        # -2/+2 for the opening `</` and +1 for the closing `>`.\n        endToken = @token 'CALL_END', ')',\n          offset: end - 2\n          length: fullTagName.length + 3\n          generated: yes\n          data:\n            closingTagOpeningBracketToken: @makeToken '<', '<', offset: end - 2\n            closingTagSlashToken: @makeToken '/', '/', offset: end - 1\n            # TODO: individual tokens for complex tag name? eg < / A . B >\n            closingTagNameToken: @makeToken 'IDENTIFIER', fullTagName, offset: end\n            closingTagClosingBracketToken: @makeToken '>', '>', offset: end + fullTagName.length\n        # make the closing tag location data more easily accessible to the grammar\n        addTokenData openingTagToken, endToken.data\n        @jsxDepth--\n        return afterTag + 1\n      else\n        return 0\n    else if @atJSXTag 1\n      if firstChar is '}'\n        @pair firstChar\n        if @jsxObjAttribute[@jsxDepth]\n          @token '}', '}'\n          @jsxObjAttribute[@jsxDepth] = no\n        else\n          @token ')', '}'\n        @token ',', ',', generated: yes\n        return 1\n      else\n        return 0\n    else\n      return 0\n\n  atJSXTag: (depth = 0) ->\n    return no if @jsxDepth is 0\n    i = @ends.length - 1\n    i-- while @ends[i]?.tag is 'OUTDENT' or depth-- > 0 # Ignore indents.\n    last = @ends[i]\n    last?.tag is '/>' and last\n\n  # We treat all other single characters as a token. E.g.: `( ) , . !`\n  # Multi-character operators are also literal tokens, so that Jison can assign\n  # the proper order of operations. There are some symbols that we tag specially\n  # here. `;` and newlines are both treated as a `TERMINATOR`, we distinguish\n  # parentheses that indicate a method call from regular parentheses, and so on.\n  literalToken: ->\n    if match = OPERATOR.exec @chunk\n      [value] = match\n      @tagParameters() if CODE.test value\n    else\n      value = @chunk.charAt 0\n    tag  = value\n    prev = @prev()\n\n    if prev and value in ['=', COMPOUND_ASSIGN...]\n      skipToken = false\n      if value is '=' and prev[1] in ['||', '&&'] and not prev.spaced\n        prev[0] = 'COMPOUND_ASSIGN'\n        prev[1] += '='\n        prev.data.original += '=' if prev.data?.original\n        prev[2].range = [\n          prev[2].range[0]\n          prev[2].range[1] + 1\n        ]\n        prev[2].last_column += 1\n        prev[2].last_column_exclusive += 1\n        prev = @tokens[@tokens.length - 2]\n        skipToken = true\n      if prev and prev[0] isnt 'PROPERTY'\n        origin = prev.origin ? prev\n        message = isUnassignable prev[1], origin[1]\n        @error message, origin[2] if message\n      return value.length if skipToken\n\n    if value is '(' and prev?[0] is 'IMPORT'\n      prev[0] = 'DYNAMIC_IMPORT'\n\n    if value is '{' and @seenImport\n      @importSpecifierList = yes\n    else if @importSpecifierList and value is '}'\n      @importSpecifierList = no\n    else if value is '{' and prev?[0] is 'EXPORT'\n      @exportSpecifierList = yes\n    else if @exportSpecifierList and value is '}'\n      @exportSpecifierList = no\n\n    if value is ';'\n      @error 'unexpected ;' if prev?[0] in ['=', UNFINISHED...]\n      @seenFor = @seenImport = @seenExport = no\n      tag = 'TERMINATOR'\n    else if value is '*' and prev?[0] is 'EXPORT'\n      tag = 'EXPORT_ALL'\n    else if value in MATH            then tag = 'MATH'\n    else if value in COMPARE         then tag = 'COMPARE'\n    else if value in COMPOUND_ASSIGN then tag = 'COMPOUND_ASSIGN'\n    else if value in UNARY           then tag = 'UNARY'\n    else if value in UNARY_MATH      then tag = 'UNARY_MATH'\n    else if value in SHIFT           then tag = 'SHIFT'\n    else if value is '?' and prev?.spaced then tag = 'BIN?'\n    else if prev\n      if value is '(' and not prev.spaced and prev[0] in CALLABLE\n        prev[0] = 'FUNC_EXIST' if prev[0] is '?'\n        tag = 'CALL_START'\n      else if value is '[' and ((prev[0] in INDEXABLE and not prev.spaced) or\n         (prev[0] is '::')) # `.prototype` can’t be a method you can call.\n        tag = 'INDEX_START'\n        switch prev[0]\n          when '?'  then prev[0] = 'INDEX_SOAK'\n    token = @makeToken tag, value\n    switch value\n      when '(', '{', '[' then @ends.push {tag: INVERSES[value], origin: token}\n      when ')', '}', ']' then @pair value\n    @tokens.push @makeToken tag, value\n    value.length\n\n  # Token Manipulators\n  # ------------------\n\n  # A source of ambiguity in our grammar used to be parameter lists in function\n  # definitions versus argument lists in function calls. Walk backwards, tagging\n  # parameters specially in order to make things easier for the parser.\n  tagParameters: ->\n    return @tagDoIife() if @tag() isnt ')'\n    stack = []\n    {tokens} = this\n    i = tokens.length\n    paramEndToken = tokens[--i]\n    paramEndToken[0] = 'PARAM_END'\n    while tok = tokens[--i]\n      switch tok[0]\n        when ')'\n          stack.push tok\n        when '(', 'CALL_START'\n          if stack.length then stack.pop()\n          else if tok[0] is '('\n            tok[0] = 'PARAM_START'\n            return @tagDoIife i - 1\n          else\n            paramEndToken[0] = 'CALL_END'\n            return this\n    this\n\n  # Tag `do` followed by a function differently than `do` followed by eg an\n  # identifier to allow for different grammar precedence\n  tagDoIife: (tokenIndex) ->\n    tok = @tokens[tokenIndex ? @tokens.length - 1]\n    return this unless tok?[0] is 'DO'\n    tok[0] = 'DO_IIFE'\n    this\n\n  # Close up all remaining open blocks at the end of the file.\n  closeIndentation: ->\n    @outdentToken moveOut: @indent, indentSize: 0\n\n  # Match the contents of a delimited token and expand variables and expressions\n  # inside it using Ruby-like notation for substitution of arbitrary\n  # expressions.\n  #\n  #     \"Hello #{name.capitalize()}.\"\n  #\n  # If it encounters an interpolation, this method will recursively create a new\n  # Lexer and tokenize until the `{` of `#{` is balanced with a `}`.\n  #\n  #  - `regex` matches the contents of a token (but not `delimiter`, and not\n  #    `#{` if interpolations are desired).\n  #  - `delimiter` is the delimiter of the token. Examples are `'`, `\"`, `'''`,\n  #    `\"\"\"` and `///`.\n  #  - `closingDelimiter` is different from `delimiter` only in JSX\n  #  - `interpolators` matches the start of an interpolation, for JSX it's both\n  #    `{` and `<` (i.e. nested JSX tag)\n  #\n  # This method allows us to have strings within interpolations within strings,\n  # ad infinitum.\n  matchWithInterpolations: (regex, delimiter, closingDelimiter = delimiter, interpolators = /^#\\{/) ->\n    tokens = []\n    offsetInChunk = delimiter.length\n    return null unless @chunk[...offsetInChunk] is delimiter\n    str = @chunk[offsetInChunk..]\n    loop\n      [strPart] = regex.exec str\n\n      @validateEscapes strPart, {isRegex: delimiter.charAt(0) is '/', offsetInChunk}\n\n      # Push a fake `'NEOSTRING'` token, which will get turned into a real string later.\n      tokens.push @makeToken 'NEOSTRING', strPart, offset: offsetInChunk\n\n      str = str[strPart.length..]\n      offsetInChunk += strPart.length\n\n      break unless match = interpolators.exec str\n      [interpolator] = match\n\n      # To remove the `#` in `#{`.\n      interpolationOffset = interpolator.length - 1\n      [line, column, offset] = @getLineAndColumnFromChunk offsetInChunk + interpolationOffset\n      rest = str[interpolationOffset..]\n      {tokens: nested, index} =\n        new Lexer().tokenize rest, {line, column, offset, untilBalanced: on, @locationDataCompensations}\n      # Account for the `#` in `#{`.\n      index += interpolationOffset\n\n      braceInterpolator = str[index - 1] is '}'\n      if braceInterpolator\n        # Turn the leading and trailing `{` and `}` into parentheses. Unnecessary\n        # parentheses will be removed later.\n        [open, ..., close] = nested\n        open[0]  = 'INTERPOLATION_START'\n        open[1]  = '('\n        open[2].first_column -= interpolationOffset\n        open[2].range = [\n          open[2].range[0] - interpolationOffset\n          open[2].range[1]\n        ]\n        close[0]  = 'INTERPOLATION_END'\n        close[1] = ')'\n        close.origin = ['', 'end of interpolation', close[2]]\n\n      # Remove leading `'TERMINATOR'` (if any).\n      nested.splice 1, 1 if nested[1]?[0] is 'TERMINATOR'\n      # Remove trailing `'INDENT'/'OUTDENT'` pair (if any).\n      nested.splice -3, 2 if nested[nested.length - 3]?[0] is 'INDENT' and nested[nested.length - 2][0] is 'OUTDENT'\n\n      unless braceInterpolator\n        # We are not using `{` and `}`, so wrap the interpolated tokens instead.\n        open = @makeToken 'INTERPOLATION_START', '(', offset: offsetInChunk,         length: 0, generated: yes\n        close = @makeToken 'INTERPOLATION_END', ')',  offset: offsetInChunk + index, length: 0, generated: yes\n        nested = [open, nested..., close]\n\n      # Push a fake `'TOKENS'` token, which will get turned into real tokens later.\n      tokens.push ['TOKENS', nested]\n\n      str = str[index..]\n      offsetInChunk += index\n\n    unless str[...closingDelimiter.length] is closingDelimiter\n      @error \"missing #{closingDelimiter}\", length: delimiter.length\n\n    {tokens, index: offsetInChunk + closingDelimiter.length}\n\n  # Merge the array `tokens` of the fake token types `'TOKENS'` and `'NEOSTRING'`\n  # (as returned by `matchWithInterpolations`) into the token stream. The value\n  # of `'NEOSTRING'`s are converted using `fn` and turned into strings using\n  # `options` first.\n  mergeInterpolationTokens: (tokens, options, fn) ->\n    {quote, indent, double, heregex, endOffset, jsx} = options\n\n    if tokens.length > 1\n      lparen = @token 'STRING_START', '(', length: quote?.length ? 0, data: {quote}, generated: not quote?.length\n\n    firstIndex = @tokens.length\n    $ = tokens.length - 1\n    for token, i in tokens\n      [tag, value] = token\n      switch tag\n        when 'TOKENS'\n          # There are comments (and nothing else) in this interpolation.\n          if value.length is 2 and (value[0].comments or value[1].comments)\n            placeholderToken = @makeToken 'JS', '', generated: yes\n            # Use the same location data as the first parenthesis.\n            placeholderToken[2] = value[0][2]\n            for val in value when val.comments\n              placeholderToken.comments ?= []\n              placeholderToken.comments.push val.comments...\n            value.splice 1, 0, placeholderToken\n          # Push all the tokens in the fake `'TOKENS'` token. These already have\n          # sane location data.\n          locationToken = value[0]\n          tokensToPush = value\n        when 'NEOSTRING'\n          # Convert `'NEOSTRING'` into `'STRING'`.\n          converted = fn.call this, token[1], i\n          addTokenData token, initialChunk: yes if i is 0\n          addTokenData token, finalChunk: yes   if i is $\n          addTokenData token, {indent, quote, double}\n          addTokenData token, {heregex} if heregex\n          addTokenData token, {jsx} if jsx\n          token[0] = 'STRING'\n          token[1] = '\"' + converted + '\"'\n          if tokens.length is 1 and quote?\n            token[2].first_column -= quote.length\n            if token[1].substr(-2, 1) is '\\n'\n              token[2].last_line += 1\n              token[2].last_column = quote.length - 1\n            else\n              token[2].last_column += quote.length\n              token[2].last_column -= 1 if token[1].length is 2\n            token[2].last_column_exclusive += quote.length\n            token[2].range = [\n              token[2].range[0] - quote.length\n              token[2].range[1] + quote.length\n            ]\n          locationToken = token\n          tokensToPush = [token]\n      @tokens.push tokensToPush...\n\n    if lparen\n      [..., lastToken] = tokens\n      lparen.origin = ['STRING', null,\n        first_line:            lparen[2].first_line\n        first_column:          lparen[2].first_column\n        last_line:             lastToken[2].last_line\n        last_column:           lastToken[2].last_column\n        last_line_exclusive:   lastToken[2].last_line_exclusive\n        last_column_exclusive: lastToken[2].last_column_exclusive\n        range: [\n          lparen[2].range[0]\n          lastToken[2].range[1]\n        ]\n      ]\n      lparen[2] = lparen.origin[2] unless quote?.length\n      rparen = @token 'STRING_END', ')', offset: endOffset - (quote ? '').length, length: quote?.length ? 0, generated: not quote?.length\n\n  # Pairs up a closing token, ensuring that all listed pairs of tokens are\n  # correctly balanced throughout the course of the token stream.\n  pair: (tag) ->\n    [..., prev] = @ends\n    unless tag is wanted = prev?.tag\n      @error \"unmatched #{tag}\" unless 'OUTDENT' is wanted\n      # Auto-close `INDENT` to support syntax like this:\n      #\n      #     el.click((event) ->\n      #       el.hide())\n      #\n      [..., lastIndent] = @indents\n      @outdentToken moveOut: lastIndent, noNewlines: true\n      return @pair tag\n    @ends.pop()\n\n  # Helpers\n  # -------\n\n  # Compensate for the things we strip out initially (e.g. carriage returns)\n  # so that location data stays accurate with respect to the original source file.\n  getLocationDataCompensation: (start, end) ->\n    totalCompensation = 0\n    initialEnd = end\n    current = start\n    while current <= end\n      break if current is end and start isnt initialEnd\n      compensation = @locationDataCompensations[current]\n      if compensation?\n        totalCompensation += compensation\n        end += compensation\n      current++\n    return totalCompensation\n\n  # Returns the line and column number from an offset into the current chunk.\n  #\n  # `offset` is a number of characters into `@chunk`.\n  getLineAndColumnFromChunk: (offset) ->\n    compensation = @getLocationDataCompensation @chunkOffset, @chunkOffset + offset\n\n    if offset is 0\n      return [@chunkLine, @chunkColumn + compensation, @chunkOffset + compensation]\n\n    if offset >= @chunk.length\n      string = @chunk\n    else\n      string = @chunk[..offset-1]\n\n    lineCount = count string, '\\n'\n\n    column = @chunkColumn\n    if lineCount > 0\n      [..., lastLine] = string.split '\\n'\n      column = lastLine.length\n      previousLinesCompensation = @getLocationDataCompensation @chunkOffset, @chunkOffset + offset - column\n      # Don't recompensate for initially inserted newline.\n      previousLinesCompensation = 0 if previousLinesCompensation < 0\n      columnCompensation = @getLocationDataCompensation(\n        @chunkOffset + offset + previousLinesCompensation - column\n        @chunkOffset + offset + previousLinesCompensation\n      )\n    else\n      column += string.length\n      columnCompensation = compensation\n\n    [@chunkLine + lineCount, column + columnCompensation, @chunkOffset + offset + compensation]\n\n  makeLocationData: ({ offsetInChunk, length }) ->\n    locationData = range: []\n    [locationData.first_line, locationData.first_column, locationData.range[0]] =\n      @getLineAndColumnFromChunk offsetInChunk\n\n    # Use length - 1 for the final offset - we’re supplying the last_line and the last_column,\n    # so if last_column == first_column, then we’re looking at a character of length 1.\n    lastCharacter = if length > 0 then (length - 1) else 0\n    [locationData.last_line, locationData.last_column, endOffset] =\n      @getLineAndColumnFromChunk offsetInChunk + lastCharacter\n    [locationData.last_line_exclusive, locationData.last_column_exclusive] =\n      @getLineAndColumnFromChunk offsetInChunk + lastCharacter + (if length > 0 then 1 else 0)\n    locationData.range[1] = if length > 0 then endOffset + 1 else endOffset\n\n    locationData\n\n  # Same as `token`, except this just returns the token without adding it\n  # to the results.\n  makeToken: (tag, value, {offset: offsetInChunk = 0, length = value.length, origin, generated, indentSize} = {}) ->\n    token = [tag, value, @makeLocationData {offsetInChunk, length}]\n    token.origin = origin if origin\n    token.generated = yes if generated\n    token.indentSize = indentSize if indentSize?\n    token\n\n  # Add a token to the results.\n  # `offset` is the offset into the current `@chunk` where the token starts.\n  # `length` is the length of the token in the `@chunk`, after the offset.  If\n  # not specified, the length of `value` will be used.\n  #\n  # Returns the new token.\n  token: (tag, value, {offset, length, origin, data, generated, indentSize} = {}) ->\n    token = @makeToken tag, value, {offset, length, origin, generated, indentSize}\n    addTokenData token, data if data\n    @tokens.push token\n    token\n\n  # Peek at the last tag in the token stream.\n  tag: ->\n    [..., token] = @tokens\n    token?[0]\n\n  # Peek at the last value in the token stream.\n  value: (useOrigin = no) ->\n    [..., token] = @tokens\n    if useOrigin and token?.origin?\n      token.origin[1]\n    else\n      token?[1]\n\n  # Get the previous token in the token stream.\n  prev: ->\n    @tokens[@tokens.length - 1]\n\n  # Are we in the midst of an unfinished expression?\n  unfinished: ->\n    LINE_CONTINUER.test(@chunk) or\n    @tag() in UNFINISHED\n\n  validateUnicodeCodePointEscapes: (str, options) ->\n    replaceUnicodeCodePointEscapes str, merge options, {@error}\n\n  # Validates escapes in strings and regexes.\n  validateEscapes: (str, options = {}) ->\n    invalidEscapeRegex =\n      if options.isRegex\n        REGEX_INVALID_ESCAPE\n      else\n        STRING_INVALID_ESCAPE\n    match = invalidEscapeRegex.exec str\n    return unless match\n    [[], before, octal, hex, unicodeCodePoint, unicode] = match\n    message =\n      if octal\n        \"octal escape sequences are not allowed\"\n      else\n        \"invalid escape sequence\"\n    invalidEscape = \"\\\\#{octal or hex or unicodeCodePoint or unicode}\"\n    @error \"#{message} #{invalidEscape}\",\n      offset: (options.offsetInChunk ? 0) + match.index + before.length\n      length: invalidEscape.length\n\n  suppressSemicolons: ->\n    while @value() is ';'\n      @tokens.pop()\n      @error 'unexpected ;' if @prev()?[0] in ['=', UNFINISHED...]\n\n  # Throws an error at either a given offset from the current chunk or at the\n  # location of a token (`token[2]`).\n  error: (message, options = {}) =>\n    location =\n      if 'first_line' of options\n        options\n      else\n        [first_line, first_column] = @getLineAndColumnFromChunk options.offset ? 0\n        {first_line, first_column, last_column: first_column + (options.length ? 1) - 1}\n    throwSyntaxError message, location\n\n# Helper functions\n# ----------------\n\nisUnassignable = (name, displayName = name) -> switch\n  when name in [JS_KEYWORDS..., COFFEE_KEYWORDS...]\n    \"keyword '#{displayName}' can't be assigned\"\n  when name in STRICT_PROSCRIBED\n    \"'#{displayName}' can't be assigned\"\n  when name in RESERVED\n    \"reserved word '#{displayName}' can't be assigned\"\n  else\n    false\n\nexports.isUnassignable = isUnassignable\n\n# `from` isn’t a CoffeeScript keyword, but it behaves like one in `import` and\n# `export` statements (handled above) and in the declaration line of a `for`\n# loop. Try to detect when `from` is a variable identifier and when it is this\n# “sometimes” keyword.\nisForFrom = (prev) ->\n  # `for i from iterable`\n  if prev[0] is 'IDENTIFIER'\n    yes\n  # `for from…`\n  else if prev[0] is 'FOR'\n    no\n  # `for {from}…`, `for [from]…`, `for {a, from}…`, `for {a: from}…`\n  else if prev[1] in ['{', '[', ',', ':']\n    no\n  else\n    yes\n\naddTokenData = (token, data) ->\n  Object.assign (token.data ?= {}), data\n\n# Constants\n# ---------\n\n# Keywords that CoffeeScript shares in common with JavaScript.\nJS_KEYWORDS = [\n  'true', 'false', 'null', 'this'\n  'new', 'delete', 'typeof', 'in', 'instanceof'\n  'return', 'throw', 'break', 'continue', 'debugger', 'yield', 'await'\n  'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally'\n  'class', 'extends', 'super'\n  'import', 'export', 'default'\n]\n\n# CoffeeScript-only keywords.\nCOFFEE_KEYWORDS = [\n  'undefined', 'Infinity', 'NaN'\n  'then', 'unless', 'until', 'loop', 'of', 'by', 'when'\n]\n\nCOFFEE_ALIAS_MAP =\n  and  : '&&'\n  or   : '||'\n  is   : '=='\n  isnt : '!='\n  not  : '!'\n  yes  : 'true'\n  no   : 'false'\n  on   : 'true'\n  off  : 'false'\n\nCOFFEE_ALIASES  = (key for key of COFFEE_ALIAS_MAP)\nCOFFEE_KEYWORDS = COFFEE_KEYWORDS.concat COFFEE_ALIASES\n\n# The list of keywords that are reserved by JavaScript, but not used, or are\n# used by CoffeeScript internally. We throw an error when these are encountered,\n# to avoid having a JavaScript error at runtime.\nRESERVED = [\n  'case', 'function', 'var', 'void', 'with', 'const', 'let', 'enum'\n  'native', 'implements', 'interface', 'package', 'private'\n  'protected', 'public', 'static'\n]\n\nSTRICT_PROSCRIBED = ['arguments', 'eval']\n\n# The superset of both JavaScript keywords and reserved words, none of which may\n# be used as identifiers or properties.\nexports.JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED)\n\n# The character code of the nasty Microsoft madness otherwise known as the BOM.\nBOM = 65279\n\n# Token matching regexes.\nIDENTIFIER = /// ^\n  (?!\\d)\n  ( (?: (?!\\s)[$\\w\\x7f-\\uffff] )+ )\n  ( [^\\n\\S]* : (?!:) )?  # Is this a property name?\n///\n\n# Like `IDENTIFIER`, but includes `-`s\nJSX_IDENTIFIER_PART = /// (?: (?!\\s)[\\-$\\w\\x7f-\\uffff] )+ ///.source\n\n# In https://facebook.github.io/jsx/ spec, JSXElementName can be\n# JSXIdentifier, JSXNamespacedName (JSXIdentifier : JSXIdentifier), or\n# JSXMemberExpression (two or more JSXIdentifier connected by `.`s).\nJSX_IDENTIFIER = /// ^\n  (?![\\d<]) # Must not start with `<`.\n  ( #{JSX_IDENTIFIER_PART}\n    (?: \\s* : \\s* #{JSX_IDENTIFIER_PART}       # JSXNamespacedName\n    | (?: \\s* \\. \\s* #{JSX_IDENTIFIER_PART} )+ # JSXMemberExpression\n    )? )\n///\n\n# Fragment: <></>\nJSX_FRAGMENT_IDENTIFIER = /// ^\n  ()> # Ends immediately with `>`.\n///\n\n# In https://facebook.github.io/jsx/ spec, JSXAttributeName can be either\n# JSXIdentifier or JSXNamespacedName which is JSXIdentifier : JSXIdentifier\nJSX_ATTRIBUTE = /// ^\n  (?!\\d)\n  ( #{JSX_IDENTIFIER_PART}\n    (?: \\s* : \\s* #{JSX_IDENTIFIER_PART}       # JSXNamespacedName\n    )? )\n  ( [^\\S]* = (?!=) )?  # Is this an attribute with a value?\n///\n\nNUMBER     = ///\n  ^ 0b[01](?:_?[01])*n?                         | # binary\n  ^ 0o[0-7](?:_?[0-7])*n?                       | # octal\n  ^ 0x[\\da-f](?:_?[\\da-f])*n?                   | # hex\n  ^ \\d+(?:_\\d+)*n                               | # decimal bigint\n  ^ (?:\\d+(?:_\\d+)*)?      \\.? \\d+(?:_\\d+)*       # decimal\n                     (?:e[+-]? \\d+(?:_\\d+)* )?\n  # decimal without support for numeric literal separators for reference:\n  # \\d*\\.?\\d+ (?:e[+-]?\\d+)?\n///i\n\nOPERATOR   = /// ^ (\n  ?: [-=]>             # function\n   | [-+*/%<>&|^!?=]=  # compound assign / compare\n   | >>>=?             # zero-fill right shift\n   | ([-+:])\\1         # doubles\n   | ([&|<>*/%])\\2=?   # logic / shift / power / floor division / modulo\n   | \\?(\\.|::)         # soak access\n   | \\.{2,3}           # range or splat\n) ///\n\nWHITESPACE = /^[^\\n\\S]+/\n\nCOMMENT    = /^(\\s*)###([^#][\\s\\S]*?)(?:###([^\\n\\S]*)|###$)|^((?:\\s*#(?!##[^#]).*)+)/\n\nCODE       = /^[-=]>/\n\nMULTI_DENT = /^(?:\\n[^\\n\\S]*)+/\n\nJSTOKEN      = ///^ `(?!``) ((?: [^`\\\\] | \\\\[\\s\\S]           )*) `   ///\nHERE_JSTOKEN = ///^ ```     ((?: [^`\\\\] | \\\\[\\s\\S] | `(?!``) )*) ``` ///\n\n# String-matching-regexes.\nSTRING_START   = /^(?:'''|\"\"\"|'|\")/\n\nSTRING_SINGLE  = /// ^(?: [^\\\\']  | \\\\[\\s\\S]                      )* ///\nSTRING_DOUBLE  = /// ^(?: [^\\\\\"#] | \\\\[\\s\\S] |           \\#(?!\\{) )* ///\nHEREDOC_SINGLE = /// ^(?: [^\\\\']  | \\\\[\\s\\S] | '(?!'')            )* ///\nHEREDOC_DOUBLE = /// ^(?: [^\\\\\"#] | \\\\[\\s\\S] | \"(?!\"\") | \\#(?!\\{) )* ///\n\nINSIDE_JSX = /// ^(?:\n    [^\n      \\{ # Start of CoffeeScript interpolation.\n      <  # Maybe JSX tag (`<` not allowed even if bare).\n    ]\n  )* /// # Similar to `HEREDOC_DOUBLE` but there is no escaping.\nJSX_INTERPOLATION = /// ^(?:\n      \\{       # CoffeeScript interpolation.\n    | <(?!/)   # JSX opening tag.\n  )///\n\nHEREDOC_INDENT     = /\\n+([^\\n\\S]*)(?=\\S)/g\n\n# Regex-matching-regexes.\nREGEX = /// ^\n  / (?!/) ((\n  ?: [^ [ / \\n \\\\ ]  # Every other thing.\n   | \\\\[^\\n]         # Anything but newlines escaped.\n   | \\[              # Character class.\n       (?: \\\\[^\\n] | [^ \\] \\n \\\\ ] )*\n     \\]\n  )*) (/)?\n///\n\nREGEX_FLAGS  = /^\\w*/\nVALID_FLAGS  = /^(?!.*(.).*\\1)[gimsuy]*$/\n\nHEREGEX      = /// ^\n  (?:\n      # Match any character, except those that need special handling below.\n      [^\\\\/#\\s]\n      # Match `\\` followed by any character.\n    | \\\\[\\s\\S]\n      # Match any `/` except `///`.\n    | /(?!//)\n      # Match `#` which is not part of interpolation, e.g. `#{}`.\n    | \\#(?!\\{)\n      # Comments consume everything until the end of the line, including `///`.\n    | \\s+(?:#(?!\\{).*)?\n  )*\n///\n\nHEREGEX_COMMENT = /(\\s+)(#(?!{).*)/gm\n\nREGEX_ILLEGAL = /// ^ ( / | /{3}\\s*) (\\*) ///\n\nPOSSIBLY_DIVISION   = /// ^ /=?\\s ///\n\n# Other regexes.\nHERECOMMENT_ILLEGAL = /\\*\\//\n\nLINE_CONTINUER      = /// ^ \\s* (?: , | \\??\\.(?![.\\d]) | \\??:: ) ///\n\nSTRING_INVALID_ESCAPE = ///\n  ( (?:^|[^\\\\]) (?:\\\\\\\\)* )        # Make sure the escape isn’t escaped.\n  \\\\ (\n     ?: (0\\d|[1-7])                # octal escape\n      | (x(?![\\da-fA-F]{2}).{0,2}) # hex escape\n      | (u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?) # unicode code point escape\n      | (u(?!\\{|[\\da-fA-F]{4}).{0,4}) # unicode escape\n  )\n///\nREGEX_INVALID_ESCAPE = ///\n  ( (?:^|[^\\\\]) (?:\\\\\\\\)* )        # Make sure the escape isn’t escaped.\n  \\\\ (\n     ?: (0\\d)                      # octal escape\n      | (x(?![\\da-fA-F]{2}).{0,2}) # hex escape\n      | (u\\{(?![\\da-fA-F]{1,}\\})[^}]*\\}?) # unicode code point escape\n      | (u(?!\\{|[\\da-fA-F]{4}).{0,4}) # unicode escape\n  )\n///\n\nTRAILING_SPACES     = /\\s+$/\n\n# Compound assignment tokens.\nCOMPOUND_ASSIGN = [\n  '-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>='\n  '&=', '^=', '|=', '**=', '//=', '%%='\n]\n\n# Unary tokens.\nUNARY = ['NEW', 'TYPEOF', 'DELETE']\n\nUNARY_MATH = ['!', '~']\n\n# Bit-shifting tokens.\nSHIFT = ['<<', '>>', '>>>']\n\n# Comparison tokens.\nCOMPARE = ['==', '!=', '<', '>', '<=', '>=']\n\n# Mathematical tokens.\nMATH = ['*', '/', '%', '//', '%%']\n\n# Relational tokens that are negatable with `not` prefix.\nRELATION = ['IN', 'OF', 'INSTANCEOF']\n\n# Boolean tokens.\nBOOL = ['TRUE', 'FALSE']\n\n# Tokens which could legitimately be invoked or indexed. An opening\n# parentheses or bracket following these tokens will be recorded as the start\n# of a function invocation or indexing operation.\nCALLABLE  = ['IDENTIFIER', 'PROPERTY', ')', ']', '?', '@', 'THIS', 'SUPER', 'DYNAMIC_IMPORT']\nINDEXABLE = CALLABLE.concat [\n  'NUMBER', 'INFINITY', 'NAN', 'STRING', 'STRING_END', 'REGEX', 'REGEX_END'\n  'BOOL', 'NULL', 'UNDEFINED', '}', '::'\n]\n\n# Tokens which can be the left-hand side of a less-than comparison, i.e. `a<b`.\nCOMPARABLE_LEFT_SIDE = ['IDENTIFIER', ')', ']', 'NUMBER']\n\n# Tokens which a regular expression will never immediately follow (except spaced\n# CALLABLEs in some cases), but which a division operator can.\n#\n# See: http://www-archive.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions\nNOT_REGEX = INDEXABLE.concat ['++', '--']\n\n# Tokens that, when immediately preceding a `WHEN`, indicate that the `WHEN`\n# occurs at the start of a line. We disambiguate these from trailing whens to\n# avoid an ambiguity in the grammar.\nLINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']\n\n# Additional indent in front of these is ignored.\nINDENTABLE_CLOSERS = [')', '}', ']']\n"
  },
  {
    "path": "src/nodes.coffee",
    "content": "# `nodes.coffee` contains all of the node classes for the syntax tree. Most\n# nodes are created as the result of actions in the [grammar](grammar.html),\n# but some are created by other nodes as a method of code generation. To convert\n# the syntax tree into a string of JavaScript code, call `compile()` on the root.\n\nError.stackTraceLimit = Infinity\n\n{Scope} = require './scope'\n{isUnassignable, JS_FORBIDDEN} = require './lexer'\n\n# Import the helpers we plan to use.\n{compact, flatten, extend, merge, del, starts, ends, some,\naddDataToNode, attachCommentsToNode, locationDataToString,\nthrowSyntaxError, replaceUnicodeCodePointEscapes,\nisFunction, isPlainObject, isNumber, parseNumber} = require './helpers'\n\n# Functions required by parser.\nexports.extend = extend\nexports.addDataToNode = addDataToNode\n\n# Constant functions for nodes that don’t need customization.\nYES     = -> yes\nNO      = -> no\nTHIS    = -> this\nNEGATE  = -> @negated = not @negated; this\n\n#### CodeFragment\n\n# The various nodes defined below all compile to a collection of **CodeFragment** objects.\n# A CodeFragments is a block of generated code, and the location in the source file where the code\n# came from. CodeFragments can be assembled together into working code just by catting together\n# all the CodeFragments' `code` snippets, in order.\nexports.CodeFragment = class CodeFragment\n  constructor: (parent, code) ->\n    @code = \"#{code}\"\n    @type = parent?.constructor?.name or 'unknown'\n    @locationData = parent?.locationData\n    @comments = parent?.comments\n\n  toString: ->\n    # This is only intended for debugging.\n    \"#{@code}#{if @locationData then \": \" + locationDataToString(@locationData) else ''}\"\n\n# Convert an array of CodeFragments into a string.\nfragmentsToText = (fragments) ->\n  (fragment.code for fragment in fragments).join('')\n\n#### Base\n\n# The **Base** is the abstract base class for all nodes in the syntax tree.\n# Each subclass implements the `compileNode` method, which performs the\n# code generation for that node. To compile a node to JavaScript,\n# call `compile` on it, which wraps `compileNode` in some generic extra smarts,\n# to know when the generated code needs to be wrapped up in a closure.\n# An options hash is passed and cloned throughout, containing information about\n# the environment from higher in the tree (such as if a returned value is\n# being requested by the surrounding function), information about the current\n# scope, and indentation level.\nexports.Base = class Base\n\n  compile: (o, lvl) ->\n    fragmentsToText @compileToFragments o, lvl\n\n  # Occasionally a node is compiled multiple times, for example to get the name\n  # of a variable to add to scope tracking. When we know that a “premature”\n  # compilation won’t result in comments being output, set those comments aside\n  # so that they’re preserved for a later `compile` call that will result in\n  # the comments being included in the output.\n  compileWithoutComments: (o, lvl, method = 'compile') ->\n    if @comments\n      @ignoreTheseCommentsTemporarily = @comments\n      delete @comments\n    unwrapped = @unwrapAll()\n    if unwrapped.comments\n      unwrapped.ignoreTheseCommentsTemporarily = unwrapped.comments\n      delete unwrapped.comments\n\n    fragments = @[method] o, lvl\n\n    if @ignoreTheseCommentsTemporarily\n      @comments = @ignoreTheseCommentsTemporarily\n      delete @ignoreTheseCommentsTemporarily\n    if unwrapped.ignoreTheseCommentsTemporarily\n      unwrapped.comments = unwrapped.ignoreTheseCommentsTemporarily\n      delete unwrapped.ignoreTheseCommentsTemporarily\n\n    fragments\n\n  compileNodeWithoutComments: (o, lvl) ->\n    @compileWithoutComments o, lvl, 'compileNode'\n\n  # Common logic for determining whether to wrap this node in a closure before\n  # compiling it, or to compile directly. We need to wrap if this node is a\n  # *statement*, and it's not a *pureStatement*, and we're not at\n  # the top level of a block (which would be unnecessary), and we haven't\n  # already been asked to return the result (because statements know how to\n  # return results).\n  compileToFragments: (o, lvl) ->\n    o        = extend {}, o\n    o.level  = lvl if lvl\n    node     = @unfoldSoak(o) or this\n    node.tab = o.indent\n\n    fragments = if o.level is LEVEL_TOP or not node.isStatement(o)\n      node.compileNode o\n    else\n      node.compileClosure o\n    @compileCommentFragments o, node, fragments\n    fragments\n\n  compileToFragmentsWithoutComments: (o, lvl) ->\n    @compileWithoutComments o, lvl, 'compileToFragments'\n\n  # Statements converted into expressions via closure-wrapping share a scope\n  # object with their parent closure, to preserve the expected lexical scope.\n  compileClosure: (o) ->\n    @checkForPureStatementInExpression()\n    o.sharedScope = yes\n    func = new Code [], Block.wrap [this]\n    args = []\n    if @contains ((node) -> node instanceof SuperCall)\n      func.bound = yes\n    else if (argumentsNode = @contains isLiteralArguments) or @contains isLiteralThis\n      args = [new ThisLiteral]\n      if argumentsNode\n        meth = 'apply'\n        args.push new IdentifierLiteral 'arguments'\n      else\n        meth = 'call'\n      func = new Value func, [new Access new PropertyName meth]\n    parts = (new Call func, args).compileNode o\n\n    switch\n      when func.isGenerator or func.base?.isGenerator\n        parts.unshift @makeCode \"(yield* \"\n        parts.push    @makeCode \")\"\n      when func.isAsync or func.base?.isAsync\n        parts.unshift @makeCode \"(await \"\n        parts.push    @makeCode \")\"\n    parts\n\n  compileCommentFragments: (o, node, fragments) ->\n    return fragments unless node.comments\n    # This is where comments, that are attached to nodes as a `comments`\n    # property, become `CodeFragment`s. “Inline block comments,” e.g.\n    # `/* */`-delimited comments that are interspersed within code on a line,\n    # are added to the current `fragments` stream. All other fragments are\n    # attached as properties to the nearest preceding or following fragment,\n    # to remain stowaways until they get properly output in `compileComments`\n    # later on.\n    unshiftCommentFragment = (commentFragment) ->\n      if commentFragment.unshift\n        # Find the first non-comment fragment and insert `commentFragment`\n        # before it.\n        unshiftAfterComments fragments, commentFragment\n      else\n        if fragments.length isnt 0\n          precedingFragment = fragments[fragments.length - 1]\n          if commentFragment.newLine and precedingFragment.code isnt '' and\n             not /\\n\\s*$/.test precedingFragment.code\n            commentFragment.code = \"\\n#{commentFragment.code}\"\n        fragments.push commentFragment\n\n    for comment in node.comments when comment not in @compiledComments\n      @compiledComments.push comment # Don’t output this comment twice.\n      # For block/here comments, denoted by `###`, that are inline comments\n      # like `1 + ### comment ### 2`, create fragments and insert them into\n      # the fragments array.\n      # Otherwise attach comment fragments to their closest fragment for now,\n      # so they can be inserted into the output later after all the newlines\n      # have been added.\n      if comment.here # Block comment, delimited by `###`.\n        commentFragment = new HereComment(comment).compileNode o\n      else # Line comment, delimited by `#`.\n        commentFragment = new LineComment(comment).compileNode o\n      if (commentFragment.isHereComment and not commentFragment.newLine) or\n         node.includeCommentFragments()\n        # Inline block comments, like `1 + /* comment */ 2`, or a node whose\n        # `compileToFragments` method has logic for outputting comments.\n        unshiftCommentFragment commentFragment\n      else\n        fragments.push @makeCode '' if fragments.length is 0\n        if commentFragment.unshift\n          fragments[0].precedingComments ?= []\n          fragments[0].precedingComments.push commentFragment\n        else\n          fragments[fragments.length - 1].followingComments ?= []\n          fragments[fragments.length - 1].followingComments.push commentFragment\n    fragments\n\n  # If the code generation wishes to use the result of a complex expression\n  # in multiple places, ensure that the expression is only ever evaluated once,\n  # by assigning it to a temporary variable. Pass a level to precompile.\n  #\n  # If `level` is passed, then returns `[val, ref]`, where `val` is the compiled value, and `ref`\n  # is the compiled reference. If `level` is not passed, this returns `[val, ref]` where\n  # the two values are raw nodes which have not been compiled.\n  cache: (o, level, shouldCache) ->\n    complex = if shouldCache? then shouldCache this else @shouldCache()\n    if complex\n      ref = new IdentifierLiteral o.scope.freeVariable 'ref'\n      sub = new Assign ref, this\n      if level then [sub.compileToFragments(o, level), [@makeCode(ref.value)]] else [sub, ref]\n    else\n      ref = if level then @compileToFragments o, level else this\n      [ref, ref]\n\n  # Occasionally it may be useful to make an expression behave as if it was 'hoisted', whereby the\n  # result of the expression is available before its location in the source, but the expression's\n  # variable scope corresponds to the source position. This is used extensively to deal with executable\n  # class bodies in classes.\n  #\n  # Calling this method mutates the node, proxying the `compileNode` and `compileToFragments`\n  # methods to store their result for later replacing the `target` node, which is returned by the\n  # call.\n  hoist: ->\n    @hoisted = yes\n    target   = new HoistTarget @\n\n    compileNode        = @compileNode\n    compileToFragments = @compileToFragments\n\n    @compileNode = (o) ->\n      target.update compileNode, o\n\n    @compileToFragments = (o) ->\n      target.update compileToFragments, o\n\n    target\n\n  cacheToCodeFragments: (cacheValues) ->\n    [fragmentsToText(cacheValues[0]), fragmentsToText(cacheValues[1])]\n\n  # Construct a node that returns the current node’s result.\n  # Note that this is overridden for smarter behavior for\n  # many statement nodes (e.g. `If`, `For`).\n  makeReturn: (results, mark) ->\n    if mark\n      # Mark this node as implicitly returned, so that it can be part of the\n      # node metadata returned in the AST.\n      @canBeReturned = yes\n      return\n    node = @unwrapAll()\n    if results\n      new Call new Literal(\"#{results}.push\"), [node]\n    else\n      new Return node\n\n  # Does this node, or any of its children, contain a node of a certain kind?\n  # Recursively traverses down the *children* nodes and returns the first one\n  # that verifies `pred`. Otherwise return undefined. `contains` does not cross\n  # scope boundaries.\n  contains: (pred) ->\n    node = undefined\n    @traverseChildren no, (n) ->\n      if pred n\n        node = n\n        return no\n    node\n\n  # Pull out the last node of a node list.\n  lastNode: (list) ->\n    if list.length is 0 then null else list[list.length - 1]\n\n  # Debugging representation of the node, for inspecting the parse tree.\n  # This is what `coffee --nodes` prints out.\n  toString: (idt = '', name = @constructor.name) ->\n    tree = '\\n' + idt + name\n    tree += '?' if @soak\n    @eachChild (node) -> tree += node.toString idt + TAB\n    tree\n\n  checkForPureStatementInExpression: ->\n    if jumpNode = @jumps()\n      jumpNode.error 'cannot use a pure statement in an expression'\n\n  # Plain JavaScript object representation of the node, that can be serialized\n  # as JSON. This is what the `ast` option in the Node API returns.\n  # We try to follow the [Babel AST spec](https://github.com/babel/babel/blob/master/packages/babel-parser/ast/spec.md)\n  # as closely as possible, for improved interoperability with other tools.\n  # **WARNING: DO NOT OVERRIDE THIS METHOD IN CHILD CLASSES.**\n  # Only override the component `ast*` methods as needed.\n  ast: (o, level) ->\n    # Merge `level` into `o` and perform other universal checks.\n    o = @astInitialize o, level\n    # Create serializable representation of this node.\n    astNode = @astNode o\n    # Mark AST nodes that correspond to expressions that (implicitly) return.\n    # We can’t do this as part of `astNode` because we need to assemble child\n    # nodes first before marking the parent being returned.\n    if @astNode? and @canBeReturned\n      Object.assign astNode, {returns: yes}\n    astNode\n\n  astInitialize: (o, level) ->\n    o = Object.assign {}, o\n    o.level = level if level?\n    if o.level > LEVEL_TOP\n      @checkForPureStatementInExpression()\n    # `@makeReturn` must be called before `astProperties`, because the latter may call\n    # `.ast()` for child nodes and those nodes would need the return logic from `makeReturn`\n    # already executed by then.\n    @makeReturn null, yes if @isStatement(o) and o.level isnt LEVEL_TOP and o.scope?\n    o\n\n  astNode: (o) ->\n    # Every abstract syntax tree node object has four categories of properties:\n    # - type, stored in the `type` field and a string like `NumberLiteral`.\n    # - location data, stored in the `loc`, `start`, `end` and `range` fields.\n    # - properties specific to this node, like `parsedValue`.\n    # - properties that are themselves child nodes, like `body`.\n    # These fields are all intermixed in the Babel spec; `type` and `start` and\n    # `parsedValue` are all top level fields in the AST node object. We have\n    # separate methods for returning each category, that we merge together here.\n    Object.assign {}, {type: @astType(o)}, @astProperties(o), @astLocationData()\n\n  # By default, a node class has no specific properties.\n  astProperties: -> {}\n\n  # By default, a node class’s AST `type` is its class name.\n  astType: -> @constructor.name\n\n  # The AST location data is a rearranged version of our Jison location data,\n  # mutated into the structure that the Babel spec uses.\n  astLocationData: ->\n    jisonLocationDataToAstLocationData @locationData\n\n  # Determines whether an AST node needs an `ExpressionStatement` wrapper.\n  # Typically matches our `isStatement()` logic but this allows overriding.\n  isStatementAst: (o) ->\n    @isStatement o\n\n  # Passes each child to a function, breaking when the function returns `false`.\n  eachChild: (func) ->\n    return this unless @children\n    for attr in @children when @[attr]\n      for child in flatten [@[attr]]\n        return this if func(child) is false\n    this\n\n  traverseChildren: (crossScope, func) ->\n    @eachChild (child) ->\n      recur = func(child)\n      child.traverseChildren(crossScope, func) unless recur is no\n\n  # `replaceInContext` will traverse children looking for a node for which `match` returns\n  # true. Once found, the matching node will be replaced by the result of calling `replacement`.\n  replaceInContext: (match, replacement) ->\n    return false unless @children\n    for attr in @children when children = @[attr]\n      if Array.isArray children\n        for child, i in children\n          if match child\n            children[i..i] = replacement child, @\n            return true\n          else\n            return true if child.replaceInContext match, replacement\n      else if match children\n        @[attr] = replacement children, @\n        return true\n      else\n        return true if children.replaceInContext match, replacement\n\n  invert: ->\n    new Op '!', this\n\n  unwrapAll: ->\n    node = this\n    continue until node is node = node.unwrap()\n    node\n\n  # Default implementations of the common node properties and methods. Nodes\n  # will override these with custom logic, if needed.\n\n  # `children` are the properties to recurse into when tree walking. The\n  # `children` list *is* the structure of the AST. The `parent` pointer, and\n  # the pointer to the `children` are how you can traverse the tree.\n  children: []\n\n  # `isStatement` has to do with “everything is an expression”. A few things\n  # can’t be expressions, such as `break`. Things that `isStatement` returns\n  # `true` for are things that can’t be used as expressions. There are some\n  # error messages that come from `nodes.coffee` due to statements ending up\n  # in expression position.\n  isStatement: NO\n\n  # Track comments that have been compiled into fragments, to avoid outputting\n  # them twice.\n  compiledComments: []\n\n  # `includeCommentFragments` lets `compileCommentFragments` know whether this node\n  # has special awareness of how to handle comments within its output.\n  includeCommentFragments: NO\n\n  # `jumps` tells you if an expression, or an internal part of an expression,\n  # has a flow control construct (like `break`, `continue`, or `return`)\n  # that jumps out of the normal flow of control and can’t be used as a value.\n  # (Note that `throw` is not considered a flow control construct.)\n  # This is important because flow control in the middle of an expression\n  # makes no sense; we have to disallow it.\n  jumps: NO\n\n  # If `node.shouldCache() is false`, it is safe to use `node` more than once.\n  # Otherwise you need to store the value of `node` in a variable and output\n  # that variable several times instead. Kind of like this: `5` need not be\n  # cached. `returnFive()`, however, could have side effects as a result of\n  # evaluating it more than once, and therefore we need to cache it. The\n  # parameter is named `shouldCache` rather than `mustCache` because there are\n  # also cases where we might not need to cache but where we want to, for\n  # example a long expression that may well be idempotent but we want to cache\n  # for brevity.\n  shouldCache: YES\n\n  isChainable: NO\n  isAssignable: NO\n  isNumber: NO\n\n  unwrap: THIS\n  unfoldSoak: NO\n\n  # Is this node used to assign a certain variable?\n  assigns: NO\n\n  # For this node and all descendents, set the location data to `locationData`\n  # if the location data is not already set.\n  updateLocationDataIfMissing: (locationData, force) ->\n    @forceUpdateLocation = yes if force\n    return this if @locationData and not @forceUpdateLocation\n    delete @forceUpdateLocation\n    @locationData = locationData\n\n    @eachChild (child) ->\n      child.updateLocationDataIfMissing locationData\n\n  # Add location data from another node\n  withLocationDataFrom: ({locationData}) ->\n    @updateLocationDataIfMissing locationData\n\n  # Add location data and comments from another node\n  withLocationDataAndCommentsFrom: (node) ->\n    @withLocationDataFrom node\n    {comments} = node\n    @comments = comments if comments?.length\n    this\n\n  # Throw a SyntaxError associated with this node’s location.\n  error: (message) ->\n    throwSyntaxError message, @locationData\n\n  makeCode: (code) ->\n    new CodeFragment this, code\n\n  wrapInParentheses: (fragments) ->\n    [@makeCode('('), fragments..., @makeCode(')')]\n\n  wrapInBraces: (fragments) ->\n    [@makeCode('{'), fragments..., @makeCode('}')]\n\n  # `fragmentsList` is an array of arrays of fragments. Each array in fragmentsList will be\n  # concatenated together, with `joinStr` added in between each, to produce a final flat array\n  # of fragments.\n  joinFragmentArrays: (fragmentsList, joinStr) ->\n    answer = []\n    for fragments, i in fragmentsList\n      if i then answer.push @makeCode joinStr\n      answer = answer.concat fragments\n    answer\n\n#### HoistTarget\n\n# A **HoistTargetNode** represents the output location in the node tree for a hoisted node.\n# See Base#hoist.\nexports.HoistTarget = class HoistTarget extends Base\n  # Expands hoisted fragments in the given array\n  @expand = (fragments) ->\n    for fragment, i in fragments by -1 when fragment.fragments\n      fragments[i..i] = @expand fragment.fragments\n    fragments\n\n  constructor: (@source) ->\n    super()\n\n    # Holds presentational options to apply when the source node is compiled.\n    @options = {}\n\n    # Placeholder fragments to be replaced by the source node’s compilation.\n    @targetFragments = { fragments: [] }\n\n  isStatement: (o) ->\n    @source.isStatement o\n\n  # Update the target fragments with the result of compiling the source.\n  # Calls the given compile function with the node and options (overriden with the target\n  # presentational options).\n  update: (compile, o) ->\n    @targetFragments.fragments = compile.call @source, merge o, @options\n\n  # Copies the target indent and level, and returns the placeholder fragments\n  compileToFragments: (o, level) ->\n    @options.indent = o.indent\n    @options.level  = level ? o.level\n    [ @targetFragments ]\n\n  compileNode: (o) ->\n    @compileToFragments o\n\n  compileClosure: (o) ->\n    @compileToFragments o\n\n#### Root\n\n# The root node of the node tree\nexports.Root = class Root extends Base\n  constructor: (@body) ->\n    super()\n\n    @isAsync = (new Code [], @body).isAsync\n\n  children: ['body']\n\n  # Wrap everything in a safety closure, unless requested not to. It would be\n  # better not to generate them in the first place, but for now, clean up\n  # obvious double-parentheses.\n  compileNode: (o) ->\n    o.indent    = if o.bare then '' else TAB\n    o.level     = LEVEL_TOP\n    o.compiling = yes\n    @initializeScope o\n    fragments = @body.compileRoot o\n    return fragments if o.bare\n    functionKeyword = \"#{if @isAsync then 'async ' else ''}function\"\n    [].concat @makeCode(\"(#{functionKeyword}() {\\n\"), fragments, @makeCode(\"\\n}).call(this);\\n\")\n\n  initializeScope: (o) ->\n    o.scope = new Scope null, @body, null, o.referencedVars ? []\n    # Mark given local variables in the root scope as parameters so they don’t\n    # end up being declared on the root block.\n    o.scope.parameter name for name in o.locals or []\n\n  commentsAst: ->\n    @allComments ?=\n      for commentToken in (@allCommentTokens ? []) when not commentToken.heregex\n        if commentToken.here\n          new HereComment commentToken\n        else\n          new LineComment commentToken\n    comment.ast() for comment in @allComments\n\n  astNode: (o) ->\n    o.level = LEVEL_TOP\n    @initializeScope o\n    super o\n\n  astType: -> 'File'\n\n  astProperties: (o) ->\n    @body.isRootBlock = yes\n    return\n      program: Object.assign @body.ast(o), @astLocationData()\n      comments: @commentsAst()\n\n#### Block\n\n# The block is the list of expressions that forms the body of an\n# indented block of code -- the implementation of a function, a clause in an\n# `if`, `switch`, or `try`, and so on...\nexports.Block = class Block extends Base\n  constructor: (nodes) ->\n    super()\n\n    @expressions = compact flatten nodes or []\n\n  children: ['expressions']\n\n  # Tack an expression on to the end of this expression list.\n  push: (node) ->\n    @expressions.push node\n    this\n\n  # Remove and return the last expression of this expression list.\n  pop: ->\n    @expressions.pop()\n\n  # Add an expression at the beginning of this expression list.\n  unshift: (node) ->\n    @expressions.unshift node\n    this\n\n  # If this Block consists of just a single node, unwrap it by pulling\n  # it back out.\n  unwrap: ->\n    if @expressions.length is 1 then @expressions[0] else this\n\n  # Is this an empty block of code?\n  isEmpty: ->\n    not @expressions.length\n\n  isStatement: (o) ->\n    for exp in @expressions when exp.isStatement o\n      return yes\n    no\n\n  jumps: (o) ->\n    for exp in @expressions\n      return jumpNode if jumpNode = exp.jumps o\n\n  # A Block node does not return its entire body, rather it\n  # ensures that the final expression is returned.\n  makeReturn: (results, mark) ->\n    len = @expressions.length\n    [..., lastExp] = @expressions\n    lastExp = lastExp?.unwrap() or no\n    # We also need to check that we’re not returning a JSX tag if there’s an\n    # adjacent one at the same level; JSX doesn’t allow that.\n    if lastExp and lastExp instanceof Parens and lastExp.body.expressions.length > 1\n      {body:{expressions}} = lastExp\n      [..., penult, last] = expressions\n      penult = penult.unwrap()\n      last = last.unwrap()\n      if penult instanceof JSXElement and last instanceof JSXElement\n        expressions[expressions.length - 1].error 'Adjacent JSX elements must be wrapped in an enclosing tag'\n    if mark\n      @expressions[len - 1]?.makeReturn results, mark\n      return\n    while len--\n      expr = @expressions[len]\n      @expressions[len] = expr.makeReturn results\n      @expressions.splice(len, 1) if expr instanceof Return and not expr.expression\n      break\n    this\n\n  compile: (o, lvl) ->\n    return new Root(this).withLocationDataFrom(this).compile o, lvl unless o.scope\n\n    super o, lvl\n\n  # Compile all expressions within the **Block** body. If we need to return\n  # the result, and it’s an expression, simply return it. If it’s a statement,\n  # ask the statement to do so.\n  compileNode: (o) ->\n    @tab  = o.indent\n    top   = o.level is LEVEL_TOP\n    compiledNodes = []\n\n    for node, index in @expressions\n      if node.hoisted\n        # This is a hoisted expression.\n        # We want to compile this and ignore the result.\n        node.compileToFragments o\n        continue\n      node = (node.unfoldSoak(o) or node)\n      if node instanceof Block\n        # This is a nested block. We don’t do anything special here like\n        # enclose it in a new scope; we just compile the statements in this\n        # block along with our own.\n        compiledNodes.push node.compileNode o\n      else if top\n        node.front = yes\n        fragments = node.compileToFragments o\n        unless node.isStatement o\n          fragments = indentInitial fragments, @\n          [..., lastFragment] = fragments\n          unless lastFragment.code is '' or lastFragment.isComment\n            fragments.push @makeCode ';'\n        compiledNodes.push fragments\n      else\n        compiledNodes.push node.compileToFragments o, LEVEL_LIST\n    if top\n      if @spaced\n        return [].concat @joinFragmentArrays(compiledNodes, '\\n\\n'), @makeCode('\\n')\n      else\n        return @joinFragmentArrays(compiledNodes, '\\n')\n    if compiledNodes.length\n      answer = @joinFragmentArrays(compiledNodes, ', ')\n    else\n      answer = [@makeCode 'void 0']\n    if compiledNodes.length > 1 and o.level >= LEVEL_LIST then @wrapInParentheses answer else answer\n\n  compileRoot: (o) ->\n    @spaced = yes\n    fragments = @compileWithDeclarations o\n    HoistTarget.expand fragments\n    @compileComments fragments\n\n  # Compile the expressions body for the contents of a function, with\n  # declarations of all inner variables pushed up to the top.\n  compileWithDeclarations: (o) ->\n    fragments = []\n    post = []\n    for exp, i in @expressions\n      exp = exp.unwrap()\n      break unless exp instanceof Literal\n    o = merge(o, level: LEVEL_TOP)\n    if i\n      rest = @expressions.splice i, 9e9\n      [spaced,    @spaced] = [@spaced, no]\n      [fragments, @spaced] = [@compileNode(o), spaced]\n      @expressions = rest\n    post = @compileNode o\n    {scope} = o\n    if scope.expressions is this\n      declars = o.scope.hasDeclarations()\n      assigns = scope.hasAssignments\n      if declars or assigns\n        fragments.push @makeCode '\\n' if i\n        fragments.push @makeCode \"#{@tab}var \"\n        if declars\n          declaredVariables = scope.declaredVariables()\n          for declaredVariable, declaredVariablesIndex in declaredVariables\n            fragments.push @makeCode declaredVariable\n            if Object::hasOwnProperty.call o.scope.comments, declaredVariable\n              fragments.push o.scope.comments[declaredVariable]...\n            if declaredVariablesIndex isnt declaredVariables.length - 1\n              fragments.push @makeCode ', '\n        if assigns\n          fragments.push @makeCode \",\\n#{@tab + TAB}\" if declars\n          fragments.push @makeCode scope.assignedVariables().join(\",\\n#{@tab + TAB}\")\n        fragments.push @makeCode \";\\n#{if @spaced then '\\n' else ''}\"\n      else if fragments.length and post.length\n        fragments.push @makeCode \"\\n\"\n    fragments.concat post\n\n  compileComments: (fragments) ->\n    for fragment, fragmentIndex in fragments\n      # Insert comments into the output at the next or previous newline.\n      # If there are no newlines at which to place comments, create them.\n      if fragment.precedingComments\n        # Determine the indentation level of the fragment that we are about\n        # to insert comments before, and use that indentation level for our\n        # inserted comments. At this point, the fragments’ `code` property\n        # is the generated output JavaScript, and CoffeeScript always\n        # generates output indented by two spaces; so all we need to do is\n        # search for a `code` property that begins with at least two spaces.\n        fragmentIndent = ''\n        for pastFragment in fragments[0...(fragmentIndex + 1)] by -1\n          indent = /^ {2,}/m.exec pastFragment.code\n          if indent\n            fragmentIndent = indent[0]\n            break\n          else if '\\n' in pastFragment.code\n            break\n        code = \"\\n#{fragmentIndent}\" + (\n            for commentFragment in fragment.precedingComments\n              if commentFragment.isHereComment and commentFragment.multiline\n                multident commentFragment.code, fragmentIndent, no\n              else\n                commentFragment.code\n          ).join(\"\\n#{fragmentIndent}\").replace /^(\\s*)$/gm, ''\n        for pastFragment, pastFragmentIndex in fragments[0...(fragmentIndex + 1)] by -1\n          newLineIndex = pastFragment.code.lastIndexOf '\\n'\n          if newLineIndex is -1\n            # Keep searching previous fragments until we can’t go back any\n            # further, either because there are no fragments left or we’ve\n            # discovered that we’re in a code block that is interpolated\n            # inside a string.\n            if pastFragmentIndex is 0\n              pastFragment.code = '\\n' + pastFragment.code\n              newLineIndex = 0\n            else if pastFragment.isStringWithInterpolations and pastFragment.code is '{'\n              code = code[1..] + '\\n' # Move newline to end.\n              newLineIndex = 1\n            else\n              continue\n          delete fragment.precedingComments\n          pastFragment.code = pastFragment.code[0...newLineIndex] +\n            code + pastFragment.code[newLineIndex..]\n          break\n\n      # Yes, this is awfully similar to the previous `if` block, but if you\n      # look closely you’ll find lots of tiny differences that make this\n      # confusing if it were abstracted into a function that both blocks share.\n      if fragment.followingComments\n        # Does the first trailing comment follow at the end of a line of code,\n        # like `; // Comment`, or does it start a new line after a line of code?\n        trail = fragment.followingComments[0].trail\n        fragmentIndent = ''\n        # Find the indent of the next line of code, if we have any non-trailing\n        # comments to output. We need to first find the next newline, as these\n        # comments will be output after that; and then the indent of the line\n        # that follows the next newline.\n        unless trail and fragment.followingComments.length is 1\n          onNextLine = no\n          for upcomingFragment in fragments[fragmentIndex...]\n            unless onNextLine\n              if '\\n' in upcomingFragment.code\n                onNextLine = yes\n              else\n                continue\n            else\n              indent = /^ {2,}/m.exec upcomingFragment.code\n              if indent\n                fragmentIndent = indent[0]\n                break\n              else if '\\n' in upcomingFragment.code\n                break\n        # Is this comment following the indent inserted by bare mode?\n        # If so, there’s no need to indent this further.\n        code = if fragmentIndex is 1 and /^\\s+$/.test fragments[0].code\n          ''\n        else if trail\n          ' '\n        else\n          \"\\n#{fragmentIndent}\"\n        # Assemble properly indented comments.\n        code += (\n            for commentFragment in fragment.followingComments\n              if commentFragment.isHereComment and commentFragment.multiline\n                multident commentFragment.code, fragmentIndent, no\n              else\n                commentFragment.code\n          ).join(\"\\n#{fragmentIndent}\").replace /^(\\s*)$/gm, ''\n        for upcomingFragment, upcomingFragmentIndex in fragments[fragmentIndex...]\n          newLineIndex = upcomingFragment.code.indexOf '\\n'\n          if newLineIndex is -1\n            # Keep searching upcoming fragments until we can’t go any\n            # further, either because there are no fragments left or we’ve\n            # discovered that we’re in a code block that is interpolated\n            # inside a string.\n            if upcomingFragmentIndex is fragments.length - 1\n              upcomingFragment.code = upcomingFragment.code + '\\n'\n              newLineIndex = upcomingFragment.code.length\n            else if upcomingFragment.isStringWithInterpolations and upcomingFragment.code is '}'\n              code = \"#{code}\\n\"\n              newLineIndex = 0\n            else\n              continue\n          delete fragment.followingComments\n          # Avoid inserting extra blank lines.\n          code = code.replace /^\\n/, '' if upcomingFragment.code is '\\n'\n          upcomingFragment.code = upcomingFragment.code[0...newLineIndex] +\n            code + upcomingFragment.code[newLineIndex..]\n          break\n\n    fragments\n\n  # Wrap up the given nodes as a **Block**, unless it already happens\n  # to be one.\n  @wrap: (nodes) ->\n    return nodes[0] if nodes.length is 1 and nodes[0] instanceof Block\n    new Block nodes\n\n  astNode: (o) ->\n    if (o.level? and o.level isnt LEVEL_TOP) and @expressions.length\n      return (new Sequence(@expressions).withLocationDataFrom @).ast o\n\n    super o\n\n  astType: ->\n    if @isRootBlock\n      'Program'\n    else if @isClassBody\n      'ClassBody'\n    else\n      'BlockStatement'\n\n  astProperties: (o) ->\n    checkForDirectives = del o, 'checkForDirectives'\n\n    sniffDirectives @expressions, notFinalExpression: checkForDirectives if @isRootBlock or checkForDirectives\n    directives = []\n    body = []\n    for expression in @expressions\n      expressionAst = expression.ast o\n      # Ignore generated PassthroughLiteral\n      if not expressionAst?\n        continue\n      else if expression instanceof Directive\n        directives.push expressionAst\n      # If an expression is a statement, it can be added to the body as is.\n      else if expression.isStatementAst o\n        body.push expressionAst\n      # Otherwise, we need to wrap it in an `ExpressionStatement` AST node.\n      else\n        body.push Object.assign\n            type: 'ExpressionStatement'\n            expression: expressionAst\n          ,\n            expression.astLocationData()\n\n    return {\n      # For now, we’re not including `sourceType` on the `Program` AST node.\n      # Its value could be either `'script'` or `'module'`, and there’s no way\n      # for CoffeeScript to always know which it should be. The presence of an\n      # `import` or `export` statement in source code would imply that it should\n      # be a `module`, but a project may consist of mostly such files and also\n      # an outlier file that lacks `import` or `export` but is still imported\n      # into the project and therefore expects to be treated as a `module`.\n      # Determining the value of `sourceType` is essentially the same challenge\n      # posed by determining the parse goal of a JavaScript file, also `module`\n      # or `script`, and so if Node figures out a way to do so for `.js` files\n      # then CoffeeScript can copy Node’s algorithm.\n\n      # sourceType: 'module'\n      body, directives\n    }\n\n  astLocationData: ->\n    return if @isRootBlock and not @locationData?\n    super()\n\n# A directive e.g. 'use strict'.\n# Currently only used during AST generation.\nexports.Directive = class Directive extends Base\n  constructor: (@value) ->\n    super()\n\n  astProperties: (o) ->\n    return\n      value: Object.assign {},\n        @value.ast o\n        type: 'DirectiveLiteral'\n\n#### Literal\n\n# `Literal` is a base class for static values that can be passed through\n# directly into JavaScript without translation, such as: strings, numbers,\n# `true`, `false`, `null`...\nexports.Literal = class Literal extends Base\n  constructor: (@value) ->\n    super()\n\n  shouldCache: NO\n\n  assigns: (name) ->\n    name is @value\n\n  compileNode: (o) ->\n    [@makeCode @value]\n\n  astProperties: ->\n    return\n      value: @value\n\n  toString: ->\n    # This is only intended for debugging.\n    \" #{if @isStatement() then super() else @constructor.name}: #{@value}\"\n\nexports.NumberLiteral = class NumberLiteral extends Literal\n  constructor: (@value, {@parsedValue} = {}) ->\n    super()\n    unless @parsedValue?\n      if isNumber @value\n        @parsedValue = @value\n        @value = \"#{@value}\"\n      else\n        @parsedValue = parseNumber @value\n\n  isBigInt: ->\n    /n$/.test @value\n\n  astType: ->\n    if @isBigInt()\n      'BigIntLiteral'\n    else\n      'NumericLiteral'\n\n  astProperties: ->\n    return\n      value:\n        if @isBigInt()\n          @parsedValue.toString()\n        else\n          @parsedValue\n      extra:\n        rawValue:\n          if @isBigInt()\n            @parsedValue.toString()\n          else\n            @parsedValue\n        raw: @value\n\nexports.InfinityLiteral = class InfinityLiteral extends NumberLiteral\n  constructor: (@value, {@originalValue = 'Infinity'} = {}) ->\n    super()\n\n  compileNode: ->\n    [@makeCode '2e308']\n\n  astNode: (o) ->\n    unless @originalValue is 'Infinity'\n      return new NumberLiteral(@value).withLocationDataFrom(@).ast o\n    super o\n\n  astType: -> 'Identifier'\n\n  astProperties: ->\n    return\n      name: 'Infinity'\n      declaration: no\n\nexports.NaNLiteral = class NaNLiteral extends NumberLiteral\n  constructor: ->\n    super 'NaN'\n\n  compileNode: (o) ->\n    code = [@makeCode '0/0']\n    if o.level >= LEVEL_OP then @wrapInParentheses code else code\n\n  astType: -> 'Identifier'\n\n  astProperties: ->\n    return\n      name: 'NaN'\n      declaration: no\n\nexports.StringLiteral = class StringLiteral extends Literal\n  constructor: (@originalValue, {@quote, @initialChunk, @finalChunk, @indent, @double, @heregex} = {}) ->\n    super ''\n    @quote = null if @quote is '///'\n    @fromSourceString = @quote?\n    @quote ?= '\"'\n    heredoc = @isFromHeredoc()\n\n    val = @originalValue\n    if @heregex\n      val = val.replace HEREGEX_OMIT, '$1$2'\n      val = replaceUnicodeCodePointEscapes val, flags: @heregex.flags\n    else\n      val = val.replace STRING_OMIT, '$1'\n      val =\n        unless @fromSourceString\n          val\n        else if heredoc\n          indentRegex = /// \\n#{@indent} ///g if @indent\n\n          val = val.replace indentRegex, '\\n' if indentRegex\n          val = val.replace LEADING_BLANK_LINE,  '' if @initialChunk\n          val = val.replace TRAILING_BLANK_LINE, '' if @finalChunk\n          val\n        else\n          val.replace SIMPLE_STRING_OMIT, (match, offset) =>\n            if (@initialChunk and offset is 0) or\n               (@finalChunk and offset + match.length is val.length)\n              ''\n            else\n              ' '\n    @delimiter = @quote.charAt 0\n    @value = makeDelimitedLiteral val, {\n      @delimiter\n      @double\n    }\n\n    @unquotedValueForTemplateLiteral = makeDelimitedLiteral val, {\n      delimiter: '`'\n      @double\n      escapeNewlines: no\n      includeDelimiters: no\n      convertTrailingNullEscapes: yes\n    }\n\n    @unquotedValueForJSX = makeDelimitedLiteral val, {\n      @double\n      escapeNewlines: no\n      includeDelimiters: no\n      escapeDelimiter: no\n    }\n\n  compileNode: (o) ->\n    return StringWithInterpolations.fromStringLiteral(@).compileNode o if @shouldGenerateTemplateLiteral()\n    return [@makeCode @unquotedValueForJSX] if @jsx\n    super o\n\n  # `StringLiteral`s can represent either entire literal strings\n  # or pieces of text inside of e.g. an interpolated string.\n  # When parsed as the former but needing to be treated as the latter\n  # (e.g. the string part of a tagged template literal), this will return\n  # a copy of the `StringLiteral` with the quotes trimmed from its location\n  # data (like it would have if parsed as part of an interpolated string).\n  withoutQuotesInLocationData: ->\n    endsWithNewline = @originalValue[-1..] is '\\n'\n    locationData = Object.assign {}, @locationData\n    locationData.first_column          += @quote.length\n    if endsWithNewline\n      locationData.last_line -= 1\n      locationData.last_column =\n        if locationData.last_line is locationData.first_line\n          locationData.first_column + @originalValue.length - '\\n'.length\n        else\n          @originalValue[...-1].length - '\\n'.length - @originalValue[...-1].lastIndexOf('\\n')\n    else\n      locationData.last_column         -= @quote.length\n    locationData.last_column_exclusive -= @quote.length\n    locationData.range = [\n      locationData.range[0] + @quote.length\n      locationData.range[1] - @quote.length\n    ]\n    copy = new StringLiteral @originalValue, {@quote, @initialChunk, @finalChunk, @indent, @double, @heregex}\n    copy.locationData = locationData\n    copy\n\n  isFromHeredoc: ->\n    @quote.length is 3\n\n  shouldGenerateTemplateLiteral: ->\n    @isFromHeredoc()\n\n  astNode: (o) ->\n    return StringWithInterpolations.fromStringLiteral(@).ast o if @shouldGenerateTemplateLiteral()\n    super o\n\n  astProperties: ->\n    return\n      value: @originalValue\n      extra:\n        raw: \"#{@delimiter}#{@originalValue}#{@delimiter}\"\n\nexports.RegexLiteral = class RegexLiteral extends Literal\n  constructor: (value, {@delimiter = '/', @heregexCommentTokens = []} = {}) ->\n    super ''\n    heregex = @delimiter is '///'\n    endDelimiterIndex = value.lastIndexOf '/'\n    @flags = value[endDelimiterIndex + 1..]\n    val = @originalValue = value[1...endDelimiterIndex]\n    val = val.replace HEREGEX_OMIT, '$1$2' if heregex\n    val = replaceUnicodeCodePointEscapes val, {@flags}\n    @value = \"#{makeDelimitedLiteral val, delimiter: '/'}#{@flags}\"\n\n  REGEX_REGEX: /// ^ / (.*) / \\w* $ ///\n\n  astType: -> 'RegExpLiteral'\n\n  astProperties: (o) ->\n    [, pattern] = @REGEX_REGEX.exec @value\n    return {\n      value: undefined\n      pattern, @flags, @delimiter\n      originalPattern: @originalValue\n      extra:\n        raw: @value\n        originalRaw: \"#{@delimiter}#{@originalValue}#{@delimiter}#{@flags}\"\n        rawValue: undefined\n      comments:\n        for heregexCommentToken in @heregexCommentTokens\n          if heregexCommentToken.here\n            new HereComment(heregexCommentToken).ast o\n          else\n            new LineComment(heregexCommentToken).ast o\n    }\n\nexports.PassthroughLiteral = class PassthroughLiteral extends Literal\n  constructor: (@originalValue, {@here, @generated} = {}) ->\n    super ''\n    @value = @originalValue.replace /\\\\+(`|$)/g, (string) ->\n      # `string` is always a value like '\\`', '\\\\\\`', '\\\\\\\\\\`', etc.\n      # By reducing it to its latter half, we turn '\\`' to '`', '\\\\\\`' to '\\`', etc.\n      string[-Math.ceil(string.length / 2)..]\n\n  astNode: (o) ->\n    return null if @generated\n    super o\n\n  astProperties: ->\n    return {\n      value: @originalValue\n      here: !!@here\n    }\n\nexports.IdentifierLiteral = class IdentifierLiteral extends Literal\n  isAssignable: YES\n\n  eachName: (iterator) ->\n    iterator @\n\n  astType: ->\n    if @jsx\n      'JSXIdentifier'\n    else\n      'Identifier'\n\n  astProperties: ->\n    return\n      name: @value\n      declaration: !!@isDeclaration\n\nexports.PropertyName = class PropertyName extends Literal\n  isAssignable: YES\n\n  astType: ->\n    if @jsx\n      'JSXIdentifier'\n    else\n      'Identifier'\n\n  astProperties: ->\n    return\n      name: @value\n      declaration: no\n\nexports.ComputedPropertyName = class ComputedPropertyName extends PropertyName\n  compileNode: (o) ->\n    [@makeCode('['), @value.compileToFragments(o, LEVEL_LIST)..., @makeCode(']')]\n\n  astNode: (o) ->\n    @value.ast o\n\nexports.StatementLiteral = class StatementLiteral extends Literal\n  isStatement: YES\n\n  makeReturn: THIS\n\n  jumps: (o) ->\n    return this if @value is 'break' and not (o?.loop or o?.block)\n    return this if @value is 'continue' and not o?.loop\n\n  compileNode: (o) ->\n    [@makeCode \"#{@tab}#{@value};\"]\n\n  astType: ->\n    switch @value\n      when 'continue' then 'ContinueStatement'\n      when 'break'    then 'BreakStatement'\n      when 'debugger' then 'DebuggerStatement'\n\nexports.ThisLiteral = class ThisLiteral extends Literal\n  constructor: (value) ->\n    super 'this'\n    @shorthand = value is '@'\n\n  compileNode: (o) ->\n    code = if o.scope.method?.bound then o.scope.method.context else @value\n    [@makeCode code]\n\n  astType: -> 'ThisExpression'\n\n  astProperties: ->\n    return\n      shorthand: @shorthand\n\nexports.UndefinedLiteral = class UndefinedLiteral extends Literal\n  constructor: ->\n    super 'undefined'\n\n  compileNode: (o) ->\n    [@makeCode if o.level >= LEVEL_ACCESS then '(void 0)' else 'void 0']\n\n  astType: -> 'Identifier'\n\n  astProperties: ->\n    return\n      name: @value\n      declaration: no\n\nexports.NullLiteral = class NullLiteral extends Literal\n  constructor: ->\n    super 'null'\n\nexports.BooleanLiteral = class BooleanLiteral extends Literal\n  constructor: (value, {@originalValue} = {}) ->\n    super value\n    @originalValue ?= @value\n\n  astProperties: ->\n    value: if @value is 'true' then yes else no\n    name: @originalValue\n\nexports.DefaultLiteral = class DefaultLiteral extends Literal\n  astType: -> 'Identifier'\n\n  astProperties: ->\n    return\n      name: 'default'\n      declaration: no\n\n#### Return\n\n# A `return` is a *pureStatement*—wrapping it in a closure wouldn’t make sense.\nexports.Return = class Return extends Base\n  constructor: (@expression, {@belongsToFuncDirectiveReturn} = {}) ->\n    super()\n\n  children: ['expression']\n\n  isStatement:     YES\n  makeReturn:      THIS\n  jumps:           THIS\n\n  compileToFragments: (o, level) ->\n    expr = @expression?.makeReturn()\n    if expr and expr not instanceof Return then expr.compileToFragments o, level else super o, level\n\n  compileNode: (o) ->\n    answer = []\n    # TODO: If we call `expression.compile()` here twice, we’ll sometimes\n    # get back different results!\n    if @expression\n      answer = @expression.compileToFragments o, LEVEL_PAREN\n      unshiftAfterComments answer, @makeCode \"#{@tab}return \"\n      # Since the `return` got indented by `@tab`, preceding comments that are\n      # multiline need to be indented.\n      for fragment in answer\n        if fragment.isHereComment and '\\n' in fragment.code\n          fragment.code = multident fragment.code, @tab\n        else if fragment.isLineComment\n          fragment.code = \"#{@tab}#{fragment.code}\"\n        else\n          break\n    else\n      answer.push @makeCode \"#{@tab}return\"\n    answer.push @makeCode ';'\n    answer\n\n  checkForPureStatementInExpression: ->\n    # don’t flag `return` from `await return`/`yield return` as invalid.\n    return if @belongsToFuncDirectiveReturn\n    super()\n\n  astType: -> 'ReturnStatement'\n\n  astProperties: (o) ->\n    argument: @expression?.ast(o, LEVEL_PAREN) ? null\n\n# Parent class for `YieldReturn`/`AwaitReturn`.\nexports.FuncDirectiveReturn = class FuncDirectiveReturn extends Return\n  constructor: (expression, {@returnKeyword}) ->\n    super expression\n\n  compileNode: (o) ->\n    @checkScope o\n    super o\n\n  checkScope: (o) ->\n    unless o.scope.parent?\n      @error \"#{@keyword} can only occur inside functions\"\n\n  isStatementAst: NO\n\n  astNode: (o) ->\n    @checkScope o\n\n    new Op @keyword,\n      new Return @expression, belongsToFuncDirectiveReturn: yes\n      .withLocationDataFrom(\n        if @expression?\n          locationData: mergeLocationData @returnKeyword.locationData, @expression.locationData\n        else\n          @returnKeyword\n      )\n    .withLocationDataFrom @\n    .ast o\n\n# `yield return` works exactly like `return`, except that it turns the function\n# into a generator.\nexports.YieldReturn = class YieldReturn extends FuncDirectiveReturn\n  keyword: 'yield'\n\nexports.AwaitReturn = class AwaitReturn extends FuncDirectiveReturn\n  keyword: 'await'\n\n#### Value\n\n# A value, variable or literal or parenthesized, indexed or dotted into,\n# or vanilla.\nexports.Value = class Value extends Base\n  constructor: (base, props, tag, isDefaultValue = no) ->\n    super()\n    return base if not props and base instanceof Value\n    @base           = base\n    @properties     = props or []\n    @tag            = tag\n    @[tag]          = yes if tag\n    @isDefaultValue = isDefaultValue\n    # If this is a `@foo =` assignment, if there are comments on `@` move them\n    # to be on `foo`.\n    if @base?.comments and @base instanceof ThisLiteral and @properties[0]?.name?\n      moveComments @base, @properties[0].name\n\n  children: ['base', 'properties']\n\n  # Add a property (or *properties* ) `Access` to the list.\n  add: (props) ->\n    @properties = @properties.concat props\n    @forceUpdateLocation = yes\n    this\n\n  hasProperties: ->\n    @properties.length isnt 0\n\n  bareLiteral: (type) ->\n    not @properties.length and @base instanceof type\n\n  # Some boolean checks for the benefit of other nodes.\n  isArray        : -> @bareLiteral(Arr)\n  isRange        : -> @bareLiteral(Range)\n  shouldCache    : -> @hasProperties() or @base.shouldCache()\n  isAssignable   : (opts) -> @hasProperties() or @base.isAssignable opts\n  isNumber       : -> @bareLiteral(NumberLiteral)\n  isString       : -> @bareLiteral(StringLiteral)\n  isRegex        : -> @bareLiteral(RegexLiteral)\n  isUndefined    : -> @bareLiteral(UndefinedLiteral)\n  isNull         : -> @bareLiteral(NullLiteral)\n  isBoolean      : -> @bareLiteral(BooleanLiteral)\n  isAtomic       : ->\n    for node in @properties.concat @base\n      return no if node.soak or node instanceof Call or node instanceof Op and node.operator is 'do'\n    yes\n\n  isNotCallable  : -> @isNumber() or @isString() or @isRegex() or\n                      @isArray() or @isRange() or @isSplice() or @isObject() or\n                      @isUndefined() or @isNull() or @isBoolean()\n\n  isStatement : (o)    -> not @properties.length and @base.isStatement o\n  isJSXTag    : -> @base instanceof JSXTag\n  assigns     : (name) -> not @properties.length and @base.assigns name\n  jumps       : (o)    -> not @properties.length and @base.jumps o\n\n  isObject: (onlyGenerated) ->\n    return no if @properties.length\n    (@base instanceof Obj) and (not onlyGenerated or @base.generated)\n\n  isElision: ->\n    return no unless @base instanceof Arr\n    @base.hasElision()\n\n  isSplice: ->\n    [..., lastProperty] = @properties\n    lastProperty instanceof Slice\n\n  looksStatic: (className) ->\n    return no unless ((thisLiteral = @base) instanceof ThisLiteral or (name = @base).value is className) and\n      @properties.length is 1 and @properties[0].name?.value isnt 'prototype'\n    return\n      staticClassName: thisLiteral ? name\n\n  # The value can be unwrapped as its inner node, if there are no attached\n  # properties.\n  unwrap: ->\n    if @properties.length then this else @base\n\n  # A reference has base part (`this` value) and name part.\n  # We cache them separately for compiling complex expressions.\n  # `a()[b()] ?= c` -> `(_base = a())[_name = b()] ? _base[_name] = c`\n  cacheReference: (o) ->\n    [..., name] = @properties\n    if @properties.length < 2 and not @base.shouldCache() and not name?.shouldCache()\n      return [this, this]  # `a` `a.b`\n    base = new Value @base, @properties[...-1]\n    if base.shouldCache()  # `a().b`\n      bref = new IdentifierLiteral o.scope.freeVariable 'base'\n      base = new Value new Parens new Assign bref, base\n    return [base, bref] unless name  # `a()`\n    if name.shouldCache()  # `a[b()]`\n      nref = new IdentifierLiteral o.scope.freeVariable 'name'\n      name = new Index new Assign nref, name.index\n      nref = new Index nref\n    [base.add(name), new Value(bref or base.base, [nref or name])]\n\n  # We compile a value to JavaScript by compiling and joining each property.\n  # Things get much more interesting if the chain of properties has *soak*\n  # operators `?.` interspersed. Then we have to take care not to accidentally\n  # evaluate anything twice when building the soak chain.\n  compileNode: (o) ->\n    @base.front = @front\n    props = @properties\n    if props.length and @base.cached?\n      # Cached fragments enable correct order of the compilation,\n      # and reuse of variables in the scope.\n      # Example:\n      # `a(x = 5).b(-> x = 6)` should compile in the same order as\n      # `a(x = 5); b(-> x = 6)`\n      # (see issue #4437, https://github.com/jashkenas/coffeescript/issues/4437)\n      fragments = @base.cached\n    else\n      fragments = @base.compileToFragments o, (if props.length then LEVEL_ACCESS else null)\n    if props.length and SIMPLENUM.test fragmentsToText fragments\n      fragments.push @makeCode '.'\n    for prop in props\n      fragments.push (prop.compileToFragments o)...\n\n    fragments\n\n  # Unfold a soak into an `If`: `a?.b` -> `a.b if a?`\n  unfoldSoak: (o) ->\n    @unfoldedSoak ?= do =>\n      ifn = @base.unfoldSoak o\n      if ifn\n        ifn.body.properties.push @properties...\n        return ifn\n      for prop, i in @properties when prop.soak\n        prop.soak = off\n        fst = new Value @base, @properties[...i]\n        snd = new Value @base, @properties[i..]\n        if fst.shouldCache()\n          ref = new IdentifierLiteral o.scope.freeVariable 'ref'\n          fst = new Parens new Assign ref, fst\n          snd.base = ref\n        return new If new Existence(fst), snd, soak: on\n      no\n\n  eachName: (iterator, {checkAssignability = yes} = {}) ->\n    if @hasProperties()\n      iterator @\n    else if not checkAssignability or @base.isAssignable()\n      @base.eachName iterator\n    else\n      @error 'tried to assign to unassignable value'\n\n  # For AST generation, we need an `object` that’s this `Value` minus its last\n  # property, if it has properties.\n  object: ->\n    return @ unless @hasProperties()\n    # Get all properties except the last one; for a `Value` with only one\n    # property, `initialProperties` is an empty array.\n    initialProperties = @properties[0...@properties.length - 1]\n    # Create the `object` that becomes the new “base” for the split-off final\n    # property.\n    object = new Value @base, initialProperties, @tag, @isDefaultValue\n    # Add location data to our new node, so that it has correct location data\n    # for source maps or later conversion into AST location data.\n    object.locationData =\n      if initialProperties.length is 0\n        # This new `Value` has only one property, so the location data is just\n        # that of the parent `Value`’s base.\n        @base.locationData\n      else\n        # This new `Value` has multiple properties, so the location data spans\n        # from the parent `Value`’s base to the last property that’s included\n        # in this new node (a.k.a. the second-to-last property of the parent).\n        mergeLocationData @base.locationData, initialProperties[initialProperties.length - 1].locationData\n    object\n\n  containsSoak: ->\n    return no unless @hasProperties()\n\n    for property in @properties when property.soak\n      return yes\n\n    return yes if @base instanceof Call and @base.soak\n\n    no\n\n  astNode: (o) ->\n    # If the `Value` has no properties, the AST node is just whatever this\n    # node’s `base` is.\n    return @base.ast o unless @hasProperties()\n    # Otherwise, call `Base::ast` which in turn calls the `astType` and\n    # `astProperties` methods below.\n    super o\n\n  astType: ->\n    if @isJSXTag()\n      'JSXMemberExpression'\n    else if @containsSoak()\n      'OptionalMemberExpression'\n    else\n      'MemberExpression'\n\n  # If this `Value` has properties, the *last* property (e.g. `c` in `a.b.c`)\n  # becomes the `property`, and the preceding properties (e.g. `a.b`) become\n  # a child `Value` node assigned to the `object` property.\n  astProperties: (o) ->\n    [..., property] = @properties\n    property.name.jsx = yes if @isJSXTag()\n    computed = property instanceof Index or property.name?.unwrap() not instanceof PropertyName\n    return {\n      object: @object().ast o, LEVEL_ACCESS\n      property: property.ast o, (LEVEL_PAREN if computed)\n      computed\n      optional: !!property.soak\n      shorthand: !!property.shorthand\n    }\n\n  astLocationData: ->\n    return super() unless @isJSXTag()\n    # don't include leading < of JSX tag in location data\n    mergeAstLocationData(\n      jisonLocationDataToAstLocationData(@base.tagNameLocationData),\n      jisonLocationDataToAstLocationData(@properties[@properties.length - 1].locationData)\n    )\n\nexports.MetaProperty = class MetaProperty extends Base\n  constructor: (@meta, @property) ->\n    super()\n\n  children: ['meta', 'property']\n\n  checkValid: (o) ->\n    if @meta.value is 'new'\n      if @property instanceof Access and @property.name.value is 'target'\n        unless o.scope.parent?\n          @error \"new.target can only occur inside functions\"\n      else\n        @error \"the only valid meta property for new is new.target\"\n    else if @meta.value is 'import'\n      unless @property instanceof Access and @property.name.value is 'meta'\n        @error \"the only valid meta property for import is import.meta\"\n\n  compileNode: (o) ->\n    @checkValid o\n    fragments = []\n    fragments.push @meta.compileToFragments(o, LEVEL_ACCESS)...\n    fragments.push @property.compileToFragments(o)...\n    fragments\n\n  astProperties: (o) ->\n    @checkValid o\n\n    return\n      meta: @meta.ast o, LEVEL_ACCESS\n      property: @property.ast o\n\n#### HereComment\n\n# Comment delimited by `###` (becoming `/* */`).\nexports.HereComment = class HereComment extends Base\n  constructor: ({ @content, @newLine, @unshift, @locationData }) ->\n    super()\n\n  compileNode: (o) ->\n    multiline = '\\n' in @content\n\n    # Unindent multiline comments. They will be reindented later.\n    if multiline\n      indent = null\n      for line in @content.split '\\n'\n        leadingWhitespace = /^\\s*/.exec(line)[0]\n        if not indent or leadingWhitespace.length < indent.length\n          indent = leadingWhitespace\n      @content = @content.replace /// \\n #{indent} ///g, '\\n' if indent\n\n    hasLeadingMarks = /\\n\\s*[#|\\*]/.test @content\n    @content = @content.replace /^([ \\t]*)#(?=\\s)/gm, ' *' if hasLeadingMarks\n\n    @content = \"/*#{@content}#{if hasLeadingMarks then ' ' else ''}*/\"\n    fragment = @makeCode @content\n    fragment.newLine = @newLine\n    fragment.unshift = @unshift\n    fragment.multiline = multiline\n    # Don’t rely on `fragment.type`, which can break when the compiler is minified.\n    fragment.isComment = fragment.isHereComment = yes\n    fragment\n\n  astType: -> 'CommentBlock'\n\n  astProperties: ->\n    return\n      value: @content\n\n#### LineComment\n\n# Comment running from `#` to the end of a line (becoming `//`).\nexports.LineComment = class LineComment extends Base\n  constructor: ({ @content, @newLine, @unshift, @locationData, @precededByBlankLine }) ->\n    super()\n\n  compileNode: (o) ->\n    fragment = @makeCode(if /^\\s*$/.test @content then '' else \"#{if @precededByBlankLine then \"\\n#{o.indent}\" else ''}//#{@content}\")\n    fragment.newLine = @newLine\n    fragment.unshift = @unshift\n    fragment.trail = not @newLine and not @unshift\n    # Don’t rely on `fragment.type`, which can break when the compiler is minified.\n    fragment.isComment = fragment.isLineComment = yes\n    fragment\n\n  astType: -> 'CommentLine'\n\n  astProperties: ->\n    return\n      value: @content\n\n#### JSX\n\nexports.JSXIdentifier = class JSXIdentifier extends IdentifierLiteral\n  astType: -> 'JSXIdentifier'\n\nexports.JSXTag = class JSXTag extends JSXIdentifier\n  constructor: (value, {\n    @tagNameLocationData\n    @closingTagOpeningBracketLocationData\n    @closingTagSlashLocationData\n    @closingTagNameLocationData\n    @closingTagClosingBracketLocationData\n  }) ->\n    super value\n\n  astProperties: ->\n    return\n      name: @value\n\nexports.JSXExpressionContainer = class JSXExpressionContainer extends Base\n  constructor: (@expression, {locationData} = {}) ->\n    super()\n    @expression.jsxAttribute = yes\n    @locationData = locationData ? @expression.locationData\n\n  children: ['expression']\n\n  compileNode: (o) ->\n    @expression.compileNode(o)\n\n  astProperties: (o) ->\n    return\n      expression: astAsBlockIfNeeded @expression, o\n\nexports.JSXEmptyExpression = class JSXEmptyExpression extends Base\n\nexports.JSXText = class JSXText extends Base\n  constructor: (stringLiteral) ->\n    super()\n    @value = stringLiteral.unquotedValueForJSX\n    @locationData = stringLiteral.locationData\n\n  astProperties: ->\n    return {\n      @value\n      extra:\n        raw: @value\n    }\n\nexports.JSXAttribute = class JSXAttribute extends Base\n  constructor: ({@name, value}) ->\n    super()\n    @value =\n      if value?\n        value = value.base\n        if value instanceof StringLiteral and not value.shouldGenerateTemplateLiteral()\n          value\n        else\n          new JSXExpressionContainer value\n      else\n        null\n    @value?.comments = value.comments\n\n  children: ['name', 'value']\n\n  compileNode: (o) ->\n    compiledName = @name.compileToFragments o, LEVEL_LIST\n    return compiledName unless @value?\n    val = @value.compileToFragments o, LEVEL_LIST\n    compiledName.concat @makeCode('='), val\n\n  astProperties: (o) ->\n    name = @name\n    if ':' in name.value\n      name = new JSXNamespacedName name\n    return\n      name: name.ast o\n      value: @value?.ast(o) ? null\n\nexports.JSXAttributes = class JSXAttributes extends Base\n  constructor: (arr) ->\n    super()\n    @attributes = []\n    for object in arr.objects\n      @checkValidAttribute object\n      {base} = object\n      if base instanceof IdentifierLiteral\n        # attribute with no value eg disabled\n        attribute = new JSXAttribute name: new JSXIdentifier(base.value).withLocationDataAndCommentsFrom base\n        attribute.locationData = base.locationData\n        @attributes.push attribute\n      else if not base.generated\n        # object spread attribute eg {...props}\n        attribute = base.properties[0]\n        attribute.jsx = yes\n        attribute.locationData = base.locationData\n        @attributes.push attribute\n      else\n        # Obj containing attributes with values eg a=\"b\" c={d}\n        for property in base.properties\n          {variable, value} = property\n          attribute = new JSXAttribute {\n            name: new JSXIdentifier(variable.base.value).withLocationDataAndCommentsFrom variable.base\n            value\n          }\n          attribute.locationData = property.locationData\n          @attributes.push attribute\n    @locationData = arr.locationData\n\n  children: ['attributes']\n\n  # Catch invalid attributes: <div {a:\"b\", props} {props} \"value\" />\n  checkValidAttribute: (object) ->\n    {base: attribute} = object\n    properties = attribute?.properties or []\n    if not (attribute instanceof Obj or attribute instanceof IdentifierLiteral) or (attribute instanceof Obj and not attribute.generated and (properties.length > 1 or not (properties[0] instanceof Splat)))\n      object.error \"\"\"\n        Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.\n      \"\"\"\n\n  compileNode: (o) ->\n    fragments = []\n    for attribute in @attributes\n      fragments.push @makeCode ' '\n      fragments.push attribute.compileToFragments(o, LEVEL_TOP)...\n    fragments\n\n  astNode: (o) ->\n    attribute.ast(o) for attribute in @attributes\n\nexports.JSXNamespacedName = class JSXNamespacedName extends Base\n  constructor: (tag) ->\n    super()\n    [namespace, name] = tag.value.split ':'\n    @namespace = new JSXIdentifier(namespace).withLocationDataFrom locationData: extractSameLineLocationDataFirst(namespace.length) tag.locationData\n    @name      = new JSXIdentifier(name     ).withLocationDataFrom locationData: extractSameLineLocationDataLast(name.length      ) tag.locationData\n    @locationData = tag.locationData\n\n  children: ['namespace', 'name']\n\n  astProperties: (o) ->\n    return\n      namespace: @namespace.ast o\n      name: @name.ast o\n\n# Node for a JSX element\nexports.JSXElement = class JSXElement extends Base\n  constructor: ({@tagName, @attributes, @content}) ->\n    super()\n\n  children: ['tagName', 'attributes', 'content']\n\n  compileNode: (o) ->\n    @content?.base.jsx = yes\n    fragments = [@makeCode('<')]\n    fragments.push (tag = @tagName.compileToFragments(o, LEVEL_ACCESS))...\n    fragments.push @attributes.compileToFragments(o)...\n    if @content\n      fragments.push @makeCode('>')\n      fragments.push @content.compileNode(o, LEVEL_LIST)...\n      fragments.push [@makeCode('</'), tag..., @makeCode('>')]...\n    else\n      fragments.push @makeCode(' />')\n    fragments\n\n  isFragment: ->\n    !@tagName.base.value.length\n\n  astNode: (o) ->\n    # The location data spanning the opening element < ... > is captured by\n    # the generated Arr which contains the element's attributes\n    @openingElementLocationData = jisonLocationDataToAstLocationData @attributes.locationData\n\n    tagName = @tagName.base\n    tagName.locationData = tagName.tagNameLocationData\n    if @content?\n      @closingElementLocationData = mergeAstLocationData(\n        jisonLocationDataToAstLocationData tagName.closingTagOpeningBracketLocationData\n        jisonLocationDataToAstLocationData tagName.closingTagClosingBracketLocationData\n      )\n\n    super o\n\n  astType: ->\n    if @isFragment()\n      'JSXFragment'\n    else\n      'JSXElement'\n\n  elementAstProperties: (o) ->\n    tagNameAst = =>\n      tag = @tagName.unwrap()\n      if tag?.value and ':' in tag.value\n        tag = new JSXNamespacedName tag\n      tag.ast o\n\n    openingElement = Object.assign {\n      type: 'JSXOpeningElement'\n      name: tagNameAst()\n      selfClosing: not @closingElementLocationData?\n      attributes: @attributes.ast o\n    }, @openingElementLocationData\n\n    closingElement = null\n    if @closingElementLocationData?\n      closingElement = Object.assign {\n        type: 'JSXClosingElement'\n        name: Object.assign(\n          tagNameAst(),\n          jisonLocationDataToAstLocationData @tagName.base.closingTagNameLocationData\n        )\n      }, @closingElementLocationData\n      if closingElement.name.type in ['JSXMemberExpression', 'JSXNamespacedName']\n        rangeDiff = closingElement.range[0] - openingElement.range[0] + '/'.length\n        columnDiff = closingElement.loc.start.column - openingElement.loc.start.column + '/'.length\n        shiftAstLocationData = (node) =>\n          node.range = [\n            node.range[0] + rangeDiff\n            node.range[1] + rangeDiff\n          ]\n          node.start += rangeDiff\n          node.end += rangeDiff\n          node.loc.start =\n            line: @closingElementLocationData.loc.start.line\n            column: node.loc.start.column + columnDiff\n          node.loc.end =\n            line: @closingElementLocationData.loc.start.line\n            column: node.loc.end.column + columnDiff\n        if closingElement.name.type is 'JSXMemberExpression'\n          currentExpr = closingElement.name\n          while currentExpr.type is 'JSXMemberExpression'\n            shiftAstLocationData currentExpr unless currentExpr is closingElement.name\n            shiftAstLocationData currentExpr.property\n            currentExpr = currentExpr.object\n          shiftAstLocationData currentExpr\n        else # JSXNamespacedName\n          shiftAstLocationData closingElement.name.namespace\n          shiftAstLocationData closingElement.name.name\n\n    {openingElement, closingElement}\n\n  fragmentAstProperties: (o) ->\n    openingFragment = Object.assign {\n      type: 'JSXOpeningFragment'\n    }, @openingElementLocationData\n\n    closingFragment = Object.assign {\n      type: 'JSXClosingFragment'\n    }, @closingElementLocationData\n\n    {openingFragment, closingFragment}\n\n  contentAst: (o) ->\n    return [] unless @content and not @content.base.isEmpty?()\n\n    content = @content.unwrapAll()\n    children =\n      if content instanceof StringLiteral\n        [new JSXText content]\n      else # StringWithInterpolations\n        for element in @content.unwrapAll().extractElements o, includeInterpolationWrappers: yes, isJsx: yes\n          if element instanceof StringLiteral\n            new JSXText element\n          else # Interpolation\n            {expression} = element\n            unless expression?\n              emptyExpression = new JSXEmptyExpression()\n              emptyExpression.locationData = emptyExpressionLocationData {\n                interpolationNode: element\n                openingBrace: '{'\n                closingBrace: '}'\n              }\n\n              new JSXExpressionContainer emptyExpression, locationData: element.locationData\n            else\n              unwrapped = expression.unwrapAll()\n              if unwrapped instanceof JSXElement and\n                  # distinguish `<a><b /></a>` from `<a>{<b />}</a>`\n                  unwrapped.locationData.range[0] is element.locationData.range[0]\n                unwrapped\n              else\n                new JSXExpressionContainer unwrapped, locationData: element.locationData\n\n    child.ast(o) for child in children when not (child instanceof JSXText and child.value.length is 0)\n\n  astProperties: (o) ->\n    Object.assign(\n      if @isFragment()\n        @fragmentAstProperties o\n      else\n        @elementAstProperties o\n    ,\n      children: @contentAst o\n    )\n\n  astLocationData: ->\n    if @closingElementLocationData?\n      mergeAstLocationData @openingElementLocationData, @closingElementLocationData\n    else\n      @openingElementLocationData\n\n#### Call\n\n# Node for a function invocation.\nexports.Call = class Call extends Base\n  constructor: (@variable, @args = [], @soak, @token) ->\n    super()\n\n    @implicit = @args.implicit\n    @isNew = no\n    if @variable instanceof Value and @variable.isNotCallable()\n      @variable.error \"literal is not a function\"\n\n    if @variable.base instanceof JSXTag\n      return new JSXElement(\n        tagName: @variable\n        attributes: new JSXAttributes @args[0].base\n        content: @args[1]\n      )\n\n    # `@variable` never gets output as a result of this node getting created as\n    # part of `RegexWithInterpolations`, so for that case move any comments to\n    # the `args` property that gets passed into `RegexWithInterpolations` via\n    # the grammar.\n    if @variable.base?.value is 'RegExp' and @args.length isnt 0\n      moveComments @variable, @args[0]\n\n  children: ['variable', 'args']\n\n  # When setting the location, we sometimes need to update the start location to\n  # account for a newly-discovered `new` operator to the left of us. This\n  # expands the range on the left, but not the right.\n  updateLocationDataIfMissing: (locationData) ->\n    if @locationData and @needsUpdatedStartLocation\n      @locationData = Object.assign {},\n        @locationData,\n        first_line: locationData.first_line\n        first_column: locationData.first_column\n        range: [\n          locationData.range[0]\n          @locationData.range[1]\n        ]\n      base = @variable?.base or @variable\n      if base.needsUpdatedStartLocation\n        @variable.locationData = Object.assign {},\n          @variable.locationData,\n          first_line: locationData.first_line\n          first_column: locationData.first_column\n          range: [\n            locationData.range[0]\n            @variable.locationData.range[1]\n          ]\n        base.updateLocationDataIfMissing locationData\n      delete @needsUpdatedStartLocation\n    super locationData\n\n  # Tag this invocation as creating a new instance.\n  newInstance: ->\n    base = @variable?.base or @variable\n    if base instanceof Call and not base.isNew\n      base.newInstance()\n    else\n      @isNew = true\n    @needsUpdatedStartLocation = true\n    this\n\n  # Soaked chained invocations unfold into if/else ternary structures.\n  unfoldSoak: (o) ->\n    if @soak\n      if @variable instanceof Super\n        left = new Literal @variable.compile o\n        rite = new Value left\n        @variable.error \"Unsupported reference to 'super'\" unless @variable.accessor?\n      else\n        return ifn if ifn = unfoldSoak o, this, 'variable'\n        [left, rite] = new Value(@variable).cacheReference o\n      rite = new Call rite, @args\n      rite.isNew = @isNew\n      left = new Literal \"typeof #{ left.compile o } === \\\"function\\\"\"\n      return new If left, new Value(rite), soak: yes\n    call = this\n    list = []\n    loop\n      if call.variable instanceof Call\n        list.push call\n        call = call.variable\n        continue\n      break unless call.variable instanceof Value\n      list.push call\n      break unless (call = call.variable.base) instanceof Call\n    for call in list.reverse()\n      if ifn\n        if call.variable instanceof Call\n          call.variable = ifn\n        else\n          call.variable.base = ifn\n      ifn = unfoldSoak o, call, 'variable'\n    ifn\n\n  # Compile a vanilla function call.\n  compileNode: (o) ->\n    @checkForNewSuper()\n    @variable?.front = @front\n    compiledArgs = []\n    # If variable is `Accessor` fragments are cached and used later\n    # in `Value::compileNode` to ensure correct order of the compilation,\n    # and reuse of variables in the scope.\n    # Example:\n    # `a(x = 5).b(-> x = 6)` should compile in the same order as\n    # `a(x = 5); b(-> x = 6)`\n    # (see issue #4437, https://github.com/jashkenas/coffeescript/issues/4437)\n    varAccess = @variable?.properties?[0] instanceof Access\n    argCode = (arg for arg in (@args || []) when arg instanceof Code)\n    if argCode.length > 0 and varAccess and not @variable.base.cached\n      [cache] = @variable.base.cache o, LEVEL_ACCESS, -> no\n      @variable.base.cached = cache\n\n    for arg, argIndex in @args\n      if argIndex then compiledArgs.push @makeCode \", \"\n      compiledArgs.push (arg.compileToFragments o, LEVEL_LIST)...\n\n    fragments = []\n    if @isNew\n      fragments.push @makeCode 'new '\n    fragments.push @variable.compileToFragments(o, LEVEL_ACCESS)...\n    fragments.push @makeCode('('), compiledArgs..., @makeCode(')')\n    fragments\n\n  checkForNewSuper: ->\n    if @isNew\n      @variable.error \"Unsupported reference to 'super'\" if @variable instanceof Super\n\n  containsSoak: ->\n    return yes if @soak\n    return yes if @variable?.containsSoak?()\n    no\n\n  astNode: (o) ->\n    if @soak and @variable instanceof Super and o.scope.namedMethod()?.ctor\n      @variable.error \"Unsupported reference to 'super'\"\n    @checkForNewSuper()\n    super o\n\n  astType: ->\n    if @isNew\n      'NewExpression'\n    else if @containsSoak()\n      'OptionalCallExpression'\n    else\n      'CallExpression'\n\n  astProperties: (o) ->\n    return\n      callee: @variable.ast o, LEVEL_ACCESS\n      arguments: arg.ast(o, LEVEL_LIST) for arg in @args\n      optional: !!@soak\n      implicit: !!@implicit\n\n#### Super\n\n# Takes care of converting `super()` calls into calls against the prototype's\n# function of the same name.\n# When `expressions` are set the call will be compiled in such a way that the\n# expressions are evaluated without altering the return value of the `SuperCall`\n# expression.\nexports.SuperCall = class SuperCall extends Call\n  children: Call::children.concat ['expressions']\n\n  isStatement: (o) ->\n    @expressions?.length and o.level is LEVEL_TOP\n\n  compileNode: (o) ->\n    return super o unless @expressions?.length\n\n    superCall   = new Literal fragmentsToText super o\n    replacement = new Block @expressions.slice()\n\n    if o.level > LEVEL_TOP\n      # If we might be in an expression we need to cache and return the result\n      [superCall, ref] = superCall.cache o, null, YES\n      replacement.push ref\n\n    replacement.unshift superCall\n    replacement.compileToFragments o, if o.level is LEVEL_TOP then o.level else LEVEL_LIST\n\nexports.Super = class Super extends Base\n  constructor: (@accessor, @superLiteral) ->\n    super()\n\n  children: ['accessor']\n\n  compileNode: (o) ->\n    @checkInInstanceMethod o\n\n    method = o.scope.namedMethod()\n    unless method.ctor? or @accessor?\n      {name, variable} = method\n      if name.shouldCache() or (name instanceof Index and name.index.isAssignable())\n        nref = new IdentifierLiteral o.scope.parent.freeVariable 'name'\n        name.index = new Assign nref, name.index\n      @accessor = if nref? then new Index nref else name\n\n    if @accessor?.name?.comments\n      # A `super()` call gets compiled to e.g. `super.method()`, which means\n      # the `method` property name gets compiled for the first time here, and\n      # again when the `method:` property of the class gets compiled. Since\n      # this compilation happens first, comments attached to `method:` would\n      # get incorrectly output near `super.method()`, when we want them to\n      # get output on the second pass when `method:` is output. So set them\n      # aside during this compilation pass, and put them back on the object so\n      # that they’re there for the later compilation.\n      salvagedComments = @accessor.name.comments\n      delete @accessor.name.comments\n    fragments = (new Value (new Literal 'super'), if @accessor then [ @accessor ] else [])\n    .compileToFragments o\n    attachCommentsToNode salvagedComments, @accessor.name if salvagedComments\n    fragments\n\n  checkInInstanceMethod: (o) ->\n    method = o.scope.namedMethod()\n    @error 'cannot use super outside of an instance method' unless method?.isMethod\n\n  astNode: (o) ->\n    @checkInInstanceMethod o\n\n    if @accessor?\n      return (\n        new Value(\n          new Super().withLocationDataFrom (@superLiteral ? @)\n          [@accessor]\n        ).withLocationDataFrom @\n      ).ast o\n\n    super o\n\n#### RegexWithInterpolations\n\n# Regexes with interpolations are in fact just a variation of a `Call` (a\n# `RegExp()` call to be precise) with a `StringWithInterpolations` inside.\nexports.RegexWithInterpolations = class RegexWithInterpolations extends Base\n  constructor: (@call, {@heregexCommentTokens = []} = {}) ->\n    super()\n\n  children: ['call']\n\n  compileNode: (o) ->\n    @call.compileNode o\n\n  astType: -> 'InterpolatedRegExpLiteral'\n\n  astProperties: (o) ->\n    interpolatedPattern: @call.args[0].ast o\n    flags: @call.args[1]?.unwrap().originalValue ? ''\n    comments:\n      for heregexCommentToken in @heregexCommentTokens\n        if heregexCommentToken.here\n          new HereComment(heregexCommentToken).ast o\n        else\n          new LineComment(heregexCommentToken).ast o\n\n#### TaggedTemplateCall\n\nexports.TaggedTemplateCall = class TaggedTemplateCall extends Call\n  constructor: (variable, arg, soak) ->\n    arg = StringWithInterpolations.fromStringLiteral arg if arg instanceof StringLiteral\n    super variable, [ arg ], soak\n\n  compileNode: (o) ->\n    @variable.compileToFragments(o, LEVEL_ACCESS).concat @args[0].compileToFragments(o, LEVEL_LIST)\n\n  astType: -> 'TaggedTemplateExpression'\n\n  astProperties: (o) ->\n    return\n      tag: @variable.ast o, LEVEL_ACCESS\n      quasi: @args[0].ast o, LEVEL_LIST\n\n#### Extends\n\n# Node to extend an object's prototype with an ancestor object.\n# After `goog.inherits` from the\n# [Closure Library](https://github.com/google/closure-library/blob/master/closure/goog/base.js).\nexports.Extends = class Extends extends Base\n  constructor: (@child, @parent) ->\n    super()\n\n  children: ['child', 'parent']\n\n  # Hooks one constructor into another's prototype chain.\n  compileToFragments: (o) ->\n    new Call(new Value(new Literal utility 'extend', o), [@child, @parent]).compileToFragments o\n\n#### Access\n\n# A `.` access into a property of a value, or the `::` shorthand for\n# an access into the object's prototype.\nexports.Access = class Access extends Base\n  constructor: (@name, {@soak, @shorthand} = {}) ->\n    super()\n\n  children: ['name']\n\n  compileToFragments: (o) ->\n    name = @name.compileToFragments o\n    node = @name.unwrap()\n    if node instanceof PropertyName\n      [@makeCode('.'), name...]\n    else\n      [@makeCode('['), name..., @makeCode(']')]\n\n  shouldCache: NO\n\n  astNode: (o) ->\n    # Babel doesn’t have an AST node for `Access`, but rather just includes\n    # this Access node’s child `name` Identifier node as the `property` of\n    # the `MemberExpression` node.\n    @name.ast o\n\n#### Index\n\n# A `[ ... ]` indexed access into an array or object.\nexports.Index = class Index extends Base\n  constructor: (@index) ->\n    super()\n\n  children: ['index']\n\n  compileToFragments: (o) ->\n    [].concat @makeCode(\"[\"), @index.compileToFragments(o, LEVEL_PAREN), @makeCode(\"]\")\n\n  shouldCache: ->\n    @index.shouldCache()\n\n  astNode: (o) ->\n    # Babel doesn’t have an AST node for `Index`, but rather just includes\n    # this Index node’s child `index` Identifier node as the `property` of\n    # the `MemberExpression` node. The fact that the `MemberExpression`’s\n    # `property` is an Index means that `computed` is `true` for the\n    # `MemberExpression`.\n    @index.ast o\n\n#### Range\n\n# A range literal. Ranges can be used to extract portions (slices) of arrays,\n# to specify a range for comprehensions, or as a value, to be expanded into the\n# corresponding array of integers at runtime.\nexports.Range = class Range extends Base\n\n  children: ['from', 'to']\n\n  constructor: (@from, @to, tag) ->\n    super()\n\n    @exclusive = tag is 'exclusive'\n    @equals = if @exclusive then '' else '='\n\n  # Compiles the range's source variables -- where it starts and where it ends.\n  # But only if they need to be cached to avoid double evaluation.\n  compileVariables: (o) ->\n    o = merge o, top: true\n    shouldCache = del o, 'shouldCache'\n    [@fromC, @fromVar] = @cacheToCodeFragments @from.cache o, LEVEL_LIST, shouldCache\n    [@toC, @toVar]     = @cacheToCodeFragments @to.cache o, LEVEL_LIST, shouldCache\n    [@step, @stepVar]  = @cacheToCodeFragments step.cache o, LEVEL_LIST, shouldCache if step = del o, 'step'\n    @fromNum = if @from.isNumber() then parseNumber @fromVar else null\n    @toNum   = if @to.isNumber()   then parseNumber @toVar   else null\n    @stepNum = if step?.isNumber() then parseNumber @stepVar else null\n\n  # When compiled normally, the range returns the contents of the *for loop*\n  # needed to iterate over the values in the range. Used by comprehensions.\n  compileNode: (o) ->\n    @compileVariables o unless @fromVar\n    return @compileArray(o) unless o.index\n\n    # Set up endpoints.\n    known    = @fromNum? and @toNum?\n    idx      = del o, 'index'\n    idxName  = del o, 'name'\n    namedIndex = idxName and idxName isnt idx\n    varPart  =\n      if known and not namedIndex\n        \"var #{idx} = #{@fromC}\"\n      else\n        \"#{idx} = #{@fromC}\"\n    varPart += \", #{@toC}\" if @toC isnt @toVar\n    varPart += \", #{@step}\" if @step isnt @stepVar\n    [lt, gt] = [\"#{idx} <#{@equals}\", \"#{idx} >#{@equals}\"]\n\n    # Generate the condition.\n    [from, to] = [@fromNum, @toNum]\n    # Always check if the `step` isn't zero to avoid the infinite loop.\n    stepNotZero = \"#{ @stepNum ? @stepVar } !== 0\"\n    stepCond = \"#{ @stepNum ? @stepVar } > 0\"\n    lowerBound = \"#{lt} #{ if known then to else @toVar }\"\n    upperBound = \"#{gt} #{ if known then to else @toVar }\"\n    condPart =\n      if @step?\n        if @stepNum? and @stepNum isnt 0\n          if @stepNum > 0 then \"#{lowerBound}\" else \"#{upperBound}\"\n        else\n          \"#{stepNotZero} && (#{stepCond} ? #{lowerBound} : #{upperBound})\"\n      else\n        if known\n          \"#{ if from <= to then lt else gt } #{to}\"\n        else\n          \"(#{@fromVar} <= #{@toVar} ? #{lowerBound} : #{upperBound})\"\n\n    cond = if @stepVar then \"#{@stepVar} > 0\" else \"#{@fromVar} <= #{@toVar}\"\n\n    # Generate the step.\n    stepPart = if @stepVar\n      \"#{idx} += #{@stepVar}\"\n    else if known\n      if namedIndex\n        if from <= to then \"++#{idx}\" else \"--#{idx}\"\n      else\n        if from <= to then \"#{idx}++\" else \"#{idx}--\"\n    else\n      if namedIndex\n        \"#{cond} ? ++#{idx} : --#{idx}\"\n      else\n        \"#{cond} ? #{idx}++ : #{idx}--\"\n\n    varPart  = \"#{idxName} = #{varPart}\" if namedIndex\n    stepPart = \"#{idxName} = #{stepPart}\" if namedIndex\n\n    # The final loop body.\n    [@makeCode \"#{varPart}; #{condPart}; #{stepPart}\"]\n\n\n  # When used as a value, expand the range into the equivalent array.\n  compileArray: (o) ->\n    known = @fromNum? and @toNum?\n    if known and Math.abs(@fromNum - @toNum) <= 20\n      range = [@fromNum..@toNum]\n      range.pop() if @exclusive\n      return [@makeCode \"[#{ range.join(', ') }]\"]\n    idt    = @tab + TAB\n    i      = o.scope.freeVariable 'i', single: true, reserve: no\n    result = o.scope.freeVariable 'results', reserve: no\n    pre    = \"\\n#{idt}var #{result} = [];\"\n    if known\n      o.index = i\n      body    = fragmentsToText @compileNode o\n    else\n      vars    = \"#{i} = #{@fromC}\" + if @toC isnt @toVar then \", #{@toC}\" else ''\n      cond    = \"#{@fromVar} <= #{@toVar}\"\n      body    = \"var #{vars}; #{cond} ? #{i} <#{@equals} #{@toVar} : #{i} >#{@equals} #{@toVar}; #{cond} ? #{i}++ : #{i}--\"\n    post   = \"{ #{result}.push(#{i}); }\\n#{idt}return #{result};\\n#{o.indent}\"\n    hasArgs = (node) -> node?.contains isLiteralArguments\n    args   = ', arguments' if hasArgs(@from) or hasArgs(@to)\n    [@makeCode \"(function() {#{pre}\\n#{idt}for (#{body})#{post}}).apply(this#{args ? ''})\"]\n\n  astProperties: (o) ->\n    return {\n      from: @from?.ast(o) ? null\n      to: @to?.ast(o) ? null\n      @exclusive\n    }\n\n#### Slice\n\n# An array slice literal. Unlike JavaScript’s `Array#slice`, the second parameter\n# specifies the index of the end of the slice, just as the first parameter\n# is the index of the beginning.\nexports.Slice = class Slice extends Base\n\n  children: ['range']\n\n  constructor: (@range) ->\n    super()\n\n  # We have to be careful when trying to slice through the end of the array,\n  # `9e9` is used because not all implementations respect `undefined` or `1/0`.\n  # `9e9` should be safe because `9e9` > `2**32`, the max array length.\n  compileNode: (o) ->\n    {to, from} = @range\n    # Handle an expression in the property access, e.g. `a[!b in c..]`.\n    if from?.shouldCache()\n      from = new Value new Parens from\n    if to?.shouldCache()\n      to = new Value new Parens to\n    fromCompiled = from?.compileToFragments(o, LEVEL_PAREN) or [@makeCode '0']\n    if to\n      compiled     = to.compileToFragments o, LEVEL_PAREN\n      compiledText = fragmentsToText compiled\n      if not (not @range.exclusive and +compiledText is -1)\n        toStr = ', ' + if @range.exclusive\n          compiledText\n        else if to.isNumber()\n          \"#{+compiledText + 1}\"\n        else\n          compiled = to.compileToFragments o, LEVEL_ACCESS\n          \"+#{fragmentsToText compiled} + 1 || 9e9\"\n    [@makeCode \".slice(#{ fragmentsToText fromCompiled }#{ toStr or '' })\"]\n\n  astNode: (o) ->\n    @range.ast o\n\n#### Obj\n\n# An object literal, nothing fancy.\nexports.Obj = class Obj extends Base\n  constructor: (props, @generated = no) ->\n    super()\n\n    @objects = @properties = props or []\n\n  children: ['properties']\n\n  isAssignable: (opts) ->\n    for prop in @properties\n      # Check for reserved words.\n      message = isUnassignable prop.unwrapAll().value\n      prop.error message if message\n\n      prop = prop.value if prop instanceof Assign and\n        prop.context is 'object' and\n        prop.value?.base not instanceof Arr\n      return no unless prop.isAssignable opts\n    yes\n\n  shouldCache: ->\n    not @isAssignable()\n\n  # Check if object contains splat.\n  hasSplat: ->\n    return yes for prop in @properties when prop instanceof Splat\n    no\n\n  # Move rest property to the end of the list.\n  # `{a, rest..., b} = obj` -> `{a, b, rest...} = obj`\n  # `foo = ({a, rest..., b}) ->` -> `foo = {a, b, rest...}) ->`\n  reorderProperties: ->\n    props = @properties\n    splatProps = @getAndCheckSplatProps()\n    splatProp = props.splice splatProps[0], 1\n    @objects = @properties = [].concat props, splatProp\n\n  compileNode: (o) ->\n    @reorderProperties() if @hasSplat() and @lhs\n    props = @properties\n    if @generated\n      for node in props when node instanceof Value\n        node.error 'cannot have an implicit value in an implicit object'\n\n    idt      = o.indent += TAB\n    lastNode = @lastNode @properties\n\n    # If this object is the left-hand side of an assignment, all its children\n    # are too.\n    @propagateLhs()\n\n    isCompact = yes\n    for prop in @properties\n      if prop instanceof Assign and prop.context is 'object'\n        isCompact = no\n\n    answer = []\n    answer.push @makeCode if isCompact then '' else '\\n'\n    for prop, i in props\n      join = if i is props.length - 1\n        ''\n      else if isCompact\n        ', '\n      else if prop is lastNode\n        '\\n'\n      else\n        ',\\n'\n      indent = if isCompact then '' else idt\n\n      key = if prop instanceof Assign and prop.context is 'object'\n        prop.variable\n      else if prop instanceof Assign\n        prop.operatorToken.error \"unexpected #{prop.operatorToken.value}\" unless @lhs\n        prop.variable\n      else\n        prop\n      if key instanceof Value and key.hasProperties()\n        key.error 'invalid object key' if prop.context is 'object' or not key.this\n        key  = key.properties[0].name\n        prop = new Assign key, prop, 'object'\n      if key is prop\n        if prop.shouldCache()\n          [key, value] = prop.base.cache o\n          key  = new PropertyName key.value if key instanceof IdentifierLiteral\n          prop = new Assign key, value, 'object'\n        else if key instanceof Value and key.base instanceof ComputedPropertyName\n          # `{ [foo()] }` output as `{ [ref = foo()]: ref }`.\n          if prop.base.value.shouldCache()\n            [key, value] = prop.base.value.cache o\n            key  = new ComputedPropertyName key.value if key instanceof IdentifierLiteral\n            prop = new Assign key, value, 'object'\n          else\n            # `{ [expression] }` output as `{ [expression]: expression }`.\n            prop = new Assign key, prop.base.value, 'object'\n        else if not prop.bareLiteral?(IdentifierLiteral) and prop not instanceof Splat\n          prop = new Assign prop, prop, 'object'\n      if indent then answer.push @makeCode indent\n      answer.push prop.compileToFragments(o, LEVEL_TOP)...\n      if join then answer.push @makeCode join\n    answer.push @makeCode if isCompact then '' else \"\\n#{@tab}\"\n    answer = @wrapInBraces answer\n    if @front then @wrapInParentheses answer else answer\n\n  getAndCheckSplatProps: ->\n    return unless @hasSplat() and @lhs\n    props = @properties\n    splatProps = (i for prop, i in props when prop instanceof Splat)\n    props[splatProps[1]].error \"multiple spread elements are disallowed\" if splatProps?.length > 1\n    splatProps\n\n  assigns: (name) ->\n    for prop in @properties when prop.assigns name then return yes\n    no\n\n  eachName: (iterator) ->\n    for prop in @properties\n      prop = prop.value if prop instanceof Assign and prop.context is 'object'\n      prop = prop.unwrapAll()\n      prop.eachName iterator if prop.eachName?\n\n  # Convert “bare” properties to `ObjectProperty`s (or `Splat`s).\n  expandProperty: (property) ->\n    {variable, context, operatorToken} = property\n    key = if property instanceof Assign and context is 'object'\n      variable\n    else if property instanceof Assign\n      operatorToken.error \"unexpected #{operatorToken.value}\" unless @lhs\n      variable\n    else\n      property\n    if key instanceof Value and key.hasProperties()\n      key.error 'invalid object key' unless context isnt 'object' and key.this\n      if property instanceof Assign\n        return new ObjectProperty fromAssign: property\n      else\n        return new ObjectProperty key: property\n    return new ObjectProperty(fromAssign: property) unless key is property\n    return property if property instanceof Splat\n\n    new ObjectProperty key: property\n\n  expandProperties: ->\n    @expandProperty(property) for property in @properties\n\n  propagateLhs: (setLhs) ->\n    @lhs = yes if setLhs\n    return unless @lhs\n\n    for property in @properties\n      if property instanceof Assign and property.context is 'object'\n        {value} = property\n        unwrappedValue = value.unwrapAll()\n        if unwrappedValue instanceof Arr or unwrappedValue instanceof Obj\n          unwrappedValue.propagateLhs yes\n        else if unwrappedValue instanceof Assign\n          unwrappedValue.nestedLhs = yes\n      else if property instanceof Assign\n        # Shorthand property with default, e.g. `{a = 1} = b`.\n        property.nestedLhs = yes\n      else if property instanceof Splat\n        property.propagateLhs yes\n\n  astNode: (o) ->\n    @getAndCheckSplatProps()\n    super o\n\n  astType: ->\n    if @lhs\n      'ObjectPattern'\n    else\n      'ObjectExpression'\n\n  astProperties: (o) ->\n    return\n      implicit: !!@generated\n      properties:\n        property.ast(o) for property in @expandProperties()\n\nexports.ObjectProperty = class ObjectProperty extends Base\n  constructor: ({key, fromAssign}) ->\n    super()\n    if fromAssign\n      {variable: @key, value, context} = fromAssign\n      if context is 'object'\n        # All non-shorthand properties (i.e. includes `:`).\n        @value = value\n      else\n        # Left-hand-side shorthand with default e.g. `{a = 1} = b`.\n        @value = fromAssign\n        @shorthand = yes\n      @locationData = fromAssign.locationData\n    else\n      # Shorthand without default e.g. `{a}` or `{@a}` or `{[a]}`.\n      @key = key\n      @shorthand = yes\n      @locationData = key.locationData\n\n  astProperties: (o) ->\n    isComputedPropertyName = (@key instanceof Value and @key.base instanceof ComputedPropertyName) or @key.unwrap() instanceof StringWithInterpolations\n    keyAst = @key.ast o, LEVEL_LIST\n\n    return\n      key:\n        if keyAst?.declaration\n          Object.assign {}, keyAst, declaration: no\n        else\n          keyAst\n      value: @value?.ast(o, LEVEL_LIST) ? keyAst\n      shorthand: !!@shorthand\n      computed: !!isComputedPropertyName\n      method: no\n\n#### Arr\n\n# An array literal.\nexports.Arr = class Arr extends Base\n  constructor: (objs, @lhs = no) ->\n    super()\n    @objects = objs or []\n    @propagateLhs()\n\n  children: ['objects']\n\n  hasElision: ->\n    return yes for obj in @objects when obj instanceof Elision\n    no\n\n  isAssignable: (opts) ->\n    {allowExpansion, allowNontrailingSplat, allowEmptyArray = no} = opts ? {}\n    return allowEmptyArray unless @objects.length\n\n    for obj, i in @objects\n      return no if not allowNontrailingSplat and obj instanceof Splat and i + 1 isnt @objects.length\n      return no unless (allowExpansion and obj instanceof Expansion) or (obj.isAssignable(opts) and (not obj.isAtomic or obj.isAtomic()))\n    yes\n\n  shouldCache: ->\n    not @isAssignable()\n\n  compileNode: (o) ->\n    return [@makeCode '[]'] unless @objects.length\n    o.indent += TAB\n    fragmentIsElision = ([ fragment ]) ->\n      fragment.type is 'Elision' and fragment.code.trim() is ','\n    # Detect if `Elision`s at the beginning of the array are processed (e.g. [, , , a]).\n    passedElision = no\n\n    answer = []\n    for obj, objIndex in @objects\n      unwrappedObj = obj.unwrapAll()\n      # Let `compileCommentFragments` know to intersperse block comments\n      # into the fragments created when compiling this array.\n      if unwrappedObj.comments and\n         unwrappedObj.comments.filter((comment) -> not comment.here).length is 0\n        unwrappedObj.includeCommentFragments = YES\n\n    compiledObjs = (obj.compileToFragments o, LEVEL_LIST for obj in @objects)\n    olen = compiledObjs.length\n    # If `compiledObjs` includes newlines, we will output this as a multiline\n    # array (i.e. with a newline and indentation after the `[`). If an element\n    # contains line comments, that should also trigger multiline output since\n    # by definition line comments will introduce newlines into our output.\n    # The exception is if only the first element has line comments; in that\n    # case, output as the compact form if we otherwise would have, so that the\n    # first element’s line comments get output before or after the array.\n    includesLineCommentsOnNonFirstElement = no\n    for fragments, index in compiledObjs\n      for fragment in fragments\n        if fragment.isHereComment\n          fragment.code = fragment.code.trim()\n        else if index isnt 0 and includesLineCommentsOnNonFirstElement is no and hasLineComments fragment\n          includesLineCommentsOnNonFirstElement = yes\n      # Add ', ' if all `Elisions` from the beginning of the array are processed (e.g. [, , , a]) and\n      # element isn't `Elision` or last element is `Elision` (e.g. [a,,b,,])\n      if index isnt 0 and passedElision and (not fragmentIsElision(fragments) or index is olen - 1)\n        answer.push @makeCode ', '\n      passedElision = passedElision or not fragmentIsElision fragments\n      answer.push fragments...\n    if includesLineCommentsOnNonFirstElement or '\\n' in fragmentsToText(answer)\n      for fragment, fragmentIndex in answer\n        if fragment.isHereComment\n          fragment.code = \"#{multident(fragment.code, o.indent, no)}\\n#{o.indent}\"\n        else if fragment.code is ', ' and not fragment?.isElision and fragment.type not in ['StringLiteral', 'StringWithInterpolations']\n          fragment.code = \",\\n#{o.indent}\"\n      answer.unshift @makeCode \"[\\n#{o.indent}\"\n      answer.push @makeCode \"\\n#{@tab}]\"\n    else\n      for fragment in answer when fragment.isHereComment\n        fragment.code = \"#{fragment.code} \"\n      answer.unshift @makeCode '['\n      answer.push @makeCode ']'\n    answer\n\n  assigns: (name) ->\n    for obj in @objects when obj.assigns name then return yes\n    no\n\n  eachName: (iterator) ->\n    for obj in @objects\n      obj = obj.unwrapAll()\n      obj.eachName iterator\n\n  # If this array is the left-hand side of an assignment, all its children\n  # are too.\n  propagateLhs: (setLhs) ->\n    @lhs = yes if setLhs\n    return unless @lhs\n    for object in @objects\n      object.lhs = yes if object instanceof Splat or object instanceof Expansion\n      unwrappedObject = object.unwrapAll()\n      if unwrappedObject instanceof Arr or unwrappedObject instanceof Obj\n        unwrappedObject.propagateLhs yes\n      else if unwrappedObject instanceof Assign\n        unwrappedObject.nestedLhs = yes\n\n  astType: ->\n    if @lhs\n      'ArrayPattern'\n    else\n      'ArrayExpression'\n\n  astProperties: (o) ->\n    return\n      elements:\n        object.ast(o, LEVEL_LIST) for object in @objects\n\n#### Class\n\n# The CoffeeScript class definition.\n# Initialize a **Class** with its name, an optional superclass, and a body.\n\nexports.Class = class Class extends Base\n  children: ['variable', 'parent', 'body']\n\n  constructor: (@variable, @parent, @body) ->\n    super()\n    unless @body?\n      @body = new Block\n      @hasGeneratedBody = yes\n\n  compileNode: (o) ->\n    @name          = @determineName()\n    executableBody = @walkBody o\n\n    # Special handling to allow `class expr.A extends A` declarations\n    parentName    = @parent.base.value if @parent instanceof Value and not @parent.hasProperties()\n    @hasNameClash = @name? and @name is parentName\n\n    node = @\n\n    if executableBody or @hasNameClash\n      node = new ExecutableClassBody node, executableBody\n    else if not @name? and o.level is LEVEL_TOP\n      # Anonymous classes are only valid in expressions\n      node = new Parens node\n\n    if @boundMethods.length and @parent\n      @variable ?= new IdentifierLiteral o.scope.freeVariable '_class'\n      [@variable, @variableRef] = @variable.cache o unless @variableRef?\n\n    if @variable\n      node = new Assign @variable, node, null, { @moduleDeclaration }\n\n    @compileNode = @compileClassDeclaration\n    try\n      return node.compileToFragments o\n    finally\n      delete @compileNode\n\n  compileClassDeclaration: (o) ->\n    @ctor ?= @makeDefaultConstructor() if @externalCtor or @boundMethods.length\n    @ctor?.noReturn = true\n\n    @proxyBoundMethods() if @boundMethods.length\n\n    o.indent += TAB\n\n    result = []\n    result.push @makeCode \"class \"\n    result.push @makeCode @name if @name\n    @compileCommentFragments o, @variable, result if @variable?.comments?\n    result.push @makeCode ' ' if @name\n    result.push @makeCode('extends '), @parent.compileToFragments(o)..., @makeCode ' ' if @parent\n\n    result.push @makeCode '{'\n    unless @body.isEmpty()\n      @body.spaced = true\n      result.push @makeCode '\\n'\n      result.push @body.compileToFragments(o, LEVEL_TOP)...\n      result.push @makeCode \"\\n#{@tab}\"\n    result.push @makeCode '}'\n\n    result\n\n  # Figure out the appropriate name for this class\n  determineName: ->\n    return null unless @variable\n    [..., tail] = @variable.properties\n    node = if tail\n      tail instanceof Access and tail.name\n    else\n      @variable.base\n    unless node instanceof IdentifierLiteral or node instanceof PropertyName\n      return null\n    name = node.value\n    unless tail\n      message = isUnassignable name\n      @variable.error message if message\n    if name in JS_FORBIDDEN then \"_#{name}\" else name\n\n  walkBody: (o) ->\n    @ctor          = null\n    @boundMethods  = []\n    executableBody = null\n\n    initializer     = []\n    { expressions } = @body\n\n    i = 0\n    for expression in expressions.slice()\n      if expression instanceof Value and expression.isObject true\n        { properties } = expression.base\n        exprs     = []\n        end       = 0\n        start     = 0\n        pushSlice = -> exprs.push new Value new Obj properties[start...end], true if end > start\n\n        while assign = properties[end]\n          if initializerExpression = @addInitializerExpression assign, o\n            pushSlice()\n            exprs.push initializerExpression\n            initializer.push initializerExpression\n            start = end + 1\n          end++\n        pushSlice()\n\n        expressions[i..i] = exprs\n        i += exprs.length\n      else\n        if initializerExpression = @addInitializerExpression expression, o\n          initializer.push initializerExpression\n          expressions[i] = initializerExpression\n        i += 1\n\n    for method in initializer when method instanceof Code\n      if method.ctor\n        method.error 'Cannot define more than one constructor in a class' if @ctor\n        @ctor = method\n      else if method.isStatic and method.bound\n        method.context = @name\n      else if method.bound\n        @boundMethods.push method\n\n    return unless o.compiling\n    if initializer.length isnt expressions.length\n      @body.expressions = (expression.hoist() for expression in initializer)\n      new Block expressions\n\n  # Add an expression to the class initializer\n  #\n  # This is the key method for determining whether an expression in a class\n  # body should appear in the initializer or the executable body. If the given\n  # `node` is valid in a class body the method will return a (new, modified,\n  # or identical) node for inclusion in the class initializer, otherwise\n  # nothing will be returned and the node will appear in the executable body.\n  #\n  # At time of writing, only methods (instance and static) are valid in ES\n  # class initializers. As new ES class features (such as class fields) reach\n  # Stage 4, this method will need to be updated to support them. We\n  # additionally allow `PassthroughLiteral`s (backticked expressions) in the\n  # initializer as an escape hatch for ES features that are not implemented\n  # (e.g. getters and setters defined via the `get` and `set` keywords as\n  # opposed to the `Object.defineProperty` method).\n  addInitializerExpression: (node, o) ->\n    if node.unwrapAll() instanceof PassthroughLiteral\n      node\n    else if @validInitializerMethod node\n      @addInitializerMethod node\n    else if not o.compiling and @validClassProperty node\n      @addClassProperty node\n    else if not o.compiling and @validClassPrototypeProperty node\n      @addClassPrototypeProperty node\n    else\n      null\n\n  # Checks if the given node is a valid ES class initializer method.\n  validInitializerMethod: (node) ->\n    return no unless node instanceof Assign and node.value instanceof Code\n    return yes if node.context is 'object' and not node.variable.hasProperties()\n    return node.variable.looksStatic(@name) and (@name or not node.value.bound)\n\n  # Returns a configured class initializer method\n  addInitializerMethod: (assign) ->\n    { variable, value: method, operatorToken } = assign\n    method.isMethod = yes\n    method.isStatic = variable.looksStatic @name\n\n    if method.isStatic\n      method.name = variable.properties[0]\n    else\n      methodName  = variable.base\n      method.name = new (if methodName.shouldCache() then Index else Access) methodName\n      method.name.updateLocationDataIfMissing methodName.locationData\n      isConstructor =\n        if methodName instanceof StringLiteral\n          methodName.originalValue is 'constructor'\n        else\n          methodName.value is 'constructor'\n      method.ctor = (if @parent then 'derived' else 'base') if isConstructor\n      method.error 'Cannot define a constructor as a bound (fat arrow) function' if method.bound and method.ctor\n\n    method.operatorToken = operatorToken\n    method\n\n  validClassProperty: (node) ->\n    return no unless node instanceof Assign\n    return node.variable.looksStatic @name\n\n  addClassProperty: (assign) ->\n    {variable, value, operatorToken} = assign\n    {staticClassName} = variable.looksStatic @name\n    new ClassProperty({\n      name: variable.properties[0]\n      isStatic: yes\n      staticClassName\n      value\n      operatorToken\n    }).withLocationDataFrom assign\n\n  validClassPrototypeProperty: (node) ->\n    return no unless node instanceof Assign\n    node.context is 'object' and not node.variable.hasProperties()\n\n  addClassPrototypeProperty: (assign) ->\n    {variable, value} = assign\n    new ClassPrototypeProperty({\n      name: variable.base\n      value\n    }).withLocationDataFrom assign\n\n  makeDefaultConstructor: ->\n    ctor = @addInitializerMethod new Assign (new Value new PropertyName 'constructor'), new Code\n    @body.unshift ctor\n\n    if @parent\n      ctor.body.push new SuperCall new Super, [new Splat new IdentifierLiteral 'arguments']\n\n    if @externalCtor\n      applyCtor = new Value @externalCtor, [ new Access new PropertyName 'apply' ]\n      applyArgs = [ new ThisLiteral, new IdentifierLiteral 'arguments' ]\n      ctor.body.push new Call applyCtor, applyArgs\n      ctor.body.makeReturn()\n\n    ctor\n\n  proxyBoundMethods: ->\n    @ctor.thisAssignments = for method in @boundMethods\n      method.classVariable = @variableRef if @parent\n\n      name = new Value(new ThisLiteral, [ method.name ])\n      new Assign name, new Call(new Value(name, [new Access new PropertyName 'bind']), [new ThisLiteral])\n\n    null\n\n  declareName: (o) ->\n    return unless (name = @variable?.unwrap()) instanceof IdentifierLiteral\n    alreadyDeclared = o.scope.find name.value\n    name.isDeclaration = not alreadyDeclared\n\n  isStatementAst: -> yes\n\n  astNode: (o) ->\n    if jumpNode = @body.jumps()\n      jumpNode.error 'Class bodies cannot contain pure statements'\n    if argumentsNode = @body.contains isLiteralArguments\n      argumentsNode.error \"Class bodies shouldn't reference arguments\"\n    @declareName o\n    @name = @determineName()\n    @body.isClassBody = yes\n    @body.locationData = zeroWidthLocationDataFromEndLocation @locationData if @hasGeneratedBody\n    @walkBody o\n    sniffDirectives @body.expressions\n    @ctor?.noReturn = yes\n\n    super o\n\n  astType: (o) ->\n    if o.level is LEVEL_TOP\n      'ClassDeclaration'\n    else\n      'ClassExpression'\n\n  astProperties: (o) ->\n    return\n      id: @variable?.ast(o) ? null\n      superClass: @parent?.ast(o, LEVEL_PAREN) ? null\n      body: @body.ast o, LEVEL_TOP\n\nexports.ExecutableClassBody = class ExecutableClassBody extends Base\n  children: [ 'class', 'body' ]\n\n  defaultClassVariableName: '_Class'\n\n  constructor: (@class, @body = new Block) ->\n    super()\n\n  compileNode: (o) ->\n    if jumpNode = @body.jumps()\n      jumpNode.error 'Class bodies cannot contain pure statements'\n    if argumentsNode = @body.contains isLiteralArguments\n      argumentsNode.error \"Class bodies shouldn't reference arguments\"\n\n    params  = []\n    args    = [new ThisLiteral]\n    wrapper = new Code params, @body\n    klass   = new Parens new Call (new Value wrapper, [new Access new PropertyName 'call']), args\n\n    @body.spaced = true\n\n    o.classScope = wrapper.makeScope o.scope\n\n    @name      = @class.name ? o.classScope.freeVariable @defaultClassVariableName\n    ident      = new IdentifierLiteral @name\n    directives = @walkBody()\n    @setContext()\n\n    if @class.hasNameClash\n      parent = new IdentifierLiteral o.classScope.freeVariable 'superClass'\n      wrapper.params.push new Param parent\n      args.push @class.parent\n      @class.parent = parent\n\n    if @externalCtor\n      externalCtor = new IdentifierLiteral o.classScope.freeVariable 'ctor', reserve: no\n      @class.externalCtor = externalCtor\n      @externalCtor.variable.base = externalCtor\n\n    if @name isnt @class.name\n      @body.expressions.unshift new Assign (new IdentifierLiteral @name), @class\n    else\n      @body.expressions.unshift @class\n    @body.expressions.unshift directives...\n    @body.push ident\n\n    klass.compileToFragments o\n\n  # Traverse the class's children and:\n  # - Hoist valid ES properties into `@properties`\n  # - Hoist static assignments into `@properties`\n  # - Convert invalid ES properties into class or prototype assignments\n  walkBody: ->\n    directives  = []\n\n    index = 0\n    while expr = @body.expressions[index]\n      break unless expr instanceof Value and expr.isString()\n      if expr.hoisted\n        index++\n      else\n        directives.push @body.expressions.splice(index, 1)...\n\n    @traverseChildren false, (child) =>\n      return false if child instanceof Class or child instanceof HoistTarget\n\n      cont = true\n      if child instanceof Block\n        for node, i in child.expressions\n          if node instanceof Value and node.isObject(true)\n            cont = false\n            child.expressions[i] = @addProperties node.base.properties\n          else if node instanceof Assign and node.variable.looksStatic @name\n            node.value.isStatic = yes\n        child.expressions = flatten child.expressions\n      cont\n\n    directives\n\n  setContext: ->\n    @body.traverseChildren false, (node) =>\n      if node instanceof ThisLiteral\n        node.value   = @name\n      else if node instanceof Code and node.bound and (node.isStatic or not node.name)\n        node.context = @name\n\n  # Make class/prototype assignments for invalid ES properties\n  addProperties: (assigns) ->\n    result = for assign in assigns\n      variable = assign.variable\n      base     = variable?.base\n      value    = assign.value\n      delete assign.context\n\n      if base.value is 'constructor'\n        if value instanceof Code\n          base.error 'constructors must be defined at the top level of a class body'\n\n        # The class scope is not available yet, so return the assignment to update later\n        assign = @externalCtor = new Assign new Value, value\n      else if not assign.variable.this\n        name =\n          if base instanceof ComputedPropertyName\n            new Index base.value\n          else\n            new (if base.shouldCache() then Index else Access) base\n        prototype = new Access new PropertyName 'prototype'\n        variable  = new Value new ThisLiteral(), [ prototype, name ]\n\n        assign.variable = variable\n      else if assign.value instanceof Code\n        assign.value.isStatic = true\n\n      assign\n    compact result\n\nexports.ClassProperty = class ClassProperty extends Base\n  constructor: ({@name, @isStatic, @staticClassName, @value, @operatorToken}) ->\n    super()\n\n  children: ['name', 'value', 'staticClassName']\n\n  isStatement: YES\n\n  astProperties: (o) ->\n    return\n      key: @name.ast o, LEVEL_LIST\n      value: @value.ast o, LEVEL_LIST\n      static: !!@isStatic\n      computed: @name instanceof Index or @name instanceof ComputedPropertyName\n      operator: @operatorToken?.value ? '='\n      staticClassName: @staticClassName?.ast(o) ? null\n\nexports.ClassPrototypeProperty = class ClassPrototypeProperty extends Base\n  constructor: ({@name, @value}) ->\n    super()\n\n  children: ['name', 'value']\n\n  isStatement: YES\n\n  astProperties: (o) ->\n    return\n      key: @name.ast o, LEVEL_LIST\n      value: @value.ast o, LEVEL_LIST\n      computed: @name instanceof ComputedPropertyName or @name instanceof StringWithInterpolations\n\n#### Import and Export\n\nexports.ModuleDeclaration = class ModuleDeclaration extends Base\n  constructor: (@clause, @source, @assertions) ->\n    super()\n    @checkSource()\n\n  children: ['clause', 'source', 'assertions']\n\n  isStatement: YES\n  jumps:       THIS\n  makeReturn:  THIS\n\n  checkSource: ->\n    if @source? and @source instanceof StringWithInterpolations\n      @source.error 'the name of the module to be imported from must be an uninterpolated string'\n\n  checkScope: (o, moduleDeclarationType) ->\n    # TODO: would be appropriate to flag this error during AST generation (as\n    # well as when compiling to JS). But `o.indent` isn’t tracked during AST\n    # generation, and there doesn’t seem to be a current alternative way to track\n    # whether we’re at the “program top-level”.\n    if o.indent.length isnt 0\n      @error \"#{moduleDeclarationType} statements must be at top-level scope\"\n\n  astAssertions: (o) ->\n    if @assertions?.properties?\n      @assertions.properties.map (assertion) =>\n        { start, end, loc, left, right } = assertion.ast(o)\n        { type: 'ImportAttribute', start, end, loc, key: left, value: right }\n    else\n      []\n\nexports.ImportDeclaration = class ImportDeclaration extends ModuleDeclaration\n  compileNode: (o) ->\n    @checkScope o, 'import'\n    o.importedSymbols = []\n\n    code = []\n    code.push @makeCode \"#{@tab}import \"\n    code.push @clause.compileNode(o)... if @clause?\n\n    if @source?.value?\n      code.push @makeCode ' from ' unless @clause is null\n      code.push @makeCode @source.value\n      if @assertions?\n        code.push @makeCode ' assert '\n        code.push @assertions.compileToFragments(o)...\n\n    code.push @makeCode ';'\n    code\n\n  astNode: (o) ->\n    o.importedSymbols = []\n    super o\n\n  astProperties: (o) ->\n    ret =\n      specifiers: @clause?.ast(o) ? []\n      source: @source.ast o\n      assertions: @astAssertions(o)\n    ret.importKind = 'value' if @clause\n    ret\n\nexports.ImportClause = class ImportClause extends Base\n  constructor: (@defaultBinding, @namedImports) ->\n    super()\n\n  children: ['defaultBinding', 'namedImports']\n\n  compileNode: (o) ->\n    code = []\n\n    if @defaultBinding?\n      code.push @defaultBinding.compileNode(o)...\n      code.push @makeCode ', ' if @namedImports?\n\n    if @namedImports?\n      code.push @namedImports.compileNode(o)...\n\n    code\n\n  astNode: (o) ->\n    # The AST for `ImportClause` is the non-nested list of import specifiers\n    # that will be the `specifiers` property of an `ImportDeclaration` AST\n    compact flatten [\n      @defaultBinding?.ast o\n      @namedImports?.ast o\n    ]\n\nexports.ExportDeclaration = class ExportDeclaration extends ModuleDeclaration\n  compileNode: (o) ->\n    @checkScope o, 'export'\n    @checkForAnonymousClassExport()\n\n    code = []\n    code.push @makeCode \"#{@tab}export \"\n    code.push @makeCode 'default ' if @ instanceof ExportDefaultDeclaration\n\n    if @ not instanceof ExportDefaultDeclaration and\n       (@clause instanceof Assign or @clause instanceof Class)\n      code.push @makeCode 'var '\n      @clause.moduleDeclaration = 'export'\n\n    if @clause.body? and @clause.body instanceof Block\n      code = code.concat @clause.compileToFragments o, LEVEL_TOP\n    else\n      code = code.concat @clause.compileNode o\n\n    if @source?.value?\n      code.push @makeCode \" from #{@source.value}\"\n      if @assertions?\n        code.push @makeCode ' assert '\n        code.push @assertions.compileToFragments(o)...\n\n    code.push @makeCode ';'\n    code\n\n  # Prevent exporting an anonymous class; all exported members must be named\n  checkForAnonymousClassExport: ->\n    if @ not instanceof ExportDefaultDeclaration and @clause instanceof Class and not @clause.variable\n      @clause.error 'anonymous classes cannot be exported'\n\n  astNode: (o) ->\n    @checkForAnonymousClassExport()\n    super o\n\nexports.ExportNamedDeclaration = class ExportNamedDeclaration extends ExportDeclaration\n  astProperties: (o) ->\n    ret =\n      source: @source?.ast(o) ? null\n      assertions: @astAssertions(o)\n      exportKind: 'value'\n    clauseAst = @clause.ast o\n    if @clause instanceof ExportSpecifierList\n      ret.specifiers = clauseAst\n      ret.declaration = null\n    else\n      ret.specifiers = []\n      ret.declaration = clauseAst\n    ret\n\nexports.ExportDefaultDeclaration = class ExportDefaultDeclaration extends ExportDeclaration\n  astProperties: (o) ->\n    return\n      declaration: @clause.ast o\n      assertions: @astAssertions(o)\n\nexports.ExportAllDeclaration = class ExportAllDeclaration extends ExportDeclaration\n  astProperties: (o) ->\n    return\n      source: @source.ast o\n      assertions: @astAssertions(o)\n      exportKind: 'value'\n\nexports.ModuleSpecifierList = class ModuleSpecifierList extends Base\n  constructor: (@specifiers) ->\n    super()\n\n  children: ['specifiers']\n\n  compileNode: (o) ->\n    code = []\n    o.indent += TAB\n    compiledList = (specifier.compileToFragments o, LEVEL_LIST for specifier in @specifiers)\n\n    if @specifiers.length isnt 0\n      code.push @makeCode \"{\\n#{o.indent}\"\n      for fragments, index in compiledList\n        code.push @makeCode(\",\\n#{o.indent}\") if index\n        code.push fragments...\n      code.push @makeCode \"\\n}\"\n    else\n      code.push @makeCode '{}'\n    code\n\n  astNode: (o) ->\n    specifier.ast(o) for specifier in @specifiers\n\nexports.ImportSpecifierList = class ImportSpecifierList extends ModuleSpecifierList\n\nexports.ExportSpecifierList = class ExportSpecifierList extends ModuleSpecifierList\n\nexports.ModuleSpecifier = class ModuleSpecifier extends Base\n  constructor: (@original, @alias, @moduleDeclarationType) ->\n    super()\n\n    if @original.comments or @alias?.comments\n      @comments = []\n      @comments.push @original.comments... if @original.comments\n      @comments.push @alias.comments...    if @alias?.comments\n\n    # The name of the variable entering the local scope\n    @identifier = if @alias? then @alias.value else @original.value\n\n  children: ['original', 'alias']\n\n  compileNode: (o) ->\n    @addIdentifierToScope o\n    code = []\n    code.push @makeCode @original.value\n    code.push @makeCode \" as #{@alias.value}\" if @alias?\n    code\n\n  addIdentifierToScope: (o) ->\n    o.scope.find @identifier, @moduleDeclarationType\n\n  astNode: (o) ->\n    @addIdentifierToScope o\n    super o\n\nexports.ImportSpecifier = class ImportSpecifier extends ModuleSpecifier\n  constructor: (imported, local) ->\n    super imported, local, 'import'\n\n  addIdentifierToScope: (o) ->\n    # Per the spec, symbols can’t be imported multiple times\n    # (e.g. `import { foo, foo } from 'lib'` is invalid)\n    if @identifier in o.importedSymbols or o.scope.check(@identifier)\n      @error \"'#{@identifier}' has already been declared\"\n    else\n      o.importedSymbols.push @identifier\n    super o\n\n  astProperties: (o) ->\n    originalAst = @original.ast o\n    return\n      imported: originalAst\n      local: @alias?.ast(o) ? originalAst\n      importKind: null\n\nexports.ImportDefaultSpecifier = class ImportDefaultSpecifier extends ImportSpecifier\n  astProperties: (o) ->\n    return\n      local: @original.ast o\n\nexports.ImportNamespaceSpecifier = class ImportNamespaceSpecifier extends ImportSpecifier\n  astProperties: (o) ->\n    return\n      local: @alias.ast o\n\nexports.ExportSpecifier = class ExportSpecifier extends ModuleSpecifier\n  constructor: (local, exported) ->\n    super local, exported, 'export'\n\n  astProperties: (o) ->\n    originalAst = @original.ast o\n    return\n      local: originalAst\n      exported: @alias?.ast(o) ? originalAst\n\nexports.DynamicImport = class DynamicImport extends Base\n  compileNode: ->\n    [@makeCode 'import']\n\n  astType: -> 'Import'\n\nexports.DynamicImportCall = class DynamicImportCall extends Call\n  compileNode: (o) ->\n    @checkArguments()\n    super o\n\n  checkArguments: ->\n    unless 1 <= @args.length <= 2\n      @error 'import() accepts either one or two arguments'\n\n  astNode: (o) ->\n    @checkArguments()\n    super o\n\n#### Assign\n\n# The **Assign** is used to assign a local variable to value, or to set the\n# property of an object -- including within object literals.\nexports.Assign = class Assign extends Base\n  constructor: (@variable, @value, @context, options = {}) ->\n    super()\n    {@param, @subpattern, @operatorToken, @moduleDeclaration, @originalContext = @context} = options\n    @propagateLhs()\n\n  children: ['variable', 'value']\n\n  isAssignable: YES\n\n  isStatement: (o) ->\n    o?.level is LEVEL_TOP and @context? and (@moduleDeclaration or \"?\" in @context)\n\n  checkNameAssignability: (o, varBase) ->\n    if o.scope.type(varBase.value) is 'import'\n      varBase.error \"'#{varBase.value}' is read-only\"\n\n  assigns: (name) ->\n    @[if @context is 'object' then 'value' else 'variable'].assigns name\n\n  unfoldSoak: (o) ->\n    unfoldSoak o, this, 'variable'\n\n  addScopeVariables: (o, {\n    # During AST generation, we need to allow assignment to these constructs\n    # that are considered “unassignable” during compile-to-JS, while still\n    # flagging things like `[null] = b`.\n    allowAssignmentToExpansion = no,\n    allowAssignmentToNontrailingSplat = no,\n    allowAssignmentToEmptyArray = no,\n    allowAssignmentToComplexSplat = no\n  } = {}) ->\n    return unless not @context or @context is '**='\n\n    varBase = @variable.unwrapAll()\n    if not varBase.isAssignable {\n      allowExpansion: allowAssignmentToExpansion\n      allowNontrailingSplat: allowAssignmentToNontrailingSplat\n      allowEmptyArray: allowAssignmentToEmptyArray\n      allowComplexSplat: allowAssignmentToComplexSplat\n    }\n      @variable.error \"'#{@variable.compile o}' can't be assigned\"\n\n    varBase.eachName (name) =>\n      return if name.hasProperties?()\n\n      message = isUnassignable name.value\n      name.error message if message\n\n      # `moduleDeclaration` can be `'import'` or `'export'`.\n      @checkNameAssignability o, name\n      if @moduleDeclaration\n        o.scope.add name.value, @moduleDeclaration\n        name.isDeclaration = yes\n      else if @param\n        o.scope.add name.value,\n          if @param is 'alwaysDeclare'\n            'var'\n          else\n            'param'\n      else\n        alreadyDeclared = o.scope.find name.value\n        name.isDeclaration ?= not alreadyDeclared\n        # If this assignment identifier has one or more herecomments\n        # attached, output them as part of the declarations line (unless\n        # other herecomments are already staged there) for compatibility\n        # with Flow typing. Don’t do this if this assignment is for a\n        # class, e.g. `ClassName = class ClassName {`, as Flow requires\n        # the comment to be between the class name and the `{`.\n        if name.comments and not o.scope.comments[name.value] and\n           @value not instanceof Class and\n           name.comments.every((comment) -> comment.here and not comment.multiline)\n          commentsNode = new IdentifierLiteral name.value\n          commentsNode.comments = name.comments\n          commentFragments = []\n          @compileCommentFragments o, commentsNode, commentFragments\n          o.scope.comments[name.value] = commentFragments\n\n  # Compile an assignment, delegating to `compileDestructuring` or\n  # `compileSplice` if appropriate. Keep track of the name of the base object\n  # we've been assigned to, for correct internal references. If the variable\n  # has not been seen yet within the current scope, declare it.\n  compileNode: (o) ->\n    isValue = @variable instanceof Value\n    if isValue\n      # If `@variable` is an array or an object, we’re destructuring;\n      # if it’s also `isAssignable()`, the destructuring syntax is supported\n      # in ES and we can output it as is; otherwise we `@compileDestructuring`\n      # and convert this ES-unsupported destructuring into acceptable output.\n      if @variable.isArray() or @variable.isObject()\n        unless @variable.isAssignable()\n          if @variable.isObject() and @variable.base.hasSplat()\n            return @compileObjectDestruct o\n          else\n            return @compileDestructuring o\n\n      return @compileSplice       o if @variable.isSplice()\n      return @compileConditional  o if @isConditional()\n      return @compileSpecialMath  o if @context in ['//=', '%%=']\n\n    @addScopeVariables o\n    if @value instanceof Code\n      if @value.isStatic\n        @value.name = @variable.properties[0]\n      else if @variable.properties?.length >= 2\n        [properties..., prototype, name] = @variable.properties\n        @value.name = name if prototype.name?.value is 'prototype'\n\n    val = @value.compileToFragments o, LEVEL_LIST\n    compiledName = @variable.compileToFragments o, LEVEL_LIST\n\n    if @context is 'object'\n      if @variable.shouldCache()\n        compiledName.unshift @makeCode '['\n        compiledName.push @makeCode ']'\n      return compiledName.concat @makeCode(': '), val\n\n    answer = compiledName.concat @makeCode(\" #{ @context or '=' } \"), val\n    # Per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Assignment_without_declaration,\n    # if we’re destructuring without declaring, the destructuring assignment must be wrapped in parentheses.\n    # The assignment is wrapped in parentheses if 'o.level' has lower precedence than LEVEL_LIST (3)\n    # (i.e. LEVEL_COND (4), LEVEL_OP (5) or LEVEL_ACCESS (6)), or if we're destructuring object, e.g. {a,b} = obj.\n    if o.level > LEVEL_LIST or isValue and @variable.base instanceof Obj and not @nestedLhs and not (@param is yes)\n      @wrapInParentheses answer\n    else\n      answer\n\n  # Object rest property is not assignable: `{{a}...}`\n  compileObjectDestruct: (o) ->\n    @variable.base.reorderProperties()\n    {properties: props} = @variable.base\n    [..., splat] = props\n    splatProp = splat.name\n    assigns = []\n    refVal = new Value new IdentifierLiteral o.scope.freeVariable 'ref'\n    props.splice -1, 1, new Splat refVal\n    assigns.push new Assign(new Value(new Obj props), @value).compileToFragments o, LEVEL_LIST\n    assigns.push new Assign(new Value(splatProp), refVal).compileToFragments o, LEVEL_LIST\n    @joinFragmentArrays assigns, ', '\n\n  # Brief implementation of recursive pattern matching, when assigning array or\n  # object literals to a value. Peeks at their properties to assign inner names.\n  compileDestructuring: (o) ->\n    top       = o.level is LEVEL_TOP\n    {value}   = this\n    {objects} = @variable.base\n    olen      = objects.length\n\n    # Special-case for `{} = a` and `[] = a` (empty patterns).\n    # Compile to simply `a`.\n    if olen is 0\n      code = value.compileToFragments o\n      return if o.level >= LEVEL_OP then @wrapInParentheses code else code\n    [obj] = objects\n\n    @disallowLoneExpansion()\n    {splats, expans, splatsAndExpans} = @getAndCheckSplatsAndExpansions()\n\n    isSplat = splats?.length > 0\n    isExpans = expans?.length > 0\n\n    vvar     = value.compileToFragments o, LEVEL_LIST\n    vvarText = fragmentsToText vvar\n    assigns  = []\n    pushAssign = (variable, val) =>\n      assigns.push new Assign(variable, val, null, param: @param, subpattern: yes).compileToFragments o, LEVEL_LIST\n\n    if isSplat\n      splatVar = objects[splats[0]].name.unwrap()\n      if splatVar instanceof Arr or splatVar instanceof Obj\n        splatVarRef = new IdentifierLiteral o.scope.freeVariable 'ref'\n        objects[splats[0]].name = splatVarRef\n        splatVarAssign = -> pushAssign new Value(splatVar), splatVarRef\n\n    # At this point, there are several things to destructure. So the `fn()` in\n    # `{a, b} = fn()` must be cached, for example. Make vvar into a simple\n    # variable if it isn’t already.\n    if value.unwrap() not instanceof IdentifierLiteral or @variable.assigns(vvarText)\n      ref = o.scope.freeVariable 'ref'\n      assigns.push [@makeCode(ref + ' = '), vvar...]\n      vvar = [@makeCode ref]\n      vvarText = ref\n\n    slicer = (type) -> (vvar, start, end = no) ->\n      vvar = new IdentifierLiteral vvar unless vvar instanceof Value\n      args = [vvar, new NumberLiteral(start)]\n      args.push new NumberLiteral end if end\n      slice = new Value (new IdentifierLiteral utility type, o), [new Access new PropertyName 'call']\n      new Value new Call slice, args\n\n    # Helper which outputs `[].slice` code.\n    compSlice = slicer \"slice\"\n\n    # Helper which outputs `[].splice` code.\n    compSplice = slicer \"splice\"\n\n    # Check if `objects` array contains any instance of `Assign`, e.g. {a:1}.\n    hasObjAssigns = (objs) ->\n      (i for obj, i in objs when obj instanceof Assign and obj.context is 'object')\n\n    # Check if `objects` array contains any unassignable object.\n    objIsUnassignable = (objs) ->\n      return yes for obj in objs when not obj.isAssignable()\n      no\n\n    # `objects` are complex when there is object assign ({a:1}),\n    # unassignable object, or just a single node.\n    complexObjects = (objs) ->\n      hasObjAssigns(objs).length or objIsUnassignable(objs) or olen is 1\n\n    # \"Complex\" `objects` are processed in a loop.\n    # Examples: [a, b, {c, r...}, d], [a, ..., {b, r...}, c, d]\n    loopObjects = (objs, vvar, vvarTxt) =>\n      for obj, i in objs\n        # `Elision` can be skipped.\n        continue if obj instanceof Elision\n        # If `obj` is {a: 1}\n        if obj instanceof Assign and obj.context is 'object'\n          {variable: {base: idx}, value: vvar} = obj\n          {variable: vvar} = vvar if vvar instanceof Assign\n          idx =\n            if vvar.this\n              vvar.properties[0].name\n            else\n              new PropertyName vvar.unwrap().value\n          acc = idx.unwrap() instanceof PropertyName\n          vval = new Value value, [new (if acc then Access else Index) idx]\n        else\n          # `obj` is [a...], {a...} or a\n          vvar = switch\n            when obj instanceof Splat then new Value obj.name\n            else obj\n          vval = switch\n            when obj instanceof Splat then compSlice(vvarTxt, i)\n            else new Value new Literal(vvarTxt), [new Index new NumberLiteral i]\n        message = isUnassignable vvar.unwrap().value\n        vvar.error message if message\n        pushAssign vvar, vval\n\n    # \"Simple\" `objects` can be split and compiled to arrays, [a, b, c] = arr, [a, b, c...] = arr\n    assignObjects = (objs, vvar, vvarTxt) =>\n      vvar = new Value new Arr(objs, yes)\n      vval = if vvarTxt instanceof Value then vvarTxt else new Value new Literal(vvarTxt)\n      pushAssign vvar, vval\n\n    processObjects = (objs, vvar, vvarTxt) ->\n      if complexObjects objs\n        loopObjects objs, vvar, vvarTxt\n      else\n        assignObjects objs, vvar, vvarTxt\n\n    # In case there is `Splat` or `Expansion` in `objects`,\n    # we can split array in two simple subarrays.\n    # `Splat` [a, b, c..., d, e] can be split into  [a, b, c...] and [d, e].\n    # `Expansion` [a, b, ..., c, d] can be split into [a, b] and [c, d].\n    # Examples:\n    # a) `Splat`\n    #   CS: [a, b, c..., d, e] = arr\n    #   JS: [a, b, ...c] = arr, [d, e] = splice.call(c, -2)\n    # b) `Expansion`\n    #   CS: [a, b, ..., d, e] = arr\n    #   JS: [a, b] = arr, [d, e] = slice.call(arr, -2)\n    if splatsAndExpans.length\n      expIdx = splatsAndExpans[0]\n      leftObjs = objects.slice 0, expIdx + (if isSplat then 1 else 0)\n      rightObjs = objects.slice expIdx + 1\n      processObjects leftObjs, vvar, vvarText if leftObjs.length isnt 0\n      if rightObjs.length isnt 0\n        # Slice or splice `objects`.\n        refExp = switch\n          when isSplat then compSplice new Value(objects[expIdx].name), rightObjs.length * -1\n          when isExpans then compSlice vvarText, rightObjs.length * -1\n        if complexObjects rightObjs\n          restVar = refExp\n          refExp = o.scope.freeVariable 'ref'\n          assigns.push [@makeCode(refExp + ' = '), restVar.compileToFragments(o, LEVEL_LIST)...]\n        processObjects rightObjs, vvar, refExp\n    else\n      # There is no `Splat` or `Expansion` in `objects`.\n      processObjects objects, vvar, vvarText\n    splatVarAssign?()\n    assigns.push vvar unless top or @subpattern\n    fragments = @joinFragmentArrays assigns, ', '\n    if o.level < LEVEL_LIST then fragments else @wrapInParentheses fragments\n\n  # Disallow `[...] = a` for some reason. (Could be equivalent to `[] = a`?)\n  disallowLoneExpansion: ->\n    return unless @variable.base instanceof Arr\n    {objects} = @variable.base\n    return unless objects?.length is 1\n    [loneObject] = objects\n    if loneObject instanceof Expansion\n      loneObject.error 'Destructuring assignment has no target'\n\n  # Show error if there is more than one `Splat`, or `Expansion`.\n  # Examples: [a, b, c..., d, e, f...], [a, b, ..., c, d, ...], [a, b, ..., c, d, e...]\n  getAndCheckSplatsAndExpansions: ->\n    return {splats: [], expans: [], splatsAndExpans: []} unless @variable.base instanceof Arr\n    {objects} = @variable.base\n\n    # Count all `Splats`: [a, b, c..., d, e]\n    splats = (i for obj, i in objects when obj instanceof Splat)\n    # Count all `Expansions`: [a, b, ..., c, d]\n    expans = (i for obj, i in objects when obj instanceof Expansion)\n    # Combine splats and expansions.\n    splatsAndExpans = [splats..., expans...]\n    if splatsAndExpans.length > 1\n      # Sort 'splatsAndExpans' so we can show error at first disallowed token.\n      objects[splatsAndExpans.sort()[1]].error \"multiple splats/expansions are disallowed in an assignment\"\n    {splats, expans, splatsAndExpans}\n\n  # When compiling a conditional assignment, take care to ensure that the\n  # operands are only evaluated once, even though we have to reference them\n  # more than once.\n  compileConditional: (o) ->\n    [left, right] = @variable.cacheReference o\n    # Disallow conditional assignment of undefined variables.\n    if not left.properties.length and left.base instanceof Literal and\n           left.base not instanceof ThisLiteral and not o.scope.check left.base.value\n      @throwUnassignableConditionalError left.base.value\n    if \"?\" in @context\n      o.isExistentialEquals = true\n      new If(new Existence(left), right, type: 'if').addElse(new Assign(right, @value, '=')).compileToFragments o\n    else\n      fragments = new Op(@context[...-1], left, new Assign(right, @value, '=')).compileToFragments o\n      if o.level <= LEVEL_LIST then fragments else @wrapInParentheses fragments\n\n  # Convert special math assignment operators like `a //= b` to the equivalent\n  # extended form `a = a ** b` and then compiles that.\n  compileSpecialMath: (o) ->\n    [left, right] = @variable.cacheReference o\n    new Assign(left, new Op(@context[...-1], right, @value)).compileToFragments o\n\n  # Compile the assignment from an array splice literal, using JavaScript's\n  # `Array#splice` method.\n  compileSplice: (o) ->\n    {range: {from, to, exclusive}} = @variable.properties.pop()\n    unwrappedVar = @variable.unwrapAll()\n    if unwrappedVar.comments\n      moveComments unwrappedVar, @\n      delete @variable.comments\n    name = @variable.compile o\n    if from\n      [fromDecl, fromRef] = @cacheToCodeFragments from.cache o, LEVEL_OP\n    else\n      fromDecl = fromRef = '0'\n    if to\n      if from?.isNumber() and to.isNumber()\n        to = to.compile(o) - fromRef\n        to += 1 unless exclusive\n      else\n        to = to.compile(o, LEVEL_ACCESS) + ' - ' + fromRef\n        to += ' + 1' unless exclusive\n    else\n      to = \"9e9\"\n    [valDef, valRef] = @value.cache o, LEVEL_LIST\n    answer = [].concat @makeCode(\"#{utility 'splice', o}.apply(#{name}, [#{fromDecl}, #{to}].concat(\"), valDef, @makeCode(\")), \"), valRef\n    if o.level > LEVEL_TOP then @wrapInParentheses answer else answer\n\n  eachName: (iterator) ->\n    @variable.unwrapAll().eachName iterator\n\n  isDefaultAssignment: -> @param or @nestedLhs\n\n  propagateLhs: ->\n    return unless @variable?.isArray?() or @variable?.isObject?()\n    # This is the left-hand side of an assignment; let `Arr` and `Obj`\n    # know that, so that those nodes know that they’re assignable as\n    # destructured variables.\n    @variable.base.propagateLhs yes\n\n  throwUnassignableConditionalError: (name) ->\n    @variable.error \"the variable \\\"#{name}\\\" can't be assigned with #{@context} because it has not been declared before\"\n\n  isConditional: ->\n    @context in ['||=', '&&=', '?=']\n\n  isStatementAst: NO\n\n  astNode: (o) ->\n    @disallowLoneExpansion()\n    @getAndCheckSplatsAndExpansions()\n    if @isConditional()\n      variable = @variable.unwrap()\n      if variable instanceof IdentifierLiteral and not o.scope.check variable.value\n        @throwUnassignableConditionalError variable.value\n    @addScopeVariables o, allowAssignmentToExpansion: yes, allowAssignmentToNontrailingSplat: yes, allowAssignmentToEmptyArray: yes, allowAssignmentToComplexSplat: yes\n    super o\n\n  astType: ->\n    if @isDefaultAssignment()\n      'AssignmentPattern'\n    else\n      'AssignmentExpression'\n\n  astProperties: (o) ->\n    ret =\n      right: @value.ast o, LEVEL_LIST\n      left: @variable.ast o, LEVEL_LIST\n\n    unless @isDefaultAssignment()\n      ret.operator = @originalContext ? '='\n\n    ret\n\n#### FuncGlyph\n\nexports.FuncGlyph = class FuncGlyph extends Base\n  constructor: (@glyph) ->\n    super()\n\n#### Code\n\n# A function definition. This is the only node that creates a new Scope.\n# When for the purposes of walking the contents of a function body, the Code\n# has no *children* -- they're within the inner scope.\nexports.Code = class Code extends Base\n  constructor: (params, body, @funcGlyph, @paramStart) ->\n    super()\n\n    @params      = params or []\n    @body        = body or new Block\n    @bound       = @funcGlyph?.glyph is '=>'\n    @isGenerator = no\n    @isAsync     = no\n    @isMethod    = no\n\n    @body.traverseChildren no, (node) =>\n      if (node instanceof Op and node.isYield()) or node instanceof YieldReturn\n        @isGenerator = yes\n      if (node instanceof Op and node.isAwait()) or node instanceof AwaitReturn\n        @isAsync = yes\n      if node instanceof For and node.isAwait()\n        @isAsync = yes\n\n    @propagateLhs()\n\n  children: ['params', 'body']\n\n  isStatement: -> @isMethod\n\n  jumps: NO\n\n  makeScope: (parentScope) -> new Scope parentScope, @body, this\n\n  # Compilation creates a new scope unless explicitly asked to share with the\n  # outer scope. Handles splat parameters in the parameter list by setting\n  # such parameters to be the final parameter in the function definition, as\n  # required per the ES2015 spec. If the CoffeeScript function definition had\n  # parameters after the splat, they are declared via expressions in the\n  # function body.\n  compileNode: (o) ->\n    @checkForAsyncOrGeneratorConstructor()\n\n    if @bound\n      @context = o.scope.method.context if o.scope.method?.bound\n      @context = 'this' unless @context\n\n    @updateOptions o\n    params           = []\n    exprs            = []\n    thisAssignments  = @thisAssignments?.slice() ? []\n    paramsAfterSplat = []\n    haveSplatParam   = no\n    haveBodyParam    = no\n\n    @checkForDuplicateParams()\n    @disallowLoneExpansionAndMultipleSplats()\n\n    # Separate `this` assignments.\n    @eachParamName (name, node, param, obj) ->\n      if node.this\n        name   = node.properties[0].name.value\n        name   = \"_#{name}\" if name in JS_FORBIDDEN\n        target = new IdentifierLiteral o.scope.freeVariable name, reserve: no\n        # `Param` is object destructuring with a default value: ({@prop = 1}) ->\n        # In a case when the variable name is already reserved, we have to assign\n        # a new variable name to the destructured variable: ({prop:prop1 = 1}) ->\n        replacement =\n            if param.name instanceof Obj and obj instanceof Assign and\n                obj.operatorToken.value is '='\n              new Assign (new IdentifierLiteral name), target, 'object' #, operatorToken: new Literal ':'\n            else\n              target\n        param.renameParam node, replacement\n        thisAssignments.push new Assign node, target\n\n    # Parse the parameters, adding them to the list of parameters to put in the\n    # function definition; and dealing with splats or expansions, including\n    # adding expressions to the function body to declare all parameter\n    # variables that would have been after the splat/expansion parameter.\n    # If we encounter a parameter that needs to be declared in the function\n    # body for any reason, for example it’s destructured with `this`, also\n    # declare and assign all subsequent parameters in the function body so that\n    # any non-idempotent parameters are evaluated in the correct order.\n    for param, i in @params\n      # Was `...` used with this parameter? Splat/expansion parameters cannot\n      # have default values, so we need not worry about that.\n      if param.splat or param instanceof Expansion\n        haveSplatParam = yes\n        if param.splat\n          if param.name instanceof Arr or param.name instanceof Obj\n            # Splat arrays are treated oddly by ES; deal with them the legacy\n            # way in the function body. TODO: Should this be handled in the\n            # function parameter list, and if so, how?\n            splatParamName = o.scope.freeVariable 'arg'\n            params.push ref = new Value new IdentifierLiteral splatParamName\n            exprs.push new Assign new Value(param.name), ref\n          else\n            params.push ref = param.asReference o\n            splatParamName = fragmentsToText ref.compileNodeWithoutComments o\n          if param.shouldCache()\n            exprs.push new Assign new Value(param.name), ref\n        else # `param` is an Expansion\n          splatParamName = o.scope.freeVariable 'args'\n          params.push new Value new IdentifierLiteral splatParamName\n\n        o.scope.parameter splatParamName\n\n      # Parse all other parameters; if a splat paramater has not yet been\n      # encountered, add these other parameters to the list to be output in\n      # the function definition.\n      else\n        if param.shouldCache() or haveBodyParam\n          param.assignedInBody = yes\n          haveBodyParam = yes\n          # This parameter cannot be declared or assigned in the parameter\n          # list. So put a reference in the parameter list and add a statement\n          # to the function body assigning it, e.g.\n          # `(arg) => { var a = arg.a; }`, with a default value if it has one.\n          if param.value?\n            condition = new Op '===', param, new UndefinedLiteral\n            ifTrue = new Assign new Value(param.name), param.value\n            exprs.push new If condition, ifTrue\n          else\n            exprs.push new Assign new Value(param.name), param.asReference(o), null, param: 'alwaysDeclare'\n\n        # If this parameter comes before the splat or expansion, it will go\n        # in the function definition parameter list.\n        unless haveSplatParam\n          # If this parameter has a default value, and it hasn’t already been\n          # set by the `shouldCache()` block above, define it as a statement in\n          # the function body. This parameter comes after the splat parameter,\n          # so we can’t define its default value in the parameter list.\n          if param.shouldCache()\n            ref = param.asReference o\n          else\n            if param.value? and not param.assignedInBody\n              ref = new Assign new Value(param.name), param.value, null, param: yes\n            else\n              ref = param\n          # Add this parameter’s reference(s) to the function scope.\n          if param.name instanceof Arr or param.name instanceof Obj\n            # This parameter is destructured.\n            param.name.lhs = yes\n            unless param.shouldCache()\n              param.name.eachName (prop) ->\n                o.scope.parameter prop.value\n          else\n            # This compilation of the parameter is only to get its name to add\n            # to the scope name tracking; since the compilation output here\n            # isn’t kept for eventual output, don’t include comments in this\n            # compilation, so that they get output the “real” time this param\n            # is compiled.\n            paramToAddToScope = if param.value? then param else ref\n            o.scope.parameter fragmentsToText paramToAddToScope.compileToFragmentsWithoutComments o\n          params.push ref\n        else\n          paramsAfterSplat.push param\n          # If this parameter had a default value, since it’s no longer in the\n          # function parameter list we need to assign its default value\n          # (if necessary) as an expression in the body.\n          if param.value? and not param.shouldCache()\n            condition = new Op '===', param, new UndefinedLiteral\n            ifTrue = new Assign new Value(param.name), param.value\n            exprs.push new If condition, ifTrue\n          # Add this parameter to the scope, since it wouldn’t have been added\n          # yet since it was skipped earlier.\n          o.scope.add param.name.value, 'var', yes if param.name?.value?\n\n    # If there were parameters after the splat or expansion parameter, those\n    # parameters need to be assigned in the body of the function.\n    if paramsAfterSplat.length isnt 0\n      # Create a destructured assignment, e.g. `[a, b, c] = [args..., b, c]`\n      exprs.unshift new Assign new Value(\n          new Arr [new Splat(new IdentifierLiteral(splatParamName)), (param.asReference o for param in paramsAfterSplat)...]\n        ), new Value new IdentifierLiteral splatParamName\n\n    # Add new expressions to the function body\n    wasEmpty = @body.isEmpty()\n    @disallowSuperInParamDefaults()\n    @checkSuperCallsInConstructorBody()\n    @body.expressions.unshift thisAssignments... unless @expandCtorSuper thisAssignments\n    @body.expressions.unshift exprs...\n    if @isMethod and @bound and not @isStatic and @classVariable\n      boundMethodCheck = new Value new Literal utility 'boundMethodCheck', o\n      @body.expressions.unshift new Call(boundMethodCheck, [new Value(new ThisLiteral), @classVariable])\n    @body.makeReturn() unless wasEmpty or @noReturn\n\n    # JavaScript doesn’t allow bound (`=>`) functions to also be generators.\n    # This is usually caught via `Op::compileContinuation`, but double-check:\n    if @bound and @isGenerator\n      yieldNode = @body.contains (node) -> node instanceof Op and node.operator is 'yield'\n      (yieldNode or @).error 'yield cannot occur inside bound (fat arrow) functions'\n\n    # Assemble the output\n    modifiers = []\n    modifiers.push 'static' if @isMethod and @isStatic\n    modifiers.push 'async'  if @isAsync\n    unless @isMethod or @bound\n      modifiers.push \"function#{if @isGenerator then '*' else ''}\"\n    else if @isGenerator\n      modifiers.push '*'\n\n    signature = [@makeCode '(']\n    # Block comments between a function name and `(` get output between\n    # `function` and `(`.\n    if @paramStart?.comments?\n      @compileCommentFragments o, @paramStart, signature\n    for param, i in params\n      signature.push @makeCode ', ' if i isnt 0\n      signature.push @makeCode '...' if haveSplatParam and i is params.length - 1\n      # Compile this parameter, but if any generated variables get created\n      # (e.g. `ref`), shift those into the parent scope since we can’t put a\n      # `var` line inside a function parameter list.\n      scopeVariablesCount = o.scope.variables.length\n      signature.push param.compileToFragments(o, LEVEL_PAREN)...\n      if scopeVariablesCount isnt o.scope.variables.length\n        generatedVariables = o.scope.variables.splice scopeVariablesCount\n        o.scope.parent.variables.push generatedVariables...\n    signature.push @makeCode ')'\n    # Block comments between `)` and `->`/`=>` get output between `)` and `{`.\n    if @funcGlyph?.comments?\n      comment.unshift = no for comment in @funcGlyph.comments\n      @compileCommentFragments o, @funcGlyph, signature\n\n    body = @body.compileWithDeclarations o unless @body.isEmpty()\n\n    # We need to compile the body before method names to ensure `super`\n    # references are handled.\n    if @isMethod\n      [methodScope, o.scope] = [o.scope, o.scope.parent]\n      name = @name.compileToFragments o\n      name.shift() if name[0].code is '.'\n      o.scope = methodScope\n\n    answer = @joinFragmentArrays (@makeCode m for m in modifiers), ' '\n    answer.push @makeCode ' ' if modifiers.length and name\n    answer.push name... if name\n    answer.push signature...\n    answer.push @makeCode ' =>' if @bound and not @isMethod\n    answer.push @makeCode ' {'\n    answer.push @makeCode('\\n'), body..., @makeCode(\"\\n#{@tab}\") if body?.length\n    answer.push @makeCode '}'\n\n    return indentInitial answer, @ if @isMethod\n    if @front or (o.level >= LEVEL_ACCESS) then @wrapInParentheses answer else answer\n\n  updateOptions: (o) ->\n    o.scope         = del(o, 'classScope') or @makeScope o.scope\n    o.scope.shared  = del(o, 'sharedScope')\n    o.indent        += TAB\n    delete o.bare\n    delete o.isExistentialEquals\n\n  checkForDuplicateParams: ->\n    paramNames = []\n    @eachParamName (name, node, param) ->\n      node.error \"multiple parameters named '#{name}'\" if name in paramNames\n      paramNames.push name\n\n  eachParamName: (iterator) ->\n    param.eachName iterator for param in @params\n\n  # Short-circuit `traverseChildren` method to prevent it from crossing scope\n  # boundaries unless `crossScope` is `true`.\n  traverseChildren: (crossScope, func) ->\n    super(crossScope, func) if crossScope\n\n  # Short-circuit `replaceInContext` method to prevent it from crossing context boundaries. Bound\n  # functions have the same context.\n  replaceInContext: (child, replacement) ->\n    if @bound\n      super child, replacement\n    else\n      false\n\n  disallowSuperInParamDefaults: ({forAst} = {}) ->\n    return false unless @ctor\n\n    @eachSuperCall Block.wrap(@params), (superCall) ->\n      superCall.error \"'super' is not allowed in constructor parameter defaults\"\n    , checkForThisBeforeSuper: not forAst\n\n  checkSuperCallsInConstructorBody: ->\n    return false unless @ctor\n\n    seenSuper = @eachSuperCall @body, (superCall) =>\n      superCall.error \"'super' is only allowed in derived class constructors\" if @ctor is 'base'\n\n    seenSuper\n\n  flagThisParamInDerivedClassConstructorWithoutCallingSuper: (param) ->\n    param.error \"Can't use @params in derived class constructors without calling super\"\n\n  checkForAsyncOrGeneratorConstructor: ->\n    if @ctor\n      @name.error 'Class constructor may not be async'       if @isAsync\n      @name.error 'Class constructor may not be a generator' if @isGenerator\n\n  disallowLoneExpansionAndMultipleSplats: ->\n    seenSplatParam = no\n    for param in @params\n      # Was `...` used with this parameter? (Only one such parameter is allowed\n      # per function.)\n      if param.splat or param instanceof Expansion\n        if seenSplatParam\n          param.error 'only one splat or expansion parameter is allowed per function definition'\n        else if param instanceof Expansion and @params.length is 1\n          param.error 'an expansion parameter cannot be the only parameter in a function definition'\n        seenSplatParam = yes\n\n  expandCtorSuper: (thisAssignments) ->\n    return false unless @ctor\n\n    seenSuper = @eachSuperCall @body, (superCall) =>\n      superCall.expressions = thisAssignments\n\n    haveThisParam = thisAssignments.length and thisAssignments.length isnt @thisAssignments?.length\n    if @ctor is 'derived' and not seenSuper and haveThisParam\n      param = thisAssignments[0].variable\n      @flagThisParamInDerivedClassConstructorWithoutCallingSuper param\n\n    seenSuper\n\n  # Find all super calls in the given context node;\n  # returns `true` if `iterator` is called.\n  eachSuperCall: (context, iterator, {checkForThisBeforeSuper = yes} = {}) ->\n    seenSuper = no\n\n    context.traverseChildren yes, (child) =>\n      if child instanceof SuperCall\n        # `super` in a constructor (the only `super` without an accessor)\n        # cannot be given an argument with a reference to `this`, as that would\n        # be referencing `this` before calling `super`.\n        unless child.variable.accessor\n          childArgs = child.args.filter (arg) ->\n            arg not instanceof Class and (arg not instanceof Code or arg.bound)\n          Block.wrap(childArgs).traverseChildren yes, (node) =>\n            node.error \"Can't call super with @params in derived class constructors\" if node.this\n        seenSuper = yes\n        iterator child\n      else if checkForThisBeforeSuper and child instanceof ThisLiteral and @ctor is 'derived' and not seenSuper\n        child.error \"Can't reference 'this' before calling super in derived class constructors\"\n\n      # `super` has the same target in bound (arrow) functions, so check them too\n      child not instanceof SuperCall and (child not instanceof Code or child.bound)\n\n    seenSuper\n\n  propagateLhs: ->\n    for param in @params\n      {name} = param\n      if name instanceof Arr or name instanceof Obj\n        name.propagateLhs yes\n      else if param instanceof Expansion\n        param.lhs = yes\n\n  astAddParamsToScope: (o) ->\n    @eachParamName (name) ->\n      o.scope.add name, 'param'\n\n  astNode: (o) ->\n    @updateOptions o\n    @checkForAsyncOrGeneratorConstructor()\n    @checkForDuplicateParams()\n    @disallowSuperInParamDefaults forAst: yes\n    @disallowLoneExpansionAndMultipleSplats()\n    seenSuper = @checkSuperCallsInConstructorBody()\n    if @ctor is 'derived' and not seenSuper\n      @eachParamName (name, node) =>\n        if node.this\n          @flagThisParamInDerivedClassConstructorWithoutCallingSuper node\n    @astAddParamsToScope o\n    @body.makeReturn null, yes unless @body.isEmpty() or @noReturn\n\n    super o\n\n  astType: ->\n    if @isMethod\n      'ClassMethod'\n    else if @bound\n      'ArrowFunctionExpression'\n    else\n      'FunctionExpression'\n\n  paramForAst: (param) ->\n    return param if param instanceof Expansion\n    {name, value, splat} = param\n    if splat\n      new Splat name, lhs: yes, postfix: splat.postfix\n      .withLocationDataFrom param\n    else if value?\n      new Assign name, value, null, param: yes\n      .withLocationDataFrom locationData: mergeLocationData name.locationData, value.locationData\n    else\n      name\n\n  methodAstProperties: (o) ->\n    getIsComputed = =>\n      return yes if @name instanceof Index\n      return yes if @name instanceof ComputedPropertyName\n      return yes if @name.name instanceof ComputedPropertyName\n      no\n\n    return\n      static: !!@isStatic\n      key: @name.ast o\n      computed: getIsComputed()\n      kind:\n        if @ctor\n          'constructor'\n        else\n          'method'\n      operator: @operatorToken?.value ? '='\n      staticClassName: @isStatic.staticClassName?.ast(o) ? null\n      bound: !!@bound\n\n  astProperties: (o) ->\n    return Object.assign\n      params: @paramForAst(param).ast(o) for param in @params\n      body: @body.ast (Object.assign {}, o, checkForDirectives: yes), LEVEL_TOP\n      generator: !!@isGenerator\n      async: !!@isAsync\n      # We never generate named functions, so specify `id` as `null`, which\n      # matches the Babel AST for anonymous function expressions/arrow functions\n      id: null\n      hasIndentedBody: @body.locationData.first_line > @funcGlyph?.locationData.first_line\n    ,\n      if @isMethod then @methodAstProperties o else {}\n\n  astLocationData: ->\n    functionLocationData = super()\n    return functionLocationData unless @isMethod\n\n    astLocationData = mergeAstLocationData @name.astLocationData(), functionLocationData\n    if @isStatic.staticClassName?\n      astLocationData = mergeAstLocationData @isStatic.staticClassName.astLocationData(), astLocationData\n    astLocationData\n\n#### Param\n\n# A parameter in a function definition. Beyond a typical JavaScript parameter,\n# these parameters can also attach themselves to the context of the function,\n# as well as be a splat, gathering up a group of parameters into an array.\nexports.Param = class Param extends Base\n  constructor: (@name, @value, @splat) ->\n    super()\n\n    message = isUnassignable @name.unwrapAll().value\n    @name.error message if message\n    if @name instanceof Obj and @name.generated\n      token = @name.objects[0].operatorToken\n      token.error \"unexpected #{token.value}\"\n\n  children: ['name', 'value']\n\n  compileToFragments: (o) ->\n    @name.compileToFragments o, LEVEL_LIST\n\n  compileToFragmentsWithoutComments: (o) ->\n    @name.compileToFragmentsWithoutComments o, LEVEL_LIST\n\n  asReference: (o) ->\n    return @reference if @reference\n    node = @name\n    if node.this\n      name = node.properties[0].name.value\n      name = \"_#{name}\" if name in JS_FORBIDDEN\n      node = new IdentifierLiteral o.scope.freeVariable name\n    else if node.shouldCache()\n      node = new IdentifierLiteral o.scope.freeVariable 'arg'\n    node = new Value node\n    node.updateLocationDataIfMissing @locationData\n    @reference = node\n\n  shouldCache: ->\n    @name.shouldCache()\n\n  # Iterates the name or names of a `Param`.\n  # In a sense, a destructured parameter represents multiple JS parameters. This\n  # method allows to iterate them all.\n  # The `iterator` function will be called as `iterator(name, node)` where\n  # `name` is the name of the parameter and `node` is the AST node corresponding\n  # to that name.\n  eachName: (iterator, name = @name) ->\n    checkAssignabilityOfLiteral = (literal) ->\n      message = isUnassignable literal.value\n      if message\n        literal.error message\n      unless literal.isAssignable()\n        literal.error \"'#{literal.value}' can't be assigned\"\n\n    atParam = (obj, originalObj = null) => iterator \"@#{obj.properties[0].name.value}\", obj, @, originalObj\n    if name instanceof Call\n      name.error \"Function invocation can't be assigned\"\n\n    # * simple literals `foo`\n    if name instanceof Literal\n      checkAssignabilityOfLiteral name\n      return iterator name.value, name, @\n    # * at-params `@foo`\n    return atParam name if name instanceof Value\n    for obj in name.objects ? []\n      # Save original obj.\n      nObj = obj\n      # * destructured parameter with default value\n      if obj instanceof Assign and not obj.context?\n        obj = obj.variable\n      # * assignments within destructured parameters `{foo:bar}`\n      if obj instanceof Assign\n        # ... possibly with a default value\n        if obj.value instanceof Assign\n          obj = obj.value.variable\n        else\n          obj = obj.value\n        @eachName iterator, obj.unwrap()\n      # * splats within destructured parameters `[xs...]`\n      else if obj instanceof Splat\n        node = obj.name.unwrap()\n        iterator node.value, node, @\n      else if obj instanceof Value\n        # * destructured parameters within destructured parameters `[{a}]`\n        if obj.isArray() or obj.isObject()\n          @eachName iterator, obj.base\n        # * at-params within destructured parameters `{@foo}`\n        else if obj.this\n          atParam obj, nObj\n        # * simple destructured parameters {foo}\n        else\n          checkAssignabilityOfLiteral obj.base\n          iterator obj.base.value, obj.base, @\n      else if obj instanceof Elision\n        obj\n      else if obj not instanceof Expansion\n        obj.error \"illegal parameter #{obj.compile()}\"\n    return\n\n  # Rename a param by replacing the given AST node for a name with a new node.\n  # This needs to ensure that the the source for object destructuring does not change.\n  renameParam: (node, newNode) ->\n    isNode      = (candidate) -> candidate is node\n    replacement = (node, parent) =>\n      if parent instanceof Obj\n        key = node\n        key = node.properties[0].name if node.this\n        # No need to assign a new variable for the destructured variable if the variable isn't reserved.\n        # Examples:\n        # `({@foo}) ->`  should compile to `({foo}) { this.foo = foo}`\n        # `foo = 1; ({@foo}) ->` should compile to `foo = 1; ({foo:foo1}) { this.foo = foo1 }`\n        if node.this and key.value is newNode.value\n          new Value newNode\n        else\n          new Assign new Value(key), newNode, 'object'\n      else\n        newNode\n\n    @replaceInContext isNode, replacement\n\n#### Splat\n\n# A splat, either as a parameter to a function, an argument to a call,\n# or as part of a destructuring assignment.\nexports.Splat = class Splat extends Base\n  constructor: (name, {@lhs, @postfix = true} = {}) ->\n    super()\n    @name = if name.compile then name else new Literal name\n\n  children: ['name']\n\n  shouldCache: -> no\n\n  isAssignable: ({allowComplexSplat = no} = {})->\n    return allowComplexSplat if @name instanceof Obj or @name instanceof Parens\n    @name.isAssignable() and (not @name.isAtomic or @name.isAtomic())\n\n  assigns: (name) ->\n    @name.assigns name\n\n  compileNode: (o) ->\n    compiledSplat = [@makeCode('...'), @name.compileToFragments(o, LEVEL_OP)...]\n    return compiledSplat unless @jsx\n    return [@makeCode('{'), compiledSplat..., @makeCode('}')]\n\n  unwrap: -> @name\n\n  propagateLhs: (setLhs) ->\n    @lhs = yes if setLhs\n    return unless @lhs\n    @name.propagateLhs? yes\n\n  astType: ->\n    if @jsx\n      'JSXSpreadAttribute'\n    else if @lhs\n      'RestElement'\n    else\n      'SpreadElement'\n\n  astProperties: (o) -> {\n    argument: @name.ast o, LEVEL_OP\n    @postfix\n  }\n\n#### Expansion\n\n# Used to skip values inside an array destructuring (pattern matching) or\n# parameter list.\nexports.Expansion = class Expansion extends Base\n\n  shouldCache: NO\n\n  compileNode: (o) ->\n    @throwLhsError()\n\n  asReference: (o) ->\n    this\n\n  eachName: (iterator) ->\n\n  throwLhsError: ->\n    @error 'Expansion must be used inside a destructuring assignment or parameter list'\n\n  astNode: (o) ->\n    unless @lhs\n      @throwLhsError()\n\n    super o\n\n  astType: -> 'RestElement'\n\n  astProperties: ->\n    return\n      argument: null\n\n#### Elision\n\n# Array elision element (for example, [,a, , , b, , c, ,]).\nexports.Elision = class Elision extends Base\n\n  isAssignable: YES\n\n  shouldCache: NO\n\n  compileToFragments: (o, level) ->\n    fragment = super o, level\n    fragment.isElision = yes\n    fragment\n\n  compileNode: (o) ->\n    [@makeCode ', ']\n\n  asReference: (o) ->\n    this\n\n  eachName: (iterator) ->\n\n  astNode: ->\n    null\n\n#### While\n\n# A while loop, the only sort of low-level loop exposed by CoffeeScript. From\n# it, all other loops can be manufactured. Useful in cases where you need more\n# flexibility or more speed than a comprehension can provide.\nexports.While = class While extends Base\n  constructor: (@condition, {invert: @inverted, @guard, @isLoop} = {}) ->\n    super()\n\n  children: ['condition', 'guard', 'body']\n\n  isStatement: YES\n\n  makeReturn: (results, mark) ->\n    return super(results, mark) if results\n    @returns = not @jumps()\n    if mark\n      @body.makeReturn(results, mark) if @returns\n      return\n    this\n\n  addBody: (@body) ->\n    this\n\n  jumps: ->\n    {expressions} = @body\n    return no unless expressions.length\n    for node in expressions\n      return jumpNode if jumpNode = node.jumps loop: yes\n    no\n\n  # The main difference from a JavaScript *while* is that the CoffeeScript\n  # *while* can be used as a part of a larger expression -- while loops may\n  # return an array containing the computed result of each iteration.\n  compileNode: (o) ->\n    o.indent += TAB\n    set      = ''\n    {body}   = this\n    if body.isEmpty()\n      body = @makeCode ''\n    else\n      if @returns\n        body.makeReturn rvar = o.scope.freeVariable 'results'\n        set  = \"#{@tab}#{rvar} = [];\\n\"\n      if @guard\n        if body.expressions.length > 1\n          body.expressions.unshift new If (new Parens @guard).invert(), new StatementLiteral \"continue\"\n        else\n          body = Block.wrap [new If @guard, body] if @guard\n      body = [].concat @makeCode(\"\\n\"), (body.compileToFragments o, LEVEL_TOP), @makeCode(\"\\n#{@tab}\")\n    answer = [].concat @makeCode(set + @tab + \"while (\"), @processedCondition().compileToFragments(o, LEVEL_PAREN),\n      @makeCode(\") {\"), body, @makeCode(\"}\")\n    if @returns\n      answer.push @makeCode \"\\n#{@tab}return #{rvar};\"\n    answer\n\n  processedCondition: ->\n    @processedConditionCache ?= if @inverted then @condition.invert() else @condition\n\n  astType: -> 'WhileStatement'\n\n  astProperties: (o) ->\n    return\n      test: @condition.ast o, LEVEL_PAREN\n      body: @body.ast o, LEVEL_TOP\n      guard: @guard?.ast(o) ? null\n      inverted: !!@inverted\n      postfix: !!@postfix\n      loop: !!@isLoop\n\n#### Op\n\n# Simple Arithmetic and logical operations. Performs some conversion from\n# CoffeeScript operations into their JavaScript equivalents.\nexports.Op = class Op extends Base\n  constructor: (op, first, second, flip, {@invertOperator, @originalOperator = op} = {}) ->\n    super()\n\n    if op is 'new'\n      if ((firstCall = unwrapped = first.unwrap()) instanceof Call or (firstCall = unwrapped.base) instanceof Call) and not firstCall.do and not firstCall.isNew\n        return new Value firstCall.newInstance(), if firstCall is unwrapped then [] else unwrapped.properties\n      first = new Parens first unless first instanceof Parens or first.unwrap() instanceof IdentifierLiteral or first.hasProperties?()\n      call = new Call first, []\n      call.locationData = @locationData\n      call.isNew = yes\n      return call\n\n    @operator = CONVERSIONS[op] or op\n    @first    = first\n    @second   = second\n    @flip     = !!flip\n\n    if @operator in ['--', '++']\n      message = isUnassignable @first.unwrapAll().value\n      @first.error message if message\n\n    return this\n\n  # The map of conversions from CoffeeScript to JavaScript symbols.\n  CONVERSIONS =\n    '==':        '==='\n    '!=':        '!=='\n    'of':        'in'\n    'yieldfrom': 'yield*'\n\n  # The map of invertible operators.\n  INVERSIONS =\n    '!==': '==='\n    '===': '!=='\n\n  children: ['first', 'second']\n\n  isNumber: ->\n    @isUnary() and @operator in ['+', '-'] and\n      @first instanceof Value and @first.isNumber()\n\n  isAwait: ->\n    @operator is 'await'\n\n  isYield: ->\n    @operator in ['yield', 'yield*']\n\n  isUnary: ->\n    not @second\n\n  shouldCache: ->\n    not @isNumber()\n\n  # Am I capable of\n  # [Python-style comparison chaining](https://docs.python.org/3/reference/expressions.html#not-in)?\n  isChainable: ->\n    @operator in ['<', '>', '>=', '<=', '===', '!==']\n\n  isChain: ->\n    @isChainable() and @first.isChainable()\n\n  invert: ->\n    if @isInOperator()\n      @invertOperator = '!'\n      return @\n    if @isChain()\n      allInvertable = yes\n      curr = this\n      while curr and curr.operator\n        allInvertable and= (curr.operator of INVERSIONS)\n        curr = curr.first\n      return new Parens(this).invert() unless allInvertable\n      curr = this\n      while curr and curr.operator\n        curr.invert = !curr.invert\n        curr.operator = INVERSIONS[curr.operator]\n        curr = curr.first\n      this\n    else if op = INVERSIONS[@operator]\n      @operator = op\n      if @first.unwrap() instanceof Op\n        @first.invert()\n      this\n    else if @second\n      new Parens(this).invert()\n    else if @operator is '!' and (fst = @first.unwrap()) instanceof Op and\n                                  fst.operator in ['!', 'in', 'instanceof']\n      fst\n    else\n      new Op '!', this\n\n  unfoldSoak: (o) ->\n    @operator in ['++', '--', 'delete'] and unfoldSoak o, this, 'first'\n\n  generateDo: (exp) ->\n    passedParams = []\n    func = if exp instanceof Assign and (ref = exp.value.unwrap()) instanceof Code\n      ref\n    else\n      exp\n    for param in func.params or []\n      if param.value\n        passedParams.push param.value\n        delete param.value\n      else\n        passedParams.push param\n    call = new Call exp, passedParams\n    call.do = yes\n    call\n\n  isInOperator: ->\n    @originalOperator is 'in'\n\n  compileNode: (o) ->\n    if @isInOperator()\n      inNode = new In @first, @second\n      return (if @invertOperator then inNode.invert() else inNode).compileNode o\n    if @invertOperator\n      @invertOperator = null\n      return @invert().compileNode(o)\n    return Op::generateDo(@first).compileNode o if @operator is 'do'\n    isChain = @isChain()\n    # In chains, there's no need to wrap bare obj literals in parens,\n    # as the chained expression is wrapped.\n    @first.front = @front unless isChain\n    @checkDeleteOperand o\n    return @compileContinuation o if @isYield() or @isAwait()\n    return @compileUnary        o if @isUnary()\n    return @compileChain        o if isChain\n    switch @operator\n      when '?'  then @compileExistence o, @second.isDefaultValue\n      when '//' then @compileFloorDivision o\n      when '%%' then @compileModulo o\n      else\n        lhs = @first.compileToFragments o, LEVEL_OP\n        rhs = @second.compileToFragments o, LEVEL_OP\n        answer = [].concat lhs, @makeCode(\" #{@operator} \"), rhs\n        if o.level <= LEVEL_OP then answer else @wrapInParentheses answer\n\n  # Mimic Python's chained comparisons when multiple comparison operators are\n  # used sequentially. For example:\n  #\n  #     bin/coffee -e 'console.log 50 < 65 > 10'\n  #     true\n  compileChain: (o) ->\n    [@first.second, shared] = @first.second.cache o\n    fst = @first.compileToFragments o, LEVEL_OP\n    fragments = fst.concat @makeCode(\" #{if @invert then '&&' else '||'} \"),\n      (shared.compileToFragments o), @makeCode(\" #{@operator} \"), (@second.compileToFragments o, LEVEL_OP)\n    @wrapInParentheses fragments\n\n  # Keep reference to the left expression, unless this an existential assignment\n  compileExistence: (o, checkOnlyUndefined) ->\n    if @first.shouldCache()\n      ref = new IdentifierLiteral o.scope.freeVariable 'ref'\n      fst = new Parens new Assign ref, @first\n    else\n      fst = @first\n      ref = fst\n    new If(new Existence(fst, checkOnlyUndefined), ref, type: 'if').addElse(@second).compileToFragments o\n\n  # Compile a unary **Op**.\n  compileUnary: (o) ->\n    parts = []\n    op = @operator\n    parts.push [@makeCode op]\n    if op is '!' and @first instanceof Existence\n      @first.negated = not @first.negated\n      return @first.compileToFragments o\n    if o.level >= LEVEL_ACCESS\n      return (new Parens this).compileToFragments o\n    plusMinus = op in ['+', '-']\n    parts.push [@makeCode(' ')] if op in ['typeof', 'delete'] or\n                      plusMinus and @first instanceof Op and @first.operator is op\n    if plusMinus and @first instanceof Op\n      @first = new Parens @first\n    parts.push @first.compileToFragments o, LEVEL_OP\n    parts.reverse() if @flip\n    @joinFragmentArrays parts, ''\n\n  compileContinuation: (o) ->\n    parts = []\n    op = @operator\n    @checkContinuation o unless @isAwait()\n    if 'expression' in Object.keys(@first) and not (@first instanceof Throw)\n      parts.push @first.expression.compileToFragments o, LEVEL_OP if @first.expression?\n    else\n      parts.push [@makeCode \"(\"] if o.level >= LEVEL_PAREN\n      parts.push [@makeCode op]\n      parts.push [@makeCode \" \"] if @first.base?.value isnt ''\n      parts.push @first.compileToFragments o, LEVEL_OP\n      parts.push [@makeCode \")\"] if o.level >= LEVEL_PAREN\n    @joinFragmentArrays parts, ''\n\n  checkContinuation: (o) ->\n    unless o.scope.parent?\n      @error \"#{@operator} can only occur inside functions\"\n    if o.scope.method?.bound and o.scope.method.isGenerator\n      @error 'yield cannot occur inside bound (fat arrow) functions'\n\n  compileFloorDivision: (o) ->\n    floor = new Value new IdentifierLiteral('Math'), [new Access new PropertyName 'floor']\n    second = if @second.shouldCache() then new Parens @second else @second\n    div = new Op '/', @first, second\n    new Call(floor, [div]).compileToFragments o\n\n  compileModulo: (o) ->\n    mod = new Value new Literal utility 'modulo', o\n    new Call(mod, [@first, @second]).compileToFragments o\n\n  toString: (idt) ->\n    super idt, @constructor.name + ' ' + @operator\n\n  checkDeleteOperand: (o) ->\n    if @operator is 'delete' and o.scope.check(@first.unwrapAll().value)\n      @error 'delete operand may not be argument or var'\n\n  astNode: (o) ->\n    @checkContinuation o if @isYield()\n    @checkDeleteOperand o\n    super o\n\n  astType: ->\n    return 'AwaitExpression' if @isAwait()\n    return 'YieldExpression' if @isYield()\n    return 'ChainedComparison' if @isChain()\n    switch @operator\n      when '||', '&&', '?' then 'LogicalExpression'\n      when '++', '--'      then 'UpdateExpression'\n      else\n        if @isUnary()      then 'UnaryExpression'\n        else                    'BinaryExpression'\n\n  operatorAst: ->\n    \"#{if @invertOperator then \"#{@invertOperator} \" else ''}#{@originalOperator}\"\n\n  chainAstProperties: (o) ->\n    operators = [@operatorAst()]\n    operands = [@second]\n    currentOp = @first\n    loop\n      operators.unshift currentOp.operatorAst()\n      operands.unshift currentOp.second\n      currentOp = currentOp.first\n      unless currentOp.isChainable()\n        operands.unshift currentOp\n        break\n    return {\n      operators\n      operands: (operand.ast(o, LEVEL_OP) for operand in operands)\n    }\n\n  astProperties: (o) ->\n    return @chainAstProperties(o) if @isChain()\n\n    firstAst = @first.ast o, LEVEL_OP\n    secondAst = @second?.ast o, LEVEL_OP\n    operatorAst = @operatorAst()\n    switch\n      when @isUnary()\n        argument =\n          if @isYield() and @first.unwrap().value is ''\n            null\n          else\n            firstAst\n        return {argument} if @isAwait()\n        return {\n          argument\n          delegate: @operator is 'yield*'\n        } if @isYield()\n        return {\n          argument\n          operator: operatorAst\n          prefix: !@flip\n        }\n      else\n        return\n          left: firstAst\n          right: secondAst\n          operator: operatorAst\n\n#### In\nexports.In = class In extends Base\n  constructor: (@object, @array) ->\n    super()\n\n  children: ['object', 'array']\n\n  invert: NEGATE\n\n  compileNode: (o) ->\n    if @array instanceof Value and @array.isArray() and @array.base.objects.length\n      for obj in @array.base.objects when obj instanceof Splat\n        hasSplat = yes\n        break\n      # `compileOrTest` only if we have an array literal with no splats\n      return @compileOrTest o unless hasSplat\n    @compileLoopTest o\n\n  compileOrTest: (o) ->\n    [sub, ref] = @object.cache o, LEVEL_OP\n    [cmp, cnj] = if @negated then [' !== ', ' && '] else [' === ', ' || ']\n    tests = []\n    for item, i in @array.base.objects\n      if i then tests.push @makeCode cnj\n      tests = tests.concat (if i then ref else sub), @makeCode(cmp), item.compileToFragments(o, LEVEL_ACCESS)\n    if o.level < LEVEL_OP then tests else @wrapInParentheses tests\n\n  compileLoopTest: (o) ->\n    [sub, ref] = @object.cache o, LEVEL_LIST\n    fragments = [].concat @makeCode(utility('indexOf', o) + \".call(\"), @array.compileToFragments(o, LEVEL_LIST),\n      @makeCode(\", \"), ref, @makeCode(\") \" + if @negated then '< 0' else '>= 0')\n    return fragments if fragmentsToText(sub) is fragmentsToText(ref)\n    fragments = sub.concat @makeCode(', '), fragments\n    if o.level < LEVEL_LIST then fragments else @wrapInParentheses fragments\n\n  toString: (idt) ->\n    super idt, @constructor.name + if @negated then '!' else ''\n\n#### Try\n\n# A classic *try/catch/finally* block.\nexports.Try = class Try extends Base\n  constructor: (@attempt, @catch, @ensure, @finallyTag) ->\n    super()\n\n  children: ['attempt', 'catch', 'ensure']\n\n  isStatement: YES\n\n  jumps: (o) -> @attempt.jumps(o) or @catch?.jumps(o)\n\n  makeReturn: (results, mark) ->\n    if mark\n      @attempt?.makeReturn results, mark\n      @catch?.makeReturn results, mark\n      return\n    @attempt = @attempt.makeReturn results if @attempt\n    @catch   = @catch  .makeReturn results if @catch\n    this\n\n  # Compilation is more or less as you would expect -- the *finally* clause\n  # is optional, the *catch* is not.\n  compileNode: (o) ->\n    originalIndent = o.indent\n    o.indent  += TAB\n    tryPart   = @attempt.compileToFragments o, LEVEL_TOP\n\n    catchPart = if @catch\n      @catch.compileToFragments merge(o, indent: originalIndent), LEVEL_TOP\n    else unless @ensure or @catch\n      generatedErrorVariableName = o.scope.freeVariable 'error', reserve: no\n      [@makeCode(\" catch (#{generatedErrorVariableName}) {}\")]\n    else\n      []\n\n    ensurePart = if @ensure then ([].concat @makeCode(\" finally {\\n\"), @ensure.compileToFragments(o, LEVEL_TOP),\n      @makeCode(\"\\n#{@tab}}\")) else []\n\n    [].concat @makeCode(\"#{@tab}try {\\n\"),\n      tryPart,\n      @makeCode(\"\\n#{@tab}}\"), catchPart, ensurePart\n\n  astType: -> 'TryStatement'\n\n  astProperties: (o) ->\n    return\n      block: @attempt.ast o, LEVEL_TOP\n      handler: @catch?.ast(o) ? null\n      finalizer:\n        if @ensure?\n          Object.assign @ensure.ast(o, LEVEL_TOP),\n            # Include `finally` keyword in location data.\n            mergeAstLocationData(\n              jisonLocationDataToAstLocationData(@finallyTag.locationData),\n              @ensure.astLocationData()\n            )\n        else\n          null\n\nexports.Catch = class Catch extends Base\n  constructor: (@recovery, @errorVariable) ->\n    super()\n    @errorVariable?.unwrap().propagateLhs? yes\n\n  children: ['recovery', 'errorVariable']\n\n  isStatement: YES\n\n  jumps: (o) -> @recovery.jumps o\n\n  makeReturn: (results, mark) ->\n    ret = @recovery.makeReturn results, mark\n    return if mark\n    @recovery = ret\n    this\n\n  compileNode: (o) ->\n    o.indent  += TAB\n    generatedErrorVariableName = o.scope.freeVariable 'error', reserve: no\n    placeholder = new IdentifierLiteral generatedErrorVariableName\n    @checkUnassignable()\n    if @errorVariable\n      @recovery.unshift new Assign @errorVariable, placeholder\n    [].concat @makeCode(\" catch (\"), placeholder.compileToFragments(o), @makeCode(\") {\\n\"),\n      @recovery.compileToFragments(o, LEVEL_TOP), @makeCode(\"\\n#{@tab}}\")\n\n  checkUnassignable: ->\n    if @errorVariable\n      message = isUnassignable @errorVariable.unwrapAll().value\n      @errorVariable.error message if message\n\n  astNode: (o) ->\n    @checkUnassignable()\n    @errorVariable?.eachName (name) ->\n      alreadyDeclared = o.scope.find name.value\n      name.isDeclaration = not alreadyDeclared\n\n    super o\n\n  astType: -> 'CatchClause'\n\n  astProperties: (o) ->\n    return\n      param: @errorVariable?.ast(o) ? null\n      body: @recovery.ast o, LEVEL_TOP\n\n#### Throw\n\n# Simple node to throw an exception.\nexports.Throw = class Throw extends Base\n  constructor: (@expression) ->\n    super()\n\n  children: ['expression']\n\n  isStatement: YES\n  jumps:       NO\n\n  # A **Throw** is already a return, of sorts...\n  makeReturn: THIS\n\n  compileNode: (o) ->\n    fragments = @expression.compileToFragments o, LEVEL_LIST\n    unshiftAfterComments fragments, @makeCode 'throw '\n    fragments.unshift @makeCode @tab\n    fragments.push @makeCode ';'\n    fragments\n\n  astType: -> 'ThrowStatement'\n\n  astProperties: (o) ->\n    return\n      argument: @expression.ast o, LEVEL_LIST\n\n#### Existence\n\n# Checks a variable for existence -- not `null` and not `undefined`. This is\n# similar to `.nil?` in Ruby, and avoids having to consult a JavaScript truth\n# table. Optionally only check if a variable is not `undefined`.\nexports.Existence = class Existence extends Base\n  constructor: (@expression, onlyNotUndefined = no) ->\n    super()\n    @comparisonTarget = if onlyNotUndefined then 'undefined' else 'null'\n    salvagedComments = []\n    @expression.traverseChildren yes, (child) ->\n      if child.comments\n        for comment in child.comments\n          salvagedComments.push comment unless comment in salvagedComments\n        delete child.comments\n    attachCommentsToNode salvagedComments, @\n    moveComments @expression, @\n\n  children: ['expression']\n\n  invert: NEGATE\n\n  compileNode: (o) ->\n    @expression.front = @front\n    code = @expression.compile o, LEVEL_OP\n    if @expression.unwrap() instanceof IdentifierLiteral and not o.scope.check code\n      [cmp, cnj] = if @negated then ['===', '||'] else ['!==', '&&']\n      code = \"typeof #{code} #{cmp} \\\"undefined\\\"\" + if @comparisonTarget isnt 'undefined' then \" #{cnj} #{code} #{cmp} #{@comparisonTarget}\" else ''\n    else\n      # We explicity want to use loose equality (`==`) when comparing against `null`,\n      # so that an existence check roughly corresponds to a check for truthiness.\n      # Do *not* change this to `===` for `null`, as this will break mountains of\n      # existing code. When comparing only against `undefined`, however, we want to\n      # use `===` because this use case is for parity with ES2015+ default values,\n      # which only get assigned when the variable is `undefined` (but not `null`).\n      cmp = if @comparisonTarget is 'null'\n        if @negated then '==' else '!='\n      else # `undefined`\n        if @negated then '===' else '!=='\n      code = \"#{code} #{cmp} #{@comparisonTarget}\"\n    [@makeCode(if o.level <= LEVEL_COND then code else \"(#{code})\")]\n\n  astType: -> 'UnaryExpression'\n\n  astProperties: (o) ->\n    return\n      argument: @expression.ast o\n      operator: '?'\n      prefix: no\n\n#### Parens\n\n# An extra set of parentheses, specified explicitly in the source. At one time\n# we tried to clean up the results by detecting and removing redundant\n# parentheses, but no longer -- you can put in as many as you please.\n#\n# Parentheses are a good way to force any statement to become an expression.\nexports.Parens = class Parens extends Base\n  constructor: (@body) ->\n    super()\n\n  children: ['body']\n\n  unwrap: -> @body\n\n  shouldCache: -> @body.shouldCache()\n\n  compileNode: (o) ->\n    expr = @body.unwrap()\n    # If these parentheses are wrapping an `IdentifierLiteral` followed by a\n    # block comment, output the parentheses (or put another way, don’t optimize\n    # away these redundant parentheses). This is because Flow requires\n    # parentheses in certain circumstances to distinguish identifiers followed\n    # by comment-based type annotations from JavaScript labels.\n    shouldWrapComment = expr.comments?.some(\n      (comment) -> comment.here and not comment.unshift and not comment.newLine)\n    if expr instanceof Value and expr.isAtomic() and not @jsxAttribute and not shouldWrapComment\n      expr.front = @front\n      return expr.compileToFragments o\n    fragments = expr.compileToFragments o, LEVEL_PAREN\n    bare = o.level < LEVEL_OP and not shouldWrapComment and (\n        expr instanceof Op and not expr.isInOperator() or expr.unwrap() instanceof Call or\n        (expr instanceof For and expr.returns)\n      ) and (o.level < LEVEL_COND or fragments.length <= 3)\n    return @wrapInBraces fragments if @jsxAttribute\n    if bare then fragments else @wrapInParentheses fragments\n\n  astNode: (o) -> @body.unwrap().ast o, LEVEL_PAREN\n\n#### StringWithInterpolations\n\nexports.StringWithInterpolations = class StringWithInterpolations extends Base\n  constructor: (@body, {@quote, @startQuote, @jsxAttribute} = {}) ->\n    super()\n\n  @fromStringLiteral: (stringLiteral) ->\n    updatedString = stringLiteral.withoutQuotesInLocationData()\n    updatedStringValue = new Value(updatedString).withLocationDataFrom updatedString\n    new StringWithInterpolations Block.wrap([updatedStringValue]), quote: stringLiteral.quote, jsxAttribute: stringLiteral.jsxAttribute\n    .withLocationDataFrom stringLiteral\n\n  children: ['body']\n\n  # `unwrap` returns `this` to stop ancestor nodes reaching in to grab @body,\n  # and using @body.compileNode. `StringWithInterpolations.compileNode` is\n  # _the_ custom logic to output interpolated strings as code.\n  unwrap: -> this\n\n  shouldCache: -> @body.shouldCache()\n\n  extractElements: (o, {includeInterpolationWrappers, isJsx} = {}) ->\n    # Assumes that `expr` is `Block`\n    expr = @body.unwrap()\n\n    elements = []\n    salvagedComments = []\n    expr.traverseChildren no, (node) =>\n      if node instanceof StringLiteral\n        if node.comments\n          salvagedComments.push node.comments...\n          delete node.comments\n        elements.push node\n        return yes\n      else if node instanceof Interpolation\n        if salvagedComments.length isnt 0\n          for comment in salvagedComments\n            comment.unshift = yes\n            comment.newLine = yes\n          attachCommentsToNode salvagedComments, node\n        if (unwrapped = node.expression?.unwrapAll()) instanceof PassthroughLiteral and unwrapped.generated and not (isJsx and o.compiling)\n          if o.compiling\n            commentPlaceholder = new StringLiteral('').withLocationDataFrom node\n            commentPlaceholder.comments = unwrapped.comments\n            (commentPlaceholder.comments ?= []).push node.comments... if node.comments\n            elements.push new Value commentPlaceholder\n          else\n            empty = new Interpolation().withLocationDataFrom node\n            empty.comments = node.comments\n            elements.push empty\n        else if node.expression or includeInterpolationWrappers\n          (node.expression?.comments ?= []).push node.comments... if node.comments\n          elements.push if includeInterpolationWrappers then node else node.expression\n        return no\n      else if node.comments\n        # This node is getting discarded, but salvage its comments.\n        if elements.length isnt 0 and elements[elements.length - 1] not instanceof StringLiteral\n          for comment in node.comments\n            comment.unshift = no\n            comment.newLine = yes\n          attachCommentsToNode node.comments, elements[elements.length - 1]\n        else\n          salvagedComments.push node.comments...\n        delete node.comments\n      return yes\n\n    elements\n\n  compileNode: (o) ->\n    @comments ?= @startQuote?.comments\n\n    if @jsxAttribute\n      wrapped = new Parens new StringWithInterpolations @body\n      wrapped.jsxAttribute = yes\n      return wrapped.compileNode o\n\n    elements = @extractElements o, isJsx: @jsx\n\n    fragments = []\n    fragments.push @makeCode '`' unless @jsx\n    for element in elements\n      if element instanceof StringLiteral\n        unquotedElementValue = if @jsx then element.unquotedValueForJSX else element.unquotedValueForTemplateLiteral\n        fragments.push @makeCode unquotedElementValue\n      else\n        fragments.push @makeCode '$' unless @jsx\n        code = element.compileToFragments(o, LEVEL_PAREN)\n        if not @isNestedTag(element) or\n           code.some((fragment) -> fragment.comments?.some((comment) -> comment.here is no))\n          code = @wrapInBraces code\n          # Flag the `{` and `}` fragments as having been generated by this\n          # `StringWithInterpolations` node, so that `compileComments` knows\n          # to treat them as bounds. But the braces are unnecessary if all of\n          # the enclosed comments are `/* */` comments. Don’t trust\n          # `fragment.type`, which can report minified variable names when\n          # this compiler is minified.\n          code[0].isStringWithInterpolations = yes\n          code[code.length - 1].isStringWithInterpolations = yes\n        fragments.push code...\n    fragments.push @makeCode '`' unless @jsx\n    fragments\n\n  isNestedTag: (element) ->\n    call = element.unwrapAll?()\n    @jsx and call instanceof JSXElement\n\n  astType: -> 'TemplateLiteral'\n\n  astProperties: (o) ->\n    elements = @extractElements o, includeInterpolationWrappers: yes\n    [..., last] = elements\n\n    quasis = []\n    expressions = []\n\n    for element, index in elements\n      if element instanceof StringLiteral\n        quasis.push new TemplateElement(\n          element.originalValue\n          tail: element is last\n        ).withLocationDataFrom(element).ast o\n      else # Interpolation\n        {expression} = element\n        node =\n          unless expression?\n            emptyInterpolation = new EmptyInterpolation()\n            emptyInterpolation.locationData = emptyExpressionLocationData {\n              interpolationNode: element\n              openingBrace: '#{'\n              closingBrace: '}'\n            }\n            emptyInterpolation\n          else\n            expression.unwrapAll()\n        expressions.push astAsBlockIfNeeded node, o\n\n    {expressions, quasis, @quote}\n\nexports.TemplateElement = class TemplateElement extends Base\n  constructor: (@value, {@tail} = {}) ->\n    super()\n\n  astProperties: ->\n    return\n      value:\n        raw: @value\n      tail: !!@tail\n\nexports.Interpolation = class Interpolation extends Base\n  constructor: (@expression) ->\n    super()\n\n  children: ['expression']\n\n# Represents the contents of an empty interpolation (e.g. `#{}`).\n# Only used during AST generation.\nexports.EmptyInterpolation = class EmptyInterpolation extends Base\n  constructor: ->\n    super()\n\n#### For\n\n# CoffeeScript's replacement for the *for* loop is our array and object\n# comprehensions, that compile into *for* loops here. They also act as an\n# expression, able to return the result of each filtered iteration.\n#\n# Unlike Python array comprehensions, they can be multi-line, and you can pass\n# the current index of the loop as a second parameter. Unlike Ruby blocks,\n# you can map and filter in a single pass.\nexports.For = class For extends While\n  constructor: (body, source) ->\n    super()\n    @addBody body\n    @addSource source\n\n  children: ['body', 'source', 'guard', 'step']\n\n  isAwait: -> @await ? no\n\n  addBody: (body) ->\n    @body = Block.wrap [body]\n    {expressions} = @body\n    if expressions.length\n      @body.locationData ?= mergeLocationData expressions[0].locationData, expressions[expressions.length - 1].locationData\n    this\n\n  addSource: (source) ->\n    {@source  = no} = source\n    attribs   = [\"name\", \"index\", \"guard\", \"step\", \"own\", \"ownTag\", \"await\", \"awaitTag\", \"object\", \"from\"]\n    @[attr]   = source[attr] ? @[attr] for attr in attribs\n    return this unless @source\n    @index.error 'cannot use index with for-from' if @from and @index\n    @ownTag.error \"cannot use own with for-#{if @from then 'from' else 'in'}\" if @own and not @object\n    [@name, @index] = [@index, @name] if @object\n    @index.error 'index cannot be a pattern matching expression' if @index?.isArray?() or @index?.isObject?()\n    @awaitTag.error 'await must be used with for-from' if @await and not @from\n    @range   = @source instanceof Value and @source.base instanceof Range and not @source.properties.length and not @from\n    @pattern = @name instanceof Value\n    @name.unwrap().propagateLhs?(yes) if @pattern\n    @index.error 'indexes do not apply to range loops' if @range and @index\n    @name.error 'cannot pattern match over range loops' if @range and @pattern\n    @returns = no\n    # Move up any comments in the “`for` line”, i.e. the line of code with `for`,\n    # from any child nodes of that line up to the `for` node itself so that these\n    # comments get output, and get output above the `for` loop.\n    for attribute in ['source', 'guard', 'step', 'name', 'index'] when @[attribute]\n      @[attribute].traverseChildren yes, (node) =>\n        if node.comments\n          # These comments are buried pretty deeply, so if they happen to be\n          # trailing comments the line they trail will be unrecognizable when\n          # we’re done compiling this `for` loop; so just shift them up to\n          # output above the `for` line.\n          comment.newLine = comment.unshift = yes for comment in node.comments\n          moveComments node, @[attribute]\n      moveComments @[attribute], @\n    this\n\n  # Welcome to the hairiest method in all of CoffeeScript. Handles the inner\n  # loop, filtering, stepping, and result saving for array, object, and range\n  # comprehensions. Some of the generated code can be shared in common, and\n  # some cannot.\n  compileNode: (o) ->\n    body        = Block.wrap [@body]\n    [..., last] = body.expressions\n    @returns    = no if last?.jumps() instanceof Return\n    source      = if @range then @source.base else @source\n    scope       = o.scope\n    name        = @name  and (@name.compile o, LEVEL_LIST) if not @pattern\n    index       = @index and (@index.compile o, LEVEL_LIST)\n    scope.find(name)  if name and not @pattern\n    scope.find(index) if index and @index not instanceof Value\n    rvar        = scope.freeVariable 'results' if @returns\n    if @from\n      ivar = scope.freeVariable 'x', single: true if @pattern\n    else\n      ivar = (@object and index) or scope.freeVariable 'i', single: true\n    kvar        = ((@range or @from) and name) or index or ivar\n    kvarAssign  = if kvar isnt ivar then \"#{kvar} = \" else \"\"\n    if @step and not @range\n      [step, stepVar] = @cacheToCodeFragments @step.cache o, LEVEL_LIST, shouldCacheOrIsAssignable\n      stepNum   = parseNumber stepVar if @step.isNumber()\n    name        = ivar if @pattern\n    varPart     = ''\n    guardPart   = ''\n    defPart     = ''\n    idt1        = @tab + TAB\n    if @range\n      forPartFragments = source.compileToFragments merge o,\n        {index: ivar, name, @step, shouldCache: shouldCacheOrIsAssignable}\n    else\n      svar    = @source.compile o, LEVEL_LIST\n      if (name or @own) and not @from and @source.unwrap() not instanceof IdentifierLiteral\n        defPart    += \"#{@tab}#{ref = scope.freeVariable 'ref'} = #{svar};\\n\"\n        svar       = ref\n      if name and not @pattern and not @from\n        namePart   = \"#{name} = #{svar}[#{kvar}]\"\n      if not @object and not @from\n        defPart += \"#{@tab}#{step};\\n\" if step isnt stepVar\n        down = stepNum < 0\n        lvar = scope.freeVariable 'len' unless @step and stepNum? and down\n        declare = \"#{kvarAssign}#{ivar} = 0, #{lvar} = #{svar}.length\"\n        declareDown = \"#{kvarAssign}#{ivar} = #{svar}.length - 1\"\n        compare = \"#{ivar} < #{lvar}\"\n        compareDown = \"#{ivar} >= 0\"\n        if @step\n          if stepNum?\n            if down\n              compare = compareDown\n              declare = declareDown\n          else\n            compare = \"#{stepVar} > 0 ? #{compare} : #{compareDown}\"\n            declare = \"(#{stepVar} > 0 ? (#{declare}) : #{declareDown})\"\n          increment = \"#{ivar} += #{stepVar}\"\n        else\n          increment = \"#{if kvar isnt ivar then \"++#{ivar}\" else \"#{ivar}++\"}\"\n        forPartFragments = [@makeCode(\"#{declare}; #{compare}; #{kvarAssign}#{increment}\")]\n    if @returns\n      resultPart   = \"#{@tab}#{rvar} = [];\\n\"\n      returnResult = \"\\n#{@tab}return #{rvar};\"\n      body.makeReturn rvar\n    if @guard\n      if body.expressions.length > 1\n        body.expressions.unshift new If (new Parens @guard).invert(), new StatementLiteral \"continue\"\n      else\n        body = Block.wrap [new If @guard, body] if @guard\n    if @pattern\n      body.expressions.unshift new Assign @name, if @from then new IdentifierLiteral kvar else new Literal \"#{svar}[#{kvar}]\"\n\n    varPart = \"\\n#{idt1}#{namePart};\" if namePart\n    if @object\n      forPartFragments = [@makeCode(\"#{kvar} in #{svar}\")]\n      guardPart = \"\\n#{idt1}if (!#{utility 'hasProp', o}.call(#{svar}, #{kvar})) continue;\" if @own\n    else if @from\n      if @await\n        forPartFragments = new Op 'await', new Parens new Literal \"#{kvar} of #{svar}\"\n        forPartFragments = forPartFragments.compileToFragments o, LEVEL_TOP\n      else\n        forPartFragments = [@makeCode(\"#{kvar} of #{svar}\")]\n    bodyFragments = body.compileToFragments merge(o, indent: idt1), LEVEL_TOP\n    if bodyFragments and bodyFragments.length > 0\n      bodyFragments = [].concat @makeCode('\\n'), bodyFragments, @makeCode('\\n')\n\n    fragments = [@makeCode(defPart)]\n    fragments.push @makeCode(resultPart) if resultPart\n    forCode = if @await then 'for ' else 'for ('\n    forClose = if @await then '' else ')'\n    fragments = fragments.concat @makeCode(@tab), @makeCode( forCode),\n      forPartFragments, @makeCode(\"#{forClose} {#{guardPart}#{varPart}\"), bodyFragments,\n      @makeCode(@tab), @makeCode('}')\n    fragments.push @makeCode(returnResult) if returnResult\n    fragments\n\n  astNode: (o) ->\n    addToScope = (name) ->\n      alreadyDeclared = o.scope.find name.value\n      name.isDeclaration = not alreadyDeclared\n    @name?.eachName addToScope, checkAssignability: no\n    @index?.eachName addToScope, checkAssignability: no\n    super o\n\n  astType: -> 'For'\n\n  astProperties: (o) ->\n    return\n      source: @source?.ast o\n      body: @body.ast o, LEVEL_TOP\n      guard: @guard?.ast(o) ? null\n      name: @name?.ast(o) ? null\n      index: @index?.ast(o) ? null\n      step: @step?.ast(o) ? null\n      postfix: !!@postfix\n      own: !!@own\n      await: !!@await\n      style: switch\n        when @from   then 'from'\n        when @object then 'of'\n        when @name   then 'in'\n        else              'range'\n\n#### Switch\n\n# A JavaScript *switch* statement. Converts into a returnable expression on-demand.\nexports.Switch = class Switch extends Base\n  constructor: (@subject, @cases, @otherwise) ->\n    super()\n\n  children: ['subject', 'cases', 'otherwise']\n\n  isStatement: YES\n\n  jumps: (o = {block: yes}) ->\n    for {block} in @cases\n      return jumpNode if jumpNode = block.jumps o\n    @otherwise?.jumps o\n\n  makeReturn: (results, mark) ->\n    block.makeReturn(results, mark) for {block} in @cases\n    @otherwise or= new Block [new Literal 'void 0'] if results\n    @otherwise?.makeReturn results, mark\n    this\n\n  compileNode: (o) ->\n    idt1 = o.indent + TAB\n    idt2 = o.indent = idt1 + TAB\n    fragments = [].concat @makeCode(@tab + \"switch (\"),\n      (if @subject then @subject.compileToFragments(o, LEVEL_PAREN) else @makeCode \"false\"),\n      @makeCode(\") {\\n\")\n    for {conditions, block}, i in @cases\n      for cond in flatten [conditions]\n        cond  = cond.invert() unless @subject\n        fragments = fragments.concat @makeCode(idt1 + \"case \"), cond.compileToFragments(o, LEVEL_PAREN), @makeCode(\":\\n\")\n      fragments = fragments.concat body, @makeCode('\\n') if (body = block.compileToFragments o, LEVEL_TOP).length > 0\n      break if i is @cases.length - 1 and not @otherwise\n      expr = @lastNode block.expressions\n      continue if expr instanceof Return or expr instanceof Throw or (expr instanceof Literal and expr.jumps() and expr.value isnt 'debugger')\n      fragments.push cond.makeCode(idt2 + 'break;\\n')\n    if @otherwise and @otherwise.expressions.length\n      fragments.push @makeCode(idt1 + \"default:\\n\"), (@otherwise.compileToFragments o, LEVEL_TOP)..., @makeCode(\"\\n\")\n    fragments.push @makeCode @tab + '}'\n    fragments\n\n  astType: -> 'SwitchStatement'\n\n  casesAst: (o) ->\n    cases = []\n\n    for kase, caseIndex in @cases\n      {conditions: tests, block: consequent} = kase\n      tests = flatten [tests]\n      lastTestIndex = tests.length - 1\n      for test, testIndex in tests\n        testConsequent =\n          if testIndex is lastTestIndex\n            consequent\n          else\n            null\n\n        caseLocationData = test.locationData\n        caseLocationData = mergeLocationData caseLocationData, testConsequent.expressions[testConsequent.expressions.length - 1].locationData if testConsequent?.expressions.length\n        caseLocationData = mergeLocationData caseLocationData, kase.locationData, justLeading: yes if testIndex is 0\n        caseLocationData = mergeLocationData caseLocationData, kase.locationData, justEnding:  yes if testIndex is lastTestIndex\n\n        cases.push new SwitchCase(test, testConsequent, trailing: testIndex is lastTestIndex).withLocationDataFrom locationData: caseLocationData\n\n    if @otherwise?.expressions.length\n      cases.push new SwitchCase(null, @otherwise).withLocationDataFrom @otherwise\n\n    kase.ast(o) for kase in cases\n\n  astProperties: (o) ->\n    return\n      discriminant: @subject?.ast(o, LEVEL_PAREN) ? null\n      cases: @casesAst o\n\nclass SwitchCase extends Base\n  constructor: (@test, @block, {@trailing} = {}) ->\n    super()\n\n  children: ['test', 'block']\n\n  astProperties: (o) ->\n    return\n      test: @test?.ast(o, LEVEL_PAREN) ? null\n      consequent: @block?.ast(o, LEVEL_TOP).body ? []\n      trailing: !!@trailing\n\nexports.SwitchWhen = class SwitchWhen extends Base\n  constructor: (@conditions, @block) ->\n    super()\n\n  children: ['conditions', 'block']\n\n#### If\n\n# *If/else* statements. Acts as an expression by pushing down requested returns\n# to the last line of each clause.\n#\n# Single-expression **Ifs** are compiled into conditional operators if possible,\n# because ternaries are already proper expressions, and don’t need conversion.\nexports.If = class If extends Base\n  constructor: (@condition, @body, options = {}) ->\n    super()\n    @elseBody  = null\n    @isChain   = false\n    {@soak, @postfix, @type} = options\n    moveComments @condition, @ if @condition.comments\n\n  children: ['condition', 'body', 'elseBody']\n\n  bodyNode:     -> @body?.unwrap()\n  elseBodyNode: -> @elseBody?.unwrap()\n\n  # Rewrite a chain of **Ifs** to add a default case as the final *else*.\n  addElse: (elseBody) ->\n    if @isChain\n      @elseBodyNode().addElse elseBody\n      @locationData = mergeLocationData @locationData, @elseBodyNode().locationData\n    else\n      @isChain  = elseBody instanceof If\n      @elseBody = @ensureBlock elseBody\n      @elseBody.updateLocationDataIfMissing elseBody.locationData\n      @locationData = mergeLocationData @locationData, @elseBody.locationData if @locationData? and @elseBody.locationData?\n    this\n\n  # The **If** only compiles into a statement if either of its bodies needs\n  # to be a statement. Otherwise a conditional operator is safe.\n  isStatement: (o) ->\n    o?.level is LEVEL_TOP or\n      @bodyNode().isStatement(o) or @elseBodyNode()?.isStatement(o)\n\n  jumps: (o) -> @body.jumps(o) or @elseBody?.jumps(o)\n\n  compileNode: (o) ->\n    if @isStatement o then @compileStatement o else @compileExpression o\n\n  makeReturn: (results, mark) ->\n    if mark\n      @body?.makeReturn results, mark\n      @elseBody?.makeReturn results, mark\n      return\n    @elseBody  or= new Block [new Literal 'void 0'] if results\n    @body     and= new Block [@body.makeReturn results]\n    @elseBody and= new Block [@elseBody.makeReturn results]\n    this\n\n  ensureBlock: (node) ->\n    if node instanceof Block then node else new Block [node]\n\n  # Compile the `If` as a regular *if-else* statement. Flattened chains\n  # force inner *else* bodies into statement form.\n  compileStatement: (o) ->\n    child    = del o, 'chainChild'\n    exeq     = del o, 'isExistentialEquals'\n\n    if exeq\n      return new If(@processedCondition().invert(), @elseBodyNode(), type: 'if').compileToFragments o\n\n    indent   = o.indent + TAB\n    cond     = @processedCondition().compileToFragments o, LEVEL_PAREN\n    body     = @ensureBlock(@body).compileToFragments merge o, {indent}\n    ifPart   = [].concat @makeCode(\"if (\"), cond, @makeCode(\") {\\n\"), body, @makeCode(\"\\n#{@tab}}\")\n    ifPart.unshift @makeCode @tab unless child\n    return ifPart unless @elseBody\n    answer = ifPart.concat @makeCode(' else ')\n    if @isChain\n      o.chainChild = yes\n      answer = answer.concat @elseBody.unwrap().compileToFragments o, LEVEL_TOP\n    else\n      answer = answer.concat @makeCode(\"{\\n\"), @elseBody.compileToFragments(merge(o, {indent}), LEVEL_TOP), @makeCode(\"\\n#{@tab}}\")\n    answer\n\n  # Compile the `If` as a conditional operator.\n  compileExpression: (o) ->\n    cond = @processedCondition().compileToFragments o, LEVEL_COND\n    body = @bodyNode().compileToFragments o, LEVEL_LIST\n    alt  = if @elseBodyNode() then @elseBodyNode().compileToFragments(o, LEVEL_LIST) else [@makeCode('void 0')]\n    fragments = cond.concat @makeCode(\" ? \"), body, @makeCode(\" : \"), alt\n    if o.level >= LEVEL_COND then @wrapInParentheses fragments else fragments\n\n  unfoldSoak: ->\n    @soak and this\n\n  processedCondition: ->\n    @processedConditionCache ?= if @type is 'unless' then @condition.invert() else @condition\n\n  isStatementAst: (o) ->\n    o.level is LEVEL_TOP\n\n  astType: (o) ->\n    if @isStatementAst o\n      'IfStatement'\n    else\n      'ConditionalExpression'\n\n  astProperties: (o) ->\n    isStatement = @isStatementAst o\n\n    return\n      test: @condition.ast o, if isStatement then LEVEL_PAREN else LEVEL_COND\n      consequent:\n        if isStatement\n          @body.ast o, LEVEL_TOP\n        else\n          @bodyNode().ast o, LEVEL_TOP\n      alternate:\n        if @isChain\n          @elseBody.unwrap().ast o, if isStatement then LEVEL_TOP else LEVEL_COND\n        else if not isStatement and @elseBody?.expressions?.length is 1\n          @elseBody.expressions[0].ast o, LEVEL_TOP\n        else\n          @elseBody?.ast(o, LEVEL_TOP) ? null\n      postfix: !!@postfix\n      inverted: @type is 'unless'\n\n# A sequence expression e.g. `(a; b)`.\n# Currently only used during AST generation.\nexports.Sequence = class Sequence extends Base\n  children: ['expressions']\n\n  constructor: (@expressions) ->\n    super()\n\n  astNode: (o) ->\n    return @expressions[0].ast(o) if @expressions.length is 1\n    super o\n\n  astType: -> 'SequenceExpression'\n\n  astProperties: (o) ->\n    return\n      expressions:\n        expression.ast(o) for expression in @expressions\n\n# Constants\n# ---------\n\nUTILITIES =\n  modulo: -> 'function(a, b) { return (+a % (b = +b) + b) % b; }'\n\n  boundMethodCheck: -> \"\n    function(instance, Constructor) {\n      if (!(instance instanceof Constructor)) {\n        throw new Error('Bound instance method accessed before binding');\n      }\n    }\n  \"\n\n  # Shortcuts to speed up the lookup time for native functions.\n  hasProp: -> '{}.hasOwnProperty'\n  indexOf: -> '[].indexOf'\n  slice  : -> '[].slice'\n  splice : -> '[].splice'\n\n# Levels indicate a node's position in the AST. Useful for knowing if\n# parens are necessary or superfluous.\nLEVEL_TOP    = 1  # ...;\nLEVEL_PAREN  = 2  # (...)\nLEVEL_LIST   = 3  # [...]\nLEVEL_COND   = 4  # ... ? x : y\nLEVEL_OP     = 5  # !...\nLEVEL_ACCESS = 6  # ...[0]\n\n# Tabs are two spaces for pretty printing.\nTAB = '  '\n\nSIMPLENUM = /^[+-]?\\d+(?:_\\d+)*$/\nSIMPLE_STRING_OMIT = /\\s*\\n\\s*/g\nLEADING_BLANK_LINE  = /^[^\\n\\S]*\\n/\nTRAILING_BLANK_LINE = /\\n[^\\n\\S]*$/\nSTRING_OMIT    = ///\n    ((?:\\\\\\\\)+)      # Consume (and preserve) an even number of backslashes.\n  | \\\\[^\\S\\n]*\\n\\s*  # Remove escaped newlines.\n///g\nHEREGEX_OMIT = ///\n    ((?:\\\\\\\\)+)     # Consume (and preserve) an even number of backslashes.\n  | \\\\(\\s)          # Preserve escaped whitespace.\n  | \\s+(?:#.*)?     # Remove whitespace and comments.\n///g\n\n# Helper Functions\n# ----------------\n\n# Helper for ensuring that utility functions are assigned at the top level.\nutility = (name, o) ->\n  {root} = o.scope\n  if name of root.utilities\n    root.utilities[name]\n  else\n    ref = root.freeVariable name\n    root.assign ref, UTILITIES[name] o\n    root.utilities[name] = ref\n\nmultident = (code, tab, includingFirstLine = yes) ->\n  endsWithNewLine = code[code.length - 1] is '\\n'\n  code = (if includingFirstLine then tab else '') + code.replace /\\n/g, \"$&#{tab}\"\n  code = code.replace /\\s+$/, ''\n  code = code + '\\n' if endsWithNewLine\n  code\n\n# Wherever in CoffeeScript 1 we might’ve inserted a `makeCode \"#{@tab}\"` to\n# indent a line of code, now we must account for the possibility of comments\n# preceding that line of code. If there are such comments, indent each line of\n# such comments, and _then_ indent the first following line of code.\nindentInitial = (fragments, node) ->\n  for fragment, fragmentIndex in fragments\n    if fragment.isHereComment\n      fragment.code = multident fragment.code, node.tab\n    else\n      fragments.splice fragmentIndex, 0, node.makeCode \"#{node.tab}\"\n      break\n  fragments\n\nhasLineComments = (node) ->\n  return no unless node.comments\n  for comment in node.comments\n    return yes if comment.here is no\n  return no\n\n# Move the `comments` property from one object to another, deleting it from\n# the first object.\nmoveComments = (from, to) ->\n  return unless from?.comments\n  attachCommentsToNode from.comments, to\n  delete from.comments\n\n# Sometimes when compiling a node, we want to insert a fragment at the start\n# of an array of fragments; but if the start has one or more comment fragments,\n# we want to insert this fragment after those but before any non-comments.\nunshiftAfterComments = (fragments, fragmentToInsert) ->\n  inserted = no\n  for fragment, fragmentIndex in fragments when not fragment.isComment\n    fragments.splice fragmentIndex, 0, fragmentToInsert\n    inserted = yes\n    break\n  fragments.push fragmentToInsert unless inserted\n  fragments\n\nisLiteralArguments = (node) ->\n  node instanceof IdentifierLiteral and node.value is 'arguments'\n\nisLiteralThis = (node) ->\n  node instanceof ThisLiteral or (node instanceof Code and node.bound)\n\nshouldCacheOrIsAssignable = (node) -> node.shouldCache() or node.isAssignable?()\n\n# Unfold a node's child if soak, then tuck the node under created `If`\nunfoldSoak = (o, parent, name) ->\n  return unless ifn = parent[name].unfoldSoak o\n  parent[name] = ifn.body\n  ifn.body = new Value parent\n  ifn\n\n# Constructs a string or regex by escaping certain characters.\nmakeDelimitedLiteral = (body, {delimiter: delimiterOption, escapeNewlines, double, includeDelimiters = yes, escapeDelimiter = yes, convertTrailingNullEscapes} = {}) ->\n  body = '(?:)' if body is '' and delimiterOption is '/'\n  escapeTemplateLiteralCurlies = delimiterOption is '`'\n  regex = ///\n      (\\\\\\\\)                               # Escaped backslash.\n    | (\\\\0(?=\\d))                          # Null character mistaken as octal escape.\n    #{\n      if convertTrailingNullEscapes\n        /// | (\\\\0) $ ///.source           # Trailing null character that could be mistaken as octal escape.\n      else\n        ''\n    }\n    #{\n      if escapeDelimiter\n        /// | \\\\?(#{delimiterOption}) ///.source # (Possibly escaped) delimiter.\n      else\n        ''\n    }\n    #{\n      if escapeTemplateLiteralCurlies\n        /// | \\\\?(\\$\\{) ///.source         # `${` inside template literals must be escaped.\n      else\n        ''\n    }\n    | \\\\?(?:\n        #{if escapeNewlines then '(\\n)|' else ''}\n          (\\r)\n        | (\\u2028)\n        | (\\u2029)\n      )                                    # (Possibly escaped) newlines.\n    | (\\\\.)                                # Other escapes.\n  ///g\n  body = body.replace regex, (match, backslash, nul, ...args) ->\n    trailingNullEscape =\n      args.shift() if convertTrailingNullEscapes\n    delimiter =\n      args.shift() if escapeDelimiter\n    templateLiteralCurly =\n      args.shift() if escapeTemplateLiteralCurlies\n    lf =\n      args.shift() if escapeNewlines\n    [cr, ls, ps, other] = args\n    switch\n      # Ignore escaped backslashes.\n      when backslash then (if double then backslash + backslash else backslash)\n      when nul                  then '\\\\x00'\n      when trailingNullEscape   then \"\\\\x00\"\n      when delimiter            then \"\\\\#{delimiter}\"\n      when templateLiteralCurly then \"\\\\${\"\n      when lf                   then '\\\\n'\n      when cr                   then '\\\\r'\n      when ls                   then '\\\\u2028'\n      when ps                   then '\\\\u2029'\n      when other                then (if double then \"\\\\#{other}\" else other)\n  printedDelimiter = if includeDelimiters then delimiterOption else ''\n  \"#{printedDelimiter}#{body}#{printedDelimiter}\"\n\nsniffDirectives = (expressions, {notFinalExpression} = {}) ->\n  index = 0\n  lastIndex = expressions.length - 1\n  while index <= lastIndex\n    break if index is lastIndex and notFinalExpression\n    expression = expressions[index]\n    if (unwrapped = expression?.unwrap?()) instanceof PassthroughLiteral and unwrapped.generated\n      index++\n      continue\n    break unless expression instanceof Value and expression.isString() and not expression.unwrap().shouldGenerateTemplateLiteral()\n    expressions[index] =\n      new Directive expression\n      .withLocationDataFrom expression\n    index++\n\nastAsBlockIfNeeded = (node, o) ->\n  unwrapped = node.unwrap()\n  if unwrapped instanceof Block and unwrapped.expressions.length > 1\n    unwrapped.makeReturn null, yes\n    unwrapped.ast o, LEVEL_TOP\n  else\n    node.ast o, LEVEL_PAREN\n\n# Helpers for `mergeLocationData` and `mergeAstLocationData` below.\nlesser  = (a, b) -> if a < b then a else b\ngreater = (a, b) -> if a > b then a else b\n\nisAstLocGreater = (a, b) ->\n  return yes if a.line > b.line\n  return no unless a.line is b.line\n  a.column > b.column\n\nisLocationDataStartGreater = (a, b) ->\n  return yes if a.first_line > b.first_line\n  return no unless a.first_line is b.first_line\n  a.first_column > b.first_column\n\nisLocationDataEndGreater = (a, b) ->\n  return yes if a.last_line > b.last_line\n  return no unless a.last_line is b.last_line\n  a.last_column > b.last_column\n\n# Take two nodes’ location data and return a new `locationData` object that\n# encompasses the location data of both nodes. So the new `first_line` value\n# will be the earlier of the two nodes’ `first_line` values, the new\n# `last_column` the later of the two nodes’ `last_column` values, etc.\n#\n# If you only want to extend the first node’s location data with the start or\n# end location data of the second node, pass the `justLeading` or `justEnding`\n# options. So e.g. if `first`’s range is [4, 5] and `second`’s range is [1, 10],\n# you’d get:\n# ```\n# mergeLocationData(first, second).range                   # [1, 10]\n# mergeLocationData(first, second, justLeading: yes).range # [1, 5]\n# mergeLocationData(first, second, justEnding:  yes).range # [4, 10]\n# ```\nexports.mergeLocationData = mergeLocationData = (locationDataA, locationDataB, {justLeading, justEnding} = {}) ->\n  return Object.assign(\n    if justEnding\n      first_line:   locationDataA.first_line\n      first_column: locationDataA.first_column\n    else\n      if isLocationDataStartGreater locationDataA, locationDataB\n        first_line:   locationDataB.first_line\n        first_column: locationDataB.first_column\n      else\n        first_line:   locationDataA.first_line\n        first_column: locationDataA.first_column\n  ,\n    if justLeading\n      last_line:             locationDataA.last_line\n      last_column:           locationDataA.last_column\n      last_line_exclusive:   locationDataA.last_line_exclusive\n      last_column_exclusive: locationDataA.last_column_exclusive\n    else\n      if isLocationDataEndGreater locationDataA, locationDataB\n        last_line:             locationDataA.last_line\n        last_column:           locationDataA.last_column\n        last_line_exclusive:   locationDataA.last_line_exclusive\n        last_column_exclusive: locationDataA.last_column_exclusive\n      else\n        last_line:             locationDataB.last_line\n        last_column:           locationDataB.last_column\n        last_line_exclusive:   locationDataB.last_line_exclusive\n        last_column_exclusive: locationDataB.last_column_exclusive\n  ,\n    range: [\n      if justEnding\n        locationDataA.range[0]\n      else\n        lesser locationDataA.range[0], locationDataB.range[0]\n    ,\n      if justLeading\n        locationDataA.range[1]\n      else\n        greater locationDataA.range[1], locationDataB.range[1]\n    ]\n  )\n\n# Take two AST nodes, or two AST nodes’ location data objects, and return a new\n# location data object that encompasses the location data of both nodes. So the\n# new `start` value will be the earlier of the two nodes’ `start` values, the\n# new `end` value will be the later of the two nodes’ `end` values, etc.\n#\n# If you only want to extend the first node’s location data with the start or\n# end location data of the second node, pass the `justLeading` or `justEnding`\n# options. So e.g. if `first`’s range is [4, 5] and `second`’s range is [1, 10],\n# you’d get:\n# ```\n# mergeAstLocationData(first, second).range                   # [1, 10]\n# mergeAstLocationData(first, second, justLeading: yes).range # [1, 5]\n# mergeAstLocationData(first, second, justEnding:  yes).range # [4, 10]\n# ```\nexports.mergeAstLocationData = mergeAstLocationData = (nodeA, nodeB, {justLeading, justEnding} = {}) ->\n  return\n    loc:\n      start:\n        if justEnding\n          nodeA.loc.start\n        else\n          if isAstLocGreater nodeA.loc.start, nodeB.loc.start\n            nodeB.loc.start\n          else\n            nodeA.loc.start\n      end:\n        if justLeading\n          nodeA.loc.end\n        else\n          if isAstLocGreater nodeA.loc.end, nodeB.loc.end\n            nodeA.loc.end\n          else\n            nodeB.loc.end\n    range: [\n      if justEnding\n        nodeA.range[0]\n      else\n        lesser nodeA.range[0], nodeB.range[0]\n    ,\n      if justLeading\n        nodeA.range[1]\n      else\n        greater nodeA.range[1], nodeB.range[1]\n    ]\n    start:\n      if justEnding\n        nodeA.start\n      else\n        lesser nodeA.start, nodeB.start\n    end:\n      if justLeading\n        nodeA.end\n      else\n        greater nodeA.end, nodeB.end\n\n# Convert Jison-style node class location data to Babel-style location data\nexports.jisonLocationDataToAstLocationData = jisonLocationDataToAstLocationData = ({first_line, first_column, last_line_exclusive, last_column_exclusive, range}) ->\n  return\n    loc:\n      start:\n        line:   first_line + 1\n        column: first_column\n      end:\n        line:   last_line_exclusive + 1\n        column: last_column_exclusive\n    range: [\n      range[0]\n      range[1]\n    ]\n    start: range[0]\n    end:   range[1]\n\n# Generate a zero-width location data that corresponds to the end of another node’s location.\nzeroWidthLocationDataFromEndLocation = ({range: [, endRange], last_line_exclusive, last_column_exclusive}) -> {\n  first_line: last_line_exclusive\n  first_column: last_column_exclusive\n  last_line: last_line_exclusive\n  last_column: last_column_exclusive\n  last_line_exclusive\n  last_column_exclusive\n  range: [endRange, endRange]\n}\n\nextractSameLineLocationDataFirst = (numChars) -> ({range: [startRange], first_line, first_column}) -> {\n  first_line\n  first_column\n  last_line: first_line\n  last_column: first_column + numChars - 1\n  last_line_exclusive: first_line\n  last_column_exclusive: first_column + numChars\n  range: [startRange, startRange + numChars]\n}\n\nextractSameLineLocationDataLast = (numChars) -> ({range: [, endRange], last_line, last_column, last_line_exclusive, last_column_exclusive}) -> {\n  first_line: last_line\n  first_column: last_column - (numChars - 1)\n  last_line: last_line\n  last_column: last_column\n  last_line_exclusive\n  last_column_exclusive\n  range: [endRange - numChars, endRange]\n}\n\n# We don’t currently have a token corresponding to the empty space\n# between interpolation/JSX expression braces, so piece together the location\n# data by trimming the braces from the Interpolation’s location data.\n# Technically the last_line/last_column calculation here could be\n# incorrect if the ending brace is preceded by a newline, but\n# last_line/last_column aren’t used for AST generation anyway.\nemptyExpressionLocationData = ({interpolationNode: element, openingBrace, closingBrace}) ->\n  first_line:            element.locationData.first_line\n  first_column:          element.locationData.first_column + openingBrace.length\n  last_line:             element.locationData.last_line\n  last_column:           element.locationData.last_column - closingBrace.length\n  last_line_exclusive:   element.locationData.last_line\n  last_column_exclusive: element.locationData.last_column\n  range: [\n    element.locationData.range[0] + openingBrace.length\n    element.locationData.range[1] - closingBrace.length\n  ]\n"
  },
  {
    "path": "src/optparse.coffee",
    "content": "{repeat} = require './helpers'\n\n# A simple **OptionParser** class to parse option flags from the command-line.\n# Use it like so:\n#\n#     parser  = new OptionParser switches, helpBanner\n#     options = parser.parse process.argv\n#\n# The first non-option is considered to be the start of the file (and file\n# option) list, and all subsequent arguments are left unparsed.\n#\n# The `coffee` command uses an instance of **OptionParser** to parse its\n# command-line arguments in `src/command.coffee`.\nexports.OptionParser = class OptionParser\n\n  # Initialize with a list of valid options, in the form:\n  #\n  #     [short-flag, long-flag, description]\n  #\n  # Along with an optional banner for the usage help.\n  constructor: (ruleDeclarations, @banner) ->\n    @rules = buildRules ruleDeclarations\n\n  # Parse the list of arguments, populating an `options` object with all of the\n  # specified options, and return it. Options after the first non-option\n  # argument are treated as arguments. `options.arguments` will be an array\n  # containing the remaining arguments. This is a simpler API than many option\n  # parsers that allow you to attach callback actions for every flag. Instead,\n  # you're responsible for interpreting the options object.\n  parse: (args) ->\n    # The CoffeeScript option parser is a little odd; options after the first\n    # non-option argument are treated as non-option arguments themselves.\n    # Optional arguments are normalized by expanding merged flags into multiple\n    # flags. This allows you to have `-wl` be the same as `--watch --lint`.\n    # Note that executable scripts with a shebang (`#!`) line should use the\n    # line `#!/usr/bin/env coffee`, or `#!/absolute/path/to/coffee`, without a\n    # `--` argument after, because that will fail on Linux (see #3946).\n    {rules, positional} = normalizeArguments args, @rules.flagDict\n    options = {}\n\n    # The `argument` field is added to the rule instance non-destructively by\n    # `normalizeArguments`.\n    for {hasArgument, argument, isList, name} in rules\n      if hasArgument\n        if isList\n          options[name] ?= []\n          options[name].push argument\n        else\n          options[name] = argument\n      else\n        options[name] = true\n\n    if positional[0] is '--'\n      options.doubleDashed = yes\n      positional = positional[1..]\n\n    options.arguments = positional\n    options\n\n  # Return the help text for this **OptionParser**, listing and describing all\n  # of the valid options, for `--help` and such.\n  help: ->\n    lines = []\n    lines.unshift \"#{@banner}\\n\" if @banner\n    for rule in @rules.ruleList\n      spaces  = 15 - rule.longFlag.length\n      spaces  = if spaces > 0 then repeat ' ', spaces else ''\n      letPart = if rule.shortFlag then rule.shortFlag + ', ' else '    '\n      lines.push '  ' + letPart + rule.longFlag + spaces + rule.description\n    \"\\n#{ lines.join('\\n') }\\n\"\n\n# Helpers\n# -------\n\n# Regex matchers for option flags on the command line and their rules.\nLONG_FLAG  = /^(--\\w[\\w\\-]*)/\nSHORT_FLAG = /^(-\\w)$/\nMULTI_FLAG = /^-(\\w{2,})/\n# Matches the long flag part of a rule for an option with an argument. Not\n# applied to anything in process.argv.\nOPTIONAL   = /\\[(\\w+(\\*?))\\]/\n\n# Build and return the list of option rules. If the optional *short-flag* is\n# unspecified, leave it out by padding with `null`.\nbuildRules = (ruleDeclarations) ->\n  ruleList = for tuple in ruleDeclarations\n    tuple.unshift null if tuple.length < 3\n    buildRule tuple...\n  flagDict = {}\n  for rule in ruleList\n    # `shortFlag` is null if not provided in the rule.\n    for flag in [rule.shortFlag, rule.longFlag] when flag?\n      if flagDict[flag]?\n        throw new Error \"flag #{flag} for switch #{rule.name}\n          was already declared for switch #{flagDict[flag].name}\"\n      flagDict[flag] = rule\n\n  {ruleList, flagDict}\n\n# Build a rule from a `-o` short flag, a `--output [DIR]` long flag, and the\n# description of what the option does.\nbuildRule = (shortFlag, longFlag, description) ->\n  match     = longFlag.match(OPTIONAL)\n  shortFlag = shortFlag?.match(SHORT_FLAG)[1]\n  longFlag  = longFlag.match(LONG_FLAG)[1]\n  {\n    name:         longFlag.replace /^--/, ''\n    shortFlag:    shortFlag\n    longFlag:     longFlag\n    description:  description\n    hasArgument:  !!(match and match[1])\n    isList:       !!(match and match[2])\n  }\n\nnormalizeArguments = (args, flagDict) ->\n  rules = []\n  positional = []\n  needsArgOpt = null\n  for arg, argIndex in args\n    # If the previous argument given to the script was an option that uses the\n    # next command-line argument as its argument, create copy of the option’s\n    # rule with an `argument` field.\n    if needsArgOpt?\n      withArg = Object.assign {}, needsArgOpt.rule, {argument: arg}\n      rules.push withArg\n      needsArgOpt = null\n      continue\n\n    multiFlags = arg.match(MULTI_FLAG)?[1]\n      .split('')\n      .map (flagName) -> \"-#{flagName}\"\n    if multiFlags?\n      multiOpts = multiFlags.map (flag) ->\n        rule = flagDict[flag]\n        unless rule?\n          throw new Error \"unrecognized option #{flag} in multi-flag #{arg}\"\n        {rule, flag}\n      # Only the last flag in a multi-flag may have an argument.\n      [innerOpts..., lastOpt] = multiOpts\n      for {rule, flag} in innerOpts\n        if rule.hasArgument\n          throw new Error \"cannot use option #{flag} in multi-flag #{arg} except\n          as the last option, because it needs an argument\"\n        rules.push rule\n      if lastOpt.rule.hasArgument\n        needsArgOpt = lastOpt\n      else\n        rules.push lastOpt.rule\n    else if ([LONG_FLAG, SHORT_FLAG].some (pat) -> arg.match(pat)?)\n      singleRule = flagDict[arg]\n      unless singleRule?\n        throw new Error \"unrecognized option #{arg}\"\n      if singleRule.hasArgument\n        needsArgOpt = {rule: singleRule, flag: arg}\n      else\n        rules.push singleRule\n    else\n      # This is a positional argument.\n      positional = args[argIndex..]\n      break\n\n  if needsArgOpt?\n    throw new Error \"value required for #{needsArgOpt.flag}, but it was the last\n    argument provided\"\n  {rules, positional}\n"
  },
  {
    "path": "src/register.coffee",
    "content": "CoffeeScript  = require './'\nchild_process = require 'child_process'\nhelpers       = require './helpers'\npath          = require 'path'\n\n{patchStackTrace} = CoffeeScript\n\n# Check if Node's built-in source map stack trace transformations are enabled.\nnodeSourceMapsSupportEnabled = process? and (\n  process.execArgv.includes('--enable-source-maps') or\n  process.env.NODE_OPTIONS?.includes('--enable-source-maps')\n)\n\nunless Error.prepareStackTrace or nodeSourceMapsSupportEnabled\n  cacheSourceMaps = true\n  patchStackTrace()\n\n# Load and run a CoffeeScript file for Node, stripping any `BOM`s.\nloadFile = (module, filename) ->\n  options = module.options or getRootModule(module).options or {}\n\n  # Currently `CoffeeScript.compile` caches all source maps if present. They\n  # are available in `getSourceMap` retrieved by `filename`.\n  if cacheSourceMaps or nodeSourceMapsSupportEnabled\n    options.inlineMap = true\n  js = CoffeeScript._compileFile filename, options\n\n  module._compile js, filename\n\n# If the installed version of Node supports `require.extensions`, register\n# CoffeeScript as an extension.\nif require.extensions\n  for ext in CoffeeScript.FILE_EXTENSIONS\n    require.extensions[ext] = loadFile\n\n  # Patch Node's module loader to be able to handle multi-dot extensions.\n  # This is a horrible thing that should not be required.\n  Module = require 'module'\n\n  findExtension = (filename) ->\n    extensions = path.basename(filename).split '.'\n    # Remove the initial dot from dotfiles.\n    extensions.shift() if extensions[0] is ''\n    # Start with the longest possible extension and work our way shortwards.\n    while extensions.shift()\n      curExtension = '.' + extensions.join '.'\n      return curExtension if Module._extensions[curExtension]\n    '.js'\n\n  Module::load = (filename) ->\n    @filename = filename\n    @paths = Module._nodeModulePaths path.dirname filename\n    extension = findExtension filename\n    Module._extensions[extension](this, filename)\n    @loaded = true\n\n# If we're on Node, patch `child_process.fork` so that Coffee scripts are able\n# to fork both CoffeeScript files, and JavaScript files, directly.\nif child_process\n  {fork} = child_process\n  binary = require.resolve '../../bin/coffee'\n  child_process.fork = (path, args, options) ->\n    if helpers.isCoffee path\n      unless Array.isArray args\n        options = args or {}\n        args = []\n      args = [path].concat args\n      path = binary\n    fork path, args, options\n\n# Utility function to find the `options` object attached to the topmost module.\ngetRootModule = (module) ->\n  if module.parent then getRootModule module.parent else module\n"
  },
  {
    "path": "src/repl.coffee",
    "content": "fs = require 'fs'\npath = require 'path'\nvm = require 'vm'\nnodeREPL = require 'repl'\nCoffeeScript = require './'\n{merge, updateSyntaxError} = require './helpers'\n\nsawSIGINT = no\ntranspile = no\n\nreplDefaults =\n  prompt: 'coffee> ',\n  historyFile: do ->\n    historyPath = process.env.XDG_CACHE_HOME or process.env.HOME\n    path.join historyPath, '.coffee_history' if historyPath\n  historyMaxInputSize: 10240\n  eval: (input, context, filename, cb) ->\n    # XXX: multiline hack.\n    input = input.replace /\\uFF00/g, '\\n'\n    # Node's REPL sends the input ending with a newline and then wrapped in\n    # parens. Unwrap all that.\n    input = input.replace /^\\(([\\s\\S]*)\\n\\)$/m, '$1'\n    # Node's REPL v6.9.1+ sends the input wrapped in a try/catch statement.\n    # Unwrap that too.\n    input = input.replace /^\\s*try\\s*{([\\s\\S]*)}\\s*catch.*$/m, '$1'\n\n    # Require AST nodes to do some AST manipulation.\n    {Block, Assign, Value, Literal, Call, Code, Root} = require './nodes'\n\n    try\n      # Tokenize the clean input.\n      tokens = CoffeeScript.tokens input\n      # Filter out tokens generated just to hold comments.\n      if tokens.length >= 2 and tokens[0].generated and\n         tokens[0].comments?.length isnt 0 and \"#{tokens[0][1]}\" is '' and\n         tokens[1][0] is 'TERMINATOR'\n        tokens = tokens[2...]\n      if tokens.length >= 1 and tokens[tokens.length - 1].generated and\n         tokens[tokens.length - 1].comments?.length isnt 0 and \"#{tokens[tokens.length - 1][1]}\" is ''\n        tokens.pop()\n      # Collect referenced variable names just like in `CoffeeScript.compile`.\n      referencedVars = (token[1] for token in tokens when token[0] is 'IDENTIFIER')\n      # Generate the AST of the tokens.\n      ast = CoffeeScript.nodes(tokens).body\n      # Add assignment to `__` variable to force the input to be an expression.\n      ast = new Block [new Assign (new Value new Literal '__'), ast, '=']\n      # Wrap the expression in a closure to support top-level `await`.\n      ast     = new Code [], ast\n      isAsync = ast.isAsync\n      # Invoke the wrapping closure.\n      ast    = new Root new Block [new Call ast]\n      js     = ast.compile {bare: yes, locals: Object.keys(context), referencedVars, sharedScope: yes}\n      if transpile\n        js = transpile.transpile(js, transpile.options).code\n        # Strip `\"use strict\"`, to avoid an exception on assigning to\n        # undeclared variable `__`.\n        js = js.replace /^\"use strict\"|^'use strict'/, ''\n      result = runInContext js, context, filename\n      # Await an async result, if necessary.\n      if isAsync\n        result.then (resolvedResult) ->\n          cb null, resolvedResult unless sawSIGINT\n        sawSIGINT = no\n      else\n        cb null, result\n    catch err\n      # AST's `compile` does not add source code information to syntax errors.\n      updateSyntaxError err, input\n      cb err\n\nrunInContext = (js, context, filename) ->\n  if context is global\n    vm.runInThisContext js, filename\n  else\n    vm.runInContext js, context, filename\n\naddMultilineHandler = (repl) ->\n  {inputStream, outputStream} = repl\n  # Node 0.11.12 changed API, prompt is now _prompt.\n  origPrompt = repl._prompt ? repl.prompt\n\n  multiline =\n    enabled: off\n    initialPrompt: origPrompt.replace /^[^> ]*/, (x) -> x.replace /./g, '-'\n    prompt: origPrompt.replace /^[^> ]*>?/, (x) -> x.replace /./g, '.'\n    buffer: ''\n\n  # Proxy node's line listener\n  nodeLineListener = repl.listeners('line')[0]\n  repl.removeListener 'line', nodeLineListener\n  repl.on 'line', (cmd) ->\n    if multiline.enabled\n      multiline.buffer += \"#{cmd}\\n\"\n      repl.setPrompt multiline.prompt\n      repl.prompt true\n    else\n      repl.setPrompt origPrompt\n      nodeLineListener cmd\n    return\n\n  # Handle Ctrl-v\n  inputStream.on 'keypress', (char, key) ->\n    return unless key and key.ctrl and not key.meta and not key.shift and key.name is 'v'\n    if multiline.enabled\n      # allow arbitrarily switching between modes any time before multiple lines are entered\n      unless multiline.buffer.match /\\n/\n        multiline.enabled = not multiline.enabled\n        repl.setPrompt origPrompt\n        repl.prompt true\n        return\n      # no-op unless the current line is empty\n      return if repl.line? and not repl.line.match /^\\s*$/\n      # eval, print, loop\n      multiline.enabled = not multiline.enabled\n      repl.line = ''\n      repl.cursor = 0\n      repl.output.cursorTo 0\n      repl.output.clearLine 1\n      # XXX: multiline hack\n      multiline.buffer = multiline.buffer.replace /\\n/g, '\\uFF00'\n      repl.emit 'line', multiline.buffer\n      multiline.buffer = ''\n    else\n      multiline.enabled = not multiline.enabled\n      repl.setPrompt multiline.initialPrompt\n      repl.prompt true\n    return\n\n# Store and load command history from a file\naddHistory = (repl, filename, maxSize) ->\n  lastLine = null\n  try\n    # Get file info and at most maxSize of command history\n    stat = fs.statSync filename\n    size = Math.min maxSize, stat.size\n    # Read last `size` bytes from the file\n    readFd = fs.openSync filename, 'r'\n    buffer = Buffer.alloc size\n    fs.readSync readFd, buffer, 0, size, stat.size - size\n    fs.closeSync readFd\n    # Set the history on the interpreter\n    repl.history = buffer.toString().split('\\n').reverse()\n    # If the history file was truncated we should pop off a potential partial line\n    repl.history.pop() if stat.size > maxSize\n    # Shift off the final blank newline\n    repl.history.shift() if repl.history[0] is ''\n    repl.historyIndex = -1\n    lastLine = repl.history[0]\n\n  fd = fs.openSync filename, 'a'\n\n  repl.addListener 'line', (code) ->\n    if code and code.length and code isnt '.history' and code isnt '.exit' and lastLine isnt code\n      # Save the latest command in the file\n      fs.writeSync fd, \"#{code}\\n\"\n      lastLine = code\n\n  # XXX: The SIGINT event from REPLServer is undocumented, so this is a bit fragile\n  repl.on 'SIGINT', -> sawSIGINT = yes\n  repl.on 'exit', -> fs.closeSync fd\n\n  # Add a command to show the history stack\n  repl.commands[getCommandId(repl, 'history')] =\n    help: 'Show command history'\n    action: ->\n      repl.outputStream.write \"#{repl.history[..].reverse().join '\\n'}\\n\"\n      repl.displayPrompt()\n\ngetCommandId = (repl, commandName) ->\n  # Node 0.11 changed API, a command such as '.help' is now stored as 'help'\n  commandsHaveLeadingDot = repl.commands['.help']?\n  if commandsHaveLeadingDot then \".#{commandName}\" else commandName\n\nmodule.exports =\n  start: (opts = {}) ->\n    [major, minor, build] = process.versions.node.split('.').map (n) -> parseInt(n, 10)\n\n    if major < 6\n      console.warn \"Node 6+ required for CoffeeScript REPL\"\n      process.exit 1\n\n    CoffeeScript.register()\n    process.argv = ['coffee'].concat process.argv[2..]\n    if opts.transpile\n      transpile = {}\n      try\n        transpile.transpile = require('@babel/core').transform\n      catch\n        try\n          transpile.transpile = require('babel-core').transform\n        catch\n          console.error '''\n            To use --transpile with an interactive REPL, @babel/core must be installed either in the current folder or globally:\n              npm install --save-dev @babel/core\n            or\n              npm install --global @babel/core\n            And you must save options to configure Babel in one of the places it looks to find its options.\n            See https://coffeescript.org/#transpilation\n          '''\n          process.exit 1\n      transpile.options =\n        filename: path.resolve process.cwd(), '<repl>'\n      # Since the REPL compilation path is unique (in `eval` above), we need\n      # another way to get the `options` object attached to a module so that\n      # it knows later on whether it needs to be transpiled. In the case of\n      # the REPL, the only applicable option is `transpile`.\n      Module = require 'module'\n      originalModuleLoad = Module::load\n      Module::load = (filename) ->\n        @options = transpile: transpile.options\n        originalModuleLoad.call @, filename\n    opts = merge replDefaults, opts\n    repl = nodeREPL.start opts\n    runInContext opts.prelude, repl.context, 'prelude' if opts.prelude\n    repl.on 'exit', -> repl.outputStream.write '\\n' if not repl.closed\n    addMultilineHandler repl\n    addHistory repl, opts.historyFile, opts.historyMaxInputSize if opts.historyFile\n    # Adapt help inherited from the node REPL\n    repl.commands[getCommandId(repl, 'load')].help = 'Load code from a file into this REPL session'\n    repl\n"
  },
  {
    "path": "src/rewriter.coffee",
    "content": "# The CoffeeScript language has a good deal of optional syntax, implicit syntax,\n# and shorthand syntax. This can greatly complicate a grammar and bloat\n# the resulting parse table. Instead of making the parser handle it all, we take\n# a series of passes over the token stream, using this **Rewriter** to convert\n# shorthand into the unambiguous long form, add implicit indentation and\n# parentheses, and generally clean things up.\n\n{throwSyntaxError, extractAllCommentTokens} = require './helpers'\n\n# Move attached comments from one token to another.\nmoveComments = (fromToken, toToken) ->\n  return unless fromToken.comments\n  if toToken.comments and toToken.comments.length isnt 0\n    unshiftedComments = []\n    for comment in fromToken.comments\n      if comment.unshift\n        unshiftedComments.push comment\n      else\n        toToken.comments.push comment\n    toToken.comments = unshiftedComments.concat toToken.comments\n  else\n    toToken.comments = fromToken.comments\n  delete fromToken.comments\n\n# Create a generated token: one that exists due to a use of implicit syntax.\n# Optionally have this new token take the attached comments from another token.\ngenerate = (tag, value, origin, commentsToken) ->\n  token = [tag, value]\n  token.generated = yes\n  token.origin = origin if origin\n  moveComments commentsToken, token if commentsToken\n  token\n\n# The **Rewriter** class is used by the [Lexer](lexer.html), directly against\n# its internal array of tokens.\nexports.Rewriter = class Rewriter\n\n  # Rewrite the token stream in multiple passes, one logical filter at\n  # a time. This could certainly be changed into a single pass through the\n  # stream, with a big ol’ efficient switch, but it’s much nicer to work with\n  # like this. The order of these passes matters—indentation must be\n  # corrected before implicit parentheses can be wrapped around blocks of code.\n  rewrite: (@tokens) ->\n    # Set environment variable `DEBUG_TOKEN_STREAM` to `true` to output token\n    # debugging info. Also set `DEBUG_REWRITTEN_TOKEN_STREAM` to `true` to\n    # output the token stream after it has been rewritten by this file.\n    if process?.env?.DEBUG_TOKEN_STREAM\n      console.log 'Initial token stream:' if process.env.DEBUG_REWRITTEN_TOKEN_STREAM\n      console.log (t[0] + '/' + t[1] + (if t.comments then '*' else '') for t in @tokens).join ' '\n    @removeLeadingNewlines()\n    @closeOpenCalls()\n    @closeOpenIndexes()\n    @normalizeLines()\n    @tagPostfixConditionals()\n    @addImplicitBracesAndParens()\n    @rescueStowawayComments()\n    @addLocationDataToGeneratedTokens()\n    @enforceValidJSXAttributes()\n    @fixIndentationLocationData()\n    @exposeTokenDataToGrammar()\n    if process?.env?.DEBUG_REWRITTEN_TOKEN_STREAM\n      console.log 'Rewritten token stream:' if process.env.DEBUG_TOKEN_STREAM\n      console.log (t[0] + '/' + t[1] + (if t.comments then '*' else '') for t in @tokens).join ' '\n    @tokens\n\n  # Rewrite the token stream, looking one token ahead and behind.\n  # Allow the return value of the block to tell us how many tokens to move\n  # forwards (or backwards) in the stream, to make sure we don’t miss anything\n  # as tokens are inserted and removed, and the stream changes length under\n  # our feet.\n  scanTokens: (block) ->\n    {tokens} = this\n    i = 0\n    i += block.call this, token, i, tokens while token = tokens[i]\n    true\n\n  detectEnd: (i, condition, action, opts = {}) ->\n    {tokens} = this\n    levels = 0\n    while token = tokens[i]\n      return action.call this, token, i if levels is 0 and condition.call this, token, i\n      if token[0] in EXPRESSION_START\n        levels += 1\n      else if token[0] in EXPRESSION_END\n        levels -= 1\n      if levels < 0\n        return if opts.returnOnNegativeLevel\n        return action.call this, token, i\n      i += 1\n    i - 1\n\n  # Leading newlines would introduce an ambiguity in the grammar, so we\n  # dispatch them here.\n  removeLeadingNewlines: ->\n    # Find the index of the first non-`TERMINATOR` token.\n    break for [tag], i in @tokens when tag isnt 'TERMINATOR'\n    return if i is 0\n    # If there are any comments attached to the tokens we’re about to discard,\n    # shift them forward to what will become the new first token.\n    for leadingNewlineToken in @tokens[0...i]\n      moveComments leadingNewlineToken, @tokens[i]\n    # Discard all the leading newline tokens.\n    @tokens.splice 0, i\n\n  # The lexer has tagged the opening parenthesis of a method call. Match it with\n  # its paired close.\n  closeOpenCalls: ->\n    condition = (token, i) ->\n      token[0] in [')', 'CALL_END']\n\n    action = (token, i) ->\n      token[0] = 'CALL_END'\n\n    @scanTokens (token, i) ->\n      @detectEnd i + 1, condition, action if token[0] is 'CALL_START'\n      1\n\n  # The lexer has tagged the opening bracket of an indexing operation call.\n  # Match it with its paired close.\n  closeOpenIndexes: ->\n    startToken = null\n    condition = (token, i) ->\n      token[0] in [']', 'INDEX_END']\n\n    action = (token, i) ->\n      if @tokens.length >= i and @tokens[i + 1][0] is ':'\n        startToken[0] = '['\n        token[0] = ']'\n      else\n        token[0] = 'INDEX_END'\n\n    @scanTokens (token, i) ->\n      if token[0] is 'INDEX_START'\n        startToken = token\n        @detectEnd i + 1, condition, action\n      1\n\n  # Match tags in token stream starting at `i` with `pattern`.\n  # `pattern` may consist of strings (equality), an array of strings (one of)\n  # or null (wildcard). Returns the index of the match or -1 if no match.\n  indexOfTag: (i, pattern...) ->\n    fuzz = 0\n    for j in [0 ... pattern.length]\n      continue if not pattern[j]?\n      pattern[j] = [pattern[j]] if typeof pattern[j] is 'string'\n      return -1 if @tag(i + j + fuzz) not in pattern[j]\n    i + j + fuzz - 1\n\n  # Returns `yes` if standing in front of something looking like\n  # `@<x>:`, `<x>:` or `<EXPRESSION_START><x>...<EXPRESSION_END>:`.\n  looksObjectish: (j) ->\n    return yes if @indexOfTag(j, '@', null, ':') isnt -1 or @indexOfTag(j, null, ':') isnt -1\n    index = @indexOfTag j, EXPRESSION_START\n    if index isnt -1\n      end = null\n      @detectEnd index + 1, ((token) -> token[0] in EXPRESSION_END), ((token, i) -> end = i)\n      return yes if @tag(end + 1) is ':'\n    no\n\n  # Returns `yes` if current line of tokens contain an element of tags on same\n  # expression level. Stop searching at `LINEBREAKS` or explicit start of\n  # containing balanced expression.\n  findTagsBackwards: (i, tags) ->\n    backStack = []\n    while i >= 0 and (backStack.length or\n          @tag(i) not in tags and\n          (@tag(i) not in EXPRESSION_START or @tokens[i].generated) and\n          @tag(i) not in LINEBREAKS)\n      backStack.push @tag(i) if @tag(i) in EXPRESSION_END\n      backStack.pop() if @tag(i) in EXPRESSION_START and backStack.length\n      i -= 1\n    @tag(i) in tags\n\n  # Look for signs of implicit calls and objects in the token stream and\n  # add them.\n  addImplicitBracesAndParens: ->\n    # Track current balancing depth (both implicit and explicit) on stack.\n    stack = []\n    start = null\n\n    @scanTokens (token, i, tokens) ->\n      [tag]     = token\n      [prevTag] = prevToken = if i > 0 then tokens[i - 1] else []\n      [nextTag] = nextToken = if i < tokens.length - 1 then tokens[i + 1] else []\n      stackTop  = -> stack[stack.length - 1]\n      startIdx  = i\n\n      # Helper function, used for keeping track of the number of tokens consumed\n      # and spliced, when returning for getting a new token.\n      forward   = (n) -> i - startIdx + n\n\n      # Helper functions\n      isImplicit        = (stackItem) -> stackItem?[2]?.ours\n      isImplicitObject  = (stackItem) -> isImplicit(stackItem) and stackItem?[0] is '{'\n      isImplicitCall    = (stackItem) -> isImplicit(stackItem) and stackItem?[0] is '('\n      inImplicit        = -> isImplicit stackTop()\n      inImplicitCall    = -> isImplicitCall stackTop()\n      inImplicitObject  = -> isImplicitObject stackTop()\n      # Unclosed control statement inside implicit parens (like\n      # class declaration or if-conditionals).\n      inImplicitControl = -> inImplicit() and stackTop()?[0] is 'CONTROL'\n\n      startImplicitCall = (idx) ->\n        stack.push ['(', idx, ours: yes]\n        tokens.splice idx, 0, generate 'CALL_START', '(', ['', 'implicit function call', token[2]], prevToken\n\n      endImplicitCall = ->\n        stack.pop()\n        tokens.splice i, 0, generate 'CALL_END', ')', ['', 'end of input', token[2]], prevToken\n        i += 1\n\n      startImplicitObject = (idx, {startsLine = yes, continuationLineIndent} = {}) ->\n        stack.push ['{', idx, sameLine: yes, startsLine: startsLine, ours: yes, continuationLineIndent: continuationLineIndent]\n        val = new String '{'\n        val.generated = yes\n        tokens.splice idx, 0, generate '{', val, token, prevToken\n\n      endImplicitObject = (j) ->\n        j = j ? i\n        stack.pop()\n        tokens.splice j, 0, generate '}', '}', token, prevToken\n        i += 1\n\n      implicitObjectContinues = (j) =>\n        nextTerminatorIdx = null\n        @detectEnd j,\n          (token) -> token[0] is 'TERMINATOR'\n          (token, i) -> nextTerminatorIdx = i\n          returnOnNegativeLevel: yes\n        return no unless nextTerminatorIdx?\n        @looksObjectish nextTerminatorIdx + 1\n\n      # Don’t end an implicit call/object on next indent if any of these are in an argument/value.\n      if (\n        (inImplicitCall() or inImplicitObject()) and tag in CONTROL_IN_IMPLICIT or\n        inImplicitObject() and prevTag is ':' and tag is 'FOR'\n      )\n        stack.push ['CONTROL', i, ours: yes]\n        return forward(1)\n\n      if tag is 'INDENT' and inImplicit()\n\n        # An `INDENT` closes an implicit call unless\n        #\n        #  1. We have seen a `CONTROL` argument on the line.\n        #  2. The last token before the indent is part of the list below.\n        if prevTag not in ['=>', '->', '[', '(', ',', '{', 'ELSE', '=']\n          while inImplicitCall() or inImplicitObject() and prevTag isnt ':'\n            if inImplicitCall()\n              endImplicitCall()\n            else\n              endImplicitObject()\n        stack.pop() if inImplicitControl()\n        stack.push [tag, i]\n        return forward(1)\n\n      # Straightforward start of explicit expression.\n      if tag in EXPRESSION_START\n        stack.push [tag, i]\n        return forward(1)\n\n      # Close all implicit expressions inside of explicitly closed expressions.\n      if tag in EXPRESSION_END\n        while inImplicit()\n          if inImplicitCall()\n            endImplicitCall()\n          else if inImplicitObject()\n            endImplicitObject()\n          else\n            stack.pop()\n        start = stack.pop()\n\n      inControlFlow = =>\n        seenFor = @findTagsBackwards(i, ['FOR']) and @findTagsBackwards(i, ['FORIN', 'FOROF', 'FORFROM'])\n        controlFlow = seenFor or @findTagsBackwards i, ['WHILE', 'UNTIL', 'LOOP', 'LEADING_WHEN']\n        return no unless controlFlow\n        isFunc = no\n        tagCurrentLine = token[2].first_line\n        @detectEnd i,\n          (token, i) -> token[0] in LINEBREAKS\n          (token, i) ->\n            [prevTag, ,{first_line}] = tokens[i - 1] || []\n            isFunc = tagCurrentLine is first_line and prevTag in ['->', '=>']\n          returnOnNegativeLevel: yes\n        isFunc\n\n      # Recognize standard implicit calls like\n      # f a, f() b, f? c, h[0] d etc.\n      # Added support for spread dots on the left side: f ...a\n      if (tag in IMPLICIT_FUNC and token.spaced or\n          tag is '?' and i > 0 and not tokens[i - 1].spaced) and\n         (nextTag in IMPLICIT_CALL or\n         (nextTag is '...' and @tag(i + 2) in IMPLICIT_CALL and not @findTagsBackwards(i, ['INDEX_START', '['])) or\n          nextTag in IMPLICIT_UNSPACED_CALL and\n          not nextToken.spaced and not nextToken.newLine) and\n          not inControlFlow()\n        tag = token[0] = 'FUNC_EXIST' if tag is '?'\n        startImplicitCall i + 1\n        return forward(2)\n\n      # Implicit call taking an implicit indented object as first argument.\n      #\n      #     f\n      #       a: b\n      #       c: d\n      #\n      # Don’t accept implicit calls of this type, when on the same line\n      # as the control structures below as that may misinterpret constructs like:\n      #\n      #     if f\n      #        a: 1\n      # as\n      #\n      #     if f(a: 1)\n      #\n      # which is probably always unintended.\n      # Furthermore don’t allow this in the first line of a literal array\n      # or explicit object, as that creates grammatical ambiguities (#5368).\n      if tag in IMPLICIT_FUNC and\n         @indexOfTag(i + 1, 'INDENT') > -1 and @looksObjectish(i + 2) and\n         not @findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH',\n          'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL']) and\n         not ((s = stackTop()?[0]) in ['{', '['] and\n              not isImplicit(stackTop()) and\n              @findTagsBackwards(i, s))\n        startImplicitCall i + 1\n        stack.push ['INDENT', i + 2]\n        return forward(3)\n\n      # Implicit objects start here.\n      if tag is ':'\n        # Go back to the (implicit) start of the object.\n        s = switch\n          when @tag(i - 1) in EXPRESSION_END\n            [startTag, startIndex] = start\n            if startTag is '[' and startIndex > 0 and @tag(startIndex - 1) is '@' and not tokens[startIndex - 1].spaced\n              startIndex - 1\n            else\n              startIndex\n          when @tag(i - 2) is '@' then i - 2\n          else i - 1\n\n        startsLine = s <= 0 or @tag(s - 1) in LINEBREAKS or tokens[s - 1].newLine\n        # Are we just continuing an already declared object?\n        # Including the case where we indent on the line after an explicit '{'.\n        if stackTop()\n          [stackTag, stackIdx] = stackTop()\n          stackNext = stack[stack.length - 2]\n          if (stackTag is '{' or\n              stackTag is 'INDENT' and stackNext?[0] is '{' and\n              not isImplicit(stackNext) and\n              @findTagsBackwards(stackIdx-1, ['{'])) and\n             (startsLine or @tag(s - 1) is ',' or @tag(s - 1) is '{') and\n             @tag(s - 1) not in UNFINISHED\n            return forward(1)\n\n        preObjectToken = if i > 1 then tokens[i - 2] else []\n        startImplicitObject(s, {startsLine: !!startsLine, continuationLineIndent: preObjectToken.continuationLineIndent})\n        return forward(2)\n\n      # End implicit calls when chaining method calls\n      # like e.g.:\n      #\n      #     f ->\n      #       a\n      #     .g b, ->\n      #       c\n      #     .h a\n      #\n      # and also\n      #\n      #     f a\n      #     .g b\n      #     .h a\n\n      # Mark all enclosing objects as not sameLine\n      if tag in LINEBREAKS\n        for stackItem in stack by -1\n          break unless isImplicit stackItem\n          stackItem[2].sameLine = no if isImplicitObject stackItem\n\n      # End indented-continuation-line implicit objects once that indentation is over.\n      if tag is 'TERMINATOR' and token.endsContinuationLineIndentation\n        {preContinuationLineIndent} = token.endsContinuationLineIndentation\n        while inImplicitObject() and (implicitObjectIndent = stackTop()[2].continuationLineIndent)? and implicitObjectIndent > preContinuationLineIndent\n          endImplicitObject()\n\n      newLine = prevTag is 'OUTDENT' or prevToken.newLine\n      if tag in IMPLICIT_END or\n          (tag in CALL_CLOSERS and newLine) or\n          (tag in ['..', '...'] and @findTagsBackwards(i, [\"INDEX_START\"]))\n        while inImplicit()\n          [stackTag, stackIdx, {sameLine, startsLine}] = stackTop()\n          # Close implicit calls when reached end of argument list\n          if inImplicitCall() and prevTag isnt ',' or\n              (prevTag is ',' and tag is 'TERMINATOR' and not nextTag?)\n            endImplicitCall()\n          # Close implicit objects such as:\n          # return a: 1, b: 2 unless true\n          else if inImplicitObject() and sameLine and\n                  tag isnt 'TERMINATOR' and prevTag isnt ':' and\n                  not (tag in ['POST_IF', 'FOR', 'WHILE', 'UNTIL'] and startsLine and implicitObjectContinues(i + 1))\n            endImplicitObject()\n          # Close implicit objects when at end of line, line didn't end with a comma\n          # and the implicit object didn't start the line or the next line doesn’t look like\n          # the continuation of an object.\n          else if inImplicitObject() and tag is 'TERMINATOR' and prevTag isnt ',' and\n                  not (startsLine and @looksObjectish(i + 1))\n            endImplicitObject()\n          else if inImplicitControl() and tokens[stackTop()[1]][0] is 'CLASS' and tag is 'TERMINATOR'\n            stack.pop()\n          else\n            break\n\n      # Close implicit object if comma is the last character\n      # and what comes after doesn’t look like it belongs.\n      # This is used for trailing commas and calls, like:\n      #\n      #     x =\n      #         a: b,\n      #         c: d,\n      #     e = 2\n      #\n      # and\n      #\n      #     f a, b: c, d: e, f, g: h: i, j\n      #\n      if tag is ',' and not @looksObjectish(i + 1) and inImplicitObject() and not (@tag(i + 2) in ['FOROF', 'FORIN']) and\n         (nextTag isnt 'TERMINATOR' or not @looksObjectish(i + 2))\n        # When nextTag is OUTDENT the comma is insignificant and\n        # should just be ignored so embed it in the implicit object.\n        #\n        # When it isn’t the comma go on to play a role in a call or\n        # array further up the stack, so give it a chance.\n        offset = if nextTag is 'OUTDENT' then 1 else 0\n        while inImplicitObject()\n          endImplicitObject i + offset\n      return forward(1)\n\n  # Make sure only strings and wrapped expressions are used in JSX attributes.\n  enforceValidJSXAttributes: ->\n    @scanTokens (token, i, tokens) ->\n      if token.jsxColon\n        next = tokens[i + 1]\n        if next[0] not in ['STRING_START', 'STRING', '(']\n          throwSyntaxError 'expected wrapped or quoted JSX attribute', next[2]\n      return 1\n\n  # Not all tokens survive processing by the parser. To avoid comments getting\n  # lost into the ether, find comments attached to doomed tokens and move them\n  # to a token that will make it to the other side.\n  rescueStowawayComments: ->\n    insertPlaceholder = (token, j, tokens, method) ->\n      tokens[method] generate 'TERMINATOR', '\\n', tokens[j] unless tokens[j][0] is 'TERMINATOR'\n      tokens[method] generate 'JS', '', tokens[j], token\n\n    dontShiftForward = (i, tokens) ->\n      j = i + 1\n      while j isnt tokens.length and tokens[j][0] in DISCARDED\n        return yes if tokens[j][0] is 'INTERPOLATION_END'\n        j++\n      no\n\n    shiftCommentsForward = (token, i, tokens) ->\n      # Find the next surviving token and attach this token’s comments to it,\n      # with a flag that we know to output such comments *before* that\n      # token’s own compilation. (Otherwise comments are output following\n      # the token they’re attached to.)\n      j = i\n      j++ while j isnt tokens.length and tokens[j][0] in DISCARDED\n      unless j is tokens.length or tokens[j][0] in DISCARDED\n        comment.unshift = yes for comment in token.comments\n        moveComments token, tokens[j]\n        return 1\n      else # All following tokens are doomed!\n        j = tokens.length - 1\n        insertPlaceholder token, j, tokens, 'push'\n        # The generated tokens were added to the end, not inline, so we don’t skip.\n        return 1\n\n    shiftCommentsBackward = (token, i, tokens) ->\n      # Find the last surviving token and attach this token’s comments to it.\n      j = i\n      j-- while j isnt -1 and tokens[j][0] in DISCARDED\n      unless j is -1 or tokens[j][0] in DISCARDED\n        moveComments token, tokens[j]\n        return 1\n      else # All previous tokens are doomed!\n        insertPlaceholder token, 0, tokens, 'unshift'\n        # We added two tokens, so shift forward to account for the insertion.\n        return 3\n\n    @scanTokens (token, i, tokens) ->\n      return 1 unless token.comments\n      ret = 1\n      if token[0] in DISCARDED\n        # This token won’t survive passage through the parser, so we need to\n        # rescue its attached tokens and redistribute them to nearby tokens.\n        # Comments that don’t start a new line can shift backwards to the last\n        # safe token, while other tokens should shift forward.\n        dummyToken = comments: []\n        j = token.comments.length - 1\n        until j is -1\n          if token.comments[j].newLine is no and token.comments[j].here is no\n            dummyToken.comments.unshift token.comments[j]\n            token.comments.splice j, 1\n          j--\n        if dummyToken.comments.length isnt 0\n          ret = shiftCommentsBackward dummyToken, i - 1, tokens\n        if token.comments.length isnt 0\n          shiftCommentsForward token, i, tokens\n      else unless dontShiftForward i, tokens\n        # If any of this token’s comments start a line—there’s only\n        # whitespace between the preceding newline and the start of the\n        # comment—and this isn’t one of the special `JS` tokens, then\n        # shift this comment forward to precede the next valid token.\n        # `Block.compileComments` also has logic to make sure that\n        # “starting new line” comments follow or precede the nearest\n        # newline relative to the token that the comment is attached to,\n        # but that newline might be inside a `}` or `)` or other generated\n        # token that we really want this comment to output after. Therefore\n        # we need to shift the comments here, avoiding such generated and\n        # discarded tokens.\n        dummyToken = comments: []\n        j = token.comments.length - 1\n        until j is -1\n          if token.comments[j].newLine and not token.comments[j].unshift and\n             not (token[0] is 'JS' and token.generated)\n            dummyToken.comments.unshift token.comments[j]\n            token.comments.splice j, 1\n          j--\n        if dummyToken.comments.length isnt 0\n          ret = shiftCommentsForward dummyToken, i + 1, tokens\n      delete token.comments if token.comments?.length is 0\n      ret\n\n  # Add location data to all tokens generated by the rewriter.\n  addLocationDataToGeneratedTokens: ->\n    @scanTokens (token, i, tokens) ->\n      return 1 if     token[2]\n      return 1 unless token.generated or token.explicit\n      if token.fromThen and token[0] is 'INDENT'\n        token[2] = token.origin[2]\n        return 1\n      if token[0] is '{' and nextLocation=tokens[i + 1]?[2]\n        {first_line: line, first_column: column, range: [rangeIndex]} = nextLocation\n      else if prevLocation = tokens[i - 1]?[2]\n        {last_line: line, last_column: column, range: [, rangeIndex]} = prevLocation\n        column += 1\n      else\n        line = column = 0\n        rangeIndex = 0\n      token[2] = {\n        first_line:            line\n        first_column:          column\n        last_line:             line\n        last_column:           column\n        last_line_exclusive:   line\n        last_column_exclusive: column\n        range: [rangeIndex, rangeIndex]\n      }\n      return 1\n\n  # `OUTDENT` tokens should always be positioned at the last character of the\n  # previous token, so that AST nodes ending in an `OUTDENT` token end up with a\n  # location corresponding to the last “real” token under the node.\n  fixIndentationLocationData: ->\n    @allComments ?= extractAllCommentTokens @tokens\n    findPrecedingComment = (token, {afterPosition, indentSize, first, indented}) =>\n      tokenStart = token[2].range[0]\n      matches = (comment) ->\n        if comment.outdented\n          return no unless indentSize? and comment.indentSize > indentSize\n        return no if indented and not comment.indented\n        return no unless comment.locationData.range[0] < tokenStart\n        return no unless comment.locationData.range[0] > afterPosition\n        yes\n      if first\n        lastMatching = null\n        for comment in @allComments by -1\n          if matches comment\n            lastMatching = comment\n          else if lastMatching\n            return lastMatching\n        return lastMatching\n      for comment in @allComments when matches comment by -1\n        return comment\n      null\n\n    @scanTokens (token, i, tokens) ->\n      return 1 unless token[0] in ['INDENT', 'OUTDENT'] or\n        (token.generated and token[0] is 'CALL_END' and not token.data?.closingTagNameToken) or\n        (token.generated and token[0] is '}')\n      isIndent = token[0] is 'INDENT'\n      prevToken = token.prevToken ? tokens[i - 1]\n      prevLocationData = prevToken[2]\n      # addLocationDataToGeneratedTokens() set the outdent’s location data\n      # to the preceding token’s, but in order to detect comments inside an\n      # empty \"block\" we want to look for comments preceding the next token.\n      useNextToken = token.explicit or token.generated\n      if useNextToken\n        nextToken = token\n        nextTokenIndex = i\n        nextToken = tokens[nextTokenIndex++] while (nextToken.explicit or nextToken.generated) and nextTokenIndex isnt tokens.length - 1\n      precedingComment = findPrecedingComment(\n        if useNextToken\n          nextToken\n        else\n          token\n        afterPosition: prevLocationData.range[0]\n        indentSize: token.indentSize\n        first: isIndent\n        indented: useNextToken\n      )\n      if isIndent\n        return 1 unless precedingComment?.newLine\n      # We don’t want e.g. an implicit call at the end of an `if` condition to\n      # include a following indented comment.\n      return 1 if token.generated and token[0] is 'CALL_END' and precedingComment?.indented\n      prevLocationData = precedingComment.locationData if precedingComment?\n      token[2] =\n        first_line:\n          if precedingComment?\n            prevLocationData.first_line\n          else\n            prevLocationData.last_line\n        first_column:\n          if precedingComment?\n            if isIndent\n              0\n            else\n              prevLocationData.first_column\n          else\n            prevLocationData.last_column\n        last_line:              prevLocationData.last_line\n        last_column:            prevLocationData.last_column\n        last_line_exclusive:    prevLocationData.last_line_exclusive\n        last_column_exclusive:  prevLocationData.last_column_exclusive\n        range:\n          if isIndent and precedingComment?\n            [\n              prevLocationData.range[0] - precedingComment.indentSize\n              prevLocationData.range[1]\n            ]\n          else\n            prevLocationData.range\n      return 1\n\n  # Because our grammar is LALR(1), it can’t handle some single-line\n  # expressions that lack ending delimiters. The **Rewriter** adds the implicit\n  # blocks, so it doesn’t need to. To keep the grammar clean and tidy, trailing\n  # newlines within expressions are removed and the indentation tokens of empty\n  # blocks are added.\n  normalizeLines: ->\n    starter = indent = outdent = null\n    leading_switch_when = null\n    leading_if_then = null\n    # Count `THEN` tags\n    ifThens = []\n\n    condition = (token, i) ->\n      token[1] isnt ';' and token[0] in SINGLE_CLOSERS and\n      not (token[0] is 'TERMINATOR' and @tag(i + 1) in EXPRESSION_CLOSE) and\n      not (token[0] is 'ELSE' and\n           (starter isnt 'THEN' or (leading_if_then or leading_switch_when))) and\n      not (token[0] in ['CATCH', 'FINALLY'] and starter in ['->', '=>']) or\n      token[0] in CALL_CLOSERS and\n      (@tokens[i - 1].newLine or @tokens[i - 1][0] is 'OUTDENT')\n\n    action = (token, i) ->\n      ifThens.pop() if token[0] is 'ELSE' and starter is 'THEN'\n      @tokens.splice (if @tag(i - 1) is ',' then i - 1 else i), 0, outdent\n\n    closeElseTag = (tokens, i) =>\n      tlen = ifThens.length\n      return i unless tlen > 0\n      lastThen = ifThens.pop()\n      [, outdentElse] = @indentation tokens[lastThen]\n      # Insert `OUTDENT` to close inner `IF`.\n      outdentElse[1] = tlen*2\n      tokens.splice(i, 0, outdentElse)\n      # Insert `OUTDENT` to close outer `IF`.\n      outdentElse[1] = 2\n      tokens.splice(i + 1, 0, outdentElse)\n      # Remove outdents from the end.\n      @detectEnd i + 2,\n        (token, i) -> token[0] in ['OUTDENT', 'TERMINATOR']\n        (token, i) ->\n            if @tag(i) is 'OUTDENT' and @tag(i + 1) is 'OUTDENT'\n              tokens.splice i, 2\n      i + 2\n\n    @scanTokens (token, i, tokens) ->\n      [tag] = token\n      conditionTag = tag in ['->', '=>'] and\n        @findTagsBackwards(i, ['IF', 'WHILE', 'FOR', 'UNTIL', 'SWITCH', 'WHEN', 'LEADING_WHEN', '[', 'INDEX_START']) and\n        not (@findTagsBackwards i, ['THEN', '..', '...'])\n\n      if tag is 'TERMINATOR'\n        if @tag(i + 1) is 'ELSE' and @tag(i - 1) isnt 'OUTDENT'\n          tokens.splice i, 1, @indentation()...\n          return 1\n        if @tag(i + 1) in EXPRESSION_CLOSE\n          if token[1] is ';' and @tag(i + 1) is 'OUTDENT'\n            tokens[i + 1].prevToken = token\n            moveComments token, tokens[i + 1]\n          tokens.splice i, 1\n          return 0\n      if tag is 'CATCH'\n        for j in [1..2] when @tag(i + j) in ['OUTDENT', 'TERMINATOR', 'FINALLY']\n          tokens.splice i + j, 0, @indentation()...\n          return 2 + j\n      if tag in ['->', '=>'] and (@tag(i + 1) in [',', ']'] or @tag(i + 1) is '.' and token.newLine)\n        [indent, outdent] = @indentation tokens[i]\n        tokens.splice i + 1, 0, indent, outdent\n        return 1\n      if tag in SINGLE_LINERS and @tag(i + 1) isnt 'INDENT' and\n         not (tag is 'ELSE' and @tag(i + 1) is 'IF') and\n         not conditionTag\n        starter = tag\n        [indent, outdent] = @indentation tokens[i]\n        indent.fromThen   = true if starter is 'THEN'\n        if tag is 'THEN'\n          leading_switch_when = @findTagsBackwards(i, ['LEADING_WHEN']) and @tag(i + 1) is 'IF'\n          leading_if_then = @findTagsBackwards(i, ['IF']) and @tag(i + 1) is 'IF'\n        ifThens.push i if tag is 'THEN' and @findTagsBackwards(i, ['IF'])\n        # `ELSE` tag is not closed.\n        if tag is 'ELSE' and @tag(i - 1) isnt 'OUTDENT'\n          i = closeElseTag tokens, i\n        tokens.splice i + 1, 0, indent\n        @detectEnd i + 2, condition, action\n        tokens.splice i, 1 if tag is 'THEN'\n        return 1\n      return 1\n\n  # Tag postfix conditionals as such, so that we can parse them with a\n  # different precedence.\n  tagPostfixConditionals: ->\n    original = null\n\n    condition = (token, i) ->\n      [tag] = token\n      [prevTag] = @tokens[i - 1]\n      tag is 'TERMINATOR' or (tag is 'INDENT' and prevTag not in SINGLE_LINERS)\n\n    action = (token, i) ->\n      if token[0] isnt 'INDENT' or (token.generated and not token.fromThen)\n        original[0] = 'POST_' + original[0]\n\n    @scanTokens (token, i) ->\n      return 1 unless token[0] is 'IF'\n      original = token\n      @detectEnd i + 1, condition, action\n      return 1\n\n  # For tokens with extra data, we want to make that data visible to the grammar\n  # by wrapping the token value as a String() object and setting the data as\n  # properties of that object. The grammar should then be responsible for\n  # cleaning this up for the node constructor: unwrapping the token value to a\n  # primitive string and separately passing any expected token data properties\n  exposeTokenDataToGrammar: ->\n    @scanTokens (token, i) ->\n      if token.generated or (token.data and Object.keys(token.data).length isnt 0)\n        token[1] = new String token[1]\n        token[1][key] = val for own key, val of (token.data ? {})\n        token[1].generated = yes if token.generated\n      1\n\n  # Generate the indentation tokens, based on another token on the same line.\n  indentation: (origin) ->\n    indent  = ['INDENT', 2]\n    outdent = ['OUTDENT', 2]\n    if origin\n      indent.generated = outdent.generated = yes\n      indent.origin = outdent.origin = origin\n    else\n      indent.explicit = outdent.explicit = yes\n    [indent, outdent]\n\n  generate: generate\n\n  # Look up a tag by token index.\n  tag: (i) -> @tokens[i]?[0]\n\n# Constants\n# ---------\n\n# List of the token pairs that must be balanced.\nBALANCED_PAIRS = [\n  ['(', ')']\n  ['[', ']']\n  ['{', '}']\n  ['INDENT', 'OUTDENT'],\n  ['CALL_START', 'CALL_END']\n  ['PARAM_START', 'PARAM_END']\n  ['INDEX_START', 'INDEX_END']\n  ['STRING_START', 'STRING_END']\n  ['INTERPOLATION_START', 'INTERPOLATION_END']\n  ['REGEX_START', 'REGEX_END']\n]\n\n# The inverse mappings of `BALANCED_PAIRS` we’re trying to fix up, so we can\n# look things up from either end.\nexports.INVERSES = INVERSES = {}\n\n# The tokens that signal the start/end of a balanced pair.\nEXPRESSION_START = []\nEXPRESSION_END   = []\n\nfor [left, right] in BALANCED_PAIRS\n  EXPRESSION_START.push INVERSES[right] = left\n  EXPRESSION_END  .push INVERSES[left] = right\n\n# Tokens that indicate the close of a clause of an expression.\nEXPRESSION_CLOSE = ['CATCH', 'THEN', 'ELSE', 'FINALLY'].concat EXPRESSION_END\n\n# Tokens that, if followed by an `IMPLICIT_CALL`, indicate a function invocation.\nIMPLICIT_FUNC    = ['IDENTIFIER', 'PROPERTY', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS']\n\n# If preceded by an `IMPLICIT_FUNC`, indicates a function invocation.\nIMPLICIT_CALL    = [\n  'IDENTIFIER', 'JSX_TAG', 'PROPERTY', 'NUMBER', 'INFINITY', 'NAN'\n  'STRING', 'STRING_START', 'REGEX', 'REGEX_START', 'JS'\n  'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS'\n  'DYNAMIC_IMPORT', 'IMPORT_META', 'NEW_TARGET'\n  'UNDEFINED', 'NULL', 'BOOL'\n  'UNARY', 'DO', 'DO_IIFE', 'YIELD', 'AWAIT', 'UNARY_MATH', 'SUPER', 'THROW'\n  '@', '->', '=>', '[', '(', '{', '--', '++'\n]\n\nIMPLICIT_UNSPACED_CALL = ['+', '-']\n\n# Tokens that always mark the end of an implicit call for single-liners.\nIMPLICIT_END     = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY',\n  'LOOP', 'TERMINATOR']\n\n# Single-line flavors of block expressions that have unclosed endings.\n# The grammar can’t disambiguate them, so we insert the implicit indentation.\nSINGLE_LINERS    = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN']\nSINGLE_CLOSERS   = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN']\n\n# Tokens that end a line.\nLINEBREAKS       = ['TERMINATOR', 'INDENT', 'OUTDENT']\n\n# Tokens that close open calls when they follow a newline.\nCALL_CLOSERS     = ['.', '?.', '::', '?::']\n\n# Tokens that prevent a subsequent indent from ending implicit calls/objects\nCONTROL_IN_IMPLICIT = ['IF', 'TRY', 'FINALLY', 'CATCH', 'CLASS', 'SWITCH']\n\n# Tokens that are swallowed up by the parser, never leading to code generation.\n# You can spot these in `grammar.coffee` because the `o` function second\n# argument doesn’t contain a `new` call for these tokens.\n# `STRING_START` isn’t on this list because its `locationData` matches that of\n# the node that becomes `StringWithInterpolations`, and therefore\n# `addDataToNode` attaches `STRING_START`’s tokens to that node.\nDISCARDED = ['(', ')', '[', ']', '{', '}', ':', '.', '..', '...', ',', '=', '++', '--', '?',\n  'AS', 'AWAIT', 'CALL_START', 'CALL_END', 'DEFAULT', 'DO', 'DO_IIFE', 'ELSE',\n  'EXTENDS', 'EXPORT', 'FORIN', 'FOROF', 'FORFROM', 'IMPORT', 'INDENT', 'INDEX_SOAK',\n  'INTERPOLATION_START', 'INTERPOLATION_END', 'LEADING_WHEN', 'OUTDENT', 'PARAM_END',\n  'REGEX_START', 'REGEX_END', 'RETURN', 'STRING_END', 'THROW', 'UNARY', 'YIELD'\n].concat IMPLICIT_UNSPACED_CALL.concat IMPLICIT_END.concat CALL_CLOSERS.concat CONTROL_IN_IMPLICIT\n\n# Tokens that, when appearing at the end of a line, suppress a following TERMINATOR/INDENT token\nexports.UNFINISHED = UNFINISHED = ['\\\\', '.', '?.', '?::', 'UNARY', 'DO', 'DO_IIFE', 'MATH', 'UNARY_MATH', '+', '-',\n           '**', 'SHIFT', 'RELATION', 'COMPARE', '&', '^', '|', '&&', '||',\n           'BIN?', 'EXTENDS']\n"
  },
  {
    "path": "src/scope.litcoffee",
    "content": "The **Scope** class regulates lexical scoping within CoffeeScript. As you\ngenerate code, you create a tree of scopes in the same shape as the nested\nfunction bodies. Each scope knows about the variables declared within it,\nand has a reference to its parent enclosing scope. In this way, we know which\nvariables are new and need to be declared with `var`, and which are shared\nwith external scopes.\n\n    exports.Scope = class Scope\n\nInitialize a scope with its parent, for lookups up the chain,\nas well as a reference to the **Block** node it belongs to, which is\nwhere it should declare its variables, a reference to the function that\nit belongs to, and a list of variables referenced in the source code\nand therefore should be avoided when generating variables. Also track comments\nthat should be output as part of variable declarations.\n\n      constructor: (@parent, @expressions, @method, @referencedVars) ->\n        @variables = [{name: 'arguments', type: 'arguments'}]\n        @comments  = {}\n        @positions = {}\n        @utilities = {} unless @parent\n\nThe `@root` is the top-level **Scope** object for a given file.\n\n        @root = @parent?.root ? this\n\nAdds a new variable or overrides an existing one.\n\n      add: (name, type, immediate) ->\n        return @parent.add name, type, immediate if @shared and not immediate\n        if Object::hasOwnProperty.call @positions, name\n          @variables[@positions[name]].type = type\n        else\n          @positions[name] = @variables.push({name, type}) - 1\n\nWhen `super` is called, we need to find the name of the current method we're\nin, so that we know how to invoke the same method of the parent class. This\ncan get complicated if super is being called from an inner function.\n`namedMethod` will walk up the scope tree until it either finds the first\nfunction object that has a name filled in, or bottoms out.\n\n      namedMethod: ->\n        return @method if @method?.name or !@parent\n        @parent.namedMethod()\n\nLook up a variable name in lexical scope, and declare it if it does not\nalready exist.\n\n      find: (name, type = 'var') ->\n        return yes if @check name\n        @add name, type\n        no\n\nReserve a variable name as originating from a function parameter for this\nscope. No `var` required for internal references.\n\n      parameter: (name) ->\n        return if @shared and @parent.check name, yes\n        @add name, 'param'\n\nJust check to see if a variable has already been declared, without reserving,\nwalks up to the root scope.\n\n      check: (name) ->\n        !!(@type(name) or @parent?.check(name))\n\nGenerate a temporary variable name at the given index.\n\n      temporary: (name, index, single=false) ->\n        if single\n          startCode = name.charCodeAt(0)\n          endCode = 'z'.charCodeAt(0)\n          diff = endCode - startCode\n          newCode = startCode + index % (diff + 1)\n          letter = String.fromCharCode(newCode)\n          num = index // (diff + 1)\n          \"#{letter}#{num or ''}\"\n        else\n          \"#{name}#{index or ''}\"\n\nGets the type of a variable.\n\n      type: (name) ->\n        return v.type for v in @variables when v.name is name\n        null\n\nIf we need to store an intermediate result, find an available name for a\ncompiler-generated variable. `_var`, `_var2`, and so on...\n\n      freeVariable: (name, options={}) ->\n        index = 0\n        loop\n          temp = @temporary name, index, options.single\n          break unless @check(temp) or temp in @root.referencedVars\n          index++\n        @add temp, 'var', yes if options.reserve ? true\n        temp\n\nEnsure that an assignment is made at the top of this scope\n(or at the top-level scope, if requested).\n\n      assign: (name, value) ->\n        @add name, {value, assigned: yes}, yes\n        @hasAssignments = yes\n\nDoes this scope have any declared variables?\n\n      hasDeclarations: ->\n        !!@declaredVariables().length\n\nReturn the list of variables first declared in this scope.\n\n      declaredVariables: ->\n        (v.name for v in @variables when v.type is 'var').sort()\n\nReturn the list of assignments that are supposed to be made at the top\nof this scope.\n\n      assignedVariables: ->\n        \"#{v.name} = #{v.type.value}\" for v in @variables when v.type.assigned\n"
  },
  {
    "path": "src/sourcemap.litcoffee",
    "content": "Source maps allow JavaScript runtimes to match running JavaScript back to\nthe original source code that corresponds to it. This can be minified\nJavaScript, but in our case, we're concerned with mapping pretty-printed\nJavaScript back to CoffeeScript.\n\nIn order to produce maps, we must keep track of positions (line number, column number)\nthat originated every node in the syntax tree, and be able to generate a\n[map file](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit)\n— which is a compact, VLQ-encoded representation of the JSON serialization\nof this information — to write out alongside the generated JavaScript.\n\n\nLineMap\n-------\n\nA **LineMap** object keeps track of information about original line and column\npositions for a single line of output JavaScript code.\n**SourceMaps** are implemented in terms of **LineMaps**.\n\n    class LineMap\n      constructor: (@line) ->\n        @columns = []\n\n      add: (column, [sourceLine, sourceColumn], options={}) ->\n        return if @columns[column] and options.noReplace\n        @columns[column] = {line: @line, column, sourceLine, sourceColumn}\n\n      sourceLocation: (column) ->\n        column-- until (mapping = @columns[column]) or (column <= 0)\n        mapping and [mapping.sourceLine, mapping.sourceColumn]\n\n\nSourceMap\n---------\n\nMaps locations in a single generated JavaScript file back to locations in\nthe original CoffeeScript source file.\n\nThis is intentionally agnostic towards how a source map might be represented on\ndisk. Once the compiler is ready to produce a \"v3\"-style source map, we can walk\nthrough the arrays of line and column buffer to produce it.\n\n    class SourceMap\n      constructor: ->\n        @lines = []\n\nAdds a mapping to this SourceMap. `sourceLocation` and `generatedLocation`\nare both `[line, column]` arrays. If `options.noReplace` is true, then if there\nis already a mapping for the specified `line` and `column`, this will have no\neffect.\n\n      add: (sourceLocation, generatedLocation, options = {}) ->\n        [line, column] = generatedLocation\n        lineMap = (@lines[line] or= new LineMap(line))\n        lineMap.add column, sourceLocation, options\n\nLook up the original position of a given `line` and `column` in the generated\ncode.\n\n      sourceLocation: ([line, column]) ->\n        line-- until (lineMap = @lines[line]) or (line <= 0)\n        lineMap and lineMap.sourceLocation column\n\nCaching\n-------\n\nA static source maps cache `filename`: `map`. These are used for transforming\nstack traces and are currently set in `CoffeeScript.compile` for all files\ncompiled with the source maps option.\n\n      @sourceMaps: Object.create null\n\n      @registerCompiled: (filename, source, sourcemap) =>\n        if sourcemap?\n          @sourceMaps[filename] = sourcemap\n\n      @getSourceMap: (filename) =>\n        @sourceMaps[filename]\n\n\nV3 SourceMap Generation\n-----------------------\n\nBuilds up a V3 source map, returning the generated JSON as a string.\n`options.sourceRoot` may be used to specify the sourceRoot written to the source\nmap.  Also, `options.sourceFiles` and `options.generatedFile` may be passed to\nset \"sources\" and \"file\", respectively.\n\n      generate: (options = {}, code = null) ->\n        writingline       = 0\n        lastColumn        = 0\n        lastSourceLine    = 0\n        lastSourceColumn  = 0\n        needComma         = no\n        buffer            = \"\"\n\n        for lineMap, lineNumber in @lines when lineMap\n          for mapping in lineMap.columns when mapping\n            while writingline < mapping.line\n              lastColumn = 0\n              needComma = no\n              buffer += \";\"\n              writingline++\n\nWrite a comma if we've already written a segment on this line.\n\n            if needComma\n              buffer += \",\"\n              needComma = no\n\nWrite the next segment. Segments can be 1, 4, or 5 values.  If just one, then it\nis a generated column which doesn't match anything in the source code.\n\nThe starting column in the generated source, relative to any previous recorded\ncolumn for the current line:\n\n            buffer += @encodeVlq mapping.column - lastColumn\n            lastColumn = mapping.column\n\nThe index into the list of sources:\n\n            buffer += @encodeVlq 0\n\nThe starting line in the original source, relative to the previous source line.\n\n            buffer += @encodeVlq mapping.sourceLine - lastSourceLine\n            lastSourceLine = mapping.sourceLine\n\nThe starting column in the original source, relative to the previous column.\n\n            buffer += @encodeVlq mapping.sourceColumn - lastSourceColumn\n            lastSourceColumn = mapping.sourceColumn\n            needComma = yes\n\nProduce the canonical JSON object format for a \"v3\" source map.\n\n        sources = if options.sourceFiles\n          options.sourceFiles\n        else if options.filename\n          [options.filename]\n        else\n          ['<anonymous>']\n\n        v3 =\n          version:    3\n          file:       options.generatedFile or ''\n          sourceRoot: options.sourceRoot or ''\n          sources:    sources\n          names:      []\n          mappings:   buffer\n\n        v3.sourcesContent = [code] if options.sourceMap or options.inlineMap\n\n        v3\n\n\nBase64 VLQ Encoding\n-------------------\n\nNote that SourceMap VLQ encoding is \"backwards\".  MIDI-style VLQ encoding puts\nthe most-significant-bit (MSB) from the original value into the MSB of the VLQ\nencoded value (see [Wikipedia](https://en.wikipedia.org/wiki/File:Uintvar_coding.svg)).\nSourceMap VLQ does things the other way around, with the least significat four\nbits of the original value encoded into the first byte of the VLQ encoded value.\n\n      VLQ_SHIFT            = 5\n      VLQ_CONTINUATION_BIT = 1 << VLQ_SHIFT             # 0010 0000\n      VLQ_VALUE_MASK       = VLQ_CONTINUATION_BIT - 1   # 0001 1111\n\n      encodeVlq: (value) ->\n        answer = ''\n\n        # Least significant bit represents the sign.\n        signBit = if value < 0 then 1 else 0\n\n        # The next bits are the actual value.\n        valueToEncode = (Math.abs(value) << 1) + signBit\n\n        # Make sure we encode at least one character, even if valueToEncode is 0.\n        while valueToEncode or not answer\n          nextChunk = valueToEncode & VLQ_VALUE_MASK\n          valueToEncode = valueToEncode >> VLQ_SHIFT\n          nextChunk |= VLQ_CONTINUATION_BIT if valueToEncode\n          answer += @encodeBase64 nextChunk\n\n        answer\n\n\nRegular Base64 Encoding\n-----------------------\n\n      BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\n      encodeBase64: (value) ->\n        BASE64_CHARS[value] or throw new Error \"Cannot Base64 encode value: #{value}\"\n\n\nOur API for source maps is just the `SourceMap` class.\n\n    module.exports = SourceMap\n"
  },
  {
    "path": "test/abstract_syntax_tree.coffee",
    "content": "# Astract Syntax Tree generation\n# ------------------------------\n\n# Recursively compare all values of enumerable properties of `expected` with\n# those of `actual`. Use `looseArray` helper function to skip array length\n# comparison.\ndeepStrictIncludeExpectedProperties = (actual, expected) ->\n  eq actual.length, expected.length if expected instanceof Array and not expected.loose\n  for key, val of expected\n    if val? and typeof val is 'object'\n      fail \"Property #{reset}#{key}#{red} expected, but was missing\" unless actual[key]\n      deepStrictIncludeExpectedProperties actual[key], val\n    else\n      eq actual[key], val, \"\"\"\n        Property #{reset}#{key}#{red}: expected #{reset}#{actual[key]}#{red} to equal #{reset}#{val}#{red}\n          Expected AST output to include:\n          #{reset}#{inspect expected}#{red}\n          but instead it was:\n          #{reset}#{inspect actual}#{red}\n      \"\"\"\n  actual\n\n# Flag array for loose comparison. See reference to `.loose` in\n# `deepStrictIncludeExpectedProperties` above.\nlooseArray = (arr) ->\n  Object.defineProperty arr, 'loose',\n    value: yes\n    enumerable: no\n  arr\n\ntestAgainstExpected = (ast, expected) ->\n  if expected?\n    deepStrictIncludeExpectedProperties ast, expected\n  else\n    # Convenience for creating new tests; call `testExpression` with no second\n    # parameter to see what the current AST generation is for your input code.\n    console.log inspect ast\n\ntestExpression = (code, expected) ->\n  ast = getAstExpression code\n  testAgainstExpected ast, expected\n\ntestStatement = (code, expected) ->\n  ast = getAstStatement code\n  testAgainstExpected ast, expected\n\ntestComments = (code, expected) ->\n  ast = getAstRoot code\n  testAgainstExpected ast.comments, expected\n\ntest 'Confirm functionality of `deepStrictIncludeExpectedProperties`', ->\n  actual =\n    name: 'Name'\n    a:\n      b: 1\n      c: 2\n    x: [1, 2, 3]\n\n  check = (message, test, expected) ->\n    test (-> deepStrictIncludeExpectedProperties actual, expected), null, message\n\n  check 'Expected property does not match', throws,\n    name: '\"Name\"'\n\n  check 'Array length mismatch', throws,\n    x: [1, 2]\n\n  check 'Skip array length check', doesNotThrow,\n    x: looseArray [\n      1\n      2\n    ]\n\n  check 'Array length matches', doesNotThrow,\n    x: [1, 2, 3]\n\n  check 'Array prop mismatch', throws,\n    x: [3, 2, 1]\n\n  check 'Partial object comparison', doesNotThrow,\n    a:\n      c: 2\n    forbidden: undefined\n\n  check 'Actual has forbidden prop', throws,\n    a:\n      b: 1\n      c: undefined\n\n  check 'Check prop for existence only', doesNotThrow,\n    name: {}\n    a: {}\n    x: {}\n\n  check 'Prop is missing', throws,\n    missingProp: {}\n\n# Shorthand helpers for common AST patterns.\n\nEMPTY_BLOCK =\n  type: 'BlockStatement'\n  body: []\n  directives: []\n\nID = (name, additionalProperties = {}) ->\n  Object.assign({\n    type: 'Identifier'\n    name\n  }, additionalProperties)\n\nNUMBER = (value) -> {\n  type: 'NumericLiteral'\n  value\n}\n\nSTRING = (value) -> {\n  type: 'StringLiteral'\n  value\n}\n\n# Check each node type in the same order as they appear in `nodes.coffee`.\n# For nodes that have equivalents in Babel’s AST spec, we’re checking that\n# the type and properties match. When relevant, also check that values of\n# properties are as expected.\n\ntest \"AST as expected for Block node\", ->\n  deepStrictIncludeExpectedProperties CoffeeScript.compile('a', ast: yes),\n    type: 'File'\n    program:\n      type: 'Program'\n      # sourceType: 'module'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n      ]\n      directives: []\n    comments: []\n\n  deepStrictIncludeExpectedProperties CoffeeScript.compile('# comment', ast: yes),\n    type: 'File'\n    program:\n      type: 'Program'\n      body: []\n      directives: []\n    comments: [\n      type: 'CommentLine'\n      value: ' comment'\n    ]\n\n  deepStrictIncludeExpectedProperties CoffeeScript.compile('', ast: yes),\n    type: 'File'\n    program:\n      type: 'Program'\n      body: []\n      directives: []\n\n  deepStrictIncludeExpectedProperties CoffeeScript.compile(' ', ast: yes),\n    type: 'File'\n    program:\n      type: 'Program'\n      body: []\n      directives: []\n\ntest \"AST as expected for NumberLiteral node\", ->\n  testExpression '42',\n    type: 'NumericLiteral'\n    value: 42\n    extra:\n      rawValue: 42\n      raw: '42'\n\n  testExpression '0xE1',\n    type: 'NumericLiteral'\n    value: 225\n    extra:\n      rawValue: 225\n      raw: '0xE1'\n\n  testExpression '10_000',\n    type: 'NumericLiteral'\n    value: 10000\n    extra:\n      rawValue: 10000\n      raw: '10_000'\n\n  testExpression '1_2.34_5e6_7',\n    type: 'NumericLiteral'\n    value: 12.345e67\n    extra:\n      rawValue: 12.345e67\n      raw: '1_2.34_5e6_7'\n\n  testExpression '0o7_7_7',\n    type: 'NumericLiteral'\n    value: 0o777\n    extra:\n      rawValue: 0o777\n      raw: '0o7_7_7'\n\n  testExpression '42n',\n    type: 'BigIntLiteral'\n    value: '42'\n    extra:\n      rawValue: '42'\n      raw: '42n'\n\n  testExpression '2e3_08',\n    type: 'NumericLiteral'\n    value: Infinity\n    extra:\n      rawValue: Infinity\n      raw: '2e3_08'\n\ntest \"AST as expected for InfinityLiteral node\", ->\n  testExpression 'Infinity',\n    type: 'Identifier'\n    name: 'Infinity'\n\n  testExpression '2e308',\n    type: 'NumericLiteral'\n    value: Infinity\n    extra:\n      raw: '2e308'\n      rawValue: Infinity\n\ntest \"AST as expected for NaNLiteral node\", ->\n  testExpression 'NaN',\n    type: 'Identifier'\n    name: 'NaN'\n\ntest \"AST as expected for StringLiteral node\", ->\n  # Just a standalone string literal would be treated as a directive,\n  # so embed the string literal in an enclosing expression (e.g. a call).\n  testExpression 'a \"string cheese\"',\n    type: 'CallExpression'\n    arguments: [\n      type: 'StringLiteral'\n      value: 'string cheese'\n      extra:\n        raw: '\"string cheese\"'\n    ]\n\n  testExpression \"b 'cheese string'\",\n    type: 'CallExpression'\n    arguments: [\n      type: 'StringLiteral'\n      value: 'cheese string'\n      extra:\n        raw: \"'cheese string'\"\n    ]\n\n  testExpression \"'''heredoc'''\",\n    type: 'TemplateLiteral'\n    expressions: []\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: 'heredoc'\n      tail: yes\n    ]\n    quote: \"'''\"\n\ntest \"AST as expected for PassthroughLiteral node\", ->\n  code = 'const CONSTANT = \"unreassignable!\"'\n  testExpression \"`#{code}`\",\n    type: 'PassthroughLiteral'\n    value: code\n    here: no\n\n  code = '\\nconst CONSTANT = \"unreassignable!\"\\n'\n  testExpression \"```#{code}```\",\n    type: 'PassthroughLiteral'\n    value: code\n    here: yes\n\n  testExpression \"``\",\n    type: 'PassthroughLiteral'\n    value: ''\n    here: no\n\n  # escaped backticks\n  testExpression \"`\\\\`abc\\\\``\",\n    type: 'PassthroughLiteral'\n    value: '\\\\`abc\\\\`'\n    here: no\n\ntest \"AST as expected for IdentifierLiteral node\", ->\n  testExpression 'id',\n    type: 'Identifier'\n    name: 'id'\n\ntest \"AST as expected for JSXTag node\", ->\n  testExpression '<CSXY />',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'CSXY'\n      attributes: []\n      selfClosing: yes\n    closingElement: null\n    children: []\n\n  testExpression '<div></div>',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n    children: []\n\n  testExpression '<A.B />',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXMemberExpression'\n        object:\n          type: 'JSXIdentifier'\n          name: 'A'\n        property:\n          type: 'JSXIdentifier'\n          name: 'B'\n      attributes: []\n      selfClosing: yes\n    closingElement: null\n    children: []\n\n  testExpression '<Tag.Name.Here></Tag.Name.Here>',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXMemberExpression'\n        object:\n          type: 'JSXMemberExpression'\n          object:\n            type: 'JSXIdentifier'\n            name: 'Tag'\n          property:\n            type: 'JSXIdentifier'\n            name: 'Name'\n        property:\n          type: 'JSXIdentifier'\n          name: 'Here'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXMemberExpression'\n        object:\n          type: 'JSXMemberExpression'\n          object:\n            type: 'JSXIdentifier'\n            name: 'Tag'\n          property:\n            type: 'JSXIdentifier'\n            name: 'Name'\n        property:\n          type: 'JSXIdentifier'\n          name: 'Here'\n    children: []\n\n  testExpression '<></>',\n    type: 'JSXFragment'\n    openingFragment:\n      type: 'JSXOpeningFragment'\n    closingFragment:\n      type: 'JSXClosingFragment'\n    children: []\n\n  testExpression '<div a b=\"c\" d={e} {...f} />',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n      attributes: [\n        type: 'JSXAttribute'\n        name:\n          type: 'JSXIdentifier'\n          name: 'a'\n      ,\n        type: 'JSXAttribute'\n        name:\n          type: 'JSXIdentifier'\n          name: 'b'\n        value:\n          type: 'StringLiteral'\n          value: 'c'\n      ,\n        type: 'JSXAttribute'\n        name:\n          type: 'JSXIdentifier'\n          name: 'd'\n        value:\n          type: 'JSXExpressionContainer'\n          expression:\n            type: 'Identifier'\n            name: 'e'\n      ,\n        type: 'JSXSpreadAttribute'\n        argument:\n          type: 'Identifier'\n          name: 'f'\n        postfix: no\n      ]\n      selfClosing: yes\n    closingElement: null\n    children: []\n\n  testExpression '<div {f...} />',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      attributes: [\n        type: 'JSXSpreadAttribute'\n        argument:\n          type: 'Identifier'\n          name: 'f'\n        postfix: yes\n      ]\n\n  testExpression '<div>abc</div>',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n    children: [\n      type: 'JSXText'\n      extra:\n        raw: 'abc'\n      value: 'abc'\n    ]\n\n  testExpression '''\n    <a>\n      {b}\n      <c />\n    </a>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'a'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'a'\n    children: [\n      type: 'JSXText'\n      extra:\n        raw: '\\n  '\n      value: '\\n  '\n    ,\n      type: 'JSXExpressionContainer'\n      expression: ID 'b'\n    ,\n      type: 'JSXText'\n      extra:\n        raw: '\\n  '\n      value: '\\n  '\n    ,\n      type: 'JSXElement'\n      openingElement:\n        type: 'JSXOpeningElement'\n        name:\n          type: 'JSXIdentifier'\n          name: 'c'\n        selfClosing: true\n      closingElement: null\n      children: []\n    ,\n      type: 'JSXText'\n      extra:\n        raw: '\\n'\n      value: '\\n'\n    ]\n\n  testExpression '<>abc{}</>',\n    type: 'JSXFragment'\n    openingFragment:\n      type: 'JSXOpeningFragment'\n    closingFragment:\n      type: 'JSXClosingFragment'\n    children: [\n      type: 'JSXText'\n      extra:\n        raw: 'abc'\n      value: 'abc'\n    ,\n      type: 'JSXExpressionContainer'\n      expression:\n        type: 'JSXEmptyExpression'\n    ]\n\n  testExpression '''\n    <a>{<b />}</a>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'a'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'a'\n    children: [\n      type: 'JSXExpressionContainer'\n      expression:\n        type: 'JSXElement'\n        openingElement:\n          type: 'JSXOpeningElement'\n          name:\n            type: 'JSXIdentifier'\n            name: 'b'\n          selfClosing: true\n        closingElement: null\n        children: []\n    ]\n\n  testExpression '''\n    <div>{\n      # comment\n    }</div>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n    children: [\n      type: 'JSXExpressionContainer'\n      expression:\n        type: 'JSXEmptyExpression'\n    ]\n\n  testExpression '''\n    <div>{### here ###}</div>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n      attributes: []\n      selfClosing: no\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXIdentifier'\n        name: 'div'\n    children: [\n      type: 'JSXExpressionContainer'\n      expression:\n        type: 'JSXEmptyExpression'\n    ]\n\n  testExpression '<div:a b:c />',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXNamespacedName'\n        namespace:\n          type: 'JSXIdentifier'\n          name: 'div'\n        name:\n          type: 'JSXIdentifier'\n          name: 'a'\n      attributes: [\n        type: 'JSXAttribute'\n        name:\n          type: 'JSXNamespacedName'\n          namespace:\n            type: 'JSXIdentifier'\n            name: 'b'\n          name:\n            type: 'JSXIdentifier'\n            name: 'c'\n      ]\n      selfClosing: yes\n\n  testExpression '''\n    <div:a>\n      {b}\n    </div:a>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      type: 'JSXOpeningElement'\n      name:\n        type: 'JSXNamespacedName'\n        namespace:\n          type: 'JSXIdentifier'\n          name: 'div'\n        name:\n          type: 'JSXIdentifier'\n          name: 'a'\n    closingElement:\n      type: 'JSXClosingElement'\n      name:\n        type: 'JSXNamespacedName'\n        namespace:\n          type: 'JSXIdentifier'\n          name: 'div'\n        name:\n          type: 'JSXIdentifier'\n          name: 'a'\n\n  testExpression '''\n    <div b={\n      c\n      d\n    } />\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      attributes: [\n        value:\n          type: 'JSXExpressionContainer'\n          expression:\n            type: 'BlockStatement'\n            body: [\n              type: 'ExpressionStatement'\n            ,\n              type: 'ExpressionStatement'\n              expression:\n                returns: yes\n            ]\n      ]\n\ntest \"AST as expected for ComputedPropertyName node\", ->\n  testExpression '[fn]: ->',\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key:\n        type: 'Identifier'\n        name: 'fn'\n      value:\n        type: 'FunctionExpression'\n      computed: yes\n      shorthand: no\n      method: no\n    ]\n    implicit: yes\n\n  testExpression '[a]: b',\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key:\n        type: 'Identifier'\n        name: 'a'\n      value:\n        type: 'Identifier'\n        name: 'b'\n      computed: yes\n      shorthand: no\n      method: no\n    ]\n    implicit: yes\n\ntest \"AST as expected for StatementLiteral node\", ->\n  testStatement 'break',\n    type: 'BreakStatement'\n\n  testStatement 'continue',\n    type: 'ContinueStatement'\n\n  testStatement 'debugger',\n    type: 'DebuggerStatement'\n\ntest \"AST as expected for ThisLiteral node\", ->\n  testExpression 'this',\n    type: 'ThisExpression'\n    shorthand: no\n\n  testExpression '@',\n    type: 'ThisExpression'\n    shorthand: yes\n\n  testExpression '@b',\n    type: 'MemberExpression'\n    object:\n      type: 'ThisExpression'\n      shorthand: yes\n    property: ID 'b'\n\n  testExpression 'this.b',\n    type: 'MemberExpression'\n    object:\n      type: 'ThisExpression'\n      shorthand: no\n    property: ID 'b'\n\ntest \"AST as expected for UndefinedLiteral node\", ->\n  testExpression 'undefined',\n    type: 'Identifier'\n    name: 'undefined'\n\ntest \"AST as expected for NullLiteral node\", ->\n  testExpression 'null',\n    type: 'NullLiteral'\n\ntest \"AST as expected for BooleanLiteral node\", ->\n  testExpression 'true',\n    type: 'BooleanLiteral'\n    value: true\n    name: 'true'\n\n  testExpression 'off',\n    type: 'BooleanLiteral'\n    value: false\n    name: 'off'\n\n  testExpression 'yes',\n    type: 'BooleanLiteral'\n    value: true\n    name: 'yes'\n\ntest \"AST as expected for Return node\", ->\n  testStatement 'return no',\n    type: 'ReturnStatement'\n    argument:\n      type: 'BooleanLiteral'\n\n  testExpression '''\n    (a, b) ->\n      return a + b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ReturnStatement'\n        argument:\n          type: 'BinaryExpression'\n      ]\n\n  testExpression '-> return',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ReturnStatement'\n        argument: null\n      ]\n\ntest \"AST as expected for YieldReturn node\", ->\n  testExpression '-> yield return 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'YieldExpression'\n          argument:\n            type: 'ReturnStatement'\n            argument: NUMBER 1\n          delegate: no\n      ]\n\ntest \"AST as expected for AwaitReturn node\", ->\n  testExpression '-> await return 2',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AwaitExpression'\n          argument:\n            type: 'ReturnStatement'\n            argument: NUMBER 2\n      ]\n\ntest \"AST as expected for Call node\", ->\n  testExpression 'fn()',\n    type: 'CallExpression'\n    callee:\n      type: 'Identifier'\n      name: 'fn'\n    arguments: []\n    optional: no\n    implicit: no\n    returns: undefined\n\n  testExpression 'new Date()',\n    type: 'NewExpression'\n    callee:\n      type: 'Identifier'\n      name: 'Date'\n    arguments: []\n    optional: no\n    implicit: no\n\n  testExpression 'new Date?()',\n    type: 'NewExpression'\n    callee:\n      type: 'Identifier'\n      name: 'Date'\n    arguments: []\n    optional: yes\n    implicit: no\n\n  testExpression 'new Old',\n    type: 'NewExpression'\n    callee:\n      type: 'Identifier'\n      name: 'Old'\n    arguments: []\n    optional: no\n    implicit: no\n\n  testExpression 'new Old(1)',\n    type: 'NewExpression'\n    callee:\n      type: 'Identifier'\n      name: 'Old'\n    arguments: [\n      type: 'NumericLiteral'\n      value: 1\n    ]\n    optional: no\n    implicit: no\n\n  testExpression 'new Old 1',\n    type: 'NewExpression'\n    callee:\n      type: 'Identifier'\n      name: 'Old'\n    arguments: [\n      type: 'NumericLiteral'\n      value: 1\n    ]\n    optional: no\n    implicit: yes\n\n  testExpression 'maybe?()',\n    type: 'OptionalCallExpression'\n    optional: yes\n    implicit: no\n\n  testExpression 'maybe?(1 + 1)',\n    type: 'OptionalCallExpression'\n    arguments: [\n      type: 'BinaryExpression'\n    ]\n    optional: yes\n    implicit: no\n\n  testExpression 'maybe? 1 + 1',\n    type: 'OptionalCallExpression'\n    arguments: [\n      type: 'BinaryExpression'\n    ]\n    optional: yes\n    implicit: yes\n\n  testExpression 'goDo this, that',\n    type: 'CallExpression'\n    arguments: [\n      type: 'ThisExpression'\n    ,\n      type: 'Identifier'\n      name: 'that'\n    ]\n    implicit: yes\n    optional: no\n\n  testExpression 'a?().b',\n    type: 'OptionalMemberExpression'\n    object:\n      type: 'OptionalCallExpression'\n      optional: yes\n    optional: no\n\n  testExpression 'a?.b.c()',\n    type: 'OptionalCallExpression'\n    callee:\n      type: 'OptionalMemberExpression'\n      object:\n        type: 'OptionalMemberExpression'\n        optional: yes\n      optional: no\n    optional: no\n\n  testExpression 'a?.b?()',\n    type: 'OptionalCallExpression'\n    callee:\n      type: 'OptionalMemberExpression'\n      optional: yes\n    optional: yes\n\n  testExpression 'a?().b?()',\n    type: 'OptionalCallExpression'\n    callee:\n      type: 'OptionalMemberExpression'\n      optional: no\n      object:\n        type: 'OptionalCallExpression'\n        optional: yes\n    optional: yes\n\n  testExpression 'a().b?()',\n    type: 'OptionalCallExpression'\n    callee:\n      type: 'MemberExpression'\n      optional: no\n      object:\n        type: 'CallExpression'\n        optional: no\n    optional: yes\n\n  testExpression 'a?().b()',\n    type: 'OptionalCallExpression'\n    callee:\n      type: 'OptionalMemberExpression'\n      optional: no\n      object:\n        type: 'OptionalCallExpression'\n        optional: yes\n    optional: no\n\ntest \"AST as expected for SuperCall node\", ->\n  testStatement 'class child extends parent then constructor: -> super()',\n    type: 'ClassDeclaration'\n    body:\n      type: 'ClassBody'\n      body: [\n        body:\n          type: 'BlockStatement'\n          body: [\n            type: 'ExpressionStatement'\n            expression:\n              type: 'CallExpression'\n              callee:\n                type: 'Super'\n          ]\n      ]\n\ntest \"AST as expected for Super node\", ->\n  testStatement 'class child extends parent then func: -> super.prop',\n    type: 'ClassDeclaration'\n    body:\n      type: 'ClassBody'\n      body: [\n        body:\n          type: 'BlockStatement'\n          body: [\n            type: 'ExpressionStatement'\n            expression:\n              type: 'MemberExpression'\n              object:\n                type: 'Super'\n              property: ID 'prop'\n              computed: no\n          ]\n      ]\n\n  testStatement '''\n    class child extends parent\n      func: ->\n        super[prop]()\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      type: 'ClassBody'\n      body: [\n        body:\n          type: 'BlockStatement'\n          body: [\n            type: 'ExpressionStatement'\n            expression:\n              type: 'CallExpression'\n              callee:\n                type: 'MemberExpression'\n                object:\n                  type: 'Super'\n                property: ID 'prop'\n                computed: yes\n          ]\n      ]\n\ntest \"AST as expected for RegexWithInterpolations node\", ->\n  testExpression '///^#{flavor}script$///',\n    type: 'InterpolatedRegExpLiteral'\n    interpolatedPattern:\n      type: 'TemplateLiteral'\n      expressions: [\n        ID 'flavor'\n      ]\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: '^'\n        tail: no\n      ,\n        type: 'TemplateElement'\n        value:\n          raw: 'script$'\n        tail: yes\n      ]\n      quote: '///'\n    flags: ''\n\n  testExpression '''\n    ///\n      a\n      #{b}///ig\n  ''',\n    type: 'InterpolatedRegExpLiteral'\n    interpolatedPattern:\n      type: 'TemplateLiteral'\n      expressions: [\n        ID 'b'\n      ]\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: '\\n  a\\n  '\n        tail: no\n      ,\n        type: 'TemplateElement'\n        value:\n          raw: ''\n        tail: yes\n      ]\n      quote: '///'\n    flags: 'ig'\n\n  testExpression '''\n    ///\n      a # first\n      #{b} ### second ###\n    ///ig\n  ''',\n    type: 'InterpolatedRegExpLiteral'\n    interpolatedPattern:\n      type: 'TemplateLiteral'\n      expressions: [\n        ID 'b'\n      ]\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: '\\n  a # first\\n  '\n        tail: no\n      ,\n        type: 'TemplateElement'\n        value:\n          raw: ' ### second ###\\n'\n        tail: yes\n      ]\n      quote: '///'\n    flags: 'ig'\n    comments: [\n      type: 'CommentLine'\n      value: ' first'\n    ,\n      type: 'CommentBlock'\n      value: ' second '\n    ]\n\ntest \"AST as expected for TaggedTemplateCall node\", ->\n  testExpression 'func\"tagged\"',\n    type: 'TaggedTemplateExpression'\n    tag: ID 'func'\n    quasi:\n      type: 'TemplateLiteral'\n      expressions: []\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: 'tagged'\n        tail: yes\n      ]\n\n  testExpression 'a\"b#{c}\"',\n    type: 'TaggedTemplateExpression'\n    tag: ID 'a'\n    quasi:\n      type: 'TemplateLiteral'\n      expressions: [\n        ID 'c'\n      ]\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: 'b'\n        tail: no\n      ,\n        type: 'TemplateElement'\n        value:\n          raw: ''\n        tail: yes\n      ]\n\n  testExpression '''\n    a\"\"\"\n      b#{c}\n    \"\"\"\n  ''',\n    type: 'TaggedTemplateExpression'\n    tag: ID 'a'\n    quasi:\n      type: 'TemplateLiteral'\n      expressions: [\n        ID 'c'\n      ]\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: '\\n  b'\n        tail: no\n      ,\n        type: 'TemplateElement'\n        value:\n          raw: '\\n'\n        tail: yes\n      ]\n\n  testExpression \"\"\"\n    a'''\n      b\n    '''\n  \"\"\",\n    type: 'TaggedTemplateExpression'\n    tag: ID 'a'\n    quasi:\n      type: 'TemplateLiteral'\n      expressions: []\n      quasis: [\n        type: 'TemplateElement'\n        value:\n          raw: '\\n  b\\n'\n        tail: yes\n      ]\n\ntest \"AST as expected for Access node\", ->\n  testExpression 'obj.prop',\n    type: 'MemberExpression'\n    object:\n      type: 'Identifier'\n      name: 'obj'\n    property:\n      type: 'Identifier'\n      name: 'prop'\n    computed: no\n    optional: no\n    shorthand: no\n\n  testExpression 'obj?.prop',\n    type: 'OptionalMemberExpression'\n    object:\n      type: 'Identifier'\n      name: 'obj'\n    property:\n      type: 'Identifier'\n      name: 'prop'\n    computed: no\n    optional: yes\n    shorthand: no\n\n  testExpression 'a::b',\n    type: 'MemberExpression'\n    object:\n      type: 'MemberExpression'\n      object:\n        type: 'Identifier'\n        name: 'a'\n      property:\n        type: 'Identifier'\n        name: 'prototype'\n      computed: no\n      optional: no\n      shorthand: yes\n    property:\n      type: 'Identifier'\n      name: 'b'\n    computed: no\n    optional: no\n    shorthand: no\n\n  testExpression 'a.prototype.b',\n    type: 'MemberExpression'\n    object:\n      type: 'MemberExpression'\n      object:\n        type: 'Identifier'\n        name: 'a'\n      property:\n        type: 'Identifier'\n        name: 'prototype'\n      computed: no\n      optional: no\n      shorthand: no\n    property:\n      type: 'Identifier'\n      name: 'b'\n    computed: no\n    optional: no\n    shorthand: no\n\n  testExpression 'a?.b.c',\n    type: 'OptionalMemberExpression'\n    object:\n      type: 'OptionalMemberExpression'\n      object:\n        type: 'Identifier'\n        name: 'a'\n      property:\n        type: 'Identifier'\n        name: 'b'\n      computed: no\n      optional: yes\n      shorthand: no\n    property:\n      type: 'Identifier'\n      name: 'c'\n    computed: no\n    optional: no\n    shorthand: no\n\ntest \"AST as expected for Index node\", ->\n  testExpression 'a[b]',\n    type: 'MemberExpression'\n    object:\n      type: 'Identifier'\n      name: 'a'\n    property:\n      type: 'Identifier'\n      name: 'b'\n    computed: yes\n    optional: no\n    shorthand: no\n\n  testExpression 'a?[b]',\n    type: 'OptionalMemberExpression'\n    object:\n      type: 'Identifier'\n      name: 'a'\n    property:\n      type: 'Identifier'\n      name: 'b'\n    computed: yes\n    optional: yes\n    shorthand: no\n\n  testExpression 'a::[b]',\n    type: 'MemberExpression'\n    object:\n      type: 'MemberExpression'\n      object:\n        type: 'Identifier'\n        name: 'a'\n      property:\n        type: 'Identifier'\n        name: 'prototype'\n      computed: no\n      optional: no\n      shorthand: yes\n    property:\n      type: 'Identifier'\n      name: 'b'\n    computed: yes\n    optional: no\n    shorthand: no\n\n  testExpression 'a[b][3]',\n    type: 'MemberExpression'\n    object:\n      type: 'MemberExpression'\n      object:\n        type: 'Identifier'\n        name: 'a'\n      property:\n        type: 'Identifier'\n        name: 'b'\n      computed: yes\n      optional: no\n      shorthand: no\n    property:\n      type: 'NumericLiteral'\n      value: 3\n    computed: yes\n    optional: no\n    shorthand: no\n\n  testExpression 'a[if b then c]',\n    type: 'MemberExpression'\n    object: ID 'a'\n    property:\n      type: 'ConditionalExpression'\n      test: ID 'b'\n      consequent: ID 'c'\n    computed: yes\n    optional: no\n    shorthand: no\n\ntest \"AST as expected for Range node\", ->\n  testExpression '[x..y]',\n    type: 'Range'\n    exclusive: no\n    from:\n      name: 'x'\n    to:\n      name: 'y'\n\n  testExpression '[4...2]',\n    type: 'Range'\n    exclusive: yes\n    from:\n      value: 4\n    to:\n      value: 2\n\ntest \"AST as expected for Slice node\", ->\n  testExpression 'x[..y]',\n    property:\n      type: 'Range'\n      exclusive: no\n      from: null\n      to:\n        name: 'y'\n\n  testExpression 'x[y...]',\n    property:\n      type: 'Range'\n      exclusive: yes\n      from:\n        name: 'y'\n      to: null\n\n  testExpression 'x[...]',\n    property:\n      type: 'Range'\n      exclusive: yes\n      from: null\n      to: null\n\n  testExpression '\"abc\"[...2]',\n    type: 'MemberExpression'\n    property:\n      type: 'Range'\n      from: null\n      to:\n        type: 'NumericLiteral'\n        value: 2\n      exclusive: yes\n    computed: yes\n    optional: no\n    shorthand: no\n\n  testExpression 'x[...][a..][b...][..c][...d]',\n    type: 'MemberExpression'\n    object:\n      type: 'MemberExpression'\n      object:\n        type: 'MemberExpression'\n        object:\n          type: 'MemberExpression'\n          object:\n            type: 'MemberExpression'\n            property:\n              type: 'Range'\n              from: null\n              to: null\n              exclusive: yes\n          property:\n            type: 'Range'\n            from:\n              name: 'a'\n            to: null\n            exclusive: no\n        property:\n          type: 'Range'\n          from:\n            name: 'b'\n          to: null\n          exclusive: yes\n      property:\n        type: 'Range'\n        from: null\n        to:\n          name: 'c'\n        exclusive: no\n    property:\n      type: 'Range'\n      from: null\n      to:\n        name: 'd'\n      exclusive: yes\n\ntest \"AST as expected for Obj node\", ->\n  testExpression \"{a: 1, b, [c], @d, [e()]: f, 'g': 2, ...h, i...}\",\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key:\n        type: 'Identifier'\n        name: 'a'\n      value:\n        type: 'NumericLiteral'\n        value: 1\n      computed: no\n      shorthand: no\n    ,\n      type: 'ObjectProperty'\n      key:\n        type: 'Identifier'\n        name: 'b'\n      value:\n        type: 'Identifier'\n        name: 'b'\n      computed: no\n      shorthand: yes\n    ,\n      type: 'ObjectProperty'\n      key:\n        type: 'Identifier'\n        name: 'c'\n      value:\n        type: 'Identifier'\n        name: 'c'\n      computed: yes\n      shorthand: yes\n    ,\n      type: 'ObjectProperty'\n      key:\n        type: 'MemberExpression'\n        object:\n          type: 'ThisExpression'\n        property:\n          type: 'Identifier'\n          name: 'd'\n      value:\n        type: 'MemberExpression'\n        object:\n          type: 'ThisExpression'\n        property:\n          type: 'Identifier'\n          name: 'd'\n      computed: no\n      shorthand: yes\n    ,\n      type: 'ObjectProperty'\n      key:\n        type: 'CallExpression'\n        callee:\n          type: 'Identifier'\n          name: 'e'\n        arguments: []\n      value:\n        type: 'Identifier'\n        name: 'f'\n      computed: yes\n      shorthand: no\n    ,\n      type: 'ObjectProperty'\n      key:\n        type: 'StringLiteral'\n        value: 'g'\n      value:\n        type: 'NumericLiteral'\n        value: 2\n      computed: no\n      shorthand: no\n    ,\n      type: 'SpreadElement'\n      argument:\n        type: 'Identifier'\n        name: 'h'\n      postfix: no\n    ,\n      type: 'SpreadElement'\n      argument:\n        type: 'Identifier'\n        name: 'i'\n      postfix: yes\n    ]\n    implicit: no\n\n  testExpression 'a: 1',\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key:\n        type: 'Identifier'\n        name: 'a'\n      value:\n        type: 'NumericLiteral'\n        value: 1\n      shorthand: no\n      computed: no\n    ]\n    implicit: yes\n\n  testExpression '''\n    a:\n      if b then c\n  ''',\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key: ID 'a'\n      value:\n        type: 'ConditionalExpression'\n        test: ID 'b'\n        consequent: ID 'c'\n    ]\n    implicit: yes\n\n  testExpression '''\n    a:\n      c if b\n  ''',\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key: ID 'a'\n      value:\n        type: 'ConditionalExpression'\n        test: ID 'b'\n        consequent: ID 'c'\n    ]\n    implicit: yes\n\n  testExpression '\"#{a}\": 1',\n    type: 'ObjectExpression'\n    properties: [\n      type: 'ObjectProperty'\n      key:\n        type: 'TemplateLiteral'\n        expressions: [\n          ID 'a'\n        ]\n      value:\n        type: 'NumericLiteral'\n        value: 1\n      shorthand: no\n      computed: yes\n    ]\n    implicit: yes\n\ntest \"AST as expected for Arr node\", ->\n  testExpression '[]',\n    type: 'ArrayExpression'\n    elements: []\n\n  testExpression '[3, tables, !1]',\n    type: 'ArrayExpression'\n    elements: [\n      {value: 3}\n      {name: 'tables'}\n      {operator: '!'}\n    ]\n\ntest \"AST as expected for Class node\", ->\n  testStatement 'class Klass',\n    type: 'ClassDeclaration'\n    id: ID 'Klass', declaration: yes\n    superClass: null\n    body:\n      type: 'ClassBody'\n      body: []\n\n  testStatement 'class child extends parent',\n    type: 'ClassDeclaration'\n    id: ID 'child', declaration: yes\n    superClass: ID 'parent', declaration: no\n    body:\n      type: 'ClassBody'\n      body: []\n\n  testStatement 'class Klass then constructor: -> @a = 1',\n    type: 'ClassDeclaration'\n    id: ID 'Klass', declaration: yes\n    superClass: null\n    body:\n      type: 'ClassBody'\n      body: [\n        type: 'ClassMethod'\n        static: no\n        key: ID 'constructor', declaration: no\n        computed: no\n        kind: 'constructor'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body:\n          type: 'BlockStatement'\n          body: [\n            type: 'ExpressionStatement'\n            expression:\n              type: 'AssignmentExpression'\n              returns: undefined\n          ]\n        bound: no\n      ]\n\n  testExpression '''\n    a = class A\n      b: ->\n        c\n      d: =>\n        e\n  ''',\n    type: 'AssignmentExpression'\n    right:\n      type: 'ClassExpression'\n      id: ID 'A', declaration: yes\n      superClass: null\n      body:\n        type: 'ClassBody'\n        body: [\n          type: 'ClassMethod'\n          static: no\n          key: ID 'b'\n          computed: no\n          kind: 'method'\n          id: null\n          generator: no\n          async: no\n          params: []\n          body:\n            type: 'BlockStatement'\n            body: [\n              type: 'ExpressionStatement'\n              expression: ID 'c', returns: yes\n            ]\n          operator: ':'\n          bound: no\n        ,\n          type: 'ClassMethod'\n          static: no\n          key: ID 'd'\n          computed: no\n          kind: 'method'\n          id: null\n          generator: no\n          async: no\n          params: []\n          body:\n            type: 'BlockStatement'\n            body: [\n              type: 'ExpressionStatement'\n              expression: ID 'e'\n            ]\n          operator: ':'\n          bound: yes\n        ]\n\n  testStatement '''\n    class A\n      @b: ->\n      @c = =>\n      @d: 1\n      @e = 2\n      j = 5\n      A.f = 3\n      A.g = ->\n      this.h = ->\n      this.i = 4\n  ''',\n    type: 'ClassDeclaration'\n    id: ID 'A', declaration: yes\n    superClass: null\n    body:\n      type: 'ClassBody'\n      body: [\n        type: 'ClassMethod'\n        static: yes\n        key: ID 'b'\n        computed: no\n        kind: 'method'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        operator: ':'\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: yes\n        bound: no\n      ,\n        type: 'ClassMethod'\n        static: yes\n        key: ID 'c'\n        computed: no\n        kind: 'method'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        operator: '='\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: yes\n        bound: yes\n      ,\n        type: 'ClassProperty'\n        static: yes\n        key: ID 'd'\n        computed: no\n        value: NUMBER 1\n        operator: ':'\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: yes\n      ,\n        type: 'ClassProperty'\n        static: yes\n        key: ID 'e'\n        computed: no\n        value: NUMBER 2\n        operator: '='\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: yes\n      ,\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left: ID 'j', declaration: yes\n          right: NUMBER 5\n      ,\n        type: 'ClassProperty'\n        static: yes\n        key: ID 'f'\n        computed: no\n        value: NUMBER 3\n        operator: '='\n        staticClassName: ID 'A'\n      ,\n        type: 'ClassMethod'\n        static: yes\n        key: ID 'g'\n        computed: no\n        kind: 'method'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        operator: '='\n        staticClassName: ID 'A'\n        bound: no\n      ,\n        type: 'ClassMethod'\n        static: yes\n        key: ID 'h'\n        computed: no\n        kind: 'method'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        operator: '='\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: no\n        bound: no\n      ,\n        type: 'ClassProperty'\n        static: yes\n        key: ID 'i'\n        computed: no\n        value: NUMBER 4\n        operator: '='\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: no\n      ]\n\n  testStatement '''\n    class A\n      b: 1\n      [c]: 2\n      [d]: ->\n      @[e]: ->\n      @[f]: 3\n  ''',\n    type: 'ClassDeclaration'\n    id: ID 'A', declaration: yes\n    superClass: null\n    body:\n      type: 'ClassBody'\n      body: [\n        type: 'ClassPrototypeProperty'\n        key: ID 'b', declaration: no\n        value: NUMBER 1\n        computed: no\n      ,\n        type: 'ClassPrototypeProperty'\n        key: ID 'c'\n        value: NUMBER 2\n        computed: yes\n      ,\n        type: 'ClassMethod'\n        static: no\n        key: ID 'd'\n        computed: yes\n        kind: 'method'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        operator: ':'\n        bound: no\n      ,\n        type: 'ClassMethod'\n        static: yes\n        key: ID 'e'\n        computed: yes\n        kind: 'method'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        operator: ':'\n        bound: no\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: yes\n      ,\n        type: 'ClassProperty'\n        static: yes\n        key: ID 'f'\n        computed: yes\n        value: NUMBER 3\n        operator: ':'\n        staticClassName:\n          type: 'ThisExpression'\n          shorthand: yes\n      ]\n\n  testStatement '''\n    class A\n      @[b] = ->\n      \"#{c}\": ->\n      @[d] = 1\n      [e]: 2\n      \"#{f}\": 3\n      @[g]: 4\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      body: [\n        type: 'ClassMethod'\n        computed: yes\n      ,\n        type: 'ClassMethod'\n        computed: yes\n      ,\n        type: 'ClassProperty'\n        computed: yes\n      ,\n        type: 'ClassPrototypeProperty'\n        computed: yes\n      ,\n        type: 'ClassPrototypeProperty'\n        computed: yes\n      ,\n        type: 'ClassProperty'\n        computed: yes\n      ]\n\n  testStatement '''\n    class A.b\n  ''',\n    type: 'ClassDeclaration'\n    id:\n      type: 'MemberExpression'\n      object: ID 'A', declaration: no\n      property: ID 'b', declaration: no\n\n  testStatement '''\n    class A\n      'constructor': ->\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      type: 'ClassBody'\n      body: [\n        type: 'ClassMethod'\n        static: no\n        key:\n          type: 'StringLiteral'\n        computed: no\n        kind: 'constructor'\n        id: null\n        generator: no\n        async: no\n        params: []\n        body: EMPTY_BLOCK\n        bound: no\n      ]\n\n\ntest \"AST as expected for ModuleDeclaration node\", ->\n  testStatement 'export {X}',\n    type: 'ExportNamedDeclaration'\n    declaration: null\n    specifiers: [\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'X'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'X'\n        declaration: no\n    ]\n    source: null\n    exportKind: 'value'\n\n  testStatement 'import X from \".\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      type: 'ImportDefaultSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'X'\n        declaration: no\n    ]\n    importKind: 'value'\n    source:\n      type: 'StringLiteral'\n      value: '.'\n\n  testStatement 'import X from \".\" assert { type: \"json\" }',\n    type: 'ImportDeclaration'\n    specifiers: [\n      type: 'ImportDefaultSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'X'\n        declaration: no\n    ]\n    importKind: 'value'\n    source:\n      type: 'StringLiteral'\n      value: '.'\n    assertions: [\n      type: 'ImportAttribute'\n      key:\n        type: 'Identifier'\n        name: 'type'\n      value:\n        type: 'StringLiteral'\n        value: 'json'\n        extra:\n          raw: '\"json\"'\n    ]\n\ntest \"AST as expected for ImportDeclaration node\", ->\n  testStatement 'import React, {Component} from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      type: 'ImportDefaultSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'React'\n        declaration: no\n    ,\n      type: 'ImportSpecifier'\n      imported:\n        type: 'Identifier'\n        name: 'Component'\n        declaration: no\n      importKind: null\n      local:\n        type: 'Identifier'\n        name: 'Component'\n        declaration: no\n    ]\n    importKind: 'value'\n    source:\n      type: 'StringLiteral'\n      value: 'react'\n      extra:\n        raw: '\"react\"'\n\ntest \"AST as expected for ExportNamedDeclaration node\", ->\n  testStatement 'export {}',\n    type: 'ExportNamedDeclaration'\n    declaration: null\n    specifiers: []\n    source: null\n    exportKind: 'value'\n\n  testStatement 'export fn = ->',\n    type: 'ExportNamedDeclaration'\n    declaration:\n      type: 'AssignmentExpression'\n      left:\n        type: 'Identifier'\n        declaration: yes\n      right:\n        type: 'FunctionExpression'\n    specifiers: []\n    source: null\n    exportKind: 'value'\n\n  testStatement 'export class A',\n    type: 'ExportNamedDeclaration'\n    declaration:\n      type: 'ClassDeclaration'\n      id: ID 'A', declaration: yes\n      superClass: null\n      body:\n        type: 'ClassBody'\n        body: []\n    specifiers: []\n    source: null\n    exportKind: 'value'\n\n  testStatement 'export {x as y, z as default}',\n    type: 'ExportNamedDeclaration'\n    declaration: null\n    specifiers: [\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'x'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'y'\n        declaration: no\n    ,\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'z'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'default'\n        declaration: no\n    ]\n    source: null\n    exportKind: 'value'\n\n  testStatement 'export {default, default as b} from \"./abc\"',\n    type: 'ExportNamedDeclaration'\n    declaration: null\n    specifiers: [\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'default'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'default'\n        declaration: no\n    ,\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'default'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'b'\n        declaration: no\n    ]\n    source:\n      type: 'StringLiteral'\n      value: './abc'\n      extra:\n        raw: '\"./abc\"'\n    exportKind: 'value'\n\ntest \"AST as expected for ExportDefaultDeclaration node\", ->\n  testStatement 'export default class',\n    type: 'ExportDefaultDeclaration'\n    declaration:\n      type: 'ClassDeclaration'\n\n  testStatement 'export default \"abc\"',\n    type: 'ExportDefaultDeclaration'\n    declaration:\n      type: 'StringLiteral'\n      value: 'abc'\n      extra:\n        raw: '\"abc\"'\n\n  testStatement 'export default a = b',\n    type: 'ExportDefaultDeclaration'\n    declaration:\n      type: 'AssignmentExpression'\n      left: ID 'a', declaration: yes\n      right: ID 'b', declaration: no\n\ntest \"AST as expected for ExportAllDeclaration node\", ->\n  testStatement 'export * from \"module-name\"',\n    type: 'ExportAllDeclaration'\n    source:\n      type: 'StringLiteral'\n      value: 'module-name'\n      extra:\n        raw: '\"module-name\"'\n    exportKind: 'value'\n\n  testStatement 'export * from \"module-name\" assert { type: \"json\" }',\n    type: 'ExportAllDeclaration'\n    source:\n      type: 'StringLiteral'\n      value: 'module-name'\n      extra:\n        raw: '\"module-name\"'\n    assertions: [\n      type: 'ImportAttribute'\n      key:\n        type: 'Identifier'\n        name: 'type'\n      value:\n        type: 'StringLiteral'\n        value: 'json'\n        extra:\n          raw: '\"json\"'\n    ]\n    exportKind: 'value'\n\ntest \"AST as expected for ExportSpecifierList node\", ->\n  testStatement 'export {a, b, c}',\n    type: 'ExportNamedDeclaration'\n    declaration: null\n    specifiers: [\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'a'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'a'\n        declaration: no\n    ,\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'b'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'b'\n        declaration: no\n    ,\n      type: 'ExportSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'c'\n        declaration: no\n      exported:\n        type: 'Identifier'\n        name: 'c'\n        declaration: no\n    ]\n\ntest \"AST as expected for ImportDefaultSpecifier node\", ->\n  testStatement 'import React from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      type: 'ImportDefaultSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'React'\n        declaration: no\n    ]\n    importKind: 'value'\n    source:\n      type: 'StringLiteral'\n      value: 'react'\n\ntest \"AST as expected for ImportNamespaceSpecifier node\", ->\n  testStatement 'import * as React from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      type: 'ImportNamespaceSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'React'\n        declaration: no\n    ]\n    importKind: 'value'\n    source:\n      type: 'StringLiteral'\n      value: 'react'\n\n  testStatement 'import React, * as ReactStar from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      type: 'ImportDefaultSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'React'\n        declaration: no\n    ,\n      type: 'ImportNamespaceSpecifier'\n      local:\n        type: 'Identifier'\n        name: 'ReactStar'\n        declaration: no\n    ]\n    importKind: 'value'\n    source:\n      type: 'StringLiteral'\n      value: 'react'\n\ntest \"AST as expected for Assign node\", ->\n  testExpression 'a = b',\n    type: 'AssignmentExpression'\n    left:\n      type: 'Identifier'\n      name: 'a'\n      declaration: yes\n    right:\n      type: 'Identifier'\n      name: 'b'\n      declaration: no\n    operator: '='\n\n  testExpression 'a += b',\n    type: 'AssignmentExpression'\n    left:\n      type: 'Identifier'\n      name: 'a'\n      declaration: no\n    right:\n      type: 'Identifier'\n      name: 'b'\n      declaration: no\n    operator: '+='\n\n  testExpression '[@a = 2, {b: {c = 3} = {}, d...}, ...e] = f',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ArrayPattern'\n      elements: [\n        type: 'AssignmentPattern'\n        left:\n          type: 'MemberExpression'\n          object:\n            type: 'ThisExpression'\n          property:\n            name: 'a'\n            declaration: no\n        right:\n          type: 'NumericLiteral'\n      ,\n        type: 'ObjectPattern'\n        properties: [\n          type: 'ObjectProperty'\n          key:\n            name: 'b'\n            declaration: no\n          value:\n            type: 'AssignmentPattern'\n            left:\n              type: 'ObjectPattern'\n              properties: [\n                type: 'ObjectProperty'\n                key:\n                  name: 'c'\n                value:\n                  type: 'AssignmentPattern'\n                  left:\n                    name: 'c'\n                    declaration: yes\n                  right:\n                    value: 3\n                shorthand: yes\n              ]\n            right:\n              type: 'ObjectExpression'\n              properties: []\n        ,\n          type: 'RestElement'\n          argument:\n            name: 'd'\n            declaration: yes\n          postfix: yes\n        ]\n      ,\n        type: 'RestElement'\n        argument:\n          name: 'e'\n          declaration: yes\n        postfix: no\n      ]\n    right:\n      name: 'f'\n\n  testExpression '{a: [...b]} = c',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'ObjectProperty'\n        key:\n          name: 'a'\n          declaration: no\n        value:\n          type: 'ArrayPattern'\n          elements: [\n            type: 'RestElement'\n            argument:\n              name: 'b'\n              declaration: yes\n          ]\n      ]\n    right:\n      name: 'c'\n      declaration: no\n\n  testExpression '(a = 1; a ?= b)',\n    type: 'SequenceExpression'\n    expressions: [\n      type: 'AssignmentExpression'\n    ,\n      type: 'AssignmentExpression'\n      left:\n        type: 'Identifier'\n        name: 'a'\n        declaration: no\n      right:\n        type: 'Identifier'\n        name: 'b'\n        declaration: no\n      operator: '?='\n    ]\n\n  testExpression '[a..., b] = c',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ArrayPattern'\n      elements: [\n        type: 'RestElement'\n        argument: ID 'a', declaration: yes\n        postfix: yes\n      ,\n        ID 'b'\n      ]\n    right:\n      ID 'c'\n\n  testExpression '[] = c',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ArrayPattern'\n      elements: []\n    right:\n      ID 'c'\n\n  testExpression '{{a...}...} = b',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'RestElement'\n        argument:\n          type: 'ObjectPattern'\n          properties: [\n            type: 'RestElement'\n            argument: ID 'a'\n          ]\n        postfix: yes\n      ]\n    right: ID 'b'\n\n  testExpression '{a..., b} = c',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'RestElement'\n        argument: ID 'a'\n        postfix: yes\n      ,\n        type: 'ObjectProperty'\n      ]\n    right: ID 'c'\n\n  testExpression '{a.b...} = c',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'RestElement'\n        argument:\n          type: 'MemberExpression'\n        postfix: yes\n      ]\n    right: ID 'c'\n\n  testExpression '{{a}...} = b',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'RestElement'\n        argument:\n          type: 'ObjectPattern'\n          properties: [\n            type: 'ObjectProperty'\n            shorthand: yes\n          ]\n        postfix: yes\n      ]\n    right: ID 'b'\n\n  testExpression '[u, [v, ...w, x], ...{...y}, z] = a',\n    left:\n      type: 'ArrayPattern'\n\n  testExpression '{...{a: [...b, c]}} = d',\n    left:\n      type: 'ObjectPattern'\n\n  testExpression '{\"#{a}\": b} = c',\n    left:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'ObjectProperty'\n        key:\n          type: 'TemplateLiteral'\n          expressions: [\n            ID 'a'\n          ]\n        computed: yes\n      ]\n\ntest \"AST as expected for Code node\", ->\n  testExpression '=>',\n    type: 'ArrowFunctionExpression'\n    params: []\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n    hasIndentedBody: no\n\n  testExpression '''\n    (a, b = 1) ->\n      c\n      d()\n  ''',\n    type: 'FunctionExpression'\n    params: [\n      type: 'Identifier'\n      name: 'a'\n      declaration: no\n    ,\n      type: 'AssignmentPattern'\n      left:\n        type: 'Identifier'\n        name: 'b'\n        declaration: no\n      right:\n        type: 'NumericLiteral'\n        value: 1\n    ]\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n          name: 'c'\n      ,\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n          returns: yes\n      ]\n      directives: []\n    generator: no\n    async: no\n    id: null\n    hasIndentedBody: yes\n\n  testExpression '({a}) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'ObjectPattern'\n      properties: [\n        type: 'ObjectProperty'\n        key: ID 'a', declaration: no\n        value: ID 'a', declaration: no\n        shorthand: yes\n      ]\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '([a]) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'ArrayPattern'\n      elements: [\n        ID 'a', declaration: no\n      ]\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '({a = 1} = {}) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'AssignmentPattern'\n      left:\n        type: 'ObjectPattern'\n        properties: [\n          type: 'ObjectProperty'\n          key: ID 'a', declaration: no\n          value:\n            type: 'AssignmentPattern'\n            left: ID 'a', declaration: no\n            right: NUMBER(1)\n          shorthand: yes\n        ]\n      right:\n        type: 'ObjectExpression'\n        properties: []\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '([a = 1] = []) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'AssignmentPattern'\n      left:\n        type: 'ArrayPattern'\n        elements: [\n          type: 'AssignmentPattern'\n          left: ID 'a', declaration: no\n          right: NUMBER(1)\n        ]\n      right:\n        type: 'ArrayExpression'\n        elements: []\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '() ->',\n    type: 'FunctionExpression'\n    params: []\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '(@a) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'MemberExpression'\n      object:\n        type: 'ThisExpression'\n        shorthand: yes\n      property: ID 'a', declaration: no\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '(@a = 1) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'AssignmentPattern'\n      left:\n        type: 'MemberExpression'\n      right: NUMBER 1\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '({@a}) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'ObjectPattern'\n      properties: [\n        type: 'ObjectProperty'\n        key:\n          type: 'MemberExpression'\n        value:\n          type: 'MemberExpression'\n        shorthand: yes\n        computed: no\n      ]\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '({[a]}) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'ObjectPattern'\n      properties: [\n        type: 'ObjectProperty'\n        key:   ID 'a', declaration: no\n        value: ID 'a', declaration: no\n        shorthand: yes\n        computed: yes\n      ]\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '(...a) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'RestElement'\n      argument: ID 'a', declaration: no\n      postfix: no\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '(a...) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'RestElement'\n      argument: ID 'a'\n      postfix: yes\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '(..., a) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'RestElement'\n      argument: null\n    ,\n      ID 'a'\n    ]\n    body: EMPTY_BLOCK\n    generator: no\n    async: no\n    id: null\n\n  testExpression '-> a',\n    type: 'FunctionExpression'\n    params: []\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'a', returns: yes\n      ]\n    generator: no\n    async: no\n    id: null\n    hasIndentedBody: no\n\n  testExpression '-> await 3',\n    type: 'FunctionExpression'\n    params: []\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AwaitExpression'\n          argument: NUMBER 3\n          returns: yes\n      ]\n    generator: no\n    async: yes\n    id: null\n\n  testExpression '-> yield 4',\n    type: 'FunctionExpression'\n    params: []\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'YieldExpression'\n          argument: NUMBER 4\n          delegate: no\n      ]\n    generator: yes\n    async: no\n    id: null\n\n  testExpression '-> yield',\n    type: 'FunctionExpression'\n    params: []\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'YieldExpression'\n          argument: null\n          delegate: no\n      ]\n    generator: yes\n    async: no\n    id: null\n\n  testExpression '(a) -> a = 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left:\n            ID 'a', declaration: no\n      ]\n\n  testExpression '(...a) -> a = 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left:\n            ID 'a', declaration: no\n      ]\n\n  testExpression '({a}) -> a = 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left:\n            ID 'a', declaration: no\n      ]\n\n  testExpression '([a]) -> a = 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left:\n            ID 'a', declaration: no\n      ]\n\n  testExpression '(a = 1) -> a = 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left:\n            ID 'a', declaration: no\n      ]\n    generator: no\n    async: no\n    id: null\n\n  testExpression '({a} = 1) -> a = 1',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n          left:\n            ID 'a', declaration: no\n      ]\n    generator: no\n    async: no\n    id: null\n\ntest \"AST as expected for Splat node\", ->\n  testExpression '[a...]',\n    type: 'ArrayExpression'\n    elements: [\n      type: 'SpreadElement'\n      argument:\n        type: 'Identifier'\n        name: 'a'\n        declaration: no\n      postfix: yes\n    ]\n\n  testExpression '[b, ...c]',\n    type: 'ArrayExpression'\n    elements: [\n      name: 'b'\n      declaration: no\n    ,\n      type: 'SpreadElement'\n      argument:\n        type: 'Identifier'\n        name: 'c'\n        declaration: no\n      postfix: no\n    ]\n\ntest \"AST as expected for Expansion node\", ->\n  testExpression '(..., b) ->',\n    type: 'FunctionExpression'\n    params: [\n      type: 'RestElement'\n      argument: null\n    ,\n      ID 'b'\n    ]\n\n  testExpression '[..., b] = c',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ArrayPattern'\n      elements: [\n        type: 'RestElement'\n        argument: null\n      ,\n        type: 'Identifier'\n      ]\n\ntest \"AST as expected for Elision node\", ->\n  testExpression '[,,,a,,,b]',\n    type: 'ArrayExpression'\n    elements: [\n      null, null, null\n      name: 'a'\n      null, null\n      name: 'b'\n    ]\n\n  testExpression '[,,,a,,,b] = \"asdfqwer\"',\n    type: 'AssignmentExpression'\n    left:\n      type: 'ArrayPattern'\n      elements: [\n        null, null, null\n      ,\n        type: 'Identifier'\n        name: 'a'\n      ,\n        null, null\n      ,\n        type: 'Identifier'\n        name: 'b'\n      ]\n    right:\n      type: 'StringLiteral'\n      value: 'asdfqwer'\n\ntest \"AST as expected for While node\", ->\n  testStatement 'loop 1',\n    type: 'WhileStatement'\n    test:\n      type: 'BooleanLiteral'\n      value: true\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: NUMBER 1\n      ]\n    guard: null\n    inverted: no\n    postfix: no\n    loop: yes\n\n  testStatement 'while 1 < 2 then',\n    type: 'WhileStatement'\n    test:\n      type: 'BinaryExpression'\n    body:\n      type: 'BlockStatement'\n      body: []\n    guard: null\n    inverted: no\n    postfix: no\n    loop: no\n\n  testStatement 'while 1 < 2 then fn()',\n    type: 'WhileStatement'\n    test:\n      type: 'BinaryExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n      ]\n    guard: null\n    inverted: no\n    postfix: no\n    loop: no\n\n  testStatement '''\n    x() until y\n  ''',\n    type: 'WhileStatement'\n    test: ID 'y'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n          returns: undefined\n      ]\n    guard: null\n    inverted: yes\n    postfix: yes\n    loop: no\n\n  testStatement '''\n    until x when y\n      z++\n  ''',\n    type: 'WhileStatement'\n    test: ID 'x'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'UpdateExpression'\n      ]\n    guard: ID 'y'\n    inverted: yes\n    postfix: no\n    loop: no\n\n  testStatement '''\n    x while y when z\n  ''',\n    type: 'WhileStatement'\n    test: ID 'y'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'x'\n      ]\n    guard: ID 'z'\n    inverted: no\n    postfix: yes\n    loop: no\n\n  testStatement '''\n    loop\n      a()\n      b++\n  ''',\n    type: 'WhileStatement'\n    test:\n      type: 'BooleanLiteral'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n      ,\n        type: 'ExpressionStatement'\n        expression:\n          type: 'UpdateExpression'\n      ]\n    guard: null\n    inverted: no\n    postfix: no\n    loop: yes\n\n  testExpression '''\n    x = (z() while y)\n  ''',\n    type: 'AssignmentExpression'\n    right:\n      type: 'WhileStatement'\n      body:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n          expression:\n            type: 'CallExpression'\n            returns: yes\n        ]\n\ntest \"AST as expected for Op node\", ->\n  testExpression 'a <= 2',\n    type: 'BinaryExpression'\n    operator: '<='\n    left:\n      type: 'Identifier'\n      name: 'a'\n    right:\n      type: 'NumericLiteral'\n      value: 2\n\n  testExpression 'a is 2',\n    type: 'BinaryExpression'\n    operator: 'is'\n    left:\n      type: 'Identifier'\n      name: 'a'\n    right:\n      type: 'NumericLiteral'\n      value: 2\n\n  testExpression 'a // 2',\n    type: 'BinaryExpression'\n    operator: '//'\n    left:\n      type: 'Identifier'\n      name: 'a'\n    right:\n      type: 'NumericLiteral'\n      value: 2\n\n  testExpression 'a << 2',\n    type: 'BinaryExpression'\n    operator: '<<'\n    left:\n      type: 'Identifier'\n      name: 'a'\n    right:\n      type: 'NumericLiteral'\n      value: 2\n\n  testExpression 'typeof x',\n    type: 'UnaryExpression'\n    operator: 'typeof'\n    prefix: yes\n    argument:\n      type: 'Identifier'\n      name: 'x'\n\n  testExpression 'delete x.y',\n    type: 'UnaryExpression'\n    operator: 'delete'\n    prefix: yes\n    argument:\n      type: 'MemberExpression'\n\n  testExpression 'do x',\n    type: 'UnaryExpression'\n    operator: 'do'\n    prefix: yes\n    argument:\n      type: 'Identifier'\n      name: 'x'\n\n  testExpression 'do ->',\n    type: 'UnaryExpression'\n    operator: 'do'\n    prefix: yes\n    argument:\n      type: 'FunctionExpression'\n\n  testExpression '!x',\n    type: 'UnaryExpression'\n    operator: '!'\n    prefix: yes\n    argument:\n      type: 'Identifier'\n      name: 'x'\n\n  testExpression 'not x',\n    type: 'UnaryExpression'\n    operator: 'not'\n    prefix: yes\n    argument:\n      type: 'Identifier'\n      name: 'x'\n\n  testExpression '--x',\n    type: 'UpdateExpression'\n    operator: '--'\n    prefix: yes\n    argument:\n      type: 'Identifier'\n      name: 'x'\n\n  testExpression 'x++',\n    type: 'UpdateExpression'\n    operator: '++'\n    prefix: no\n    argument:\n      type: 'Identifier'\n      name: 'x'\n\n  testExpression 'x && y',\n    type: 'LogicalExpression'\n    operator: '&&'\n    left:\n      type: 'Identifier'\n      name: 'x'\n    right:\n      type: 'Identifier'\n      name: 'y'\n\n  testExpression 'x or y',\n    type: 'LogicalExpression'\n    operator: 'or'\n    left:\n      type: 'Identifier'\n      name: 'x'\n    right:\n      type: 'Identifier'\n      name: 'y'\n\n  testExpression 'x ? y',\n    type: 'LogicalExpression'\n    operator: '?'\n    left:\n      type: 'Identifier'\n      name: 'x'\n    right:\n      type: 'Identifier'\n      name: 'y'\n\n  testExpression 'x in y',\n    type: 'BinaryExpression'\n    operator: 'in'\n    left:\n      type: 'Identifier'\n      name: 'x'\n    right:\n      type: 'Identifier'\n      name: 'y'\n\n  testExpression 'x not in y',\n    type: 'BinaryExpression'\n    operator: 'not in'\n    left:\n      type: 'Identifier'\n      name: 'x'\n    right:\n      type: 'Identifier'\n      name: 'y'\n\n  testExpression 'x + y * z',\n    type: 'BinaryExpression'\n    operator: '+'\n    left:\n      type: 'Identifier'\n      name: 'x'\n    right:\n      type: 'BinaryExpression'\n      operator: '*'\n      left:\n        type: 'Identifier'\n        name: 'y'\n      right:\n        type: 'Identifier'\n        name: 'z'\n\n  testExpression '(x + y) * z',\n    type: 'BinaryExpression'\n    operator: '*'\n    left:\n      type: 'BinaryExpression'\n      operator: '+'\n      left:\n        type: 'Identifier'\n        name: 'x'\n      right:\n        type: 'Identifier'\n        name: 'y'\n    right:\n      type: 'Identifier'\n      name: 'z'\n\ntest \"AST as expected for Try node\", ->\n  testStatement 'try cappuccino',\n    type: 'TryStatement'\n    block:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n          name: 'cappuccino'\n      ]\n    handler: null\n    finalizer: null\n\n  testStatement '''\n    try\n      x = 1\n      y()\n    catch e\n      d()\n    finally\n      f + g\n  ''',\n    type: 'TryStatement'\n    block:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'AssignmentExpression'\n      ,\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n      ]\n    handler:\n      type: 'CatchClause'\n      param:\n        type: 'Identifier'\n        name: 'e'\n        declaration: yes\n      body:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n          expression:\n            type: 'CallExpression'\n        ]\n    finalizer:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'BinaryExpression'\n      ]\n\n  testStatement '''\n    try\n    catch\n    finally\n  ''',\n    type: 'TryStatement'\n    block:\n      type: 'BlockStatement'\n      body: []\n    handler:\n      type: 'CatchClause'\n      param: null\n      body:\n        type: 'BlockStatement'\n        body: []\n    finalizer:\n      type: 'BlockStatement'\n      body: []\n\n  testStatement '''\n    try\n    catch {e}\n      f\n  ''',\n    type: 'TryStatement'\n    block:\n      type: 'BlockStatement'\n      body: []\n    handler:\n      type: 'CatchClause'\n      param:\n        type: 'ObjectPattern'\n        properties: [\n          type: 'ObjectProperty'\n          key: ID 'e', declaration: no\n          value: ID 'e', declaration: yes\n        ]\n      body:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n        ]\n    finalizer: null\n\ntest \"AST as expected for Throw node\", ->\n  testStatement 'throw new BallError \"catch\"',\n    type: 'ThrowStatement'\n    argument:\n      type: 'NewExpression'\n\ntest \"AST as expected for Existence node\", ->\n  testExpression 'Ghosts?',\n    type: 'UnaryExpression',\n    argument:\n      name: 'Ghosts'\n    operator: '?'\n    prefix: no\n\ntest \"AST as expected for Parens node\", ->\n  testExpression '(hmmmmm)',\n    type: 'Identifier'\n    name: 'hmmmmm'\n\n  testExpression '(a + b) / c',\n    type: 'BinaryExpression'\n    operator: '/'\n    left:\n      type: 'BinaryExpression'\n      operator: '+'\n      left: ID 'a'\n      right: ID 'b'\n    right: ID 'c'\n\n  testExpression '(((1)))',\n    type: 'NumericLiteral'\n    value: 1\n\ntest \"AST as expected for StringWithInterpolations node\", ->\n  testExpression '\"a#{b}c\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      ID 'b'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: 'a'\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: 'c'\n      tail: yes\n    ]\n    quote: '\"'\n\n  testExpression '\"\"\"a#{b}c\"\"\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      ID 'b'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: 'a'\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: 'c'\n      tail: yes\n    ]\n    quote: '\"\"\"'\n\n  testExpression '\"#{b}\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      ID 'b'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: yes\n    ]\n    quote: '\"'\n\n  testExpression '''\n    \" a\n      #{b}\n      c\n    \"\n  ''',\n    type: 'TemplateLiteral'\n    expressions: [\n      ID 'b'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: ' a\\n  '\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: '\\n  c\\n'\n      tail: yes\n    ]\n    quote: '\"'\n\n  testExpression '''\n    \"\"\"\n      a\n        b#{\n        c\n      }d\n    \"\"\"\n  ''',\n    type: 'TemplateLiteral'\n    expressions: [\n      ID 'c'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: '\\n  a\\n    b'\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: 'd\\n'\n      tail: yes\n    ]\n    quote: '\"\"\"'\n\n  # empty interpolation\n  testExpression '\"#{}\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      type: 'EmptyInterpolation'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: yes\n    ]\n    quote: '\"'\n\n  testExpression '''\n    \"#{\n      # comment\n     }\"\n    ''',\n    type: 'TemplateLiteral'\n    expressions: [\n      type: 'EmptyInterpolation'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: yes\n    ]\n    quote: '\"'\n\n  testExpression '\"#{ ### here ### }\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      type: 'EmptyInterpolation'\n    ]\n    quasis: [\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: no\n    ,\n      type: 'TemplateElement'\n      value:\n        raw: ''\n      tail: yes\n    ]\n    quote: '\"'\n\n  testExpression '''\n    a \"#{\n      b\n      c\n    }\"\n  ''',\n    type: 'CallExpression'\n    arguments: [\n      type: 'TemplateLiteral'\n      expressions: [\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n        ,\n          type: 'ExpressionStatement'\n          expression:\n            returns: yes\n        ]\n      ]\n    ]\n\ntest \"AST as expected for For node\", ->\n  testStatement 'for x, i in arr when x? then return',\n    type: 'For'\n    name: ID 'x', declaration: yes\n    index: ID 'i', declaration: yes\n    guard:\n      type: 'UnaryExpression'\n    source: ID 'arr', declaration: no\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ReturnStatement'\n      ]\n    style: 'in'\n    own: no\n    postfix: no\n    await: no\n    step: null\n\n  testStatement 'for k, v of obj then return',\n    type: 'For'\n    name: ID 'v', declaration: yes\n    index: ID 'k', declaration: yes\n    guard: null\n    source: ID 'obj', declaration: no\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ReturnStatement'\n      ]\n    style: 'of'\n    own: no\n    postfix: no\n    await: no\n    step: null\n\n  testStatement 'for x from iterable then',\n    type: 'For'\n    name: ID 'x', declaration: yes\n    index: null\n    guard: null\n    body: EMPTY_BLOCK\n    source: ID 'iterable', declaration: no\n    style: 'from'\n    own: no\n    postfix: no\n    await: no\n    step: null\n\n  testStatement 'for i in [0...42] by step when not (i % 2) then',\n    type: 'For'\n    name: ID 'i', declaration: yes\n    index: null\n    body: EMPTY_BLOCK\n    source:\n      type: 'Range'\n    guard:\n      type: 'UnaryExpression'\n    step: ID 'step', declaration: no\n    style: 'in'\n    own: no\n    postfix: no\n    await: no\n\n  testExpression 'a = (x for x in y)',\n    type: 'AssignmentExpression'\n    right:\n      type: 'For'\n      name: ID 'x', declaration: yes\n      index: null\n      body:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n          expression: ID 'x', declaration: no, returns: yes\n        ]\n      source: ID 'y', declaration: no\n      guard: null\n      step: null\n      style: 'in'\n      own: no\n      postfix: yes\n      await: no\n\n  testStatement 'x for [0...1]',\n    type: 'For'\n    name: null\n    index: null\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'x', declaration: no, returns: undefined\n      ]\n    source:\n      type: 'Range'\n    guard: null\n    step: null\n    style: 'range'\n    own: no\n    postfix: yes\n    await: no\n\n  testStatement '''\n    for own x, y of z\n      c()\n      d\n  ''',\n    type: 'For'\n    name: ID 'y', declaration: yes\n    index: ID 'x', declaration: yes\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n          returns: undefined\n      ,\n        type: 'ExpressionStatement'\n        expression: ID 'd', declaration: no, returns: undefined\n      ]\n    source: ID 'z', declaration: no\n    guard: null\n    step: null\n    style: 'of'\n    own: yes\n    postfix: no\n    await: no\n\n  testExpression '''\n    ->\n      for await x from y\n        z\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'For'\n        name: ID 'x', declaration: yes\n        index: null\n        body:\n          type: 'BlockStatement'\n          body: [\n            type: 'ExpressionStatement'\n            expression: ID 'z', declaration: no, returns: yes\n          ]\n        source: ID 'y', declaration: no\n        guard: null\n        step: null\n        style: 'from'\n        own: no\n        postfix: no\n        await: yes\n      ]\n\n  testStatement '''\n    for {x} in y\n      z\n  ''',\n    type: 'For'\n    name:\n      type: 'ObjectPattern'\n      properties: [\n        type: 'ObjectProperty'\n        key: ID 'x', declaration: no\n        value: ID 'x', declaration: yes\n        shorthand: yes\n        computed: no\n      ]\n    index: null\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'z'\n      ]\n    source: ID 'y'\n    guard: null\n    step: null\n    style: 'in'\n    postfix: no\n    await: no\n\n  testStatement '''\n    for [x] in y\n      z\n  ''',\n    type: 'For'\n    name:\n      type: 'ArrayPattern'\n      elements: [\n        ID 'x', declaration: yes\n      ]\n    index: null\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'z'\n      ]\n    source: ID 'y'\n    guard: null\n    step: null\n    style: 'in'\n    postfix: no\n    await: no\n\n  testStatement '''\n    for [x..., y] in z\n      y()\n  ''',\n    type: 'For'\n    name:\n      type: 'ArrayPattern'\n\ntest \"AST as expected for Switch node\", ->\n  testStatement '''\n    switch x\n      when a then a\n      when b, c then c\n      else 42\n  ''',\n    type: 'SwitchStatement'\n    discriminant:\n      type: 'Identifier'\n      name: 'x'\n    cases: [\n      type: 'SwitchCase'\n      test:\n        type: 'Identifier'\n        name: 'a'\n      consequent: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n          name: 'a'\n      ]\n      trailing: yes\n    ,\n      type: 'SwitchCase'\n      test:\n        type: 'Identifier'\n        name: 'b'\n      consequent: []\n      trailing: no\n    ,\n      type: 'SwitchCase'\n      test:\n        type: 'Identifier'\n        name: 'c'\n      consequent: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n          name: 'c'\n      ]\n      trailing: yes\n    ,\n      type: 'SwitchCase'\n      test: null\n      consequent: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'NumericLiteral'\n          value: 42\n      ]\n    ]\n\n  testStatement '''\n    switch\n      when some(condition)\n        doSomething()\n        andThenSomethingElse\n  ''',\n    type: 'SwitchStatement'\n    discriminant: null\n    cases: [\n      type: 'SwitchCase'\n      test:\n        type: 'CallExpression'\n      consequent: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n      ,\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n      ]\n      trailing: yes\n    ]\n\n  testStatement '''\n    switch a\n      when 1, 2, 3, 4\n        b\n      else\n        c\n        d\n  ''',\n    type: 'SwitchStatement'\n    discriminant:\n      type: 'Identifier'\n    cases: [\n      type: 'SwitchCase'\n      test:\n        type: 'NumericLiteral'\n        value: 1\n      consequent: []\n      trailing: no\n    ,\n      type: 'SwitchCase'\n      test:\n        type: 'NumericLiteral'\n        value: 2\n      consequent: []\n      trailing: no\n    ,\n      type: 'SwitchCase'\n      test:\n        type: 'NumericLiteral'\n        value: 3\n      consequent: []\n      trailing: no\n    ,\n      type: 'SwitchCase'\n      test:\n        type: 'NumericLiteral'\n        value: 4\n      consequent: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n      ]\n      trailing: yes\n    ,\n      type: 'SwitchCase'\n      test: null\n      consequent: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n      ,\n        type: 'ExpressionStatement'\n        expression:\n          type: 'Identifier'\n      ]\n    ]\n\ntest \"AST as expected for If node\", ->\n  testStatement 'if maybe then yes',\n    type: 'IfStatement'\n    test: ID 'maybe'\n    consequent:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'BooleanLiteral'\n      ]\n    alternate: null\n    postfix: no\n    inverted: no\n\n  testStatement 'yes if maybe',\n    type: 'IfStatement'\n    test: ID 'maybe'\n    consequent:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'BooleanLiteral'\n      ]\n    alternate: null\n    postfix: yes\n    inverted: no\n\n  testStatement 'unless x then x else if y then y else z',\n    type: 'IfStatement'\n    test: ID 'x'\n    consequent:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'x'\n      ]\n    alternate:\n      type: 'IfStatement'\n      test: ID 'y'\n      consequent:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n          expression: ID 'y'\n        ]\n      alternate:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n          expression: ID 'z'\n        ]\n      postfix: no\n      inverted: no\n    postfix: no\n    inverted: yes\n\n  testStatement '''\n    if a\n      b\n    else\n      if c\n        d\n  ''',\n    type: 'IfStatement'\n    test: ID 'a'\n    consequent:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'b'\n      ]\n    alternate:\n      type: 'BlockStatement'\n      body: [\n        type: 'IfStatement'\n        test: ID 'c'\n        consequent:\n          type: 'BlockStatement'\n          body: [\n            type: 'ExpressionStatement'\n            expression: ID 'd'\n          ]\n        alternate: null\n        postfix: no\n        inverted: no\n      ]\n    postfix: no\n    inverted: no\n\n  testExpression '''\n    a =\n      if b then c else if d then e\n  ''',\n    type: 'AssignmentExpression'\n    right:\n      type: 'ConditionalExpression'\n      test: ID 'b'\n      consequent: ID 'c'\n      alternate:\n        type: 'ConditionalExpression'\n        test: ID 'd'\n        consequent: ID 'e'\n        alternate: null\n        postfix: no\n        inverted: no\n      postfix: no\n      inverted: no\n\n  testExpression '''\n    f(\n      if b\n        c\n        d\n    )\n  ''',\n    type: 'CallExpression'\n    arguments: [\n      type: 'ConditionalExpression'\n      test: ID 'b'\n      consequent:\n        type: 'BlockStatement'\n        body: [\n          type: 'ExpressionStatement'\n          expression:\n            ID 'c'\n        ,\n          type: 'ExpressionStatement'\n          expression:\n            ID 'd'\n        ]\n      alternate: null\n      postfix: no\n      inverted: no\n    ]\n\n  testStatement 'a unless b',\n    type: 'IfStatement'\n    test: ID 'b'\n    consequent:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'a'\n      ]\n    alternate: null\n    postfix: yes\n    inverted: yes\n\n  testExpression '''\n    f(\n      if b\n        c\n      else\n        d\n    )\n  ''',\n      type: 'CallExpression'\n      arguments: [\n        type: 'ConditionalExpression'\n        test: ID 'b'\n        consequent: ID 'c'\n        alternate: ID 'd'\n        postfix: no\n        inverted: no\n      ]\n\ntest \"AST as expected for `new.target` MetaProperty node\", ->\n  testExpression '''\n    -> new.target\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'MetaProperty'\n          meta: ID 'new'\n          property: ID 'target'\n      ]\n\n  testExpression '''\n    -> new.target.name\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'MemberExpression'\n          object:\n            type: 'MetaProperty'\n            meta: ID 'new'\n            property: ID 'target'\n          property: ID 'name'\n          computed: no\n      ]\n\ntest \"AST as expected for `import.meta` MetaProperty node\", ->\n  testExpression '''\n    import.meta\n  ''',\n    type: 'MetaProperty'\n    meta: ID 'import'\n    property: ID 'meta'\n\n  testExpression '''\n    import.meta.name\n  ''',\n    type: 'MemberExpression'\n    object:\n      type: 'MetaProperty'\n      meta: ID 'import'\n      property: ID 'meta'\n    property: ID 'name'\n    computed: no\n\ntest \"AST as expected for dynamic import\", ->\n  testExpression '''\n    import('a')\n  ''',\n    type: 'CallExpression'\n    callee:\n      type: 'Import'\n    arguments: [STRING 'a']\n\ntest \"AST as expected for RegexLiteral node\", ->\n  testExpression '/a/ig',\n    type: 'RegExpLiteral'\n    pattern: 'a'\n    originalPattern: 'a'\n    flags: 'ig'\n    delimiter: '/'\n    value: undefined\n    extra:\n      raw: \"/a/ig\"\n      originalRaw: \"/a/ig\"\n      rawValue: undefined\n\n  testExpression '''\n    ///\n      a\n    ///i\n  ''',\n    type: 'RegExpLiteral'\n    pattern: 'a'\n    originalPattern: '\\n  a\\n'\n    flags: 'i'\n    delimiter: '///'\n    value: undefined\n    extra:\n      raw: \"/a/i\"\n      originalRaw: \"///\\n  a\\n///i\"\n      rawValue: undefined\n\n  testExpression '/a\\\\w\\\\u1111\\\\u{11111}/',\n    type: 'RegExpLiteral'\n    pattern: 'a\\\\w\\\\u1111\\\\ud804\\\\udd11'\n    originalPattern: 'a\\\\w\\\\u1111\\\\u{11111}'\n    flags: ''\n    delimiter: '/'\n    value: undefined\n    extra:\n      raw: \"/a\\\\w\\\\u1111\\\\ud804\\\\udd11/\"\n      originalRaw: \"/a\\\\w\\\\u1111\\\\u{11111}/\"\n      rawValue: undefined\n\n  testExpression '''\n    ///\n      a\n      \\\\w\\\\u1111\\\\u{11111}\n    ///\n  ''',\n    type: 'RegExpLiteral'\n    pattern: 'a\\\\w\\\\u1111\\\\ud804\\\\udd11'\n    originalPattern: '\\n  a\\n  \\\\w\\\\u1111\\\\u{11111}\\n'\n    flags: ''\n    delimiter: '///'\n    value: undefined\n    extra:\n      raw: \"/a\\\\w\\\\u1111\\\\ud804\\\\udd11/\"\n      originalRaw: \"///\\n  a\\n  \\\\w\\\\u1111\\\\u{11111}\\n///\"\n      rawValue: undefined\n\n  testExpression '''\n    ///\n      /\n      (.+)\n      /\n    ///\n  ''',\n    type: 'RegExpLiteral'\n    pattern: '\\\\/(.+)\\\\/'\n    originalPattern: '\\n  /\\n  (.+)\\n  /\\n'\n    flags: ''\n    delimiter: '///'\n    value: undefined\n    extra:\n      raw: \"/\\\\/(.+)\\\\//\"\n      originalRaw: \"///\\n  /\\n  (.+)\\n  /\\n///\"\n      rawValue: undefined\n\n  testExpression '''\n    ///\n      a # first\n      b ### second ###\n    ///\n  ''',\n    type: 'RegExpLiteral'\n    pattern: 'ab'\n    originalPattern: '\\n  a # first\\n  b ### second ###\\n'\n    comments: [\n      type: 'CommentLine'\n      value: ' first'\n    ,\n      type: 'CommentBlock'\n      value: ' second '\n    ]\n\ntest \"AST as expected for directives\", ->\n  deepStrictIncludeExpectedProperties CoffeeScript.compile('''\n    'directive 1'\n    'use strict'\n    f()\n  ''', ast: yes),\n    type: 'File'\n    program:\n      type: 'Program'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n      ]\n      directives: [\n        type: 'Directive'\n        value:\n          type: 'DirectiveLiteral'\n          value: 'directive 1'\n          extra:\n            raw: \"'directive 1'\"\n      ,\n        type: 'Directive'\n        value:\n          type: 'DirectiveLiteral'\n          value: 'use strict'\n          extra:\n            raw: \"'use strict'\"\n      ]\n\n  testExpression '''\n    ->\n      'use strict'\n      f()\n      'not a directive'\n      g\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'CallExpression'\n      ,\n        type: 'ExpressionStatement'\n        expression: STRING 'not a directive'\n      ,\n        type: 'ExpressionStatement'\n        expression: ID 'g'\n      ]\n      directives: [\n        type: 'Directive'\n        value:\n          type: 'DirectiveLiteral'\n          value: 'use strict'\n          extra:\n            raw: \"'use strict'\"\n      ]\n\n  testExpression '''\n    ->\n      \"not a directive because it's implicitly returned\"\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: STRING \"not a directive because it's implicitly returned\"\n      ]\n      directives: []\n\n  deepStrictIncludeExpectedProperties CoffeeScript.compile('''\n    'use strict'\n  ''', ast: yes),\n    type: 'File'\n    program:\n      type: 'Program'\n      body: []\n      directives: [\n        type: 'Directive'\n        value:\n          type: 'DirectiveLiteral'\n          value: 'use strict'\n          extra:\n            raw: \"'use strict'\"\n      ]\n\n  testStatement '''\n    class A\n      'classes can have directives too'\n      a: ->\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      type: 'ClassBody'\n      body: [\n        type: 'ClassMethod'\n      ]\n      directives: [\n        type: 'Directive'\n        value:\n          type: 'DirectiveLiteral'\n          value: 'classes can have directives too'\n      ]\n\n  testStatement '''\n    if a\n      \"but other blocks can't\"\n      b\n  ''',\n    type: 'IfStatement'\n    consequent:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: STRING \"but other blocks can't\"\n      ,\n        type: 'ExpressionStatement'\n        expression: ID 'b'\n      ]\n      directives: []\n\n  testExpression '''\n    ->\n      \"\"\"not a directive\"\"\"\n      b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression:\n          type: 'TemplateLiteral'\n      ,\n        type: 'ExpressionStatement'\n        expression: ID 'b'\n      ]\n      directives: []\n\n  testExpression '''\n    ->\n      # leading comment\n      'use strict'\n      b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      type: 'BlockStatement'\n      body: [\n        type: 'ExpressionStatement'\n        expression: ID 'b'\n      ]\n      directives: [\n        type: 'Directive'\n        value:\n          type: 'DirectiveLiteral'\n          value: 'use strict'\n          extra:\n            raw: \"'use strict'\"\n      ]\n\ntest \"AST as expected for comments\", ->\n  testComments '''\n    a # simple line comment\n  ''', [\n    type: 'CommentLine'\n    value: ' simple line comment'\n  ]\n\n  testComments '''\n    a ### simple here comment ###\n  ''', [\n    type: 'CommentBlock'\n    value: ' simple here comment '\n  ]\n\n  testComments '''\n    # just a line comment\n  ''', [\n    type: 'CommentLine'\n    value: ' just a line comment'\n  ]\n\n  testComments '''\n    ### just a here comment ###\n  ''', [\n    type: 'CommentBlock'\n    value: ' just a here comment '\n  ]\n\n  testComments '''\n    \"#{\n      # empty interpolation line comment\n     }\"\n  ''', [\n    type: 'CommentLine'\n    value: ' empty interpolation line comment'\n  ]\n\n  testComments '''\n    \"#{\n      ### empty interpolation block comment ###\n     }\"\n  ''', [\n    type: 'CommentBlock'\n    value: ' empty interpolation block comment '\n  ]\n\n  testComments '''\n    # multiple line comments\n    # on consecutive lines\n  ''', [\n    type: 'CommentLine'\n    value: ' multiple line comments'\n  ,\n    type: 'CommentLine'\n    value: ' on consecutive lines'\n  ]\n\n  testComments '''\n    # multiple line comments\n\n    # with blank line\n  ''', [\n    type: 'CommentLine'\n    value: ' multiple line comments'\n  ,\n    type: 'CommentLine'\n    value: ' with blank line'\n  ]\n\n  testComments '''\n    #no whitespace line comment\n  ''', [\n    type: 'CommentLine'\n    value: 'no whitespace line comment'\n  ]\n\n  testComments '''\n    ###no whitespace here comment###\n  ''', [\n    type: 'CommentBlock'\n    value: 'no whitespace here comment'\n  ]\n\n  testComments '''\n    ###\n    # multiline\n    # here comment\n    ###\n  ''', [\n    type: 'CommentBlock'\n    value: '\\n# multiline\\n# here comment\\n'\n  ]\n\n  testComments '''\n    if b\n      ###\n      # multiline\n      # indented here comment\n      ###\n      c\n  ''', [\n    type: 'CommentBlock'\n    value: '\\n  # multiline\\n  # indented here comment\\n  '\n  ]\n\n  testComments '''\n    if foo\n      ;\n      ### empty ###\n  ''', [\n    type: 'CommentBlock'\n    value: ' empty '\n  ]\n\ntest \"AST as expected for chained comparisons\", ->\n  testExpression '''\n    a < b < c\n  ''',\n    type: 'ChainedComparison'\n    operands: [\n      ID 'a'\n      ID 'b'\n      ID 'c'\n    ]\n    operators: [\n      '<'\n      '<'\n    ]\n\n  testExpression '''\n    a isnt b is c isnt d\n  ''',\n    type: 'ChainedComparison'\n    operands: [\n      ID 'a'\n      ID 'b'\n      ID 'c'\n      ID 'd'\n    ]\n    operators: [\n      'isnt'\n      'is'\n      'isnt'\n    ]\n\n  testExpression '''\n    a >= b < c\n  ''',\n    type: 'ChainedComparison'\n    operands: [\n      ID 'a'\n      ID 'b'\n      ID 'c'\n    ]\n    operators: [\n      '>='\n      '<'\n    ]\n\ntest \"AST as expected for Sequence\", ->\n  testExpression '''\n    (a; b)\n  ''',\n    type: 'SequenceExpression'\n    expressions: [\n      ID 'a'\n      ID 'b'\n    ]\n\n  testExpression '''\n    (a; b)\"\"\n  ''',\n    type: 'TaggedTemplateExpression'\n    tag:\n      type: 'SequenceExpression'\n      expressions: [\n        ID 'a'\n        ID 'b'\n      ]\n"
  },
  {
    "path": "test/abstract_syntax_tree_location_data.coffee",
    "content": "# Astract Syntax Tree location data\n# ---------------------------------\n\ntestAstLocationData = (code, expected) ->\n  testAstNodeLocationData getAstExpressionOrStatement(code), expected\n\ntestAstRootLocationData = (code, expected) ->\n  testAstNodeLocationData getAstRoot(code), expected\n\ntestAstNodeLocationData = (node, expected, path = '') ->\n  extendPath = (additionalPath) ->\n    return additionalPath unless path\n    \"#{path}.#{additionalPath}\"\n  ok node?, \"Missing expected node at '#{path}'\"\n  testSingleNodeLocationData node, expected, path if expected.range?\n  for own key, expectedChild of expected when key not in ['start', 'end', 'range', 'loc']\n    if Array.isArray expectedChild\n      ok Array.isArray(node[key]), \"Missing expected array at '#{extendPath key}'\"\n      for expectedItem, index in expectedChild when expectedItem?\n        testAstNodeLocationData node[key][index], expectedItem, extendPath \"#{key}[#{index}]\"\n    else if typeof expectedChild is 'object'\n      testAstNodeLocationData node[key], expectedChild, extendPath(key)\n\ntestSingleNodeLocationData = (node, expected, path = '') ->\n  # Even though it’s not part of the location data, check the type to ensure\n  # that we’re testing the node we think we are.\n  if expected.type?\n    eq node.type, expected.type, \\\n      \"Expected AST node type #{reset}#{node.type}#{red} to equal #{reset}#{expected.type}#{red}\"\n\n  eq node.start, expected.start, \\\n    \"Expected #{path}.start: #{reset}#{node.start}#{red} to equal #{reset}#{expected.start}#{red}\"\n  eq node.end, expected.end, \\\n    \"Expected #{path}.end: #{reset}#{node.end}#{red} to equal #{reset}#{expected.end}#{red}\"\n  arrayEq node.range, expected.range, \\\n    \"Expected #{path}.range: #{reset}#{JSON.stringify node.range}#{red} to equal #{reset}#{JSON.stringify expected.range}#{red}\"\n  eq node.loc.start.line, expected.loc.start.line, \\\n    \"Expected #{path}.loc.start.line: #{reset}#{node.loc.start.line}#{red} to equal #{reset}#{expected.loc.start.line}#{red}\"\n  eq node.loc.start.column, expected.loc.start.column, \\\n    \"Expected #{path}.loc.start.column: #{reset}#{node.loc.start.column}#{red} to equal #{reset}#{expected.loc.start.column}#{red}\"\n  eq node.loc.end.line, expected.loc.end.line, \\\n    \"Expected #{path}.loc.end.line: #{reset}#{node.loc.end.line}#{red} to equal #{reset}#{expected.loc.end.line}#{red}\"\n  eq node.loc.end.column, expected.loc.end.column, \\\n    \"Expected #{path}.loc.end.column: #{reset}#{node.loc.end.column}#{red} to equal #{reset}#{expected.loc.end.column}#{red}\"\n\ntestAstCommentsLocationData = (code, expected) ->\n  testAstNodeLocationData getAstRoot(code).comments, expected\n\nif require?\n  {mergeAstLocationData, mergeLocationData} = require './../lib/coffeescript/nodes'\n\n  test \"the `mergeAstLocationData` helper accepts `justLeading` and `justEnding` options\", ->\n    first =\n      range: [4, 5]\n      start: 4\n      end: 5\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    second =\n      range: [1, 10]\n      start: 1\n      end: 10\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 2\n          column: 2\n    testSingleNodeLocationData mergeAstLocationData(first, second), second\n    testSingleNodeLocationData mergeAstLocationData(first, second, justLeading: yes),\n      range: [1, 5]\n      start: 1\n      end: 5\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 5\n    testSingleNodeLocationData mergeAstLocationData(first, second, justEnding: yes),\n      range: [4, 10]\n      start: 4\n      end: 10\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 2\n          column: 2\n\n  test \"the `mergeLocationData` helper accepts `justLeading` and `justEnding` options\", ->\n    testLocationData = (node, expected) ->\n      arrayEq node.range, expected.range\n      for field in ['first_line', 'first_column', 'last_line', 'last_column']\n        eq node[field], expected[field]\n\n    first =\n      range: [4, 5]\n      first_line: 0\n      first_column: 4\n      last_line: 0\n      last_column: 4\n    second =\n      range: [1, 10]\n      first_line: 0\n      first_column: 1\n      last_line: 1\n      last_column: 2\n\n    testLocationData mergeLocationData(first, second), second\n    testLocationData mergeLocationData(first, second, justLeading: yes),\n      range: [1, 5]\n      first_line: 0\n      first_column: 1\n      last_line: 0\n      last_column: 4\n    testLocationData mergeLocationData(first, second, justEnding: yes),\n      range: [4, 10]\n      first_line: 0\n      first_column: 4\n      last_line: 1\n      last_column: 2\n\ntest \"AST location data as expected for NumberLiteral node\", ->\n  testAstLocationData '42',\n    type: 'NumericLiteral'\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 2\n\ntest \"AST location data as expected for InfinityLiteral node\", ->\n  testAstLocationData 'Infinity',\n    type: 'Identifier'\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData '2e308',\n    type: 'NumericLiteral'\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\ntest \"AST location data as expected for NaNLiteral node\", ->\n  testAstLocationData 'NaN',\n    type: 'Identifier'\n    start: 0\n    end: 3\n    range: [0, 3]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 3\n\ntest \"AST location data as expected for IdentifierLiteral node\", ->\n  testAstLocationData 'id',\n    type: 'Identifier'\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 2\n\ntest \"AST location data as expected for StatementLiteral node\", ->\n  testAstLocationData 'break',\n    type: 'BreakStatement'\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData 'continue',\n    type: 'ContinueStatement'\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData 'debugger',\n    type: 'DebuggerStatement'\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\ntest \"AST location data as expected for ThisLiteral node\", ->\n  testAstLocationData 'this',\n    type: 'ThisExpression'\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\ntest \"AST location data as expected for UndefinedLiteral node\", ->\n  testAstLocationData 'undefined',\n    type: 'Identifier'\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\ntest \"AST location data as expected for NullLiteral node\", ->\n  testAstLocationData 'null',\n    type: 'NullLiteral'\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\ntest \"AST location data as expected for BooleanLiteral node\", ->\n  testAstLocationData 'true',\n    type: 'BooleanLiteral'\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\ntest \"AST location data as expected for Access node\", ->\n  testAstLocationData 'obj.prop',\n    type: 'MemberExpression'\n    object:\n      start: 0\n      end: 3\n      range: [0, 3]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 3\n    property:\n      start: 4\n      end: 8\n      range: [4, 8]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 8\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData 'a::b',\n    type: 'MemberExpression'\n    object:\n      object:\n        start: 0\n        end: 1\n        range: [0, 1]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 1\n      property:\n        start: 1\n        end: 3\n        range: [1, 3]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 3\n    property:\n      start: 3\n      end: 4\n      range: [3, 4]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 4\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\n  testAstLocationData '''\n    (\n      obj\n    ).prop\n  ''',\n    type: 'MemberExpression'\n    object:\n      start: 4\n      end: 7\n      range: [4, 7]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 5\n    property:\n      start: 10\n      end: 14\n      range: [10, 14]\n      loc:\n        start:\n          line: 3\n          column: 2\n        end:\n          line: 3\n          column: 6\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 6\n\ntest \"AST location data as expected for Index node\", ->\n  testAstLocationData 'a[b]',\n    type: 'MemberExpression'\n    object:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    property:\n      start: 2\n      end: 3\n      range: [2, 3]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 3\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\n  testAstLocationData 'a?[b][3]',\n    type: 'OptionalMemberExpression'\n    object:\n      object:\n        start: 0\n        end: 1\n        range: [0, 1]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 1\n      property:\n        start: 3\n        end: 4\n        range: [3, 4]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 4\n      start: 0\n      end: 5\n      range: [0, 5]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 5\n    property:\n      start: 6\n      end: 7\n      range: [6, 7]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 7\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\ntest \"AST location data as expected for Parens node\", ->\n  testAstLocationData '(hmmmmm)',\n    type: 'Identifier'\n    start: 1\n    end: 7\n    range: [1, 7]\n    loc:\n      start:\n        line: 1\n        column: 1\n      end:\n        line: 1\n        column: 7\n\n  testAstLocationData '(((1)))',\n    type: 'NumericLiteral'\n    start: 3\n    end: 4\n    range: [3, 4]\n    loc:\n      start:\n        line: 1\n        column: 3\n      end:\n        line: 1\n        column: 4\n\ntest \"AST location data as expected for Op node\", ->\n  testAstLocationData '1 <= 2',\n    type: 'BinaryExpression'\n    left:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    right:\n      start: 5\n      end: 6\n      range: [5, 6]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 6\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData '!x',\n    type: 'UnaryExpression'\n    argument:\n      start: 1\n      end: 2\n      range: [1, 2]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 2\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 2\n\n  testAstLocationData 'not x',\n    type: 'UnaryExpression'\n    argument:\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData 'x++',\n    type: 'UpdateExpression'\n    argument:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    start: 0\n    end: 3\n    range: [0, 3]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 3\n\n  testAstLocationData '(x + y) * z',\n    type: 'BinaryExpression'\n    left:\n      left:\n        start: 1\n        end: 2\n        range: [1, 2]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 2\n      right:\n        start: 5\n        end: 6\n        range: [5, 6]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 6\n      start: 1\n      end: 6\n      range: [1, 6]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 6\n    right:\n      start: 10\n      end: 11\n      range: [10, 11]\n      loc:\n        start:\n          line: 1\n          column: 10\n        end:\n          line: 1\n          column: 11\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\ntest \"AST location data as expected for Call node\", ->\n  testAstLocationData 'fn()',\n    type: 'CallExpression'\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n    callee:\n      start: 0\n      end: 2\n      range: [0, 2]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 2\n\n  testAstLocationData 'new Date()',\n    type: 'NewExpression'\n    start: 0\n    end: 10\n    range: [0, 10]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 10\n    callee:\n      start: 4\n      end: 8\n      range: [4, 8]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 8\n\n  testAstLocationData '''\n    new Old(\n      1\n    )\n  ''',\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 1\n    type: 'NewExpression'\n    arguments: [\n      start: 11\n      end: 12\n      range: [11, 12]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 3\n    ]\n\n  testAstLocationData 'maybe? 1 + 1',\n    type: 'OptionalCallExpression'\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 12\n    arguments: [\n      start: 7\n      end: 12\n      range: [7, 12]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 12\n    ]\n\n  testAstLocationData '''\n    goDo(this,\n      that)\n  ''',\n    type: 'CallExpression'\n    start: 0\n    end: 18\n    range: [0, 18]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 7\n    arguments: [\n      start: 5\n      end: 9\n      range: [5, 9]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 9\n    ,\n      start: 13\n      end: 17\n      range: [13, 17]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 6\n    ]\n\n  testAstLocationData 'new Old',\n    type: 'NewExpression'\n    callee:\n      start: 4\n      end: 7\n      range: [4, 7]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 7\n    start: 0\n    end: 7\n    range: [0, 7]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 7\n\ntest \"AST location data as expected for SuperCall node\", ->\n  testAstLocationData 'class child extends parent then constructor: -> super()',\n    type: 'ClassDeclaration'\n    body:\n      body: [\n        body:\n          body: [\n            expression:\n              callee:\n                start: 48\n                end: 53\n                range: [48, 53]\n                loc:\n                  start:\n                    line: 1\n                    column: 48\n                  end:\n                    line: 1\n                    column: 53\n              start: 48\n              end: 55\n              range: [48, 55]\n              loc:\n                start:\n                  line: 1\n                  column: 48\n                end:\n                  line: 1\n                  column: 55\n          ]\n      ]\n    start: 0\n    end: 55\n    range: [0, 55]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 55\n\ntest \"AST location data as expected for Super node\", ->\n  testAstLocationData '''\n    class child extends parent\n      func: ->\n        super[prop]()\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      body: [\n        body:\n          body: [\n            expression:\n              callee:\n                object:\n                  start: 42\n                  end: 47\n                  range: [42, 47]\n                  loc:\n                    start:\n                      line: 3\n                      column: 4\n                    end:\n                      line: 3\n                      column: 9\n                property:\n                  start: 48\n                  end: 52\n                  range: [48, 52]\n                  loc:\n                    start:\n                      line: 3\n                      column: 10\n                    end:\n                      line: 3\n                      column: 14\n                start: 42\n                end: 53\n                range: [42, 53]\n                loc:\n                  start:\n                    line: 3\n                    column: 4\n                  end:\n                    line: 3\n                    column: 15\n              start: 42\n              end: 55\n              range: [42, 55]\n              loc:\n                start:\n                  line: 3\n                  column: 4\n                end:\n                  line: 3\n                  column: 17\n          ]\n      ]\n    start: 0\n    end: 55\n    range: [0, 55]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 17\n\ntest \"AST location data as expected for Range node\", ->\n  testAstLocationData '[x..y]',\n    type: 'Range'\n    from:\n      start: 1\n      end: 2\n      range: [1, 2]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 2\n    to:\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData '[4...2]',\n    type: 'Range'\n    from:\n      start: 1\n      end: 2\n      range: [1, 2]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 2\n    to:\n      start: 5\n      end: 6\n      range: [5, 6]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 6\n    start: 0\n    end: 7\n    range: [0, 7]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 7\n\ntest \"AST location data as expected for Slice node\", ->\n  testAstLocationData 'x[..y]',\n    property:\n      to:\n        start: 4\n        end: 5\n        range: [4, 5]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 1\n            column: 5\n      start: 2\n      end: 5\n      range: [2, 5]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData 'x[y...z]',\n    property:\n      start: 2\n      end: 7\n      range: [2, 7]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 7\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData 'x[...]',\n    property:\n      start: 2\n      end: 5\n      range: [2, 5]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\ntest \"AST location data as expected for Splat node\", ->\n  testAstLocationData '[a...]',\n    type: 'ArrayExpression'\n    elements: [\n      argument:\n        start: 1\n        end: 2\n        range: [1, 2]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 2\n      start: 1\n      end: 5\n      range: [1, 5]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 5\n    ]\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData '[b, ...c]',\n    type: 'ArrayExpression'\n    elements: [\n      {}\n    ,\n      argument:\n        start: 7\n        end: 8\n        range: [7, 8]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 8\n      start: 4\n      end: 8\n      range: [4, 8]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 8\n    ]\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\ntest \"AST location data as expected for Elision node\", ->\n  testAstLocationData '[,,,a,, ,b]',\n    type: 'ArrayExpression'\n    elements: [\n      null,,,\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    ,,,\n      start: 9\n      end: 10\n      range: [9, 10]\n      loc:\n        start:\n          line: 1\n          column: 9\n        end:\n          line: 1\n          column: 10\n    ]\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\ntest \"AST location data as expected for ModuleDeclaration node\", ->\n  testAstLocationData 'export {X}',\n    type: 'ExportNamedDeclaration'\n    specifiers: [\n      local:\n        start: 8\n        end: 9\n        range: [8, 9]\n        loc:\n          start:\n            line: 1\n            column: 8\n          end:\n            line: 1\n            column: 9\n      exported:\n        start: 8\n        end: 9\n        range: [8, 9]\n        loc:\n          start:\n            line: 1\n            column: 8\n          end:\n            line: 1\n            column: 9\n      start: 8\n      end: 9\n      range: [8, 9]\n      loc:\n        start:\n          line: 1\n          column: 8\n        end:\n          line: 1\n          column: 9\n    ]\n    start: 0\n    end: 10\n    range: [0, 10]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 10\n\n  testAstLocationData 'import X from \".\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      start: 7\n      end: 8\n      range: [7, 8]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 8\n    ]\n    source:\n      start: 14\n      end: 17\n      range: [14, 17]\n      loc:\n        start:\n          line: 1\n          column: 14\n        end:\n          line: 1\n          column: 17\n    start: 0\n    end: 17\n    range: [0, 17]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 17\n\ntest \"AST location data as expected for ImportDeclaration node\", ->\n  testAstLocationData '''\n    import React, {\n      Component\n    } from \"react\"\n  ''',\n    type: 'ImportDeclaration'\n    specifiers: [\n      start: 7\n      end: 12\n      range: [7, 12]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 12\n    ,\n      imported:\n        start: 18\n        end: 27\n        range: [18, 27]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 11\n      start: 18\n      end: 27\n      range: [18, 27]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 11\n    ]\n    source:\n      start: 35\n      end: 42\n      range: [35, 42]\n      loc:\n        start:\n          line: 3\n          column: 7\n        end:\n          line: 3\n          column: 14\n    start: 0\n    end: 42\n    range: [0, 42]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 14\n\ntest \"AST location data as expected for ExportNamedDeclaration node\", ->\n  testAstLocationData 'export {}',\n    type: 'ExportNamedDeclaration'\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\n  testAstLocationData 'export fn = ->',\n    type: 'ExportNamedDeclaration'\n    declaration:\n      left:\n        start: 7\n        end: 9\n        range: [7, 9]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 9\n      right:\n        start: 12\n        end: 14\n        range: [12, 14]\n        loc:\n          start:\n            line: 1\n            column: 12\n          end:\n            line: 1\n            column: 14\n      start: 7\n      end: 14\n      range: [7, 14]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 14\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 14\n\n  testAstLocationData 'export class A',\n    type: 'ExportNamedDeclaration'\n    declaration:\n      id:\n        start: 13\n        end: 14\n        range: [13, 14]\n        loc:\n          start:\n            line: 1\n            column: 13\n          end:\n            line: 1\n            column: 14\n      start: 7\n      end: 14\n      range: [7, 14]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 14\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 14\n\n  testAstLocationData '''\n    export {\n      x as y\n      z as default\n      }\n  ''',\n    type: 'ExportNamedDeclaration'\n    specifiers: [\n      local:\n        start: 11\n        end: 12\n        range: [11, 12]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 3\n      exported:\n        start: 16\n        end: 17\n        range: [16, 17]\n        loc:\n          start:\n            line: 2\n            column: 7\n          end:\n            line: 2\n            column: 8\n      start: 11\n      end: 17\n      range: [11, 17]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 8\n    ,\n      local:\n        start: 20\n        end: 21\n        range: [20, 21]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 3\n      exported:\n        start: 25\n        end: 32\n        range: [25, 32]\n        loc:\n          start:\n            line: 3\n            column: 7\n          end:\n            line: 3\n            column: 14\n      start: 20\n      end: 32\n      range: [20, 32]\n      loc:\n        start:\n          line: 3\n          column: 2\n        end:\n          line: 3\n          column: 14\n    ]\n    start: 0\n    end: 36\n    range: [0, 36]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n\n  testAstLocationData 'export {default, default as b} from \"./abc\"',\n    type: 'ExportNamedDeclaration'\n    specifiers: [\n      local:\n        start: 8\n        end: 15\n        range: [8, 15]\n        loc:\n          start:\n            line: 1\n            column: 8\n          end:\n            line: 1\n            column: 15\n      start: 8\n      end: 15\n      range: [8, 15]\n      loc:\n        start:\n          line: 1\n          column: 8\n        end:\n          line: 1\n          column: 15\n    ,\n      local:\n        start: 17\n        end: 24\n        range: [17, 24]\n        loc:\n          start:\n            line: 1\n            column: 17\n          end:\n            line: 1\n            column: 24\n      exported:\n        start: 28\n        end: 29\n        range: [28, 29]\n        loc:\n          start:\n            line: 1\n            column: 28\n          end:\n            line: 1\n            column: 29\n      start: 17\n      end: 29\n      range: [17, 29]\n      loc:\n        start:\n          line: 1\n          column: 17\n        end:\n          line: 1\n          column: 29\n    ]\n    source:\n      start: 36\n      end: 43\n      range: [36, 43]\n      loc:\n        start:\n          line: 1\n          column: 36\n        end:\n          line: 1\n          column: 43\n    start: 0\n    end: 43\n    range: [0, 43]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 43\n\ntest \"AST location data as expected for ExportDefaultDeclaration node\", ->\n  testAstLocationData 'export default class',\n    type: 'ExportDefaultDeclaration'\n    declaration:\n      start: 15\n      end: 20\n      range: [15, 20]\n      loc:\n        start:\n          line: 1\n          column: 15\n        end:\n          line: 1\n          column: 20\n    start: 0\n    end: 20\n    range: [0, 20]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 20\n\n  testAstLocationData 'export default \"abc\"',\n    type: 'ExportDefaultDeclaration'\n    declaration:\n      start: 15\n      end: 20\n      range: [15, 20]\n      loc:\n        start:\n          line: 1\n          column: 15\n        end:\n          line: 1\n          column: 20\n    start: 0\n    end: 20\n    range: [0, 20]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 20\n\ntest \"AST location data as expected for ExportAllDeclaration node\", ->\n  testAstLocationData 'export * from \"module-name\"',\n    type: 'ExportAllDeclaration'\n    source:\n      start: 14\n      end: 27\n      range: [14, 27]\n      loc:\n        start:\n          line: 1\n          column: 14\n        end:\n          line: 1\n          column: 27\n    start: 0\n    end: 27\n    range: [0, 27]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 27\n\ntest \"AST location data as expected for ImportDefaultSpecifier node\", ->\n  testAstLocationData 'import React from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      start: 7\n      end: 12\n      range: [7, 12]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 12\n    ]\n    source:\n      start: 18\n      end: 25\n      range: [18, 25]\n      loc:\n        start:\n          line: 1\n          column: 18\n        end:\n          line: 1\n          column: 25\n    start: 0\n    end: 25\n    range: [0, 25]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 25\n\ntest \"AST location data as expected for ImportNamespaceSpecifier node\", ->\n  testAstLocationData 'import * as React from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      start: 7\n      end: 17\n      range: [7, 17]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 17\n    ]\n    source:\n      start: 23\n      end: 30\n      range: [23, 30]\n      loc:\n        start:\n          line: 1\n          column: 23\n        end:\n          line: 1\n          column: 30\n    start: 0\n    end: 30\n    range: [0, 30]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 30\n\n  testAstLocationData 'import React, * as ReactStar from \"react\"',\n    type: 'ImportDeclaration'\n    specifiers: [\n      start: 7\n      end: 12\n      range: [7, 12]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 12\n    ,\n      local:\n        start: 19\n        end: 28\n        range: [19, 28]\n        loc:\n          start:\n            line: 1\n            column: 19\n          end:\n            line: 1\n            column: 28\n      start: 14\n      end: 28\n      range: [14, 28]\n      loc:\n        start:\n          line: 1\n          column: 14\n        end:\n          line: 1\n          column: 28\n    ]\n    source:\n      start: 34\n      end: 41\n      range: [34, 41]\n      loc:\n        start:\n          line: 1\n          column: 34\n        end:\n          line: 1\n          column: 41\n    start: 0\n    end: 41\n    range: [0, 41]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 41\n\ntest \"AST location data as expected for Obj node\", ->\n  testAstLocationData \"{a: 1, b, [c], @d, [e()]: f, 'g': 2, ...h, i...}\",\n    type: 'ObjectExpression'\n    properties: [\n      key:\n        start: 1\n        end: 2\n        range: [1, 2]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 2\n      value:\n        start: 4\n        end: 5\n        range: [4, 5]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 1\n            column: 5\n      start: 1\n      end: 5\n      range: [1, 5]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 5\n    ,\n      key:\n        start: 7\n        end: 8\n        range: [7, 8]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 8\n      value:\n        start: 7\n        end: 8\n        range: [7, 8]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 8\n      start: 7\n      end: 8\n      range: [7, 8]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 8\n    ,\n      key:\n        start: 11\n        end: 12\n        range: [11, 12]\n        loc:\n          start:\n            line: 1\n            column: 11\n          end:\n            line: 1\n            column: 12\n      value:\n        start: 11\n        end: 12\n        range: [11, 12]\n        loc:\n          start:\n            line: 1\n            column: 11\n          end:\n            line: 1\n            column: 12\n      start: 10\n      end: 13\n      range: [10, 13]\n      loc:\n        start:\n          line: 1\n          column: 10\n        end:\n          line: 1\n          column: 13\n    ,\n      key:\n        object:\n          start: 15\n          end: 16\n          range: [15, 16]\n          loc:\n            start:\n              line: 1\n              column: 15\n            end:\n              line: 1\n              column: 16\n        property:\n          start: 16\n          end: 17\n          range: [16, 17]\n          loc:\n            start:\n              line: 1\n              column: 16\n            end:\n              line: 1\n              column: 17\n        start: 15\n        end: 17\n        range: [15, 17]\n        loc:\n          start:\n            line: 1\n            column: 15\n          end:\n            line: 1\n            column: 17\n      value:\n        object:\n          start: 15\n          end: 16\n          range: [15, 16]\n          loc:\n            start:\n              line: 1\n              column: 15\n            end:\n              line: 1\n              column: 16\n        property:\n          start: 16\n          end: 17\n          range: [16, 17]\n          loc:\n            start:\n              line: 1\n              column: 16\n            end:\n              line: 1\n              column: 17\n        start: 15\n        end: 17\n        range: [15, 17]\n        loc:\n          start:\n            line: 1\n            column: 15\n          end:\n            line: 1\n            column: 17\n      start: 15\n      end: 17\n      range: [15, 17]\n      loc:\n        start:\n          line: 1\n          column: 15\n        end:\n          line: 1\n          column: 17\n    ,\n      key:\n        start: 20\n        end: 23\n        range: [20, 23]\n        loc:\n          start:\n            line: 1\n            column: 20\n          end:\n            line: 1\n            column: 23\n      value:\n        start: 26\n        end: 27\n        range: [26, 27]\n        loc:\n          start:\n            line: 1\n            column: 26\n          end:\n            line: 1\n            column: 27\n      start: 19\n      end: 27\n      range: [19, 27]\n      loc:\n        start:\n          line: 1\n          column: 19\n        end:\n          line: 1\n          column: 27\n    ,\n      key:\n        start: 29\n        end: 32\n        range: [29, 32]\n        loc:\n          start:\n            line: 1\n            column: 29\n          end:\n            line: 1\n            column: 32\n      value:\n        start: 34\n        end: 35\n        range: [34, 35]\n        loc:\n          start:\n            line: 1\n            column: 34\n          end:\n            line: 1\n            column: 35\n      start: 29\n      end: 35\n      range: [29, 35]\n      loc:\n        start:\n          line: 1\n          column: 29\n        end:\n          line: 1\n          column: 35\n    ,\n      argument:\n        start: 40\n        end: 41\n        range: [40, 41]\n        loc:\n          start:\n            line: 1\n            column: 40\n          end:\n            line: 1\n            column: 41\n      start: 37\n      end: 41\n      range: [37, 41]\n      loc:\n        start:\n          line: 1\n          column: 37\n        end:\n          line: 1\n          column: 41\n    ,\n      argument:\n        start: 43\n        end: 44\n        range: [43, 44]\n        loc:\n          start:\n            line: 1\n            column: 43\n          end:\n            line: 1\n            column: 44\n      start: 43\n      end: 47\n      range: [43, 47]\n      loc:\n        start:\n          line: 1\n          column: 43\n        end:\n          line: 1\n          column: 47\n    ]\n    start: 0\n    end: 48\n    range: [0, 48]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 48\n\n  testAstLocationData 'a: 1',\n    type: 'ObjectExpression'\n    properties: [\n      key:\n        start: 0\n        end: 1\n        range: [0, 1]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 1\n      value:\n        start: 3\n        end: 4\n        range: [3, 4]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 4\n      start: 0\n      end: 4\n      range: [0, 4]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 4\n    ]\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\ntest \"AST location data as expected for Assign node\", ->\n  testAstLocationData 'a = b',\n    type: 'AssignmentExpression'\n    left:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    right:\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData 'a += b',\n    type: 'AssignmentExpression'\n    left:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    right:\n      start: 5\n      end: 6\n      range: [5, 6]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 6\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData '{a: [...b]} = c',\n    type: 'AssignmentExpression'\n    left:\n      properties: [\n        type: 'ObjectProperty'\n        key:\n          start: 1\n          end: 2\n          range: [1, 2]\n          loc:\n            start:\n              line: 1\n              column: 1\n            end:\n              line: 1\n              column: 2\n        value:\n          elements: [\n            start: 5\n            end: 9\n            range: [5, 9]\n            loc:\n              start:\n                line: 1\n                column: 5\n              end:\n                line: 1\n                column: 9\n          ]\n          start: 4\n          end: 10\n          range: [4, 10]\n          loc:\n            start:\n              line: 1\n              column: 4\n            end:\n              line: 1\n              column: 10\n        start: 1\n        end: 10\n        range: [1, 10]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 10\n      ]\n      start: 0\n      end: 11\n      range: [0, 11]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 11\n    right:\n      start: 14\n      end: 15\n      range: [14, 15]\n      loc:\n        start:\n          line: 1\n          column: 14\n        end:\n          line: 1\n          column: 15\n    start: 0\n    end: 15\n    range: [0, 15]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 15\n\ntest \"AST location data as expected for Expansion node\", ->\n  testAstLocationData '[..., b] = c',\n    type: 'AssignmentExpression'\n    left:\n      elements: [\n        start: 1\n        end: 4\n        range: [1, 4]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 4\n      ]\n      start: 0\n      end: 8\n      range: [0, 8]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 8\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 12\n\ntest \"AST location data as expected for Throw node\", ->\n  testAstLocationData 'throw new BallError \"catch\"',\n    type: 'ThrowStatement'\n    argument:\n      start: 6\n      end: 27\n      range: [6, 27]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 27\n    start: 0\n    end: 27\n    range: [0, 27]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 27\n\ntest \"AST location data as expected for Existence node\", ->\n  testAstLocationData 'Ghosts?',\n    type: 'UnaryExpression'\n    argument:\n      start: 0\n      end: 6\n      range: [0, 6]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 6\n    start: 0\n    end: 7\n    range: [0, 7]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 7\n\ntest \"AST location data as expected for JSXTag node\", ->\n  testAstLocationData '<CSXY />',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        start: 1\n        end: 5\n        range: [1, 5]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 5\n      start: 0\n      end: 8\n      range: [0, 8]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 8\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData '<div></div>',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        start: 1\n        end: 4\n        range: [1, 4]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 4\n      start: 0\n      end: 5\n      range: [0, 5]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 5\n    closingElement:\n      name:\n        start: 7\n        end: 10\n        range: [7, 10]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 10\n      start: 5\n      end: 11\n      range: [5, 11]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 11\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\n  testAstLocationData '<A.B />',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        object:\n          start: 1\n          end: 2\n          range: [1, 2]\n          loc:\n            start:\n              line: 1\n              column: 1\n            end:\n              line: 1\n              column: 2\n        property:\n          start: 3\n          end: 4\n          range: [3, 4]\n          loc:\n            start:\n              line: 1\n              column: 3\n            end:\n              line: 1\n              column: 4\n        start: 1\n        end: 4\n        range: [1, 4]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 4\n      start: 0\n      end: 7\n      range: [0, 7]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 7\n    start: 0\n    end: 7\n    range: [0, 7]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 7\n\n  testAstLocationData '<Tag.Name.Here></Tag.Name.Here>',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        object:\n          object:\n            start: 1\n            end: 4\n            range: [1, 4]\n            loc:\n              start:\n                line: 1\n                column: 1\n              end:\n                line: 1\n                column: 4\n          property:\n            start: 5\n            end: 9\n            range: [5, 9]\n            loc:\n              start:\n                line: 1\n                column: 5\n              end:\n                line: 1\n                column: 9\n          start: 1\n          end: 9\n          range: [1, 9]\n          loc:\n            start:\n              line: 1\n              column: 1\n            end:\n              line: 1\n              column: 9\n        property:\n          start: 10\n          end: 14\n          range: [10, 14]\n          loc:\n            start:\n              line: 1\n              column: 10\n            end:\n              line: 1\n              column: 14\n        start: 1\n        end: 14\n        range: [1, 14]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 14\n      start: 0\n      end: 15\n      range: [0, 15]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 15\n    closingElement:\n      name:\n        object:\n          object:\n            start: 17\n            end: 20\n            range: [17, 20]\n            loc:\n              start:\n                line: 1\n                column: 17\n              end:\n                line: 1\n                column: 20\n          property:\n            start: 21\n            end: 25\n            range: [21, 25]\n            loc:\n              start:\n                line: 1\n                column: 21\n              end:\n                line: 1\n                column: 25\n          start: 17\n          end: 25\n          range: [17, 25]\n          loc:\n            start:\n              line: 1\n              column: 17\n            end:\n              line: 1\n              column: 25\n        property:\n          start: 26\n          end: 30\n          range: [26, 30]\n          loc:\n            start:\n              line: 1\n              column: 26\n            end:\n              line: 1\n              column: 30\n        start: 17\n        end: 30\n        range: [17, 30]\n        loc:\n          start:\n            line: 1\n            column: 17\n          end:\n            line: 1\n            column: 30\n      start: 15\n      end: 31\n      range: [15, 31]\n      loc:\n        start:\n          line: 1\n          column: 15\n        end:\n          line: 1\n          column: 31\n    start: 0\n    end: 31\n    range: [0, 31]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 31\n\n  testAstLocationData '<></>',\n    type: 'JSXFragment'\n    openingFragment:\n      start: 0\n      end: 2\n      range: [0, 2]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 2\n    closingFragment:\n      start: 2\n      end: 5\n      range: [2, 5]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData '''\n    <div\n      a\n      b=\"c\"\n      d={e}\n      {...f}\n    />\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        start: 1\n        end: 4\n        range: [1, 4]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 4\n      attributes: [\n        name:\n          start: 7\n          end: 8\n          range: [7, 8]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 3\n        start: 7\n        end: 8\n        range: [7, 8]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 3\n      ,\n        name:\n          start: 11\n          end: 12\n          range: [11, 12]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 3\n        value:\n          start: 13\n          end: 16\n          range: [13, 16]\n          loc:\n            start:\n              line: 3\n              column: 4\n            end:\n              line: 3\n              column: 7\n        start: 11\n        end: 16\n        range: [11, 16]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 7\n      ,\n        name:\n          start: 19\n          end: 20\n          range: [19, 20]\n          loc:\n            start:\n              line: 4\n              column: 2\n            end:\n              line: 4\n              column: 3\n        value:\n          expression:\n            start: 22\n            end: 23\n            range: [22, 23]\n            loc:\n              start:\n                line: 4\n                column: 5\n              end:\n                line: 4\n                column: 6\n          start: 21\n          end: 24\n          range: [21, 24]\n          loc:\n            start:\n              line: 4\n              column: 4\n            end:\n              line: 4\n              column: 7\n        start: 19\n        end: 24\n        range: [19, 24]\n        loc:\n          start:\n            line: 4\n            column: 2\n          end:\n            line: 4\n            column: 7\n      ,\n        argument:\n          start: 31\n          end: 32\n          range: [31, 32]\n          loc:\n            start:\n              line: 5\n              column: 6\n            end:\n              line: 5\n              column: 7\n        start: 27\n        end: 33\n        range: [27, 33]\n        loc:\n          start:\n            line: 5\n            column: 2\n          end:\n            line: 5\n            column: 8\n      ]\n      start: 0\n      end: 36\n      range: [0, 36]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 6\n          column: 2\n    start: 0\n    end: 36\n    range: [0, 36]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 6\n        column: 2\n\n  testAstLocationData '<div {f...} />',\n    type: 'JSXElement'\n    openingElement:\n      attributes: [\n        argument:\n          start: 6\n          end: 7\n          range: [6, 7]\n          loc:\n            start:\n              line: 1\n              column: 6\n            end:\n              line: 1\n              column: 7\n        start: 5\n        end: 11\n        range: [5, 11]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 11\n      ]\n\n  testAstLocationData '<div>abc</div>',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        start: 1\n        end: 4\n        range: [1, 4]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 4\n      start: 0\n      end: 5\n      range: [0, 5]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 5\n    closingElement:\n      name:\n        start: 10\n        end: 13\n        range: [10, 13]\n        loc:\n          start:\n            line: 1\n            column: 10\n          end:\n            line: 1\n            column: 13\n      start: 8\n      end: 14\n      range: [8, 14]\n      loc:\n        start:\n          line: 1\n          column: 8\n        end:\n          line: 1\n          column: 14\n    children: [\n      start: 5\n      end: 8\n      range: [5, 8]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 8\n    ]\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 14\n\n  testAstLocationData '''\n    <a>\n      {b}\n      <c />\n    </a>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        start: 1\n        end: 2\n        range: [1, 2]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 2\n      start: 0\n      end: 3\n      range: [0, 3]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 3\n    closingElement:\n      name:\n        start: 20\n        end: 21\n        range: [20, 21]\n        loc:\n          start:\n            line: 4\n            column: 2\n          end:\n            line: 4\n            column: 3\n      start: 18\n      end: 22\n      range: [18, 22]\n      loc:\n        start:\n          line: 4\n          column: 0\n        end:\n          line: 4\n          column: 4\n    children: [\n      start: 3\n      end: 6\n      range: [3, 6]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 2\n          column: 2\n    ,\n      expression:\n        start: 7\n        end: 8\n        range: [7, 8]\n        loc:\n          start:\n            line: 2\n            column: 3\n          end:\n            line: 2\n            column: 4\n      start: 6\n      end: 9\n      range: [6, 9]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 5\n    ,\n      start: 9\n      end: 12\n      range: [9, 12]\n      loc:\n        start:\n          line: 2\n          column: 5\n        end:\n          line: 3\n          column: 2\n    ,\n      start: 12\n      end: 17\n      range: [12, 17]\n      loc:\n        start:\n          line: 3\n          column: 2\n        end:\n          line: 3\n          column: 7\n    ,\n      start: 17\n      end: 18\n      range: [17, 18]\n      loc:\n        start:\n          line: 3\n          column: 7\n        end:\n          line: 4\n          column: 0\n    ]\n    start: 0\n    end: 22\n    range: [0, 22]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 4\n\n  testAstLocationData '<>abc{}</>',\n    type: 'JSXFragment'\n    openingFragment:\n      start: 0\n      end: 2\n      range: [0, 2]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 2\n    closingFragment:\n      start: 7\n      end: 10\n      range: [7, 10]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 10\n    children: [\n      start: 2\n      end: 5\n      range: [2, 5]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 5\n    ,\n      expression:\n        start: 6\n        end: 6\n        range: [6, 6]\n        loc:\n          start:\n            line: 1\n            column: 6\n          end:\n            line: 1\n            column: 6\n      start: 5\n      end: 7\n      range: [5, 7]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 7\n    ]\n    start: 0\n    end: 10\n    range: [0, 10]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 10\n\n  testAstLocationData '''\n    <a>{<b />}</a>\n  ''',\n    type: 'JSXElement'\n    children: [\n      expression:\n        start: 4\n        end: 9\n        range: [4, 9]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 1\n            column: 9\n      start: 3\n      end: 10\n      range: [3, 10]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 10\n    ]\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 14\n\n  testAstLocationData '''\n    <div>{\n      # comment\n    }</div>\n  ''',\n    type: 'JSXElement'\n    children: [\n      expression:\n        start: 6\n        end: 19\n        range: [6, 19]\n        loc:\n          start:\n            line: 1\n            column: 6\n          end:\n            line: 3\n            column: 0\n      start: 5\n      end: 20\n      range: [5, 20]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 3\n          column: 1\n    ]\n    start: 0\n    end: 26\n    range: [0, 26]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 7\n\n  testAstLocationData '''\n    <div>{### here ###}</div>\n  ''',\n    type: 'JSXElement'\n    children: [\n      expression:\n        start: 6\n        end: 18\n        range: [6, 18]\n        loc:\n          start:\n            line: 1\n            column: 6\n          end:\n            line: 1\n            column: 18\n      start: 5\n      end: 19\n      range: [5, 19]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 19\n    ]\n    start: 0\n    end: 25\n    range: [0, 25]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 25\n\n  testAstLocationData '<div:a b:c />',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        namespace:\n          start: 1\n          end: 4\n          range: [1, 4]\n          loc:\n            start:\n              line: 1\n              column: 1\n            end:\n              line: 1\n              column: 4\n        name:\n          start: 5\n          end: 6\n          range: [5, 6]\n          loc:\n            start:\n              line: 1\n              column: 5\n            end:\n              line: 1\n              column: 6\n        start: 1\n        end: 6\n        range: [1, 6]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 6\n      attributes: [\n        name:\n          namespace:\n            start: 7\n            end: 8\n            range: [7, 8]\n            loc:\n              start:\n                line: 1\n                column: 7\n              end:\n                line: 1\n                column: 8\n          name:\n            start: 9\n            end: 10\n            range: [9, 10]\n            loc:\n              start:\n                line: 1\n                column: 9\n              end:\n                line: 1\n                column: 10\n          start: 7\n          end: 10\n          range: [7, 10]\n          loc:\n            start:\n              line: 1\n              column: 7\n            end:\n              line: 1\n              column: 10\n        start: 7\n        end: 10\n        range: [7, 10]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 10\n      ]\n      start: 0\n      end: 13\n      range: [0, 13]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 13\n    start: 0\n    end: 13\n    range: [0, 13]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 13\n\n  testAstLocationData '''\n    <div:a>\n      {b}\n    </div:a>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        namespace:\n          start: 1\n          end: 4\n          range: [1, 4]\n          loc:\n            start:\n              line: 1\n              column: 1\n            end:\n              line: 1\n              column: 4\n        name:\n          start: 5\n          end: 6\n          range: [5, 6]\n          loc:\n            start:\n              line: 1\n              column: 5\n            end:\n              line: 1\n              column: 6\n        start: 1\n        end: 6\n        range: [1, 6]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 6\n      start: 0\n      end: 7\n      range: [0, 7]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 7\n    closingElement:\n      name:\n        namespace:\n          start: 16\n          end: 19\n          range: [16, 19]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 5\n        name:\n          start: 20\n          end: 21\n          range: [20, 21]\n          loc:\n            start:\n              line: 3\n              column: 6\n            end:\n              line: 3\n              column: 7\n        start: 16\n        end: 21\n        range: [16, 21]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 7\n      start: 14\n      end: 22\n      range: [14, 22]\n      loc:\n        start:\n          line: 3\n          column: 0\n        end:\n          line: 3\n          column: 8\n    start: 0\n    end: 22\n    range: [0, 22]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 8\n\n  testAstLocationData '''\n    <div.a>\n      {b}\n    </div.a>\n  ''',\n    type: 'JSXElement'\n    openingElement:\n      name:\n        object:\n          start: 1\n          end: 4\n          range: [1, 4]\n          loc:\n            start:\n              line: 1\n              column: 1\n            end:\n              line: 1\n              column: 4\n        property:\n          start: 5\n          end: 6\n          range: [5, 6]\n          loc:\n            start:\n              line: 1\n              column: 5\n            end:\n              line: 1\n              column: 6\n        start: 1\n        end: 6\n        range: [1, 6]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 6\n      start: 0\n      end: 7\n      range: [0, 7]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 7\n    closingElement:\n      name:\n        object:\n          start: 16\n          end: 19\n          range: [16, 19]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 5\n        property:\n          start: 20\n          end: 21\n          range: [20, 21]\n          loc:\n            start:\n              line: 3\n              column: 6\n            end:\n              line: 3\n              column: 7\n        start: 16\n        end: 21\n        range: [16, 21]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 7\n      start: 14\n      end: 22\n      range: [14, 22]\n      loc:\n        start:\n          line: 3\n          column: 0\n        end:\n          line: 3\n          column: 8\n    start: 0\n    end: 22\n    range: [0, 22]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 8\n\ntest \"AST as expected for Try node\", ->\n  testAstLocationData 'try cappuccino',\n    type: 'TryStatement'\n    block:\n      type: 'BlockStatement'\n      body: [\n        expression:\n          start: 4\n          end: 14\n          range: [4, 14]\n          loc:\n            start:\n              line: 1\n              column: 4\n            end:\n              line: 1\n              column: 14\n        start: 4\n        end: 14\n        range: [4, 14]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 1\n            column: 14\n      ]\n      start: 3\n      end: 14\n      range: [3, 14]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 14\n    start: 0\n    end: 14\n    range: [0, 14]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 14\n\n  testAstLocationData '''\n    try\n      x = 1\n      y()\n    catch e\n      d()\n    finally\n      f + g\n  ''',\n    type: 'TryStatement'\n    block:\n      type: 'BlockStatement'\n      body: [\n        expression:\n          start: 6\n          end: 11\n          range: [6, 11]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 7\n        start: 6\n        end: 11\n        range: [6, 11]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 7\n      ,\n        expression:\n          start: 14\n          end: 17\n          range: [14, 17]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 5\n        start: 14\n        end: 17\n        range: [14, 17]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 5\n      ]\n      start: 4\n      end: 17\n      range: [4, 17]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 5\n    handler:\n      param:\n        start: 24\n        end: 25\n        range: [24, 25]\n        loc:\n          start:\n            line: 4\n            column: 6\n          end:\n            line: 4\n            column: 7\n      body:\n        body: [\n          start: 28\n          end: 31\n          range: [28, 31]\n          loc:\n            start:\n              line: 5\n              column: 2\n            end:\n              line: 5\n              column: 5\n        ]\n        start: 26\n        end: 31\n        range: [26, 31]\n        loc:\n          start:\n            line: 5\n            column: 0\n          end:\n            line: 5\n            column: 5\n      start: 18\n      end: 31\n      range: [18, 31]\n      loc:\n        start:\n          line: 4\n          column: 0\n        end:\n          line: 5\n          column: 5\n    finalizer:\n      body: [\n        expression:\n          start: 42\n          end: 47\n          range: [42, 47]\n          loc:\n            start:\n              line: 7\n              column: 2\n            end:\n              line: 7\n              column: 7\n        start: 42\n        end: 47\n        range: [42, 47]\n        loc:\n          start:\n            line: 7\n            column: 2\n          end:\n            line: 7\n            column: 7\n      ]\n      start: 32\n      end: 47\n      range: [32, 47]\n      loc:\n        start:\n          line: 6\n          column: 0\n        end:\n          line: 7\n          column: 7\n    start: 0\n    end: 47\n    range: [0, 47]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 7\n        column: 7\n\n  testAstLocationData '''\n    try\n    catch {e}\n      f\n  ''',\n    type: 'TryStatement'\n    handler:\n      param:\n        start: 10\n        end: 13\n        range: [10, 13]\n        loc:\n          start:\n            line: 2\n            column: 6\n          end:\n            line: 2\n            column: 9\n      body:\n        start: 14\n        end: 17\n        range: [14, 17]\n        loc:\n          start:\n            line: 3\n            column: 0\n          end:\n            line: 3\n            column: 3\n      start: 4\n      end: 17\n      range: [4, 17]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 3\n\ntest \"AST location data as expected for Root node\", ->\n  testAstRootLocationData '1\\n2',\n    type: 'File'\n    program:\n      start: 0\n      end: 3\n      range: [0, 3]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 2\n          column: 1\n    start: 0\n    end: 3\n    range: [0, 3]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 1\n\n  testAstRootLocationData 'a = 1\\nb',\n    type: 'File'\n    program:\n      start: 0\n      end: 7\n      range: [0, 7]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 2\n          column: 1\n    start: 0\n    end: 7\n    range: [0, 7]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 1\n\n  testAstRootLocationData 'a = 1\\nb\\n\\n',\n    type: 'File'\n    program:\n      start: 0\n      end: 9\n      range: [0, 9]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 4\n          column: 0\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 0\n\n  testAstRootLocationData 'a = 1\\n\\n# Comment',\n    type: 'File'\n    program:\n      start: 0\n      end: 16\n      range: [0, 16]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 3\n          column: 9\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 9\n\n  testAstRootLocationData 'a = 1\\n\\n# Comment\\n',\n    type: 'File'\n    program:\n      start: 0\n      end: 17\n      range: [0, 17]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 4\n          column: 0\n    start: 0\n    end: 17\n    range: [0, 17]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 0\n\n  testAstRootLocationData '''\n    # comment\n    \"use strict\"\n  ''',\n    type: 'File'\n    program:\n      start: 0\n      end: 22\n      range: [0, 22]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 2\n          column: 12\n    start: 0\n    end: 22\n    range: [0, 22]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 12\n\n  testAstRootLocationData ' \\n',\n    type: 'File'\n    program:\n      start: 0\n      end: 2\n      range: [0, 2]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 2\n          column: 0\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 0\n\n  testAstRootLocationData '\\n',\n    type: 'File'\n    program:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 2\n          column: 0\n    start: 0\n    end: 1\n    range: [0, 1]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 0\n\n  testAstRootLocationData '',\n    type: 'File'\n    program:\n      start: 0\n      end: 0\n      range: [0, 0]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 0\n    start: 0\n    end: 0\n    range: [0, 0]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 0\n\n  testAstRootLocationData ' ',\n    type: 'File'\n    program:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    start: 0\n    end: 1\n    range: [0, 1]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 1\n\ntest \"AST location data as expected for Switch node\", ->\n  testAstLocationData '''\n    switch x\n      when a then a\n      when b, c then c\n      else 42\n  ''',\n    type: 'SwitchStatement'\n    discriminant:\n      start: 7\n      end: 8\n      range: [7, 8]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 8\n    cases: [\n      test:\n        start: 16\n        end: 17\n        range: [16, 17]\n        loc:\n          start:\n            line: 2\n            column: 7\n          end:\n            line: 2\n            column: 8\n      consequent: [\n        expression:\n          start: 23\n          end: 24\n          range: [23, 24]\n          loc:\n            start:\n              line: 2\n              column: 14\n            end:\n              line: 2\n              column: 15\n        start: 23\n        end: 24\n        range: [23, 24]\n        loc:\n          start:\n            line: 2\n            column: 14\n          end:\n            line: 2\n            column: 15\n      ]\n      start: 11\n      end: 24\n      range: [11, 24]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 15\n    ,\n      test:\n        start: 32\n        end: 33\n        range: [32, 33]\n        loc:\n          start:\n            line: 3\n            column: 7\n          end:\n            line: 3\n            column: 8\n      start: 27\n      end: 33\n      range: [27, 33]\n      loc:\n        start:\n          line: 3\n          column: 2\n        end:\n          line: 3\n          column: 8\n    ,\n      test:\n        start: 35\n        end: 36\n        range: [35, 36]\n        loc:\n          start:\n            line: 3\n            column: 10\n          end:\n            line: 3\n            column: 11\n      consequent: [\n        expression:\n          start: 42\n          end: 43\n          range: [42, 43]\n          loc:\n            start:\n              line: 3\n              column: 17\n            end:\n              line: 3\n              column: 18\n        start: 42\n        end: 43\n        range: [42, 43]\n        loc:\n          start:\n            line: 3\n            column: 17\n          end:\n            line: 3\n            column: 18\n      ]\n      start: 35\n      end: 43\n      range: [35, 43]\n      loc:\n        start:\n          line: 3\n          column: 10\n        end:\n          line: 3\n          column: 18\n    ,\n      consequent: [\n        expression:\n          start: 51\n          end: 53\n          range: [51, 53]\n          loc:\n            start:\n              line: 4\n              column: 7\n            end:\n              line: 4\n              column: 9\n        start: 51\n        end: 53\n        range: [51, 53]\n        loc:\n          start:\n            line: 4\n            column: 7\n          end:\n            line: 4\n            column: 9\n      ]\n      start: 46\n      end: 53\n      range: [46, 53]\n      loc:\n        start:\n          line: 4\n          column: 2\n        end:\n          line: 4\n          column: 9\n    ,\n    ]\n    start: 0\n    end: 53\n    range: [0, 53]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 9\n\n  testAstLocationData '''\n    switch\n      when some(condition)\n        doSomething()\n        andThenSomethingElse\n  ''',\n    type: 'SwitchStatement'\n    cases: [\n      test:\n        start: 14\n        end: 29\n        range: [14, 29]\n        loc:\n          start:\n            line: 2\n            column: 7\n          end:\n            line: 2\n            column: 22\n      consequent: [\n        expression:\n          start: 34\n          end: 47\n          range: [34, 47]\n          loc:\n            start:\n              line: 3\n              column: 4\n            end:\n              line: 3\n              column: 17\n        start: 34\n        end: 47\n        range: [34, 47]\n        loc:\n          start:\n            line: 3\n            column: 4\n          end:\n            line: 3\n            column: 17\n      ,\n        expression:\n          start: 52\n          end: 72\n          range: [52, 72]\n          loc:\n            start:\n              line: 4\n              column: 4\n            end:\n              line: 4\n              column: 24\n      ]\n    ]\ntest \"AST location data as expected for Code node\", ->\n  testAstLocationData '''\n    (a) ->\n      b\n      c()\n  ''',\n    type: 'FunctionExpression'\n    params: [\n      start: 1\n      end: 2\n      range: [1, 2]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 2\n    ]\n    body:\n      body: [\n        start: 9\n        end: 10\n        range: [9, 10]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 3\n      ,\n        start: 13\n        end: 16\n        range: [13, 16]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 5\n      ]\n      start: 7\n      end: 16\n      range: [7, 16]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 5\n\n  testAstLocationData '''\n    -> a\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 2\n      end: 4\n      range: [2, 4]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 4\n    start: 0\n    end: 4\n    range: [0, 4]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 4\n\n  testAstLocationData '''\n    (\n      a,\n      [\n        b\n        c\n      ]\n    ) ->\n      d\n  ''',\n    type: 'FunctionExpression'\n    params: [\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 3\n    ,\n      elements: [\n        start: 15\n        end: 16\n        range: [15, 16]\n        loc:\n          start:\n            line: 4\n            column: 4\n          end:\n            line: 4\n            column: 5\n      ,\n        start: 21\n        end: 22\n        range: [21, 22]\n        loc:\n          start:\n            line: 5\n            column: 4\n          end:\n            line: 5\n            column: 5\n      ]\n      start: 9\n      end: 26\n      range: [9, 26]\n      loc:\n        start:\n          line: 3\n          column: 2\n        end:\n          line: 6\n          column: 3\n    ]\n    start: 0\n    end: 35\n    range: [0, 35]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 8\n        column: 3\n\n  testAstLocationData '''\n    ->\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 2\n      end: 2\n      range: [2, 2]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 2\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 2\n\n  testAstLocationData '''\n    (a...) ->\n  ''',\n    type: 'FunctionExpression'\n    params: [\n      argument:\n        start: 1\n        end: 2\n        range: [1, 2]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 2\n      start: 1\n      end: 5\n      range: [1, 5]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 5\n    ]\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\n  testAstLocationData '''\n    (...a) ->\n  ''',\n    type: 'FunctionExpression'\n    params: [\n      argument:\n        start: 4\n        end: 5\n        range: [4, 5]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 1\n            column: 5\n      start: 1\n      end: 5\n      range: [1, 5]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 5\n    ]\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\ntest \"AST location data as expected for Return node\", ->\n  testAstLocationData 'return no',\n    type: 'ReturnStatement'\n    argument:\n      start: 7\n      end: 9\n      range: [7, 9]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 9\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\n  testAstLocationData '''\n    (a, b) ->\n      return a + b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        argument:\n          start: 19\n          end: 24\n          range: [19, 24]\n          loc:\n            start:\n              line: 2\n              column: 9\n            end:\n              line: 2\n              column: 14\n        start: 12\n        end: 24\n        range: [12, 24]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 14\n      ]\n      start: 10\n      end: 24\n      range: [10, 24]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 14\n    start: 0\n    end: 24\n    range: [0, 24]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 14\n\n  testAstLocationData '-> return',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        start: 3\n        end: 9\n        range: [3, 9]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 9\n      ]\n      start: 2\n      end: 9\n      range: [2, 9]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 9\n    start: 0\n    end: 9\n    range: [0, 9]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 9\n\ntest \"AST as expected for YieldReturn node\", ->\n  testAstLocationData '-> yield return 1',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        expression:\n          argument:\n            argument:\n              start: 16\n              end: 17\n              range: [16, 17]\n              loc:\n                start:\n                  line: 1\n                  column: 16\n                end:\n                  line: 1\n                  column: 17\n            start: 9\n            end: 17\n            range: [9, 17]\n            loc:\n              start:\n                line: 1\n                column: 9\n              end:\n                line: 1\n                column: 17\n          start: 3\n          end: 17\n          range: [3, 17]\n          loc:\n            start:\n              line: 1\n              column: 3\n            end:\n              line: 1\n              column: 17\n        start: 3\n        end: 17\n        range: [3, 17]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 17\n      ]\n      start: 2\n      end: 17\n      range: [2, 17]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 17\n    start: 0\n    end: 17\n    range: [0, 17]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 17\n\n  testAstLocationData '-> yield return',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        expression:\n          argument:\n            start: 9\n            end: 15\n            range: [9, 15]\n            loc:\n              start:\n                line: 1\n                column: 9\n              end:\n                line: 1\n                column: 15\n          start: 3\n          end: 15\n          range: [3, 15]\n          loc:\n            start:\n              line: 1\n              column: 3\n            end:\n              line: 1\n              column: 15\n        start: 3\n        end: 15\n        range: [3, 15]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 15\n      ]\n      start: 2\n      end: 15\n      range: [2, 15]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 15\n    start: 0\n    end: 15\n    range: [0, 15]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 15\n\ntest \"AST as expected for AwaitReturn node\", ->\n  testAstLocationData '-> await return 1',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        expression:\n          argument:\n            argument:\n              start: 16\n              end: 17\n              range: [16, 17]\n              loc:\n                start:\n                  line: 1\n                  column: 16\n                end:\n                  line: 1\n                  column: 17\n            start: 9\n            end: 17\n            range: [9, 17]\n            loc:\n              start:\n                line: 1\n                column: 9\n              end:\n                line: 1\n                column: 17\n          start: 3\n          end: 17\n          range: [3, 17]\n          loc:\n            start:\n              line: 1\n              column: 3\n            end:\n              line: 1\n              column: 17\n        start: 3\n        end: 17\n        range: [3, 17]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 17\n      ]\n      start: 2\n      end: 17\n      range: [2, 17]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 17\n    start: 0\n    end: 17\n    range: [0, 17]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 17\n\n  testAstLocationData '-> await return',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        expression:\n          argument:\n            start: 9\n            end: 15\n            range: [9, 15]\n            loc:\n              start:\n                line: 1\n                column: 9\n              end:\n                line: 1\n                column: 15\n          start: 3\n          end: 15\n          range: [3, 15]\n          loc:\n            start:\n              line: 1\n              column: 3\n            end:\n              line: 1\n              column: 15\n        start: 3\n        end: 15\n        range: [3, 15]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 15\n      ]\n      start: 2\n      end: 15\n      range: [2, 15]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 15\n    start: 0\n    end: 15\n    range: [0, 15]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 15\n\ntest \"AST as expected for If node\", ->\n  testAstLocationData 'if maybe then yes',\n    type: 'IfStatement'\n    test:\n      start: 3\n      end: 8\n      range: [3, 8]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 8\n    consequent:\n      body: [\n        expression:\n          start: 14\n          end: 17\n          range: [14, 17]\n          loc:\n            start:\n              line: 1\n              column: 14\n            end:\n              line: 1\n              column: 17\n        start: 14\n        end: 17\n        range: [14, 17]\n        loc:\n          start:\n            line: 1\n            column: 14\n          end:\n            line: 1\n            column: 17\n      ]\n      start: 9\n      end: 17\n      range: [9, 17]\n      loc:\n        start:\n          line: 1\n          column: 9\n        end:\n          line: 1\n          column: 17\n    start: 0\n    end: 17\n    range: [0, 17]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 17\n\n  testAstLocationData 'yes if maybe',\n    type: 'IfStatement'\n    test:\n      start: 7\n      end: 12\n      range: [7, 12]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 12\n    consequent:\n      body: [\n        expression:\n          start: 0\n          end: 3\n          range: [0, 3]\n          loc:\n            start:\n              line: 1\n              column: 0\n            end:\n              line: 1\n              column: 3\n        start: 0\n        end: 3\n        range: [0, 3]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 3\n      ]\n      start: 0\n      end: 3\n      range: [0, 3]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 3\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 12\n\n  testAstLocationData 'unless x then x else if y then y else z',\n    type: 'IfStatement'\n    test:\n      start: 7\n      end: 8\n      range: [7, 8]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 8\n    consequent:\n      body: [\n        expression:\n          start: 14\n          end: 15\n          range: [14, 15]\n          loc:\n            start:\n              line: 1\n              column: 14\n            end:\n              line: 1\n              column: 15\n        start: 14\n        end: 15\n        range: [14, 15]\n        loc:\n          start:\n            line: 1\n            column: 14\n          end:\n            line: 1\n            column: 15\n      ]\n      start: 9\n      end: 15\n      range: [9, 15]\n      loc:\n        start:\n          line: 1\n          column: 9\n        end:\n          line: 1\n          column: 15\n    alternate:\n      test:\n        start: 24\n        end: 25\n        range: [24, 25]\n        loc:\n          start:\n            line: 1\n            column: 24\n          end:\n            line: 1\n            column: 25\n      consequent:\n        body: [\n          expression:\n            start: 31\n            end: 32\n            range: [31, 32]\n            loc:\n              start:\n                line: 1\n                column: 31\n              end:\n                line: 1\n                column: 32\n          start: 31\n          end: 32\n          range: [31, 32]\n          loc:\n            start:\n              line: 1\n              column: 31\n            end:\n              line: 1\n              column: 32\n        ]\n        start: 26\n        end: 32\n        range: [26, 32]\n        loc:\n          start:\n            line: 1\n            column: 26\n          end:\n            line: 1\n            column: 32\n      alternate:\n        body: [\n          expression:\n            start: 38\n            end: 39\n            range: [38, 39]\n            loc:\n              start:\n                line: 1\n                column: 38\n              end:\n                line: 1\n                column: 39\n          start: 38\n          end: 39\n          range: [38, 39]\n          loc:\n            start:\n              line: 1\n              column: 38\n            end:\n              line: 1\n              column: 39\n        ]\n        start: 37\n        end: 39\n        range: [37, 39]\n        loc:\n          start:\n            line: 1\n            column: 37\n          end:\n            line: 1\n            column: 39\n      start: 21\n      end: 39\n      range: [21, 39]\n      loc:\n        start:\n          line: 1\n          column: 21\n        end:\n          line: 1\n          column: 39\n    start: 0\n    end: 39\n    range: [0, 39]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 39\n\n  testAstLocationData '''\n    if a\n      b\n    else\n      if c\n        d\n  ''',\n    type: 'IfStatement'\n    test:\n      start: 3\n      end: 4\n      range: [3, 4]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 4\n    consequent:\n      body: [\n        expression:\n          start: 7\n          end: 8\n          range: [7, 8]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 3\n        start: 7\n        end: 8\n        range: [7, 8]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 3\n      ]\n      start: 5\n      end: 8\n      range: [5, 8]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 3\n    alternate:\n      body: [\n        test:\n          start: 19\n          end: 20\n          range: [19, 20]\n          loc:\n            start:\n              line: 4\n              column: 5\n            end:\n              line: 4\n              column: 6\n        consequent:\n          body: [\n            expression:\n              start: 25\n              end: 26\n              range: [25, 26]\n              loc:\n                start:\n                  line: 5\n                  column: 4\n                end:\n                  line: 5\n                  column: 5\n            start: 25\n            end: 26\n            range: [25, 26]\n            loc:\n              start:\n                line: 5\n                column: 4\n              end:\n                line: 5\n                column: 5\n          ]\n          start: 21\n          end: 26\n          range: [21, 26]\n          loc:\n            start:\n              line: 5\n              column: 0\n            end:\n              line: 5\n              column: 5\n        start: 16\n        end: 26\n        range: [16, 26]\n        loc:\n          start:\n            line: 4\n            column: 2\n          end:\n            line: 5\n            column: 5\n      ]\n      start: 14\n      end: 26\n      range: [14, 26]\n      loc:\n        start:\n          line: 4\n          column: 0\n        end:\n          line: 5\n          column: 5\n    start: 0\n    end: 26\n    range: [0, 26]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 5\n        column: 5\n\n  testAstLocationData '''\n    a =\n      if b then c else if d then e\n  ''',\n    type: 'AssignmentExpression'\n    right:\n      test:\n        start: 9\n        end: 10\n        range: [9, 10]\n        loc:\n          start:\n            line: 2\n            column: 5\n          end:\n            line: 2\n            column: 6\n      consequent:\n        start: 16\n        end: 17\n        range: [16, 17]\n        loc:\n          start:\n            line: 2\n            column: 12\n          end:\n            line: 2\n            column: 13\n      alternate:\n        test:\n          start: 26\n          end: 27\n          range: [26, 27]\n          loc:\n            start:\n              line: 2\n              column: 22\n            end:\n              line: 2\n              column: 23\n        consequent:\n          start: 33\n          end: 34\n          range: [33, 34]\n          loc:\n            start:\n              line: 2\n              column: 29\n            end:\n              line: 2\n              column: 30\n        start: 23\n        end: 34\n        range: [23, 34]\n        loc:\n          start:\n            line: 2\n            column: 19\n          end:\n            line: 2\n            column: 30\n      start: 6\n      end: 34\n      range: [6, 34]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 2\n          column: 30\n    start: 0\n    end: 34\n    range: [0, 34]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 30\n\n  testAstLocationData '''\n    f(\n      if b\n        c\n        d\n    )\n  ''',\n    type: 'CallExpression'\n    arguments: [\n      test:\n        start: 8\n        end: 9\n        range: [8, 9]\n        loc:\n          start:\n            line: 2\n            column: 5\n          end:\n            line: 2\n            column: 6\n      consequent:\n        body: [\n          expression:\n            start: 14\n            end: 15\n            range: [14, 15]\n            loc:\n              start:\n                line: 3\n                column: 4\n              end:\n                line: 3\n                column: 5\n          start: 14\n          end: 15\n          range: [14, 15]\n          loc:\n            start:\n              line: 3\n              column: 4\n            end:\n              line: 3\n              column: 5\n        ,\n          expression:\n            start: 20\n            end: 21\n            range: [20, 21]\n            loc:\n              start:\n                line: 4\n                column: 4\n              end:\n                line: 4\n                column: 5\n          start: 20\n          end: 21\n          range: [20, 21]\n          loc:\n            start:\n              line: 4\n              column: 4\n            end:\n              line: 4\n              column: 5\n        ]\n        start: 10\n        end: 21\n        range: [10, 21]\n        loc:\n          start:\n            line: 3\n            column: 0\n          end:\n            line: 4\n            column: 5\n    ]\n    start: 0\n    end: 23\n    range: [0, 23]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 5\n        column: 1\n\ntest \"AST as expected for While node\", ->\n  testAstLocationData 'loop 1',\n    type: 'WhileStatement'\n    test:\n      start: 0\n      end: 4\n      range: [0, 4]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 4\n    body:\n      body: [\n        expression:\n          start: 5\n          end: 6\n          range: [5, 6]\n          loc:\n            start:\n              line: 1\n              column: 5\n            end:\n              line: 1\n              column: 6\n        start: 5\n        end: 6\n        range: [5, 6]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 6\n      ]\n      start: 5\n      end: 6\n      range: [5, 6]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 6\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData 'while 1 < 2 then',\n    type: 'WhileStatement'\n    test:\n      start: 6\n      end: 11\n      range: [6, 11]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 11\n    body:\n      start: 12\n      end: 16\n      range: [12, 16]\n      loc:\n        start:\n          line: 1\n          column: 12\n        end:\n          line: 1\n          column: 16\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 16\n\n  testAstLocationData 'while 1 < 2 then fn()',\n    type: 'WhileStatement'\n    test:\n      start: 6\n      end: 11\n      range: [6, 11]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 11\n    body:\n      body: [\n        expression:\n          start: 17\n          end: 21\n          range: [17, 21]\n          loc:\n            start:\n              line: 1\n              column: 17\n            end:\n              line: 1\n              column: 21\n        start: 17\n        end: 21\n        range: [17, 21]\n        loc:\n          start:\n            line: 1\n            column: 17\n          end:\n            line: 1\n            column: 21\n      ]\n      start: 12\n      end: 21\n      range: [12, 21]\n      loc:\n        start:\n          line: 1\n          column: 12\n        end:\n          line: 1\n          column: 21\n    start: 0\n    end: 21\n    range: [0, 21]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 21\n\n\n  testAstLocationData '''\n    x() until y\n  ''',\n    type: 'WhileStatement'\n    test:\n      start: 10\n      end: 11\n      range: [10, 11]\n      loc:\n        start:\n          line: 1\n          column: 10\n        end:\n          line: 1\n          column: 11\n    body:\n      body: [\n        expression:\n          start: 0\n          end: 3\n          range: [0, 3]\n          loc:\n            start:\n              line: 1\n              column: 0\n            end:\n              line: 1\n              column: 3\n        start: 0\n        end: 3\n        range: [0, 3]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 3\n      ]\n      start: 0\n      end: 3\n      range: [0, 3]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 3\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\n  testAstLocationData '''\n    until x when y\n      z++\n  ''',\n    type: 'WhileStatement'\n    test:\n      start: 6\n      end: 7\n      range: [6, 7]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 7\n    body:\n      body: [\n        expression:\n          start: 17\n          end: 20\n          range: [17, 20]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 5\n        start: 17\n        end: 20\n        range: [17, 20]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 5\n      ]\n      start: 15\n      end: 20\n      range: [15, 20]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 5\n    guard:\n      start: 13\n      end: 14\n      range: [13, 14]\n      loc:\n        start:\n          line: 1\n          column: 13\n        end:\n          line: 1\n          column: 14\n    start: 0\n    end: 20\n    range: [0, 20]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 5\n\n  testAstLocationData '''\n    x while y when z\n  ''',\n    type: 'WhileStatement'\n    test:\n      start: 8\n      end: 9\n      range: [8, 9]\n      loc:\n        start:\n          line: 1\n          column: 8\n        end:\n          line: 1\n          column: 9\n    body:\n      body: [\n        expression:\n          start: 0\n          end: 1\n          range: [0, 1]\n          loc:\n            start:\n              line: 1\n              column: 0\n            end:\n              line: 1\n              column: 1\n        start: 0\n        end: 1\n        range: [0, 1]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 1\n      ]\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    guard:\n      start: 15\n      end: 16\n      range: [15, 16]\n      loc:\n        start:\n          line: 1\n          column: 15\n        end:\n          line: 1\n          column: 16\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 16\n\n  testAstLocationData '''\n    loop\n      a()\n      b++\n  ''',\n    type: 'WhileStatement'\n    test:\n      start: 0\n      end: 4\n      range: [0, 4]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 4\n    body:\n      body: [\n        expression:\n          start: 7\n          end: 10\n          range: [7, 10]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 5\n        start: 7\n        end: 10\n        range: [7, 10]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 5\n      ,\n        expression:\n          start: 13\n          end: 16\n          range: [13, 16]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 5\n        start: 13\n        end: 16\n        range: [13, 16]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 5\n      ]\n      start: 5\n      end: 16\n      range: [5, 16]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 5\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 5\n\ntest \"AST location data as expected for `new.target` MetaProperty node\", ->\n  testAstLocationData '''\n    -> new.target\n  ''',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        expression:\n          meta:\n            start: 3\n            end: 6\n            range: [3, 6]\n            loc:\n              start:\n                line: 1\n                column: 3\n              end:\n                line: 1\n                column: 6\n          property:\n            start: 7\n            end: 13\n            range: [7, 13]\n            loc:\n              start:\n                line: 1\n                column: 7\n              end:\n                line: 1\n                column: 13\n          start: 3\n          end: 13\n          range: [3, 13]\n          loc:\n            start:\n              line: 1\n              column: 3\n            end:\n              line: 1\n              column: 13\n      ]\n    start: 0\n    end: 13\n    range: [0, 13]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 13\n\ntest \"AST location data as expected for `import.meta` MetaProperty node\", ->\n  testAstLocationData '''\n    import.meta\n  ''',\n    type: 'MetaProperty'\n    meta:\n      start: 0\n      end: 6\n      range: [0, 6]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 6\n    property:\n      start: 7\n      end: 11\n      range: [7, 11]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 11\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\ntest \"AST location data as expected for For node\", ->\n  testAstLocationData 'for x, i in arr when x? then return',\n    type: 'For'\n    name:\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    index:\n      start: 7\n      end: 8\n      range: [7, 8]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 8\n    guard:\n      start: 21\n      end: 23\n      range: [21, 23]\n      loc:\n        start:\n          line: 1\n          column: 21\n        end:\n          line: 1\n          column: 23\n    source:\n      start: 12\n      end: 15\n      range: [12, 15]\n      loc:\n        start:\n          line: 1\n          column: 12\n        end:\n          line: 1\n          column: 15\n    body:\n      body: [\n        start: 29\n        end: 35\n        range: [29, 35]\n        loc:\n          start:\n            line: 1\n            column: 29\n          end:\n            line: 1\n            column: 35\n      ]\n      start: 24\n      end: 35\n      range: [24, 35]\n      loc:\n        start:\n          line: 1\n          column: 24\n        end:\n          line: 1\n          column: 35\n    start: 0\n    end: 35\n    range: [0, 35]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 35\n\n  testAstLocationData 'a = (x for x in y)',\n    type: 'AssignmentExpression'\n    right:\n      name:\n        start: 11\n        end: 12\n        range: [11, 12]\n        loc:\n          start:\n            line: 1\n            column: 11\n          end:\n            line: 1\n            column: 12\n      body:\n        start: 5\n        end: 6\n        range: [5, 6]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 6\n      source:\n        start: 16\n        end: 17\n        range: [16, 17]\n        loc:\n          start:\n            line: 1\n            column: 16\n          end:\n            line: 1\n            column: 17\n      start: 5\n      end: 17\n      range: [5, 17]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 17\n    start: 0\n    end: 18\n    range: [0, 18]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 18\n\n  testAstLocationData 'x for [0...1]',\n    type: 'For'\n    body:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    source:\n      start: 6\n      end: 13\n      range: [6, 13]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 13\n    start: 0\n    end: 13\n    range: [0, 13]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 13\n\n  testAstLocationData '''\n    for own x, y of z\n      c()\n      d\n  ''',\n    type: 'For'\n    name:\n      start: 11\n      end: 12\n      range: [11, 12]\n      loc:\n        start:\n          line: 1\n          column: 11\n        end:\n          line: 1\n          column: 12\n    index:\n      start: 8\n      end: 9\n      range: [8, 9]\n      loc:\n        start:\n          line: 1\n          column: 8\n        end:\n          line: 1\n          column: 9\n    body:\n      body: [\n        start: 20\n        end: 23\n        range: [20, 23]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 5\n      ,\n        start: 26\n        end: 27\n        range: [26, 27]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 3\n      ]\n      start: 18\n      end: 27\n      range: [18, 27]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 3\n    source:\n      start: 16\n      end: 17\n      range: [16, 17]\n      loc:\n        start:\n          line: 1\n          column: 16\n        end:\n          line: 1\n          column: 17\n    start: 0\n    end: 27\n    range: [0, 27]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  testAstLocationData '''\n    ->\n      for await x from y\n        z\n  ''',\n    type: 'FunctionExpression'\n    body:\n      body: [\n        name:\n          start: 15\n          end: 16\n          range: [15, 16]\n          loc:\n            start:\n              line: 2\n              column: 12\n            end:\n              line: 2\n              column: 13\n        body:\n          body: [\n            start: 28\n            end: 29\n            range: [28, 29]\n            loc:\n              start:\n                line: 3\n                column: 4\n              end:\n                line: 3\n                column: 5\n          ]\n          start: 24\n          end: 29\n          range: [24, 29]\n          loc:\n            start:\n              line: 3\n              column: 0\n            end:\n              line: 3\n              column: 5\n        source:\n          start: 22\n          end: 23\n          range: [22, 23]\n          loc:\n            start:\n              line: 2\n              column: 19\n            end:\n              line: 2\n              column: 20\n        start: 5\n        end: 29\n        range: [5, 29]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 3\n            column: 5\n      ]\n      start: 3\n      end: 29\n      range: [3, 29]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 5\n    start: 0\n    end: 29\n    range: [0, 29]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 5\n\n  testAstLocationData '''\n    for {x} in y\n      z\n  ''',\n    type: 'For'\n    name:\n      properties: [\n        start: 5\n        end: 6\n        range: [5, 6]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 6\n      ]\n      start: 4\n      end: 7\n      range: [4, 7]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 7\n    body:\n      body: [\n        start: 15\n        end: 16\n        range: [15, 16]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 3\n      ]\n      start: 13\n      end: 16\n      range: [13, 16]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 3\n    source:\n      start: 11\n      end: 12\n      range: [11, 12]\n      loc:\n        start:\n          line: 1\n          column: 11\n        end:\n          line: 1\n          column: 12\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 3\n\ntest \"AST location data as expected for StringWithInterpolations node\", ->\n  testAstLocationData '\"a#{b}c\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    ]\n    quasis: [\n      start: 1\n      end: 2\n      range: [1, 2]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 2\n    ,\n      start: 6\n      end: 7\n      range: [6, 7]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 7\n    ]\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData '\"\"\"a#{b}c\"\"\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 6\n      end: 7\n      range: [6, 7]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 7\n    ]\n    quasis: [\n      start: 3\n      end: 4\n      range: [3, 4]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 4\n    ,\n      start: 8\n      end: 9\n      range: [8, 9]\n      loc:\n        start:\n          line: 1\n          column: 8\n        end:\n          line: 1\n          column: 9\n    ]\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 12\n\n  testAstLocationData '\"#{b}\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 3\n      end: 4\n      range: [3, 4]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 4\n    ]\n    quasis: [\n      start: 1\n      end: 1\n      range: [1, 1]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 1\n    ,\n      start: 5\n      end: 5\n      range: [5, 5]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 5\n    ]\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 6\n\n  testAstLocationData '''\n    \" a\n      #{b}\n      c\n    \"\n  ''',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 8\n      end: 9\n      range: [8, 9]\n      loc:\n        start:\n          line: 2\n          column: 4\n        end:\n          line: 2\n          column: 5\n    ]\n    quasis: [\n      start: 1\n      end: 6\n      range: [1, 6]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 2\n          column: 2\n    ,\n      start: 10\n      end: 15\n      range: [10, 15]\n      loc:\n        start:\n          line: 2\n          column: 6\n        end:\n          line: 4\n          column: 0\n    ]\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 1\n\n  testAstLocationData '''\n    \"\"\"\n      a\n        b#{\n        c\n      }d\n    \"\"\"\n  ''',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 20\n      end: 21\n      range: [20, 21]\n      loc:\n        start:\n          line: 4\n          column: 4\n        end:\n          line: 4\n          column: 5\n    ]\n    quasis: [\n      start: 3\n      end: 13\n      range: [3, 13]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 3\n          column: 5\n    ,\n      start: 25\n      end: 27\n      range: [25, 27]\n      loc:\n        start:\n          line: 5\n          column: 3\n        end:\n          line: 6\n          column: 0\n    ]\n    start: 0\n    end: 30\n    range: [0, 30]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 6\n        column: 3\n\n  # empty interpolation\n  testAstLocationData '\"#{}\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 3\n      end: 3\n      range: [3, 3]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 3\n    ]\n    quasis: [\n      start: 1\n      end: 1\n      range: [1, 1]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 1\n    ,\n      start: 4\n      end: 4\n      range: [4, 4]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 4\n    ]\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData '''\n    \"#{\n      # comment\n     }\"\n    ''',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 3\n      end: 17\n      range: [3, 17]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 3\n          column: 1\n    ]\n    quasis: [\n      start: 1\n      end: 1\n      range: [1, 1]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 1\n    ,\n      start: 18\n      end: 18\n      range: [18, 18]\n      loc:\n        start:\n          line: 3\n          column: 2\n        end:\n          line: 3\n          column: 2\n    ]\n    start: 0\n    end: 19\n    range: [0, 19]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  testAstLocationData '\"#{ ### here ### }\"',\n    type: 'TemplateLiteral'\n    expressions: [\n      start: 3\n      end: 17\n      range: [3, 17]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 17\n    ]\n    quasis: [\n      start: 1\n      end: 1\n      range: [1, 1]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 1\n    ,\n      start: 18\n      end: 18\n      range: [18, 18]\n      loc:\n        start:\n          line: 1\n          column: 18\n        end:\n          line: 1\n          column: 18\n    ]\n    start: 0\n    end: 19\n    range: [0, 19]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 19\n\ntest \"AST location data as expected for dynamic import\", ->\n  testAstLocationData '''\n    import('a')\n  ''',\n    type: 'CallExpression'\n    callee:\n      start: 0\n      end: 6\n      range: [0, 6]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 6\n    arguments: [\n      start: 7\n      end: 10\n      range: [7, 10]\n      loc:\n        start:\n          line: 1\n          column: 7\n        end:\n          line: 1\n          column: 10\n    ]\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\ntest \"AST location data as expected for RegexWithInterpolations node\", ->\n  testAstLocationData '///^#{flavor}script$///',\n    type: 'InterpolatedRegExpLiteral'\n    interpolatedPattern:\n      expressions: [\n        start: 6\n        end: 12\n        range: [6, 12]\n        loc:\n          start:\n            line: 1\n            column: 6\n          end:\n            line: 1\n            column: 12\n      ]\n      quasis: [\n        start: 3\n        end: 4\n        range: [3, 4]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 1\n            column: 4\n      ,\n        start: 13\n        end: 20\n        range: [13, 20]\n        loc:\n          start:\n            line: 1\n            column: 13\n          end:\n            line: 1\n            column: 20\n      ]\n      start: 0\n      end: 23\n      range: [0, 23]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 23\n    start: 0\n    end: 23\n    range: [0, 23]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 23\n\n  testAstLocationData '''\n    ///\n      a\n      #{b}///ig\n  ''',\n    type: 'InterpolatedRegExpLiteral'\n    interpolatedPattern:\n      expressions: [\n        start: 12\n        end: 13\n        range: [12, 13]\n        loc:\n          start:\n            line: 3\n            column: 4\n          end:\n            line: 3\n            column: 5\n      ]\n      quasis: [\n        start: 3\n        end: 10\n        range: [3, 10]\n        loc:\n          start:\n            line: 1\n            column: 3\n          end:\n            line: 3\n            column: 2\n      ,\n        start: 14\n        end: 14\n        range: [14, 14]\n        loc:\n          start:\n            line: 3\n            column: 6\n          end:\n            line: 3\n            column: 6\n      ]\n      start: 0\n      end: 17\n      range: [0, 17]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 3\n          column: 9\n    start: 0\n    end: 19\n    range: [0, 19]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 11\n\n  testAstLocationData '''\n    ///\n      a # first\n      #{b} ### second ###\n    ///ig\n  ''',\n    type: 'InterpolatedRegExpLiteral'\n    comments: [\n      start: 8\n      end: 15\n      range: [8, 15]\n      loc:\n        start:\n          line: 2\n          column: 4\n        end:\n          line: 2\n          column: 11\n    ,\n      start: 23\n      end: 37\n      range: [23, 37]\n      loc:\n        start:\n          line: 3\n          column: 7\n        end:\n          line: 3\n          column: 21\n    ]\n\ntest \"AST location data as expected for RegexLiteral node\", ->\n  testAstLocationData '/a/ig',\n    type: 'RegExpLiteral'\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData '''\n    ///\n      a\n    ///i\n  ''',\n    type: 'RegExpLiteral'\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 4\n\n  testAstLocationData '/a\\\\w\\\\u1111\\\\u{11111}/',\n    type: 'RegExpLiteral'\n    start: 0\n    end: 20\n    range: [0, 20]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 20\n\n  testAstLocationData '''\n    ///\n      a\n      \\\\w\\\\u1111\\\\u{11111}\n    ///\n  ''',\n    type: 'RegExpLiteral'\n    start: 0\n    end: 31\n    range: [0, 31]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n\n  testAstLocationData '''\n    ///\n      /\n      (.+)\n      /\n    ///\n  ''',\n    type: 'RegExpLiteral'\n    start: 0\n    end: 22\n    range: [0, 22]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 5\n        column: 3\n\n  testAstLocationData '''\n    ///\n      a # first\n      b ### second ###\n    ///\n  ''',\n    type: 'RegExpLiteral'\n    comments: [\n      start: 8\n      end: 15\n      range: [8, 15]\n      loc:\n        start:\n          line: 2\n          column: 4\n        end:\n          line: 2\n          column: 11\n    ,\n      start: 20\n      end: 34\n      range: [20, 34]\n      loc:\n        start:\n          line: 3\n          column: 4\n        end:\n          line: 3\n          column: 18\n    ]\n    start: 0\n    end: 38\n    range: [0, 38]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n\ntest \"AST location data as expected for TaggedTemplateCall node\", ->\n  testAstLocationData 'func\"tagged\"',\n    type: 'TaggedTemplateExpression'\n    tag:\n      start: 0\n      end: 4\n      range: [0, 4]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 4\n    quasi:\n      quasis: [\n        start: 5\n        end: 11\n        range: [5, 11]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 11\n      ]\n      start: 4\n      end: 12\n      range: [4, 12]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 12\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 12\n\n  testAstLocationData 'a\"b#{c}\"',\n    type: 'TaggedTemplateExpression'\n    tag:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    quasi:\n      expressions: [\n        start: 5\n        end: 6\n        range: [5, 6]\n        loc:\n          start:\n            line: 1\n            column: 5\n          end:\n            line: 1\n            column: 6\n      ]\n      quasis: [\n        start: 2\n        end: 3\n        range: [2, 3]\n        loc:\n          start:\n            line: 1\n            column: 2\n          end:\n            line: 1\n            column: 3\n      ,\n        start: 7\n        end: 7\n        range: [7, 7]\n        loc:\n          start:\n            line: 1\n            column: 7\n          end:\n            line: 1\n            column: 7\n      ]\n      start: 1\n      end: 8\n      range: [1, 8]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 8\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\n  testAstLocationData '''\n    a\"\"\"\n      b#{c}\n    \"\"\"\n  ''',\n    type: 'TaggedTemplateExpression'\n    tag:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    quasi:\n      expressions: [\n        start: 10\n        end: 11\n        range: [10, 11]\n        loc:\n          start:\n            line: 2\n            column: 5\n          end:\n            line: 2\n            column: 6\n      ]\n      quasis: [\n        start: 4\n        end: 8\n        range: [4, 8]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 2\n            column: 3\n      ,\n        start: 12\n        end: 13\n        range: [12, 13]\n        loc:\n          start:\n            line: 2\n            column: 7\n          end:\n            line: 3\n            column: 0\n      ]\n      start: 1\n      end: 16\n      range: [1, 16]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 3\n          column: 3\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  testAstLocationData \"\"\"\n    a'''\n      b\n    '''\n  \"\"\",\n    type: 'TaggedTemplateExpression'\n    tag:\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    quasi:\n      quasis: [\n        start: 4\n        end: 9\n        range: [4, 9]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 3\n            column: 0\n      ]\n      start: 1\n      end: 12\n      range: [1, 12]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 3\n          column: 3\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\ntest \"AST location data as expected for Class node\", ->\n  testAstLocationData 'class Klass',\n    type: 'ClassDeclaration'\n    id:\n      start: 6\n      end: 11\n      range: [6, 11]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 11\n    body:\n      start: 11\n      end: 11\n      range: [11, 11]\n      loc:\n        start:\n          line: 1\n          column: 11\n        end:\n          line: 1\n          column: 11\n    start: 0\n    end: 11\n    range: [0, 11]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 11\n\n  testAstLocationData 'class child extends parent',\n    type: 'ClassDeclaration'\n    id:\n      start: 6\n      end: 11\n      range: [6, 11]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 11\n    superClass:\n      start: 20\n      end: 26\n      range: [20, 26]\n      loc:\n        start:\n          line: 1\n          column: 20\n        end:\n          line: 1\n          column: 26\n    body:\n      start: 26\n      end: 26\n      range: [26, 26]\n      loc:\n        start:\n          line: 1\n          column: 26\n        end:\n          line: 1\n          column: 26\n    start: 0\n    end: 26\n    range: [0, 26]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 26\n\n  testAstLocationData 'class Klass then constructor: ->',\n    type: 'ClassDeclaration'\n    id:\n      start: 6\n      end: 11\n      range: [6, 11]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 11\n    body:\n      body: [\n        key:\n          start: 17\n          end: 28\n          range: [17, 28]\n          loc:\n            start:\n              line: 1\n              column: 17\n            end:\n              line: 1\n              column: 28\n        start: 17\n        end: 32\n        range: [17, 32]\n        loc:\n          start:\n            line: 1\n            column: 17\n          end:\n            line: 1\n            column: 32\n      ]\n      start: 12\n      end: 32\n      range: [12, 32]\n      loc:\n        start:\n          line: 1\n          column: 12\n        end:\n          line: 1\n          column: 32\n    start: 0\n    end: 32\n    range: [0, 32]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 32\n\n  testAstLocationData '''\n    a = class A\n      b: ->\n        c\n  ''',\n    type: 'AssignmentExpression'\n    right:\n      id:\n        start: 10\n        end: 11\n        range: [10, 11]\n        loc:\n          start:\n            line: 1\n            column: 10\n          end:\n            line: 1\n            column: 11\n      body:\n        body: [\n          key:\n            start: 14\n            end: 15\n            range: [14, 15]\n            loc:\n              start:\n                line: 2\n                column: 2\n              end:\n                line: 2\n                column: 3\n          body:\n            body: [\n              start: 24\n              end: 25\n              range: [24, 25]\n              loc:\n                start:\n                  line: 3\n                  column: 4\n                end:\n                  line: 3\n                  column: 5\n            ]\n            start: 20\n            end: 25\n            range: [20, 25]\n            loc:\n              start:\n                line: 3\n                column: 0\n              end:\n                line: 3\n                column: 5\n          start: 14\n          end: 25\n          range: [14, 25]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 3\n              column: 5\n        ]\n        start: 12\n        end: 25\n        range: [12, 25]\n        loc:\n          start:\n            line: 2\n            column: 0\n          end:\n            line: 3\n            column: 5\n      start: 4\n      end: 25\n      range: [4, 25]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 3\n          column: 5\n    start: 0\n    end: 25\n    range: [0, 25]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 5\n\n  testAstLocationData '''\n    class A\n      @b: ->\n      @c = ->\n      @d: 1\n      @e = 2\n      A.f = 3\n      A.g = ->\n      this.h = ->\n      this.i = 4\n  ''',\n    type: 'ClassDeclaration'\n    id:\n      start: 6\n      end: 7\n      range: [6, 7]\n      loc:\n        start:\n          line: 1\n          column: 6\n        end:\n          line: 1\n          column: 7\n    body:\n      body: [\n        key:\n          start: 11\n          end: 12\n          range: [11, 12]\n          loc:\n            start:\n              line: 2\n              column: 3\n            end:\n              line: 2\n              column: 4\n        staticClassName:\n          start: 10\n          end: 11\n          range: [10, 11]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 3\n        start: 10\n        end: 16\n        range: [10, 16]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 8\n      ,\n        key:\n          start: 20\n          end: 21\n          range: [20, 21]\n          loc:\n            start:\n              line: 3\n              column: 3\n            end:\n              line: 3\n              column: 4\n        staticClassName:\n          start: 19\n          end: 20\n          range: [19, 20]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 3\n        start: 19\n        end: 26\n        range: [19, 26]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 9\n      ,\n        key:\n          start: 30\n          end: 31\n          range: [30, 31]\n          loc:\n            start:\n              line: 4\n              column: 3\n            end:\n              line: 4\n              column: 4\n        staticClassName:\n          start: 29\n          end: 30\n          range: [29, 30]\n          loc:\n            start:\n              line: 4\n              column: 2\n            end:\n              line: 4\n              column: 3\n        value:\n          start: 33\n          end: 34\n          range: [33, 34]\n          loc:\n            start:\n              line: 4\n              column: 6\n            end:\n              line: 4\n              column: 7\n        start: 29\n        end: 34\n        range: [29, 34]\n        loc:\n          start:\n            line: 4\n            column: 2\n          end:\n            line: 4\n            column: 7\n      ,\n        key:\n          start: 38\n          end: 39\n          range: [38, 39]\n          loc:\n            start:\n              line: 5\n              column: 3\n            end:\n              line: 5\n              column: 4\n        staticClassName:\n          start: 37\n          end: 38\n          range: [37, 38]\n          loc:\n            start:\n              line: 5\n              column: 2\n            end:\n              line: 5\n              column: 3\n        value:\n          start: 42\n          end: 43\n          range: [42, 43]\n          loc:\n            start:\n              line: 5\n              column: 7\n            end:\n              line: 5\n              column: 8\n        start: 37\n        end: 43\n        range: [37, 43]\n        loc:\n          start:\n            line: 5\n            column: 2\n          end:\n            line: 5\n            column: 8\n      ,\n        key:\n          start: 48\n          end: 49\n          range: [48, 49]\n          loc:\n            start:\n              line: 6\n              column: 4\n            end:\n              line: 6\n              column: 5\n        staticClassName:\n          start: 46\n          end: 47\n          range: [46, 47]\n          loc:\n            start:\n              line: 6\n              column: 2\n            end:\n              line: 6\n              column: 3\n        value:\n          start: 52\n          end: 53\n          range: [52, 53]\n          loc:\n            start:\n              line: 6\n              column: 8\n            end:\n              line: 6\n              column: 9\n        start: 46\n        end: 53\n        range: [46, 53]\n        loc:\n          start:\n            line: 6\n            column: 2\n          end:\n            line: 6\n            column: 9\n      ,\n        key:\n          start: 58\n          end: 59\n          range: [58, 59]\n          loc:\n            start:\n              line: 7\n              column: 4\n            end:\n              line: 7\n              column: 5\n        staticClassName:\n          start: 56\n          end: 57\n          range: [56, 57]\n          loc:\n            start:\n              line: 7\n              column: 2\n            end:\n              line: 7\n              column: 3\n        start: 56\n        end: 64\n        range: [56, 64]\n        loc:\n          start:\n            line: 7\n            column: 2\n          end:\n            line: 7\n            column: 10\n      ,\n        key:\n          start: 72\n          end: 73\n          range: [72, 73]\n          loc:\n            start:\n              line: 8\n              column: 7\n            end:\n              line: 8\n              column: 8\n        staticClassName:\n          start: 67\n          end: 71\n          range: [67, 71]\n          loc:\n            start:\n              line: 8\n              column: 2\n            end:\n              line: 8\n              column: 6\n        start: 67\n        end: 78\n        range: [67, 78]\n        loc:\n          start:\n            line: 8\n            column: 2\n          end:\n            line: 8\n            column: 13\n      ,\n        key:\n          start: 86\n          end: 87\n          range: [86, 87]\n          loc:\n            start:\n              line: 9\n              column: 7\n            end:\n              line: 9\n              column: 8\n        staticClassName:\n          start: 81\n          end: 85\n          range: [81, 85]\n          loc:\n            start:\n              line: 9\n              column: 2\n            end:\n              line: 9\n              column: 6\n        value:\n          start: 90\n          end: 91\n          range: [90, 91]\n          loc:\n            start:\n              line: 9\n              column: 11\n            end:\n              line: 9\n              column: 12\n        start: 81\n        end: 91\n        range: [81, 91]\n        loc:\n          start:\n            line: 9\n            column: 2\n          end:\n            line: 9\n            column: 12\n      ]\n      start: 8\n      end: 91\n      range: [8, 91]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 9\n          column: 12\n    start: 0\n    end: 91\n    range: [0, 91]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 9\n        column: 12\n\n  testAstLocationData '''\n    class A\n      b: 1\n      [c]: 2\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      body: [\n        key:\n          start: 10\n          end: 11\n          range: [10, 11]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 3\n        value:\n          start: 13\n          end: 14\n          range: [13, 14]\n          loc:\n            start:\n              line: 2\n              column: 5\n            end:\n              line: 2\n              column: 6\n        start: 10\n        end: 14\n        range: [10, 14]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 6\n      ,\n        key:\n          start: 18\n          end: 19\n          range: [18, 19]\n          loc:\n            start:\n              line: 3\n              column: 3\n            end:\n              line: 3\n              column: 4\n        value:\n          start: 22\n          end: 23\n          range: [22, 23]\n          loc:\n            start:\n              line: 3\n              column: 7\n            end:\n              line: 3\n              column: 8\n        start: 17\n        end: 23\n        range: [17, 23]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 8\n      ]\n      start: 8\n      end: 23\n      range: [8, 23]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 8\n    start: 0\n    end: 23\n    range: [0, 23]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 8\n\n  testAstLocationData '''\n    class A\n      @[b]: 1\n      @[c]: ->\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      body: [\n        key:\n          start: 12\n          end: 13\n          range: [12, 13]\n          loc:\n            start:\n              line: 2\n              column: 4\n            end:\n              line: 2\n              column: 5\n        staticClassName:\n          start: 10\n          end: 11\n          range: [10, 11]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 3\n        value:\n          start: 16\n          end: 17\n          range: [16, 17]\n          loc:\n            start:\n              line: 2\n              column: 8\n            end:\n              line: 2\n              column: 9\n        start: 10\n        end: 17\n        range: [10, 17]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 9\n      ,\n        key:\n          start: 22\n          end: 23\n          range: [22, 23]\n          loc:\n            start:\n              line: 3\n              column: 4\n            end:\n              line: 3\n              column: 5\n        staticClassName:\n          start: 20\n          end: 21\n          range: [20, 21]\n          loc:\n            start:\n              line: 3\n              column: 2\n            end:\n              line: 3\n              column: 3\n        start: 20\n        end: 28\n        range: [20, 28]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 10\n      ]\n      start: 8\n      end: 28\n      range: [8, 28]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 10\n    start: 0\n    end: 28\n    range: [0, 28]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 10\n\n  testAstLocationData '''\n    class A\n      b = 1\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      body: [\n        expression:\n          left:\n            start: 10\n            end: 11\n            range: [10, 11]\n            loc:\n              start:\n                line: 2\n                column: 2\n              end:\n                line: 2\n                column: 3\n          right:\n            start: 14\n            end: 15\n            range: [14, 15]\n            loc:\n              start:\n                line: 2\n                column: 6\n              end:\n                line: 2\n                column: 7\n          start: 10\n          end: 15\n          range: [10, 15]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 7\n        start: 10\n        end: 15\n        range: [10, 15]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 7\n      ]\n      start: 8\n      end: 15\n      range: [8, 15]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 7\n    start: 0\n    end: 15\n    range: [0, 15]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 7\n\ntest \"AST location data as expected for directives\", ->\n  testAstRootLocationData '''\n    'directive 1'\n    'use strict'\n    f()\n  ''',\n    type: 'File'\n    program:\n      body: [\n        start: 27\n        end: 30\n        range: [27, 30]\n        loc:\n          start:\n            line: 3\n            column: 0\n          end:\n            line: 3\n            column: 3\n      ]\n      directives: [\n        start: 0\n        end: 13\n        range: [0, 13]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 13\n      ,\n        start: 14\n        end: 26\n        range: [14, 26]\n        loc:\n          start:\n            line: 2\n            column: 0\n          end:\n            line: 2\n            column: 12\n      ]\n      start: 0\n      end: 30\n      range: [0, 30]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 3\n          column: 3\n    start: 0\n    end: 30\n    range: [0, 30]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  testAstRootLocationData '''\n    'use strict'\n  ''',\n    type: 'File'\n    program:\n      directives: [\n        start: 0\n        end: 12\n        range: [0, 12]\n        loc:\n          start:\n            line: 1\n            column: 0\n          end:\n            line: 1\n            column: 12\n      ]\n      start: 0\n      end: 12\n      range: [0, 12]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 12\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 12\n\n  testAstLocationData '''\n    ->\n      'use strict'\n      f()\n      'not a directive'\n      g\n  ''',\n    type: 'FunctionExpression'\n    body:\n      directives: [\n        value:\n          start: 5\n          end: 17\n          range: [5, 17]\n          loc:\n            start:\n              line: 2\n              column: 2\n            end:\n              line: 2\n              column: 14\n        start: 5\n        end: 17\n        range: [5, 17]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 14\n      ]\n      start: 3\n      end: 47\n      range: [3, 47]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 5\n          column: 3\n    start: 0\n    end: 47\n    range: [0, 47]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 5\n        column: 3\n\n  testAstLocationData '''\n    class A\n      'classes can have directives too'\n      a: ->\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      directives: [\n        start: 10\n        end: 43\n        range: [10, 43]\n        loc:\n          start:\n            line: 2\n            column: 2\n          end:\n            line: 2\n            column: 35\n      ]\n      start: 8\n      end: 51\n      range: [8, 51]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 7\n    start: 0\n    end: 51\n    range: [0, 51]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 7\n\ntest \"AST location data as expected for PassthroughLiteral node\", ->\n  testAstLocationData \"`abc`\",\n    type: 'PassthroughLiteral'\n    start: 0\n    end: 5\n    range: [0, 5]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 5\n\n  code = '\\nconst CONSTANT = \"unreassignable!\"\\n'\n  testAstLocationData \"\"\"\n    ```\n      abc\n    ```\n  \"\"\",\n    type: 'PassthroughLiteral'\n    start: 0\n    end: 13\n    range: [0, 13]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  testAstLocationData \"``\",\n    type: 'PassthroughLiteral'\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 2\n\ntest \"AST location data as expected for comments\", ->\n  testAstCommentsLocationData '''\n    a # simple line comment\n  ''', [\n    start: 2\n    end: 23\n    range: [2, 23]\n    loc:\n      start:\n        line: 1\n        column: 2\n      end:\n        line: 1\n        column: 23\n  ]\n\n  testAstCommentsLocationData '''\n    a ### simple here comment ###\n  ''', [\n    start: 2\n    end: 29\n    range: [2, 29]\n    loc:\n      start:\n        line: 1\n        column: 2\n      end:\n        line: 1\n        column: 29\n  ]\n\n  testAstCommentsLocationData '''\n    # just a line comment\n  ''', [\n    start: 0\n    end: 21\n    range: [0, 21]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 21\n  ]\n\n  testAstCommentsLocationData '''\n    ### just a here comment ###\n  ''', [\n    start: 0\n    end: 27\n    range: [0, 27]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 27\n  ]\n\n  testAstCommentsLocationData '''\n    \"#{\n      # empty interpolation line comment\n     }\"\n  ''', [\n    start: 6\n    end: 40\n    range: [6, 40]\n    loc:\n      start:\n        line: 2\n        column: 2\n      end:\n        line: 2\n        column: 36\n  ]\n\n  testAstCommentsLocationData '''\n    \"#{\n      ### empty interpolation block comment ###\n     }\"\n  ''', [\n    start: 6\n    end: 47\n    range: [6, 47]\n    loc:\n      start:\n        line: 2\n        column: 2\n      end:\n        line: 2\n        column: 43\n  ]\n\n  testAstCommentsLocationData '''\n    # multiple line comments\n    # on consecutive lines\n  ''', [\n    start: 0\n    end: 24\n    range: [0, 24]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 24\n  ,\n    start: 25\n    end: 47\n    range: [25, 47]\n    loc:\n      start:\n        line: 2\n        column: 0\n      end:\n        line: 2\n        column: 22\n  ]\n\n  testAstCommentsLocationData '''\n    # multiple line comments\n\n    # with blank line\n  ''', [\n    start: 0\n    end: 24\n    range: [0, 24]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 24\n  ,\n    start: 26\n    end: 43\n    range: [26, 43]\n    loc:\n      start:\n        line: 3\n        column: 0\n      end:\n        line: 3\n        column: 17\n  ]\n\n  testAstCommentsLocationData '''\n    #no whitespace line comment\n  ''', [\n    start: 0\n    end: 27\n    range: [0, 27]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 27\n  ]\n\n  testAstCommentsLocationData '''\n    ###no whitespace here comment###\n  ''', [\n    start: 0\n    end: 32\n    range: [0, 32]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 32\n  ]\n\n  testAstCommentsLocationData '''\n    ###\n    # multiline\n    # here comment\n    ###\n  ''', [\n    start: 0\n    end: 34\n    range: [0, 34]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n  ]\n\n  testAstCommentsLocationData '''\n    if b\n      ###\n      # multiline\n      # indented here comment\n      ###\n      c\n  ''', [\n    start: 7\n    end: 56\n    range: [7, 56]\n    loc:\n      start:\n        line: 2\n        column: 2\n      end:\n        line: 5\n        column: 5\n  ]\n\ntest \"AST location data as expected for chained comparisons\", ->\n  testAstLocationData '''\n    a >= b < c\n  ''',\n    type: 'ChainedComparison'\n    operands: [\n      start: 0\n      end: 1\n      range: [0, 1]\n      loc:\n        start:\n          line: 1\n          column: 0\n        end:\n          line: 1\n          column: 1\n    ,\n      start: 5\n      end: 6\n      range: [5, 6]\n      loc:\n        start:\n          line: 1\n          column: 5\n        end:\n          line: 1\n          column: 6\n    ,\n      start: 9\n      end: 10\n      range: [9, 10]\n      loc:\n        start:\n          line: 1\n          column: 9\n        end:\n          line: 1\n          column: 10\n    ]\n    start: 0\n    end: 10\n    range: [0, 10]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 10\n\ntest \"AST location data as expected for Sequence\", ->\n  testAstLocationData '''\n    (a; b)\n  ''',\n    type: 'SequenceExpression'\n    expressions: [\n      start: 1\n      end: 2\n      range: [1, 2]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 2\n    ,\n      start: 4\n      end: 5\n      range: [4, 5]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 1\n          column: 5\n    ]\n    start: 1\n    end: 5\n    range: [1, 5]\n    loc:\n      start:\n        line: 1\n        column: 1\n      end:\n        line: 1\n        column: 5\n\n  testAstLocationData '''\n    (a; b)\"\"\n  ''',\n    type: 'TaggedTemplateExpression'\n    tag:\n      expressions: [\n        start: 1\n        end: 2\n        range: [1, 2]\n        loc:\n          start:\n            line: 1\n            column: 1\n          end:\n            line: 1\n            column: 2\n      ,\n        start: 4\n        end: 5\n        range: [4, 5]\n        loc:\n          start:\n            line: 1\n            column: 4\n          end:\n            line: 1\n            column: 5\n      ]\n      start: 1\n      end: 5\n      range: [1, 5]\n      loc:\n        start:\n          line: 1\n          column: 1\n        end:\n          line: 1\n          column: 5\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 8\n\ntest \"AST location data as expected for blocks with comments\", ->\n  # trailing indented comment\n  testAstLocationData '''\n    ->\n      a\n      # b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 3\n      end: 12\n      range: [3, 12]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 5\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 5\n\n  testAstLocationData '''\n    if a\n      b\n      ### c ###\n  ''',\n    type: 'IfStatement'\n    consequent:\n      start: 5\n      end: 20\n      range: [5, 20]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 11\n    start: 0\n    end: 20\n    range: [0, 20]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 11\n\n  # trailing non-indented comment\n  testAstLocationData '''\n    ->\n      a\n    # b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 3\n      end: 6\n      range: [3, 6]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 3\n    start: 0\n    end: 6\n    range: [0, 6]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 3\n\n  testAstLocationData '''\n    if a\n      b\n    ### c ###\n  ''',\n    type: 'IfStatement'\n    consequent:\n      start: 5\n      end: 8\n      range: [5, 8]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 3\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 3\n\n  # multiple trailing indented comments\n  testAstLocationData '''\n    class A\n      a: ->\n      # b\n      #comment\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      start: 8\n      end: 32\n      range: [8, 32]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 4\n          column: 10\n    start: 0\n    end: 32\n    range: [0, 32]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 10\n\n  testAstLocationData '''\n    a = ->\n      c\n      # b\n      ### comment ###\n  ''',\n    type: 'AssignmentExpression'\n    right:\n      start: 4\n      end: 34\n      range: [4, 34]\n      loc:\n        start:\n          line: 1\n          column: 4\n        end:\n          line: 4\n          column: 17\n    start: 0\n    end: 34\n    range: [0, 34]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 17\n\n  # multiple trailing comments, some indented\n  testAstLocationData '''\n    class A\n      a: ->\n      # b\n    #comment\n  ''',\n    type: 'ClassDeclaration'\n    body:\n      start: 8\n      end: 21\n      range: [8, 21]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 5\n    start: 0\n    end: 21\n    range: [0, 21]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 5\n\n  # leading indented comment\n  testAstLocationData '''\n    ->\n      # a\n      b\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 3\n      end: 12\n      range: [3, 12]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 3\n    start: 0\n    end: 12\n    range: [0, 12]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  testAstLocationData '''\n    if a\n      ### b ###\n      c\n  ''',\n    type: 'IfStatement'\n    consequent:\n      start: 5\n      end: 20\n      range: [5, 20]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 3\n    start: 0\n    end: 20\n    range: [0, 20]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  # multiple leading indented comments\n  testAstLocationData '''\n    ->\n      # a\n      # b\n      c\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 3\n      end: 18\n      range: [3, 18]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 4\n          column: 3\n    start: 0\n    end: 18\n    range: [0, 18]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n\n  testAstLocationData '''\n    if a\n      ### b ###\n      # c\n      d\n  ''',\n    type: 'IfStatement'\n    consequent:\n      start: 5\n      end: 26\n      range: [5, 26]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 4\n          column: 3\n    start: 0\n    end: 26\n    range: [0, 26]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n\n  # just a comment\n  testAstLocationData '''\n    ->\n      # a\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 3\n      end: 8\n      range: [3, 8]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 5\n    start: 0\n    end: 8\n    range: [0, 8]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 2\n        column: 5\n\n  testAstLocationData '''\n    if a\n      ### b ###\n    else\n      c\n  ''',\n    type: 'IfStatement'\n    consequent:\n      start: 5\n      end: 16\n      range: [5, 16]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 2\n          column: 11\n    start: 0\n    end: 25\n    range: [0, 25]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 3\n\n  # just a non-indented comment\n  testAstLocationData '''\n    ->\n    # a\n  ''',\n    type: 'FunctionExpression'\n    body:\n      start: 2\n      end: 2\n      range: [2, 2]\n      loc:\n        start:\n          line: 1\n          column: 2\n        end:\n          line: 1\n          column: 2\n    start: 0\n    end: 2\n    range: [0, 2]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 1\n        column: 2\n\n  # nested dedented comment\n  testAstLocationData '''\n    switch a\n      when b\n        c\n      # d\n  ''',\n    type: 'SwitchStatement'\n    cases: [\n      start: 11\n      end: 23\n      range: [11, 23]\n      loc:\n        start:\n          line: 2\n          column: 2\n        end:\n          line: 3\n          column: 5\n    ]\n    start: 0\n    end: 29\n    range: [0, 29]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 5\n\n  # trailing implicit call in condition followed by indented comment\n  testAstLocationData '''\n    if a b\n      # c\n      d\n  ''',\n    type: 'IfStatement'\n    test:\n      start: 3\n      end: 6\n      range: [3, 6]\n      loc:\n        start:\n          line: 1\n          column: 3\n        end:\n          line: 1\n          column: 6\n    consequent:\n      start: 7\n      end: 16\n      range: [7, 16]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 3\n          column: 3\n    start: 0\n    end: 16\n    range: [0, 16]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\ntest \"AST location data as expected for heregex comments\", ->\n  code = '''\n    ///\n      a # b\n    ///\n  '''\n\n  testAstLocationData code,\n    type: 'RegExpLiteral'\n    start: 0\n    end: 15\n    range: [0, 15]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 3\n        column: 3\n\n  eq getAstRoot(code).comments.length, 0\n\ntest \"AST location data as expected with carriage returns\", ->\n  code = '''\n    a =\\r\n    \"#{\\r\n      b\\r\n    }\"\n  '''\n\n  testAstLocationData code,\n    type: 'AssignmentExpression'\n    right:\n      expressions: [\n        start: 12\n        end: 13\n        range: [12, 13]\n        loc:\n          start:\n            line: 3\n            column: 2\n          end:\n            line: 3\n            column: 3\n      ]\n      quasis: [\n        start: 6\n        end: 6\n        range: [6, 6]\n        loc:\n          start:\n            line: 2\n            column: 1\n          end:\n            line: 2\n            column: 1\n      ,\n        start: 16\n        end: 16\n        range: [16, 16]\n        loc:\n          start:\n            line: 4\n            column: 1\n          end:\n            line: 4\n            column: 1\n      ]\n      start: 5\n      end: 17\n      range: [5, 17]\n      loc:\n        start:\n          line: 2\n          column: 0\n        end:\n          line: 4\n          column: 2\n    start: 0\n    end: 17\n    range: [0, 17]\n    loc:\n      start:\n        line: 1\n        column: 0\n      end:\n        line: 4\n        column: 2\n"
  },
  {
    "path": "test/argument_parsing.coffee",
    "content": "return unless require?\n{buildCSOptionParser} = require '../lib/coffeescript/command'\n\noptionParser = buildCSOptionParser()\n\nsameOptions = (opts1, opts2, msg) ->\n  ownKeys = Object.keys(opts1).sort()\n  otherKeys = Object.keys(opts2).sort()\n  arrayEq ownKeys, otherKeys, msg\n  for k in ownKeys\n    arrayEq opts1[k], opts2[k], msg\n  yes\n\ntest \"combined options are not split after initial file name\", ->\n  argv = ['some-file.coffee', '-bc']\n  parsed = optionParser.parse argv\n  expected = arguments: ['some-file.coffee', '-bc']\n  sameOptions parsed, expected\n\n  argv = ['some-file.litcoffee', '-bc']\n  parsed = optionParser.parse argv\n  expected = arguments: ['some-file.litcoffee', '-bc']\n  sameOptions parsed, expected\n\n  argv = ['-c', 'some-file.coffee', '-bc']\n  parsed = optionParser.parse argv\n  expected =\n    compile: yes\n    arguments: ['some-file.coffee', '-bc']\n  sameOptions parsed, expected\n\n  argv = ['-bc', 'some-file.coffee', '-bc']\n  parsed = optionParser.parse argv\n  expected =\n    bare: yes\n    compile: yes\n    arguments: ['some-file.coffee', '-bc']\n  sameOptions parsed, expected\n\ntest \"combined options are not split after a '--', which is discarded\", ->\n  argv = ['--', '-bc']\n  parsed = optionParser.parse argv\n  expected =\n    doubleDashed: yes\n    arguments: ['-bc']\n  sameOptions parsed, expected\n\n  argv = ['-bc', '--', '-bc']\n  parsed = optionParser.parse argv\n  expected =\n    bare: yes\n    compile: yes\n    doubleDashed: yes\n    arguments: ['-bc']\n  sameOptions parsed, expected\n\ntest \"options are not split after any '--'\", ->\n  argv = ['--', '--', '-bc']\n  parsed = optionParser.parse argv\n  expected =\n    doubleDashed: yes\n    arguments: ['--', '-bc']\n  sameOptions parsed, expected\n\n  argv = ['--', 'some-file.coffee', '--', 'arg']\n  parsed = optionParser.parse argv\n  expected =\n    doubleDashed: yes\n    arguments: ['some-file.coffee', '--', 'arg']\n  sameOptions parsed, expected\n\n  argv = ['--', 'arg', 'some-file.coffee', '--', '-bc']\n  parsed = optionParser.parse argv\n  expected =\n    doubleDashed: yes\n    arguments: ['arg', 'some-file.coffee', '--', '-bc']\n  sameOptions parsed, expected\n\ntest \"any non-option argument stops argument parsing\", ->\n  argv = ['arg', '-bc']\n  parsed = optionParser.parse argv\n  expected = arguments: ['arg', '-bc']\n  sameOptions parsed, expected\n\ntest \"later '--' are not removed\", ->\n  argv = ['some-file.coffee', '--', '-bc']\n  parsed = optionParser.parse argv\n  expected = arguments: ['some-file.coffee', '--', '-bc']\n  sameOptions parsed, expected\n\ntest \"throw on invalid options\", ->\n  argv = ['-k']\n  throws -> optionParser.parse argv\n\n  argv = ['-ck']\n  throws (-> optionParser.parse argv), /multi-flag/\n\n  argv = ['-kc']\n  throws (-> optionParser.parse argv), /multi-flag/\n\n  argv = ['-oc']\n  throws (-> optionParser.parse argv), /needs an argument/\n\n  argv = ['-o']\n  throws (-> optionParser.parse argv), /value required/\n\n  argv = ['-co']\n  throws (-> optionParser.parse argv), /value required/\n\n  # Check if all flags in a multi-flag are recognized before checking if flags\n  # before the last need arguments.\n  argv = ['-ok']\n  throws (-> optionParser.parse argv), /unrecognized option/\n\ntest \"has expected help text\", ->\n  ok optionParser.help() is '''\n\nUsage: coffee [options] path/to/script.coffee [args]\n\nIf called without options, `coffee` will run your script.\n\n      --ast          generate an abstract syntax tree of nodes\n  -b, --bare         compile without a top-level function wrapper\n  -c, --compile      compile to JavaScript and save as .js files\n  -e, --eval         pass a string from the command line as input\n  -h, --help         display this help message\n  -i, --interactive  run an interactive CoffeeScript REPL\n  -j, --join         concatenate the source CoffeeScript before compiling\n  -l, --literate     treat stdio as literate style coffeescript\n  -m, --map          generate source map and save as .js.map files\n  -M, --inline-map   generate source map and include it directly in output\n  -n, --nodes        print out the parse tree that the parser produces\n      --nodejs       pass options directly to the \"node\" binary\n      --no-header    suppress the \"Generated by\" header\n  -o, --output       set the output path or path/filename for compiled JavaScript\n  -p, --print        print out the compiled JavaScript\n  -r, --require      require the given module before eval or REPL\n  -s, --stdio        listen for and compile scripts over stdio\n  -t, --transpile    pipe generated JavaScript through Babel\n      --tokens       print out the tokens that the lexer/rewriter produce\n  -v, --version      display the version number\n  -w, --watch        watch scripts for changes and rerun commands\n\n  '''\n"
  },
  {
    "path": "test/arrays.coffee",
    "content": "# Array Literals\n# --------------\n\n# * Array Literals\n# * Splats in Array Literals\n\n# TODO: add indexing and method invocation tests: [1][0] is 1, [].toString()\n\ntest \"trailing commas\", ->\n  trailingComma = [1, 2, 3,]\n  ok (trailingComma[0] is 1) and (trailingComma[2] is 3) and (trailingComma.length is 3)\n\n  trailingComma = [\n    1, 2, 3,\n    4, 5, 6\n    7, 8, 9,\n  ]\n  (sum = (sum or 0) + n) for n in trailingComma\n\n  a = [((x) -> x), ((x) -> x * x)]\n  ok a.length is 2\n\ntest \"incorrect indentation without commas\", ->\n  result = [['a']\n   {b: 'c'}]\n  ok result[0][0] is 'a'\n  ok result[1]['b'] is 'c'\n\n# Elisions\ntest \"array elisions\", ->\n  eq [,1].length, 2\n  eq [,,1,2,,].length, 5\n  arr = [1,,2]\n  eq arr.length, 3\n  eq arr[1], undefined\n  eq [,,].length, 2\n\ntest \"array elisions indentation and commas\", ->\n  arr1 = [\n    , 1, 2, , , 3,\n    4, 5, 6\n    , , 8, 9,\n  ]\n  eq arr1.length, 12\n  eq arr1[5], 3\n  eq arr1[9], undefined\n  arr2 = [, , 1,\n    2, , 3,\n    , 4, 5\n    6\n    , , ,\n  ]\n  eq arr2.length, 12\n  eq arr2[8], 5\n  eq arr2[1], undefined\n\ntest \"array elisions destructuring\", ->\n  arr = [1,2,3,4,5,6,7,8,9]\n  [,a] = arr\n  [,,,b] = arr\n  arrayEq [a,b], [2,4]\n  [,a,,b,,c,,,d] = arr\n  arrayEq [a,b,c,d], [2,4,6,9]\n  [\n    ,e,\n    ,f,\n    ,g,\n    ,,h] = arr\n  arrayEq [e,f,g,h], [2,4,6,9]\n\ntest \"array elisions destructuring with splats and expansions\", ->\n  arr = [1,2,3,4,5,6,7,8,9]\n  [,a,,,b...] = arr\n  arrayEq [a,b], [2,[5,6,7,8,9]]\n  [,c,...,,d,,e] = arr\n  arrayEq [c,d,e], [2,7,9]\n  [...,f,,,g,,,] = arr\n  arrayEq [f,g], [4,7]\n\ntest \"array elisions as function parameters\", ->\n  arr = [1,2,3,4,5,6,7,8,9]\n  foo = ([,a]) -> a\n  a = foo arr\n  eq a, 2\n  foo = ([,,,a]) -> a\n  a = foo arr\n  eq a, 4\n  foo = ([,a,,b,,c,,,d]) -> [a,b,c,d]\n  [a,b,c,d] = foo arr\n  arrayEq [a,b,c,d], [2,4,6,9]\n\ntest \"array elisions nested destructuring\", ->\n  arr = [\n    1,\n    [2,3, [4,5,6, [7,8,9] ] ]\n  ]\n  [,a] = arr\n  arrayEq a[2][3], [7,8,9]\n  [,[,,[,b,,[,,c]]]] = arr\n  eq b, 5\n  eq c, 9\n  aobj = [\n    {},\n    {x: 2},\n    {},\n    [\n      {},\n      {},\n      {z:1, w:[1,2,4], p:3, q:4}\n      {},\n      {}\n    ]\n  ]\n  [,d,,[,,{w}]] = aobj\n  deepEqual d, {x:2}\n  arrayEq w, [1,2,4]\n\ntest \"#5112: array elisions not detected inside strings\", ->\n  arr = [\n    str: \", #{3}\"\n  ]\n  eq arr[0].str, ', 3'\n\n# Splats in Array Literals\n\ntest \"array splat expansions with assignments\", ->\n  nums = [1, 2, 3]\n  list = [a = 0, nums..., b = 4]\n  eq 0, a\n  eq 4, b\n  arrayEq [0,1,2,3,4], list\n\n\ntest \"mixed shorthand objects in array lists\", ->\n  arr = [\n    a:1\n    'b'\n    c:1\n  ]\n  ok arr.length is 3\n  ok arr[2].c is 1\n\n  arr = [b: 1, a: 2, 100]\n  eq arr[1], 100\n\n  arr = [a:0, b:1, (1 + 1)]\n  eq arr[1], 2\n\n  arr = [a:1, 'a', b:1, 'b']\n  eq arr.length, 4\n  eq arr[2].b, 1\n  eq arr[3], 'b'\n\ntest \"array splats with nested arrays\", ->\n  nonce = {}\n  a = [nonce]\n  list = [1, 2, a...]\n  eq list[0], 1\n  eq list[2], nonce\n\n  a = [[nonce]]\n  list = [1, 2, a...]\n  arrayEq list, [1, 2, [nonce]]\n\ntest \"#4260: splat after existential operator soak\", ->\n  a = {b: [3]}\n  foo = (a) -> [a]\n  arrayEq [a?.b...], [3]\n  arrayEq [c?.b ? []...], []\n  arrayEq [...a?.b], [3]\n  arrayEq [...c?.b ? []], []\n  arrayEq foo(a?.b...), [3]\n  arrayEq foo(...a?.b), [3]\n  arrayEq foo(c?.b ? []...), [undefined]\n  arrayEq foo(...c?.b ? []), [undefined]\n  e = yes\n  f = null\n  arrayEq [(a if e)?.b...], [3]\n  arrayEq [(a if f)?.b ? []...], []\n  arrayEq [...(a if e)?.b], [3]\n  arrayEq [...(a if f)?.b ? []], []\n  arrayEq foo((a if e)?.b...), [3]\n  arrayEq foo(...(a if e)?.b), [3]\n  arrayEq foo((a if f)?.b ? []...), [undefined]\n  arrayEq foo(...(a if f)?.b ? []), [undefined]\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  arrayEq [... a?.b], [3]\n  arrayEq [... c?.b ? []], []\n  arrayEq [a?.b ...], [3]\n  arrayEq [(a if e)?.b ...], [3]\n  arrayEq foo(a?.b ...), [3]\n  arrayEq foo(... a?.b), [3]\n\ntest \"#1349: trailing if after splat\", ->\n  a = [3]\n  b = yes\n  c = null\n  foo = (a) -> [a]\n  arrayEq [a if b...], [3]\n  arrayEq [(a if c) ? []...], []\n  arrayEq [...a if b], [3]\n  arrayEq [...(a if c) ? []], []\n  arrayEq foo((a if b)...), [3]\n  arrayEq foo(...(a if b)), [3]\n  arrayEq foo((a if c) ? []...), [undefined]\n  arrayEq foo(...(a if c) ? []), [undefined]\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  arrayEq [... a if b], [3]\n  arrayEq [a if b ...], [3]\n\ntest \"#1274: `[] = a()` compiles to `false` instead of `a()`\", ->\n  a = false\n  fn = -> a = true\n  [] = fn()\n  ok a\n\ntest \"#3194: string interpolation in array\", ->\n  arr = [ \"a\"\n          key: 'value'\n        ]\n  eq 2, arr.length\n  eq 'a', arr[0]\n  eq 'value', arr[1].key\n\n  b = 'b'\n  arr = [ \"a#{b}\"\n          key: 'value'\n        ]\n  eq 2, arr.length\n  eq 'ab', arr[0]\n  eq 'value', arr[1].key\n\ntest \"regex interpolation in array\", ->\n  arr = [ /a/\n          key: 'value'\n        ]\n  eq 2, arr.length\n  eq 'a', arr[0].source\n  eq 'value', arr[1].key\n\n  b = 'b'\n  arr = [ ///a#{b}///\n          key: 'value'\n        ]\n  eq 2, arr.length\n  eq 'ab', arr[0].source\n  eq 'value', arr[1].key\n\ntest \"splat extraction from generators\", ->\n  gen = ->\n    yield 1\n    yield 2\n    yield 3\n  arrayEq [ gen()... ], [ 1, 2, 3 ]\n\ntest \"for-from loops over Array\", ->\n  array1 = [50, 30, 70, 20]\n  array2 = []\n  for x from array1\n    array2.push(x)\n  arrayEq array1, array2\n\n  array1 = [[20, 30], [40, 50]]\n  array2 = []\n  for [a, b] from array1\n    array2.push(b)\n    array2.push(a)\n  arrayEq array2, [30, 20, 50, 40]\n\n  array1 = [{a: 10, b: 20, c: 30}, {a: 40, b: 50, c: 60}]\n  array2 = []\n  for {a: a, b, c: d} from array1\n    array2.push([a, b, d])\n  arrayEq array2, [[10, 20, 30], [40, 50, 60]]\n\n  array1 = [[10, 20, 30, 40, 50]]\n  for [a, b..., c] from array1\n    eq 10, a\n    arrayEq [20, 30, 40], b\n    eq 50, c\n\ntest \"for-from comprehensions over Array\", ->\n  array1 = (x + 10 for x from [10, 20, 30])\n  ok array1.join(' ') is '20 30 40'\n\n  array2 = (x for x from [30, 41, 57] when x %% 3 is 0)\n  ok array2.join(' ') is '30 57'\n\n  array1 = (b + 5 for [a, b] from [[20, 30], [40, 50]])\n  ok array1.join(' ') is '35 55'\n\n  array2 = (a + b for [a, b] from [[10, 20], [30, 40], [50, 60]] when a + b >= 70)\n  ok array2.join(' ') is '70 110'\n\ntest \"#5201: simple indented elisions\", ->\n  arr1 = [\n    ,\n    1,\n    2,\n    ,\n    ,\n    3,\n    4,\n    5,\n    6\n    ,\n    ,\n    8,\n    9,\n  ]\n  eq arr1.length, 12\n  eq arr1[5], 3\n  eq arr1[9], undefined\n\n  arr2 = [\n    ,\n    ,\n    1,\n    2,\n    ,\n    3,\n    ,\n    4,\n    5\n    6\n    ,\n    ,\n    ,\n  ]\n  eq arr2.length, 12\n  eq arr2[8], 5\n  eq arr2[1], undefined\n\n  arr3 = [\n    ,\n    ,\n    ,\n  ]\n  eq arr3.length, 3\n\n  arr4 = [, , ,]\n  eq arr4.length, 3\n"
  },
  {
    "path": "test/assignment.coffee",
    "content": "# Assignment\n# ----------\n\n# * Assignment\n# * Compound Assignment\n# * Destructuring Assignment\n# * Context Property (@) Assignment\n# * Existential Assignment (?=)\n# * Assignment to variables similar to generated variables\n\ntest \"context property assignment (using @)\", ->\n  nonce = {}\n  addMethod = ->\n    @method = -> nonce\n    this\n  eq nonce, addMethod.call({}).method()\n\ntest \"unassignable values\", ->\n  nonce = {}\n  for nonref in ['', '\"\"', '0', 'f()'].concat CoffeeScript.RESERVED\n    eq nonce, (try CoffeeScript.compile \"#{nonref} = v\" catch e then nonce)\n\n# Compound Assignment\n\ntest \"boolean operators\", ->\n  nonce = {}\n\n  a  = 0\n  a or= nonce\n  eq nonce, a\n\n  b  = 1\n  b or= nonce\n  eq 1, b\n\n  c = 0\n  c and= nonce\n  eq 0, c\n\n  d = 1\n  d and= nonce\n  eq nonce, d\n\n  # ensure that RHS is treated as a group\n  e = f = false\n  e and= f or true\n  eq false, e\n\ntest \"compound assignment as a sub expression\", ->\n  [a, b, c] = [1, 2, 3]\n  eq 6, (a + b += c)\n  eq 1, a\n  eq 5, b\n  eq 3, c\n\n# *note: this test could still use refactoring*\ntest \"compound assignment should be careful about caching variables\", ->\n  count = 0\n  list = []\n\n  list[++count] or= 1\n  eq 1, list[1]\n  eq 1, count\n\n  list[++count] ?= 2\n  eq 2, list[2]\n  eq 2, count\n\n  list[count++] and= 6\n  eq 6, list[2]\n  eq 3, count\n\n  base = ->\n    ++count\n    base\n\n  base().four or= 4\n  eq 4, base.four\n  eq 4, count\n\n  base().five ?= 5\n  eq 5, base.five\n  eq 5, count\n\n  eq 5, base().five ?= 6\n  eq 6, count\n\ntest \"compound assignment with implicit objects\", ->\n  obj = undefined\n  obj ?=\n    one: 1\n\n  eq 1, obj.one\n\n  obj and=\n    two: 2\n\n  eq undefined, obj.one\n  eq         2, obj.two\n\ntest \"compound assignment (math operators)\", ->\n  num = 10\n  num -= 5\n  eq 5, num\n\n  num *= 10\n  eq 50, num\n\n  num /= 10\n  eq 5, num\n\n  num %= 3\n  eq 2, num\n\ntest \"more compound assignment\", ->\n  a = {}\n  val = undefined\n  val ||= a\n  val ||= true\n  eq a, val\n\n  b = {}\n  val &&= true\n  eq val, true\n  val &&= b\n  eq b, val\n\n  c = {}\n  val = null\n  val ?= c\n  val ?= true\n  eq c, val\n\ntest \"#1192: assignment starting with object literals\", ->\n  doesNotThrow (-> CoffeeScript.run \"{}.p = 0\")\n  doesNotThrow (-> CoffeeScript.run \"{}.p++\")\n  doesNotThrow (-> CoffeeScript.run \"{}[0] = 1\")\n  doesNotThrow (-> CoffeeScript.run \"\"\"{a: 1, 'b', \"#{1}\": 2}.p = 0\"\"\")\n  doesNotThrow (-> CoffeeScript.run \"{a:{0:{}}}.a[0] = 0\")\n\n\n# Destructuring Assignment\n\ntest \"empty destructuring assignment\", ->\n  {} = {}\n  [] = []\n\ntest \"chained destructuring assignments\", ->\n  [a] = {0: b} = {'0': c} = [nonce={}]\n  eq nonce, a\n  eq nonce, b\n  eq nonce, c\n\ntest \"variable swapping to verify caching of RHS values when appropriate\", ->\n  a = nonceA = {}\n  b = nonceB = {}\n  c = nonceC = {}\n  [a, b, c] = [b, c, a]\n  eq nonceB, a\n  eq nonceC, b\n  eq nonceA, c\n  [a, b, c] = [b, c, a]\n  eq nonceC, a\n  eq nonceA, b\n  eq nonceB, c\n  fn = ->\n    [a, b, c] = [b, c, a]\n  arrayEq [nonceA,nonceB,nonceC], fn()\n  eq nonceA, a\n  eq nonceB, b\n  eq nonceC, c\n\ntest \"#713: destructuring assignment should return right-hand-side value\", ->\n  nonces = [nonceA={},nonceB={}]\n  eq nonces, [a, b] = [c, d] = nonces\n  eq nonceA, a\n  eq nonceA, c\n  eq nonceB, b\n  eq nonceB, d\n\ntest \"#4787 destructuring of objects within arrays\", ->\n  arr = [1, {a:1, b:2}]\n  [...,{a, b}] = arr\n  eq a, 1\n  eq b, arr[1].b\n  deepEqual {a, b}, arr[1]\n\ntest \"destructuring assignment with splats\", ->\n  a = {}; b = {}; c = {}; d = {}; e = {}\n  [x,y...,z] = [a,b,c,d,e]\n  eq a, x\n  arrayEq [b,c,d], y\n  eq e, z\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  [x,y ...,z] = [a,b,c,d,e]\n  eq a, x\n  arrayEq [b,c,d], y\n  eq e, z\n\ntest \"deep destructuring assignment with splats\", ->\n  a={}; b={}; c={}; d={}; e={}; f={}; g={}; h={}; i={}\n  [u, [v, w..., x], y..., z] = [a, [b, c, d, e], f, g, h, i]\n  eq a, u\n  eq b, v\n  arrayEq [c,d], w\n  eq e, x\n  arrayEq [f,g,h], y\n  eq i, z\n\ntest \"destructuring assignment with objects\", ->\n  a={}; b={}; c={}\n  obj = {a,b,c}\n  {a:x, b:y, c:z} = obj\n  eq a, x\n  eq b, y\n  eq c, z\n\ntest \"deep destructuring assignment with objects\", ->\n  a={}; b={}; c={}; d={}\n  obj = {\n    a\n    b: {\n      'c': {\n        d: [\n          b\n          {e: c, f: d}\n        ]\n      }\n    }\n  }\n  {a: w, 'b': {c: d: [x, {'f': z, e: y}]}} = obj\n  eq a, w\n  eq b, x\n  eq c, y\n  eq d, z\n\ntest \"destructuring assignment with objects and splats\", ->\n  a={}; b={}; c={}; d={}\n  obj = a: b: [a, b, c, d]\n  {a: b: [y, z...]} = obj\n  eq a, y\n  arrayEq [b,c,d], z\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  {a: b: [y, z ...]} = obj\n  eq a, y\n  arrayEq [b,c,d], z\n\ntest \"destructuring assignment against an expression\", ->\n  a={}; b={}\n  [y, z] = if true then [a, b] else [b, a]\n  eq a, y\n  eq b, z\n\ntest \"bracket insertion when necessary\", ->\n  [a] = [0] ? [1]\n  eq a, 0\n\n# for implicit destructuring assignment in comprehensions, see the comprehension tests\n\ntest \"destructuring assignment with context (@) properties\", ->\n  a={}; b={}; c={}; d={}; e={}\n  obj =\n    fn: () ->\n      local = [a, {b, c}, d, e]\n      [@a, {b: @b, c: @c}, @d, @e] = local\n  eq undefined, obj[key] for key in ['a','b','c','d','e']\n  obj.fn()\n  eq a, obj.a\n  eq b, obj.b\n  eq c, obj.c\n  eq d, obj.d\n  eq e, obj.e\n\ntest \"#1024: destructure empty assignments to produce javascript-like results\", ->\n  eq 2 * [] = 3 + 5, 16\n\ntest \"#1005: invalid identifiers allowed on LHS of destructuring assignment\", ->\n  disallowed = ['eval', 'arguments'].concat CoffeeScript.RESERVED\n  throwsCompileError \"[#{disallowed.join ', '}] = x\", null, null, 'all disallowed'\n  throwsCompileError \"[#{disallowed.join '..., '}...] = x\", null, null, 'all disallowed as splats'\n  t = tSplat = null\n  for v in disallowed when v isnt 'class' # `class` by itself is an expression\n    throwsCompileError t, null, null, t = \"[#{v}] = x\"\n    throwsCompileError tSplat, null, null, tSplat = \"[#{v}...] = x\"\n  for v in disallowed\n    doesNotThrowCompileError \"[a.#{v}] = x\"\n    doesNotThrowCompileError \"[a.#{v}...] = x\"\n    doesNotThrowCompileError \"[@#{v}] = x\"\n    doesNotThrowCompileError \"[@#{v}...] = x\"\n\ntest \"#2055: destructuring assignment with `new`\", ->\n  {length} = new Array\n  eq 0, length\n\ntest \"#156: destructuring with expansion\", ->\n  array = [1..5]\n  [first, ..., last] = array\n  eq 1, first\n  eq 5, last\n  [..., lastButOne, last] = array\n  eq 4, lastButOne\n  eq 5, last\n  [first, second, ..., last] = array\n  eq 2, second\n  [..., last] = 'strings as well -> x'\n  eq 'x', last\n  throwsCompileError \"[1, ..., 3]\",        null, null, \"prohibit expansion outside of assignment\"\n  throwsCompileError \"[..., a, b...] = c\", null, null, \"prohibit expansion and a splat\"\n  throwsCompileError \"[...] = c\",          null, null, \"prohibit lone expansion\"\n\ntest \"destructuring with dynamic keys\", ->\n  {\"#{'a'}\": a, \"\"\"#{'b'}\"\"\": b, c} = {a: 1, b: 2, c: 3}\n  eq 1, a\n  eq 2, b\n  eq 3, c\n  throwsCompileError '{\"#{a}\"} = b'\n\ntest \"simple array destructuring defaults\", ->\n  [a = 1] = []\n  eq 1, a\n  [a = 2] = [undefined]\n  eq 2, a\n  [a = 3] = [null]\n  eq null, a # Breaking change in CS2: per ES2015, default values are applied for `undefined` but not for `null`.\n  [a = 4] = [0]\n  eq 0, a\n  arr = [a = 5]\n  eq 5, a\n  arrayEq [5], arr\n\ntest \"simple object destructuring defaults\", ->\n  {b = 1} = {}\n  eq b, 1\n  {b = 2} = {b: undefined}\n  eq b, 2\n  {b = 3} = {b: null}\n  eq b, null # Breaking change in CS2: per ES2015, default values are applied for `undefined` but not for `null`.\n  {b = 4} = {b: 0}\n  eq b, 0\n\n  {b: c = 1} = {}\n  eq c, 1\n  {b: c = 2} = {b: undefined}\n  eq c, 2\n  {b: c = 3} = {b: null}\n  eq c, null # Breaking change in CS2: per ES2015, default values are applied for `undefined` but not for `null`.\n  {b: c = 4} = {b: 0}\n  eq c, 0\n\ntest \"multiple array destructuring defaults\", ->\n  [a = 1, b = 2, c] = [undefined, 12, 13]\n  eq a, 1\n  eq b, 12\n  eq c, 13\n  [a, b = 2, c = 3] = [undefined, 12, 13]\n  eq a, undefined\n  eq b, 12\n  eq c, 13\n  [a = 1, b, c = 3] = [11, 12]\n  eq a, 11\n  eq b, 12\n  eq c, 3\n\ntest \"multiple object destructuring defaults\", ->\n  {a = 1, b: bb = 2, 'c': c = 3, \"#{0}\": d = 4} = {\"#{'b'}\": 12}\n  eq a, 1\n  eq bb, 12\n  eq c, 3\n  eq d, 4\n\ntest \"array destructuring defaults with splats\", ->\n  [..., a = 9] = []\n  eq a, 9\n  [..., b = 9] = [19]\n  eq b, 19\n\ntest \"deep destructuring assignment with defaults\", ->\n  [a, [{b = 1, c = 3}] = [c: 2]] = [0]\n  eq a, 0\n  eq b, 1\n  eq c, 2\n\ntest \"destructuring assignment with context (@) properties and defaults\", ->\n  a={}; b={}; c={}; d={}; e={}\n  obj =\n    fn: () ->\n      local = [a, {b, c: undefined}, d]\n      [@a, {b: @b = b, @c = c}, @d, @e = e] = local\n  eq undefined, obj[key] for key in ['a','b','c','d','e']\n  obj.fn()\n  eq a, obj.a\n  eq b, obj.b\n  eq c, obj.c\n  eq d, obj.d\n  eq e, obj.e\n\ntest \"destructuring assignment with defaults single evaluation\", ->\n  callCount = 0\n  fn = -> callCount++\n  [a = fn()] = []\n  eq 0, a\n  eq 1, callCount\n  [a = fn()] = [10]\n  eq 10, a\n  eq 1, callCount\n  {a = fn(), b: c = fn()} = {a: 20, b: undefined}\n  eq 20, a\n  eq c, 1\n  eq callCount, 2\n\n\n# Existential Assignment\n\ntest \"existential assignment\", ->\n  nonce = {}\n  a = false\n  a ?= nonce\n  eq false, a\n  b = undefined\n  b ?= nonce\n  eq nonce, b\n  c = null\n  c ?= nonce\n  eq nonce, c\n\ntest \"#1627: prohibit conditional assignment of undefined variables\", ->\n  throwsCompileError \"x ?= 10\",        null, null, \"prohibit (x ?= 10)\"\n  throwsCompileError \"x ||= 10\",       null, null, \"prohibit (x ||= 10)\"\n  throwsCompileError \"x or= 10\",       null, null, \"prohibit (x or= 10)\"\n  throwsCompileError \"do -> x ?= 10\",  null, null, \"prohibit (do -> x ?= 10)\"\n  throwsCompileError \"do -> x ||= 10\", null, null, \"prohibit (do -> x ||= 10)\"\n  throwsCompileError \"do -> x or= 10\", null, null, \"prohibit (do -> x or= 10)\"\n  doesNotThrowCompileError \"x = null; x ?= 10\",        null, \"allow (x = null; x ?= 10)\"\n  doesNotThrowCompileError \"x = null; x ||= 10\",       null, \"allow (x = null; x ||= 10)\"\n  doesNotThrowCompileError \"x = null; x or= 10\",       null, \"allow (x = null; x or= 10)\"\n  doesNotThrowCompileError \"x = null; do -> x ?= 10\",  null, \"allow (x = null; do -> x ?= 10)\"\n  doesNotThrowCompileError \"x = null; do -> x ||= 10\", null, \"allow (x = null; do -> x ||= 10)\"\n  doesNotThrowCompileError \"x = null; do -> x or= 10\", null, \"allow (x = null; do -> x or= 10)\"\n\n  throwsCompileError \"-> -> -> x ?= 10\", null, null, \"prohibit (-> -> -> x ?= 10)\"\n  doesNotThrowCompileError \"x = null; -> -> -> x ?= 10\", null, \"allow (x = null; -> -> -> x ?= 10)\"\n\ntest \"more existential assignment\", ->\n  global.temp ?= 0\n  eq global.temp, 0\n  global.temp or= 100\n  eq global.temp, 100\n  delete global.temp\n\ntest \"#1348, #1216: existential assignment compilation\", ->\n  nonce = {}\n  a = nonce\n  b = (a ?= 0)\n  eq nonce, b\n  #the first ?= compiles into a statement; the second ?= compiles to a ternary expression\n  eq a ?= b ?= 1, nonce\n\n  if a then a ?= 2 else a = 3\n  eq a, nonce\n\ntest \"#1591, #1101: splatted expressions in destructuring assignment must be assignable\", ->\n  nonce = {}\n  for nonref in ['', '\"\"', '0', 'f()', '(->)'].concat CoffeeScript.RESERVED\n    eq nonce, (try CoffeeScript.compile \"[#{nonref}...] = v\" catch e then nonce)\n\ntest \"#1643: splatted accesses in destructuring assignments should not be declared as variables\", ->\n  nonce = {}\n  accesses = ['o.a', 'o[\"a\"]', '(o.a)', '(o.a).a', '@o.a', 'C::a', 'f().a', 'o?.a', 'o?.a.b', 'f?().a']\n  for access in accesses\n    for i,j in [1,2,3] #position can matter\n      code =\n        \"\"\"\n        nonce = {}; nonce2 = {}; nonce3 = {};\n        @o = o = new (class C then a:{}); f = -> o\n        [#{new Array(i).join('x,')}#{access}...] = [#{new Array(i).join('0,')}nonce, nonce2, nonce3]\n        unless #{access}[0] is nonce and #{access}[1] is nonce2 and #{access}[2] is nonce3 then throw new Error('[...]')\n        \"\"\"\n      eq nonce, unless (try CoffeeScript.run code, bare: true catch e then true) then nonce\n  # subpatterns like `[[a]...]` and `[{a}...]`\n  subpatterns = ['[sub, sub2, sub3]', '{0: sub, 1: sub2, 2: sub3}']\n  for subpattern in subpatterns\n    for i,j in [1,2,3]\n      code =\n        \"\"\"\n        nonce = {}; nonce2 = {}; nonce3 = {};\n        [#{new Array(i).join('x,')}#{subpattern}...] = [#{new Array(i).join('0,')}nonce, nonce2, nonce3]\n        unless sub is nonce and sub2 is nonce2 and sub3 is nonce3 then throw new Error('[sub...]')\n        \"\"\"\n      eq nonce, unless (try CoffeeScript.run code, bare: true catch e then true) then nonce\n\ntest \"#1838: Regression with variable assignment\", ->\n  name =\n  'dave'\n\n  eq name, 'dave'\n\ntest '#2211: splats in destructured parameters', ->\n  doesNotThrowCompileError '([a...]) ->'\n  doesNotThrowCompileError '([a...],b) ->'\n  doesNotThrowCompileError '([a...],[b...]) ->'\n  throwsCompileError '([a...,[a...]]) ->'\n  doesNotThrowCompileError '([a...,[b...]]) ->'\n\ntest '#2213: invocations within destructured parameters', ->\n  throwsCompileError '([a()])->'\n  throwsCompileError '([a:b()])->'\n  throwsCompileError '([a:b.c()])->'\n  throwsCompileError '({a()})->'\n  throwsCompileError '({a:b()})->'\n  throwsCompileError '({a:b.c()})->'\n\ntest '#2532: compound assignment with terminator', ->\n  doesNotThrowCompileError \"\"\"\n  a = \"hello\"\n  a +=\n  \"\n  world\n  !\n  \"\n  \"\"\"\n\ntest \"#2613: parens on LHS of destructuring\", ->\n  a = {}\n  [(a).b] = [1, 2, 3]\n  eq a.b, 1\n\ntest \"#2181: conditional assignment as a subexpression\", ->\n  a = false\n  false && a or= true\n  eq false, a\n  eq false, not a or= true\n\ntest \"#1500: Assignment to variables similar to generated variables\", ->\n  len = 0\n  x = ((results = null; n) for n in [1, 2, 3])\n  arrayEq [1, 2, 3], x\n  eq 0, len\n\n  for x in [1, 2, 3]\n    f = ->\n      i = 0\n    f()\n    eq 'undefined', typeof i\n\n  ref = 2\n  x = ref * 2 ? 1\n  eq x, 4\n  eq 'undefined', typeof ref1\n\n  x = {}\n  base = -> x\n  name = -1\n  base()[-name] ?= 2\n  eq x[1], 2\n  eq base(), x\n  eq name, -1\n\n  f = (@a, a) -> [@a, a]\n  arrayEq [1, 2], f.call scope = {}, 1, 2\n  eq 1, scope.a\n\n  try throw 'foo'\n  catch error\n    eq error, 'foo'\n\n  eq error, 'foo'\n\n  doesNotThrowCompileError '(@slice...) ->'\n\ntest \"Assignment to variables similar to helper functions\", ->\n  f = (slice...) -> slice\n  arrayEq [1, 2, 3], f 1, 2, 3\n  eq 'undefined', typeof slice1\n\n  class A\n  class B extends A\n    extend = 3\n    hasProp = 4\n    value: 5\n    method: (bind, bind1) => [bind, bind1, extend, hasProp, @value]\n  {method} = new B\n  arrayEq [1, 2, 3, 4, 5], method 1, 2\n\n  modulo = -1 %% 3\n  eq 2, modulo\n\n  indexOf = [1, 2, 3]\n  ok 2 in indexOf\n\ntest \"#4566: destructuring with nested default values\", ->\n  {a: {b = 1}} = a: {}\n  eq 1, b\n\n  {c: {d} = {}} = c: d: 3\n  eq 3, d\n\n  {e: {f = 5} = {}} = {}\n  eq 5, f\n\ntest \"#4878: Compile error when using destructuring with a splat or expansion in an array\", ->\n  arr = ['a', 'b', 'c', 'd']\n\n  f1 = (list) ->\n    [first, ..., last] = list\n\n  f2 = (list) ->\n    [first..., last] = list\n\n  f3 = (list) ->\n    ([first, ...] = list); first\n\n  f4 = (list) ->\n    ([first, rest...] = list); rest\n\n  arrayEq f1(arr), arr\n  arrayEq f2(arr), arr\n  arrayEq f3(arr), 'a'\n  arrayEq f4(arr), ['b', 'c', 'd']\n\n  foo = (list) ->\n    ret =\n      if list?.length > 0\n        [first, ..., last] = list\n        [first, last]\n      else\n        []\n\n  arrayEq foo(arr), ['a', 'd']\n\n  bar = (list) ->\n    ret =\n      if list?.length > 0\n        [first, rest...] = list\n        [first, rest]\n      else\n        []\n\n  arrayEq bar(arr), ['a', ['b', 'c', 'd']]\n\ntest \"destructuring assignment with an empty array in object\", ->\n  obj =\n    a1: [1, 2]\n    b1: 3\n\n  {a1:[], b1} = obj\n  eq 'undefined', typeof a1\n  eq b1, 3\n\n  obj =\n    a2:\n      b2: [1, 2]\n    c2: 3\n\n  {a2: {b2:[]}, c2} = obj\n  eq 'undefined', typeof b2\n  eq c2, 3\n\ntest \"#5004: array destructuring with accessors\", ->\n  obj =\n    arr: ['a', 'b', 'c', 'd']\n    list: {}\n    f1: ->\n      [@first, @rest...] = @arr\n    f2: ->\n      [@second, @third..., @last] = @rest\n    f3: ->\n      [@list.a, @list.middle..., @list.d] = @arr\n\n  obj.f1()\n  eq obj.first, 'a'\n  arrayEq obj.rest, ['b', 'c', 'd']\n\n  obj.f2()\n  eq obj.second, 'b'\n  arrayEq obj.third, ['c']\n  eq obj.last, 'd'\n\n  obj.f3()\n  eq obj.list.a, 'a'\n  arrayEq obj.list.middle, ['b', 'c']\n  eq obj.list.d, 'd'\n\n  [obj.list.middle..., d] = obj.arr\n  eq d, 'd'\n  arrayEq obj.list.middle, ['a', 'b', 'c']\n\ntest \"#4884: destructured object splat\", ->\n  [{length}...] = [1, 2, 3]\n  eq length, 3\n  [{length: len}...] = [1, 2, 3]\n  eq len, 3\n  [{length}..., three] = [1, 2, 3]\n  eq length, 2\n  eq three, 3\n  [{length: len}..., three] = [1, 2, 3]\n  eq len, 2\n  eq three, 3\n  x = [{length}..., three] = [1, 2, 3]\n  eq length, 2\n  eq three, 3\n  eq x[2], 3\n  x = [{length: len}..., three] = [1, 2, 3]\n  eq len, 2\n  eq three, 3\n  eq x[2], 3\n\ntest \"#4884: destructured array splat\", ->\n  [[one, two, three]...] = [1, 2, 3]\n  eq one, 1\n  eq two, 2\n  eq three, 3\n  [[one, two]..., three] = [1, 2, 3]\n  eq one, 1\n  eq two, 2\n  eq three, 3\n  x = [[one, two]..., three] = [1, 2, 3]\n  eq one, 1\n  eq two, 2\n  eq three, 3\n  eq x[2], 3\n"
  },
  {
    "path": "test/async.coffee",
    "content": "# Functions that contain the `await` keyword will compile into async functions,\n# supported by Node 7.6+, Chrome 55+, Firefox 52+, Safari 10.1+ and Edge.\n# But runtimes that don’t support the `await` keyword will throw an error just\n# from parsing this file, even without executing it, even if we put\n# `return unless try new Function 'async () => {}'` at the top of this file.\n# Therefore we need to prevent runtimes which will choke on such code from\n# parsing it, which is handled in `Cakefile`.\n\n\n# This is always fulfilled.\nwinning = (val) -> Promise.resolve val\n\n# This is always rejected.\nfailing = (val) -> Promise.reject new Error val\n\n\ntest \"async as argument\", ->\n  ok ->\n    await winning()\n\ntest \"explicit async\", ->\n  a = do ->\n    await return 5\n  eq a.constructor, Promise\n  a.then (val) ->\n    eq val, 5\n\ntest \"implicit async\", ->\n  a = do ->\n    x = await winning(5)\n    y = await winning(4)\n    z = await winning(3)\n    [x, y, z]\n\n  eq a.constructor, Promise\n\ntest \"async return value (implicit)\", ->\n  out = null\n  a = ->\n    x = await winning(5)\n    y = await winning(4)\n    z = await winning(3)\n    [x, y, z]\n\n  b = do ->\n    out = await a()\n\n  b.then ->\n    arrayEq out, [5, 4, 3]\n\ntest \"async return value (explicit)\", ->\n  out = null\n  a = ->\n    await return [5, 2, 3]\n\n  b = do ->\n    out = await a()\n\n  b.then ->\n    arrayEq out, [5, 2, 3]\n\n\ntest \"async parameters\", ->\n  [out1, out2] = [null, null]\n  a = (a, [b, c])->\n    arr = [a]\n    arr.push b\n    arr.push c\n    await return arr\n\n  b = (a, b, c = 5)->\n    arr = [a]\n    arr.push b\n    arr.push c\n    await return arr\n\n  c = do ->\n    out1 = await a(5, [4, 3])\n    out2 = await b(4, 4)\n\n  c.then ->\n    arrayEq out1, [5, 4, 3]\n    arrayEq out2, [4, 4, 5]\n\ntest \"async `this` scoping\", ->\n  bnd = null\n  ubnd = null\n  nst = null\n  obj =\n    bound: ->\n      return do =>\n        await return this\n    unbound: ->\n      return do ->\n        await return this\n    nested: ->\n      return do =>\n        await do =>\n          await do =>\n            await return this\n\n  promise = do ->\n    bnd = await obj.bound()\n    ubnd = await obj.unbound()\n    nst = await obj.nested()\n\n  promise.then ->\n    eq bnd, obj\n    ok ubnd isnt obj\n    eq nst, obj\n\ntest \"await precedence\", ->\n  out = null\n\n  fn = (win, fail) ->\n    win(3)\n\n  promise = do ->\n    # assert precedence between unary (new) and power (**) operators\n    out = 1 + await new Promise(fn) ** 2\n\n  promise.then ->\n    eq out, 10\n\ntest \"`await` inside IIFEs\", ->\n  [x, y, z] = new Array(3)\n\n  a = do ->\n    x = switch (4)  # switch 4\n      when 2\n        await winning(1)\n      when 4\n        await winning(5)\n      when 7\n        await winning(2)\n\n    y = try\n      text = \"this should be caught\"\n      throw new Error(text)\n      await winning(1)\n    catch e\n      await winning(4)\n\n    z = for i in [0..5]\n      a = i * i\n      await winning(a)\n\n  a.then ->\n    eq x, 5\n    eq y, 4\n\n    arrayEq z, [0, 1, 4, 9, 16, 25]\n\ntest \"error handling\", ->\n  res = null\n  val = 0\n  a = ->\n    try\n      await failing(\"fail\")\n    catch e\n      val = 7  # to assure the catch block runs\n      return e\n\n  b = do ->\n    res = await a()\n\n  b.then ->\n    eq val, 7\n\n    ok res.message?\n    eq res.message, \"fail\"\n\ntest \"await expression evaluates to argument if not A+\", ->\n  eq(await 4, 4)\n\n\ntest \"implicit call with `await`\", ->\n  addOne = (arg) -> arg + 1\n\n  a = addOne await 3\n  eq a, 4\n\ntest \"async methods in classes\", ->\n  class Base\n    @static: ->\n      await 1\n    method: ->\n      await 2\n\n  eq await Base.static(), 1\n  eq await new Base().method(), 2\n\n  class Child extends Base\n    @static: -> super()\n    method: -> super()\n\n  eq await Child.static(), 1\n  eq await new Child().method(), 2\n\ntest \"#3199: await multiline implicit object\", ->\n  do ->\n    y =\n      if no then await\n        type: 'a'\n        msg: 'b'\n    eq undefined, y\n\ntest \"top-level await\", ->\n  eqJS 'await null', 'await null;'\n\ntest \"top-level wrapper has correct async attribute\", ->\n  starts = (code, prefix) ->\n    compiled = CoffeeScript.compile code\n    unless compiled.startsWith prefix\n      fail \"\"\"Expected generated JavaScript to start with:\n        #{reset}#{prefix}#{red}\n        but instead it was:\n        #{reset}#{compiled}#{red}\"\"\"\n  starts 'await null', '(async function'\n  starts 'do -> await null', '(function'\n"
  },
  {
    "path": "test/async_iterators.coffee",
    "content": "# This is always fulfilled.\nwinLater = (val, ms) ->\n  new Promise (resolve) -> setTimeout (-> resolve val), ms\n\n# This is always rejected.\nfailLater = (val, ms) ->\n  new Promise (resolve, reject) -> setTimeout (-> reject new Error val), ms\n\ncreateAsyncIterable = (syncIterable) ->\n  for elem in syncIterable\n    yield await winLater elem, 50\n\ntest \"async iteration\", ->\n  foo = (x for await x from createAsyncIterable [1,2,3])\n  arrayEq foo, [1, 2, 3]\n\ntest \"async generator functions\", ->\n  foo = (val) ->\n    yield await winLater val + 1, 50\n\n  bar = (val) ->\n    yield await failLater val - 1, 50\n\n  a = await foo(41).next()\n  eq a.value, 42\n\n  try\n    b = do -> await bar(41).next()\n    b.catch (err) ->\n      eq \"40\", err.message\n  catch err\n    ok no\n"
  },
  {
    "path": "test/booleans.coffee",
    "content": "# Boolean Literals\n# ----------------\n\n# TODO: add method invocation tests: true.toString() is \"true\"\n\ntest \"#764 Booleans should be indexable\", ->\n  toString = Boolean::toString\n\n  eq toString, true['toString']\n  eq toString, false['toString']\n  eq toString, yes['toString']\n  eq toString, no['toString']\n  eq toString, on['toString']\n  eq toString, off['toString']\n\n  eq toString, true.toString\n  eq toString, false.toString\n  eq toString, yes.toString\n  eq toString, no.toString\n  eq toString, on.toString\n  eq toString, off.toString\n"
  },
  {
    "path": "test/classes.coffee",
    "content": "# Classes\n# -------\n\n# * Class Definition\n# * Class Instantiation\n# * Inheritance and Super\n# * ES2015+ Class Interoperability\n\ntest \"classes with a four-level inheritance chain\", ->\n\n  class Base\n    func: (string) ->\n      \"zero/#{string}\"\n\n    @static: (string) ->\n      \"static/#{string}\"\n\n  class FirstChild extends Base\n    func: (string) ->\n      super('one/') + string\n\n  SecondChild = class extends FirstChild\n    func: (string) ->\n      super('two/') + string\n\n  thirdCtor = ->\n    @array = [1, 2, 3]\n\n  class ThirdChild extends SecondChild\n    constructor: ->\n      super()\n      thirdCtor.call this\n\n    # Gratuitous comment for testing.\n    func: (string) ->\n      super('three/') + string\n\n  result = (new ThirdChild).func 'four'\n\n  ok result is 'zero/one/two/three/four'\n  ok Base.static('word') is 'static/word'\n\n  ok (new ThirdChild).array.join(' ') is '1 2 3'\n\n\ntest \"constructors with inheritance and super\", ->\n\n  identity = (f) -> f\n\n  class TopClass\n    constructor: (arg) ->\n      @prop = 'top-' + arg\n\n  class SuperClass extends TopClass\n    constructor: (arg) ->\n      identity super 'super-' + arg\n\n  class SubClass extends SuperClass\n    constructor: ->\n      identity super 'sub'\n\n  ok (new SubClass).prop is 'top-super-sub'\n\n\ntest \"'super' with accessors\", ->\n  class Base\n    m: -> 4\n    n: -> 5\n    o: -> 6\n\n  name = 'o'\n  class A extends Base\n    m: -> super()\n    n: -> super.n()\n    \"#{name}\": -> super()\n    p: -> super[name]()\n\n  a = new A\n  eq 4, a.m()\n  eq 5, a.n()\n  eq 6, a.o()\n  eq 6, a.p()\n\n\ntest \"soaked 'super' invocation\", ->\n  class Base\n    method: -> 2\n\n  class A extends Base\n    method: -> super?()\n    noMethod: -> super?()\n\n  a = new A\n  eq 2, a.method()\n  eq undefined, a.noMethod()\n\n  name = 'noMethod'\n  class B extends Base\n    \"#{'method'}\": -> super?()\n    \"#{'noMethod'}\": -> super?() ? super['method']()\n\n  b = new B\n  eq 2, b.method()\n  eq 2, b.noMethod()\n\ntest \"'@' referring to the current instance, and not being coerced into a call\", ->\n\n  class ClassName\n    amI: ->\n      @ instanceof ClassName\n\n  obj = new ClassName\n  ok obj.amI()\n\n\ntest \"super() calls in constructors of classes that are defined as object properties\", ->\n\n  class Hive\n    constructor: (name) -> @name = name\n\n  class Hive.Bee extends Hive\n    constructor: (name) -> super name\n\n  maya = new Hive.Bee 'Maya'\n  ok maya.name is 'Maya'\n\n\ntest \"classes with JS-keyword properties\", ->\n\n  class Class\n    class: 'class'\n    name: -> @class\n\n  instance = new Class\n  ok instance.class is 'class'\n  ok instance.name() is 'class'\n\n\ntest \"Classes with methods that are pre-bound to the instance, or statically, to the class\", ->\n\n  class Dog\n    constructor: (name) ->\n      @name = name\n\n    bark: =>\n      \"#{@name} woofs!\"\n\n    @static = =>\n      new this('Dog')\n\n  spark = new Dog('Spark')\n  fido  = new Dog('Fido')\n  fido.bark = spark.bark\n\n  ok fido.bark() is 'Spark woofs!'\n\n  obj = func: Dog.static\n\n  ok obj.func().name is 'Dog'\n\n\ntest \"a bound function in a bound function\", ->\n\n  class Mini\n    num: 10\n    generate: =>\n      for i in [1..3]\n        =>\n          @num\n\n  m = new Mini\n  eq (func() for func in m.generate()).join(' '), '10 10 10'\n\n\ntest \"contructor called with varargs\", ->\n\n  class Connection\n    constructor: (one, two, three) ->\n      [@one, @two, @three] = [one, two, three]\n\n    out: ->\n      \"#{@one}-#{@two}-#{@three}\"\n\n  list = [3, 2, 1]\n  conn = new Connection list...\n  ok conn instanceof Connection\n  ok conn.out() is '3-2-1'\n\n\ntest \"calling super and passing along all arguments\", ->\n\n  class Parent\n    method: (args...) -> @args = args\n\n  class Child extends Parent\n    method: -> super arguments...\n\n  c = new Child\n  c.method 1, 2, 3, 4\n  ok c.args.join(' ') is '1 2 3 4'\n\n\ntest \"classes wrapped in decorators\", ->\n\n  func = (klass) ->\n    klass::prop = 'value'\n    klass\n\n  func class Test\n    prop2: 'value2'\n\n  ok (new Test).prop  is 'value'\n  ok (new Test).prop2 is 'value2'\n\n\ntest \"anonymous classes\", ->\n\n  obj =\n    klass: class\n      method: -> 'value'\n\n  instance = new obj.klass\n  ok instance.method() is 'value'\n\n\ntest \"Implicit objects as static properties\", ->\n\n  class Static\n    @static =\n      one: 1\n      two: 2\n\n  ok Static.static.one is 1\n  ok Static.static.two is 2\n\n\ntest \"nothing classes\", ->\n\n  c = class\n  ok c instanceof Function\n\n\ntest \"classes with static-level implicit objects\", ->\n\n  class A\n    @static = one: 1\n    two: 2\n\n  class B\n    @static = one: 1,\n    two: 2\n\n  eq A.static.one, 1\n  eq A.static.two, undefined\n  eq (new A).two, 2\n\n  eq B.static.one, 1\n  eq B.static.two, 2\n  eq (new B).two, undefined\n\n\ntest \"classes with value'd constructors\", ->\n\n  counter = 0\n  classMaker = ->\n    inner = ++counter\n    ->\n      @value = inner\n      @\n\n  class One\n    constructor: classMaker()\n\n  class Two\n    constructor: classMaker()\n\n  eq (new One).value, 1\n  eq (new Two).value, 2\n  eq (new One).value, 1\n  eq (new Two).value, 2\n\n\ntest \"executable class bodies\", ->\n\n  class A\n    if true\n      b: 'b'\n    else\n      c: 'c'\n\n  a = new A\n\n  eq a.b, 'b'\n  eq a.c, undefined\n\n\ntest \"#2502: parenthesizing inner object values\", ->\n\n  class A\n    category:  (type: 'string')\n    sections:  (type: 'number', default: 0)\n\n  eq (new A).category.type, 'string'\n\n  eq (new A).sections.default, 0\n\n\ntest \"conditional prototype property assignment\", ->\n  debug = false\n\n  class Person\n    if debug\n      age: -> 10\n    else\n      age: -> 20\n\n  eq (new Person).age(), 20\n\n\ntest \"mild metaprogramming\", ->\n\n  class Base\n    @attr: (name) ->\n      @::[name] = (val) ->\n        if arguments.length > 0\n          @[\"_#{name}\"] = val\n        else\n          @[\"_#{name}\"]\n\n  class Robot extends Base\n    @attr 'power'\n    @attr 'speed'\n\n  robby = new Robot\n\n  ok robby.power() is undefined\n\n  robby.power 11\n  robby.speed Infinity\n\n  eq robby.power(), 11\n  eq robby.speed(), Infinity\n\n\ntest \"namespaced classes do not reserve their function name in outside scope\", ->\n\n  one = {}\n  two = {}\n\n  class one.Klass\n    @label = \"one\"\n\n  class two.Klass\n    @label = \"two\"\n\n  eq typeof Klass, 'undefined'\n  eq one.Klass.label, 'one'\n  eq two.Klass.label, 'two'\n\n\ntest \"nested classes\", ->\n\n  class Outer\n    constructor: ->\n      @label = 'outer'\n\n    class @Inner\n      constructor: ->\n        @label = 'inner'\n\n  eq (new Outer).label, 'outer'\n  eq (new Outer.Inner).label, 'inner'\n\n\ntest \"variables in constructor bodies are correctly scoped\", ->\n\n  class A\n    x = 1\n    constructor: ->\n      x = 10\n      y = 20\n    y = 2\n    captured: ->\n      {x, y}\n\n  a = new A\n  eq a.captured().x, 10\n  eq a.captured().y, 2\n\n\ntest \"Issue #924: Static methods in nested classes\", ->\n\n  class A\n    @B: class\n      @c = -> 5\n\n  eq A.B.c(), 5\n\n\ntest \"`class extends this`\", ->\n\n  class A\n    func: -> 'A'\n\n  B = null\n  makeClass = ->\n    B = class extends this\n      func: -> super() + ' B'\n\n  makeClass.call A\n\n  eq (new B()).func(), 'A B'\n\n\ntest \"ensure that constructors invoked with splats return a new object\", ->\n\n  args = [1, 2, 3]\n  Type = (@args) ->\n  type = new Type args\n\n  ok type and type instanceof Type\n  ok type.args and type.args instanceof Array\n  ok v is args[i] for v, i in type.args\n\n  Type1 = (@a, @b, @c) ->\n  type1 = new Type1 args...\n\n  ok type1 instanceof   Type1\n  eq type1.constructor, Type1\n  ok type1.a is args[0] and type1.b is args[1] and type1.c is args[2]\n\n  # Ensure that constructors invoked with splats cache the function.\n  called = 0\n  get = -> if called++ then false else class Type\n  new (get()) args...\n\ntest \"`new` shouldn't add extra parens\", ->\n\n  ok new Date().constructor is Date\n\n\ntest \"`new` works against bare function\", ->\n\n  eq Date, new ->\n    Date\n\ntest \"`new` works against statement\", ->\n\n  class A\n  (new try A) instanceof A\n\ntest \"#1182: a subclass should be able to set its constructor to an external function\", ->\n  ctor = ->\n    @val = 1\n    return\n  class A\n  class B extends A\n    constructor: ctor\n  eq (new B).val, 1\n\ntest \"#1182: external constructors continued\", ->\n  ctor = ->\n  class A\n  class B extends A\n    method: ->\n    constructor: ctor\n  ok B::method\n\ntest \"#1313: misplaced __extends\", ->\n  nonce = {}\n  class A\n  class B extends A\n    prop: nonce\n    constructor: -> super()\n  eq nonce, B::prop\n\ntest \"#1182: execution order needs to be considered as well\", ->\n  counter = 0\n  makeFn = (n) -> eq n, ++counter; ->\n  class B extends (makeFn 1)\n    @B: makeFn 2\n    constructor: makeFn 3\n\ntest \"#1182: external constructors with bound functions\", ->\n  fn = ->\n    {one: 1}\n    this\n  class B\n  class A\n    constructor: fn\n    method: => this instanceof A\n  ok (new A).method.call(new B)\n\ntest \"#1372: bound class methods with reserved names\", ->\n  class C\n    delete: =>\n  ok C::delete\n\ntest \"#1380: `super` with reserved names\", ->\n  class C\n    do: -> super()\n  ok C::do\n\n  class B\n    0: -> super()\n  ok B::[0]\n\ntest \"#1464: bound class methods should keep context\", ->\n  nonce  = {}\n  nonce2 = {}\n  class C\n    constructor: (@id) ->\n    @boundStaticColon: => new this(nonce)\n    @boundStaticEqual= => new this(nonce2)\n  eq nonce,  C.boundStaticColon().id\n  eq nonce2, C.boundStaticEqual().id\n\ntest \"#1009: classes with reserved words as determined names\", -> (->\n  eq 'function', typeof (class @for)\n  ok not /\\beval\\b/.test (class @eval).toString()\n  ok not /\\barguments\\b/.test (class @arguments).toString()\n).call {}\n\ntest \"#1482: classes can extend expressions\", ->\n  id = (x) -> x\n  nonce = {}\n  class A then nonce: nonce\n  class B extends id A\n  eq nonce, (new B).nonce\n\ntest \"#1598: super works for static methods too\", ->\n\n  class Parent\n    method: ->\n      'NO'\n    @method: ->\n      'yes'\n\n  class Child extends Parent\n    @method: ->\n      'pass? ' + super()\n\n  eq Child.method(), 'pass? yes'\n\ntest \"#1842: Regression with bound functions within bound class methods\", ->\n\n  class Store\n    @bound: =>\n      do =>\n        eq this, Store\n\n  Store.bound()\n\n  # And a fancier case:\n\n  class Store\n\n    eq this, Store\n\n    @bound: =>\n      do =>\n        eq this, Store\n\n    @unbound: ->\n      eq this, Store\n\n    instance: =>\n      ok this instanceof Store\n\n  Store.bound()\n  Store.unbound()\n  (new Store).instance()\n\ntest \"#1876: Class @A extends A\", ->\n  class A\n  class @A extends A\n\n  ok (new @A) instanceof A\n\ntest \"#1813: Passing class definitions as expressions\", ->\n  ident = (x) -> x\n\n  result = ident class A then x = 1\n\n  eq result, A\n\n  result = ident class B extends A\n    x = 1\n\n  eq result, B\n\ntest \"#1966: external constructors should produce their return value\", ->\n  ctor = -> {}\n  class A then constructor: ctor\n  ok (new A) not instanceof A\n\ntest \"#1980: regression with an inherited class with static function members\", ->\n\n  class A\n\n  class B extends A\n    @static: => 'value'\n\n  eq B.static(), 'value'\n\ntest \"#1534: class then 'use strict'\", ->\n  # [14.1 Directive Prologues and the Use Strict Directive](http://es5.github.com/#x14.1)\n  nonce = {}\n  error = 'do -> ok this'\n  strictTest = \"do ->'use strict';#{error}\"\n  return unless (try CoffeeScript.run strictTest, bare: yes catch e then nonce) is nonce\n\n  throws -> CoffeeScript.run \"class then 'use strict';#{error}\", bare: yes\n  doesNotThrow -> CoffeeScript.run \"class then #{error}\", bare: yes\n  doesNotThrow -> CoffeeScript.run \"class then #{error};'use strict'\", bare: yes\n\n  # comments are ignored in the Directive Prologue\n  comments = [\"\"\"\n  class\n    ### comment ###\n    'use strict'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    ### comment 1 ###\n    ### comment 2 ###\n    'use strict'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    ### comment 1 ###\n    ### comment 2 ###\n    'use strict'\n    #{error}\n    ### comment 3 ###\"\"\"\n  ]\n  throws (-> CoffeeScript.run comment, bare: yes) for comment in comments\n\n  # [ES5 §14.1](http://es5.github.com/#x14.1) allows for other directives\n  directives = [\"\"\"\n  class\n    'directive 1'\n    'use strict'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    'use strict'\n    'directive 2'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    ### comment 1 ###\n    'directive 1'\n    'use strict'\n    #{error}\"\"\",\n  \"\"\"\n  class\n    ### comment 1 ###\n    'directive 1'\n    ### comment 2 ###\n    'use strict'\n    #{error}\"\"\"\n  ]\n  throws (-> CoffeeScript.run directive, bare: yes) for directive in directives\n\ntest \"#2052: classes should work in strict mode\", ->\n  try\n    do ->\n      'use strict'\n      class A\n  catch e\n    ok no\n\ntest \"directives in class with extends \", ->\n  strictTest = \"\"\"\n    class extends Object\n      ### comment ###\n      'use strict'\n      do -> eq this, undefined\n  \"\"\"\n  CoffeeScript.run strictTest, bare: yes\n\ntest \"#2630: class bodies can't reference arguments\", ->\n  throwsCompileError 'class Test then arguments'\n\n  # #4320: Don't be too eager when checking, though.\n  class Test\n    arguments: 5\n  eq 5, Test::arguments\n\ntest \"#2319: fn class n extends o.p [INDENT] x = 123\", ->\n  first = ->\n\n  base = onebase: ->\n\n  first class OneKeeper extends base.onebase\n    one = 1\n    one: -> one\n\n  eq new OneKeeper().one(), 1\n\n\ntest \"#2599: other typed constructors should be inherited\", ->\n  class Base\n    constructor: -> return {}\n\n  class Derived extends Base\n\n  ok (new Derived) not instanceof Derived\n  ok (new Derived) not instanceof Base\n  ok (new Base) not instanceof Base\n\ntest \"extending native objects works with and without defining a constructor\", ->\n  class MyArray extends Array\n    method: -> 'yes!'\n\n  myArray = new MyArray\n  ok myArray instanceof MyArray\n  ok 'yes!', myArray.method()\n\n  class OverrideArray extends Array\n    constructor: -> super()\n    method: -> 'yes!'\n\n  overrideArray = new OverrideArray\n  ok overrideArray instanceof OverrideArray\n  eq 'yes!', overrideArray.method()\n\n\ntest \"#2782: non-alphanumeric-named bound functions\", ->\n  class A\n    'b:c': =>\n      'd'\n\n  eq (new A)['b:c'](), 'd'\n\n\ntest \"#2781: overriding bound functions\", ->\n  class A\n    a: ->\n        @b()\n    b: =>\n        1\n\n  class B extends A\n    b: =>\n        2\n\n  b = (new A).b\n  eq b(), 1\n\n  b = (new B).b\n  eq b(), 2\n\n\ntest \"#2791: bound function with destructured argument\", ->\n  class Foo\n    method: ({a}) => 'Bar'\n\n  eq (new Foo).method({a: 'Bar'}), 'Bar'\n\n\ntest \"#2796: ditto, ditto, ditto\", ->\n  answer = null\n\n  outsideMethod = (func) ->\n    func.call message: 'wrong!'\n\n  class Base\n    constructor: ->\n      @message = 'right!'\n      outsideMethod @echo\n\n    echo: =>\n      answer = @message\n\n  new Base\n  eq answer, 'right!'\n\ntest \"#3063: Class bodies cannot contain pure statements\", ->\n  throwsCompileError \"\"\"\n    class extends S\n      return if S.f\n      @f: => this\n  \"\"\"\n\ntest \"#2949: super in static method with reserved name\", ->\n  class Foo\n    @static: -> 'baz'\n\n  class Bar extends Foo\n    @static: -> super()\n\n  eq Bar.static(), 'baz'\n\ntest \"#3232: super in static methods (not object-assigned)\", ->\n  class Foo\n    @baz = -> true\n    @qux = -> true\n\n  class Bar extends Foo\n    @baz = -> super()\n    Bar.qux = -> super()\n\n  ok Bar.baz()\n  ok Bar.qux()\n\ntest \"#1392 calling `super` in methods defined on namespaced classes\", ->\n  class Base\n    m: -> 5\n    n: -> 4\n  namespace =\n    A: ->\n    B: ->\n  class namespace.A extends Base\n    m: -> super()\n\n  eq 5, (new namespace.A).m()\n  namespace.B::m = namespace.A::m\n  namespace.A::m = null\n  eq 5, (new namespace.B).m()\n\n  class C\n    @a: class extends Base\n      m: -> super()\n  eq 5, (new C.a).m()\n\n\ntest \"#4436 immediately instantiated named class\", ->\n  ok new class Foo\n\n\ntest \"dynamic method names\", ->\n  class A\n    \"#{name = 'm'}\": -> 1\n  eq 1, new A().m()\n\n  class B extends A\n    \"#{name = 'm'}\": -> super()\n  eq 1, new B().m()\n\n  getName = -> 'm'\n  class C\n    \"#{name = getName()}\": -> 1\n  eq 1, new C().m()\n\n\ntest \"dynamic method names and super\", ->\n  class Base\n    @m: -> 6\n    m: -> 5\n    m2: -> 4.5\n    n: -> 4\n\n  name = -> count++; 'n'\n  count = 0\n\n  m = 'm'\n  class A extends Base\n    \"#{m}\": -> super()\n    \"#{name()}\": -> super()\n\n  m = 'n'\n  eq 5, (new A).m()\n\n  eq 4, (new A).n()\n  eq 1, count\n\n  m = 'm'\n  m2 = 'm2'\n  count = 0\n  class B extends Base\n    @[name()] = -> super()\n    \"#{m}\": -> super()\n    \"#{m2}\": -> super()\n  b = new B\n  m = m2 = 'n'\n  eq 6, B.m()\n  eq 5, b.m()\n  eq 4.5, b.m2()\n  eq 1, count\n\n  class C extends B\n    m: -> super()\n  eq 5, (new C).m()\n\n# ES2015+ class interoperability\n# Based on https://github.com/balupton/es6-javascript-class-interop\n# Helper functions to generate true ES classes to extend:\ngetBasicClass = ->\n  ```\n  class BasicClass {\n    constructor (greeting) {\n      this.greeting = greeting || 'hi'\n    }\n  }\n  ```\n  BasicClass\n\ngetExtendedClass = (BaseClass) ->\n  ```\n  class ExtendedClass extends BaseClass {\n    constructor (greeting, name) {\n      super(greeting || 'hello')\n      this.name = name\n    }\n  }\n  ```\n  ExtendedClass\n\ntest \"can instantiate a basic ES class\", ->\n  BasicClass = getBasicClass()\n  i = new BasicClass 'howdy!'\n  eq i.greeting, 'howdy!'\n\ntest \"can instantiate an extended ES class\", ->\n  BasicClass = getBasicClass()\n  ExtendedClass = getExtendedClass BasicClass\n  i = new ExtendedClass 'yo', 'buddy'\n  eq i.greeting, 'yo'\n  eq i.name, 'buddy'\n\ntest \"can extend a basic ES class\", ->\n  BasicClass = getBasicClass()\n  class ExtendedClass extends BasicClass\n    constructor: (@name) ->\n      super()\n  i = new ExtendedClass 'dude'\n  eq i.name, 'dude'\n\ntest \"can extend an extended ES class\", ->\n  BasicClass = getBasicClass()\n  ExtendedClass = getExtendedClass BasicClass\n\n  class ExtendedExtendedClass extends ExtendedClass\n    constructor: (@value) ->\n      super()\n    getDoubledValue: ->\n      @value * 2\n\n  i = new ExtendedExtendedClass 7\n  eq i.getDoubledValue(), 14\n\ntest \"CoffeeScript class can be extended in ES\", ->\n  class CoffeeClass\n    constructor: (@favoriteDrink = 'latte', @size = 'grande') ->\n    getDrinkOrder: ->\n      \"#{@size} #{@favoriteDrink}\"\n\n  ```\n  class ECMAScriptClass extends CoffeeClass {\n    constructor (favoriteDrink) {\n      super(favoriteDrink);\n      this.favoriteDrink = this.favoriteDrink + ' with a dash of semicolons';\n    }\n  }\n  ```\n\n  e = new ECMAScriptClass 'coffee'\n  eq e.getDrinkOrder(), 'grande coffee with a dash of semicolons'\n\ntest \"extended CoffeeScript class can be extended in ES\", ->\n  class CoffeeClass\n    constructor: (@favoriteDrink = 'latte') ->\n\n  class CoffeeClassWithDrinkOrder extends CoffeeClass\n    constructor: (@favoriteDrink, @size = 'grande') ->\n      super()\n    getDrinkOrder: ->\n      \"#{@size} #{@favoriteDrink}\"\n\n  ```\n  class ECMAScriptClass extends CoffeeClassWithDrinkOrder {\n    constructor (favoriteDrink) {\n      super(favoriteDrink);\n      this.favoriteDrink = this.favoriteDrink + ' with a dash of semicolons';\n    }\n  }\n  ```\n\n  e = new ECMAScriptClass 'coffee'\n  eq e.getDrinkOrder(), 'grande coffee with a dash of semicolons'\n\ntest \"`this` access after `super` in extended classes\", ->\n  class Base\n\n  class Test extends Base\n    constructor: (param, @param) ->\n      eq param, nonce\n\n      result = { super: super(), @param, @method }\n      eq result.super, this\n      eq result.param, @param\n      eq result.method, @method\n      ok result.method isnt Test::method\n\n    method: =>\n\n  nonce = {}\n  new Test nonce, {}\n\ntest \"`@`-params and bound methods with multiple `super` paths (blocks)\", ->\n  nonce = {}\n\n  class Base\n    constructor: (@name) ->\n\n  class Test extends Base\n    constructor: (param, @param) ->\n      if param\n        super 'param'\n        eq @name, 'param'\n      else\n        super 'not param'\n        eq @name, 'not param'\n      eq @param, nonce\n      ok @method isnt Test::method\n    method: =>\n  new Test true, nonce\n  new Test false, nonce\n\n\ntest \"`@`-params and bound methods with multiple `super` paths (expressions)\", ->\n  nonce = {}\n\n  class Base\n    constructor: (@name) ->\n\n  class Test extends Base\n    constructor: (param, @param) ->\n      # Contrived example: force each path into an expression with inline assertions\n      if param\n        result = (\n          eq (super 'param'), @;\n          eq @name, 'param';\n          eq @param, nonce;\n          ok @method isnt Test::method\n        )\n      else\n        result = (\n          eq (super 'not param'), @;\n          eq @name, 'not param';\n          eq @param, nonce;\n          ok @method isnt Test::method\n        )\n    method: =>\n  new Test true, nonce\n  new Test false, nonce\n\ntest \"constructor super in arrow functions\", ->\n  class Test extends (class)\n    constructor: (@param) ->\n      do => super()\n      eq @param, nonce\n\n  new Test nonce = {}\n\n# TODO Some of these tests use CoffeeScript.compile and CoffeeScript.run when they could use\n# regular test mechanics.\n# TODO Some of these tests might be better placed in `test/error_messages.coffee`.\n# TODO Some of these tests are duplicates.\n\n# Ensure that we always throw if we experience more than one super()\n# call in a constructor.  This ends up being a runtime error.\n# Should be caught at compile time.\ntest \"multiple super calls\", ->\n  throwsA = \"\"\"\n  class A\n    constructor: (@drink) ->\n    make: -> \"Making a #{@drink}\"\n\n  class MultiSuper extends A\n    constructor: (drink) ->\n      super(drink)\n      super(drink)\n      @newDrink = drink\n  new MultiSuper('Late').make()\n  \"\"\"\n  throws -> CoffeeScript.run throwsA, bare: yes\n\n# Basic test to ensure we can pass @params in a constuctor and\n# inheritance works correctly\ntest \"@ params\", ->\n  class A\n    constructor: (@drink, @shots, @flavor) ->\n    make: -> \"Making a #{@flavor} #{@drink} with #{@shots} shot(s)\"\n\n  a = new A('Machiato', 2, 'chocolate')\n  eq a.make(),  \"Making a chocolate Machiato with 2 shot(s)\"\n\n  class B extends A\n  b = new B('Machiato', 2, 'chocolate')\n  eq b.make(),  \"Making a chocolate Machiato with 2 shot(s)\"\n\n# Ensure we can accept @params with default parameters in a constructor\ntest \"@ params with defaults in a constructor\", ->\n  class A\n    # Multiple @ params with defaults\n    constructor: (@drink = 'Americano', @shots = '1', @flavor = 'caramel') ->\n    make: -> \"Making a #{@flavor} #{@drink} with #{@shots} shot(s)\"\n\n  a = new A()\n  eq a.make(),  \"Making a caramel Americano with 1 shot(s)\"\n\n# Ensure we can handle default constructors with class params\ntest \"@ params with class params\", ->\n  class Beverage\n    drink: 'Americano'\n    shots: '1'\n    flavor: 'caramel'\n\n  class A\n    # Class creation as a default param with `this`\n    constructor: (@drink = new Beverage()) ->\n  a = new A()\n  eq a.drink.drink, 'Americano'\n\n  beverage = new Beverage\n  class B\n    # class costruction with a default external param\n    constructor: (@drink = beverage) ->\n\n  b = new B()\n  eq b.drink.drink, 'Americano'\n\n  class C\n    # Default constructor with anonymous empty class\n    constructor: (@meta = class) ->\n  c = new C()\n  ok c.meta instanceof Function\n\ntest \"@ params without super, including errors\", ->\n  classA = \"\"\"\n  class A\n    constructor: (@drink) ->\n    make: -> \"Making a #{@drink}\"\n  a = new A('Machiato')\n  \"\"\"\n\n  throwsB = \"\"\"\n  class B extends A\n    #implied super\n    constructor: (@drink) ->\n  b = new B('Machiato')\n  \"\"\"\n  throwsCompileError classA + throwsB, bare: yes\n\ntest \"@ params super race condition\", ->\n  classA = \"\"\"\n  class A\n    constructor: (@drink) ->\n    make: -> \"Making a #{@drink}\"\n  \"\"\"\n\n  throwsB = \"\"\"\n  class B extends A\n    constructor: (@params) ->\n\n  b = new B('Machiato')\n  \"\"\"\n  throwsCompileError classA + throwsB, bare: yes\n\n  # Race condition with @ and super\n  throwsC = \"\"\"\n  class C extends A\n    constructor: (@params) ->\n      super(@params)\n\n  c = new C('Machiato')\n  \"\"\"\n  throwsCompileError classA + throwsC, bare: yes\n\n\ntest \"@ with super call\", ->\n  class D\n    make: -> \"Making a #{@drink}\"\n\n  class E extends D\n    constructor: (@drink) ->\n      super()\n\n  e = new E('Machiato')\n  eq e.make(),  \"Making a Machiato\"\n\ntest \"@ with splats and super call\", ->\n  class A\n    make: -> \"Making a #{@drink}\"\n\n  class B extends A\n    constructor: (@drink...) ->\n      super()\n\n  B = new B('Machiato')\n  eq B.make(),  \"Making a Machiato\"\n\n\ntest \"super and external constructors\", ->\n  # external constructor with @ param is allowed\n  ctorA = (@drink) ->\n  class A\n    constructor: ctorA\n    make: -> \"Making a #{@drink}\"\n  a = new A('Machiato')\n  eq a.make(),  \"Making a Machiato\"\n\n  # External constructor with super\n  throwsC = \"\"\"\n  class B\n    constructor: (@drink) ->\n    make: -> \"Making a #{@drink}\"\n\n  ctorC = (drink) ->\n    super(drink)\n\n  class C extends B\n    constructor: ctorC\n  c = new C('Machiato')\n  \"\"\"\n  throwsCompileError throwsC, bare: yes\n\n\ntest \"bound functions without super\", ->\n  # Bound function with @\n  # Throw on compile, since bound\n  # constructors are illegal\n  throwsA = \"\"\"\n  class A\n    constructor: (drink) =>\n      @drink = drink\n\n  \"\"\"\n  throwsCompileError throwsA, bare: yes\n\ntest \"super in a bound function in a constructor\", ->\n  throwsB = \"\"\"\n  class A\n  class B extends A\n    constructor: do => super\n  \"\"\"\n  throwsCompileError throwsB, bare: yes\n\ntest \"super in a bound function\", ->\n  class A\n    constructor: (@drink) ->\n    make: -> \"Making a #{@drink}\"\n\n  class B extends A\n    make: (@flavor) =>\n      super() + \" with #{@flavor}\"\n\n  b = new B('Machiato')\n  eq b.make('vanilla'),  \"Making a Machiato with vanilla\"\n\n  # super in a bound function in a bound function\n  class C extends A\n    make: (@flavor) =>\n      func = () =>\n        super() + \" with #{@flavor}\"\n      func()\n\n  c = new C('Machiato')\n  eq c.make('vanilla'), \"Making a Machiato with vanilla\"\n\n  # bound function in a constructor\n  class D extends A\n    constructor: (drink) ->\n      super(drink)\n      x = =>\n        eq @drink,  \"Machiato\"\n      x()\n  d = new D('Machiato')\n  eq d.make(),  \"Making a Machiato\"\n\n# duplicate\ntest \"super in a try/catch\", ->\n  classA = \"\"\"\n  class A\n    constructor: (param) ->\n      throw \"\" unless param\n  \"\"\"\n\n  throwsB = \"\"\"\n  class B extends A\n      constructor: ->\n        try\n          super()\n  \"\"\"\n\n  throwsC = \"\"\"\n  ctor = ->\n    try\n      super()\n\n  class C extends A\n      constructor: ctor\n  \"\"\"\n  throws -> CoffeeScript.run classA + throwsB, bare: yes\n  throws -> CoffeeScript.run classA + throwsC, bare: yes\n\ntest \"mixed ES6 and CS6 classes with a four-level inheritance chain\", ->\n  # Extended test\n  # ES2015+ class interoperability\n\n  ```\n  class Base {\n    constructor (greeting) {\n      this.greeting = greeting || 'hi';\n    }\n    func (string) {\n      return 'zero/' + string;\n    }\n    static  staticFunc (string) {\n      return 'static/' + string;\n    }\n  }\n  ```\n\n  class FirstChild extends Base\n    func: (string) ->\n      super('one/') + string\n\n\n  ```\n  class SecondChild extends FirstChild {\n    func (string) {\n      return super.func('two/' + string);\n    }\n  }\n  ```\n\n  thirdCtor = ->\n    @array = [1, 2, 3]\n\n  class ThirdChild extends SecondChild\n    constructor: ->\n      super()\n      thirdCtor.call this\n    func: (string) ->\n      super('three/') + string\n\n  result = (new ThirdChild).func 'four'\n  ok result is 'zero/one/two/three/four'\n  ok Base.staticFunc('word') is 'static/word'\n\n# exercise extends in a nested class\ntest \"nested classes with super\", ->\n  class Outer\n    constructor: ->\n      @label = 'outer'\n\n    class @Inner\n      constructor: ->\n        @label = 'inner'\n\n    class @ExtendedInner extends @Inner\n      constructor: ->\n        tmp = super()\n        @label = tmp.label + ' extended'\n\n    @extender: () =>\n      class ExtendedSelf extends @\n        constructor: ->\n          tmp = super()\n          @label = tmp.label + ' from this'\n      new ExtendedSelf\n\n  eq (new Outer).label, 'outer'\n  eq (new Outer.Inner).label, 'inner'\n  eq (new Outer.ExtendedInner).label, 'inner extended'\n  eq (Outer.extender()).label, 'outer from this'\n\ntest \"Static methods generate 'static' keywords\", ->\n  compile = \"\"\"\n  class CheckStatic\n    constructor: (@drink) ->\n    @className: -> 'CheckStatic'\n\n  c = new CheckStatic('Machiato')\n  \"\"\"\n  result = CoffeeScript.compile compile, bare: yes\n  ok result.match(' static ')\n\ntest \"Static methods in nested classes\", ->\n  class Outer\n    @name: -> 'Outer'\n\n    class @Inner\n      @name: -> 'Inner'\n\n  eq Outer.name(), 'Outer'\n  eq Outer.Inner.name(), 'Inner'\n\n\ntest \"mixed constructors with inheritance and ES6 super\", ->\n  identity = (f) -> f\n\n  class TopClass\n    constructor: (arg) ->\n      @prop = 'top-' + arg\n\n  ```\n  class SuperClass extends TopClass {\n    constructor (arg) {\n      identity(super('super-' + arg));\n    }\n  }\n  ```\n  class SubClass extends SuperClass\n    constructor: ->\n      identity super 'sub'\n\n  ok (new SubClass).prop is 'top-super-sub'\n\ntest \"ES6 static class methods can be overriden\", ->\n  class A\n    @name: -> 'A'\n\n  class B extends A\n    @name: -> 'B'\n\n  eq A.name(), 'A'\n  eq B.name(), 'B'\n\n# If creating static by direct assignment rather than ES6 static keyword\ntest \"ES6 Static methods should set `this` to undefined // ES6 \", ->\n  class A\n    @test: ->\n      eq this, undefined\n\n# Ensure that our object prototypes work with ES6\ntest \"ES6 prototypes can be overriden\", ->\n  class A\n    className: 'classA'\n\n  ```\n  class B {\n    test () {return \"B\";};\n  }\n  ```\n  b = new B\n  a = new A\n  eq a.className, 'classA'\n  eq b.test(), 'B'\n  Object.setPrototypeOf(b, a)\n  eq b.className, 'classA'\n  # This shouldn't throw,\n  # as we only change inheritance not object construction\n  # This may be an issue with ES, rather than CS construction?\n  #eq b.test(), 'B'\n\n  class D extends B\n  B::test = () -> 'D'\n  eq (new D).test(), 'D'\n\n# TODO: implement this error check\n# test \"ES6 conformance to extending non-classes\", ->\n#   A = (@title) ->\n#     'Title: ' + @\n\n#   class B extends A\n#   b = new B('caffeinated')\n#   eq b.title, 'caffeinated'\n\n#   # Check inheritance chain\n#   A::getTitle = () -> @title\n#   eq b.getTitle(), 'caffeinated'\n\n#   throwsC = \"\"\"\n#   C = {title: 'invalid'}\n#   class D extends {}\n#   \"\"\"\n#   # This should catch on compile and message should be \"class can only extend classes and functions.\"\n#   throws -> CoffeeScript.run throwsC, bare: yes\n\n# TODO: Evaluate future compliance with \"strict mode\";\n# test \"Class function environment should be in `strict mode`, ie as if 'use strict' was in use\", ->\n#   class A\n#     # this might be a meaningless test, since these are likely to be runtime errors and different\n#     # for every browser.  Thoughts?\n#     constructor: () ->\n#       # Ivalid: prop reassignment\n#       @state = {prop: [1], prop: {a: 'a'}}\n#       # eval reassignment\n#       @badEval = eval;\n\n#   # Should throw, but doesn't\n#   a = new A\n\ntest \"only one method named constructor allowed\", ->\n  throwsA = \"\"\"\n  class A\n    constructor: (@first) ->\n    constructor: (@last) ->\n  \"\"\"\n  throwsCompileError throwsA, bare: yes\n\ntest \"If the constructor of a child class does not call super,it should return an object.\", ->\n  nonce = {}\n\n  class A\n  class B extends A\n    constructor: ->\n      return nonce\n\n  eq nonce, new B\n\n\ntest \"super can only exist in extended classes\", ->\n  throwsA = \"\"\"\n  class A\n    constructor: (@name) ->\n      super()\n  \"\"\"\n  throwsCompileError throwsA, bare: yes\n\n# --- CS1 classes compatability breaks ---\ntest \"CS6 Class extends a CS1 compiled class\", ->\n  ```\n  // Generated by CoffeeScript 1.11.1\n  var BaseCS1, ExtendedCS1,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  BaseCS1 = (function() {\n    function BaseCS1(drink) {\n      this.drink = drink;\n    }\n\n    BaseCS1.prototype.make = function() {\n      return \"making a \" + this.drink;\n    };\n\n    BaseCS1.className = function() {\n      return 'BaseCS1';\n    };\n\n    return BaseCS1;\n\n  })();\n\n  ExtendedCS1 = (function(superClass) {\n    extend(ExtendedCS1, superClass);\n\n    function ExtendedCS1(flavor) {\n      this.flavor = flavor;\n      ExtendedCS1.__super__.constructor.call(this, 'cafe ole');\n    }\n\n    ExtendedCS1.prototype.make = function() {\n      return \"making a \" + this.drink + \" with \" + this.flavor;\n    };\n\n    ExtendedCS1.className = function() {\n      return 'ExtendedCS1';\n    };\n\n    return ExtendedCS1;\n\n  })(BaseCS1);\n\n  ```\n  class B extends BaseCS1\n  eq B.className(), 'BaseCS1'\n  b = new B('machiato')\n  eq b.make(), \"making a machiato\"\n\n\ntest \"CS6 Class extends an extended CS1 compiled class\", ->\n  ```\n  // Generated by CoffeeScript 1.11.1\n  var BaseCS1, ExtendedCS1,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  BaseCS1 = (function() {\n    function BaseCS1(drink) {\n      this.drink = drink;\n    }\n\n    BaseCS1.prototype.make = function() {\n      return \"making a \" + this.drink;\n    };\n\n    BaseCS1.className = function() {\n      return 'BaseCS1';\n    };\n\n    return BaseCS1;\n\n  })();\n\n  ExtendedCS1 = (function(superClass) {\n    extend(ExtendedCS1, superClass);\n\n    function ExtendedCS1(flavor) {\n      this.flavor = flavor;\n      ExtendedCS1.__super__.constructor.call(this, 'cafe ole');\n    }\n\n    ExtendedCS1.prototype.make = function() {\n      return \"making a \" + this.drink + \" with \" + this.flavor;\n    };\n\n    ExtendedCS1.className = function() {\n      return 'ExtendedCS1';\n    };\n\n    return ExtendedCS1;\n\n  })(BaseCS1);\n\n  ```\n  class B extends ExtendedCS1\n  eq B.className(), 'ExtendedCS1'\n  b = new B('vanilla')\n  eq b.make(), \"making a cafe ole with vanilla\"\n\ntest \"CS6 Class extends a CS1 compiled class with super()\", ->\n  ```\n  // Generated by CoffeeScript 1.11.1\n  var BaseCS1, ExtendedCS1,\n    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n    hasProp = {}.hasOwnProperty;\n\n  BaseCS1 = (function() {\n    function BaseCS1(drink) {\n      this.drink = drink;\n    }\n\n    BaseCS1.prototype.make = function() {\n      return \"making a \" + this.drink;\n    };\n\n    BaseCS1.className = function() {\n      return 'BaseCS1';\n    };\n\n    return BaseCS1;\n\n  })();\n\n  ExtendedCS1 = (function(superClass) {\n    extend(ExtendedCS1, superClass);\n\n    function ExtendedCS1(flavor) {\n      this.flavor = flavor;\n      ExtendedCS1.__super__.constructor.call(this, 'cafe ole');\n    }\n\n    ExtendedCS1.prototype.make = function() {\n      return \"making a \" + this.drink + \" with \" + this.flavor;\n    };\n\n    ExtendedCS1.className = function() {\n      return 'ExtendedCS1';\n    };\n\n    return ExtendedCS1;\n\n  })(BaseCS1);\n\n  ```\n  class B extends ExtendedCS1\n    constructor: (@shots) ->\n      super('caramel')\n    make: () ->\n      super() + \" and #{@shots} shots of espresso\"\n\n  eq B.className(), 'ExtendedCS1'\n  b = new B('three')\n  eq b.make(), \"making a cafe ole with caramel and three shots of espresso\"\n\ntest 'Bound method called normally before binding is ok', ->\n  class Base\n    constructor: ->\n      @setProp()\n      eq @derivedBound(), 3\n\n  class Derived extends Base\n    setProp: ->\n      @prop = 3\n\n    derivedBound: =>\n      @prop\n\n  d = new Derived\n\ntest 'Bound method called as callback after super() is ok', ->\n  class Base\n\n  class Derived extends Base\n    constructor: (@prop = 3) ->\n      super()\n      f = @derivedBound\n      eq f(), 3\n\n    derivedBound: =>\n      @prop\n\n  d = new Derived\n  {derivedBound} = d\n  eq derivedBound(), 3\n\ntest 'Bound method of base class called as callback is ok', ->\n  class Base\n    constructor: (@prop = 3) ->\n      f = @baseBound\n      eq f(), 3\n\n    baseBound: =>\n      @prop\n\n  b = new Base\n  {baseBound} = b\n  eq baseBound(), 3\n\ntest 'Bound method of prop-named class called as callback is ok', ->\n  Hive = {}\n  class Hive.Bee\n    constructor: (@prop = 3) ->\n      f = @baseBound\n      eq f(), 3\n\n    baseBound: =>\n      @prop\n\n  b = new Hive.Bee\n  {baseBound} = b\n  eq baseBound(), 3\n\ntest 'Bound method of class with expression base class called as callback is ok', ->\n  calledB = no\n  B = ->\n    throw new Error if calledB\n    calledB = yes\n    class\n  class A extends B()\n    constructor: (@prop = 3) ->\n      super()\n      f = @derivedBound\n      eq f(), 3\n\n    derivedBound: =>\n      @prop\n\n  b = new A\n  {derivedBound} = b\n  eq derivedBound(), 3\n\ntest 'Bound method of class with expression class name called as callback is ok', ->\n  calledF = no\n  obj = {}\n  B = class\n  f = ->\n    throw new Error if calledF\n    calledF = yes\n    obj\n  class f().A extends B\n    constructor: (@prop = 3) ->\n      super()\n      g = @derivedBound\n      eq g(), 3\n\n    derivedBound: =>\n      @prop\n\n  a = new obj.A\n  {derivedBound} = a\n  eq derivedBound(), 3\n\ntest 'Bound method of anonymous child class called as callback is ok', ->\n  f = ->\n    B = class\n    class extends B\n      constructor: (@prop = 3) ->\n        super()\n        g = @derivedBound\n        eq g(), 3\n\n      derivedBound: =>\n        @prop\n\n  a = new (f())\n  {derivedBound} = a\n  eq derivedBound(), 3\n\ntest 'Bound method of immediately instantiated class with expression base class called as callback is ok', ->\n  calledF = no\n  obj = {}\n  B = class\n  f = ->\n    throw new Error if calledF\n    calledF = yes\n    obj\n  a = new class f().A extends B\n    constructor: (@prop = 3) ->\n      super()\n      g = @derivedBound\n      eq g(), 3\n\n    derivedBound: =>\n      @prop\n\n  {derivedBound} = a\n  eq derivedBound(), 3\n\ntest \"#4591: super.x.y, super['x'].y\", ->\n  class A\n    x:\n      y: 1\n      z: -> 2\n\n  class B extends A\n    constructor: ->\n      super()\n\n      @w = super.x.y\n      @v = super['x'].y\n      @u = super.x['y']\n      @t = super.x.z()\n      @s = super['x'].z()\n      @r = super.x['z']()\n\n  b = new B\n  eq 1, b.w\n  eq 1, b.v\n  eq 1, b.u\n  eq 2, b.t\n  eq 2, b.s\n  eq 2, b.r\n\ntest \"#4464: backticked expressions in class body\", ->\n  class A\n    `get x() { return 42; }`\n\n  class B\n    `get x() { return 42; }`\n    constructor: ->\n      @y = 84\n\n  a = new A\n  eq 42, a.x\n  b = new B\n  eq 42, b.x\n  eq 84, b.y\n\ntest \"#4724: backticked expression in a class body with hoisted member\", ->\n  class A\n    `get x() { return 42; }`\n    hoisted: 84\n\n  a = new A\n  eq 42, a.x\n  eq 84, a.hoisted\n\ntest \"#4822: nested anonymous classes use non-conflicting variable names\", ->\n  Class = class\n    @a: class\n      @b: 1\n\n  eq Class.a.b, 1\n\ntest \"#4827: executable class body wrappers have correct context\", ->\n  test = ->\n    class @A\n    class @B extends @A\n      @property = 1\n\n  o = {}\n  test.call o\n  ok typeof o.A is typeof o.B is 'function'\n\ntest \"#4868: Incorrect ‘Can’t call super with @params’ error\", ->\n  class A\n    constructor: (@func = ->) ->\n      @x = 1\n      @func()\n\n  class B extends A\n    constructor: ->\n      super -> @x = 2\n\n  a = new A\n  b = new B\n  eq 1, a.x\n  eq 2, b.x\n\n  class C\n    constructor: (@c = class) -> @c\n\n  class D extends C\n    constructor: ->\n      super class then constructor: (@a) -> @a = 3\n\n  d = new (new D).c\n  eq 3, d.a\n\ntest \"#4609: Support new.target\", ->\n  class A\n    constructor: ->\n      @calledAs = new.target.name\n\n  class B extends A\n\n  b = new B\n  eq b.calledAs, 'B'\n\n  newTarget = null\n  Foo = ->\n    newTarget = !!new.target\n\n  Foo()\n  eq newTarget, no\n\n  newTarget = null\n\n  new Foo()\n  eq newTarget, yes\n\ntest \"#5323: new.target can be the argument of a function\", ->\n  fn = (arg) -> arg\n  fn new.target\n\ntest \"#5085: Bug: @ reference to class not maintained in do block\", ->\n  thisFoo = 'initial foo'\n  thisBar = 'initial bar'\n  fn = (o) -> o.bar()\n\n  class A\n    @foo = 'foo assigned in class'\n    do => thisFoo = @foo\n    fn bar: => thisBar = @foo\n\n  eq thisFoo, 'foo assigned in class'\n  eq thisBar, 'foo assigned in class'\n\ntest \"#5204: Computed class property\", ->\n  foo = 'bar'\n  class A\n    [foo]: 'baz'\n  a = new A()\n  eq a.bar, 'baz'\n  eq A::bar, 'baz'\n\ntest \"#5204: Static computed class property\", ->\n  foo = 'bar'\n  qux = 'quux'\n  class A\n    @[foo]: 'baz'\n    @[qux]: -> 3\n  eq A.bar, 'baz'\n  eq A.quux(), 3\n"
  },
  {
    "path": "test/cluster.coffee",
    "content": "# Cluster Module\n# ---------\n\nreturn if testingBrowser?\n\ncluster = require 'cluster'\n\nif cluster.isMaster\n  test \"#2737 - cluster module can spawn workers from a coffeescript process\", ->\n    cluster.once 'exit', (worker, code) ->\n      eq code, 0\n\n    cluster.fork()\nelse\n  process.exit 0\n"
  },
  {
    "path": "test/comments.coffee",
    "content": "# Comments\n# --------\n\n# * Single-Line Comments\n# * Block Comments\n\n# Note: awkward spacing seen in some tests is likely intentional.\n\ntest \"comments in objects\", ->\n  obj1 = {\n  # comment\n    # comment\n      # comment\n    one: 1\n  # comment\n    two: 2\n      # comment\n  }\n\n  ok Object::hasOwnProperty.call(obj1,'one')\n  eq obj1.one, 1\n  ok Object::hasOwnProperty.call(obj1,'two')\n  eq obj1.two, 2\n\ntest \"comments in YAML-style objects\", ->\n  obj2 =\n  # comment\n    # comment\n      # comment\n    three: 3\n  # comment\n    four: 4\n      # comment\n\n  ok Object::hasOwnProperty.call(obj2,'three')\n  eq obj2.three, 3\n  ok Object::hasOwnProperty.call(obj2,'four')\n  eq obj2.four, 4\n\ntest \"comments following operators that continue lines\", ->\n  sum =\n    1 +\n    1 + # comment\n    1\n  eq 3, sum\n\ntest \"comments in functions\", ->\n  fn = ->\n  # comment\n    false\n    false   # comment\n    false\n    # comment\n\n  # comment before return\n    true\n\n  ok fn()\n\n  fn2 = -> #comment\n    fn()\n    # comment after return\n\n  ok fn2()\n\ntest \"trailing comment before an outdent\", ->\n  nonce = {}\n  fn3 = ->\n    if true\n      undefined # comment\n    nonce\n\n  eq nonce, fn3()\n\ntest \"comments in a switch\", ->\n  nonce = {}\n  result = switch nonce #comment\n    # comment\n    when false then undefined\n    # comment\n    when null #comment\n      undefined\n    else nonce # comment\n\n  eq nonce, result\n\ntest \"comment with conditional statements\", ->\n  nonce = {}\n  result = if false # comment\n    undefined\n  #comment\n  else # comment\n    nonce\n    # comment\n  eq nonce, result\n\ntest \"spaced comments with conditional statements\", ->\n  nonce = {}\n  result = if false\n    undefined\n\n  # comment\n  else if false\n    undefined\n\n  # comment\n  else\n    nonce\n\n  eq nonce, result\n\n\n# Block Comments\n\n###\n  This is a here-comment.\n  Kind of like a heredoc.\n###\n\ntest \"block comments in objects\", ->\n  a = {}\n  b = {}\n  obj = {\n    a: a\n    ###\n    block comment in object\n    ###\n    b: b\n  }\n\n  eq a, obj.a\n  eq b, obj.b\n\ntest \"block comments in YAML-style\", ->\n  a = {}\n  b = {}\n  obj =\n    a: a\n    ###\n    block comment in YAML-style\n    ###\n    b: b\n\n  eq a, obj.a\n  eq b, obj.b\n\n\ntest \"block comments in functions\", ->\n  nonce = {}\n\n  fn1 = ->\n    true\n    ###\n    false\n    ###\n\n  ok fn1()\n\n  fn2 = ->\n    ###\n    block comment in function 1\n    ###\n    nonce\n\n  eq nonce, fn2()\n\n  fn3 = ->\n    nonce\n  ###\n  block comment in function 2\n  ###\n\n  eq nonce, fn3()\n\n  fn4 = ->\n    one = ->\n      ###\n        block comment in function 3\n      ###\n      two = ->\n        three = ->\n          nonce\n\n  eq nonce, fn4()()()()\n\ntest \"block comments inside class bodies\", ->\n  class A\n    a: ->\n\n    ###\n    Comment in class body 1\n    ###\n    b: ->\n\n  ok A.prototype.b instanceof Function\n\n  class B\n    ###\n    Comment in class body 2\n    ###\n    a: ->\n    b: ->\n\n  ok B.prototype.a instanceof Function\n\ntest \"#2037: herecomments shouldn't imply line terminators\", ->\n  do (-> ### ###yes; fail)\n\ntest \"#2916: block comment before implicit call with implicit object\", ->\n  fn = (obj) -> ok obj.a\n  ### ###\n  fn\n    a: yes\n\ntest \"#3132: Format single-line block comment nicely\", ->\n  eqJS \"\"\"\n  ### Single-line block comment without additional space here => ###\"\"\",\n  \"\"\"\n  /* Single-line block comment without additional space here => */\n  \"\"\"\n\ntest \"#3132: Format multiline block comment nicely\", ->\n  eqJS \"\"\"\n  ###\n  # Multiline\n  # block\n  # comment\n  ###\"\"\",\n  \"\"\"\n  /*\n   * Multiline\n   * block\n   * comment\n   */\n  \"\"\"\n\ntest \"#3132: Format simple block comment nicely\", ->\n  eqJS \"\"\"\n  ###\n  No\n  Preceding hash\n  ###\"\"\",\n  \"\"\"\n  /*\n  No\n  Preceding hash\n  */\n  \"\"\"\n\n\ntest \"#3132: Format indented block-comment nicely\", ->\n  eqJS \"\"\"\n  fn = ->\n    ###\n    # Indented\n    Multiline\n    ###\n    1\"\"\",\n  \"\"\"\n  var fn;\n\n  fn = function() {\n    /*\n     * Indented\n    Multiline\n     */\n    return 1;\n  };\n  \"\"\"\n\n# Although adequately working, block comment-placement is not yet perfect.\n# (Considering a case where multiple variables have been declared …)\ntest \"#3132: Format jsdoc-style block-comment nicely\", ->\n  eqJS \"\"\"\n  ###*\n  # Multiline for jsdoc-\"@doctags\"\n  #\n  # @type {Function}\n  ###\n  fn = () -> 1\n  \"\"\",\n  \"\"\"\n  /**\n   * Multiline for jsdoc-\"@doctags\"\n   *\n   * @type {Function}\n   */\n  var fn;\n\n  fn = function() {\n    return 1;\n  };\"\"\"\n\n# Although adequately working, block comment-placement is not yet perfect.\n# (Considering a case where multiple variables have been declared …)\ntest \"#3132: Format hand-made (raw) jsdoc-style block-comment nicely\", ->\n  eqJS \"\"\"\n  ###*\n   * Multiline for jsdoc-\"@doctags\"\n   *\n   * @type {Function}\n  ###\n  fn = () -> 1\n  \"\"\",\n  \"\"\"\n  /**\n   * Multiline for jsdoc-\"@doctags\"\n   *\n   * @type {Function}\n   */\n  var fn;\n\n  fn = function() {\n    return 1;\n  };\"\"\"\n\n# Although adequately working, block comment-placement is not yet perfect.\n# (Considering a case where multiple variables have been declared …)\ntest \"#3132: Place block-comments nicely\", ->\n  eqJS \"\"\"\n  ###*\n  # A dummy class definition\n  #\n  # @class\n  ###\n  class DummyClass\n\n    ###*\n    # @constructor\n    ###\n    constructor: ->\n\n    ###*\n    # Singleton reference\n    #\n    # @type {DummyClass}\n    ###\n    @instance = new DummyClass()\n\n  \"\"\",\n  \"\"\"\n  /**\n   * A dummy class definition\n   *\n   * @class\n   */\n  var DummyClass;\n\n  DummyClass = (function() {\n    class DummyClass {\n      /**\n       * @constructor\n       */\n      constructor() {}\n\n    };\n\n    /**\n     * Singleton reference\n     *\n     * @type {DummyClass}\n     */\n    DummyClass.instance = new DummyClass();\n\n    return DummyClass;\n\n  }).call(this);\"\"\"\n\ntest \"#3638: Demand a whitespace after # symbol\", ->\n  eqJS \"\"\"\n  ###\n  #No\n  #whitespace\n  ###\"\"\",\n  \"\"\"\n  /*\n  #No\n  #whitespace\n   */\"\"\"\n\n\ntest \"#3761: Multiline comment at end of an object\", ->\n  anObject =\n    x: 3\n    ###\n    #Comment\n    ###\n\n  ok anObject.x is 3\n\ntest \"#4375: UTF-8 characters in comments\", ->\n  # 智に働けば角が立つ、情に掉させば流される。\n  ok yes\n\ntest \"#4290: Block comments in array literals\", ->\n  arr = [\n    ###  ###\n    3\n    ###\n      What is the meaning of life, the universe, and everything?\n    ###\n    42\n  ]\n  arrayEq arr, [3, 42]\n\ntest \"Block comments in array literals are properly indented 1\", ->\n  eqJS '''\n  arr = [\n    ### ! ###\n    3\n    42\n  ]''', '''\n  var arr;\n\n  arr = [/* ! */ 3, 42];'''\n\ntest \"Block comments in array literals are properly indented 2\", ->\n  eqJS '''\n  arr = [\n    ###  ###\n    3\n    ###\n      What is the meaning of life, the universe, and everything?\n    ###\n    42\n  ]''', '''\n  var arr;\n\n  arr = [\n    /*  */\n    3,\n    /*\n      What is the meaning of life, the universe, and everything?\n    */\n    42\n  ];'''\n\ntest \"Block comments in array literals are properly indented 3\", ->\n  eqJS '''\n  arr = [\n    ###\n      How many stooges are there?\n    ###\n    3\n    ### Who’s on first? ###\n    'Who'\n  ]''', '''\n  var arr;\n\n  arr = [\n    /*\n      How many stooges are there?\n    */\n    3,\n    /* Who’s on first? */\n    'Who'\n  ];'''\n\ntest \"Block comments in array literals are properly indented 4\", ->\n  eqJS '''\n  if yes\n    arr = [\n      1\n      ###\n        How many stooges are there?\n      ###\n      3\n      ### Who’s on first? ###\n      'Who'\n    ]''', '''\n  var arr;\n\n  if (true) {\n    arr = [\n      1,\n      /*\n        How many stooges are there?\n      */\n      3,\n      /* Who’s on first? */\n      'Who'\n    ];\n  }'''\n\ntest \"Line comments in array literals are properly indented 1\", ->\n  eqJS '''\n  arr = [\n    # How many stooges are there?\n    3\n    # Who’s on first?\n    'Who'\n  ]''', '''\n  var arr;\n\n  arr = [\n    // How many stooges are there?\n    3,\n    // Who’s on first?\n    'Who'\n  ];'''\n\ntest \"Line comments in array literals are properly indented 2\", ->\n  eqJS '''\n  arr = [\n    # How many stooges are there?\n    3\n    # Who’s on first?\n    'Who'\n    # Who?\n    {\n      firstBase: 'Who'\n      secondBase: 'What'\n      leftField: 'Why'\n    }\n  ]''', '''\n  var arr;\n\n  arr = [\n    // How many stooges are there?\n    3,\n    // Who’s on first?\n    'Who',\n    {\n      // Who?\n      firstBase: 'Who',\n      secondBase: 'What',\n      leftField: 'Why'\n    }\n  ];'''\n\ntest \"Block comments trailing their attached token are properly indented\", ->\n  eqJS '''\n  if indented\n    if indentedAgain\n      a\n      ###\n        Multiline\n        comment\n      ###\n    a\n  ''', '''\n  if (indented) {\n    if (indentedAgain) {\n      a;\n    }\n    /*\n      Multiline\n      comment\n    */\n    a;\n  }\n  '''\n\ntest \"Comments in proper order 1\", ->\n  eqJS '''\n  # 1\n  ### 2 ###\n  # 3\n  ''', '''\n  // 1\n  /* 2 */\n  // 3\n  '''\n\ntest \"Comments in proper order 2\", ->\n  eqJS '''\n  if indented\n    # 1\n    ### 2 ###\n    # 3\n    a\n  ''', '''\n  if (indented) {\n    // 1\n    /* 2 */\n    // 3\n    a;\n  }\n  '''\n\ntest \"Line comment above interpolated string\", ->\n  eqJS '''\n  if indented\n    # comment\n    \"#{1}\"\n  ''', '''\n  if (indented) {\n    // comment\n    `${1}`;\n  }'''\n\ntest \"Line comment above interpolated string object key\", ->\n  eqJS '''\n  {\n    # comment\n    \"#{1}\": 2\n  }\n  ''', '''\n  ({\n    // comment\n    [`${1}`]: 2\n  });'''\n\ntest \"Line comments in classes are properly indented\", ->\n  eqJS '''\n  class A extends B\n    # This is a fine class.\n    # I could tell you all about it, but what else do you need to know?\n    constructor: ->\n      # Something before `super`\n      super()\n\n    # This next method is a doozy!\n    # A doozy, I tell ya!\n    method: ->\n      # Whoa.\n      # Can you believe it?\n      no\n\n    ### Look out, incoming! ###\n    anotherMethod: ->\n      ### Ha! ###\n      off\n  ''', '''\n  var A;\n\n  A = class A extends B {\n    // This is a fine class.\n    // I could tell you all about it, but what else do you need to know?\n    constructor() {\n      // Something before `super`\n      super();\n    }\n\n    // This next method is a doozy!\n    // A doozy, I tell ya!\n    method() {\n      // Whoa.\n      // Can you believe it?\n      return false;\n    }\n\n    /* Look out, incoming! */\n    anotherMethod() {\n      /* Ha! */\n      return false;\n    }\n\n  };'''\n\ntest \"Line comments are properly indented\", ->\n  eqJS '''\n  # Unindented comment\n  if yes\n    # Comment indented one tab\n    1\n    if yes\n      # Comment indented two tabs\n      2\n    else\n      # Another comment indented two tabs\n      # Yet another comment indented two tabs\n      3\n  else\n    # Another comment indented one tab\n    # Yet another comment indented one tab\n    4\n\n  # Another unindented comment''', '''\n  // Unindented comment\n  if (true) {\n    // Comment indented one tab\n    1;\n    if (true) {\n      // Comment indented two tabs\n      2;\n    } else {\n      // Another comment indented two tabs\n      // Yet another comment indented two tabs\n      3;\n    }\n  } else {\n    // Another comment indented one tab\n    // Yet another comment indented one tab\n    4;\n  }\n\n  // Another unindented comment'''\n\ntest \"Line comments that trail code, followed by line comments that start a new line\", ->\n  eqJS '''\n  a = ->\n    b 1 # Trailing comment\n\n  # Comment that starts a new line\n  2\n  ''', '''\n  var a;\n\n  a = function() {\n    return b(1); // Trailing comment\n  };\n\n\n  // Comment that starts a new line\n  2;\n  '''\n\ntest \"Empty lines between comments are preserved\", ->\n  eqJS '''\n  if indented\n    # 1\n\n    # 2\n    3\n  ''', '''\n  if (indented) {\n    // 1\n\n    // 2\n    3;\n  }'''\n\ntest \"Block comment in an interpolated string\", ->\n  eqJS '\"a#{### Comment ###}b\"', '`a${/* Comment */\"\"}b`;'\n  eqJS '\"a#{### 1 ###}b#{### 2 ###}c\"', '`a${/* 1 */\"\"}b${/* 2 */\"\"}c`;'\n\ntest \"#4629: Block comment in JSX interpolation\", ->\n  eqJS '<div>{### Comment ###}</div>', '<div>{/* Comment */}</div>;'\n  eqJS '''\n  <div>\n  {###\n    Multiline\n    Comment\n  ###}\n  </div>''', '''\n  <div>\n  {/*\n    Multiline\n    Comment\n  */}\n  </div>;'''\n\ntest \"Line comment in an interpolated string\", ->\n  eqJS '''\n  \"a#{# Comment\n  1}b\"\n  ''', '''\n  `a${// Comment\n  1}b`;'''\n\ntest \"Line comments before `throw`\", ->\n  eqJS '''\n  if indented\n    1/0\n    # Uh-oh!\n    # You really shouldn’t have done that.\n    throw DivideByZeroError()\n  ''', '''\n  if (indented) {\n    1 / 0;\n    // Uh-oh!\n    // You really shouldn’t have done that.\n    throw DivideByZeroError();\n  }'''\n\ntest \"Comments before if this exists\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Comment\n  if @huh?\n    2\n  '''\n  ok js.includes '// Comment'\n\ntest \"Comment before unary (`not`)\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Comment\n  if not doubleNegative\n    dontDoIt()\n  '''\n  ok js.includes '// Comment'\n\ntest \"Comments before postfix\", ->\n  js = CoffeeScript.compile '''\n  # 1\n  2\n\n  # 3\n  return unless window?\n\n  ### 4 ###\n  return if global?\n  '''\n  ok js.includes '// 3'\n  ok js.includes '/* 4 */'\n\ntest \"Comments before assignment if\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Line comment\n  a = if b\n    3\n  else\n    4\n\n  ### Block comment ###\n  c = if d\n    5\n  '''\n  ok js.includes '// Line comment'\n  ok js.includes '/* Block comment */'\n\ntest \"Comments before for loop\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Comment\n  for drop in ocean\n    drink drop\n  '''\n  ok js.includes '// Comment'\n\ntest \"Comments after for loop\", ->\n  js = CoffeeScript.compile '''\n  for drop in ocean # Comment after source variable\n    drink drop\n  for i in [1, 2] # Comment after array literal element\n    count i\n  for key, val of {a: 1} # Comment after object literal\n    turn key\n  '''\n  ok js.includes '// Comment after source variable'\n  ok js.includes '// Comment after array literal element'\n  ok js.includes '// Comment after object literal'\n\ntest \"Comments before soak\", ->\n  js = CoffeeScript.compile '''\n  # 1\n  2\n\n  # 3\n  return unless window?.location?.hash\n\n  ### 4 ###\n  return if process?.env?.ENV\n  '''\n  ok js.includes '// 3'\n  ok js.includes '/* 4 */'\n\ntest \"Comments before splice\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Comment\n  a[1..2] = [1, 2, 3]\n  '''\n  ok js.includes '// Comment'\n\ntest \"Comments before object destructuring\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Comment before splat token\n  { x... } = { a: 1, b: 2 }\n\n  # Comment before destructured token\n  { x, y, z... } = { x: 1, y: 2, a: 3, b: 4 }\n  '''\n  ok js.includes 'Comment before splat token'\n  ok js.includes 'Comment before destructured token'\n\ntest \"Comment before splat function parameter\", ->\n  js = CoffeeScript.compile '''\n  1\n  # Comment\n  (blah..., yadda) ->\n  '''\n  ok js.includes 'Comment'\n\ntest \"Comments before static method\", ->\n  eqJS '''\n  class Child extends Base\n    # Static method:\n    @method = ->\n  ''', '''\n  var Child;\n\n  Child = class Child extends Base {\n    // Static method:\n    static method() {}\n\n  };'''\n\ntest \"Comment before method that calls `super()`\", ->\n  eqJS '''\n  class Dismissed\n    # Before a method calling `super`\n    method: ->\n      super()\n  ''', '''\n  var Dismissed;\n\n  Dismissed = class Dismissed {\n    // Before a method calling `super`\n    method() {\n      return super.method();\n    }\n\n  };\n  '''\n\ntest \"Comment in interpolated regex\", ->\n  js = CoffeeScript.compile '''\n  1\n  ///\n    #{1}\n    # Comment\n  ///\n  '''\n  ok js.includes 'Comment'\n\ntest \"Line comment after line continuation\", ->\n  eqJS '''\n  1 + \\\\ # comment\n    2\n  ''', '''\n  1 + 2; // comment\n  '''\n\ntest \"Comments appear above scope `var` declarations\", ->\n  eqJS '''\n  # @flow\n\n  fn = (str) -> str\n  ''', '''\n  // @flow\n  var fn;\n\n  fn = function(str) {\n    return str;\n  };'''\n\ntest \"Block comments can appear with function arguments\", ->\n  eqJS '''\n  fn = (str ###: string ###, num ###: number ###) -> str + num\n  ''', '''\n  var fn;\n\n  fn = function(str/*: string */, num/*: number */) {\n    return str + num;\n  };'''\n\ntest \"Block comments can appear between function parameters and function opening brace\", ->\n  eqJS '''\n  fn = (str ###: string ###, num ###: number ###) ###: string ### ->\n    str + num\n  ''', '''\n  var fn;\n\n  fn = function(str/*: string */, num/*: number */)/*: string */ {\n    return str + num;\n  };'''\n\ntest \"Flow comment-based syntax support\", ->\n  eqJS '''\n  # @flow\n\n  fn = (str ###: string ###, num ###: number ###) ###: string ### ->\n    str + num\n  ''', '''\n  // @flow\n  var fn;\n\n  fn = function(str/*: string */, num/*: number */)/*: string */ {\n    return str + num;\n  };'''\n\ntest \"#4706: Flow comments around function parameters\", ->\n  eqJS '''\n  identity = ###::<T>### (value ###: T ###) ###: T ### ->\n    value\n  ''', '''\n  var identity;\n\n  identity = function/*::<T>*/(value/*: T */)/*: T */ {\n    return value;\n  };'''\n\ntest \"#4706: Flow comments around function parameters\", ->\n  eqJS '''\n  copy = arr.map(###:: <T> ###(item ###: T ###) ###: T ### => item)\n  ''', '''\n  var copy;\n\n  copy = arr.map(/*:: <T> */(item/*: T */)/*: T */ => {\n    return item;\n  });'''\n\ntest \"#4706: Flow comments after class name\", ->\n  eqJS '''\n  class Container ###::<T> ###\n    method: ###::<U> ### () -> true\n  ''', '''\n  var Container;\n\n  Container = class Container/*::<T> */ {\n    method/*::<U> */() {\n      return true;\n    }\n\n  };'''\n\ntest \"#4706: Identifiers with comments wrapped in parentheses remain wrapped\", ->\n  eqJS '(arr ###: Array<number> ###)', '(arr/*: Array<number> */);'\n  eqJS 'other = (arr ###: any ###)', '''\n  var other;\n\n  other = (arr/*: any */);'''\n\ntest \"#4706: Flow comments before class methods\", ->\n  eqJS '''\n  class Container\n    ###::\n    method: (number) => string;\n    method: (string) => number;\n    ###\n    method: -> true\n  ''', '''\n  var Container;\n\n  Container = class Container {\n    /*::\n    method: (number) => string;\n    method: (string) => number;\n    */\n    method() {\n      return true;\n    }\n\n  };'''\n\ntest \"#4706: Flow comments for class method params\", ->\n  eqJS '''\n  class Container\n    method: (param ###: string ###) -> true\n  ''', '''\n  var Container;\n\n  Container = class Container {\n    method(param/*: string */) {\n      return true;\n    }\n\n  };'''\n\ntest \"#4706: Flow comments for class method returns\", ->\n  eqJS '''\n  class Container\n    method: () ###: string ### -> true\n  ''', '''\n  var Container;\n\n  Container = class Container {\n    method()/*: string */ {\n      return true;\n    }\n\n  };'''\n\ntest \"#4706: Flow comments for function spread\", ->\n  eqJS '''\n  method = (...rest ###: Array<string> ###) =>\n  ''', '''\n  var method;\n\n  method = (...rest/*: Array<string> */) => {};'''\n\ntest \"#4747: Flow comments for local variable declaration\", ->\n  eqJS 'a ###: number ### = 1', '''\n  var a/*: number */;\n\n  a = 1;\n  '''\n\ntest \"#4747: Flow comments for local variable declarations\", ->\n  eqJS '''\n  a ###: number ### = 1\n  b ###: string ### = 'c'\n  ''', '''\n  var a/*: number */, b/*: string */;\n\n  a = 1;\n\n  b = 'c';\n  '''\n\ntest \"#4747: Flow comments for local variable declarations with reassignment\", ->\n  eqJS '''\n  a ###: number ### = 1\n  b ###: string ### = 'c'\n  a ### some other comment ### = 2\n  ''', '''\n  var a/*: number */, b/*: string */;\n\n  a = 1;\n\n  b = 'c';\n\n  a/* some other comment */ = 2;\n  '''\n\ntest \"#4756: Comment before ? operation\", ->\n  eqJS '''\n  do ->\n    ### Comment ###\n    @foo ? 42\n  ''', '''\n  (function() {\n    var ref;\n    /* Comment */\n    return (ref = this.foo) != null ? ref : 42;\n  })();\n  '''\n\ntest \"#5241: Comment after :\", ->\n  eqJS '''\n  return\n    a: # Comment\n      b: 1\n  ''', '''\n  return {\n    a: { // Comment\n      b: 1\n    }\n  };\n  '''\n"
  },
  {
    "path": "test/compilation.coffee",
    "content": "# Compilation\n# -----------\n\n# Helper to pipe the CoffeeScript compiler’s output through a transpiler.\ntranspile = (method, code, options = {}) ->\n  # `method` should be 'compile' or 'eval' or 'run'\n  options.bare = yes\n  options.transpile =\n    # Target Internet Explorer 6, which supports no ES2015+ features.\n    presets: [['@babel/env', {targets: browsers: ['ie 6']}]]\n  CoffeeScript[method] code, options\n\n\ntest \"ensure that carriage returns don't break compilation on Windows\", ->\n  doesNotThrowCompileError 'one\\r\\ntwo', bare: on\n\ntest \"#3089 - don't mutate passed in options to compile\", ->\n  opts = {}\n  CoffeeScript.compile '1 + 1', opts\n  ok !opts.scope\n\ntest \"--bare\", ->\n  eq -1, CoffeeScript.compile('x = y', bare: on).indexOf 'function'\n  ok 'passed' is CoffeeScript.eval '\"passed\"', bare: on, filename: 'test'\n\ntest \"header (#1778)\", ->\n  header = \"// Generated by CoffeeScript #{CoffeeScript.VERSION}\\n\"\n  eq 0, CoffeeScript.compile('x = y', header: on).indexOf header\n\ntest \"header is disabled by default\", ->\n  header = \"// Generated by CoffeeScript #{CoffeeScript.VERSION}\\n\"\n  eq -1, CoffeeScript.compile('x = y').indexOf header\n\ntest \"multiple generated references\", ->\n  a = {b: []}\n  a.b[true] = -> this == a.b\n  c = 0\n  d = []\n  ok a.b[0<++c<2] d...\n\ntest \"splat on a line by itself is invalid\", ->\n  throwsCompileError \"x 'a'\\n...\\n\"\n\ntest \"Issue 750\", ->\n\n  throwsCompileError 'f(->'\n\n  throwsCompileError 'a = (break)'\n\n  throwsCompileError 'a = (return 5 for item in list)'\n\n  throwsCompileError 'a = (return 5 while condition)'\n\n  throwsCompileError 'a = for x in y\\n  return 5'\n\ntest \"Issue #986: Unicode identifiers\", ->\n  λ = 5\n  eq λ, 5\n\ntest \"#2516: Unicode spaces should not be part of identifiers\", ->\n  a = (x) -> x * 2\n  b = 3\n  eq 6, a b # U+00A0 NO-BREAK SPACE\n  eq 6, a b # U+1680 OGHAM SPACE MARK\n  eq 6, a b # U+2000 EN QUAD\n  eq 6, a b # U+2001 EM QUAD\n  eq 6, a b # U+2002 EN SPACE\n  eq 6, a b # U+2003 EM SPACE\n  eq 6, a b # U+2004 THREE-PER-EM SPACE\n  eq 6, a b # U+2005 FOUR-PER-EM SPACE\n  eq 6, a b # U+2006 SIX-PER-EM SPACE\n  eq 6, a b # U+2007 FIGURE SPACE\n  eq 6, a b # U+2008 PUNCTUATION SPACE\n  eq 6, a b # U+2009 THIN SPACE\n  eq 6, a b # U+200A HAIR SPACE\n  eq 6, a b # U+202F NARROW NO-BREAK SPACE\n  eq 6, a b # U+205F MEDIUM MATHEMATICAL SPACE\n  eq 6, a　b # U+3000 IDEOGRAPHIC SPACE\n\n  # #3560: Non-breaking space (U+00A0) (before `'c'`)\n  eq 5, {c: 5}[ 'c' ]\n\n  # A line where every space in non-breaking\n  eq 1 + 1, 2  \n\ntest \"don't accidentally stringify keywords\", ->\n  ok (-> this == 'this')() is false\n\ntest \"#1026: no if/else/else allowed\", ->\n  throwsCompileError '''\n    if a\n      b\n    else\n      c\n    else\n      d\n  '''\n\ntest \"#1050: no closing asterisk comments from within block comments\", ->\n  throwsCompileError \"### */ ###\"\n\ntest \"#1273: escaping quotes at the end of heredocs\", ->\n  throwsCompileError '\"\"\"\\\\\"\"\"' # \"\"\"\\\"\"\"\n  throwsCompileError '\"\"\"\\\\\\\\\\\\\"\"\"' # \"\"\"\\\\\\\"\"\"\n\ntest \"#1106: __proto__ compilation\", ->\n  object = eq\n  @[\"__proto__\"] = true\n  ok __proto__\n\ntest \"reference named hasOwnProperty\", ->\n  CoffeeScript.compile 'hasOwnProperty = 0; a = 1'\n\ntest \"#1055: invalid keys in real (but not work-product) objects\", ->\n  throwsCompileError \"@key: value\"\n\ntest \"#1066: interpolated strings are not implicit functions\", ->\n  throwsCompileError '\"int#{er}polated\" arg'\n\ntest \"#2846: while with empty body\", ->\n  CoffeeScript.compile 'while 1 then', {sourceMap: true}\n\ntest \"#2944: implicit call with a regex argument\", ->\n  CoffeeScript.compile 'o[key] /regex/'\n\ntest \"#3001: `own` shouldn't be allowed in a `for`-`in` loop\", ->\n  throwsCompileError \"a for own b in c\"\n\ntest \"#2994: single-line `if` requires `then`\", ->\n  throwsCompileError \"if b else x\"\n\ntest \"transpile option, for Node API CoffeeScript.compile\", ->\n  return if global.testingBrowser\n  ok transpile('compile', \"import fs from 'fs'\").includes 'require'\n\ntest \"transpile option, for Node API CoffeeScript.eval\", ->\n  return if global.testingBrowser\n  ok transpile 'eval', \"import path from 'path'; path.sep in ['/', '\\\\\\\\']\"\n\ntest \"transpile option, for Node API CoffeeScript.run\", ->\n  return if global.testingBrowser\n  doesNotThrow -> transpile 'run', \"import fs from 'fs'\"\n\ntest \"transpile option has merged source maps\", ->\n  return if global.testingBrowser\n  untranspiledOutput = CoffeeScript.compile \"import path from 'path'\\nconsole.log path.sep\", sourceMap: yes\n  transpiledOutput   = transpile 'compile', \"import path from 'path'\\nconsole.log path.sep\", sourceMap: yes\n  untranspiledOutput.v3SourceMap = JSON.parse untranspiledOutput.v3SourceMap\n  transpiledOutput.v3SourceMap   = JSON.parse transpiledOutput.v3SourceMap\n  ok untranspiledOutput.v3SourceMap.mappings isnt transpiledOutput.v3SourceMap.mappings\n  # Babel adds `'use strict';` to the top of files with the modules transform.\n  eq transpiledOutput.js.indexOf('use strict'), 1\n  # The `'use strict';` followed by two newlines results in the first two lines\n  # of the source map mappings being two blank/skipped lines.\n  eq transpiledOutput.v3SourceMap.mappings.indexOf(';;'), 0\n  # The number of lines in the transpiled code should match the number of lines\n  # in the source map.\n  eq transpiledOutput.js.split('\\n').length, transpiledOutput.v3SourceMap.mappings.split(';').length\n\ntest \"using transpile from the Node API requires an object\", ->\n  try\n    CoffeeScript.compile '', transpile: yes\n  catch exception\n    eq exception.message, 'The transpile option must be given an object with options to pass to Babel'\n\ntest \"transpile option applies to imported .coffee files\", ->\n  return if global.testingBrowser\n  doesNotThrow -> transpile 'run', \"import { getSep } from './test/importing/transpile_import'\\ngetSep()\"\n\ntest \"#3306: trailing comma in a function call in the last line\", ->\n  eqJS '''\n  foo bar,\n  ''', '''\n  foo(bar);\n  '''\n"
  },
  {
    "path": "test/comprehensions.coffee",
    "content": "# Comprehensions\n# --------------\n\n# * Array Comprehensions\n# * Range Comprehensions\n# * Object Comprehensions\n# * Implicit Destructuring Assignment\n# * Comprehensions with Nonstandard Step\n\n# TODO: refactor comprehension tests\n\ntest \"Basic array comprehensions.\", ->\n\n  nums    = (n * n for n in [1, 2, 3] when n & 1)\n  results = (n * 2 for n in nums)\n\n  ok results.join(',') is '2,18'\n\n\ntest \"Basic object comprehensions.\", ->\n\n  obj   = {one: 1, two: 2, three: 3}\n  names = (prop + '!' for prop of obj)\n  odds  = (prop + '!' for prop, value of obj when value & 1)\n\n  ok names.join(' ') is \"one! two! three!\"\n  ok odds.join(' ')  is \"one! three!\"\n\n\ntest \"Basic range comprehensions.\", ->\n\n  nums = (i * 3 for i in [1..3])\n\n  negs = (x for x in [-20..-5*2])\n  negs = negs[0..2]\n\n  result = nums.concat(negs).join(', ')\n\n  ok result is '3, 6, 9, -20, -19, -18'\n\n\ntest \"With range comprehensions, you can loop in steps.\", ->\n\n  results = (x for x in [0...15] by 5)\n  ok results.join(' ') is '0 5 10'\n\n  results = (x for x in [0..100] by 10)\n  ok results.join(' ') is '0 10 20 30 40 50 60 70 80 90 100'\n\n\ntest \"And can loop downwards, with a negative step.\", ->\n\n  results = (x for x in [5..1])\n\n  ok results.join(' ') is '5 4 3 2 1'\n  ok results.join(' ') is [(10-5)..(-2+3)].join(' ')\n\n  results = (x for x in [10..1])\n  ok results.join(' ') is [10..1].join(' ')\n\n  results = (x for x in [10...0] by -2)\n  ok results.join(' ') is [10, 8, 6, 4, 2].join(' ')\n\n\ntest \"Range comprehension gymnastics.\", ->\n\n  eq \"#{i for i in [5..1]}\", '5,4,3,2,1'\n  eq \"#{i for i in [5..-5] by -5}\", '5,0,-5'\n\n  a = 6\n  b = 0\n  c = -2\n\n  eq \"#{i for i in [a..b]}\", '6,5,4,3,2,1,0'\n  eq \"#{i for i in [a..b] by c}\", '6,4,2,0'\n\n\ntest \"Multiline array comprehension with filter.\", ->\n\n  evens = for num in [1, 2, 3, 4, 5, 6] when not (num & 1)\n             num *= -1\n             num -= 2\n             num * -1\n  eq evens + '', '4,6,8'\n\n\n  test \"The in operator still works, standalone.\", ->\n\n    ok 2 of evens\n\n\ntest \"all isn't reserved.\", ->\n\n  all = 1\n\n\ntest \"Ensure that the closure wrapper preserves local variables.\", ->\n\n  obj = {}\n\n  for method in ['one', 'two', 'three'] then do (method) ->\n    obj[method] = ->\n      \"I'm \" + method\n\n  ok obj.one()   is \"I'm one\"\n  ok obj.two()   is \"I'm two\"\n  ok obj.three() is \"I'm three\"\n\n\ntest \"Index values at the end of a loop.\", ->\n\n  i = 0\n  for i in [1..3]\n    -> 'func'\n    break if false\n  ok i is 4\n\n\ntest \"Ensure that local variables are closed over for range comprehensions.\", ->\n\n  funcs = for i in [1..3]\n    do (i) ->\n      -> -i\n\n  eq (func() for func in funcs).join(' '), '-1 -2 -3'\n  ok i is 4\n\n\ntest \"Even when referenced in the filter.\", ->\n\n  list = ['one', 'two', 'three']\n\n  methods = for num, i in list when num isnt 'two' and i isnt 1\n    do (num, i) ->\n      -> num + ' ' + i\n\n  ok methods.length is 2\n  ok methods[0]() is 'one 0'\n  ok methods[1]() is 'three 2'\n\n\ntest \"Even a convoluted one.\", ->\n\n  funcs = []\n\n  for i in [1..3]\n    do (i) ->\n      x = i * 2\n      ((z)->\n        funcs.push -> z + ' ' + i\n      )(x)\n\n  ok (func() for func in funcs).join(', ') is '2 1, 4 2, 6 3'\n\n  funcs = []\n\n  results = for i in [1..3]\n    do (i) ->\n      z = (x * 3 for x in [1..i])\n      ((a, b, c) -> [a, b, c].join(' ')).apply this, z\n\n  ok results.join(', ') is '3  , 3 6 , 3 6 9'\n\n\ntest \"Naked ranges are expanded into arrays.\", ->\n\n  array = [0..10]\n  ok(num % 2 is 0 for num in array by 2)\n\n\ntest \"Nested shared scopes.\", ->\n\n  foo = ->\n    for i in [0..7]\n      do (i) ->\n        for j in [0..7]\n          do (j) ->\n            -> i + j\n\n  eq foo()[3][4](), 7\n\n\ntest \"Scoped loop pattern matching.\", ->\n\n  a = [[0], [1]]\n  funcs = []\n\n  for [v] in a\n    do (v) ->\n      funcs.push -> v\n\n  eq funcs[0](), 0\n  eq funcs[1](), 1\n\n\ntest \"Nested comprehensions.\", ->\n\n  multiLiner =\n    for x in [3..5]\n      for y in [3..5]\n        [x, y]\n\n  singleLiner =\n    (([x, y] for y in [3..5]) for x in [3..5])\n\n  ok multiLiner.length is singleLiner.length\n  ok 5 is multiLiner[2][2][1]\n  ok 5 is singleLiner[2][2][1]\n\n\ntest \"Comprehensions within parentheses.\", ->\n\n  result = null\n  store = (obj) -> result = obj\n  store (x * 2 for x in [3, 2, 1])\n\n  ok result.join(' ') is '6 4 2'\n\n\ntest \"Closure-wrapped comprehensions that refer to the 'arguments' object.\", ->\n\n  expr = ->\n    result = (item * item for item in arguments)\n\n  ok expr(2, 4, 8).join(' ') is '4 16 64'\n\n\ntest \"Fast object comprehensions over all properties, including prototypal ones.\", ->\n\n  class Cat\n    constructor: -> @name = 'Whiskers'\n    breed: 'tabby'\n    hair:  'cream'\n\n  whiskers = new Cat\n  own = (value for own key, value of whiskers)\n  all = (value for key, value of whiskers)\n\n  ok own.join(' ') is 'Whiskers'\n  ok all.sort().join(' ') is 'Whiskers cream tabby'\n\n\ntest \"Optimized range comprehensions.\", ->\n\n  exxes = ('x' for [0...10])\n  ok exxes.join(' ') is 'x x x x x x x x x x'\n\n\ntest \"#3671: Allow step in optimized range comprehensions.\", ->\n\n  exxes = ('x' for [0...10] by 2)\n  eq exxes.join(' ') , 'x x x x x'\n\n\ntest \"#3671: Disallow guard in optimized range comprehensions.\", ->\n\n  throwsCompileError \"exxes = ('x' for [0...10] when a)\"\n\n\ntest \"Loop variables should be able to reference outer variables\", ->\n  outer = 1\n  do ->\n    null for outer in [1, 2, 3]\n  eq outer, 3\n\n\ntest \"Lenient on pure statements not trying to reach out of the closure\", ->\n\n  val = for i in [1]\n    for j in [] then break\n    i\n  ok val[0] is i\n\n\ntest \"Comprehensions only wrap their last line in a closure, allowing other lines\n  to have pure expressions in them.\", ->\n\n  func = -> for i in [1]\n    break if i is 2\n    j for j in [1]\n\n  ok func()[0][0] is 1\n\n  i = 6\n  odds = while i--\n    continue unless i & 1\n    i\n\n  ok odds.join(', ') is '5, 3, 1'\n\n\ntest \"Issue #897: Ensure that plucked function variables aren't leaked.\", ->\n\n  facets = {}\n  list = ['one', 'two']\n\n  (->\n    for entity in list\n      facets[entity] = -> entity\n  )()\n\n  eq typeof entity, 'undefined'\n  eq facets['two'](), 'two'\n\n\ntest \"Issue #905. Soaks as the for loop subject.\", ->\n\n  a = {b: {c: [1, 2, 3]}}\n  for d in a.b?.c\n    e = d\n\n  eq e, 3\n\n\ntest \"Issue #948. Capturing loop variables.\", ->\n\n  funcs = []\n  list  = ->\n    [1, 2, 3]\n\n  for y in list()\n    do (y) ->\n      z = y\n      funcs.push -> \"y is #{y} and z is #{z}\"\n\n  eq funcs[1](), \"y is 2 and z is 2\"\n\n\ntest \"Cancel the comprehension if there's a jump inside the loop.\", ->\n\n  result = try\n    for i in [0...10]\n      continue if i < 5\n    i\n\n  eq result, 10\n\n\ntest \"Comprehensions over break.\", ->\n\n  arrayEq (break for [1..10]), []\n\n\ntest \"Comprehensions over continue.\", ->\n\n  arrayEq (continue for [1..10]), []\n\n\ntest \"Comprehensions over function literals.\", ->\n\n  a = 0\n  for f in [-> a = 1]\n    do (f) ->\n      do f\n\n  eq a, 1\n\n\ntest \"Comprehensions that mention arguments.\", ->\n\n  list = [arguments: 10]\n  args = for f in list\n    do (f) ->\n      f.arguments\n  eq args[0], 10\n\n\ntest \"expression conversion under explicit returns\", ->\n  nonce = {}\n  fn = ->\n    return (nonce for x in [1,2,3])\n  arrayEq [nonce,nonce,nonce], fn()\n  fn = ->\n    return [nonce for x in [1,2,3]][0]\n  arrayEq [nonce,nonce,nonce], fn()\n  fn = ->\n    return [(nonce for x in [1..3])][0]\n  arrayEq [nonce,nonce,nonce], fn()\n\n\ntest \"implicit destructuring assignment in object of objects\", ->\n  a={}; b={}; c={}\n  obj = {\n    a: { d: a },\n    b: { d: b }\n    c: { d: c }\n  }\n  result = ([y,z] for y, { d: z } of obj)\n  arrayEq [['a',a],['b',b],['c',c]], result\n\n\ntest \"implicit destructuring assignment in array of objects\", ->\n  a={}; b={}; c={}; d={}; e={}; f={}\n  arr = [\n    { a: a, b: { c: b } },\n    { a: c, b: { c: d } },\n    { a: e, b: { c: f } }\n  ]\n  result = ([y,z] for { a: y, b: { c: z } } in arr)\n  arrayEq [[a,b],[c,d],[e,f]], result\n\n\ntest \"implicit destructuring assignment in array of arrays\", ->\n  a={}; b={}; c={}; d={}; e={}; f={}\n  arr = [[a, [b]], [c, [d]], [e, [f]]]\n  result = ([y,z] for [y, [z]] in arr)\n  arrayEq [[a,b],[c,d],[e,f]], result\n\ntest \"issue #1124: don't assign a variable in two scopes\", ->\n  lista = [1, 2, 3, 4, 5]\n  listb = (_i + 1 for _i in lista)\n  arrayEq [2, 3, 4, 5, 6], listb\n\ntest \"#1326: `by` value is uncached\", ->\n  a = [0,1,2]\n  fi = gi = hi = 0\n  f = -> ++fi\n  g = -> ++gi\n  h = -> ++hi\n\n  forCompile = []\n  rangeCompileSimple = []\n\n  #exercises For.compile\n  for v, i in a by f()\n    forCompile.push i\n\n  #exercises Range.compileSimple\n  rangeCompileSimple = (i for i in [0..2] by g())\n\n  arrayEq a, forCompile\n  arrayEq a, rangeCompileSimple\n  #exercises Range.compile\n  eq \"#{i for i in [0..2] by h()}\", '0,1,2'\n\ntest \"#1669: break/continue should skip the result only for that branch\", ->\n  ns = for n in [0..99]\n    if n > 9\n      break\n    else if n & 1\n      continue\n    else\n      n\n  eq \"#{ns}\", '0,2,4,6,8'\n\n  # `else undefined` is implied.\n  ns = for n in [1..9]\n    if n % 2\n      continue unless n % 5\n      n\n  eq \"#{ns}\", \"1,,3,,,7,,9\"\n\n  # Ditto.\n  ns = for n in [1..9]\n    switch\n      when n % 2\n        continue unless n % 5\n        n\n  eq \"#{ns}\", \"1,,3,,,7,,9\"\n\ntest \"#1850: inner `for` should not be expression-ized if `return`ing\", ->\n  eq '3,4,5', do ->\n    for a in [1..9] then \\\n    for b in [1..9]\n      c = Math.sqrt a*a + b*b\n      return String [a, b, c] unless c % 1\n\ntest \"#1910: loop index should be mutable within a loop iteration and immutable between loop iterations\", ->\n  n = 1\n  iterations = 0\n  arr = [0..n]\n  for v, k in arr\n    ++iterations\n    v = k = 5\n    eq 5, k\n  eq 2, k\n  eq 2, iterations\n\n  iterations = 0\n  for v in [0..n]\n    ++iterations\n  eq 2, k\n  eq 2, iterations\n\n  arr = ([v, v + 1] for v in [0..5])\n  iterations = 0\n  for [v0, v1], k in arr when v0\n    k += 3\n    ++iterations\n  eq 6, k\n  eq 5, iterations\n\ntest \"#2007: Return object literal from comprehension\", ->\n  y = for x in [1, 2]\n    foo: \"foo\" + x\n  eq 2, y.length\n  eq \"foo1\", y[0].foo\n  eq \"foo2\", y[1].foo\n\n  x = 2\n  y = while x\n    x: --x\n  eq 2, y.length\n  eq 1, y[0].x\n  eq 0, y[1].x\n\ntest \"#2274: Allow @values as loop variables\", ->\n  obj = {\n    item: null\n    method: ->\n      for @item in [1, 2, 3]\n        null\n  }\n  eq obj.item, null\n  obj.method()\n  eq obj.item, 3\n\ntest \"#4411: Allow @values as loop indices\", ->\n  obj =\n    index: null\n    get: -> @index\n    method: ->\n      @get() for _, @index in [1, 2, 3]\n  eq obj.index, null\n  arrayEq obj.method(), [0, 1, 2]\n  eq obj.index, 3\n\ntest \"#2525, #1187, #1208, #1758, looping over an array forwards\", ->\n  list = [0, 1, 2, 3, 4]\n\n  ident = (x) -> x\n\n  arrayEq (i for i in list), list\n\n  arrayEq (index for i, index in list), list\n\n  arrayEq (i for i in list by 1), list\n\n  arrayEq (i for i in list by ident 1), list\n\n  arrayEq (i for i in list by ident(1) * 2), [0, 2, 4]\n\n  arrayEq (index for i, index in list by ident(1) * 2), [0, 2, 4]\n\ntest \"#2525, #1187, #1208, #1758, looping over an array backwards\", ->\n  list = [0, 1, 2, 3, 4]\n  backwards = [4, 3, 2, 1, 0]\n\n  ident = (x) -> x\n\n  arrayEq (i for i in list by -1), backwards\n\n  arrayEq (index for i, index in list by -1), backwards\n\n  arrayEq (i for i in list by ident -1), backwards\n\n  arrayEq (i for i in list by ident(-1) * 2), [4, 2, 0]\n\n  arrayEq (index for i, index in list by ident(-1) * 2), [4, 2, 0]\n\ntest \"splats in destructuring in comprehensions\", ->\n  list = [[0, 1, 2], [2, 3, 4], [4, 5, 6]]\n  arrayEq (seq for [rep, seq...] in list), [[1, 2], [3, 4], [5, 6]]\n\ntest \"#156: expansion in destructuring in comprehensions\", ->\n  list = [[0, 1, 2], [2, 3, 4], [4, 5, 6]]\n  arrayEq (last for [..., last] in list), [2, 4, 6]\n\ntest \"#3778: Consistently always cache for loop range boundaries and steps, even\n      if they are simple identifiers\", ->\n  a = 1; arrayEq [1, 2, 3], (for n in [1, 2, 3] by  a then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [1, 2, 3] by +a then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [a..3]          then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [+a..3]         then a = 4; n)\n  a = 3; arrayEq [1, 2, 3], (for n in [1..a]          then a = 4; n)\n  a = 3; arrayEq [1, 2, 3], (for n in [1..+a]         then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [1..3] by  a    then a = 4; n)\n  a = 1; arrayEq [1, 2, 3], (for n in [1..3] by +a    then a = 4; n)\n\ntest \"for pattern variables can linebreak/indent\", ->\n  listOfObjects = [a: 1]\n  sum = 0\n  for {\n    a\n    somethingElse\n    anotherProperty\n  } in listOfObjects\n    sum += a\n  eq a, 1\n\n  sum = 0\n  sum += a for {\n    a,\n    somethingElse,\n    anotherProperty,\n  } in listOfObjects\n  eq a, 1\n\n  listOfArrays = [[2]]\n  sum = 0\n  for [\n    a\n    nonexistentElement\n    anotherNonexistentElement\n  ] in listOfArrays\n    sum += a\n  eq a, 2\n\n  sum = 0\n  sum += a for [\n    a,\n    nonexistentElement,\n    anotherNonexistentElement\n  ] in listOfArrays\n  eq a, 2\n\ntest \"#5309: comprehension as postfix condition\", ->\n  doesNotThrowCompileError \"\"\"\n    throw new Error \"DOOM was called with a null element\" unless elm? for elm in elms\n  \"\"\"\n\ntest \"#5410: for from loops shouldn't make excess refs\", ->\n  js = CoffeeScript.compile \"\"\"\n    for x from fn()\n      alert x\n  \"\"\"\n\n  ok !js.match /ref/\n"
  },
  {
    "path": "test/control_flow.coffee",
    "content": "# Control Flow\n# ------------\n\n# * Conditionals\n# * Loops\n#   * For\n#   * While\n#   * Until\n#   * Loop\n# * Switch\n# * Throw\n\n# TODO: make sure postfix forms and expression coercion are properly tested\n\n# shared identity function\nid = (_) -> if arguments.length is 1 then _ else Array::slice.call(arguments)\n\n# Conditionals\n\ntest \"basic conditionals\", ->\n  if false\n    ok false\n  else if false\n    ok false\n  else\n    ok true\n\n  if true\n    ok true\n  else if true\n    ok false\n  else\n    ok true\n\n  unless true\n    ok false\n  else unless true\n    ok false\n  else\n    ok true\n\n  unless false\n    ok true\n  else unless false\n    ok false\n  else\n    ok true\n\ntest \"single-line conditional\", ->\n  if false then ok false else ok true\n  unless false then ok true else ok false\n\ntest \"nested conditionals\", ->\n  nonce = {}\n  eq nonce, (if true\n    unless false\n      if false then false else\n        if true\n          nonce)\n\ntest \"nested single-line conditionals\", ->\n  nonce = {}\n\n  a = if false then undefined else b = if 0 then undefined else nonce\n  eq nonce, a\n  eq nonce, b\n\n  c = if false then undefined else (if 0 then undefined else nonce)\n  eq nonce, c\n\n  d = if true then id(if false then undefined else nonce)\n  eq nonce, d\n\ntest \"empty conditional bodies\", ->\n  eq undefined, (if false\n  else if false\n  else)\n\ntest \"conditional bodies containing only comments\", ->\n  eq undefined, (if true\n    ###\n    block comment\n    ###\n  else\n    # comment\n  )\n\n  eq undefined, (if false\n    # comment\n  else if true\n    ###\n    block comment\n    ###\n  else)\n\ntest \"return value of if-else is from the proper body\", ->\n  nonce = {}\n  eq nonce, if false then undefined else nonce\n\ntest \"return value of unless-else is from the proper body\", ->\n  nonce = {}\n  eq nonce, unless true then undefined else nonce\n\ntest \"assign inside the condition of a conditional statement\", ->\n  nonce = {}\n  if a = nonce then 1\n  eq nonce, a\n  1 if b = nonce\n  eq nonce, b\n\n\n# Interactions With Functions\n\ntest \"single-line function definition with single-line conditional\", ->\n  fn = -> if 1 < 0.5 then 1 else -1\n  ok fn() is -1\n\ntest \"function resturns conditional value with no `else`\", ->\n  fn = ->\n    return if false then true\n  eq undefined, fn()\n\ntest \"function returns a conditional value\", ->\n  a = {}\n  fnA = ->\n    return if false then undefined else a\n  eq a, fnA()\n\n  b = {}\n  fnB = ->\n    return unless false then b else undefined\n  eq b, fnB()\n\ntest \"passing a conditional value to a function\", ->\n  nonce = {}\n  eq nonce, id if false then undefined else nonce\n\ntest \"unmatched `then` should catch implicit calls\", ->\n  a = 0\n  trueFn = -> true\n  if trueFn undefined then a++\n  eq 1, a\n\n\n# if-to-ternary\n\ntest \"if-to-ternary with instanceof requires parentheses\", ->\n  nonce = {}\n  eq nonce, (if {} instanceof Object\n    nonce\n  else\n    undefined)\n\ntest \"if-to-ternary as part of a larger operation requires parentheses\", ->\n  ok 2, 1 + if false then 0 else 1\n\n\n# Odd Formatting\n\ntest \"if-else indented within an assignment\", ->\n  nonce = {}\n  result =\n    if false\n      undefined\n    else\n      nonce\n  eq nonce, result\n\ntest \"suppressed indentation via assignment\", ->\n  nonce = {}\n  result =\n    if      false then undefined\n    else if no    then undefined\n    else if 0     then undefined\n    else if 1 < 0 then undefined\n    else               id(\n         if false then undefined\n         else          nonce\n    )\n  eq nonce, result\n\ntest \"tight formatting with leading `then`\", ->\n  nonce = {}\n  eq nonce,\n  if true\n  then nonce\n  else undefined\n\ntest \"#738: inline function defintion\", ->\n  nonce = {}\n  fn = if true then -> nonce\n  eq nonce, fn()\n\ntest \"#748: trailing reserved identifiers\", ->\n  nonce = {}\n  obj = delete: true\n  result = if obj.delete\n    nonce\n  eq nonce, result\n\ntest 'if-else within an assignment, condition parenthesized', ->\n  result = if (1 is 1) then 'correct'\n  eq result, 'correct'\n\n  result = if ('whatever' ? no) then 'correct'\n  eq result, 'correct'\n\n  f = -> 'wrong'\n  result = if (f?()) then 'correct' else 'wrong'\n  eq result, 'correct'\n\n# Postfix\n\ntest \"#3056: multiple postfix conditionals\", ->\n  temp = 'initial'\n  temp = 'ignored' unless true if false\n  eq temp, 'initial'\n\n# Loops\n\ntest \"basic `while` loops\", ->\n\n  i = 5\n  list = while i -= 1\n    i * 2\n  ok list.join(' ') is \"8 6 4 2\"\n\n  i = 5\n  list = (i * 3 while i -= 1)\n  ok list.join(' ') is \"12 9 6 3\"\n\n  i = 5\n  func   = (num) -> i -= num\n  assert = -> ok i < 5 > 0\n  results = while func 1\n    assert()\n    i\n  ok results.join(' ') is '4 3 2 1'\n\n  i = 10\n  results = while i -= 1 when i % 2 is 0\n    i * 2\n  ok results.join(' ') is '16 12 8 4'\n\n\ntest \"Issue 759: `if` within `while` condition\", ->\n\n  2 while if 1 then 0\n\n\ntest \"assignment inside the condition of a `while` loop\", ->\n\n  nonce = {}\n  count = 1\n  a = nonce while count--\n  eq nonce, a\n  count = 1\n  while count--\n    b = nonce\n  eq nonce, b\n\n\ntest \"While over break.\", ->\n\n  i = 0\n  result = while i < 10\n    i++\n    break\n  arrayEq result, []\n\n\ntest \"While over continue.\", ->\n\n  i = 0\n  result = while i < 10\n    i++\n    continue\n  arrayEq result, []\n\n\ntest \"Basic `until`\", ->\n\n  value = false\n  i = 0\n  results = until value\n    value = true if i is 5\n    i++\n  ok i is 6\n\n\ntest \"Basic `loop`\", ->\n\n  i = 5\n  list = []\n  loop\n    i -= 1\n    break if i is 0\n    list.push i * 2\n  ok list.join(' ') is '8 6 4 2'\n\n\ntest \"break at the top level\", ->\n  for i in [1,2,3]\n    result = i\n    if i == 2\n      break\n  eq 2, result\n\ntest \"break *not* at the top level\", ->\n  someFunc = ->\n    i = 0\n    while ++i < 3\n      result = i\n      break if i > 1\n    result\n  eq 2, someFunc()\n\n# Switch\n\ntest \"basic `switch`\", ->\n\n  num = 10\n  result = switch num\n    when 5 then false\n    when 'a'\n      true\n      true\n      false\n    when 10 then true\n\n\n    # Mid-switch comment with whitespace\n    # and multi line\n    when 11 then false\n    else false\n\n  ok result\n\n\n  func = (num) ->\n    switch num\n      when 2, 4, 6\n        true\n      when 1, 3, 5\n        false\n\n  ok func(2)\n  ok func(6)\n  ok !func(3)\n  eq func(8), undefined\n\n\ntest \"Ensure that trailing switch elses don't get rewritten.\", ->\n\n  result = false\n  switch \"word\"\n    when \"one thing\"\n      doSomething()\n    else\n      result = true unless false\n\n  ok result\n\n  result = false\n  switch \"word\"\n    when \"one thing\"\n      doSomething()\n    when \"other thing\"\n      doSomething()\n    else\n      result = true unless false\n\n  ok result\n\n\ntest \"Should be able to handle switches sans-condition.\", ->\n\n  result = switch\n    when null                     then 0\n    when !1                       then 1\n    when '' not of {''}           then 2\n    when [] not instanceof Array  then 3\n    when true is false            then 4\n    when 'x' < 'y' > 'z'          then 5\n    when 'a' in ['b', 'c']        then 6\n    when 'd' in (['e', 'f'])      then 7\n    else ok\n\n  eq result, ok\n\n\ntest \"Should be able to use `@properties` within the switch clause.\", ->\n\n  obj = {\n    num: 101\n    func: ->\n      switch @num\n        when 101 then '101!'\n        else 'other'\n  }\n\n  ok obj.func() is '101!'\n\n\ntest \"Should be able to use `@properties` within the switch cases.\", ->\n\n  obj = {\n    num: 101\n    func: (yesOrNo) ->\n      result = switch yesOrNo\n        when yes then @num\n        else 'other'\n      result\n  }\n\n  ok obj.func(yes) is 101\n\n\ntest \"Switch with break as the return value of a loop.\", ->\n\n  i = 10\n  results = while i > 0\n    i--\n    switch i % 2\n      when 1 then i\n      when 0 then break\n\n  eq results.join(', '), '9, 7, 5, 3, 1'\n\n\ntest \"Issue #997. Switch doesn't fallthrough.\", ->\n\n  val = 1\n  switch true\n    when true\n      if false\n        return 5\n    else\n      val = 2\n\n  eq val, 1\n\n# Throw\n\ntest \"Throw should be usable as an expression.\", ->\n  try\n    false or throw 'up'\n    throw new Error 'failed'\n  catch e\n    ok e is 'up'\n\n\ntest \"#2555, strange function if bodies\", ->\n  success = -> ok true\n  failure = -> ok false\n\n  success() if do ->\n    yes\n\n  failure() if try\n    false\n\ntest \"#1057: `catch` or `finally` in single-line functions\", ->\n  ok do -> try throw 'up' catch then yes\n  ok do -> try yes finally 'nothing'\n\ntest \"#2367: super in for-loop\", ->\n  class Foo\n    sum: 0\n    add: (val) -> @sum += val\n\n  class Bar extends Foo\n    add: (vals...) ->\n      super val for val in vals\n      @sum\n\n  eq 10, (new Bar).add 2, 3, 5\n\ntest \"#4267: lots of for-loops in the same scope\", ->\n  # This used to include the invalid JavaScript `var do = 0`.\n  code = \"\"\"\n    do ->\n      #{Array(200).join('for [0..0] then\\n  ')}\n      true\n  \"\"\"\n  ok CoffeeScript.eval(code)\n\n# Test for issue #2342: Lexer: Inline `else` binds to wrong `if`/`switch`\ntest \"#2343: if / then / if / then / else\", ->\n  a = b = yes\n  c = e = g = no\n  d = 1\n  f = 2\n  h = 3\n  i = 4\n\n  s = ->\n    if a\n      if b\n        if c\n          d\n        else\n          if e\n            f\n          else\n            if g\n              h\n            else\n              i\n\n  t = ->\n    if a then if b\n      if c then d\n      else if e\n        f\n      else if g\n        h\n      else\n        i\n\n  u = ->\n    if a then if b\n      if c then d else if e\n        f\n      else if g\n        h\n      else i\n\n  v = ->\n    if a then if b\n      if c then d else if e then f\n      else if g then h\n      else i\n\n  w = ->\n    if a then if b\n      if c then d\n      else if e\n          f\n        else\n          if g then h\n          else i\n\n  x = -> if a then if b then if c then d else if e then f else if g then h else i\n\n  y = -> if a then if b then (if c then d else (if e then f else (if g then h else i)))\n\n  eq 4, s()\n  eq 4, t()\n  eq 4, u()\n  eq 4, v()\n  eq 4, w()\n  eq 4, x()\n  eq 4, y()\n\n  c = yes\n  eq 1, s()\n  eq 1, t()\n  eq 1, u()\n  eq 1, v()\n  eq 1, w()\n  eq 1, x()\n  eq 1, y()\n\n  b = no\n  eq undefined, s()\n  eq undefined, t()\n  eq undefined, u()\n  eq undefined, v()\n  eq undefined, w()\n  eq undefined, x()\n  eq undefined, y()\n\ntest \"#2343: if / then / if / then / else / else\", ->\n  a = b = yes\n  c = e = g = no\n  d = 1\n  f = 2\n  h = 3\n  i = 4\n  j = 5\n  k = 6\n\n  s = ->\n    if a\n      if b\n        if c\n          d\n        else\n          e\n          if e\n            f\n          else\n            if g\n              h\n            else\n              i\n      else\n        j\n    else\n      k\n\n  t = ->\n    if a\n      if b\n        if c then d\n        else if e\n          f\n        else if g\n          h\n        else\n          i\n      else\n        j\n    else\n      k\n\n  u = ->\n    if a\n      if b\n        if c then d else if e\n          f\n        else if g\n          h\n        else i\n      else j\n    else k\n\n  v = ->\n    if a\n      if b\n        if c then d else if e then f\n        else if g then h\n        else i\n      else j else k\n\n  w = ->\n    if a then if b\n        if c then d\n        else if e\n            f\n          else\n            if g then h\n            else i\n    else j else k\n\n  x = -> if a then if b then if c then d else if e then f else if g then h else i else j else k\n\n  y = -> if a then (if b then (if c then d else (if e then f else (if g then h else i))) else j) else k\n\n  eq 4, s()\n  eq 4, t()\n  eq 4, u()\n  eq 4, v()\n  eq 4, w()\n  eq 4, x()\n  eq 4, y()\n\n  c = yes\n  eq 1, s()\n  eq 1, t()\n  eq 1, u()\n  eq 1, v()\n  eq 1, w()\n  eq 1, x()\n  eq 1, y()\n\n  b = no\n  eq 5, s()\n  eq 5, t()\n  eq 5, u()\n  eq 5, v()\n  eq 5, w()\n  eq 5, x()\n  eq 5, y()\n\n  a = no\n  eq 6, s()\n  eq 6, t()\n  eq 6, u()\n  eq 6, v()\n  eq 6, w()\n  eq 6, x()\n  eq 6, y()\n\n\ntest \"#2343: switch / when / then / if / then / else\", ->\n  a = b = yes\n  c = e = g = no\n  d = 1\n  f = 2\n  h = 3\n  i = 4\n\n  s = ->\n    switch\n      when a\n        if b\n          if c\n            d\n          else\n            if e\n              f\n            else\n              if g\n                h\n              else\n                i\n\n\n  t = ->\n    switch\n      when a then if b\n        if c then d\n        else if e\n          f\n        else if g\n          h\n        else\n          i\n\n  u = ->\n    switch\n      when a then if b then if c then d\n      else if e then f\n      else if g then h else i\n\n  v = ->\n    switch\n      when a then if b then if c then d else if e then f\n      else if g then h else i\n\n  w = ->\n    switch\n      when a then if b then if c then d else if e then f\n      else if g\n        h\n      else i\n\n  x = ->\n    switch\n     when a then if b then if c then d else if e then f else if g then h else i\n\n  y = -> switch\n    when a then if b then (if c then d else (if e then f else (if g then h else i)))\n\n  eq 4, s()\n  eq 4, t()\n  eq 4, u()\n  eq 4, v()\n  eq 4, w()\n  eq 4, x()\n  eq 4, y()\n\n  c = yes\n  eq 1, s()\n  eq 1, t()\n  eq 1, u()\n  eq 1, v()\n  eq 1, w()\n  eq 1, x()\n  eq 1, y()\n\n  b = no\n  eq undefined, s()\n  eq undefined, t()\n  eq undefined, u()\n  eq undefined, v()\n  eq undefined, w()\n  eq undefined, x()\n  eq undefined, y()\n\ntest \"#2343: switch / when / then / if / then / else / else\", ->\n  a = b = yes\n  c = e = g = no\n  d = 1\n  f = 2\n  h = 3\n  i = 4\n\n  s = ->\n    switch\n      when a\n        if b\n          if c\n            d\n          else if e\n            f\n          else if g\n            h\n          else\n            i\n      else\n        0\n\n  t = ->\n    switch\n      when a\n        if b\n          if c then d\n          else if e\n            f\n          else if g\n            h\n          else i\n      else 0\n\n  u = ->\n    switch\n      when a\n        if b then if c\n            d\n          else if e\n            f\n          else if g\n            h\n          else i\n      else 0\n\n  v = ->\n    switch\n      when a\n        if b then if c then d\n        else if e\n          f\n        else if g\n          h\n        else i\n      else 0\n\n  w = ->\n    switch\n      when a\n        if b then if c then d\n        else if e then f\n        else if g then h\n        else i\n      else 0\n\n  x = ->\n    switch\n     when a\n       if b then if c then d else if e then f else if g then h else i\n     else 0\n\n  y = -> switch\n    when a\n      if b then (if c then d else (if e then f else (if g then h else i)))\n    else 0\n\n  eq 4, s()\n  eq 4, t()\n  eq 4, u()\n  eq 4, v()\n  eq 4, w()\n  eq 4, x()\n  eq 4, y()\n\n  c = yes\n  eq 1, s()\n  eq 1, t()\n  eq 1, u()\n  eq 1, v()\n  eq 1, w()\n  eq 1, x()\n  eq 1, y()\n\n  b = no\n  eq undefined, s()\n  eq undefined, t()\n  eq undefined, u()\n  eq undefined, v()\n  eq undefined, w()\n  eq undefined, x()\n  eq undefined, y()\n\n  b = yes\n  a = no\n  eq 0, s()\n  eq 0, t()\n  eq 0, u()\n  eq 0, v()\n  eq 0, w()\n  eq 0, x()\n  eq 0, y()\n\ntest \"#2343: switch / when / then / if / then / else / else / else\", ->\n  a = b = yes\n  c = e = g = no\n  d = 1\n  f = 2\n  h = 3\n  i = 4\n  j = 5\n\n  s = ->\n    switch\n      when a\n        if b\n          if c\n            d\n          else if e\n            f\n          else if g\n            h\n          else\n            i\n        else\n          j\n      else\n        0\n\n  t = ->\n    switch\n      when a\n        if b\n          if c then d\n          else if e\n            f\n          else if g\n            h\n          else i\n        else\n          j\n      else 0\n\n  u = ->\n    switch\n      when a\n        if b\n          if c\n            d\n          else if e\n            f\n          else if g\n            h\n          else i\n        else j\n      else 0\n\n  v = ->\n    switch\n      when a\n        if b\n          if c then d\n          else if e\n            f\n          else if g then h\n          else i\n        else j\n      else 0\n\n  w = ->\n    switch\n      when a\n        if b\n          if c then d\n          else if e then f\n          else if g then h\n          else i\n        else j\n      else 0\n\n  x = ->\n    switch\n     when a\n       if b then if c then d else if e then f else if g then h else i else j\n     else 0\n\n  y = -> switch\n    when a\n      if b then (if c then d else (if e then f else (if g then h else i))) else j\n    else 0\n\n  eq 4, s()\n  eq 4, t()\n  eq 4, u()\n  eq 4, v()\n  eq 4, w()\n  eq 4, x()\n  eq 4, y()\n\n  c = yes\n  eq 1, s()\n  eq 1, t()\n  eq 1, u()\n  eq 1, v()\n  eq 1, w()\n  eq 1, x()\n  eq 1, y()\n\n  b = no\n  eq 5, s()\n  eq 5, t()\n  eq 5, u()\n  eq 5, v()\n  eq 5, w()\n  eq 5, x()\n  eq 5, y()\n\n  b = yes\n  a = no\n  eq 0, s()\n  eq 0, t()\n  eq 0, u()\n  eq 0, v()\n  eq 0, w()\n  eq 0, x()\n  eq 0, y()\n\n# Test for issue #3921: Inline function without parentheses used in condition fails to compile\ntest \"#3921: `if` & `unless`\", ->\n  a = {}\n  eq a, if do -> no then undefined else a\n  a1 = undefined\n  if do -> yes\n    a1 = a\n  eq a, a1\n\n  b = {}\n  eq b, unless do -> no then b else undefined\n  b1 = undefined\n  unless do -> no\n    b1 = b\n  eq b, b1\n\n  c = 0\n  if (arg = undefined) -> yes then c++\n  eq 1, c\n  d = 0\n  if (arg = undefined) -> yes\n    d++\n  eq 1, d\n\n  answer = 'correct'\n  eq answer, if do -> 'wrong' then 'correct' else 'wrong'\n  eq answer, unless do -> no then 'correct' else 'wrong'\n  statm1 = undefined\n  if do -> 'wrong'\n    statm1 = 'correct'\n  eq answer, statm1\n  statm2 = undefined\n  unless do -> no\n    statm2 = 'correct'\n  eq answer, statm2\n\ntest \"#3921: `post if`\", ->\n  a = {}\n  eq a, a unless do -> no\n  a1 = a if do -> yes\n  eq a, a1\n\n  c = 0\n  c++ if (arg = undefined) -> yes\n  eq 1, c\n  d = 0\n  d++ if (arg = undefined) -> yes\n  eq 1, d\n\n  answer = 'correct'\n  eq answer, 'correct' if do -> 'wrong'\n  eq answer, 'correct' unless do -> not 'wrong'\n  statm1 = undefined\n  statm1 = 'correct' if do -> 'wrong'\n  eq answer, statm1\n  statm2 = undefined\n  statm2 = 'correct' unless do -> not 'wrong'\n  eq answer, statm2\n\ntest \"Issue 3921: `while` & `until`\", ->\n  i = 5\n  assert = (a) -> ok 5 > a > 0\n  result1 = while do (num = 1) -> i -= num\n    assert i\n    i\n  ok result1.join(' ') is '4 3 2 1'\n\n  j = 5\n  result2 = until do (num = 1) -> (j -= num) < 1\n    assert j\n    j\n  ok result2.join(' ') is '4 3 2 1'\n\ntest \"#3921: `switch`\", ->\n  i = 1\n  a = switch do (m = 2) -> i * m\n    when 5 then \"five\"\n    when 4 then \"four\"\n    when 3 then \"three\"\n    when 2 then \"two\"\n    when 1 then \"one\"\n    else \"none\"\n  eq \"two\", a\n\n  j = 12\n  b = switch do (m = 3) -> j / m\n    when 5 then \"five\"\n    when 4 then \"four\"\n    when 3 then \"three\"\n    when 2 then \"two\"\n    when 1 then \"one\"\n    else \"none\"\n  eq \"four\", b\n\n  k = 20\n  c = switch do (m = 4) -> k / m\n    when 5 then \"five\"\n    when 4 then \"four\"\n    when 3 then \"three\"\n    when 2 then \"two\"\n    when 1 then \"one\"\n    else \"none\"\n  eq \"five\", c\n\n# Issue #3909: backslash to break line in `for` loops throw syntax error\ntest \"#3909: backslash `for own ... of`\", ->\n\n  obj = {a: 1, b: 2, c: 3}\n  arr = ['a', 'b', 'c']\n\n  x1 \\\n    = ( key for own key of obj )\n  arrayEq x1, arr\n\n  x2 = \\\n    ( key for own key of obj )\n  arrayEq x2, arr\n\n  x3 = ( \\\n    key for own key of obj )\n  arrayEq x3, arr\n\n  x4 = ( key \\\n    for own key of obj )\n  arrayEq x4, arr\n\n  x5 = ( key for own key of \\\n    obj )\n  arrayEq x5, arr\n\n  x6 = ( key for own key of obj \\\n    )\n  arrayEq x6, arr\n\n  x7 = ( key for \\\n    own key of obj )\n  arrayEq x7, arr\n\n  x8 = ( key for own \\\n    key of obj )\n  arrayEq x8, arr\n\n  x9 = ( key for own key \\\n    of obj )\n  arrayEq x9, arr\n\n\ntest \"#3909: backslash `for ... of`\", ->\n  obj = {a: 1, b: 2, c: 3}\n  arr = ['a', 'b', 'c']\n\n  x1 \\\n    = ( key for key of obj )\n  arrayEq x1, arr\n\n  x2 = \\\n    ( key for key of obj )\n  arrayEq x2, arr\n\n  x3 = ( \\\n    key for key of obj )\n  arrayEq x3, arr\n\n  x4 = ( key \\\n    for key of obj )\n  arrayEq x4, arr\n\n  x5 = ( key for key of \\\n    obj )\n  arrayEq x5, arr\n\n  x6 = ( key for key of obj \\\n    )\n  arrayEq x6, arr\n\n  x7 = ( key for \\\n    key of obj )\n  arrayEq x7, arr\n\n  x8 = ( key for key \\\n    of obj )\n  arrayEq x8, arr\n\n\ntest \"#3909: backslash `for ... in`\", ->\n  arr = ['a', 'b', 'c']\n\n  x1 \\\n    = ( key for key in arr )\n  arrayEq x1, arr\n\n  x2 = \\\n    ( key for key in arr )\n  arrayEq x2, arr\n\n  x3 = ( \\\n    key for key in arr )\n  arrayEq x3, arr\n\n  x4 = ( key \\\n    for key in arr )\n  arrayEq x4, arr\n\n  x5 = ( key for key in \\\n    arr )\n  arrayEq x5, arr\n\n  x6 = ( key for key in arr \\\n    )\n  arrayEq x6, arr\n\n  x7 = ( key for \\\n    key in arr )\n  arrayEq x7, arr\n\n  x8 = ( key for key \\\n    in arr )\n  arrayEq x8, arr\n\ntest \"#4871: `else if` no longer output together \", ->\n   eqJS '''\n   if a then b else if c then d else if e then f else g\n   ''',\n   '''\n   if (a) {\n     b;\n   } else if (c) {\n     d;\n   } else if (e) {\n     f;\n   } else {\n     g;\n   }\n   '''\n\n   eqJS '''\n   if no\n     1\n   else if yes\n     2\n   ''',\n   '''\n   if (false) {\n     1;\n   } else if (true) {\n     2;\n   }\n   '''\n\ntest \"#4898: Lexer: backslash line continuation is inconsistent\", ->\n  if ( \\\n      false \\\n      or \\\n      true \\\n    )\n    a = 42\n\n  eq a, 42\n\n  if ( \\\n      false \\\n      or \\\n      true \\\n  )\n    b = 42\n\n  eq b, 42\n\n  if ( \\\n            false \\\n         or \\\n   true \\\n  )\n    c = 42\n\n  eq c, 42\n\n  if \\\n   false \\\n        or \\\n   true\n    d = 42\n\n  eq d, 42\n\n  if \\\n              false or \\\n  true\n    e = 42\n\n  eq e, 42\n\n  if \\\n       false or \\\n    true \\\n       then \\\n   f = 42 \\\n   else\n     f = 24\n\n  eq f, 42\n"
  },
  {
    "path": "test/error_messages.coffee",
    "content": "# Error Formatting\n# ----------------\n\n# Ensure that errors of different kinds (lexer, parser and compiler) are shown\n# in a consistent way.\n\nerrCallback = (expectedErrorFormat) -> (err) ->\n  err.colorful = no\n  eq expectedErrorFormat, \"#{err}\"\n  yes\nassertErrorFormatNoAst = (code, expectedErrorFormat) ->\n  throws (-> CoffeeScript.run code), errCallback(expectedErrorFormat)\nassertErrorFormat = (code, expectedErrorFormat) ->\n  assertErrorFormatNoAst code, expectedErrorFormat\n  throws (-> CoffeeScript.compile code, ast: yes), errCallback(expectedErrorFormat)\n\ntest \"lexer errors formatting\", ->\n  assertErrorFormat '''\n    normalObject    = {}\n    insideOutObject = }{\n  ''',\n  '''\n    [stdin]:2:19: error: unmatched }\n    insideOutObject = }{\n                      ^\n  '''\n\ntest \"parser error formatting\", ->\n  assertErrorFormat '''\n    foo in bar or in baz\n  ''',\n  '''\n    [stdin]:1:15: error: unexpected in\n    foo in bar or in baz\n                  ^^\n  '''\n\ntest \"compiler error formatting\", ->\n  assertErrorFormat '''\n    evil = (foo, eval, bar) ->\n  ''',\n  '''\n    [stdin]:1:14: error: 'eval' can't be assigned\n    evil = (foo, eval, bar) ->\n                 ^^^^\n  '''\n\nif require?\n  os   = require 'os'\n  fs   = require 'fs'\n  path = require 'path'\n\n  test \"patchStackTrace line patching\", ->\n    err = new Error 'error'\n    ok err.stack.match /test[\\/\\\\]error_messages\\.coffee:\\d+:\\d+\\b/\n\n  test \"patchStackTrace stack prelude consistent with V8\", ->\n    err = new Error\n    ok err.stack.match /^Error\\n/ # Notice no colon when no message.\n\n    err = new Error 'error'\n    ok err.stack.match /^Error: error\\n/\n\n  test \"#2849: compilation error in a require()d file\", ->\n    # Create a temporary file to require().\n    tempFile = path.join os.tmpdir(), 'syntax-error.coffee'\n    ok not fs.existsSync tempFile\n    fs.writeFileSync tempFile, 'foo in bar or in baz'\n\n    try\n      assertErrorFormatNoAst \"\"\"\n        require '#{tempFile.replace /\\\\/g, '\\\\\\\\'}'\n      \"\"\",\n      \"\"\"\n        #{fs.realpathSync tempFile}:1:15: error: unexpected in\n        foo in bar or in baz\n                      ^^\n      \"\"\"\n    finally\n      fs.unlinkSync tempFile\n\n  test \"#3890: Error.prepareStackTrace doesn't throw an error if a compiled file is deleted\", ->\n    # Adapted from https://github.com/atom/coffee-cash/blob/master/spec/coffee-cash-spec.coffee\n    filePath = path.join os.tmpdir(), 'PrepareStackTraceTestFile.coffee'\n    fs.writeFileSync filePath, \"module.exports = -> throw new Error('hello world')\"\n    throwsAnError = require filePath\n    fs.unlinkSync filePath\n\n    try\n      throwsAnError()\n    catch error\n\n    eq error.message, 'hello world'\n    doesNotThrow(-> error.stack)\n    notEqual error.stack.toString().indexOf(filePath), -1, \"Expected \" + filePath + \"in stack trace: \" + error.stack.toString()\n\n  test \"#4418: stack traces for compiled files reference the correct line number\", ->\n    # The browser is already compiling other anonymous scripts (the tests)\n    # which will conflict.\n    return if global.testingBrowser\n    filePath = path.join os.tmpdir(), 'StackTraceLineNumberTestFile.coffee'\n    fileContents = \"\"\"\n      testCompiledFileStackTraceLineNumber = ->\n        # `a` on the next line is undefined and should throw a ReferenceError\n        console.log a if true\n\n      do testCompiledFileStackTraceLineNumber\n      \"\"\"\n    fs.writeFileSync filePath, fileContents\n\n    try\n      require filePath\n    catch error\n    fs.unlinkSync filePath\n\n    # Make sure the line number reported is line 3 (the original Coffee source)\n    # and not line 6 (the generated JavaScript).\n    eq /StackTraceLineNumberTestFile.coffee:(\\d)/.exec(error.stack.toString())[1], '3'\n\n\ntest \"#4418: stack traces for compiled strings reference the correct line number\", ->\n  # The browser is already compiling other anonymous scripts (the tests)\n  # which will conflict.\n  return if global.testingBrowser\n  try\n    CoffeeScript.run '''\n      testCompiledStringStackTraceLineNumber = ->\n        # `a` on the next line is undefined and should throw a ReferenceError\n        console.log a if true\n\n      do testCompiledStringStackTraceLineNumber\n      '''\n  catch error\n\n  # Make sure the line number reported is line 3 (the original Coffee source)\n  # and not line 6 (the generated JavaScript).\n  eq /testCompiledStringStackTraceLineNumber.*:(\\d):/.exec(error.stack.toString())[1], '3'\n\n\ntest \"#4558: compiling a string inside a script doesn’t screw up stack trace line number\", ->\n  # The browser is already compiling other anonymous scripts (the tests)\n  # which will conflict.\n  return if global.testingBrowser\n  try\n    CoffeeScript.run '''\n      testCompilingInsideAScriptDoesntScrewUpStackTraceLineNumber = ->\n        if require?\n          CoffeeScript = require './lib/coffeescript'\n          CoffeeScript.compile ''\n        throw new Error 'Some Error'\n\n      do testCompilingInsideAScriptDoesntScrewUpStackTraceLineNumber\n      '''\n  catch error\n\n  # Make sure the line number reported is line 5 (the original Coffee source)\n  # and not line 10 (the generated JavaScript).\n  eq /testCompilingInsideAScriptDoesntScrewUpStackTraceLineNumber.*:(\\d):/.exec(error.stack.toString())[1], '5'\n\ntest \"#1096: unexpected generated tokens\", ->\n  # Implicit ends\n  assertErrorFormat 'a:, b', '''\n    [stdin]:1:3: error: unexpected ,\n    a:, b\n      ^\n  '''\n  # Explicit ends\n  assertErrorFormat '(a:)', '''\n    [stdin]:1:4: error: unexpected )\n    (a:)\n       ^\n  '''\n  # Unexpected end of file\n  assertErrorFormat 'a:', '''\n    [stdin]:1:3: error: unexpected end of input\n    a:\n      ^\n  '''\n  assertErrorFormat 'a +', '''\n    [stdin]:1:4: error: unexpected end of input\n    a +\n       ^\n  '''\n  # Unexpected key in implicit object (an implicit object itself is _not_\n  # unexpected here)\n  assertErrorFormat '''\n    for i in [1]:\n      1\n  ''', '''\n    [stdin]:2:4: error: unexpected end of input\n      1\n       ^\n  '''\n  # Unexpected regex\n  assertErrorFormat '{/a/i: val}', '''\n    [stdin]:1:2: error: unexpected regex\n    {/a/i: val}\n     ^^^^\n  '''\n  assertErrorFormat '{///a///i: val}', '''\n    [stdin]:1:2: error: unexpected regex\n    {///a///i: val}\n     ^^^^^^^^\n  '''\n  assertErrorFormat '{///#{a}///i: val}', '''\n    [stdin]:1:2: error: unexpected regex\n    {///#{a}///i: val}\n     ^^^^^^^^^^^\n  '''\n  # Unexpected string\n  assertErrorFormat 'import foo from \"lib-#{version}\"', '''\n    [stdin]:1:17: error: the name of the module to be imported from must be an uninterpolated string\n    import foo from \"lib-#{version}\"\n                    ^^^^^^^^^^^^^^^^\n  '''\n\n  # Unexpected number\n  assertErrorFormat '\"a\"0x00Af2', '''\n    [stdin]:1:4: error: unexpected number\n    \"a\"0x00Af2\n       ^^^^^^^\n  '''\n\ntest \"#1316: unexpected end of interpolation\", ->\n  assertErrorFormat '''\n    \"#{+}\"\n  ''', '''\n    [stdin]:1:5: error: unexpected end of interpolation\n    \"#{+}\"\n        ^\n  '''\n  assertErrorFormat '''\n    \"#{++}\"\n  ''', '''\n    [stdin]:1:6: error: unexpected end of interpolation\n    \"#{++}\"\n         ^\n  '''\n  assertErrorFormat '''\n    \"#{-}\"\n  ''', '''\n    [stdin]:1:5: error: unexpected end of interpolation\n    \"#{-}\"\n        ^\n  '''\n  assertErrorFormat '''\n    \"#{--}\"\n  ''', '''\n    [stdin]:1:6: error: unexpected end of interpolation\n    \"#{--}\"\n         ^\n  '''\n  assertErrorFormat '''\n    \"#{~}\"\n  ''', '''\n    [stdin]:1:5: error: unexpected end of interpolation\n    \"#{~}\"\n        ^\n  '''\n  assertErrorFormat '''\n    \"#{!}\"\n  ''', '''\n    [stdin]:1:5: error: unexpected end of interpolation\n    \"#{!}\"\n        ^\n  '''\n  assertErrorFormat '''\n    \"#{not}\"\n  ''', '''\n    [stdin]:1:7: error: unexpected end of interpolation\n    \"#{not}\"\n          ^\n  '''\n  assertErrorFormat '''\n    \"#{5) + (4}_\"\n  ''', '''\n    [stdin]:1:5: error: unmatched )\n    \"#{5) + (4}_\"\n        ^\n  '''\n  # #2918\n  assertErrorFormat '''\n    \"#{foo.}\"\n  ''', '''\n    [stdin]:1:8: error: unexpected end of interpolation\n    \"#{foo.}\"\n           ^\n  '''\n\ntest \"#3325: implicit indentation errors\", ->\n  assertErrorFormat '''\n    i for i in a then i\n  ''', '''\n    [stdin]:1:14: error: unexpected then\n    i for i in a then i\n                 ^^^^\n  '''\n\ntest \"explicit indentation errors\", ->\n  assertErrorFormat '''\n    a = b\n      c\n  ''', '''\n    [stdin]:2:1: error: unexpected indentation\n      c\n    ^^\n  '''\n\ntest \"unclosed strings\", ->\n  assertErrorFormat '''\n    '\n  ''', '''\n    [stdin]:1:1: error: missing '\n    '\n    ^\n  '''\n  assertErrorFormat '''\n    \"\n  ''', '''\n    [stdin]:1:1: error: missing \"\n    \"\n    ^\n  '''\n  assertErrorFormat \"\"\"\n    '''\n  \"\"\", \"\"\"\n    [stdin]:1:1: error: missing '''\n    '''\n    ^^^\n  \"\"\"\n  assertErrorFormat '''\n    \"\"\"\n  ''', '''\n    [stdin]:1:1: error: missing \"\"\"\n    \"\"\"\n    ^^^\n  '''\n  assertErrorFormat '''\n    \"#{\"\n  ''', '''\n    [stdin]:1:4: error: missing \"\n    \"#{\"\n       ^\n  '''\n  assertErrorFormat '''\n    \"\"\"#{\"\n  ''', '''\n    [stdin]:1:6: error: missing \"\n    \"\"\"#{\"\n         ^\n  '''\n  assertErrorFormat '''\n    \"#{\"\"\"\n  ''', '''\n    [stdin]:1:4: error: missing \"\"\"\n    \"#{\"\"\"\n       ^^^\n  '''\n  assertErrorFormat '''\n    \"\"\"#{\"\"\"\n  ''', '''\n    [stdin]:1:6: error: missing \"\"\"\n    \"\"\"#{\"\"\"\n         ^^^\n  '''\n  assertErrorFormat '''\n    ///#{\"\"\"\n  ''', '''\n    [stdin]:1:6: error: missing \"\"\"\n    ///#{\"\"\"\n         ^^^\n  '''\n  assertErrorFormat '''\n    \"a\n      #{foo \"\"\"\n        bar\n          #{ +'12 }\n        baz\n        \"\"\"} b\"\n  ''', '''\n    [stdin]:4:11: error: missing '\n          #{ +'12 }\n              ^\n  '''\n  # https://github.com/jashkenas/coffeescript/issues/3301#issuecomment-31735168\n  assertErrorFormat '''\n    # Note the double escaping; this would be `\"\"\"a\\\"\"\"` real code.\n    \"\"\"a\\\\\"\"\"\n  ''', '''\n    [stdin]:2:1: error: missing \"\"\"\n    \"\"\"a\\\\\"\"\"\n    ^^^\n  '''\n\ntest \"unclosed heregexes\", ->\n  assertErrorFormat '''\n    ///\n  ''', '''\n    [stdin]:1:1: error: missing ///\n    ///\n    ^^^\n  '''\n  # https://github.com/jashkenas/coffeescript/issues/3301#issuecomment-31735168\n  assertErrorFormat '''\n    # Note the double escaping; this would be `///a\\///` real code.\n    ///a\\\\///\n  ''', '''\n    [stdin]:2:1: error: missing ///\n    ///a\\\\///\n    ^^^\n  '''\n\ntest \"unexpected token after string\", ->\n  # Parsing error.\n  assertErrorFormat '''\n    'foo'bar\n  ''', '''\n    [stdin]:1:6: error: unexpected identifier\n    'foo'bar\n         ^^^\n  '''\n  assertErrorFormat '''\n    \"foo\"bar\n  ''', '''\n    [stdin]:1:6: error: unexpected identifier\n    \"foo\"bar\n         ^^^\n  '''\n  # Lexing error.\n  assertErrorFormat '''\n    'foo'bar'\n  ''', '''\n    [stdin]:1:9: error: missing '\n    'foo'bar'\n            ^\n  '''\n  assertErrorFormat '''\n    \"foo\"bar\"\n  ''', '''\n    [stdin]:1:9: error: missing \"\n    \"foo\"bar\"\n            ^\n  '''\n\ntest \"#3348: Location data is wrong in interpolations with leading whitespace\", ->\n  assertErrorFormat '''\n    \"#{ * }\"\n  ''', '''\n    [stdin]:1:5: error: unexpected *\n    \"#{ * }\"\n        ^\n  '''\n\ntest \"octal escapes\", ->\n  assertErrorFormat '''\n    \"a\\\\0\\\\tb\\\\\\\\\\\\07c\"\n  ''', '''\n    [stdin]:1:10: error: octal escape sequences are not allowed \\\\07\n    \"a\\\\0\\\\tb\\\\\\\\\\\\07c\"\n      \\  \\   \\ \\ ^\\^^\n  '''\n  assertErrorFormat '''\n    \"a\n      #{b} \\\\1\"\n  ''', '''\n    [stdin]:2:8: error: octal escape sequences are not allowed \\\\1\n      #{b} \\\\1\"\n           ^\\^\n  '''\n  assertErrorFormat '''\n    /a\\\\0\\\\tb\\\\\\\\\\\\07c/\n  ''', '''\n    [stdin]:1:10: error: octal escape sequences are not allowed \\\\07\n    /a\\\\0\\\\tb\\\\\\\\\\\\07c/\n      \\  \\   \\ \\ ^\\^^\n  '''\n  assertErrorFormat '''\n    /a\\\\1\\\\tb\\\\\\\\\\\\07c/\n  ''', '''\n    [stdin]:1:10: error: octal escape sequences are not allowed \\\\07\n    /a\\\\1\\\\tb\\\\\\\\\\\\07c/\n      \\  \\   \\ \\ ^\\^^\n  '''\n  assertErrorFormat '''\n    ///a\n      #{b} \\\\01///\n  ''', '''\n    [stdin]:2:8: error: octal escape sequences are not allowed \\\\01\n      #{b} \\\\01///\n           ^\\^^\n  '''\n  # per #5211, also treat \\0[8-9] as (disallowed) octal escapes\n  assertErrorFormat '''\n    \"a\\\\0\\\\tb\\\\\\\\\\\\09c\"\n  ''', '''\n    [stdin]:1:10: error: octal escape sequences are not allowed \\\\09\n    \"a\\\\0\\\\tb\\\\\\\\\\\\09c\"\n      \\  \\   \\ \\ ^\\^^\n  '''\n  assertErrorFormat '''\n    ///a\n      #{b} \\\\08///\n  ''', '''\n    [stdin]:2:8: error: octal escape sequences are not allowed \\\\08\n      #{b} \\\\08///\n           ^\\^^\n  '''\n\ntest \"#3795: invalid escapes\", ->\n  assertErrorFormat '''\n    \"a\\\\0\\\\tb\\\\\\\\\\\\x7g\"\n  ''', '''\n    [stdin]:1:10: error: invalid escape sequence \\\\x7g\n    \"a\\\\0\\\\tb\\\\\\\\\\\\x7g\"\n      \\  \\   \\ \\ ^\\^^^\n  '''\n  assertErrorFormat '''\n    \"a\n      #{b} \\\\uA02\n     c\"\n  ''', '''\n    [stdin]:2:8: error: invalid escape sequence \\\\uA02\n      #{b} \\\\uA02\n           ^\\^^^^\n  '''\n  assertErrorFormat '''\n    /a\\\\u002space/\n  ''', '''\n    [stdin]:1:3: error: invalid escape sequence \\\\u002s\n    /a\\\\u002space/\n      ^\\^^^^^\n  '''\n  assertErrorFormat '''\n    ///a \\\\u002 0 space///\n  ''', '''\n    [stdin]:1:6: error: invalid escape sequence \\\\u002 \\n\\\n    ///a \\\\u002 0 space///\n         ^\\^^^^^\n  '''\n  assertErrorFormat '''\n    ///a\n      #{b} \\\\x0\n     c///\n  ''', '''\n    [stdin]:2:8: error: invalid escape sequence \\\\x0\n      #{b} \\\\x0\n           ^\\^^\n  '''\n  assertErrorFormat '''\n    /ab\\\\u/\n  ''', '''\n    [stdin]:1:4: error: invalid escape sequence \\\\u\n    /ab\\\\u/\n       ^\\^\n  '''\n\ntest \"illegal herecomment\", ->\n  assertErrorFormat '''\n    ###\n      Regex: /a*/g\n    ###\n  ''', '''\n    [stdin]:2:12: error: block comments cannot contain */\n      Regex: /a*/g\n               ^^\n  '''\n\ntest \"#1724: regular expressions beginning with *\", ->\n  assertErrorFormat '''\n    /* foo/\n  ''', '''\n    [stdin]:1:2: error: regular expressions cannot begin with *\n    /* foo/\n     ^\n  '''\n  assertErrorFormat '''\n    ///\n      * foo\n    ///\n  ''', '''\n    [stdin]:2:3: error: regular expressions cannot begin with *\n      * foo\n      ^\n  '''\n\ntest \"invalid regex flags\", ->\n  assertErrorFormat '''\n    /a/ii\n  ''', '''\n    [stdin]:1:4: error: invalid regular expression flags ii\n    /a/ii\n       ^^\n  '''\n  assertErrorFormat '''\n    /a/G\n  ''', '''\n    [stdin]:1:4: error: invalid regular expression flags G\n    /a/G\n       ^\n  '''\n  assertErrorFormat '''\n    /a/gimi\n  ''', '''\n    [stdin]:1:4: error: invalid regular expression flags gimi\n    /a/gimi\n       ^^^^\n  '''\n  assertErrorFormat '''\n    /a/g_\n  ''', '''\n    [stdin]:1:4: error: invalid regular expression flags g_\n    /a/g_\n       ^^\n  '''\n  assertErrorFormat '''\n    ///a///ii\n  ''', '''\n    [stdin]:1:8: error: invalid regular expression flags ii\n    ///a///ii\n           ^^\n  '''\n  doesNotThrowCompileError '/a/ymgi'\n\ntest \"missing `)`, `}`, `]`\", ->\n  assertErrorFormat '''\n    (\n  ''', '''\n    [stdin]:1:1: error: missing )\n    (\n    ^\n  '''\n  assertErrorFormat '''\n    {\n  ''', '''\n    [stdin]:1:1: error: missing }\n    {\n    ^\n  '''\n  assertErrorFormat '''\n    [\n  ''', '''\n    [stdin]:1:1: error: missing ]\n    [\n    ^\n  '''\n  assertErrorFormat '''\n    obj = {a: [1, (2+\n  ''', '''\n    [stdin]:1:15: error: missing )\n    obj = {a: [1, (2+\n                  ^\n  '''\n  assertErrorFormat '''\n    \"#{\n  ''', '''\n    [stdin]:1:3: error: missing }\n    \"#{\n      ^\n  '''\n  assertErrorFormat '''\n    \"\"\"\n      foo#{ bar \"#{1}\"\n  ''', '''\n    [stdin]:2:7: error: missing }\n      foo#{ bar \"#{1}\"\n          ^\n  '''\n\ntest \"unclosed regexes\", ->\n  assertErrorFormat '''\n    /\n  ''', '''\n    [stdin]:1:1: error: missing / (unclosed regex)\n    /\n    ^\n  '''\n  assertErrorFormat '''\n    # Note the double escaping; this would be `/a\\/` real code.\n    /a\\\\/\n  ''', '''\n    [stdin]:2:1: error: missing / (unclosed regex)\n    /a\\\\/\n    ^\n  '''\n  assertErrorFormat '''\n    /// ^\n      a #{\"\"\" \"\"#{if /[/].test \"|\" then 1 else 0}\"\" \"\"\"}\n    ///\n  ''', '''\n    [stdin]:2:18: error: missing / (unclosed regex)\n      a #{\"\"\" \"\"#{if /[/].test \"|\" then 1 else 0}\"\" \"\"\"}\n                     ^\n  '''\n\ntest \"duplicate function arguments\", ->\n  assertErrorFormat '''\n    (foo, bar, foo) ->\n  ''', '''\n    [stdin]:1:12: error: multiple parameters named 'foo'\n    (foo, bar, foo) ->\n               ^^^\n  '''\n  assertErrorFormat '''\n    (@foo, bar, @foo) ->\n  ''', '''\n    [stdin]:1:13: error: multiple parameters named '@foo'\n    (@foo, bar, @foo) ->\n                ^^^^\n  '''\n\ntest \"reserved words\", ->\n  assertErrorFormat '''\n    case\n  ''', '''\n    [stdin]:1:1: error: reserved word 'case'\n    case\n    ^^^^\n  '''\n  assertErrorFormat '''\n    case = 1\n  ''', '''\n    [stdin]:1:1: error: reserved word 'case'\n    case = 1\n    ^^^^\n  '''\n  assertErrorFormat '''\n    for = 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'for' can't be assigned\n    for = 1\n    ^^^\n  '''\n  assertErrorFormat '''\n    unless = 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'unless' can't be assigned\n    unless = 1\n    ^^^^^^\n  '''\n  assertErrorFormat '''\n    for += 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'for' can't be assigned\n    for += 1\n    ^^^\n  '''\n  assertErrorFormat '''\n    for &&= 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'for' can't be assigned\n    for &&= 1\n    ^^^\n  '''\n  # Make sure token look-behind doesn't go out of range.\n  assertErrorFormat '''\n    &&= 1\n  ''', '''\n    [stdin]:1:1: error: unexpected &&=\n    &&= 1\n    ^^^\n  '''\n  # #2306: Show unaliased name in error messages.\n  assertErrorFormat '''\n    on = 1\n  ''', '''\n    [stdin]:1:1: error: keyword 'on' can't be assigned\n    on = 1\n    ^^\n  '''\n\ntest \"strict mode errors\", ->\n  assertErrorFormat '''\n    eval = 1\n  ''', '''\n    [stdin]:1:1: error: 'eval' can't be assigned\n    eval = 1\n    ^^^^\n  '''\n  assertErrorFormat '''\n    class eval\n  ''', '''\n    [stdin]:1:7: error: 'eval' can't be assigned\n    class eval\n          ^^^^\n  '''\n  assertErrorFormat '''\n    arguments++\n  ''', '''\n    [stdin]:1:1: error: 'arguments' can't be assigned\n    arguments++\n    ^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    --arguments\n  ''', '''\n    [stdin]:1:3: error: 'arguments' can't be assigned\n    --arguments\n      ^^^^^^^^^\n  '''\n\ntest \"invalid numbers\", ->\n  assertErrorFormat '''\n    0X0\n  ''', '''\n    [stdin]:1:2: error: radix prefix in '0X0' must be lowercase\n    0X0\n     ^\n  '''\n  assertErrorFormat '''\n    018\n  ''', '''\n    [stdin]:1:1: error: decimal literal '018' must not be prefixed with '0'\n    018\n    ^^^\n  '''\n  assertErrorFormat '''\n    010\n  ''', '''\n    [stdin]:1:1: error: octal literal '010' must be prefixed with '0o'\n    010\n    ^^^\n'''\n\n\ntest \"unexpected object keys\", ->\n  assertErrorFormat '''\n    {(a + \"b\")}\n  ''', '''\n    [stdin]:1:11: error: unexpected }\n    {(a + \"b\")}\n              ^\n  '''\n  assertErrorFormat '''\n    {(a + \"b\"): 1}\n  ''', '''\n    [stdin]:1:11: error: unexpected :\n    {(a + \"b\"): 1}\n              ^\n  '''\n  assertErrorFormat '''\n    (a + \"b\"): 1\n  ''', '''\n    [stdin]:1:10: error: unexpected :\n    (a + \"b\"): 1\n             ^\n  '''\n\ntest \"invalid object keys\", ->\n  assertErrorFormat '''\n    @a: 1\n  ''', '''\n    [stdin]:1:1: error: invalid object key\n    @a: 1\n    ^^\n  '''\n  assertErrorFormat '''\n    f\n      @a: 1\n  ''', '''\n    [stdin]:2:3: error: invalid object key\n      @a: 1\n      ^^\n  '''\n  assertErrorFormat '''\n    {a=2}\n  ''', '''\n    [stdin]:1:3: error: unexpected =\n    {a=2}\n      ^\n  '''\n  assertErrorFormat '''\n    @[a]: 1\n  ''', '''\n    [stdin]:1:1: error: invalid object key\n    @[a]: 1\n    ^^^^\n  '''\n\ntest \"invalid destructuring default target\", ->\n  assertErrorFormat '''\n    {'a' = 2} = obj\n  ''', '''\n    [stdin]:1:6: error: unexpected =\n    {'a' = 2} = obj\n         ^\n  '''\n\ntest \"#4070: lone expansion\", ->\n  assertErrorFormat '''\n    [...] = a\n  ''', '''\n    [stdin]:1:2: error: Destructuring assignment has no target\n    [...] = a\n     ^^^\n  '''\n  assertErrorFormat '''\n    [ ..., ] = a\n  ''', '''\n    [stdin]:1:3: error: Destructuring assignment has no target\n    [ ..., ] = a\n      ^^^\n  '''\n\ntest \"#3926: implicit object in parameter list\", ->\n  assertErrorFormat '''\n    (a: b) ->\n  ''', '''\n    [stdin]:1:3: error: unexpected :\n    (a: b) ->\n      ^\n  '''\n  assertErrorFormat '''\n    (one, two, {three, four: five}, key: value) ->\n  ''', '''\n    [stdin]:1:36: error: unexpected :\n    (one, two, {three, four: five}, key: value) ->\n                                       ^\n  '''\n\ntest \"#4130: unassignable in destructured param\", ->\n  assertErrorFormat '''\n    fun = ({\n      @param : null\n    }) ->\n      console.log \"Oh hello!\"\n  ''', '''\n    [stdin]:2:12: error: keyword 'null' can't be assigned\n      @param : null\n               ^^^^\n  '''\n  assertErrorFormat '''\n    ({a: null}) ->\n  ''', '''\n    [stdin]:1:6: error: keyword 'null' can't be assigned\n    ({a: null}) ->\n         ^^^^\n  '''\n  assertErrorFormat '''\n    ({a: 1}) ->\n  ''', '''\n    [stdin]:1:6: error: '1' can't be assigned\n    ({a: 1}) ->\n         ^\n  '''\n  assertErrorFormat '''\n    ({1}) ->\n  ''', '''\n    [stdin]:1:3: error: '1' can't be assigned\n    ({1}) ->\n      ^\n  '''\n  assertErrorFormat '''\n    ({a: true = 1}) ->\n  ''', '''\n    [stdin]:1:6: error: keyword 'true' can't be assigned\n    ({a: true = 1}) ->\n         ^^^^\n  '''\n\ntest \"`yield` outside of a function\", ->\n  assertErrorFormat '''\n    yield 1\n  ''', '''\n    [stdin]:1:1: error: yield can only occur inside functions\n    yield 1\n    ^^^^^^^\n  '''\n  assertErrorFormat '''\n    yield return\n  ''', '''\n    [stdin]:1:1: error: yield can only occur inside functions\n    yield return\n    ^^^^^^^^^^^^\n  '''\n\ntest \"#4097: `yield return` as an expression\", ->\n  assertErrorFormat '''\n    -> (yield return)\n  ''', '''\n    [stdin]:1:5: error: cannot use a pure statement in an expression\n    -> (yield return)\n        ^^^^^^^^^^^^\n  '''\n\ntest \"#5013: `await return` as an expression\", ->\n  assertErrorFormat '''\n    -> (await return)\n  ''', '''\n    [stdin]:1:5: error: cannot use a pure statement in an expression\n    -> (await return)\n        ^^^^^^^^^^^^\n  '''\n\ntest \"#5013: `return` as an expression\", ->\n  assertErrorFormat '''\n    -> (return)\n  ''', '''\n    [stdin]:1:5: error: cannot use a pure statement in an expression\n    -> (return)\n        ^^^^^^\n  '''\n\ntest \"#5013: `break` as an expression\", ->\n  assertErrorFormat '''\n    (b = 1; break) for b in a\n  ''', '''\n    [stdin]:1:9: error: cannot use a pure statement in an expression\n    (b = 1; break) for b in a\n            ^^^^^\n  '''\n\ntest \"#5013: `continue` as an expression\", ->\n  assertErrorFormat '''\n    (b = 1; continue) for b in a\n  ''', '''\n    [stdin]:1:9: error: cannot use a pure statement in an expression\n    (b = 1; continue) for b in a\n            ^^^^^^^^\n  '''\n\ntest \"`&&=` and `||=` with a space in-between\", ->\n  assertErrorFormat '''\n    a = 0\n    a && = 1\n  ''', '''\n    [stdin]:2:6: error: unexpected =\n    a && = 1\n         ^\n  '''\n  assertErrorFormat '''\n    a = 0\n    a and = 1\n  ''', '''\n    [stdin]:2:7: error: unexpected =\n    a and = 1\n          ^\n  '''\n  assertErrorFormat '''\n    a = 0\n    a || = 1\n  ''', '''\n    [stdin]:2:6: error: unexpected =\n    a || = 1\n         ^\n  '''\n  assertErrorFormat '''\n    a = 0\n    a or = 1\n  ''', '''\n    [stdin]:2:6: error: unexpected =\n    a or = 1\n         ^\n  '''\n\ntest \"anonymous functions cannot be exported\", ->\n  assertErrorFormat '''\n    export ->\n      console.log 'hello, world!'\n  ''', '''\n    [stdin]:1:8: error: unexpected ->\n    export ->\n           ^^\n  '''\n\ntest \"anonymous classes cannot be exported\", ->\n  assertErrorFormat '''\n    export class\n      constructor: ->\n        console.log 'hello, world!'\n  ''', '''\n    [stdin]:1:8: error: anonymous classes cannot be exported\n    export class\n           ^^^^^\n  '''\n\ntest \"unless enclosed by curly braces, only * can be aliased\", ->\n  assertErrorFormat '''\n    import foo as bar from 'lib'\n  ''', '''\n    [stdin]:1:12: error: unexpected as\n    import foo as bar from 'lib'\n               ^^\n  '''\n\ntest \"unwrapped imports must follow constrained syntax\", ->\n  assertErrorFormat '''\n    import foo, bar from 'lib'\n  ''', '''\n    [stdin]:1:13: error: unexpected identifier\n    import foo, bar from 'lib'\n                ^^^\n  '''\n  assertErrorFormat '''\n    import foo, bar, baz from 'lib'\n  ''', '''\n    [stdin]:1:13: error: unexpected identifier\n    import foo, bar, baz from 'lib'\n                ^^^\n  '''\n  assertErrorFormat '''\n    import foo, bar as baz from 'lib'\n  ''', '''\n    [stdin]:1:13: error: unexpected identifier\n    import foo, bar as baz from 'lib'\n                ^^^\n  '''\n\ntest \"cannot export * without a module to export from\", ->\n  assertErrorFormat '''\n    export *\n  ''', '''\n    [stdin]:1:9: error: unexpected end of input\n    export *\n            ^\n  '''\n\ntest \"imports and exports must be top-level\", ->\n  assertErrorFormatNoAst '''\n    if foo\n      import { bar } from 'lib'\n  ''', '''\n    [stdin]:2:3: error: import statements must be at top-level scope\n      import { bar } from 'lib'\n      ^^^^^^^^^^^^^^^^^^^^^^^^^\n  '''\n  assertErrorFormatNoAst '''\n    foo = ->\n      export { bar }\n  ''', '''\n    [stdin]:2:3: error: export statements must be at top-level scope\n      export { bar }\n      ^^^^^^^^^^^^^^\n  '''\n\ntest \"cannot import the same member more than once\", ->\n  assertErrorFormat '''\n    import { foo, foo } from 'lib'\n  ''', '''\n    [stdin]:1:15: error: 'foo' has already been declared\n    import { foo, foo } from 'lib'\n                  ^^^\n  '''\n  assertErrorFormat '''\n    import { foo, bar, foo } from 'lib'\n  ''', '''\n    [stdin]:1:20: error: 'foo' has already been declared\n    import { foo, bar, foo } from 'lib'\n                       ^^^\n  '''\n  assertErrorFormat '''\n    import { foo, bar as foo } from 'lib'\n  ''', '''\n    [stdin]:1:15: error: 'foo' has already been declared\n    import { foo, bar as foo } from 'lib'\n                  ^^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    import foo, { foo } from 'lib'\n  ''', '''\n    [stdin]:1:15: error: 'foo' has already been declared\n    import foo, { foo } from 'lib'\n                  ^^^\n  '''\n  assertErrorFormat '''\n    import foo, { bar as foo } from 'lib'\n  ''', '''\n    [stdin]:1:15: error: 'foo' has already been declared\n    import foo, { bar as foo } from 'lib'\n                  ^^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    import foo from 'libA'\n    import foo from 'libB'\n  ''', '''\n    [stdin]:2:8: error: 'foo' has already been declared\n    import foo from 'libB'\n           ^^^\n  '''\n  assertErrorFormat '''\n    import * as foo from 'libA'\n    import { foo } from 'libB'\n  ''', '''\n    [stdin]:2:10: error: 'foo' has already been declared\n    import { foo } from 'libB'\n             ^^^\n  '''\n\ntest \"imported members cannot be reassigned\", ->\n  assertErrorFormat '''\n    import { foo } from 'lib'\n    foo = 'bar'\n  ''', '''\n    [stdin]:2:1: error: 'foo' is read-only\n    foo = 'bar'\n    ^^^\n  '''\n  assertErrorFormat '''\n    import { foo } from 'lib'\n    export default foo = 'bar'\n  ''', '''\n    [stdin]:2:16: error: 'foo' is read-only\n    export default foo = 'bar'\n                   ^^^\n  '''\n  assertErrorFormat '''\n    import { foo } from 'lib'\n    export foo = 'bar'\n  ''', '''\n    [stdin]:2:8: error: 'foo' is read-only\n    export foo = 'bar'\n           ^^^\n  '''\n\ntest \"bound functions cannot be generators\", ->\n  assertErrorFormat 'f = => yield this', '''\n    [stdin]:1:8: error: yield cannot occur inside bound (fat arrow) functions\n    f = => yield this\n           ^^^^^^^^^^\n  '''\n\ntest \"#4790: bound functions cannot be generators, even when we’re creating IIFEs\", ->\n  assertErrorFormat '''\n  =>\n    for x in []\n      for y in []\n        yield z\n  ''', '''\n    [stdin]:4:7: error: yield cannot occur inside bound (fat arrow) functions\n          yield z\n          ^^^^^^^\n  '''\n\ntest \"CoffeeScript keywords cannot be used as unaliased names in import lists\", ->\n  assertErrorFormat \"\"\"\n    import { unless, baz as bar } from 'lib'\n    bar.barMethod()\n  \"\"\", '''\n    [stdin]:1:10: error: unexpected unless\n    import { unless, baz as bar } from 'lib'\n             ^^^^^^\n  '''\n\ntest \"CoffeeScript keywords cannot be used as local names in import list aliases\", ->\n  assertErrorFormat \"\"\"\n    import { bar as unless, baz as bar } from 'lib'\n    bar.barMethod()\n  \"\"\", '''\n    [stdin]:1:17: error: unexpected unless\n    import { bar as unless, baz as bar } from 'lib'\n                    ^^^^^^\n  '''\n\ntest \"cannot have `await return` outside a function\", ->\n  assertErrorFormat '''\n    await return\n  ''', '''\n    [stdin]:1:1: error: await can only occur inside functions\n    await return\n    ^^^^^^^^^^^^\n  '''\n\ntest \"indexes are not supported in for-from loops\", ->\n  assertErrorFormat \"x for x, i from [1, 2, 3]\", '''\n    [stdin]:1:10: error: cannot use index with for-from\n    x for x, i from [1, 2, 3]\n             ^\n  '''\n\ntest \"own is not supported in for-from loops\", ->\n  assertErrorFormat \"x for own x from [1, 2, 3]\", '''\n    [stdin]:1:7: error: cannot use own with for-from\n    x for own x from [1, 2, 3]\n          ^^^\n    '''\n\ntest \"tagged template literals must be called by an identifier\", ->\n  assertErrorFormat \"1''\", '''\n    [stdin]:1:1: error: literal is not a function\n    1''\n    ^\n  '''\n  assertErrorFormat '1\"\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"\"\n    ^\n  '''\n  assertErrorFormat \"1'b'\", '''\n    [stdin]:1:1: error: literal is not a function\n    1'b'\n    ^\n  '''\n  assertErrorFormat '1\"b\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"b\"\n    ^\n  '''\n  assertErrorFormat \"1'''b'''\", \"\"\"\n    [stdin]:1:1: error: literal is not a function\n    1'''b'''\n    ^\n  \"\"\"\n  assertErrorFormat '1\"\"\"b\"\"\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"\"\"b\"\"\"\n    ^\n  '''\n  assertErrorFormat '1\"#{b}\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"#{b}\"\n    ^\n  '''\n  assertErrorFormat '1\"\"\"#{b}\"\"\"', '''\n    [stdin]:1:1: error: literal is not a function\n    1\"\"\"#{b}\"\"\"\n    ^\n  '''\n\ntest \"constructor functions can't be async\", ->\n  assertErrorFormat 'class then constructor: -> await x', '''\n    [stdin]:1:12: error: Class constructor may not be async\n    class then constructor: -> await x\n               ^^^^^^^^^^^\n  '''\n\ntest \"constructor functions can't be generators\", ->\n  assertErrorFormat 'class then constructor: -> yield', '''\n    [stdin]:1:12: error: Class constructor may not be a generator\n    class then constructor: -> yield\n               ^^^^^^^^^^^\n  '''\n\ntest \"non-derived constructors can't call super\", ->\n  assertErrorFormat 'class then constructor: -> super()', '''\n    [stdin]:1:28: error: 'super' is only allowed in derived class constructors\n    class then constructor: -> super()\n                               ^^^^^^^\n  '''\n\ntest \"derived constructors can't reference `this` before calling super\", ->\n  assertErrorFormat 'class extends A then constructor: -> @', '''\n    [stdin]:1:38: error: Can't reference 'this' before calling super in derived class constructors\n    class extends A then constructor: -> @\n                                         ^\n  '''\n\ntest \"derived constructors can't use @params without calling super\", ->\n  assertErrorFormat 'class extends A then constructor: (@a) ->', '''\n    [stdin]:1:36: error: Can't use @params in derived class constructors without calling super\n    class extends A then constructor: (@a) ->\n                                       ^^\n  '''\n\ntest \"derived constructors can't call super with @params\", ->\n  assertErrorFormat 'class extends A then constructor: (@a) -> super(@a)', '''\n    [stdin]:1:49: error: Can't call super with @params in derived class constructors\n    class extends A then constructor: (@a) -> super(@a)\n                                                    ^^\n  '''\n\ntest \"derived constructors can't call super with buried @params\", ->\n  assertErrorFormat 'class extends A then constructor: (@a) -> super((=> @a)())', '''\n    [stdin]:1:53: error: Can't call super with @params in derived class constructors\n    class extends A then constructor: (@a) -> super((=> @a)())\n                                                        ^^\n  '''\n\ntest \"'super' is not allowed in constructor parameter defaults\", ->\n  assertErrorFormat 'class extends A then constructor: (a = super()) ->', '''\n    [stdin]:1:40: error: 'super' is not allowed in constructor parameter defaults\n    class extends A then constructor: (a = super()) ->\n                                           ^^^^^^^\n  '''\n\ntest \"can't use pattern matches for loop indices\", ->\n  assertErrorFormat 'a for b, {c} in d', '''\n    [stdin]:1:10: error: index cannot be a pattern matching expression\n    a for b, {c} in d\n             ^^^\n  '''\n\ntest \"bare 'super' is no longer allowed\", ->\n  # TODO Improve this error message (it should at least be 'unexpected super')\n  assertErrorFormat 'class extends A then constructor: -> super', '''\n    [stdin]:1:35: error: unexpected ->\n    class extends A then constructor: -> super\n                                      ^^\n  '''\n\ntest \"soaked 'super' in constructor\", ->\n  assertErrorFormat 'class extends A then constructor: -> super?()', '''\n    [stdin]:1:38: error: Unsupported reference to 'super'\n    class extends A then constructor: -> super?()\n                                         ^^^^^\n  '''\n\ntest \"new with 'super'\", ->\n  assertErrorFormat 'class extends A then foo: -> new super()', '''\n    [stdin]:1:34: error: Unsupported reference to 'super'\n    class extends A then foo: -> new super()\n                                     ^^^^^\n  '''\n\ntest \"'super' outside method\", ->\n  assertErrorFormat 'super()', '''\n    [stdin]:1:1: error: cannot use super outside of an instance method\n    super()\n    ^^^^^\n  '''\n\ntest \"getter keyword in object\", ->\n  assertErrorFormat '''\n    obj =\n      get foo: ->\n  ''', '''\n    [stdin]:2:3: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n      get foo: ->\n      ^^^\n  '''\n\ntest \"setter keyword in object\", ->\n  assertErrorFormat '''\n    obj =\n      set foo: ->\n  ''', '''\n    [stdin]:2:3: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n      set foo: ->\n      ^^^\n  '''\n\ntest \"getter keyword in inline implicit object\", ->\n  assertErrorFormat 'obj = get foo: ->', '''\n    [stdin]:1:7: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n    obj = get foo: ->\n          ^^^\n  '''\n\ntest \"setter keyword in inline implicit object\", ->\n  assertErrorFormat 'obj = set foo: ->', '''\n    [stdin]:1:7: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n    obj = set foo: ->\n          ^^^\n  '''\n\ntest \"getter keyword in inline explicit object\", ->\n  assertErrorFormat 'obj = {get foo: ->}', '''\n    [stdin]:1:8: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n    obj = {get foo: ->}\n           ^^^\n  '''\n\ntest \"setter keyword in inline explicit object\", ->\n  assertErrorFormat 'obj = {set foo: ->}', '''\n    [stdin]:1:8: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n    obj = {set foo: ->}\n           ^^^\n  '''\n\ntest \"getter keyword in function\", ->\n  assertErrorFormat '''\n    f = ->\n      get foo: ->\n  ''', '''\n    [stdin]:2:3: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n      get foo: ->\n      ^^^\n  '''\n\ntest \"setter keyword in function\", ->\n  assertErrorFormat '''\n    f = ->\n      set foo: ->\n  ''', '''\n    [stdin]:2:3: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n      set foo: ->\n      ^^^\n  '''\n\ntest \"getter keyword in inline function\", ->\n  assertErrorFormat 'f = -> get foo: ->', '''\n    [stdin]:1:8: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n    f = -> get foo: ->\n           ^^^\n  '''\n\ntest \"setter keyword in inline function\", ->\n  assertErrorFormat 'f = -> set foo: ->', '''\n    [stdin]:1:8: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n    f = -> set foo: ->\n           ^^^\n  '''\n\ntest \"getter keyword in class\", ->\n  assertErrorFormat '''\n    class A\n      get foo: ->\n  ''', '''\n    [stdin]:2:3: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n      get foo: ->\n      ^^^\n  '''\n\ntest \"setter keyword in class\", ->\n  assertErrorFormat '''\n    class A\n      set foo: ->\n  ''', '''\n    [stdin]:2:3: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n      set foo: ->\n      ^^^\n  '''\n\ntest \"getter keyword in inline class\", ->\n  assertErrorFormat 'class A then get foo: ->', '''\n      [stdin]:1:14: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n      class A then get foo: ->\n                   ^^^\n  '''\n\ntest \"setter keyword in inline class\", ->\n  assertErrorFormat 'class A then set foo: ->', '''\n      [stdin]:1:14: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n      class A then set foo: ->\n                   ^^^\n  '''\n\ntest \"getter keyword before static method\", ->\n  assertErrorFormat '''\n    class A\n      get @foo = ->\n  ''', '''\n    [stdin]:2:3: error: 'get' cannot be used as a keyword, or as a function call without parentheses\n      get @foo = ->\n      ^^^\n  '''\n\ntest \"setter keyword before static method\", ->\n  assertErrorFormat '''\n    class A\n      set @foo = ->\n  ''', '''\n    [stdin]:2:3: error: 'set' cannot be used as a keyword, or as a function call without parentheses\n      set @foo = ->\n      ^^^\n  '''\n\ntest \"#4248: Unicode code point escapes\", ->\n  assertErrorFormat '''\n    \"a\n      #{b} \\\\u{G02}\n     c\"\n  ''', '''\n    [stdin]:2:8: error: invalid escape sequence \\\\u{G02}\n      #{b} \\\\u{G02}\n           ^\\^^^^^^\n  '''\n  assertErrorFormat '''\n    /a\\\\u{}b/\n  ''', '''\n    [stdin]:1:3: error: invalid escape sequence \\\\u{}\n    /a\\\\u{}b/\n      ^\\^^^\n  '''\n  assertErrorFormat '''\n    ///a \\\\u{01abc///\n  ''', '''\n    [stdin]:1:6: error: invalid escape sequence \\\\u{01abc\n    ///a \\\\u{01abc///\n         ^\\^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    /\\\\u{123} \\\\u{110000}/\n  ''', '''\n    [stdin]:1:10: error: unicode code point escapes greater than \\\\u{10ffff} are not allowed\n    /\\\\u{123} \\\\u{110000}/\n      \\       ^\\^^^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    ///abc\\\\\\\\\\\\u{123456}///u\n  ''', '''\n    [stdin]:1:9: error: unicode code point escapes greater than \\\\u{10ffff} are not allowed\n    ///abc\\\\\\\\\\\\u{123456}///u\n           \\ \\^\\^^^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    \"\"\"\n      \\\\u{123}\n      a\n        \\\\u{00110000}\n      #{ 'b' }\n    \"\"\"\n  ''', '''\n    [stdin]:4:5: error: unicode code point escapes greater than \\\\u{10ffff} are not allowed\n        \\\\u{00110000}\n        ^\\^^^^^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    '\\\\u{a}\\\\u{1111110000}'\n  ''', '''\n    [stdin]:1:7: error: unicode code point escapes greater than \\\\u{10ffff} are not allowed\n    '\\\\u{a}\\\\u{1111110000}'\n      \\    ^\\^^^^^^^^^^^^^\n  '''\n\ntest \"JSX error: non-matching tag names\", ->\n  assertErrorFormat '''\n    <div><span></div></span>\n  ''',\n  '''\n    [stdin]:1:7: error: expected corresponding JSX closing tag for span\n    <div><span></div></span>\n          ^^^^\n  '''\n\ntest \"JSX error: bare expressions not allowed\", ->\n  assertErrorFormat '''\n    <div x=3 />\n  ''',\n  '''\n    [stdin]:1:8: error: expected wrapped or quoted JSX attribute\n    <div x=3 />\n           ^\n  '''\n\ntest \"JSX error: unescaped opening tag angle bracket disallowed\", ->\n  assertErrorFormat '''\n    <Person><<</Person>\n  ''',\n  '''\n    [stdin]:1:9: error: unexpected <<\n    <Person><<</Person>\n            ^^\n  '''\n\ntest \"JSX error: ambiguous tag-like expression\", ->\n  assertErrorFormat '''\n    x = a <b > c\n  ''',\n  '''\n    [stdin]:1:10: error: missing </\n    x = a <b > c\n             ^\n  '''\n\ntest 'JSX error: invalid attributes', ->\n  assertErrorFormat '''\n    <div a=\"b\" {props} />\n  ''', '''\n    [stdin]:1:12: error: Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.\n    <div a=\"b\" {props} />\n               ^^^^^^^\n  '''\n  assertErrorFormat '''\n    <div a={b} {a:{b}} />\n  ''', '''\n    [stdin]:1:12: error: Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.\n    <div a={b} {a:{b}} />\n               ^^^^^^^\n  '''\n  assertErrorFormat '''\n    <div {\"#{a}\"} />\n  ''', '''\n    [stdin]:1:6: error: Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.\n    <div {\"#{a}\"} />\n         ^^^^^^^^\n  '''\n  assertErrorFormat '''\n    <div props... />\n  ''', '''\n    [stdin]:1:11: error: Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.\n    <div props... />\n              ^^^\n  '''\n  assertErrorFormat '''\n    <div {a:\"b\", props..., c:d()} />\n  ''', '''\n    [stdin]:1:6: error: Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.\n    <div {a:\"b\", props..., c:d()} />\n         ^^^^^^^^^^^^^^^^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    <div {props..., a, b} />\n  ''', '''\n    [stdin]:1:6: error: Unexpected token. Allowed JSX attributes are: id=\"val\", src={source}, {props...} or attribute.\n    <div {props..., a, b} />\n         ^^^^^^^^^^^^^^^^\n  '''\n\ntest '#5034: JSX error: Adjacent JSX elements must be wrapped in an enclosing tag', ->\n  assertErrorFormat '''\n    render = -> (\n      <Row>a</Row>\n      <Row>b</Row>\n    )\n  ''', '''\n    [stdin]:3:3: error: Adjacent JSX elements must be wrapped in an enclosing tag\n      <Row>b</Row>\n      ^^^^^^^^^^^^\n  '''\n  assertErrorFormat '''\n    render = -> (\n      a = \"foo\"\n      <Row>a</Row>\n      <Row>b</Row>\n    )\n  ''', '''\n    [stdin]:4:3: error: Adjacent JSX elements must be wrapped in an enclosing tag\n      <Row>b</Row>\n      ^^^^^^^^^^^^\n  '''\ntest 'Bound method called as callback before binding throws runtime error', ->\n  class Base\n    constructor: ->\n      f = @derivedBound\n      try\n        f()\n        ok no\n      catch e\n        eq e.message, 'Bound instance method accessed before binding'\n\n  class Derived extends Base\n    derivedBound: =>\n      ok no\n  d = new Derived\n\ntest \"#3845/#3446: chain after function glyph (but not inline)\", ->\n  assertErrorFormat '''\n    a -> .b\n  ''',\n  '''\n    [stdin]:1:6: error: unexpected .\n    a -> .b\n         ^\n  '''\n\ntest \"#3906: error for unusual indentation\", ->\n  assertErrorFormat '''\n    a\n      c\n     .d\n\n    e(\n     f)\n\n    g\n  ''', '''\n    [stdin]:2:1: error: unexpected indentation\n      c\n    ^^\n  '''\n\ntest \"#4283: error message for implicit call\", ->\n  assertErrorFormat '''\n    (a, b c) ->\n  ''', '''\n    [stdin]:1:5: error: unexpected implicit function call\n    (a, b c) ->\n        ^\n  '''\n\ntest \"#3199: error message for call indented non-object\", ->\n  assertErrorFormat '''\n    fn = ->\n    fn\n      1\n  ''', '''\n    [stdin]:3:1: error: unexpected indentation\n      1\n    ^^\n  '''\n\ntest \"#3199: error message for call indented comprehension\", ->\n  assertErrorFormat '''\n    fn = ->\n    fn\n      x for x in [1, 2, 3]\n  ''', '''\n    [stdin]:3:1: error: unexpected indentation\n      x for x in [1, 2, 3]\n    ^^\n  '''\n\ntest \"#3199: error message for return indented non-object\", ->\n  assertErrorFormat '''\n    return\n      1\n  ''', '''\n    [stdin]:2:3: error: unexpected number\n      1\n      ^\n  '''\n\ntest \"#3199: error message for return indented comprehension\", ->\n  assertErrorFormat '''\n    return\n      x for x in [1, 2, 3]\n  ''', '''\n    [stdin]:2:3: error: unexpected identifier\n      x for x in [1, 2, 3]\n      ^\n  '''\n\ntest \"#3199: error message for throw indented non-object\", ->\n  assertErrorFormat '''\n    throw\n      1\n  ''', '''\n    [stdin]:2:3: error: unexpected number\n      1\n      ^\n  '''\n\ntest \"#3199: error message for throw indented comprehension\", ->\n  assertErrorFormat '''\n    throw\n      x for x in [1, 2, 3]\n  ''', '''\n    [stdin]:2:3: error: unexpected identifier\n      x for x in [1, 2, 3]\n      ^\n  '''\n\ntest \"#3199: error message for yield indented non-object\", ->\n  assertErrorFormat '''\n    ->\n      yield\n        1\n  ''', '''\n    [stdin]:3:5: error: unexpected number\n        1\n        ^\n  '''\n\ntest \"#3199: error message for yield indented comprehension\", ->\n  assertErrorFormat '''\n    ->\n      yield\n        x for x in [1, 2, 3]\n  ''', '''\n    [stdin]:3:5: error: unexpected identifier\n        x for x in [1, 2, 3]\n        ^\n  '''\n\ntest \"#3199: error message for await indented non-object\", ->\n  assertErrorFormat '''\n    ->\n      await\n        1\n  ''', '''\n    [stdin]:3:5: error: unexpected number\n        1\n        ^\n  '''\n\ntest \"#3199: error message for await indented comprehension\", ->\n  assertErrorFormat '''\n    ->\n      await\n        x for x in [1, 2, 3]\n  ''', '''\n    [stdin]:3:5: error: unexpected identifier\n        x for x in [1, 2, 3]\n        ^\n  '''\n\ntest \"#3098: suppressed newline should be unsuppressed by semicolon\", ->\n  assertErrorFormat '''\n    a = ; 5\n  ''', '''\n    [stdin]:1:5: error: unexpected ;\n    a = ; 5\n        ^\n  '''\n\ntest \"#4811: '///' inside a heregex comment does not close the heregex\", ->\n  assertErrorFormat '''\n   /// .* # comment ///\n  ''', '''\n  [stdin]:1:1: error: missing ///\n  /// .* # comment ///\n  ^^^\n  '''\n\ntest \"#3933: prevent implicit calls when cotrol flow is missing `THEN`\", ->\n  assertErrorFormat '''\n    for a in b do ->\n  ''','''\n    [stdin]:1:12: error: unexpected do\n    for a in b do ->\n               ^^\n  '''\n\n  assertErrorFormat '''\n    for a in b ->\n  ''','''\n    [stdin]:1:12: error: unexpected ->\n    for a in b ->\n               ^^\n  '''\n\n  assertErrorFormat '''\n    for a in b do =>\n  ''','''\n    [stdin]:1:12: error: unexpected do\n    for a in b do =>\n               ^^\n  '''\n\n  assertErrorFormat '''\n    while a do ->\n  ''','''\n    [stdin]:1:9: error: unexpected do\n    while a do ->\n            ^^\n  '''\n\n  assertErrorFormat '''\n    until a do =>\n  ''','''\n    [stdin]:1:9: error: unexpected do\n    until a do =>\n            ^^\n  '''\n\n  assertErrorFormat '''\n    switch\n      when a ->\n  ''','''\n    [stdin]:2:10: error: unexpected ->\n      when a ->\n             ^^\n  '''\n\ntest \"`new.target` outside of a function\", ->\n  assertErrorFormat '''\n    new.target\n  ''', '''\n    [stdin]:1:1: error: new.target can only occur inside functions\n    new.target\n    ^^^^^^^^^^\n  '''\n\ntest \"`new.target` is only allowed meta property\", ->\n  assertErrorFormat '''\n    -> new.something\n  ''', '''\n    [stdin]:1:4: error: the only valid meta property for new is new.target\n    -> new.something\n       ^^^^^^^^^^^^^\n  '''\n\ntest \"`import.meta` is only allowed meta property\", ->\n  assertErrorFormat '''\n    foo = import.something\n  ''', '''\n    [stdin]:1:7: error: the only valid meta property for import is import.meta\n    foo = import.something\n          ^^^^^^^^^^^^^^^^\n  '''\n\ntest \"`new.target` cannot be assigned\", ->\n  assertErrorFormat '''\n    ->\n      new.target = b\n  ''', '''\n    [stdin]:2:14: error: unexpected =\n      new.target = b\n                 ^\n  '''\n\ntest \"#4834: dynamic import accepts either one or two arguments\", ->\n  assertErrorFormat '''\n    import()\n  ''', '''\n    [stdin]:1:1: error: import() accepts either one or two arguments\n    import()\n    ^^^^^^^^\n  '''\n\n  assertErrorFormat '''\n    import('x', {}, 3)\n  ''', '''\n    [stdin]:1:1: error: import() accepts either one or two arguments\n    import('x', {}, 3)\n    ^^^^^^^^^^^^^^^^^^\n  '''\n\ntest \"#4834: dynamic import requires explicit call parentheses\", ->\n  assertErrorFormat '''\n    promise = import 'foo'\n  ''', '''\n    [stdin]:1:23: error: unexpected end of input\n    promise = import 'foo'\n                          ^\n  '''\n"
  },
  {
    "path": "test/eval.coffee",
    "content": "if vm = require? 'vm'\n\n  test \"CoffeeScript.eval runs in the global context by default\", ->\n    global.punctuation = '!'\n    code = '''\n    global.fhqwhgads = \"global superpower#{global.punctuation}\"\n    '''\n    result = CoffeeScript.eval code\n    eq result, 'global superpower!'\n    eq fhqwhgads, 'global superpower!'\n\n  test \"CoffeeScript.eval can run in, and modify, a Script context sandbox\", ->\n    createContext = vm.Script.createContext ? vm.createContext\n    sandbox = createContext()\n    sandbox.foo = 'bar'\n    code = '''\n    global.foo = 'not bar!'\n    '''\n    result = CoffeeScript.eval code, {sandbox}\n    eq result, 'not bar!'\n    eq sandbox.foo, 'not bar!'\n\n  test \"CoffeeScript.eval can run in, but cannot modify, an ordinary object sandbox\", ->\n    sandbox = {foo: 'bar'}\n    code = '''\n    global.foo = 'not bar!'\n    '''\n    result = CoffeeScript.eval code, {sandbox}\n    eq result, 'not bar!'\n    eq sandbox.foo, 'bar'\n"
  },
  {
    "path": "test/exception_handling.coffee",
    "content": "# Exception Handling\n# ------------------\n\n# shared nonce\nnonce = {}\n\n\n# Throw\n\ntest \"basic exception throwing\", ->\n  throws (-> throw 'error'), /^error$/\n\n\n# Empty Try/Catch/Finally\n\ntest \"try can exist alone\", ->\n  try\n\ntest \"try/catch with empty try, empty catch\", ->\n  try\n    # nothing\n  catch err\n    # nothing\n\ntest \"single-line try/catch with empty try, empty catch\", ->\n  try catch err\n\ntest \"try/finally with empty try, empty finally\", ->\n  try\n    # nothing\n  finally\n    # nothing\n\ntest \"single-line try/finally with empty try, empty finally\", ->\n  try finally\n\ntest \"try/catch/finally with empty try, empty catch, empty finally\", ->\n  try\n  catch err\n  finally\n\ntest \"single-line try/catch/finally with empty try, empty catch, empty finally\", ->\n  try catch err then finally\n\n\n# Try/Catch/Finally as an Expression\n\ntest \"return the result of try when no exception is thrown\", ->\n  result = try\n    nonce\n  catch err\n    undefined\n  finally\n    undefined\n  eq nonce, result\n\ntest \"single-line result of try when no exception is thrown\", ->\n  result = try nonce catch err then undefined\n  eq nonce, result\n\ntest \"return the result of catch when an exception is thrown\", ->\n  fn = ->\n    try\n      throw ->\n    catch err\n      nonce\n  doesNotThrow fn\n  eq nonce, fn()\n\ntest \"single-line result of catch when an exception is thrown\", ->\n  fn = ->\n    try throw (->) catch err then nonce\n  doesNotThrow fn\n  eq nonce, fn()\n\ntest \"optional catch\", ->\n  fn = ->\n    try throw ->\n    nonce\n  doesNotThrow fn\n  eq nonce, fn()\n\n\n# Try/Catch/Finally Interaction With Other Constructs\n\ntest \"try/catch with empty catch as last statement in a function body\", ->\n  fn = ->\n    try nonce\n    catch err\n  eq nonce, fn()\n\ntest \"#1595: try/catch with a reused variable name\", ->\n  # `catch` shouldn’t lead to broken scoping.\n  do ->\n    try\n      inner = 5\n    catch inner\n      # nothing\n  eq typeof inner, 'undefined'\n\ntest \"#2580: try/catch with destructuring the exception object\", ->\n  result = try\n    missing.object\n  catch {message}\n    message\n\n  eq message, 'missing is not defined'\n\ntest \"Try catch finally as implicit arguments\", ->\n  first = (x) -> x\n\n  foo = no\n  try\n    first try iamwhoiam() finally foo = yes\n  catch e\n  eq foo, yes\n\n  bar = no\n  try\n    first try iamwhoiam() catch e finally\n    bar = yes\n  catch e\n  eq bar, yes\n\ntest \"#2900: parameter-less catch clause\", ->\n  # `catch` should not require a parameter.\n  try\n    throw new Error 'failed'\n  catch\n    ok true\n\n  try throw new Error 'failed' catch finally ok true\n\n  ok try throw new Error 'failed' catch then true\n\ntest \"#3709: throwing an if statement\", ->\n  # `throw if` should return a closure around the `if` block, so that the\n  # output is valid JavaScript.\n  try\n    throw if no\n        new Error 'drat!'\n      else\n        new Error 'no escape!'\n  catch err\n    eq err.message, 'no escape!'\n\n  try\n    throw if yes then new Error 'huh?' else null\n  catch err\n    eq err.message, 'huh?'\n\ntest \"#3709: throwing a switch statement\", ->\n  i = 3\n  try\n    throw switch i\n      when 2\n        new Error 'not this one'\n      when 3\n        new Error 'oh no!'\n  catch err\n    eq err.message, 'oh no!'\n\ntest \"#3709: throwing a for loop\", ->\n  # `throw for` should return a closure around the `for` block, so that the\n  # output is valid JavaScript.\n  try\n    throw for i in [0..3]\n      i * 2\n  catch err\n    arrayEq err, [0, 2, 4, 6]\n\ntest \"#3709: throwing a while loop\", ->\n  i = 0\n  try\n    throw while i < 3\n      i++\n  catch err\n    eq i, 3\n\ntest \"#3789: throwing a throw\", ->\n  try\n    throw throw throw new Error 'whoa!'\n  catch err\n    eq err.message, 'whoa!'\n"
  },
  {
    "path": "test/exponentiation.coffee",
    "content": "# The `**` and `**=` operators are only supported in Node 7.5+, so the tests\n# for these exponentiation operators are split out into their own file to be\n# loaded only by supported runtimes.\n\ntest \"exponentiation operator\", ->\n  eq 27, 3 ** 3\n\ntest \"exponentiation operator has higher precedence than other maths operators\", ->\n  eq 55, 1 + 3 ** 3 * 2\n  eq -4, -2 ** 2\n  eq 0, (!2) ** 2\n\ntest \"exponentiation operator is right associative\", ->\n  eq 2, 2 ** 1 ** 3\n\ntest \"exponentiation operator compound assignment\", ->\n  a = 2\n  a **= 3\n  eq 8, a\n"
  },
  {
    "path": "test/formatting.coffee",
    "content": "# Formatting\n# ----------\n\n# TODO: maybe this file should be split up into their respective sections:\n#   operators -> operators\n#   array literals -> array literals\n#   string literals -> string literals\n#   function invocations -> function invocations\n\ndoesNotThrowCompileError \"a = then b\"\n\ntest \"multiple semicolon-separated statements in parentheticals\", ->\n  nonce = {}\n  eq nonce, (1; 2; nonce)\n  eq nonce, (-> return (1; 2; nonce))()\n\n# * Line Continuation\n#   * Property Accesss\n#   * Operators\n#   * Array Literals\n#   * Function Invocations\n#   * String Literals\n\n# Property Access\n\ntest \"chained accesses split on period/newline, backwards and forwards\", ->\n  str = 'abc'\n  result = str.\n    split('').\n    reverse().\n    reverse().\n    reverse()\n  arrayEq ['c','b','a'], result\n  arrayEq ['c','b','a'], str.\n    split('').\n    reverse().\n    reverse().\n    reverse()\n  result = str\n    .split('')\n    .reverse()\n    .reverse()\n    .reverse()\n  arrayEq ['c','b','a'], result\n  arrayEq ['c','b','a'],\n    str\n    .split('')\n    .reverse()\n    .reverse()\n    .reverse()\n  arrayEq ['c','b','a'],\n    str.\n    split('')\n    .reverse().\n    reverse()\n    .reverse()\n\n# Operators\n\ntest \"newline suppression for operators\", ->\n  six =\n    1 +\n    2 +\n    3\n  eq 6, six\n\ntest \"`?.` and `::` should continue lines\", ->\n  ok not (\n    Date\n    ::\n    ?.foo\n  )\n\n  ok not (\n    Date\n    ?::\n    ?.foo\n  )\n  #eq Object::toString, Date?.\n  #prototype\n  #::\n  #?.foo\n\ndoesNotThrowCompileError \"\"\"\n  oh. yes\n  oh?. true\n  oh:: return\n  \"\"\"\n\ndoesNotThrowCompileError \"\"\"\n  a?[b..]\n  a?[...b]\n  a?[b..c]\n  \"\"\"\n\ntest \"#1768: space between `::` and index is ignored\", ->\n  eq 'function', typeof String:: ['toString']\n\n# Array Literals\n\ntest \"indented array literals don't trigger whitespace rewriting\", ->\n  getArgs = -> arguments\n  result = getArgs(\n    [[[[[],\n                  []],\n                [[]]]],\n      []])\n  eq 1, result.length\n\n# Function Invocations\n\ndoesNotThrowCompileError \"\"\"\n  obj = then fn 1,\n    1: 1\n    a:\n      b: ->\n        fn c,\n          d: e\n    f: 1\n  \"\"\"\n\n# String Literals\n\ntest \"indented heredoc\", ->\n  result = ((_) -> _)(\n                \"\"\"\n                abc\n                \"\"\")\n  eq \"abc\", result\n\n# Chaining - all open calls are closed by property access starting a new line\n# * chaining after\n#   * indented argument\n#   * function block\n#   * indented object\n#\n#   * single line arguments\n#   * inline function literal\n#   * inline object literal\n#\n# * chaining inside\n#   * implicit object literal\n\ntest \"chaining after outdent\", ->\n  id = (x) -> x\n\n  # indented argument\n  ff = id parseInt \"ff\",\n    16\n  .toString()\n  eq '255', ff\n\n  # function block\n  str = 'abc'\n  zero = parseInt str.replace /\\w/, (letter) ->\n    0\n  .toString()\n  eq '0', zero\n\n  # indented object\n  a = id id\n    a: 1\n  .a\n  eq 1, a\n\ntest \"#1495, method call chaining\", ->\n  str = 'abc'\n\n  result = str.split ''\n              .join ', '\n  eq 'a, b, c', result\n\n  result = str\n  .split ''\n  .join ', '\n  eq 'a, b, c', result\n\n  eq 'a, b, c', (str\n    .split ''\n    .join ', '\n  )\n\n  eq 'abc',\n    'aaabbbccc'.replace /(\\w)\\1\\1/g, '$1$1'\n               .replace /([abc])\\1/g, '$1'\n\n  # Nested calls\n  result = [1..3]\n    .slice Math.max 0, 1\n    .concat [3]\n  arrayEq [2, 3, 3], result\n\n  # Single line function arguments\n  result = [1..6]\n    .map (x) -> x * x\n    .filter (x) -> x % 2 is 0\n    .reverse()\n  arrayEq [36, 16, 4], result\n\n  # Single line implicit objects\n  id = (x) -> x\n  result = id a: 1\n    .a\n  eq 1, result\n\n  # The parens are forced\n  result = str.split(''.\n    split ''\n    .join ''\n  ).join ', '\n  eq 'a, b, c', result\n\ntest \"chaining should not wrap spilling ternary\", ->\n  throwsCompileError \"\"\"\n    if 0 then 1 else g\n      a: 42\n    .h()\n  \"\"\"\n\ntest \"chaining should wrap calls containing spilling ternary\", ->\n  f = (x) -> h: x\n  id = (x) -> x\n  result = f if true then 42 else id\n      a: 2\n  .h\n  eq 42, result\n\ntest \"chaining should work within spilling ternary\", ->\n  f = (x) -> h: x\n  id = (x) -> x\n  result = f if false then 1 else id\n      a: 3\n      .a\n  eq 3, result.h\n\ntest \"method call chaining inside objects\", ->\n  f = (x) -> c: 42\n  result =\n    a: f 1\n    b: f a: 1\n      .c\n  eq 42, result.b\n\ntest \"#4568: refine sameLine implicit object tagging\", ->\n  condition = yes\n  fn = -> yes\n\n  x =\n    fn bar: {\n      foo: 123\n    } if not condition\n  eq x, undefined\n\n# Nested blocks caused by paren unwrapping\ntest \"#1492: Nested blocks don't cause double semicolons\", ->\n  js = CoffeeScript.compile '(0;0)'\n  eq -1, js.indexOf ';;'\n\ntest \"#1195 Ignore trailing semicolons (before newlines or as the last char in a program)\", ->\n  preNewline = (numSemicolons) ->\n    \"\"\"\n    nonce = {}; nonce2 = {}\n    f = -> nonce#{Array(numSemicolons+1).join(';')}\n    nonce2\n    unless f() is nonce then throw new Error('; before linebreak should = newline')\n    \"\"\"\n  CoffeeScript.run(preNewline(n), bare: true) for n in [1,2,3]\n\n  lastChar = '-> lastChar;'\n  doesNotThrowCompileError lastChar, bare: true\n\ntest \"#1299: Disallow token misnesting\", ->\n  try\n    CoffeeScript.compile '''\n      [{\n         ]}\n    '''\n    ok no\n  catch e\n    eq 'unmatched ]', e.message\n\ntest \"#2981: Enforce initial indentation\", ->\n  try\n    CoffeeScript.compile '  a\\nb-'\n    ok no\n  catch e\n    eq 'missing indentation', e.message\n\ntest \"'single-line' expression containing multiple lines\", ->\n  doesNotThrowCompileError \"\"\"\n    (a, b) -> if a\n      -a\n    else if b\n    then -b\n    else null\n  \"\"\"\n\ntest \"#1275: allow indentation before closing brackets\", ->\n  array = [\n      1\n      2\n      3\n    ]\n  eq array, array\n  do ->\n  (\n    a = 1\n   )\n  eq 1, a\n\ntest \"don’t allow mixing of spaces and tabs for indentation\", ->\n  try\n    CoffeeScript.compile '''\n      new Layer\n       x: 0\n      \ty: 1\n    '''\n    ok no\n  catch e\n    eq 'indentation mismatch', e.message\n\ntest \"each code block that starts at indentation 0 can use a different style\", ->\n  doesNotThrowCompileError '''\n      new Layer\n       x: 0\n       y: 1\n      new Layer\n      \tx: 0\n      \ty: 1\n    '''\n\ntest \"tabs and spaces cannot be mixed for indentation\", ->\n  try\n    CoffeeScript.compile '''\n      new Layer\n      \t x: 0\n      \t y: 1\n    '''\n    ok no\n  catch e\n    eq 'mixed indentation', e.message\n\ntest \"#4487: Handle unusual outdentation\", ->\n  a =\n    switch 1\n      when 2\n          no\n         when 3 then no\n      when 1 then yes\n  eq yes, a\n\n  b = do ->\n    if no\n      if no\n            1\n       2\n      3\n  eq b, undefined\n\ntest \"#3906: handle further indentation inside indented chain\", ->\n  eq 1, CoffeeScript.eval '''\n    z = b: -> d: 2\n    e = ->\n    f = 3\n\n    z\n        .b ->\n            c\n        .d\n\n    e(\n        f\n    )\n\n    1\n  '''\n\n  eq 1, CoffeeScript.eval '''\n    z = -> b: -> e: ->\n\n    z()\n        .b\n            c: 'd'\n        .e()\n\n    f = [\n        'g'\n    ]\n\n    1\n  '''\n\n  eq 1, CoffeeScript.eval '''\n    z = -> c: -> c: ->\n\n    z('b')\n      .c 'a',\n        {b: 'a'}\n      .c()\n    z(\n      'b'\n    )\n    1\n  '''\n\ntest \"#3199: throw multiline implicit object\", ->\n  x = do ->\n    if no then throw\n      type: 'a'\n      msg: 'b'\n  eq undefined, x\n\n  y = do ->\n    if no then return\n      type: 'a'\n      msg: 'b'\n  eq undefined, y\n\n  y = do ->\n    yield\n      type: 'a'\n      msg: 'b'\n\n    if no then yield\n      type: 'c'\n      msg: 'd'\n\n    1\n  {value, done} = y.next()\n  ok value.type is 'a' and done is no\n\n  {value, done} = y.next()\n  ok value is 1 and done is yes\n\ntest \"#4576: multiple row function chaining\", ->\n  ->\n    eq @a, 3\n  .call a: 3\n\ntest \"#4576: function chaining on separate rows\", ->\n  do ->\n    Promise\n    .resolve()\n    .then ->\n      yes\n    .then ok\n\ntest \"#3736: chaining after do IIFE\", ->\n  eq 3,\n    do ->\n      a: 3\n    .a\n\n  eq 3,\n    do (b = (c) -> c) -> a: 3\n    ?.a\n\n  b = 3\n  eq 3,\n    do (\n      b\n      {d} = {}\n    ) ->\n      a: b\n    .a\n\n  # preserve existing chaining behavior for non-IIFE `do`\n  b = c: -> 4\n  eq 4,\n    do b\n    .c\n\ntest \"#5168: allow indented property index\", ->\n  a = b: 3\n\n  eq 3, a[\n    if yes\n      'b'\n    else\n      'c'\n  ]\n\n  d = [1, 2, 3]\n  arrayEq [1, 2], d[\n    ...2\n  ]\n\n  class A\n    b: -> 3\n\n  class B extends A\n    c: ->\n      super[\n        'b'\n      ]()\n\n  eq 3, new B().c()\n"
  },
  {
    "path": "test/function_invocation.coffee",
    "content": "# Function Invocation\n# -------------------\n\n# * Function Invocation\n# * Splats in Function Invocations\n# * Implicit Returns\n# * Explicit Returns\n\n# shared identity function\nid = (_) -> if arguments.length is 1 then _ else [arguments...]\n\ntest \"basic argument passing\", ->\n\n  a = {}\n  b = {}\n  c = {}\n  eq 1, (id 1)\n  eq 2, (id 1, 2)[1]\n  eq a, (id a)\n  eq c, (id a, b, c)[2]\n\n\ntest \"passing arguments on separate lines\", ->\n\n  a = {}\n  b = {}\n  c = {}\n  ok(id(\n    a\n    b\n    c\n  )[1] is b)\n  eq(0, id(\n    0\n    10\n  )[0])\n  eq(a,id(\n    a\n  ))\n  eq b,\n  (id b)\n\n\ntest \"optional parens can be used in a nested fashion\", ->\n\n  call = (func) -> func()\n  add = (a,b) -> a + b\n  result = call ->\n    inner = call ->\n      add 5, 5\n  ok result is 10\n\n\ntest \"hanging commas and semicolons in argument list\", ->\n\n  fn = () -> arguments.length\n  eq 2, fn(0,1,)\n  eq 3, fn 0, 1,\n  2\n  eq 2, fn(0, 1;)\n  # TODO: this test fails (the string compiles), but should it?\n  #throwsCompileError \"fn(0,1,;)\"\n  throwsCompileError \"fn(0,1,;;)\"\n  throwsCompileError \"fn(0, 1;,)\"\n  throwsCompileError \"fn(,0)\"\n  throwsCompileError \"fn(;0)\"\n\n\ntest \"function invocation\", ->\n\n  func = ->\n    return if true\n  eq undefined, func()\n\n  result = (\"hello\".slice) 3\n  ok result is 'lo'\n\n\ntest \"And even with strange things like this:\", ->\n\n  funcs  = [((x) -> x), ((x) -> x * x)]\n  result = funcs[1] 5\n  ok result is 25\n\n\ntest \"More fun with optional parens.\", ->\n\n  fn = (arg) -> arg\n  ok fn(fn {prop: 101}).prop is 101\n\n  okFunc = (f) -> ok(f())\n  okFunc -> true\n\n\ntest \"chained function calls\", ->\n  nonce = {}\n  identityWrap = (x) ->\n    -> x\n  eq nonce, identityWrap(identityWrap(nonce))()()\n  eq nonce, (identityWrap identityWrap nonce)()()\n\n\ntest \"Multi-blocks with optional parens.\", ->\n\n  fn = (arg) -> arg\n  result = fn( ->\n    fn ->\n      \"Wrapped\"\n  )\n  ok result()() is 'Wrapped'\n\n\ntest \"method calls\", ->\n\n  fnId = (fn) -> -> fn.apply this, arguments\n  math = {\n    add: (a, b) -> a + b\n    anonymousAdd: (a, b) -> a + b\n    fastAdd: fnId (a, b) -> a + b\n  }\n  ok math.add(5, 5) is 10\n  ok math.anonymousAdd(10, 10) is 20\n  ok math.fastAdd(20, 20) is 40\n\n\ntest \"Ensure that functions can have a trailing comma in their argument list\", ->\n\n  mult = (x, mids..., y) ->\n    x *= n for n in mids\n    x *= y\n  #ok mult(1, 2,) is 2\n  #ok mult(1, 2, 3,) is 6\n  ok mult(10, (i for i in [1..6])...) is 7200\n\n\ntest \"`@` and `this` should both be able to invoke a method\", ->\n  nonce = {}\n  fn          = (arg) -> eq nonce, arg\n  fn.withAt   = -> @ nonce\n  fn.withThis = -> this nonce\n  fn.withAt()\n  fn.withThis()\n\n\ntest \"Trying an implicit object call with a trailing function.\", ->\n\n  a = null\n  meth = (arg, obj, func) -> a = [obj.a, arg, func()].join ' '\n  meth 'apple', b: 1, a: 13, ->\n    'orange'\n  ok a is '13 apple orange'\n\n\ntest \"Ensure that empty functions don't return mistaken values.\", ->\n\n  obj =\n    func: (@param, @rest...) ->\n  ok obj.func(101, 102, 103, 104) is undefined\n  ok obj.param is 101\n  ok obj.rest.join(' ') is '102 103 104'\n\n\ntest \"Passing multiple functions without paren-wrapping is legal, and should compile.\", ->\n\n  sum = (one, two) -> one() + two()\n  result = sum ->\n    7 + 9\n  , ->\n    1 + 3\n  ok result is 20\n\n\ntest \"Implicit call with a trailing if statement as a param.\", ->\n\n  func = -> arguments[1]\n  result = func 'one', if false then 100 else 13\n  ok result is 13\n\n\ntest \"Test more function passing:\", ->\n\n  sum = (one, two) -> one() + two()\n\n  result = sum( ->\n    1 + 2\n  , ->\n    2 + 1\n  )\n  ok result is 6\n\n  sum = (a, b) -> a + b\n  result = sum(1\n  , 2)\n  ok result is 3\n\n\ntest \"Chained blocks, with proper indentation levels:\", ->\n\n  counter =\n    results: []\n    tick: (func) ->\n      @results.push func()\n      this\n  counter\n    .tick ->\n      3\n    .tick ->\n      2\n    .tick ->\n      1\n  arrayEq [3,2,1], counter.results\n\n\ntest \"This is a crazy one.\", ->\n\n  x = (obj, func) -> func obj\n  ident = (x) -> x\n  result = x {one: ident 1}, (obj) ->\n    inner = ident(obj)\n    ident inner\n  ok result.one is 1\n\n\ntest \"More paren compilation tests:\", ->\n\n  reverse = (obj) -> obj.reverse()\n  ok reverse([1, 2].concat 3).join(' ') is '3 2 1'\n\n\ntest \"Test for inline functions with parentheses and implicit calls.\", ->\n\n  combine = (func, num) -> func() * num\n  result  = combine (-> 1 + 2), 3\n  ok result is 9\n\n\ntest \"Test for calls/parens/multiline-chains.\", ->\n\n  f = (x) -> x\n  result = (f 1).toString()\n    .length\n  ok result is 1\n\n\ntest \"Test implicit calls in functions in parens:\", ->\n\n  result = ((val) ->\n    [].push val\n    val\n  )(10)\n  ok result is 10\n\n\ntest \"Ensure that chained calls with indented implicit object literals below are alright.\", ->\n\n  result = null\n  obj =\n    method: (val)  -> this\n    second: (hash) -> result = hash.three\n  obj\n    .method(\n      101\n    ).second(\n      one:\n        two: 2\n      three: 3\n    )\n  eq result, 3\n\n\ntest \"Test newline-supressed call chains with nested functions.\", ->\n\n  obj  =\n    call: -> this\n  func = ->\n    obj\n      .call ->\n        one two\n      .call ->\n        three four\n    101\n  eq func(), 101\n\n\ntest \"Implicit objects with number arguments.\", ->\n\n  func = (x, y) -> y\n  obj =\n    prop: func \"a\", 1\n  ok obj.prop is 1\n\n\ntest \"Non-spaced unary and binary operators should cause a function call.\", ->\n\n  func = (val) -> val + 1\n  ok (func +5) is 6\n  ok (func -5) is -4\n\n\ntest \"Prefix unary assignment operators are allowed in parenless calls.\", ->\n\n  func = (val) -> val + 1\n  val = 5\n  ok (func --val) is 5\n\ntest \"#855: execution context for `func arr...` should be `null`\", ->\n  contextTest = -> eq @, if window? then window else global\n  array = []\n  contextTest array\n  contextTest.apply null, array\n  contextTest array...\n\ntest \"#904: Destructuring function arguments with same-named variables in scope\", ->\n  a = b = nonce = {}\n  fn = ([a,b]) -> {a:a,b:b}\n  result = fn([c={},d={}])\n  eq c, result.a\n  eq d, result.b\n  eq nonce, a\n  eq nonce, b\n\ntest \"Simple Destructuring function arguments with same-named variables in scope\", ->\n  x = 1\n  f = ([x]) -> x\n  eq f([2]), 2\n  eq x, 1\n\ntest \"#4843: Bad output when assigning to @prop in destructuring assignment with defaults\", ->\n  works = \"maybe\"\n  drinks = \"beer\"\n  class A\n    constructor: ({@works = 'no', @drinks = 'wine'}) ->\n  a = new A {works: 'yes', drinks: 'coffee'}\n  eq a.works, 'yes'\n  eq a.drinks, 'coffee'\n\ntest \"caching base value\", ->\n\n  obj =\n    index: 0\n    0: {method: -> this is obj[0]}\n  ok obj[obj.index++].method([]...)\n\n\ntest \"passing splats to functions\", ->\n  arrayEq [0..4], id id [0..4]...\n  fn = (a, b, c..., d) -> [a, b, c, d]\n  range = [0..3]\n  [first, second, others, last] = fn range..., 4, [5...8]...\n  eq 0, first\n  eq 1, second\n  arrayEq [2..6], others\n  eq 7, last\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  arrayEq [0..4], id id [0..4] ...\n  fn = (a, b, c ..., d) -> [a, b, c, d]\n  range = [0..3]\n  [first, second, others, last] = fn range ..., 4, [5 ... 8] ...\n  eq 0, first\n  eq 1, second\n  arrayEq [2..6], others\n  eq 7, last\n\ntest \"splat variables are local to the function\", ->\n  outer = \"x\"\n  clobber = (avar, outer...) -> outer\n  clobber \"foo\", \"bar\"\n  eq \"x\", outer\n\ntest \"Issue 4631: left and right spread dots with preceding space\", ->\n  a = []\n  f = (a) -> a\n  eq yes, (f ...a) is (f ... a) is (f a...) is (f a ...) is f(a...) is f(...a) is f(a ...) is f(... a)\n\ntest \"Issue 894: Splatting against constructor-chained functions.\", ->\n\n  x = null\n  class Foo\n    bar: (y) -> x = y\n  new Foo().bar([101]...)\n  eq x, 101\n\n\ntest \"Functions with splats being called with too few arguments.\", ->\n\n  pen = null\n  method = (first, variable..., penultimate, ultimate) ->\n    pen = penultimate\n  method 1, 2, 3, 4, 5, 6, 7, 8, 9\n  ok pen is 8\n  method 1, 2, 3\n  ok pen is 2\n  method 1, 2\n  ok pen is 2\n\n\ntest \"splats with super() within classes.\", ->\n\n  class Parent\n    meth: (args...) ->\n      args\n  class Child extends Parent\n    meth: ->\n      nums = [3, 2, 1]\n      super nums...\n  ok (new Child).meth().join(' ') is '3 2 1'\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  class Parent\n    meth: (args ...) ->\n      args\n  class Child extends Parent\n    meth: ->\n      nums = [3, 2, 1]\n      super nums ...\n  ok (new Child).meth().join(' ') is '3 2 1'\n\n\ntest \"#1011: passing a splat to a method of a number\", ->\n  eq '1011', 11.toString [2]...\n  eq '1011', (31).toString [3]...\n  eq '1011', 69.0.toString [4]...\n  eq '1011', (131.0).toString [5]...\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  eq '1011', 11.toString [2] ...\n  eq '1011', (31).toString [3] ...\n  eq '1011', 69.0.toString [4] ...\n  eq '1011', (131.0).toString [5] ...\n\ntest \"splats and the `new` operator: functions that return `null` should construct their instance\", ->\n  args = []\n  child = new (constructor = -> null) args...\n  ok child instanceof constructor\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  child = new (constructor = -> null) args ...\n  ok child instanceof constructor\n\ntest \"splats and the `new` operator: functions that return functions should construct their return value\", ->\n  args = []\n  fn = ->\n  child = new (constructor = -> fn) args...\n  ok child not instanceof constructor\n  eq fn, child\n\ntest \"implicit return\", ->\n\n  eq ok, new ->\n    ok\n    ### Should `return` implicitly   ###\n    ### even with trailing comments. ###\n\n\ntest \"implicit returns with multiple branches\", ->\n  nonce = {}\n  fn = ->\n    if false\n      for a in b\n        return c if d\n    else\n      nonce\n  eq nonce, fn()\n\n\ntest \"implicit returns with switches\", ->\n  nonce = {}\n  fn = ->\n    switch nonce\n      when nonce then nonce\n      else return undefined\n  eq nonce, fn()\n\n\ntest \"preserve context when generating closure wrappers for expression conversions\", ->\n  nonce = {}\n  obj =\n    property: nonce\n    method: ->\n      this.result = if false\n        10\n      else\n        \"a\"\n        \"b\"\n        this.property\n  eq nonce, obj.method()\n  eq nonce, obj.property\n\n\ntest \"don't wrap 'pure' statements in a closure\", ->\n  nonce = {}\n  items = [0, 1, 2, 3, nonce, 4, 5]\n  fn = (items) ->\n    for item in items\n      return item if item is nonce\n  eq nonce, fn items\n\n\ntest \"usage of `new` is careful about where the invocation parens end up\", ->\n  eq 'object', typeof new try Array\n  eq 'object', typeof new do -> ->\n  a = b: ->\n  eq 'object', typeof new (do -> a).b\n\n\ntest \"implicit call against control structures\", ->\n  result = null\n  save   = (obj) -> result = obj\n\n  save switch id false\n    when true\n      'true'\n    when false\n      'false'\n\n  eq result, 'false'\n\n  save if id false\n    'false'\n  else\n    'true'\n\n  eq result, 'true'\n\n  save unless id false\n    'true'\n  else\n    'false'\n\n  eq result, 'true'\n\n  save try\n    doesnt exist\n  catch error\n    'caught'\n\n  eq result, 'caught'\n\n  save try doesnt(exist) catch error then 'caught2'\n\n  eq result, 'caught2'\n\n\ntest \"#1420: things like `(fn() ->)`; there are no words for this one\", ->\n  fn = -> (f) -> f()\n  nonce = {}\n  eq nonce, (fn() -> nonce)\n\ntest \"#1416: don't omit one 'new' when compiling 'new new'\", ->\n  nonce = {}\n  obj = new new -> -> {prop: nonce}\n  eq obj.prop, nonce\n\ntest \"#1416: don't omit one 'new' when compiling 'new new fn()()'\", ->\n  nonce = {}\n  argNonceA = {}\n  argNonceB = {}\n  fn = (a) -> (b) -> {a, b, prop: nonce}\n  obj = new new fn(argNonceA)(argNonceB)\n  eq obj.prop, nonce\n  eq obj.a, argNonceA\n  eq obj.b, argNonceB\n\ntest \"#1840: accessing the `prototype` after function invocation should compile\", ->\n  doesNotThrowCompileError 'fn()::prop'\n\n  nonce = {}\n  class Test then id: nonce\n\n  dotAccess = -> Test::\n  protoAccess = -> Test\n\n  eq dotAccess().id, nonce\n  eq protoAccess()::id, nonce\n\ntest \"#960: improved 'do'\", ->\n\n  do (nonExistent = 'one') ->\n    eq nonExistent, 'one'\n\n  overridden = 1\n  do (overridden = 2) ->\n    eq overridden, 2\n\n  two = 2\n  do (one = 1, two, three = 3) ->\n    eq one, 1\n    eq two, 2\n    eq three, 3\n\n  ret = do func = (two) ->\n    eq two, 2\n    func\n  eq ret, func\n\ntest \"#2617: implicit call before unrelated implicit object\", ->\n  pass = ->\n    true\n\n  result = if pass 1\n    one: 1\n  eq result.one, 1\n\ntest \"#2292, b: f (z),(x)\", ->\n  f = (x, y) -> y\n  one = 1\n  two = 2\n  o = b: f (one),(two)\n  eq o.b, 2\n\ntest \"#2297, Different behaviors on interpreting literal\", ->\n  foo = (x, y) -> y\n  bar =\n    baz: foo 100, on\n\n  eq bar.baz, on\n\n  qux = (x) -> x\n  quux = qux\n    corge: foo 100, true\n\n  eq quux.corge, on\n\n  xyzzy =\n    e: 1\n    f: foo\n      a: 1\n      b: 2\n    ,\n      one: 1\n      two: 2\n      three: 3\n    g:\n      a: 1\n      b: 2\n      c: foo 2,\n        one: 1\n        two: 2\n        three: 3\n      d: 3\n    four: 4\n    h: foo one: 1, two: 2, three: three: three: 3,\n      2\n\n  eq xyzzy.f.two, 2\n  eq xyzzy.g.c.three, 3\n  eq xyzzy.four, 4\n  eq xyzzy.h, 2\n\ntest \"#2715, Chained implicit calls\", ->\n  first  = (x)    -> x\n  second = (x, y) -> y\n\n  foo = first first\n    one: 1\n  eq foo.one, 1\n\n  bar = first second\n    one: 1, 2\n  eq bar, 2\n\n  baz = first second\n    one: 1,\n    2\n  eq baz, 2\n\ntest \"Implicit calls and new\", ->\n  first = (x) -> x\n  foo = (@x) ->\n  bar = first new foo first 1\n  eq bar.x, 1\n\n  third = (x, y, z) -> z\n  baz = first new foo new foo third\n        one: 1\n        two: 2\n        1\n        three: 3\n        2\n  eq baz.x.x.three, 3\n\ntest \"Loose tokens inside of explicit call lists\", ->\n  first = (x) -> x\n  second = (x, y) -> y\n  one = 1\n\n  foo = second( one\n                2)\n  eq foo, 2\n\n  bar = first( first\n               one: 1)\n  eq bar.one, 1\n\ntest \"Non-callable literals shouldn't compile\", ->\n  throwsCompileError '1(2)'\n  throwsCompileError '1 2'\n  throwsCompileError '/t/(2)'\n  throwsCompileError '/t/ 2'\n  throwsCompileError '///t///(2)'\n  throwsCompileError '///t/// 2'\n  throwsCompileError \"''(2)\"\n  throwsCompileError \"'' 2\"\n  throwsCompileError '\"\"(2)'\n  throwsCompileError '\"\" 2'\n  throwsCompileError '\"\"\"\"\"\"(2)'\n  throwsCompileError '\"\"\"\"\"\" 2'\n  throwsCompileError '{}(2)'\n  throwsCompileError '{} 2'\n  throwsCompileError '[](2)'\n  throwsCompileError '[] 2'\n  throwsCompileError '[2..9] 2'\n  throwsCompileError '[2..9](2)'\n  throwsCompileError '[1..10][2..9] 2'\n  throwsCompileError '[1..10][2..9](2)'\n\ntest \"implicit invocation with implicit object literal\", ->\n  f = (obj) -> eq 1, obj.a\n\n  f\n    a: 1\n  obj =\n    if f\n      a: 2\n    else\n      a: 1\n  eq 2, obj.a\n\n  f\n    \"a\": 1\n  obj =\n    if f\n      \"a\": 2\n    else\n      \"a\": 1\n  eq 2, obj.a\n\n  # #3935: Implicit call when the first key of an implicit object has interpolation.\n  a = 'a'\n  f\n    \"#{a}\": 1\n  obj =\n    if f\n      \"#{a}\": 2\n    else\n      \"#{a}\": 1\n  eq 2, obj.a\n\ntest \"get and set can be used as function names when not ambiguous with `get`/`set` keywords\", ->\n  get = (val) -> val\n  set = (val) -> val\n  eq 2, get(2)\n  eq 3, set(3)\n  eq 'a', get('a')\n  eq 'b', set('b')\n  eq 4, get 4\n  eq 5, set 5\n  eq 'c', get 'c'\n  eq 'd', set 'd'\n\n  @get = get\n  @set = set\n  eq 6, @get 6\n  eq 7, @set 7\n\n  get = ({val}) -> val\n  set = ({val}) -> val\n  eq 8, get({val: 8})\n  eq 9, set({val: 9})\n  eq 'e', get({val: 'e'})\n  eq 'f', set({val: 'f'})\n  eq 10, get {val: 10}\n  eq 11, set {val: 11}\n  eq 'g', get {val: 'g'}\n  eq 'h', set {val: 'h'}\n\ntest \"get and set can be used as variable and property names\", ->\n  get = 2\n  set = 3\n  eq 2, get\n  eq 3, set\n\n  {get} = {get: 4}\n  {set} = {set: 5}\n  eq 4, get\n  eq 5, set\n\ntest \"get and set can be used as class method names\", ->\n  class A\n    get: -> 2\n    set: -> 3\n\n  a = new A()\n  eq 2, a.get()\n  eq 3, a.set()\n\n  class B\n    @get = -> 4\n    @set = -> 5\n\n  eq 4, B.get()\n  eq 5, B.set()\n\ntest \"#4524: functions named get or set can be used without parentheses when attached to an object\", ->\n  obj =\n    get: (x) -> x + 2\n    set: (x) -> x + 3\n\n  class A\n    get: (x) -> x + 4\n    set: (x) -> x + 5\n\n  a = new A()\n\n  class B\n    get: (x) -> x.value + 6\n    set: (x) -> x.value + 7\n\n  b = new B()\n\n  eq 12, obj.get 10\n  eq 13, obj.set 10\n  eq 12, obj?.get 10\n  eq 13, obj?.set 10\n\n  eq 14, a.get 10\n  eq 15, a.set 10\n\n  @ten = 10\n\n  eq 12, obj.get @ten\n  eq 13, obj.set @ten\n\n  eq 14, a.get @ten\n  eq 15, a.set @ten\n\n  obj.obj = obj\n\n  eq 12, obj.obj.get @ten\n  eq 13, obj.obj.set @ten\n\n  eq 16, b.get value: 10\n  eq 17, b.set value: 10\n\n  eq 16, b.get value: @ten\n  eq 17, b.set value: @ten\n\ntest \"#4836: functions named get or set can be used without parentheses when attached to this or @\", ->\n  @get = (x) -> x + 2\n  @set = (x) -> x + 3\n  @a = 4\n\n  eq 12, this.get 10\n  eq 13, this.set 10\n  eq 12, this?.get 10\n  eq 13, this?.set 10\n  eq 6, this.get @a\n  eq 7, this.set @a\n  eq 6, this?.get @a\n  eq 7, this?.set @a\n\n  eq 12, @get 10\n  eq 13, @set 10\n  eq 12, @?.get 10\n  eq 13, @?.set 10\n  eq 6, @get @a\n  eq 7, @set @a\n  eq 6, @?.get @a\n  eq 7, @?.set @a\n\ntest \"#4852: functions named get or set can be used without parentheses when attached to this or @, with an argument of an implicit object\", ->\n  @get = ({ x }) -> x + 2\n  @set = ({ x }) -> x + 3\n\n  eq 12, @get x: 10\n  eq 13, @set x: 10\n  eq 12, @?.get x: 10\n  eq 13, @?.set x: 10\n  eq 12, this?.get x: 10\n  eq 13, this?.set x: 10\n\ntest \"#4473: variable scope in chained calls\", ->\n  obj =\n    foo: -> this\n    bar: (a) ->\n      a()\n      this\n\n  obj.foo(a = 1).bar(-> a = 2)\n  eq a, 2\n\n  obj.bar(-> b = 2).foo(b = 1)\n  eq b, 1\n\n  obj.foo(c = 1).bar(-> c = 2).foo(c = 3)\n  eq c, 3\n\n  obj.foo([d, e] = [1, 2]).bar(-> d = 4)\n  eq d, 4\n\n  obj.foo({f} = {f: 1}).bar(-> f = 5)\n  eq f, 5\n\ntest \"#5052: implicit call of class with no body\", ->\n  doesNotThrowCompileError 'f class'\n  doesNotThrowCompileError 'f class A'\n  doesNotThrowCompileError 'f class A extends B'\n\n  f = (args...) -> args\n  a = 1\n\n  [klass, shouldBeA] = f class A, a\n  eq shouldBeA, a\n\n  [shouldBeA] = f a, class A\n  eq shouldBeA, a\n\n  [obj, klass, shouldBeA] =\n    f\n      b: 1\n      class A\n      a\n  eq shouldBeA, a\n"
  },
  {
    "path": "test/functions.coffee",
    "content": "# Function Literals\n# -----------------\n\n# TODO: add indexing and method invocation tests: (->)[0], (->).call()\n\n# * Function Definition\n# * Bound Function Definition\n# * Parameter List Features\n#   * Splat Parameters\n#   * Context (@) Parameters\n#   * Parameter Destructuring\n#   * Default Parameters\n\n# Function Definition\n\nx = 1\ny = {}\ny.x = -> 3\nok x is 1\nok typeof(y.x) is 'function'\nok y.x instanceof Function\nok y.x() is 3\n\n# The empty function should not cause a syntax error.\n->\n() ->\n\n# Multiple nested function declarations mixed with implicit calls should not\n# cause a syntax error.\n(one) -> (two) -> three four, (five) -> six seven, eight, (nine) ->\n\n# with multiple single-line functions on the same line.\nfunc = (x) -> (x) -> (x) -> x\nok func(1)(2)(3) is 3\n\n# Make incorrect indentation safe.\nfunc = ->\n  obj = {\n          key: 10\n        }\n  obj.key - 5\neq func(), 5\n\n# Ensure that functions with the same name don't clash with helper functions.\ndel = -> 5\nok del() is 5\n\n\n# Bound Function Definition\n\nobj =\n  bound: ->\n    (=> this)()\n  unbound: ->\n    (-> this)()\n  nested: ->\n    (=>\n      (=>\n        (=> this)()\n      )()\n    )()\neq obj, obj.bound()\nok obj isnt obj.unbound()\neq obj, obj.nested()\n\n\ntest \"even more fancy bound functions\", ->\n  obj =\n    one: ->\n      do =>\n        return this.two()\n    two: ->\n      do =>\n        do =>\n          do =>\n            return this.three\n    three: 3\n\n  eq obj.one(), 3\n\n\ntest \"arguments in bound functions inherit from parent function\", ->\n  # The `arguments` object in an ES arrow function refers to the `arguments`\n  # of the parent scope, just like `this`. In the CoffeeScript 1.x\n  # implementation of `=>`, the `arguments` object referred to the arguments\n  # of the arrow function; but per the ES2015 spec, `arguments` should refer\n  # to the parent.\n  arrayEq ((a...) -> a)([1, 2, 3]), ((a...) => a)([1, 2, 3])\n\n  parent = (a, b, c) ->\n    (bound = =>\n      [arguments[0], arguments[1], arguments[2]]\n    )()\n  arrayEq [1, 2, 3], parent(1, 2, 3)\n\n\ntest \"self-referencing functions\", ->\n  changeMe = ->\n    changeMe = 2\n\n  changeMe()\n  eq changeMe, 2\n\n\n# Parameter List Features\n\ntest \"splats\", ->\n  arrayEq [0, 1, 2], (((splat...) -> splat) 0, 1, 2)\n  arrayEq [2, 3], (((_, _1, splat...) -> splat) 0, 1, 2, 3)\n  arrayEq [0, 1], (((splat..., _, _1) -> splat) 0, 1, 2, 3)\n  arrayEq [2], (((_, _1, splat..., _2) -> splat) 0, 1, 2, 3)\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  arrayEq [0, 1, 2], (((splat ...) -> splat) 0, 1, 2)\n  arrayEq [2, 3], (((_, _1, splat ...) -> splat) 0, 1, 2, 3)\n  arrayEq [0, 1], (((splat ..., _, _1) -> splat) 0, 1, 2, 3)\n  arrayEq [2], (((_, _1, splat ..., _2) -> splat) 0, 1, 2, 3)\n\ntest \"destructured splatted parameters\", ->\n  arr = [0,1,2]\n  splatArray = ([a...]) -> a\n  splatArrayRest = ([a...],b...) -> arrayEq(a,b); b\n  arrayEq splatArray(arr), arr\n  arrayEq splatArrayRest(arr,0,1,2), arr\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  splatArray = ([a ...]) -> a\n  splatArrayRest = ([a ...],b ...) -> arrayEq(a,b); b\n\ntest \"#4884: object-destructured splatted parameters\", ->\n  f = ({length}...) -> length\n  eq f(4, 5, 6), 3\n  f = ({length: len}...) -> len\n  eq f(4, 5, 6), 3\n  f = ({length}..., last) -> [length, last]\n  arrayEq f(4, 5, 6), [2, 6]\n  f = ({length: len}..., last) -> [len, last]\n  arrayEq f(4, 5, 6), [2, 6]\n\ntest \"@-parameters: automatically assign an argument's value to a property of the context\", ->\n  nonce = {}\n\n  ((@prop) ->).call context = {}, nonce\n  eq nonce, context.prop\n\n  # Allow splats alongside the special argument\n  ((splat..., @prop) ->).apply context = {}, [0, 0, nonce]\n  eq nonce, context.prop\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  ((splat ..., @prop) ->).apply context = {}, [0, 0, nonce]\n  eq nonce, context.prop\n\n  # Allow the argument itself to be a splat\n  ((@prop...) ->).call context = {}, 0, nonce, 0\n  eq nonce, context.prop[1]\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  ((@prop ...) ->).call context = {}, 0, nonce, 0\n  eq nonce, context.prop[1]\n\n  # The argument should not be able to be referenced normally\n  code = '((@prop) -> prop).call {}'\n  doesNotThrowCompileError code\n  throws (-> CoffeeScript.run code), ReferenceError\n  code = '((@prop) -> _at_prop).call {}'\n  doesNotThrowCompileError code\n  throws (-> CoffeeScript.run code), ReferenceError\n\ntest \"@-parameters and splats with constructors\", ->\n  a = {}\n  b = {}\n  class Klass\n    constructor: (@first, splat..., @last) ->\n\n  obj = new Klass a, 0, 0, b\n  eq a, obj.first\n  eq b, obj.last\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  class Klass\n    constructor: (@first, splat ..., @last) ->\n\n  obj = new Klass a, 0, 0, b\n  eq a, obj.first\n  eq b, obj.last\n\ntest \"destructuring in function definition\", ->\n  (([{a: [b], c}]...) ->\n    eq 1, b\n    eq 2, c\n  ) {a: [1], c: 2}\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  (([{a: [b], c}] ...) ->\n    eq 1, b\n    eq 2, c\n  ) {a: [1], c: 2}\n\n  context = {}\n  (([{a: [b, c = 2], @d, e = 4}]...) ->\n    eq 1, b\n    eq 2, c\n    eq @d, 3\n    eq context.d, 3\n    eq e, 4\n  ).call context, {a: [1], d: 3}\n\n  (({a: aa = 1, b: bb = 2}) ->\n    eq 5, aa\n    eq 2, bb\n  ) {a: 5}\n\n  ajax = (url, {\n    async = true,\n    beforeSend = (->),\n    cache = true,\n    method = 'get',\n    data = {}\n  }) ->\n    {url, async, beforeSend, cache, method, data}\n\n  fn = ->\n  deepEqual ajax('/home', beforeSend: fn, method: 'post'), {\n    url: '/home', async: true, beforeSend: fn, cache: true, method: 'post', data: {}\n  }\n\ntest \"#4005: `([a = {}]..., b) ->` weirdness\", ->\n  fn = ([a = {}]..., b) -> [a, b]\n  deepEqual fn(5), [{}, 5]\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  fn = ([a = {}] ..., b) -> [a, b]\n  deepEqual fn(5), [{}, 5]\n\ntest \"default values\", ->\n  nonceA = {}\n  nonceB = {}\n  a = (_,_1,arg=nonceA) -> arg\n  eq nonceA, a()\n  eq nonceA, a(0)\n  eq nonceB, a(0,0,nonceB)\n  eq nonceA, a(0,0,undefined)\n  eq null, a(0,0,null) # Per ES2015, `null` doesn’t trigger a parameter default value\n  eq false , a(0,0,false)\n  eq nonceB, a(undefined,undefined,nonceB,undefined)\n  b = (_,arg=nonceA,_1,_2) -> arg\n  eq nonceA, b()\n  eq nonceA, b(0)\n  eq nonceB, b(0,nonceB)\n  eq nonceA, b(0,undefined)\n  eq null, b(0,null)\n  eq false , b(0,false)\n  eq nonceB, b(undefined,nonceB,undefined)\n  c = (arg=nonceA,_,_1) -> arg\n  eq nonceA, c()\n  eq      0, c(0)\n  eq nonceB, c(nonceB)\n  eq nonceA, c(undefined)\n  eq null, c(null)\n  eq false , c(false)\n  eq nonceB, c(nonceB,undefined,undefined)\n\ntest \"default values with @-parameters\", ->\n  a = {}\n  b = {}\n  obj = f: (q = a, @p = b) -> q\n  eq a, obj.f()\n  eq b, obj.p\n\ntest \"default values with splatted arguments\", ->\n  withSplats = (a = 2, b..., c = 3, d = 5) -> a * (b.length + 1) * c * d\n  eq 30, withSplats()\n  eq 15, withSplats(1)\n  eq  5, withSplats(1,1)\n  eq  1, withSplats(1,1,1)\n  eq  2, withSplats(1,1,1,1)\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  withSplats = (a = 2, b ..., c = 3, d = 5) -> a * (b.length + 1) * c * d\n  eq 30, withSplats()\n  eq 15, withSplats(1)\n  eq  5, withSplats(1,1)\n  eq  1, withSplats(1,1,1)\n  eq  2, withSplats(1,1,1,1)\n\ntest \"#156: parameter lists with expansion\", ->\n  expandArguments = (first, ..., lastButOne, last) ->\n    eq 1, first\n    eq 4, lastButOne\n    last\n  eq 5, expandArguments 1, 2, 3, 4, 5\n\n  throwsCompileError \"(..., a, b...) ->\", null, null, \"prohibit expansion and a splat\"\n  throwsCompileError \"(...) ->\",          null, null, \"prohibit lone expansion\"\n\ntest \"#156: parameter lists with expansion in array destructuring\", ->\n  expandArray = (..., [..., last]) ->\n    last\n  eq 3, expandArray 1, 2, 3, [1, 2, 3]\n\ntest \"#3502: variable definitions and expansion\", ->\n  a = b = 0\n  f = (a, ..., b) -> [a, b]\n  arrayEq [1, 5], f 1, 2, 3, 4, 5\n  eq 0, a\n  eq 0, b\n\ntest \"variable definitions and splat\", ->\n  a = b = 0\n  f = (a, middle..., b) -> [a, middle, b]\n  arrayEq [1, [2, 3, 4], 5], f 1, 2, 3, 4, 5\n  eq 0, a\n  eq 0, b\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  f = (a, middle ..., b) -> [a, middle, b]\n  arrayEq [1, [2, 3, 4], 5], f 1, 2, 3, 4, 5\n  eq 0, a\n  eq 0, b\n\ntest \"default values with function calls\", ->\n  doesNotThrowCompileError \"(x = f()) ->\"\n\ntest \"arguments vs parameters\", ->\n  doesNotThrowCompileError \"f(x) ->\"\n  f = (g) -> g()\n  eq 5, f (x) -> 5\n\ntest \"reserved keyword as parameters\", ->\n  f = (_case, @case) -> [_case, @case]\n  [a, b] = f(1, 2)\n  eq 1, a\n  eq 2, b\n\n  f = (@case, _case...) -> [@case, _case...]\n  [a, b, c] = f(1, 2, 3)\n  eq 1, a\n  eq 2, b\n  eq 3, c\n\ntest \"reserved keyword at-splat\", ->\n  f = (@case...) -> @case\n  [a, b] = f(1, 2)\n  eq 1, a\n  eq 2, b\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  f = (@case ...) -> @case\n  [a, b] = f(1, 2)\n  eq 1, a\n  eq 2, b\n\ntest \"#1574: Destructuring and a parameter named _arg\", ->\n  f = ({a, b}, _arg, _arg1) -> [a, b, _arg, _arg1]\n  arrayEq [1, 2, 3, 4], f a: 1, b: 2, 3, 4\n\ntest \"#1844: bound functions in nested comprehensions causing empty var statements\", ->\n  a = ((=>) for a in [0] for b in [0])\n  eq 1, a.length\n\ntest \"#1859: inline function bodies shouldn't modify prior postfix ifs\", ->\n  list = [1, 2, 3]\n  ok true if list.some (x) -> x is 2\n\ntest \"#2258: allow whitespace-style parameter lists in function definitions\", ->\n  func = (\n    a, b, c\n  ) -> c\n  eq func(1, 2, 3), 3\n\n  func = (\n    a\n    b\n    c\n  ) -> b\n  eq func(1, 2, 3), 2\n\ntest \"#2621: fancy destructuring in parameter lists\", ->\n  func = ({ prop1: { key1 }, prop2: { key2, key3: [a, b, c] } }) ->\n    eq(key2, 'key2')\n    eq(a, 'a')\n\n  func({prop1: {key1: 'key1'}, prop2: {key2: 'key2', key3: ['a', 'b', 'c']}})\n\ntest \"#1435 Indented property access\", ->\n  rec = -> rec: rec\n\n  eq 1, do ->\n    rec()\n      .rec ->\n        rec()\n          .rec ->\n            rec.rec()\n          .rec()\n    1\n\ntest \"#1038 Optimize trailing return statements\", ->\n  compile = (code) -> CoffeeScript.compile(code, bare: yes).trim().replace(/\\s+/g, \" \")\n\n  eq \"(function() {});\",                 compile(\"->\")\n  eq \"(function() {});\",                 compile(\"-> return\")\n  eq \"(function() { return void 0; });\", compile(\"-> undefined\")\n  eq \"(function() { return void 0; });\", compile(\"-> return undefined\")\n  eq \"(function() { foo(); });\",         compile(\"\"\"\n                                                 ->\n                                                   foo()\n                                                   return\n                                                 \"\"\")\n\ntest \"#4406 Destructured parameter default evaluation order with incrementing variable\", ->\n  i = 0\n  f = ({ a = ++i }, b = ++i) -> [a, b]\n  arrayEq f({}), [1, 2]\n\ntest \"#4406 Destructured parameter default evaluation order with generator function\", ->\n  current = 0\n  next    = -> ++current\n  foo = ({ a = next() }, b = next()) -> [ a, b ]\n  arrayEq foo({}), [1, 2]\n\ntest \"Destructured parameter with default value, that itself has a default value\", ->\n  # Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment\n  draw = ({size = 'big', coords = {x: 0, y: 0}, radius = 25} = {}) -> \"#{size}-#{coords.x}-#{coords.y}-#{radius}\"\n  output = draw\n    coords:\n      x: 18\n      y: 30\n    radius: 30\n  eq output, 'big-18-30-30'\n\ntest \"#4566: destructuring with nested default values\", ->\n  f = ({a: {b = 1}}) ->\n    b\n  eq 2, f a: b: 2\n\ntest \"#1043: comma after function glyph\", ->\n  x = (a=->, b=2) ->\n    a()\n  eq x(), undefined\n\n  f = (a) -> a()\n  g = f ->, 2\n  eq g, undefined\n  h = f(=>, 2)\n  eq h, undefined\n\ntest \"#3845/#3446: chain after function glyph\", ->\n  angular = module: -> controller: -> controller: ->\n\n  eq undefined,\n    angular.module 'foo'\n    .controller 'EmailLoginCtrl', ->\n    .controller 'EmailSignupCtrl', ->\n\n  beforeEach = (f) -> f()\n  getPromise = -> then: -> catch: ->\n\n  eq undefined,\n    beforeEach ->\n      getPromise()\n      .then (@result) =>\n      .catch (@error) =>\n\n  doThing = -> then: -> catch: (f) -> f()\n  handleError = -> 3\n  eq 3,\n    doThing()\n    .then (@result) =>\n    .catch handleError\n\ntest \"#4413: expressions in function parameters that create generated variables have those variables declared correctly\", ->\n  'use strict'\n  # We’re in strict mode because we want an error to be thrown if the generated\n  # variable (`ref`) is assigned before being declared.\n  foo = -> null\n  bar = -> 33\n  f = (a = foo() ? bar()) -> a\n  g = (a = foo() ? bar()) -> a + 1\n  eq f(), 33\n  eq g(), 34\n\ntest \"#4657: destructured array param declarations\", ->\n  a = 1\n  b = 2\n  f = ([a..., b]) ->\n  f [3, 4, 5]\n  eq a, 1\n  eq b, 2\n\ntest \"#4657: destructured array parameters\", ->\n  f = ([a..., b]) -> {a, b}\n  result = f [1, 2, 3, 4]\n  arrayEq result.a, [1, 2, 3]\n  eq result.b, 4\n\ntest \"#5128: default parameters of function in binary operation\", ->\n  foo = yes or (a, b = {}) -> null\n  eq foo, yes\n\ntest \"#5121: array end bracket after function glyph\", ->\n  a = [->]\n  eq a.length, 1\n\n  b = [c: ->]\n  eq b.length, 1\n"
  },
  {
    "path": "test/generators.coffee",
    "content": "# Generators\n# -----------------\n#\n# * Generator Definition\n\ntest \"most basic generator support\", ->\n  ok -> yield\n\ntest \"empty generator\", ->\n  x = do -> yield return\n\n  y = x.next()\n  ok y.value is undefined and y.done is true\n\ntest \"generator iteration\", ->\n  x = do ->\n    yield 0\n    yield\n    yield 2\n    3\n\n  y = x.next()\n  ok y.value is 0 and y.done is false\n\n  y = x.next()\n  ok y.value is undefined and y.done is false\n\n  y = x.next()\n  ok y.value is 2 and y.done is false\n\n  y = x.next()\n  ok y.value is 3 and y.done is true\n\ntest \"last line yields are returned\", ->\n  x = do ->\n    yield 3\n  y = x.next()\n  ok y.value is 3 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"yield return can be used anywhere in the function body\", ->\n  x = do ->\n    if 2 is yield 1\n      yield return 42\n    throw new Error \"this code shouldn't be reachable\"\n\n  y = x.next()\n  ok y.value is 1 and y.done is false\n\n  y = x.next 2\n  ok y.value is 42 and y.done is true\n\ntest \"`yield from` support\", ->\n  x = do ->\n    yield from do ->\n      yield i for i in [3..4]\n\n  y = x.next()\n  ok y.value is 3 and y.done is false\n\n  y = x.next 1\n  ok y.value is 4 and y.done is false\n\n  y = x.next 2\n  arrayEq y.value, [1, 2]\n  ok y.done is true\n\ntest \"error if `yield from` occurs outside of a function\", ->\n  throwsCompileError 'yield from 1'\n\ntest \"`yield from` at the end of a function errors\", ->\n  throwsCompileError 'x = -> x = 1; yield from'\n\ntest \"yield in if statements\", ->\n  x = do -> if 1 is yield 2 then 3 else 4\n\n  y = x.next()\n  ok y.value is 2 and y.done is false\n\n  y = x.next 1\n  ok y.value is 3 and y.done is true\n\ntest \"yielding if statements\", ->\n  x = do -> yield if true then 3 else 4\n\n  y = x.next()\n  ok y.value is 3 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"yield in for loop expressions\", ->\n  x = do ->\n    y = for i in [1..3]\n      yield i * 2\n\n  z = x.next()\n  ok z.value is 2 and z.done is false\n\n  z = x.next 10\n  ok z.value is 4 and z.done is false\n\n  z = x.next 20\n  ok z.value is 6 and z.done is false\n\n  z = x.next 30\n  arrayEq z.value, [10, 20, 30]\n  ok z.done is true\n\ntest \"yield in switch expressions\", ->\n  x = do ->\n    y = switch yield 1\n      when 2 then yield 1337\n      else 1336\n\n  z = x.next()\n  ok z.value is 1 and z.done is false\n\n  z = x.next 2\n  ok z.value is 1337 and z.done is false\n\n  z = x.next 3\n  ok z.value is 3 and z.done is true\n\ntest \"yielding switch expressions\", ->\n  x = do ->\n    yield switch 1337\n      when 1337 then 1338\n      else 1336\n\n  y = x.next()\n  ok y.value is 1338 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"yield in try expressions\", ->\n  x = do ->\n    try yield 1 catch\n\n  y = x.next()\n  ok y.value is 1 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"yielding try expressions\", ->\n  x = do ->\n    yield try 1\n\n  y = x.next()\n  ok y.value is 1 and y.done is false\n\n  y = x.next 42\n  ok y.value is 42 and y.done is true\n\ntest \"`yield` can be thrown\", ->\n  x = do ->\n    throw yield null\n  x.next()\n  throws -> x.next new Error \"boom\"\n\ntest \"`throw` can be yielded\", ->\n  x = do ->\n    yield throw new Error \"boom\"\n  throws -> x.next()\n\ntest \"symbolic operators has precedence over the `yield`\", ->\n  symbolic   = '+ - * / << >> & | || && ^ // or and'.split ' '\n  compound   = (\"#{op}=\" for op in symbolic)\n  relations  = '< > == != <= >= is isnt'.split ' '\n\n  operators  = [symbolic..., '=', compound..., relations...]\n\n  collect = (gen) -> ref.value until (ref = gen.next()).done\n\n  values = [0, 1, 2, 3]\n  for op in operators\n    expression = \"i #{op} 2\"\n\n    yielded = CoffeeScript.eval \"(arr) ->  yield #{expression} for i in arr\"\n    mapped  = CoffeeScript.eval \"(arr) ->       (#{expression} for i in arr)\"\n\n    arrayEq mapped(values), collect yielded values\n\ntest \"yield handles 'this' correctly\", ->\n  x = ->\n    yield switch\n      when true then yield => this\n    array = for item in [1]\n      yield => this\n    yield array\n    yield if true then yield => this\n    yield try throw yield => this\n    throw yield => this\n\n  y = x.call [1, 2, 3]\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  z = y.next 123\n  ok z.value is 123 and z.done is false\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  z = y.next 42\n  arrayEq z.value, [42]\n  ok z.done is false\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  z = y.next 456\n  ok z.value is 456 and z.done is false\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  z = y.next new Error \"ignore me\"\n  ok z.value is undefined and z.done is false\n\n  z = y.next()\n  arrayEq z.value(), [1, 2, 3]\n  ok z.done is false\n\n  throws -> y.next new Error \"boom\"\n\ntest \"for-from loops over generators\", ->\n  array1 = [50, 30, 70, 20]\n  gen = -> yield from array1\n\n  array2 = []\n  array3 = []\n  array4 = []\n\n  iterator = gen()\n  for x from iterator\n    array2.push(x)\n    break if x is 30\n\n  for x from iterator\n    array3.push(x)\n\n  for x from iterator\n    array4.push(x)\n\n  arrayEq array2, [50, 30]\n  # Different JS engines have different opinions on the value of array3:\n  # https://github.com/jashkenas/coffeescript/pull/4306#issuecomment-257066877\n  # As a temporary measure, either result is accepted.\n  ok array3.length is 0 or array3.join(',') is '70,20'\n  arrayEq array4, []\n\ntest \"for-from comprehensions over generators\", ->\n  gen = ->\n    yield from [30, 41, 51, 60]\n\n  iterator = gen()\n  array1 = (x for x from iterator when x %% 2 is 1)\n  array2 = (x for x from iterator)\n\n  ok array1.join(' ') is '41 51'\n  ok array2.length is 0\n\ntest \"from as an iterable variable name in a for loop declaration\", ->\n  from = [1, 2, 3]\n  out = []\n  for i from from\n    out.push i\n  arrayEq from, out\n\ntest \"from as an iterator variable name in a for loop declaration\", ->\n  a = [1, 2, 3]\n  b = []\n  for from from a\n    b.push from\n  arrayEq a, b\n\ntest \"from as a destructured object variable name in a for loop declaration\", ->\n  a = [\n      from: 1\n      to: 2\n    ,\n      from: 3\n      to: 4\n  ]\n  b = []\n  for {from, to} in a\n    b.push from\n  arrayEq b, [1, 3]\n\n  c = []\n  for {to, from} in a\n    c.push from\n  arrayEq c, [1, 3]\n\ntest \"from as a destructured, aliased object variable name in a for loop declaration\", ->\n  a = [\n      b: 1\n      c: 2\n    ,\n      b: 3\n      c: 4\n  ]\n  out = []\n\n  for {b: from} in a\n    out.push from\n  arrayEq out, [1, 3]\n\ntest \"from as a destructured array variable name in a for loop declaration\", ->\n  a = [\n    [1, 2]\n    [3, 4]\n  ]\n  b = []\n  for [from, to] from a\n    b.push from\n  arrayEq b, [1, 3]\n\ntest \"generator methods in classes\", ->\n  class Base\n    @static: ->\n      yield 1\n    method: ->\n      yield 2\n\n  arrayEq [1], Array.from Base.static()\n  arrayEq [2], Array.from new Base().method()\n\n  class Child extends Base\n    @static: -> super()\n    method: -> super()\n\n  arrayEq [1], Array.from Child.static()\n  arrayEq [2], Array.from new Child().method()\n"
  },
  {
    "path": "test/helpers.coffee",
    "content": "# Helpers\n# -------\n\n# pull the helpers from `CoffeeScript.helpers` into local variables\n{starts, ends, repeat, compact, count, merge, extend, flatten, del, baseFileName} = CoffeeScript.helpers\n\n\n# `starts`\n\ntest \"the `starts` helper tests if a string starts with another string\", ->\n  ok     starts('01234', '012')\n  ok not starts('01234', '123')\n\ntest \"the `starts` helper can take an optional offset\", ->\n  ok     starts('01234', '34', 3)\n  ok not starts('01234', '01', 1)\n\n\n# `ends`\n\ntest \"the `ends` helper tests if a string ends with another string\", ->\n  ok     ends('01234', '234')\n  ok not ends('01234', '012')\n\ntest \"the `ends` helper can take an optional offset\", ->\n  ok     ends('01234', '012', 2)\n  ok not ends('01234', '234', 6)\n\n\n# `repeat`\n\ntest \"the `repeat` helper concatenates a given number of times\", ->\n  eq 'asdasdasd', repeat('asd', 3)\n\ntest \"`repeat`ing a string 0 times always returns the empty string\", ->\n  eq '', repeat('whatever', 0)\n\n\n# `compact`\n\ntest \"the `compact` helper removes falsey values from an array, preserves truthy ones\", ->\n  allValues = [1, 0, false, obj={}, [], '', ' ', -1, null, undefined, true]\n  truthyValues = [1, obj, [], ' ', -1, true]\n  arrayEq truthyValues, compact(allValues)\n\n\n# `count`\n\ntest \"the `count` helper counts the number of occurrences of a string in another string\", ->\n  eq 1/0, count('abc', '')\n  eq 0, count('abc', 'z')\n  eq 1, count('abc', 'a')\n  eq 1, count('abc', 'b')\n  eq 2, count('abcdc', 'c')\n  eq 2, count('abcdabcd','abc')\n\n\n# `merge`\n\ntest \"the `merge` helper makes a new object with all properties of the objects given as its arguments\", ->\n  ary = [0, 1, 2, 3, 4]\n  obj = {}\n  merged = merge obj, ary\n  ok merged isnt obj\n  ok merged isnt ary\n  for own key, val of ary\n    eq val, merged[key]\n\n\n# `extend`\n\ntest \"the `extend` helper performs a shallow copy\", ->\n  ary = [0, 1, 2, 3]\n  obj = {}\n  # should return the object being extended\n  eq obj, extend(obj, ary)\n  # should copy the other object's properties as well (obviously)\n  eq 2, obj[2]\n\n\n# `flatten`\n\ntest \"the `flatten` helper flattens an array\", ->\n  success = yes\n  (success and= typeof n is 'number') for n in flatten [0, [[[1]], 2], 3, [4]]\n  ok success\n\n\n# `del`\n\ntest \"the `del` helper deletes a property from an object and returns the deleted value\", ->\n  obj = [0, 1, 2]\n  eq 1, del(obj, 1)\n  ok 1 not of obj\n\n\n# `baseFileName`\n\ntest \"the `baseFileName` helper returns the file name to write to\", ->\n  ext = '.js'\n  sourceToCompiled =\n    '.coffee': ext\n    'a.coffee': 'a' + ext\n    'b.coffee': 'b' + ext\n    'coffee.coffee': 'coffee' + ext\n\n    '.litcoffee': ext\n    'a.litcoffee': 'a' + ext\n    'b.litcoffee': 'b' + ext\n    'coffee.litcoffee': 'coffee' + ext\n\n    '.lit': ext\n    'a.lit': 'a' + ext\n    'b.lit': 'b' + ext\n    'coffee.lit': 'coffee' + ext\n\n    '.coffee.md': ext\n    'a.coffee.md': 'a' + ext\n    'b.coffee.md': 'b' + ext\n    'coffee.coffee.md': 'coffee' + ext\n\n  for sourceFileName, expectedFileName of sourceToCompiled\n    name = baseFileName sourceFileName, yes\n    filename = name + ext\n    eq filename, expectedFileName\n"
  },
  {
    "path": "test/import_assertions.coffee",
    "content": "# This file is running in CommonJS (in Node) or as a classic Script (in the browser tests) so it can use import() within an async function, but not at the top level; and we can’t use static import.\ntest \"dynamic import assertion\", ->\n  try\n    { default: secret } = await import('data:application/json,{\"ofLife\":42}', { assert: { type: 'json' } })\n    eq secret.ofLife, 42\n  catch exception\n    # This parses on Node 16.14.x but throws an error because JSON modules aren’t unflagged there yet; remove this try/catch once the unflagging of `--experimental-json-modules` is backported (see https://github.com/nodejs/node/pull/41736#issuecomment-1086738670)\n    unless exception.message is 'Invalid module \"data:application/json,{\"ofLife\":42}\" has an unsupported MIME type \"application/json\"'\n      throw exception\n\ntest \"assert keyword\", ->\n  assert = 1\n\n  try\n    { default: assert } = await import('data:application/json,{\"thatIAm\":42}', { assert: { type: 'json' } })\n    eq assert.thatIAm, 42\n  catch exception\n    # This parses on Node 16.14.x but throws an error because JSON modules aren’t unflagged there yet; remove this try/catch once the unflagging of `--experimental-json-modules` is backported (see https://github.com/nodejs/node/pull/41736#issuecomment-1086738670)\n    unless exception.message is 'Invalid module \"data:application/json,{\"thatIAm\":42}\" has an unsupported MIME type \"application/json\"'\n      throw exception\n\n  eqJS \"\"\"\n    import assert from 'regression-test'\n  \"\"\", \"\"\"\n    import assert from 'regression-test';\n  \"\"\"\n\ntest \"static import assertion\", ->\n  eqJS \"\"\"\n    import 'data:application/json,{\"foo\":3}' assert { type: 'json' }\n  \"\"\", \"\"\"\n    import 'data:application/json,{\"foo\":3}' assert {\n      type: 'json'\n    };\n  \"\"\"\n\n  eqJS \"\"\"\n    import secret from 'data:application/json,{\"ofLife\":42}' assert { type: 'json' }\n  \"\"\", \"\"\"\n    import secret from 'data:application/json,{\"ofLife\":42}' assert {\n      type: 'json'\n    };\n  \"\"\"\n\n  eqJS \"\"\"\n    import * as secret from 'data:application/json,{\"ofLife\":42}' assert { type: 'json' }\n  \"\"\", \"\"\"\n    import * as secret from 'data:application/json,{\"ofLife\":42}' assert {\n      type: 'json'\n    };\n  \"\"\"\n\n  # The only file types for which import assertions are currently supported are JSON (Node and browsers) and CSS (browsers), neither of which support named exports; however there’s nothing in the JavaScript grammar preventing a future supported file type from providing named exports.\n  eqJS \"\"\"\n    import { foo } from './file.unknown' assert { type: 'unknown' }\n  \"\"\", \"\"\"\n    import {\n      foo\n    } from './file.unknown' assert {\n        type: 'unknown'\n      };\n  \"\"\"\n\n  eqJS \"\"\"\n    import file, { foo } from './file.unknown' assert { type: 'unknown' }\n  \"\"\", \"\"\"\n    import file, {\n      foo\n    } from './file.unknown' assert {\n        type: 'unknown'\n      };\n  \"\"\"\n\n  eqJS \"\"\"\n    import foo from 'bar' assert {}\n  \"\"\", \"\"\"\n    import foo from 'bar' assert {};\n  \"\"\"\n\ntest \"static export with assertion\", ->\n  eqJS \"\"\"\n    export * from 'data:application/json,{\"foo\":3}' assert { type: 'json' }\n  \"\"\", \"\"\"\n    export * from 'data:application/json,{\"foo\":3}' assert {\n      type: 'json'\n    };\n  \"\"\"\n\n  eqJS \"\"\"\n    export { profile } from './user.json' assert { type: 'json' }\n  \"\"\", \"\"\"\n    export {\n      profile\n    } from './user.json' assert {\n        type: 'json'\n      };\n  \"\"\"\n"
  },
  {
    "path": "test/importing/.coffee",
    "content": "// Required by ../importing.coffee\nmodule.exports = {value: function(){return 1;}};\n"
  },
  {
    "path": "test/importing/.coffee.md",
    "content": "// Required by ../importing.coffee\nmodule.exports = {value: function(){return 1;}};\n"
  },
  {
    "path": "test/importing/.import.coffee",
    "content": "# Required by ../importing.coffee\nmodule.exports = {value: -> 2}\n"
  },
  {
    "path": "test/importing/.import.coffee.md",
    "content": "Required by ../importing.coffee\n\n    module.exports = {value: -> 3}\n"
  },
  {
    "path": "test/importing/.import2",
    "content": "// Required by ../importing.coffee\nmodule.exports = {value: function(){return 1;}};\n"
  },
  {
    "path": "test/importing/error.coffee",
    "content": "# This file throws an error on line 3. It is used for testing error stack traces with sourcemaps.\nmodule.exports =\n  throw new Error 'I am error'\n"
  },
  {
    "path": "test/importing/import.coffee",
    "content": "# Required by ../importing.coffee\nmodule.exports = {value: -> 2}\n"
  },
  {
    "path": "test/importing/import.coffee.md",
    "content": "Required by ../importing.coffee\n\n    module.exports = {value: -> 3}\n"
  },
  {
    "path": "test/importing/import.extension.coffee",
    "content": "# Required by ../importing.coffee\nmodule.exports = {value: -> 2}\n"
  },
  {
    "path": "test/importing/import.extension.coffee.md",
    "content": "Required by ../importing.coffee\n\n    module.exports = {value: -> 3}\n"
  },
  {
    "path": "test/importing/import.extension.js",
    "content": "// Required by ../importing.coffee\nmodule.exports = {value: function(){return 1;}};\n"
  },
  {
    "path": "test/importing/import.js",
    "content": "// Required by ../importing.coffee\nmodule.exports = {value: function(){return 1;}};\n"
  },
  {
    "path": "test/importing/import.litcoffee",
    "content": "Required by ../importing.coffee\n\n    module.exports = {value: -> 3}\n"
  },
  {
    "path": "test/importing/import.unknownextension",
    "content": "// Required by ../importing.coffee\nmodule.exports = {value: function(){return 1;}};\n"
  },
  {
    "path": "test/importing/import2",
    "content": "// Required by ../importing.coffee\nmodule.exports = {value: function(){return 1;}};\n"
  },
  {
    "path": "test/importing/index.coffee.md",
    "content": "Required by ../importing.coffee\n\n    module.exports = {value: -> 3}\n"
  },
  {
    "path": "test/importing/shebang.coffee",
    "content": "#!/usr/bin/env coffee\n\nprocess.stdout.write JSON.stringify(process.argv)\n"
  },
  {
    "path": "test/importing/shebang_extra_args.coffee",
    "content": "#!/usr/bin/env coffee --\n\nprocess.stdout.write JSON.stringify(process.argv)\n"
  },
  {
    "path": "test/importing/shebang_initial_space.coffee",
    "content": "#!  /usr/bin/env coffee\n\nprocess.stdout.write JSON.stringify(process.argv)\n"
  },
  {
    "path": "test/importing/shebang_initial_space_extra_args.coffee",
    "content": "#! /usr/bin/env coffee extra\n\nprocess.stdout.write JSON.stringify(process.argv)\n"
  },
  {
    "path": "test/importing/transpile_import.coffee",
    "content": "import path from 'path'\n\nexport getSep = -> path.sep\n"
  },
  {
    "path": "test/importing.coffee",
    "content": "# Importing\n# ---------\n\nunless window? or testingBrowser?\n  test \"coffeescript modules can be imported and executed\", ->\n\n    magicKey = __filename\n    magicValue = 0xFFFF\n\n    if global[magicKey]?\n      if exports?\n        local = magicValue\n        exports.method = -> local\n    else\n      global[magicKey] = {}\n      if require?.extensions?\n        ok require(__filename).method() is magicValue\n      delete global[magicKey]\n\n  test \"javascript modules can be imported\", ->\n    magicVal = 1\n    for module in 'import.js import2 .import2 import.extension.js import.unknownextension .coffee .coffee.md'.split ' '\n      ok require(\"./importing/#{module}\").value?() is magicVal, module\n\n  test \"coffeescript modules can be imported\", ->\n    magicVal = 2\n    for module in '.import.coffee import.coffee import.extension.coffee'.split ' '\n      ok require(\"./importing/#{module}\").value?() is magicVal, module\n\n  test \"literate coffeescript modules can be imported\", ->\n    magicVal = 3\n    # Leading space intentional to check for index.coffee.md\n    for module in ' .import.coffee.md import.coffee.md import.litcoffee import.extension.coffee.md'.split ' '\n      ok require(\"./importing/#{module}\").value?() is magicVal, module\n"
  },
  {
    "path": "test/interpolation.coffee",
    "content": "# Interpolation\n# -------------\n\n# * String Interpolation\n# * Regular Expression Interpolation\n\n# String Interpolation\n\n# TODO: refactor string interpolation tests\n\neq 'multiline nested \"interpolations\" work', \"\"\"multiline #{\n  \"nested #{\n    ok true\n    \"\\\"interpolations\\\"\"\n  }\"\n} work\"\"\"\n\n# Issue #923: Tricky interpolation.\neq \"#{ \"{\" }\", \"{\"\neq \"#{ '#{}}' } }\", '#{}} }'\neq \"#{\"'#{ ({a: \"b#{1}\"}['a']) }'\"}\", \"'b1'\"\n\n# Issue #1150: String interpolation regression\neq \"#{'\"/'}\",                '\"/'\neq \"#{\"/'\"}\",                \"/'\"\neq \"#{/'\"/}\",                '/\\'\"/'\neq \"#{\"'/\" + '/\"' + /\"'/}\",  '\\'//\"/\"\\'/'\neq \"#{\"'/\"}#{'/\"'}#{/\"'/}\",  '\\'//\"/\"\\'/'\neq \"#{6 / 2}\",               '3'\neq \"#{6 / 2}#{6 / 2}\",       '33' # parsed as division\neq \"#{6 + /2}#{6/ + 2}\",     '6/2}#{6/2' # parsed as a regex\neq \"#{6/2}\n    #{6/2}\",                 '3 3' # newline cannot be part of a regex, so it's division\neq \"#{/// \"'/'\"/\" ///}\",     '/\"\\'\\\\/\\'\"\\\\/\"/' # heregex, stuffed with spicy characters\neq \"#{/\\\\'/}\",               \"/\\\\\\\\'/\"\n\n# Issue #2321: Regex/division conflict in interpolation\neq \"#{4/2}/\", '2/'\ncurWidth = 4\neq \"<i style='left:#{ curWidth/2 }%;'></i>\",   \"<i style='left:2%;'></i>\"\nthrowsCompileError '''\n   \"<i style='left:#{ curWidth /2 }%;'></i>\"'''\n#                 valid regex--^^^^^^^^^^^ ^--unclosed string\neq \"<i style='left:#{ curWidth/2 }%;'></i>\",   \"<i style='left:2%;'></i>\"\neq \"<i style='left:#{ curWidth/ 2 }%;'></i>\",  \"<i style='left:2%;'></i>\"\neq \"<i style='left:#{ curWidth / 2 }%;'></i>\", \"<i style='left:2%;'></i>\"\n\nhello = 'Hello'\nworld = 'World'\nok '#{hello} #{world}!' is '#{hello} #{world}!'\nok \"#{hello} #{world}!\" is 'Hello World!'\nok \"[#{hello}#{world}]\" is '[HelloWorld]'\nok \"#{hello}##{world}\" is 'Hello#World'\nok \"Hello #{ 1 + 2 } World\" is 'Hello 3 World'\nok \"#{hello} #{ 1 + 2 } #{world}\" is \"Hello 3 World\"\nok 1 + \"#{2}px\" is '12px'\nok isNaN \"a#{2}\" * 2\nok \"#{2}\" is '2'\nok \"#{2}#{2}\" is '22'\n\n[s, t, r, i, n, g] = ['s', 't', 'r', 'i', 'n', 'g']\nok \"#{s}#{t}#{r}#{i}#{n}#{g}\" is 'string'\nok \"\\#{s}\\#{t}\\#{r}\\#{i}\\#{n}\\#{g}\" is '#{s}#{t}#{r}#{i}#{n}#{g}'\nok \"\\#{string}\" is '#{string}'\n\nok \"\\#{Escaping} first\" is '#{Escaping} first'\nok \"Escaping \\#{in} middle\" is 'Escaping #{in} middle'\nok \"Escaping \\#{last}\" is 'Escaping #{last}'\n\nok \"##\" is '##'\nok \"#{}\" is ''\nok \"#{}A#{} #{} #{}B#{}\" is 'A  B'\nok \"\\\\\\#{}\" is '\\\\#{}'\n\nok \"I won ##{20} last night.\" is 'I won #20 last night.'\nok \"I won ##{'#20'} last night.\" is 'I won ##20 last night.'\n\nok \"#{hello + world}\" is 'HelloWorld'\nok \"#{hello + ' ' + world + '!'}\" is 'Hello World!'\n\nlist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\nok \"values: #{list.join(', ')}, length: #{list.length}.\" is 'values: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, length: 10.'\nok \"values: #{list.join ' '}\" is 'values: 0 1 2 3 4 5 6 7 8 9'\n\nobj = {\n  name: 'Joe'\n  hi: -> \"Hello #{@name}.\"\n  cya: -> \"Hello #{@name}.\".replace('Hello','Goodbye')\n}\nok obj.hi() is \"Hello Joe.\"\nok obj.cya() is \"Goodbye Joe.\"\n\nok \"With #{\"quotes\"}\" is 'With quotes'\nok 'With #{\"quotes\"}' is 'With #{\"quotes\"}'\n\nok \"Where is #{obj[\"name\"] + '?'}\" is 'Where is Joe?'\n\nok \"Where is #{\"the nested #{obj[\"name\"]}\"}?\" is 'Where is the nested Joe?'\nok \"Hello #{world ? \"#{hello}\"}\" is 'Hello World'\n\nok \"Hello #{\"#{\"#{obj[\"name\"]}\" + '!'}\"}\" is 'Hello Joe!'\n\na = \"\"\"\n    Hello #{ \"Joe\" }\n    \"\"\"\nok a is \"Hello Joe\"\n\na = 1\nb = 2\nc = 3\nok \"#{a}#{b}#{c}\" is '123'\n\nresult = null\nstash = (str) -> result = str\nstash \"a #{ ('aa').replace /a/g, 'b' } c\"\nok result is 'a bb c'\n\nfoo = \"hello\"\nok \"#{foo.replace(\"\\\"\", \"\")}\" is 'hello'\n\nval = 10\na = \"\"\"\n    basic heredoc #{val}\n    on two lines\n    \"\"\"\nb = '''\n    basic heredoc #{val}\n    on two lines\n    '''\nok a is \"basic heredoc 10\\non two lines\"\nok b is \"basic heredoc \\#{val}\\non two lines\"\n\neq 'multiline nested \"interpolations\" work', \"\"\"multiline #{\n  \"nested #{(->\n    ok yes\n    \"\\\"interpolations\\\"\"\n  )()}\"\n} work\"\"\"\n\neq 'function(){}', \"#{->}\".replace /\\s/g, ''\nok /^a[\\s\\S]+b$/.test \"a#{=>}b\"\nok /^a[\\s\\S]+b$/.test \"a#{ (x) -> x %% 2 }b\"\n\n# Regular Expression Interpolation\n\n# TODO: improve heregex interpolation tests\n\ntest \"heregex interpolation\", ->\n  eq /\\\\#{}\\\\\"/ + '', ///\n   #{\n     \"#{ '\\\\' }\" # normal comment\n   }\n   # regex comment\n   \\#{}\n   \\\\ \"\n  /// + ''\n"
  },
  {
    "path": "test/invocation_argument_parsing.coffee",
    "content": "return unless require?\n\npath = require 'path'\n{ execFileSync, spawnSync } = require 'child_process'\n\n# Get the folder containing the compiled `coffee` executable and make it the\n# PATH so that `#!/usr/bin/env coffee` resolves to our locally built file.\ncoffeeBinFolder = path.dirname require.resolve '../bin/coffee'\n# For some reason, Windows requires `coffee` to be executed as `node coffee`.\ncoffeeCommand = if isWindows() then 'node coffee' else 'coffee'\nspawnOptions =\n  cwd: coffeeBinFolder\n  encoding: 'utf8'\n  env: Object.assign {}, process.env,\n    PATH: coffeeBinFolder + (if isWindows() then ';' else ':') + process.env.PATH\n  shell: isWindows()\n\nshebangScript = require.resolve './importing/shebang.coffee'\ninitialSpaceScript = require.resolve './importing/shebang_initial_space.coffee'\nextraArgsScript = require.resolve './importing/shebang_extra_args.coffee'\ninitialSpaceExtraArgsScript = require.resolve './importing/shebang_initial_space_extra_args.coffee'\n\ntest \"parse arguments for shebang scripts correctly (on *nix platforms)\", ->\n  return if isWindows()\n\n  stdout = execFileSync shebangScript, ['-abck'], spawnOptions\n  expectedArgs = ['coffee', shebangScript, '-abck']\n  realArgs = JSON.parse stdout\n  arrayEq expectedArgs, realArgs\n\n  stdout = execFileSync initialSpaceScript, ['-abck'], spawnOptions\n  expectedArgs = ['coffee', initialSpaceScript, '-abck']\n  realArgs = JSON.parse stdout\n  arrayEq expectedArgs, realArgs\n\ntest \"warn and remove -- if it is the second positional argument\", ->\n  result = spawnSync coffeeCommand, [shebangScript, '--'], spawnOptions\n  stderr = result.stderr.toString()\n  arrayEq JSON.parse(result.stdout), ['coffee', shebangScript]\n  ok stderr.match /^coffee was invoked with '--'/m\n  posArgs = stderr.match(/^The positional arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(posArgs), [shebangScript, '--']\n  ok result.status is 0\n\n  result = spawnSync coffeeCommand, ['-b', shebangScript, '--'], spawnOptions\n  stderr = result.stderr.toString()\n  arrayEq JSON.parse(result.stdout), ['coffee', shebangScript]\n  ok stderr.match /^coffee was invoked with '--'/m\n  posArgs = stderr.match(/^The positional arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(posArgs), [shebangScript, '--']\n  ok result.status is 0\n\n  result = spawnSync(\n    coffeeCommand, ['-b', shebangScript, '--', 'ANOTHER'], spawnOptions)\n  stderr = result.stderr.toString()\n  arrayEq JSON.parse(result.stdout), ['coffee', shebangScript, 'ANOTHER']\n  ok stderr.match /^coffee was invoked with '--'/m\n  posArgs = stderr.match(/^The positional arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(posArgs), [shebangScript, '--', 'ANOTHER']\n  ok result.status is 0\n\n  result = spawnSync(\n    coffeeCommand, ['--', initialSpaceScript, 'arg'], spawnOptions)\n  expectedArgs = ['coffee', initialSpaceScript, 'arg']\n  realArgs = JSON.parse result.stdout\n  arrayEq expectedArgs, realArgs\n  ok result.stderr.toString() is ''\n  ok result.status is 0\n\ntest \"warn about non-portable shebang lines\", ->\n  result = spawnSync coffeeCommand, [extraArgsScript, 'arg'], spawnOptions\n  stderr = result.stderr.toString()\n  arrayEq JSON.parse(result.stdout), ['coffee', extraArgsScript, 'arg']\n  ok stderr.match /^The script to be run begins with a shebang line with more than one/m\n  [_, firstLine, file] = stderr.match(/^The shebang line was: '([^']+)' in file '([^']+)'/m)\n  ok (firstLine is '#!/usr/bin/env coffee --')\n  ok (file is extraArgsScript)\n  args = stderr.match(/^The arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(args), ['coffee', '--']\n  ok result.status is 0\n\n  result = spawnSync coffeeCommand, [initialSpaceScript, 'arg'], spawnOptions\n  stderr = result.stderr.toString()\n  ok stderr is ''\n  arrayEq JSON.parse(result.stdout), ['coffee', initialSpaceScript, 'arg']\n  ok result.status is 0\n\n  result = spawnSync(\n    coffeeCommand, [initialSpaceExtraArgsScript, 'arg'], spawnOptions)\n  stderr = result.stderr.toString()\n  arrayEq JSON.parse(result.stdout), ['coffee', initialSpaceExtraArgsScript, 'arg']\n  ok stderr.match /^The script to be run begins with a shebang line with more than one/m\n  [_, firstLine, file] = stderr.match(/^The shebang line was: '([^']+)' in file '([^']+)'/m)\n  ok (firstLine is '#! /usr/bin/env coffee extra')\n  ok (file is initialSpaceExtraArgsScript)\n  args = stderr.match(/^The arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(args), ['coffee', 'extra']\n  ok result.status is 0\n\ntest \"both warnings will be shown at once\", ->\n  result = spawnSync(\n    coffeeCommand, [initialSpaceExtraArgsScript, '--', 'arg'], spawnOptions)\n  stderr = result.stderr.toString()\n  arrayEq JSON.parse(result.stdout), ['coffee', initialSpaceExtraArgsScript, 'arg']\n  ok stderr.match /^The script to be run begins with a shebang line with more than one/m\n  [_, firstLine, file] = stderr.match(/^The shebang line was: '([^']+)' in file '([^']+)'/m)\n  ok (firstLine is '#! /usr/bin/env coffee extra')\n  ok (file is initialSpaceExtraArgsScript)\n  args = stderr.match(/^The arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(args), ['coffee', 'extra']\n  ok stderr.match /^coffee was invoked with '--'/m\n  posArgs = stderr.match(/^The positional arguments were: (.*)$/m)[1]\n  arrayEq JSON.parse(posArgs), [initialSpaceExtraArgsScript, '--', 'arg']\n  ok result.status is 0\n"
  },
  {
    "path": "test/javascript_literals.coffee",
    "content": "# JavaScript Literals\n# -------------------\n\ntest \"inline JavaScript is evaluated\", ->\n  eq '\\\\`', `\n    // Inline JS\n    \"\\\\\\\\\\`\"\n  `\n\ntest \"escaped backticks are output correctly\", ->\n  `var a = \\`2 + 2 = ${4}\\``\n  eq a, '2 + 2 = 4'\n\ntest \"backslashes before a newline don’t break JavaScript blocks\", ->\n  `var a = \\`To be, or not\\\\\n  to be.\\``\n  eq a, '''\n  To be, or not\\\\\n    to be.'''\n\ntest \"block inline JavaScript is evaluated\", ->\n  ```\n  var a = 1;\n  var b = 2;\n  ```\n  c = 3\n  ```var d = 4;```\n  eq a + b + c + d, 10\n\ntest \"block inline JavaScript containing backticks\", ->\n  ```\n  // This is a comment with `backticks`\n  var a = 42;\n  var b = `foo ${'bar'}`;\n  var c = 3;\n  var d = 'foo`bar`';\n  ```\n  eq a + c, 45\n  eq b, 'foo bar'\n  eq d, 'foo`bar`'\n\ntest \"block JavaScript can end with an escaped backtick character\", ->\n  ```var a = \\`hello\\````\n  ```\n  var b = \\`world${'!'}\\````\n  eq a, 'hello'\n  eq b, 'world!'\n\ntest \"JavaScript block only escapes backslashes followed by backticks\", ->\n  eq `'\\\\\\n'`, '\\\\\\n'\n\ntest \"escaped JavaScript blocks speed round\", ->\n  # The following has escaped backslashes because they’re required in strings, but the intent is this:\n  # `hello`                                       → hello;\n  # `\\`hello\\``                                   → `hello`;\n  # `\\`Escaping backticks in JS: \\\\\\`hello\\\\\\`\\`` → `Escaping backticks in JS: \\`hello\\``;\n  # `Single backslash: \\ `                        → Single backslash: \\ ;\n  # `Double backslash: \\\\ `                       → Double backslash: \\\\ ;\n  # `Single backslash at EOS: \\\\`                 → Single backslash at EOS: \\;\n  # `Double backslash at EOS: \\\\\\\\`               → Double backslash at EOS: \\\\;\n  for [input, output] in [\n    ['`hello`',                                               'hello;']\n    ['`\\\\`hello\\\\``',                                         '`hello`;']\n    ['`\\\\`Escaping backticks in JS: \\\\\\\\\\\\`hello\\\\\\\\\\\\`\\\\``', '`Escaping backticks in JS: \\\\`hello\\\\``;']\n    ['`Single backslash: \\\\ `',                               'Single backslash: \\\\ ;']\n    ['`Double backslash: \\\\\\\\ `',                             'Double backslash: \\\\\\\\ ;']\n    ['`Single backslash at EOS: \\\\\\\\`',                       'Single backslash at EOS: \\\\;']\n    ['`Double backslash at EOS: \\\\\\\\\\\\\\\\`',                   'Double backslash at EOS: \\\\\\\\;']\n  ]\n    eqJS input, output\n"
  },
  {
    "path": "test/jsx.coffee",
    "content": "# We usually do not check the actual JS output from the compiler, but since\n# JSX is not natively supported by Node, we do it in this case.\n\ntest 'self closing', ->\n  eqJS '''\n    <div />\n  ''', '''\n    <div />;\n  '''\n\ntest 'self closing formatting', ->\n  eqJS '''\n    <div/>\n  ''', '''\n    <div />;\n  '''\n\ntest 'self closing multiline', ->\n  eqJS '''\n    <div\n    />\n  ''', '''\n    <div />;\n  '''\n\ntest 'reserved-word self closing', ->\n  eqJS '''\n    <static />\n  ''', '''\n    <static />;\n  '''\n\ntest 'regex attribute', ->\n  eqJS '''\n    <div x={/>asds/} />\n  ''', '''\n    <div x={/>asds/} />;\n  '''\n\ntest 'string attribute', ->\n  eqJS '''\n    <div x=\"a\" />\n  ''', '''\n    <div x=\"a\" />;\n  '''\n\ntest 'simple attribute', ->\n  eqJS '''\n    <div x={42} />\n  ''', '''\n    <div x={42} />;\n  '''\n\ntest 'assignment attribute', ->\n  eqJS '''\n    <div x={y = 42} />\n  ''', '''\n    var y;\n\n    <div x={y = 42} />;\n  '''\n\ntest 'object attribute', ->\n  eqJS '''\n    <div x={{y: 42}} />\n  ''', '''\n    <div x={{\n      y: 42\n    }} />;\n  '''\n\ntest 'attribute without value', ->\n  eqJS '''\n    <div checked x=\"hello\" />\n  ''', '''\n    <div checked x=\"hello\" />;\n  '''\n\ntest 'reserved-word attribute without value', ->\n  eqJS '''\n    <div static x=\"hello\" />\n  ''', '''\n    <div static x=\"hello\" />;\n  '''\n\ntest 'reserved-word attribute with value', ->\n  eqJS '''\n    <div static=\"yes\" x=\"hello\" />\n  ''', '''\n    <div static=\"yes\" x=\"hello\" />;\n  '''\n\ntest 'attribute with namespace', ->\n  eqJS '''\n    <image xlink:href=\"data:image/png\" />\n  ''', '''\n    <image xlink:href=\"data:image/png\" />;\n  '''\n\ntest 'attribute with double namespace disallowed', ->\n  throwsCompileError '<image xlink:href:tag=\"data:image/png\" />'\n\ntest 'attribute with member expression disallowed', ->\n  throwsCompileError '<image xlink.href=\"data:image/png\" />'\n\ntest 'paired', ->\n  eqJS '''\n    <div></div>\n  ''', '''\n    <div></div>;\n  '''\n\ntest 'simple content', ->\n  eqJS '''\n    <div>Hello world</div>\n  ''', '''\n    <div>Hello world</div>;\n  '''\n\ntest 'content interpolation', ->\n  eqJS '''\n    <div>Hello {42}</div>\n  ''', '''\n    <div>Hello {42}</div>;\n  '''\n\ntest 'nested tag', ->\n  eqJS '''\n    <div><span /></div>\n  ''', '''\n    <div><span /></div>;\n  '''\n\ntest 'tag inside interpolation formatting', ->\n  eqJS '''\n    <div>Hello {<span />}</div>\n  ''', '''\n    <div>Hello <span /></div>;\n  '''\n\ntest 'tag inside interpolation, tags are callable', ->\n  eqJS '''\n    <div>Hello {<span /> x}</div>\n  ''', '''\n    <div>Hello {<span />(x)}</div>;\n  '''\n\ntest 'tags inside interpolation, tags trigger implicit calls', ->\n  eqJS '''\n    <div>Hello {f <span />}</div>\n  ''', '''\n    <div>Hello {f(<span />)}</div>;\n  '''\n\ntest 'regex in interpolation', ->\n  eqJS '''\n    <div x={/>asds/}><div />{/>asdsad</}</div>\n  ''', '''\n    <div x={/>asds/}><div />{/>asdsad</}</div>;\n  '''\n\ntest 'interpolation in string attribute value', ->\n  eqJS '''\n    <div x=\"Hello #{world}\" />\n  ''', '''\n    <div x={`Hello ${world}`} />;\n  '''\n\n# Unlike in `coffee-react-transform`.\ntest 'bare numbers not allowed', ->\n  throwsCompileError '<div x=3 />'\n\ntest 'bare expressions not allowed', ->\n  throwsCompileError '<div x=y />'\n\ntest 'bare complex expressions not allowed', ->\n  throwsCompileError '<div x=f(3) />'\n\ntest 'unescaped opening tag angle bracket disallowed', ->\n  throwsCompileError '<Person><<</Person>'\n\ntest 'space around equal sign', ->\n  eqJS '''\n    <div popular = \"yes\" />\n  ''', '''\n    <div popular=\"yes\" />;\n  '''\n\n# The following tests were adopted from James Friend’s\n# [https://github.com/jsdf/coffee-react-transform](https://github.com/jsdf/coffee-react-transform).\n\ntest 'ambiguous tag-like expression', ->\n  throwsCompileError 'x = a <b > c'\n\ntest 'ambiguous tag', ->\n  eqJS '''\n    a <b > c </b>\n  ''', '''\n    a(<b> c </b>);\n  '''\n\ntest 'escaped CoffeeScript attribute', ->\n  eqJS '''\n    <Person name={if test() then 'yes' else 'no'} />\n  ''', '''\n    <Person name={test() ? 'yes' : 'no'} />;\n  '''\n\ntest 'escaped CoffeeScript attribute over multiple lines', ->\n  eqJS '''\n    <Person name={\n      if test()\n        'yes'\n      else\n        'no'\n    } />\n  ''', '''\n    <Person name={test() ? 'yes' : 'no'} />;\n  '''\n\ntest 'multiple line escaped CoffeeScript with nested JSX', ->\n  eqJS '''\n    <Person name={\n      if test()\n        'yes'\n      else\n        'no'\n    }>\n    {\n\n      for n in a\n        <div> a\n          asf\n          <li xy={\"as\"}>{ n+1 }<a /> <a /> </li>\n        </div>\n    }\n\n    </Person>\n  ''', '''\n    var n;\n\n    <Person name={test() ? 'yes' : 'no'}>\n    {(function() {\n      var i, len, results;\n      results = [];\n      for (i = 0, len = a.length; i < len; i++) {\n        n = a[i];\n        results.push(<div> a\n          asf\n          <li xy={\"as\"}>{n + 1}<a /> <a /> </li>\n        </div>);\n      }\n      return results;\n    })()}\n\n    </Person>;\n  '''\n\ntest 'nested JSX within an attribute, with object attr value', ->\n  eqJS '''\n    <Company>\n      <Person name={<NameComponent attr3={ {'a': {}, b: '{'} } />} />\n    </Company>\n  ''', '''\n    <Company>\n      <Person name={<NameComponent attr3={{\n      'a': {},\n      b: '{'\n    }} />} />\n    </Company>;\n  '''\n\ntest 'complex nesting', ->\n  eqJS '''\n    <div code={someFunc({a:{b:{}, C:'}{}{'}})} />\n  ''', '''\n    <div code={someFunc({\n      a: {\n        b: {},\n        C: '}{}{'\n      }\n    })} />;\n  '''\n\ntest 'multiline tag with nested JSX within an attribute', ->\n  eqJS '''\n    <Person\n      name={\n        name = formatName(user.name)\n        <NameComponent name={name.toUppercase()} />\n      }\n    >\n      blah blah blah\n    </Person>\n  ''', '''\n    var name;\n\n    <Person name={name = formatName(user.name), <NameComponent name={name.toUppercase()} />}>\n      blah blah blah\n    </Person>;\n  '''\n\ntest 'escaped CoffeeScript with nested object literals', ->\n  eqJS '''\n    <Person>\n      blah blah blah {\n        {'a' : {}, 'asd': 'asd'}\n      }\n    </Person>\n  ''', '''\n    <Person>\n      blah blah blah {{\n      'a': {},\n      'asd': 'asd'\n    }}\n    </Person>;\n  '''\n\ntest 'multiline tag attributes with escaped CoffeeScript', ->\n  eqJS '''\n    <Person name={if isActive() then 'active' else 'inactive'}\n    someattr='on new line' />\n  ''', '''\n    <Person name={isActive() ? 'active' : 'inactive'} someattr='on new line' />;\n  '''\n\ntest 'lots of attributes', ->\n  eqJS '''\n    <Person eyes={2} friends={getFriends()} popular = \"yes\"\n    active={ if isActive() then 'active' else 'inactive' } data-attr='works' checked check={me_out}\n    />\n  ''', '''\n    <Person eyes={2} friends={getFriends()} popular=\"yes\" active={isActive() ? 'active' : 'inactive'} data-attr='works' checked check={me_out} />;\n  '''\n\n# TODO: fix partially indented JSX\n# test 'multiline elements', ->\n#   eqJS '''\n#     <div something={\n#       do ->\n#         test = /432/gm # this is a regex\n#         6 /432/gm # this is division\n#     }\n#     >\n#     <div>\n#     <div>\n#     <div>\n#       <article name={ new Date() } number={203}\n#        range={getRange()}\n#       >\n#       </article>\n#     </div>\n#     </div>\n#     </div>\n#     </div>\n#   ''', '''\n#     bla\n#   '''\n\ntest 'complex regex', ->\n  eqJS '''\n    <Person />\n    /\\\\/\\\\/<Person \\\\/>\\\\>\\\\//\n  ''', '''\n    <Person />;\n\n    /\\\\/\\\\/<Person \\\\/>\\\\>\\\\//;\n  '''\n\ntest 'heregex', ->\n  eqJS '''\n    test = /432/gm # this is a regex\n    6 /432/gm # this is division\n    <Tag>\n    {test = /<Tag>/} this is a regex containing something which looks like a tag\n    </Tag>\n    <Person />\n    REGEX = /// ^\n      (/ (?! [\\s=] )   # comment comment <comment>comment</comment>\n      [^ [ / \\n \\\\ ]*  # comment comment\n      (?:\n        <Tag />\n        (?: \\\\[\\s\\S]   # comment comment\n          | \\[         # comment comment\n               [^ \\] \\n \\\\ ]*\n               (?: \\\\[\\s\\S] [^ \\] \\n \\\\ ]* )*\n               <Tag>tag</Tag>\n             ]\n        ) [^ [ / \\n \\\\ ]*\n      )*\n      /) ([imgy]{0,4}) (?!\\w)\n    ///\n    <Person />\n  ''', '''\n    var REGEX, test;\n\n    test = /432/gm; // this is a regex\n\n    6 / 432 / gm; // this is division\n\n    <Tag>\n    {test = /<Tag>/} this is a regex containing something which looks like a tag\n    </Tag>;\n\n    <Person />;\n\n    REGEX = /^(\\\\/(?![s=])[^[\\\\/ ]*(?:<Tag\\\\/>(?:\\\\[sS]|[[^] ]*(?:\\\\[sS][^] ]*)*<Tag>tag<\\\\/Tag>])[^[\\\\/ ]*)*\\\\/)([imgy]{0,4})(?!w)/; // comment comment <comment>comment</comment>\n    // comment comment\n    // comment comment\n    // comment comment\n\n    <Person />;\n  '''\n\ntest 'comment within JSX is not treated as comment', ->\n  eqJS '''\n    <Person>\n    # i am not a comment\n    </Person>\n  ''', '''\n    <Person>\n    # i am not a comment\n    </Person>;\n  '''\n\ntest 'comment at start of JSX escape', ->\n  eqJS '''\n    <Person>\n    {# i am a comment\n      \"i am a string\"\n    }\n    </Person>\n  ''', '''\n    <Person>\n    {// i am a comment\n    \"i am a string\"}\n    </Person>;\n  '''\n\ntest 'comment at end of JSX escape', ->\n  eqJS '''\n    <Person>\n    {\"i am a string\"\n    # i am a comment\n    }\n    </Person>\n  ''', '''\n    <Person>\n    {\"i am a string\"\n    // i am a comment\n    }\n    </Person>;\n  '''\n\ntest 'JSX comment cannot be used inside interpolation', ->\n  throwsCompileError '''\n    <Person>\n    {# i am a comment}\n    </Person>\n  '''\n\ntest 'comment syntax cannot be used inline', ->\n  throwsCompileError '''\n    <Person>{#comment inline}</Person>\n  '''\n\ntest 'string within JSX is ignored', ->\n  eqJS '''\n    <Person> \"i am not a string\" 'nor am i' </Person>\n  ''', '''\n    <Person> \"i am not a string\" 'nor am i' </Person>;\n  '''\n\ntest 'special chars within JSX are ignored', ->\n  eqJS \"\"\"\n    <Person> a,/';][' a\\''@$%^&˚¬∑˜˚∆å∂¬˚*()*&^%$>> '\"''\"'''\\'\\'m' i </Person>\n  \"\"\", \"\"\"\n    <Person> a,/';][' a''@$%^&˚¬∑˜˚∆å∂¬˚*()*&^%$>> '\"''\"'''''m' i </Person>;\n  \"\"\"\n\ntest 'html entities (name, decimal, hex) within JSX', ->\n  eqJS '''\n    <Person>  &&&&euro;  &#8364; &#x20AC;;; </Person>\n  ''', '''\n    <Person>  &&&&euro;  &#8364; &#x20AC;;; </Person>;\n  '''\n\ntest 'tag with {{}}', ->\n  eqJS '''\n    <Person name={{value: item, key, item}} />\n  ''', '''\n    <Person name={{\n      value: item,\n      key,\n      item\n    }} />;\n  '''\n\ntest 'tag with member expression', ->\n  eqJS '''\n    <Something.Tag></Something.Tag>\n  ''', '''\n    <Something.Tag></Something.Tag>;\n  '''\n\ntest 'tag with lowercase member expression', ->\n  eqJS '''\n    <something.tag></something.tag>\n  ''', '''\n    <something.tag></something.tag>;\n  '''\n\ntest 'self closing tag with member expression', ->\n  eqJS '''\n    <Something.Tag />\n  ''', '''\n    <Something.Tag />;\n  '''\n\ntest 'self closing tag with multiple member expressions', ->\n  eqJS '''\n    <Something.Tag.More />\n  ''', '''\n    <Something.Tag.More />;\n  '''\n\ntest 'tag with namespace', ->\n  eqJS '''\n    <Something:Tag></Something:Tag>\n  ''', '''\n    <Something:Tag></Something:Tag>;\n  '''\n\ntest 'tag with lowercase namespace', ->\n  eqJS '''\n    <something:tag></something:tag>\n  ''', '''\n    <something:tag></something:tag>;\n  '''\n\ntest 'self closing tag with namespace', ->\n  eqJS '''\n    <Something:Tag />\n  ''', '''\n    <Something:Tag />;\n  '''\n\ntest 'self closing tag with namespace and member expression disallowed', ->\n  throwsCompileError '''\n    <Namespace:Something.Tag />\n  '''\n\ntest 'self closing tag with spread attribute', ->\n  eqJS '''\n    <Component a={b} {x...} b=\"c\" />\n  ''', '''\n    <Component a={b} {...x} b=\"c\" />;\n  '''\n\ntest 'complex spread attribute', ->\n  eqJS '''\n    <Component {x...} a={b} {x...} b=\"c\" {$my_xtraCoolVar123...} />\n  ''', '''\n    <Component {...x} a={b} {...x} b=\"c\" {...$my_xtraCoolVar123} />;\n  '''\n\ntest 'multiline spread attribute', ->\n  eqJS '''\n    <Component {\n      x...} a={b} {x...} b=\"c\" {z...}>\n    </Component>\n  ''', '''\n    <Component {...x} a={b} {...x} b=\"c\" {...z}>\n    </Component>;\n  '''\n\ntest 'multiline tag with spread attribute', ->\n  eqJS '''\n    <Component\n      z=\"1\"\n      {x...}\n      a={b}\n      b=\"c\"\n    >\n    </Component>\n  ''', '''\n    <Component z=\"1\" {...x} a={b} b=\"c\">\n    </Component>;\n  '''\n\ntest 'multiline tag with spread attribute first', ->\n  eqJS '''\n    <Component\n      {x...}\n      z=\"1\"\n      a={b}\n      b=\"c\"\n    >\n    </Component>\n  ''', '''\n    <Component {...x} z=\"1\" a={b} b=\"c\">\n    </Component>;\n  '''\n\ntest 'complex multiline spread attribute', ->\n  eqJS '''\n    <Component\n      {y...\n      } a={b} {x...} b=\"c\" {z...}>\n      <div code={someFunc({a:{b:{}, C:'}'}})} />\n    </Component>\n  ''', '''\n    <Component {...y} a={b} {...x} b=\"c\" {...z}>\n      <div code={someFunc({\n      a: {\n        b: {},\n        C: '}'\n      }\n    })} />\n    </Component>;\n  '''\n\ntest 'self closing spread attribute on single line', ->\n  eqJS '''\n    <Component a=\"b\" c=\"d\" {@props...} />\n  ''', '''\n    <Component a=\"b\" c=\"d\" {...this.props} />;\n  '''\n\ntest 'self closing spread attribute on new line', ->\n  eqJS '''\n    <Component\n      a=\"b\"\n      c=\"d\"\n      {@props...}\n    />\n  ''', '''\n    <Component a=\"b\" c=\"d\" {...this.props} />;\n  '''\n\ntest 'self closing spread attribute on same line', ->\n  eqJS '''\n    <Component\n      a=\"b\"\n      c=\"d\"\n      {@props...} />\n  ''', '''\n    <Component a=\"b\" c=\"d\" {...this.props} />;\n  '''\n\ntest 'self closing spread attribute on next line', ->\n  eqJS '''\n    <Component\n      a=\"b\"\n      c=\"d\"\n      {@props...}\n\n    />\n  ''', '''\n    <Component a=\"b\" c=\"d\" {...this.props} />;\n  '''\n\ntest 'empty strings are not converted to true', ->\n  eqJS '''\n    <Component val=\"\" />\n  ''', '''\n    <Component val=\"\" />;\n  '''\n\ntest 'CoffeeScript @ syntax in tag name', ->\n  throwsCompileError '''\n    <@Component>\n      <Component />\n    </@Component>\n  '''\n\ntest 'hyphens in tag names', ->\n  eqJS '''\n    <paper-button className=\"button\">{text}</paper-button>\n  ''', '''\n    <paper-button className=\"button\">{text}</paper-button>;\n  '''\n\ntest 'closing tags must be closed', ->\n  throwsCompileError '''\n    <a></a\n  '''\n\n# Tests for allowing less than operator without spaces when ther is no JSX\n\ntest 'unspaced less than without JSX: identifier', ->\n  a = 3\n  div = 5\n  ok a<div\n\ntest 'unspaced less than without JSX: number', ->\n  div = 5\n  ok 3<div\n\ntest 'unspaced less than without JSX: paren', ->\n  div = 5\n  ok (3)<div\n\ntest 'unspaced less than without JSX: index', ->\n  div = 5\n  a = [3]\n  ok a[0]<div\n\ntest 'tag inside JSX works following: identifier', ->\n  eqJS '''\n    <span>a<div /></span>\n  ''', '''\n    <span>a<div /></span>;\n  '''\n\ntest 'tag inside JSX works following: number', ->\n  eqJS '''\n    <span>3<div /></span>\n  ''', '''\n    <span>3<div /></span>;\n  '''\n\ntest 'tag inside JSX works following: paren', ->\n  eqJS '''\n    <span>(3)<div /></span>\n  ''', '''\n    <span>(3)<div /></span>;\n  '''\n\ntest 'tag inside JSX works following: square bracket', ->\n  eqJS '''\n    <span>]<div /></span>\n  ''', '''\n    <span>]<div /></span>;\n  '''\n\ntest 'unspaced less than inside JSX works but is not encouraged', ->\n  eqJS '''\n      a = 3\n      div = 5\n      html = <span>{a<div}</span>\n    ''', '''\n      var a, div, html;\n\n      a = 3;\n\n      div = 5;\n\n      html = <span>{a < div}</span>;\n    '''\n\ntest 'unspaced less than before JSX works but is not encouraged', ->\n  eqJS '''\n      div = 5\n      res = 2<div\n      html = <span />\n    ''', '''\n      var div, html, res;\n\n      div = 5;\n\n      res = 2 < div;\n\n      html = <span />;\n    '''\n\ntest 'unspaced less than after JSX works but is not encouraged', ->\n  eqJS '''\n      div = 5\n      html = <span />\n      res = 2<div\n    ''', '''\n      var div, html, res;\n\n      div = 5;\n\n      html = <span />;\n\n      res = 2 < div;\n    '''\n\ntest '#4686: comments inside interpolations that also contain JSX tags', ->\n  eqJS '''\n    <div>\n      {\n        # comment\n        <div />\n      }\n    </div>\n  ''', '''\n    <div>\n      {  // comment\n    <div />}\n    </div>;\n  '''\n\ntest '#4686: comments inside interpolations that also contain JSX attributes', ->\n  eqJS '''\n    <div>\n      <div anAttr={\n        # comment\n        \"value\"\n      } />\n    </div>\n  ''', '''\n    <div>\n      {  // comment\n    <div anAttr={\"value\"} />}\n    </div>;\n  '''\n\ntest '#5086: comments inside JSX tags but outside interpolations', ->\n  eqJS '''\n    <div>\n      <div ###comment### attribute={value} />\n    </div>\n  ''', '''\n    <div>\n      <div /*comment*/attribute={value} />\n    </div>;\n  '''\n\ntest '#5086: comments inside JSX attributes but outside interpolations', ->\n  eqJS '''\n    <div>\n      <div attribute={###attr comment### value} />\n    </div>\n  ''', '''\n    <div>\n      <div attribute={/*attr comment*/value} />\n    </div>;\n  '''\n\ntest '#5086: comments inside nested JSX tags and attributes but outside interpolations', ->\n  eqJS '''\n    <div>\n      <div>\n        <div>\n          <div ###comment### attribute={###attr comment### value} />\n        </div>\n      </div>\n    </div>\n  ''', '''\n    <div>\n      <div>\n        <div>\n          <div /*comment*/attribute={/*attr comment*/value} />\n        </div>\n      </div>\n    </div>;\n  '''\n\n# https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html\ntest 'JSX fragments: empty fragment', ->\n  eqJS '''\n    <></>\n  ''', '''\n    <></>;\n  '''\n\ntest 'JSX fragments: fragment with text nodes', ->\n  eqJS '''\n    <>\n      Some text.\n      <h2>A heading</h2>\n      More text.\n      <h2>Another heading</h2>\n      Even more text.\n    </>\n  ''', '''\n    <>\n      Some text.\n      <h2>A heading</h2>\n      More text.\n      <h2>Another heading</h2>\n      Even more text.\n    </>;\n  '''\n\ntest 'JSX fragments: fragment with component nodes', ->\n  eqJS '''\n    Component = (props) =>\n      <Fragment>\n        <OtherComponent />\n        <OtherComponent />\n      </Fragment>\n  ''', '''\n    var Component;\n\n    Component = (props) => {\n      return <Fragment>\n        <OtherComponent />\n        <OtherComponent />\n      </Fragment>;\n    };\n  '''\n\ntest '#5055: JSX expression indentation bug', ->\n  eqJS '''\n    <div>\n      {someCondition &&\n        <span />\n      }\n    </div>\n  ''', '''\n    <div>\n      {someCondition && <span />}\n    </div>;\n  '''\n\n  eqJS '''\n    <div>{someString +\n         \"abc\"\n      }\n    </div>\n  ''', '''\n    <div>{someString + \"abc\"}\n    </div>;\n  '''\n\n  eqJS '''\n    <div>\n      {a ?\n      <span />\n      }\n    </div>\n  ''', '''\n    <div>\n      {typeof a !== \"undefined\" && a !== null ? a : <span />}\n    </div>;\n  '''\n\n# JSX is like XML, in that there needs to be a root element; but\n# technically, adjacent top-level elements where only the last one\n# is returned (as opposed to a fragment or root element) is permissible\n# syntax. It’s almost certainly an error, but it’s valid, so need to leave it\n# to linters to catch. https://github.com/jashkenas/coffeescript/pull/5049\ntest '“Adjacent” tags on separate lines should still compile', ->\n  eqJS '''\n    ->\n      <a />\n      <b />\n  ''', '''\n    (function() {\n      <a />;\n      return <b />;\n    });\n  '''\n\ntest '#5352: triple-quoted non-interpolated attribute values', ->\n  eqJS '''\n    <div a=\"\"\"\n      b\n      c\n    \"\"\" />\n  ''', '''\n    <div a={`b\n    c`} />;\n  '''\n\n  eqJS \"\"\"\n    <div a='''\n      b\n      c\n    ''' />\n  \"\"\", '''\n    <div a={`b\n    c`} />;\n  '''\n"
  },
  {
    "path": "test/literate.litcoffee",
    "content": "# Literate CoffeeScript Test\n\ncomment comment\n\n    testsCount = 0 # Track the number of tests run in this file, to make sure they all run\n\n    test \"basic literate CoffeeScript parsing\", ->\n      ok yes\n      testsCount++\n\nnow with a...\n\n    test \"broken up indentation\", ->\n\n... broken up ...\n\n      do ->\n\n... nested block.\n\n        ok yes\n        testsCount++\n\nCode must be separated from text by a blank line.\n\n    test \"code blocks must be preceded by a blank line\", ->\n\nThe next line is part of the text and will not be executed.\n      fail()\n\n      ok yes\n      testsCount++\n\nCode in `backticks is not parsed` and...\n\n    test \"comments in indented blocks work\", ->\n      do ->\n        do ->\n          # Regular comment.\n\n          ###\n            Block comment.\n          ###\n\n          ok yes\n          testsCount++\n\nRegular [Markdown](http://example.com/markdown) features, like links\nand unordered lists, are fine:\n\n  * I\n\n  * Am\n\n  * A\n\n  * List\n\n---\n\n    # keep track of whether code blocks are executed or not\n    executed = false\n\n<p>\n\nif true\n  executed = true # should not execute, this is just HTML para, not code!\n\n</p>\n\n    test \"should ignore code blocks inside HTML\", ->\n      eq executed, false\n      testsCount++\n\n---\n\n*   A list item followed by a code block:\n\n    test \"basic literate CoffeeScript parsing\", ->\n      ok yes\n      testsCount++\n\n---\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\n*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n    Suspendisse id sem consectetuer libero luctus adipiscing.\n\n---\n\nThis is [an example][id] reference-style link.\n[id]: http://example.com/  \"Optional Title Here\"\n\n---\n\n    executed = no\n\n1986. What a great season.\n\n    executed = yes\n\nand test...\n\n    test \"should recognize indented code blocks in lists with empty line as separator\", ->\n      ok executed\n      testsCount++\n\n---\n\n    executed = no\n\n1986\\. What a great season.\n           executed = yes\n\nand test...\n\n    test \"should ignore indented code in escaped list like number\", ->\n      eq executed, no\n      testsCount++\n\none last test!\n\n    test \"block quotes should render correctly\", ->\n      quote = '''\n        foo\n           and bar!\n      '''\n      eq quote, 'foo\\n   and bar!'\n      testsCount++\n\nand finally, how did we do?\n\n    test \"all spaced literate CoffeeScript tests executed\", ->\n      eq testsCount, 9\n"
  },
  {
    "path": "test/literate_tabbed.litcoffee",
    "content": "# Tabbed Literate CoffeeScript Test\n\ncomment comment\n\n\ttestsCount = 0 # Track the number of tests run in this file, to make sure they all run\n\n\ttest \"basic literate CoffeeScript parsing\", ->\n\t\tok yes\n\t\ttestsCount++\n\nnow with a...\n\n\ttest \"broken up indentation\", ->\n\n... broken up ...\n\n\t\tdo ->\n\n... nested block.\n\n\t\t\tok yes\n\t\t\ttestsCount++\n\nCode must be separated from text by a blank line.\n\n\ttest \"code blocks must be preceded by a blank line\", ->\n\nThe next line is part of the text and will not be executed.\n    fail()\n\n\t\tok yes\n\t\ttestsCount++\n\nCode in `backticks is not parsed` and...\n\n\ttest \"comments in indented blocks work\", ->\n\t\tdo ->\n\t\t\tdo ->\n\t\t\t\t# Regular comment.\n\n\t\t\t\t###\n\t\t\t\t\tBlock comment.\n\t\t\t\t###\n\n\t\t\t\tok yes\n\t\t\t\ttestsCount++\n\nRegular [Markdown](http://example.com/markdown) features, like links\nand unordered lists, are fine:\n\n  * I\n\n  * Am\n\n  * A\n\n  * List\n\n---\n\n\t# keep track of whether code blocks are executed or not\n\texecuted = false\n\n<p>\n\nif true\n\texecuted = true # should not execute, this is just HTML para, not code!\n\n</p>\n\n\ttest \"should ignore code blocks inside HTML\", ->\n\t\teq executed, false\n\t\ttestsCount++\n\n---\n\n*   A list item followed by a code block:\n\n\ttest \"basic literate CoffeeScript parsing\", ->\n\t\tok yes\n\t\ttestsCount++\n\n---\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\n*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n    Suspendisse id sem consectetuer libero luctus adipiscing.\n\n---\n\nThis is [an example][id] reference-style link.\n[id]: http://example.com/  \"Optional Title Here\"\n\n---\n\n\texecuted = no\n\n1986. What a great season.\n\n\texecuted = yes\n\nand test...\n\n\ttest \"should recognize indented code blocks in lists with empty line as separator\", ->\n\t\tok executed\n\t\ttestsCount++\n\n---\n\n\texecuted = no\n\n1986\\. What a great season.\n\t\t\t\texecuted = yes\n\nand test...\n\n\ttest \"should ignore indented code in escaped list like number\", ->\n\t\teq executed, no\n\t\ttestsCount++\n\none last test!\n\n\ttest \"block quotes should render correctly\", ->\n\t\tquote = '''\n\t\t\tfoo\n\t\t\t\t\tand bar!\n\t\t'''\n\t\teq quote, 'foo\\n\\t\\tand bar!'\n\t\ttestsCount++\n\nand finally, how did we do?\n\n\ttest \"all tabbed literate CoffeeScript tests executed\", ->\n\t\teq testsCount, 9\n"
  },
  {
    "path": "test/location.coffee",
    "content": "testScript = '''\nif true\n  x = 6\n  console.log \"A console #{x + 7} log\"\n\nfoo = \"bar\"\nz = /// ^ (a#{foo}) ///\n\nx = () ->\n    try\n        console.log \"foo\"\n    catch err\n        # Rewriter will generate explicit indentation here.\n\n    return null\n'''\n\ntest \"Verify location of generated tokens\", ->\n  tokens = CoffeeScript.tokens \"a = 79\"\n\n  eq tokens.length, 4\n  [aToken, equalsToken, numberToken] = tokens\n\n  eq aToken[2].first_line, 0\n  eq aToken[2].first_column, 0\n  eq aToken[2].last_line, 0\n  eq aToken[2].last_column, 0\n\n  eq equalsToken[2].first_line, 0\n  eq equalsToken[2].first_column, 2\n  eq equalsToken[2].last_line, 0\n  eq equalsToken[2].last_column, 2\n\n  eq numberToken[2].first_line, 0\n  eq numberToken[2].first_column, 4\n  eq numberToken[2].last_line, 0\n  eq numberToken[2].last_column, 5\n\ntest \"Verify location of generated tokens (with indented first line)\", ->\n  tokens = CoffeeScript.tokens \"  a = 83\"\n\n  eq tokens.length, 4\n  [aToken, equalsToken, numberToken] = tokens\n\n  eq aToken[2].first_line, 0\n  eq aToken[2].first_column, 2\n  eq aToken[2].last_line, 0\n  eq aToken[2].last_column, 2\n  eq aToken[2].range[0], 2\n  eq aToken[2].range[1], 3\n\n  eq equalsToken[2].first_line, 0\n  eq equalsToken[2].first_column, 4\n  eq equalsToken[2].last_line, 0\n  eq equalsToken[2].last_column, 4\n\n  eq numberToken[2].first_line, 0\n  eq numberToken[2].first_column, 6\n  eq numberToken[2].last_line, 0\n  eq numberToken[2].last_column, 7\n\ngetMatchingTokens = (str, wantedTokens...) ->\n  tokens = CoffeeScript.tokens str\n  matchingTokens = []\n  i = 0\n  for token in tokens\n    if token[1].replace(/^'|'$/g, '\"') is wantedTokens[i]\n      i++\n      matchingTokens.push token\n  eq wantedTokens.length, matchingTokens.length\n  matchingTokens\n\ntest 'Verify locations in string interpolation (in \"string\")', ->\n  [a, b, c] = getMatchingTokens '\"a#{b}c\"', '\"a\"', 'b', '\"c\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 1\n  eq a[2].last_line, 0\n  eq a[2].last_column, 1\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 4\n  eq b[2].last_line, 0\n  eq b[2].last_column, 4\n\n  eq c[2].first_line, 0\n  eq c[2].first_column, 6\n  eq c[2].last_line, 0\n  eq c[2].last_column, 6\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation)', ->\n  [a, b, c] = getMatchingTokens '\"#{a}b#{c}\"', 'a', '\"b\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 0\n  eq a[2].last_column, 3\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 5\n  eq b[2].last_line, 0\n  eq b[2].last_column, 5\n\n  eq c[2].first_line, 0\n  eq c[2].first_column, 8\n  eq c[2].last_line, 0\n  eq c[2].last_column, 8\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation and line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"#{a}\\nb\\n#{c}\"', 'a', '\"\\nb\\n\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 0\n  eq a[2].last_column, 3\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 5\n  eq b[2].last_line, 1\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 2\n  eq c[2].first_column, 2\n  eq c[2].last_line, 2\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\\n#{a}\\nb\\n#{c}\"', 'a', '\"\\nb\\n\"', 'c'\n\n  eq a[2].first_line, 1\n  eq a[2].first_column, 2\n  eq a[2].last_line, 1\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 1\n  eq b[2].first_column, 4\n  eq b[2].last_line, 2\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 3\n  eq c[2].first_column, 2\n  eq c[2].last_line, 3\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\\n\\n#{a}\\n\\nb\\n\\n#{c}\"', 'a', '\"\\n\\nb\\n\\n\"', 'c'\n\n  eq a[2].first_line, 2\n  eq a[2].first_column, 2\n  eq a[2].last_line, 2\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 2\n  eq b[2].first_column, 4\n  eq b[2].last_line, 5\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 6\n  eq c[2].first_column, 2\n  eq c[2].last_line, 6\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"string\", multiple interpolation and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\\n\\n\\n#{a}\\n\\n\\nb\\n\\n\\n#{c}\"', 'a', '\"\\n\\n\\nb\\n\\n\\n\"', 'c'\n\n  eq a[2].first_line, 3\n  eq a[2].first_column, 2\n  eq a[2].last_line, 3\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 3\n  eq b[2].first_column, 4\n  eq b[2].last_line, 8\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 9\n  eq c[2].first_column, 2\n  eq c[2].last_line, 9\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"a\\n#{b}\\nc\"\"\"', '\"a\\n\"', 'b', '\"\\nc\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 0\n  eq a[2].last_column, 4\n\n  eq b[2].first_line, 1\n  eq b[2].first_column, 2\n  eq b[2].last_line, 1\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 1\n  eq c[2].first_column, 4\n  eq c[2].last_line, 2\n  eq c[2].last_column, 0\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", starting with a line break)', ->\n  [b, c] = getMatchingTokens '\"\"\"\\n#{b}\\nc\"\"\"', 'b', '\"\\nc\"'\n\n  eq b[2].first_line, 1\n  eq b[2].first_column, 2\n  eq b[2].last_line, 1\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 1\n  eq c[2].first_column, 4\n  eq c[2].last_line, 2\n  eq c[2].last_column, 0\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"\\n\\n#{b}\\nc\"\"\"', '\"\\n\\n\"', 'b', '\"\\nc\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 1\n  eq a[2].last_column, 0\n\n  eq b[2].first_line, 2\n  eq b[2].first_column, 2\n  eq b[2].last_line, 2\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 2\n  eq c[2].first_column, 4\n  eq c[2].last_line, 3\n  eq c[2].last_column, 0\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", multiple interpolation)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"#{a}\\nb\\n#{c}\"\"\"', 'a', '\"\\nb\\n\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 5\n  eq a[2].last_line, 0\n  eq a[2].last_column, 5\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 7\n  eq b[2].last_line, 1\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 2\n  eq c[2].first_column, 2\n  eq c[2].last_line, 2\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", multiple interpolation, and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"\\n\\n#{a}\\n\\nb\\n\\n#{c}\"\"\"', 'a', '\"\\n\\nb\\n\\n\"', 'c'\n\n  eq a[2].first_line, 2\n  eq a[2].first_column, 2\n  eq a[2].last_line, 2\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 2\n  eq b[2].first_column, 4\n  eq b[2].last_line, 5\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 6\n  eq c[2].first_column, 2\n  eq c[2].last_line, 6\n  eq c[2].last_column, 2\n\ntest 'Verify locations in string interpolation (in \"\"\"string\"\"\", multiple interpolation, and starting with line breaks)', ->\n  [a, b, c] = getMatchingTokens '\"\"\"\\n\\n\\n#{a}\\n\\n\\nb\\n\\n\\n#{c}\"\"\"', 'a', '\"\\n\\n\\nb\\n\\n\\n\"', 'c'\n\n  eq a[2].first_line, 3\n  eq a[2].first_column, 2\n  eq a[2].last_line, 3\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 3\n  eq b[2].first_column, 4\n  eq b[2].last_line, 8\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 9\n  eq c[2].first_column, 2\n  eq c[2].last_line, 9\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation)', ->\n  [a, b, c] = getMatchingTokens '///#{a}b#{c}///', 'a', '\"b\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 5\n  eq a[2].last_line, 0\n  eq a[2].last_column, 5\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 7\n  eq b[2].last_line, 0\n  eq b[2].last_column, 7\n\n  eq c[2].first_line, 0\n  eq c[2].first_column, 10\n  eq c[2].last_line, 0\n  eq c[2].last_column, 10\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation)', ->\n  [a, b, c] = getMatchingTokens '///a#{b}c///', '\"a\"', 'b', '\"c\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 0\n  eq a[2].last_column, 3\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 6\n  eq b[2].last_line, 0\n  eq b[2].last_column, 6\n\n  eq c[2].first_line, 0\n  eq c[2].first_column, 8\n  eq c[2].last_line, 0\n  eq c[2].last_column, 8\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks)', ->\n  [a, b, c] = getMatchingTokens '///#{a}\\nb\\n#{c}///', 'a', '\"\\nb\\n\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 5\n  eq a[2].last_line, 0\n  eq a[2].last_column, 5\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 7\n  eq b[2].last_line, 1\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 2\n  eq c[2].first_column, 2\n  eq c[2].last_line, 2\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks)', ->\n  [a, b, c] = getMatchingTokens '///#{a}\\n\\n\\nb\\n\\n\\n#{c}///', 'a', '\"\\n\\n\\nb\\n\\n\\n\"', 'c'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 5\n  eq a[2].last_line, 0\n  eq a[2].last_column, 5\n\n  eq b[2].first_line, 0\n  eq b[2].first_column, 7\n  eq b[2].last_line, 5\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 6\n  eq c[2].first_column, 2\n  eq c[2].last_line, 6\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks)', ->\n  [a, b, c] = getMatchingTokens '///a\\n\\n\\n#{b}\\n\\n\\nc///', '\"a\\n\\n\\n\"', 'b', '\"\\n\\n\\nc\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 2\n  eq a[2].last_column, 0\n\n  eq b[2].first_line, 3\n  eq b[2].first_column, 2\n  eq b[2].last_line, 3\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 3\n  eq c[2].first_column, 4\n  eq c[2].last_line, 6\n  eq c[2].last_column, 0\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks and starting with linebreak)', ->\n  [a, b, c] = getMatchingTokens '///\\n#{a}\\nb\\n#{c}///', 'a', '\"\\nb\\n\"', 'c'\n\n  eq a[2].first_line, 1\n  eq a[2].first_column, 2\n  eq a[2].last_line, 1\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 1\n  eq b[2].first_column, 4\n  eq b[2].last_line, 2\n  eq b[2].last_column, 1\n\n  eq c[2].first_line, 3\n  eq c[2].first_column, 2\n  eq c[2].last_line, 3\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks and starting with linebreak)', ->\n  [a, b, c] = getMatchingTokens '///\\n\\n\\n#{a}\\n\\n\\nb\\n\\n\\n#{c}///', 'a', '\"\\n\\n\\nb\\n\\n\\n\"', 'c'\n\n  eq a[2].first_line, 3\n  eq a[2].first_column, 2\n  eq a[2].last_line, 3\n  eq a[2].last_column, 2\n\n  eq b[2].first_line, 3\n  eq b[2].first_column, 4\n  eq b[2].last_line, 8\n  eq b[2].last_column, 0\n\n  eq c[2].first_line, 9\n  eq c[2].first_column, 2\n  eq c[2].last_line, 9\n  eq c[2].last_column, 2\n\ntest 'Verify locations in heregex interpolation (in ///regex///, multiple interpolation and line breaks and starting with linebreak)', ->\n  [a, b, c] = getMatchingTokens '///\\n\\n\\na\\n\\n\\n#{b}\\n\\n\\nc///', '\"\\n\\n\\na\\n\\n\\n\"', 'b', '\"\\n\\n\\nc\"'\n\n  eq a[2].first_line, 0\n  eq a[2].first_column, 3\n  eq a[2].last_line, 5\n  eq a[2].last_column, 0\n\n  eq b[2].first_line, 6\n  eq b[2].first_column, 2\n  eq b[2].last_line, 6\n  eq b[2].last_column, 2\n\n  eq c[2].first_line, 6\n  eq c[2].first_column, 4\n  eq c[2].last_line, 9\n  eq c[2].last_column, 0\n\ntest \"#3822: Simple string/regex start/end should include delimiters\", ->\n  [stringToken] = CoffeeScript.tokens \"'string'\"\n  eq stringToken[2].first_line, 0\n  eq stringToken[2].first_column, 0\n  eq stringToken[2].last_line, 0\n  eq stringToken[2].last_column, 7\n\n  [regexToken] = CoffeeScript.tokens \"/regex/\"\n  eq regexToken[2].first_line, 0\n  eq regexToken[2].first_column, 0\n  eq regexToken[2].last_line, 0\n  eq regexToken[2].last_column, 6\n\ntest \"#3621: Multiline regex and manual `Regex` call with interpolation should\n      result in the same tokens\", ->\n  tokensA = CoffeeScript.tokens '(RegExp(\".*#{a}[0-9]\"))'\n  tokensB = CoffeeScript.tokens '///.*#{a}[0-9]///'\n  eq tokensA.length, tokensB.length\n  for i in [0...tokensA.length] by 1\n    tokenA = tokensA[i]\n    tokenB = tokensB[i]\n    eq tokenA[0], tokenB[0] unless tokenB[0] in ['REGEX_START', 'REGEX_END']\n    eq \"#{tokenA[1]}\", \"#{tokenB[1]}\"\n    unless tokenA[0] is 'STRING_START' or tokenB[0] is 'REGEX_START'\n      eq tokenA.origin?[1], tokenB.origin?[1]\n    eq tokenA.stringEnd, tokenB.stringEnd\n\ntest \"Verify tokens have locations that are in order\", ->\n  source = '''\n    a {\n      b: ->\n        return c d,\n          if e\n            f\n    }\n    g\n  '''\n  tokens = CoffeeScript.tokens source\n  lastToken = null\n  for token in tokens\n    if lastToken\n      ok token[2].first_line >= lastToken[2].last_line\n      if token[2].first_line == lastToken[2].last_line\n        ok token[2].first_column >= lastToken[2].last_column\n    lastToken = token\n\ntest \"Verify OUTDENT tokens are located at the end of the previous token\", ->\n  source = '''\n    SomeArr = [ ->\n      if something\n        lol =\n          count: 500\n    ]\n  '''\n  tokens = CoffeeScript.tokens source\n  [..., number, curly, outdent1, outdent2, outdent3, bracket, terminator] = tokens\n  eq number[0], 'NUMBER'\n  for outdent in [outdent1, outdent2, outdent3]\n    eq outdent[0], 'OUTDENT'\n    eq outdent[2].first_line, number[2].last_line\n    eq outdent[2].first_column, number[2].last_column\n    eq outdent[2].last_line, number[2].last_line\n    eq outdent[2].last_column, number[2].last_column\n\ntest \"Verify OUTDENT and CALL_END tokens are located at the end of the previous token\", ->\n  source = '''\n    a = b {\n      c: ->\n        d e,\n          if f\n            g {},\n              if h\n                i {}\n    }\n  '''\n  tokens = CoffeeScript.tokens source\n  [..., closeCurly1, callEnd1, outdent1, outdent2, callEnd2, outdent3, outdent4,\n    callEnd3, outdent5, outdent6, closeCurly2, callEnd4, terminator] = tokens\n  eq closeCurly1[0], '}'\n  assertAtCloseCurly = (token) ->\n    eq token[2].first_line, closeCurly1[2].last_line\n    eq token[2].first_column, closeCurly1[2].last_column\n    eq token[2].last_line, closeCurly1[2].last_line\n    eq token[2].last_column, closeCurly1[2].last_column\n\n  for token in [outdent1, outdent2, outdent3, outdent4, outdent5, outdent6]\n    eq token[0], 'OUTDENT'\n    assertAtCloseCurly(token)\n  for token in [callEnd1, callEnd2, callEnd3]\n    eq token[0], 'CALL_END'\n    assertAtCloseCurly(token)\n\ntest \"Verify generated } tokens are located at the end of the previous token\", ->\n  source = '''\n    a(b, ->\n      c: () ->\n        if d\n          e\n    )\n  '''\n  tokens = CoffeeScript.tokens source\n  [..., identifier, outdent1, outdent2, closeCurly, outdent3, callEnd,\n    terminator] = tokens\n  eq identifier[0], 'IDENTIFIER'\n  assertAtIdentifier = (token) ->\n    eq token[2].first_line, identifier[2].last_line\n    eq token[2].first_column, identifier[2].last_column\n    eq token[2].last_line, identifier[2].last_line\n    eq token[2].last_column, identifier[2].last_column\n\n  for token in [outdent1, outdent2, closeCurly, outdent3]\n    assertAtIdentifier(token)\n\ntest \"Verify real CALL_END tokens have the right position\", ->\n  source = '''\n    a()\n  '''\n  tokens = CoffeeScript.tokens source\n  [identifier, callStart, callEnd, terminator] = tokens\n  startIndex = identifier[2].first_column\n  eq identifier[2].last_column, startIndex\n  eq callStart[2].first_column, startIndex + 1\n  eq callStart[2].last_column, startIndex + 1\n  eq callEnd[2].first_column, startIndex + 2\n  eq callEnd[2].last_column, startIndex + 2\n\ntest \"Verify normal heredocs have the right position\", ->\n  source = '''\n    \"\"\"\n    a\"\"\"\n  '''\n  [stringToken] = CoffeeScript.tokens source\n  eq stringToken[2].first_line, 0\n  eq stringToken[2].first_column, 0\n  eq stringToken[2].last_line, 1\n  eq stringToken[2].last_column, 3\n\ntest \"Verify heredocs ending with a newline have the right position\", ->\n  source = '''\n    \"\"\"\n    a\n    \"\"\"\n  '''\n  [stringToken] = CoffeeScript.tokens source\n  eq stringToken[2].first_line, 0\n  eq stringToken[2].first_column, 0\n  eq stringToken[2].last_line, 2\n  eq stringToken[2].last_column, 2\n\ntest \"Verify indented heredocs have the right position\", ->\n  source = '''\n    ->\n      \"\"\"\n        a\n      \"\"\"\n  '''\n  [arrow, indent, stringToken] = CoffeeScript.tokens source\n  eq stringToken[2].first_line, 1\n  eq stringToken[2].first_column, 2\n  eq stringToken[2].last_line, 3\n  eq stringToken[2].last_column, 4\n\ntest \"Verify heregexes with interpolations have the right ending position\", ->\n  source = '''\n    [a ///#{b}///g]\n  '''\n  [..., stringEnd, comma, flagsString, regexCallEnd, regexEnd, fnCallEnd,\n    arrayEnd, terminator] = CoffeeScript.tokens source\n\n  eq comma[0], ','\n  eq arrayEnd[0], ']'\n\n  assertColumn = (token, column, width = 0) ->\n    eq token[2].first_line, 0\n    eq token[2].first_column, column\n    eq token[2].last_line, 0\n    eq token[2].last_column, column\n    eq token[2].last_column_exclusive, column + width\n\n  arrayEndColumn = arrayEnd[2].first_column\n  for token in [comma]\n    assertColumn token, arrayEndColumn - 2\n  for token in [flagsString, regexCallEnd]\n    assertColumn token, arrayEndColumn - 1, 1\n  for token in [regexEnd, fnCallEnd]\n    assertColumn token, arrayEndColumn\n  assertColumn arrayEnd, arrayEndColumn, 1\n\ntest \"Verify all tokens get a location\", ->\n  doesNotThrow ->\n    tokens = CoffeeScript.tokens testScript\n    for token in tokens\n        ok !!token[2]\n\ntest 'Values with properties end up with a location that includes the properties', ->\n  source = '''\n    a.b\n    a.b.c\n    a['b']\n    a[b.c()].d\n  '''\n  {body: block} = CoffeeScript.nodes source\n  [\n    singleProperty\n    twoProperties\n    indexed\n    complexIndex\n  ] = block.expressions\n\n  eq singleProperty.locationData.first_line, 0\n  eq singleProperty.locationData.first_column, 0\n  eq singleProperty.locationData.last_line, 0\n  eq singleProperty.locationData.last_column, 2\n\n  eq twoProperties.locationData.first_line, 1\n  eq twoProperties.locationData.first_column, 0\n  eq twoProperties.locationData.last_line, 1\n  eq twoProperties.locationData.last_column, 4\n\n  eq indexed.locationData.first_line, 2\n  eq indexed.locationData.first_column, 0\n  eq indexed.locationData.last_line, 2\n  eq indexed.locationData.last_column, 5\n\n  eq complexIndex.locationData.first_line, 3\n  eq complexIndex.locationData.first_column, 0\n  eq complexIndex.locationData.last_line, 3\n  eq complexIndex.locationData.last_column, 9\n\ntest 'StringWithInterpolations::fromStringLiteral() assigns correct location to tagged template literal', ->\n  checkLocationData = (source, {stringWithInterpolationsLocationData, stringLocationData}) ->\n    {body: block} = CoffeeScript.nodes source\n    taggedTemplateLiteral = block.expressions[0].unwrap()\n    {args: [stringWithInterpolations]} = taggedTemplateLiteral\n    {body} = stringWithInterpolations\n    {expressions: [stringValue]} = body\n    string = stringValue.unwrap()\n\n    for field in ['first_line', 'first_column', 'last_line', 'last_column', 'last_line_exclusive', 'last_column_exclusive']\n      eq stringWithInterpolations.locationData[field], stringWithInterpolationsLocationData[field]\n      eq stringValue.locationData[field], stringLocationData[field]\n      eq string.locationData[field], stringLocationData[field]\n\n  checkLocationData 'a\"b\"',\n    stringWithInterpolationsLocationData:\n      first_line: 0\n      first_column: 1\n      last_line: 0\n      last_column: 3\n      last_line_exclusive: 0\n      last_column_exclusive: 4\n    stringLocationData:\n      first_line: 0\n      first_column: 2\n      last_line: 0\n      last_column: 2\n      last_line_exclusive: 0\n      last_column_exclusive: 3\n\n  checkLocationData '''\n    a\"\"\"\n      b\n    \"\"\"\n  ''',\n    stringWithInterpolationsLocationData:\n      first_line: 0\n      first_column: 1\n      last_line: 2\n      last_column: 2\n      last_line_exclusive: 2\n      last_column_exclusive: 3\n    stringLocationData:\n      first_line: 0\n      first_column: 4\n      last_line: 1\n      last_column: 3\n      last_line_exclusive: 2\n      last_column_exclusive: 0\n\n  checkLocationData '''\n    a\"\"\"b\n    \"\"\"\n  ''',\n    stringWithInterpolationsLocationData:\n      first_line: 0\n      first_column: 1\n      last_line: 1\n      last_column: 2\n      last_line_exclusive: 1\n      last_column_exclusive: 3\n    stringLocationData:\n      first_line: 0\n      first_column: 4\n      last_line: 0\n      last_column: 5\n      last_line_exclusive: 1\n      last_column_exclusive: 0\n\ntest \"Verify compound assignment operators have the right position\", ->\n  source = '''\n    a or= b\n  '''\n  [a, operatorToken] = CoffeeScript.tokens source\n  eq operatorToken[2].first_line, 0\n  eq operatorToken[2].first_column, 2\n  eq operatorToken[2].last_line, 0\n  eq operatorToken[2].last_column, 4\n  eq operatorToken[2].last_column_exclusive, 5\n  eq operatorToken[2].range[0], 2\n  eq operatorToken[2].range[1], 5\n\n  source = '''\n    a and= b\n  '''\n  [a, operatorToken] = CoffeeScript.tokens source\n  eq operatorToken[2].first_line, 0\n  eq operatorToken[2].first_column, 2\n  eq operatorToken[2].last_line, 0\n  eq operatorToken[2].last_column, 5\n  eq operatorToken[2].last_column_exclusive, 6\n  eq operatorToken[2].range[0], 2\n  eq operatorToken[2].range[1], 6\n\ntest \"Verify BOM is accounted for in location data\", ->\n  source = '''\n    \\ufeffa\n    b\n  '''\n  [aToken, terminator, bToken] = CoffeeScript.tokens source\n  eq aToken[2].first_line, 0\n  eq aToken[2].first_column, 1\n  eq aToken[2].last_line, 0\n  eq aToken[2].last_column, 1\n  eq aToken[2].last_column_exclusive, 2\n  eq aToken[2].range[0], 1\n  eq aToken[2].range[1], 2\n  eq bToken[2].first_line, 1\n  eq bToken[2].first_column, 0\n  eq bToken[2].last_line, 1\n  eq bToken[2].last_column, 0\n  eq bToken[2].last_column_exclusive, 1\n  eq bToken[2].range[0], 3\n  eq bToken[2].range[1], 4\n\ntest \"Verify carriage returns are accounted for in location data\", ->\n  source = '''\n    a\\r+\n    b\\r\\r- c\n  '''\n  [aToken, plusToken, bToken, minusToken] = CoffeeScript.tokens source\n  eq aToken[2].first_line, 0\n  eq aToken[2].first_column, 0\n  eq aToken[2].last_line, 0\n  eq aToken[2].last_column, 0\n  eq aToken[2].last_column_exclusive, 1\n  eq aToken[2].range[0], 0\n  eq aToken[2].range[1], 1\n  eq plusToken[2].first_line, 0\n  eq plusToken[2].first_column, 2\n  eq plusToken[2].last_line, 0\n  eq plusToken[2].last_column, 2\n  eq plusToken[2].last_column_exclusive, 3\n  eq plusToken[2].range[0], 2\n  eq plusToken[2].range[1], 3\n  eq bToken[2].first_line, 1\n  eq bToken[2].first_column, 0\n  eq bToken[2].last_line, 1\n  eq bToken[2].last_column, 0\n  eq bToken[2].last_column_exclusive, 1\n  eq bToken[2].range[0], 4\n  eq bToken[2].range[1], 5\n  eq minusToken[2].first_line, 1\n  eq minusToken[2].first_column, 3\n  eq minusToken[2].last_line, 1\n  eq minusToken[2].last_column, 3\n  eq minusToken[2].last_column_exclusive, 4\n  eq minusToken[2].range[0], 7\n  eq minusToken[2].range[1], 8\n\ntest \"Verify object colon location data\", ->\n  source = '''\n    a : b\n  '''\n  [implicitBraceToken, aToken, colonToken] = CoffeeScript.tokens source\n  eq colonToken[2].first_line, 0\n  eq colonToken[2].first_column, 2\n  eq colonToken[2].last_line, 0\n  eq colonToken[2].last_column, 2\n  eq colonToken[2].last_column_exclusive, 3\n  eq colonToken[2].range[0], 2\n  eq colonToken[2].range[1], 3\n"
  },
  {
    "path": "test/modules.coffee",
    "content": "# Modules, a.k.a. ES2015 import/export\n# ------------------------------------\n#\n# Remember, we’re not *resolving* modules, just outputting valid ES2015 syntax.\n\n\n# This is the CoffeeScript import and export syntax, closely modeled after the ES2015 syntax\n# https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import\n# https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export\n\n# import \"module-name\"\n# import defaultMember from \"module-name\"\n# import * as name from \"module-name\"\n# import { } from \"module-name\"\n# import { member } from \"module-name\"\n# import { member as alias } from \"module-name\"\n# import { member1, member2 as alias2, … } from \"module-name\"\n# import defaultMember, * as name from \"module-name\"\n# import defaultMember, { … } from \"module-name\"\n\n# export default expression\n# export class name\n# export { }\n# export { name }\n# export { name as exportedName }\n# export { name as default }\n# export { name1, name2 as exportedName2, name3 as default, … }\n#\n# export * from \"module-name\"\n# export { … } from \"module-name\"\n#\n# As a subsitute for `export var name = …` and `export function name {}`,\n# CoffeeScript also supports:\n# export name = …\n\n# CoffeeScript also supports optional commas within `{ … }`.\n\n\n# Import statements\n\ntest \"backticked import statement\", ->\n  eqJS \"\"\"\n    if Meteor.isServer\n      `import { foo, bar as baz } from 'lib'`\"\"\",\n  \"\"\"\n    if (Meteor.isServer) {\n      import { foo, bar as baz } from 'lib';\n    }\"\"\"\n\ntest \"import an entire module for side effects only, without importing any bindings\", ->\n  eqJS \"import 'lib'\",\n  \"import 'lib';\"\n\ntest \"import default member from module, adding the member to the current scope\", ->\n  eqJS \"\"\"\n    import foo from 'lib'\n    foo.fooMethod()\"\"\",\n  \"\"\"\n    import foo from 'lib';\n\n    foo.fooMethod();\"\"\"\n\ntest \"import an entire module's contents as an alias, adding the alias to the current scope\", ->\n  eqJS \"\"\"\n    import * as foo from 'lib'\n    foo.fooMethod()\"\"\",\n  \"\"\"\n    import * as foo from 'lib';\n\n    foo.fooMethod();\"\"\"\n\ntest \"import empty object\", ->\n  eqJS \"import { } from 'lib'\",\n  \"import {} from 'lib';\"\n\ntest \"import empty object\", ->\n  eqJS \"import {} from 'lib'\",\n  \"import {} from 'lib';\"\n\ntest \"import a single member of a module, adding the member to the current scope\", ->\n  eqJS \"\"\"\n    import { foo } from 'lib'\n    foo.fooMethod()\"\"\",\n  \"\"\"\n    import {\n      foo\n    } from 'lib';\n\n    foo.fooMethod();\"\"\"\n\ntest \"import a single member of a module as an alias, adding the alias to the current scope\", ->\n  eqJS \"\"\"\n    import { foo as bar } from 'lib'\n    bar.barMethod()\"\"\",\n  \"\"\"\n    import {\n      foo as bar\n    } from 'lib';\n\n    bar.barMethod();\"\"\"\n\ntest \"import multiple members of a module, adding the members to the current scope\", ->\n  eqJS \"\"\"\n    import { foo, bar } from 'lib'\n    foo.fooMethod()\n    bar.barMethod()\"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar\n    } from 'lib';\n\n    foo.fooMethod();\n\n    bar.barMethod();\"\"\"\n\ntest \"import multiple members of a module where some are aliased, adding the members or aliases to the current scope\", ->\n  eqJS \"\"\"\n    import { foo, bar as baz } from 'lib'\n    foo.fooMethod()\n    baz.bazMethod()\"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib';\n\n    foo.fooMethod();\n\n    baz.bazMethod();\"\"\"\n\ntest \"import default member and other members of a module, adding the members to the current scope\", ->\n  eqJS \"\"\"\n    import foo, { bar, baz as qux } from 'lib'\n    foo.fooMethod()\n    bar.barMethod()\n    qux.quxMethod()\"\"\",\n  \"\"\"\n    import foo, {\n      bar,\n      baz as qux\n    } from 'lib';\n\n    foo.fooMethod();\n\n    bar.barMethod();\n\n    qux.quxMethod();\"\"\"\n\ntest \"import default member from a module as well as the entire module's contents as an alias, adding the member and alias to the current scope\", ->\n  eqJS \"\"\"\n    import foo, * as bar from 'lib'\n    foo.fooMethod()\n    bar.barMethod()\"\"\",\n  \"\"\"\n    import foo, * as bar from 'lib';\n\n    foo.fooMethod();\n\n    bar.barMethod();\"\"\"\n\ntest \"multiline simple import\", ->\n  eqJS \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib'\"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib';\"\"\"\n\ntest \"multiline complex import\", ->\n  eqJS \"\"\"\n    import foo, {\n      bar,\n      baz as qux\n    } from 'lib'\"\"\",\n  \"\"\"\n    import foo, {\n      bar,\n      baz as qux\n    } from 'lib';\"\"\"\n\ntest \"import with optional commas\", ->\n  eqJS \"import { foo, bar, } from 'lib'\",\n  \"\"\"\n    import {\n      foo,\n      bar\n    } from 'lib';\"\"\"\n\ntest \"multiline import without commas\", ->\n  eqJS \"\"\"\n    import {\n      foo\n      bar\n    } from 'lib'\"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar\n    } from 'lib';\"\"\"\n\ntest \"multiline import with optional commas\", ->\n  eqJS \"\"\"\n    import {\n      foo,\n      bar,\n    } from 'lib'\"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar\n    } from 'lib';\"\"\"\n\ntest \"a variable can be assigned after an import\", ->\n  eqJS \"\"\"\n    import { foo } from 'lib'\n    bar = 5\"\"\",\n  \"\"\"\n    var bar;\n\n    import {\n      foo\n    } from 'lib';\n\n    bar = 5;\"\"\"\n\ntest \"variables can be assigned before and after an import\", ->\n  eqJS \"\"\"\n    foo = 5\n    import { bar } from 'lib'\n    baz = 7\"\"\",\n  \"\"\"\n    var baz, foo;\n\n    foo = 5;\n\n    import {\n      bar\n    } from 'lib';\n\n    baz = 7;\"\"\"\n\n# Export statements\n\ntest \"export empty object\", ->\n  eqJS \"export { }\",\n  \"export {};\"\n\ntest \"export empty object\", ->\n  eqJS \"export {}\",\n  \"export {};\"\n\ntest \"export named members within an object\", ->\n  eqJS \"export { foo, bar }\",\n  \"\"\"\n    export {\n      foo,\n      bar\n    };\"\"\"\n\ntest \"export named members as aliases, within an object\", ->\n  eqJS \"export { foo as bar, baz as qux }\",\n  \"\"\"\n    export {\n      foo as bar,\n      baz as qux\n    };\"\"\"\n\ntest \"export named members within an object, with an optional comma\", ->\n  eqJS \"export { foo, bar, }\",\n  \"\"\"\n    export {\n      foo,\n      bar\n    };\"\"\"\n\ntest \"multiline export named members within an object\", ->\n  eqJS \"\"\"\n    export {\n      foo,\n      bar\n    }\"\"\",\n  \"\"\"\n    export {\n      foo,\n      bar\n    };\"\"\"\n\ntest \"multiline export named members within an object, with an optional comma\", ->\n  eqJS \"\"\"\n    export {\n      foo,\n      bar,\n    }\"\"\",\n  \"\"\"\n    export {\n      foo,\n      bar\n    };\"\"\"\n\ntest \"export default string\", ->\n  eqJS \"export default 'foo'\",\n  \"export default 'foo';\"\n\ntest \"export default number\", ->\n  eqJS \"export default 5\",\n  \"export default 5;\"\n\ntest \"export default object\", ->\n  eqJS \"export default { foo: 'bar', baz: 'qux' }\",\n  \"\"\"\n    export default {\n      foo: 'bar',\n      baz: 'qux'\n    };\"\"\"\n\ntest \"export default implicit object\", ->\n  eqJS \"export default foo: 'bar', baz: 'qux'\",\n  \"\"\"\n    export default {\n      foo: 'bar',\n      baz: 'qux'\n    };\"\"\"\n\ntest \"export default multiline implicit object\", ->\n  eqJS \"\"\"\n    export default\n      foo: 'bar'\n      baz: 'qux'\n    \"\"\",\n  \"\"\"\n    export default {\n      foo: 'bar',\n      baz: 'qux'\n    };\"\"\"\n\ntest \"export default multiline implicit object with internal braces\", ->\n  eqJS \"\"\"\n    export default\n      foo: yes\n      bar: {\n        baz\n      }\n      quz: no\n    \"\"\",\n  \"\"\"\n    export default {\n      foo: true,\n      bar: {baz},\n      quz: false\n    };\"\"\"\n\ntest \"export default assignment expression\", ->\n  eqJS \"export default foo = 'bar'\",\n  \"\"\"\n    var foo;\n\n    export default foo = 'bar';\"\"\"\n\ntest \"export assignment expression\", ->\n  eqJS \"export foo = 'bar'\",\n  \"export var foo = 'bar';\"\n\ntest \"export multiline assignment expression\", ->\n  eqJS \"\"\"\n    export foo =\n    'bar'\"\"\",\n    \"export var foo = 'bar';\"\n\ntest \"export multiline indented assignment expression\", ->\n  eqJS \"\"\"\n    export foo =\n      'bar'\"\"\",\n      \"export var foo = 'bar';\"\n\ntest \"export default function\", ->\n  eqJS \"export default ->\",\n  \"export default function() {};\"\n\ntest \"export default multiline function\", ->\n  eqJS \"\"\"\n    export default (foo) ->\n      console.log foo\"\"\",\n    \"\"\"\n    export default function(foo) {\n      return console.log(foo);\n    };\"\"\"\n\ntest \"export assignment function\", ->\n  eqJS \"\"\"\n    export foo = (bar) ->\n      console.log bar\"\"\",\n    \"\"\"\n    export var foo = function(bar) {\n      return console.log(bar);\n    };\"\"\"\n\ntest \"export assignment function which contains assignments in its body\", ->\n  eqJS \"\"\"\n    export foo = (bar) ->\n      baz = '!'\n      console.log bar + baz\"\"\",\n    \"\"\"\n    export var foo = function(bar) {\n      var baz;\n      baz = '!';\n      return console.log(bar + baz);\n    };\"\"\"\n\ntest \"export default predefined function\", ->\n  eqJS \"\"\"\n    foo = (bar) ->\n      console.log bar\n    export default foo\"\"\",\n  \"\"\"\n    var foo;\n\n    foo = function(bar) {\n      return console.log(bar);\n    };\n\n    export default foo;\"\"\"\n\ntest \"export default class\", ->\n  eqJS \"\"\"\n    export default class foo extends bar\n      baz: ->\n        console.log 'hello, world!'\"\"\",\n      \"\"\"\n    var foo;\n\n    export default foo = class foo extends bar {\n      baz() {\n        return console.log('hello, world!');\n      }\n\n    };\"\"\"\n\ntest \"export class\", ->\n  eqJS \"\"\"\n    export class foo\n      baz: ->\n        console.log 'hello, world!'\"\"\",\n      \"\"\"\n    export var foo = class foo {\n      baz() {\n        return console.log('hello, world!');\n      }\n\n    };\"\"\"\n\ntest \"export class that extends\", ->\n  eqJS \"\"\"\n    export class foo extends bar\n      baz: ->\n        console.log 'hello, world!'\"\"\",\n      \"\"\"\n    export var foo = class foo extends bar {\n      baz() {\n        return console.log('hello, world!');\n      }\n\n    };\"\"\"\n\ntest \"export default class that extends\", ->\n  eqJS \"\"\"\n    export default class foo extends bar\n      baz: ->\n        console.log 'hello, world!'\"\"\",\n      \"\"\"\n    var foo;\n\n    export default foo = class foo extends bar {\n      baz() {\n        return console.log('hello, world!');\n      }\n\n    };\"\"\"\n\ntest \"export default named member, within an object\", ->\n  eqJS \"export { foo as default, bar }\",\n  \"\"\"\n    export {\n      foo as default,\n      bar\n    };\"\"\"\n\n# Import and export in the same statement\n\ntest \"export an entire module's contents\", ->\n  eqJS \"export * from 'lib'\",\n  \"export * from 'lib';\"\n\ntest \"export members imported from another module\", ->\n  eqJS \"export { foo, bar } from 'lib'\",\n  \"\"\"\n    export {\n      foo,\n      bar\n    } from 'lib';\"\"\"\n\ntest \"export as aliases members imported from another module\", ->\n  eqJS \"export { foo as bar, baz as qux } from 'lib'\",\n  \"\"\"\n    export {\n      foo as bar,\n      baz as qux\n    } from 'lib';\"\"\"\n\ntest \"export list can contain CoffeeScript keywords\", ->\n  eqJS \"export { unless, and } from 'lib'\",\n  \"\"\"\n    export {\n      unless,\n      and\n    } from 'lib';\"\"\"\n\ntest \"export list can contain CoffeeScript keywords when aliasing\", ->\n  eqJS \"export { when as bar, baz as unless, and as foo, booze as not } from 'lib'\",\n  \"\"\"\n    export {\n      when as bar,\n      baz as unless,\n      and as foo,\n      booze as not\n    } from 'lib';\"\"\"\n\n\n# Edge cases\n\ntest \"multiline import with comments\", ->\n  eqJS \"\"\"\n    import {\n      foo, # Not as good as bar\n      bar as baz # I prefer qux\n    } from 'lib'\"\"\",\n  \"\"\"\n    import {\n      foo, // Not as good as bar\n      bar as baz // I prefer qux\n    } from 'lib';\"\"\"\n\ntest \"`from` not part of an import or export statement can still be assigned\", ->\n  from = 5\n  eq 5, from\n\ntest \"a variable named `from` can be assigned after an import\", ->\n  eqJS \"\"\"\n    import { foo } from 'lib'\n    from = 5\"\"\",\n  \"\"\"\n    var from;\n\n    import {\n      foo\n    } from 'lib';\n\n    from = 5;\"\"\"\n\ntest \"`from` can be assigned after a multiline import\", ->\n  eqJS \"\"\"\n    import {\n      foo\n    } from 'lib'\n    from = 5\"\"\",\n  \"\"\"\n    var from;\n\n    import {\n      foo\n    } from 'lib';\n\n    from = 5;\"\"\"\n\ntest \"`from` can be imported as a member name\", ->\n  eqJS \"import { from } from 'lib'\",\n  \"\"\"\n    import {\n      from\n    } from 'lib';\"\"\"\n\ntest \"`from` can be imported as a member name and aliased\", ->\n  eqJS \"import { from as foo } from 'lib'\",\n  \"\"\"\n    import {\n      from as foo\n    } from 'lib';\"\"\"\n\ntest \"`from` can be used as an alias name\", ->\n  eqJS \"import { foo as from } from 'lib'\",\n  \"\"\"\n    import {\n      foo as from\n    } from 'lib';\"\"\"\n\ntest \"`as` can be imported as a member name\", ->\n  eqJS \"import { as } from 'lib'\",\n  \"\"\"\n    import {\n      as\n    } from 'lib';\"\"\"\n\ntest \"`as` can be imported as a member name and aliased\", ->\n  eqJS \"import { as as foo } from 'lib'\",\n  \"\"\"\n    import {\n      as as foo\n    } from 'lib';\"\"\"\n\ntest \"`as` can be used as an alias name\", ->\n  eqJS \"import { foo as as } from 'lib'\",\n  \"\"\"\n    import {\n      foo as as\n    } from 'lib';\"\"\"\n\ntest \"CoffeeScript keywords can be used as imported names in import lists\", ->\n  eqJS \"\"\"\n    import { unless as bar, and as computedAnd } from 'lib'\n    bar.barMethod()\"\"\",\n  \"\"\"\n    import {\n      unless as bar,\n      and as computedAnd\n    } from 'lib';\n\n    bar.barMethod();\"\"\"\n\ntest \"`*` can be used in an expression on the same line as an export keyword\", ->\n  eqJS \"export foo = (x) -> x * x\",\n  \"\"\"\n    export var foo = function(x) {\n      return x * x;\n    };\"\"\"\n  eqJS \"export default foo = (x) -> x * x\",\n  \"\"\"\n    var foo;\n\n    export default foo = function(x) {\n      return x * x;\n    };\"\"\"\n\ntest \"`*` and `from` can be used in an export default expression\", ->\n  eqJS \"\"\"\n    export default foo.extend\n      bar: ->\n        from = 5\n        from = from * 3\"\"\",\n      \"\"\"\n    export default foo.extend({\n      bar: function() {\n        var from;\n        from = 5;\n        return from = from * 3;\n      }\n    });\"\"\"\n\ntest \"wrapped members can be imported multiple times if aliased\", ->\n  eqJS \"import { foo, foo as bar } from 'lib'\",\n  \"\"\"\n    import {\n      foo,\n      foo as bar\n    } from 'lib';\"\"\"\n\ntest \"default and wrapped members can be imported multiple times if aliased\", ->\n  eqJS \"import foo, { foo as bar } from 'lib'\",\n  \"\"\"\n    import foo, {\n      foo as bar\n    } from 'lib';\"\"\"\n\ntest \"import a member named default\", ->\n  eqJS \"import { default } from 'lib'\",\n  \"\"\"\n    import {\n      default\n    } from 'lib';\"\"\"\n\ntest \"import an aliased member named default\", ->\n  eqJS \"import { default as def } from 'lib'\",\n  \"\"\"\n    import {\n      default as def\n    } from 'lib';\"\"\"\n\ntest \"export a member named default\", ->\n  eqJS \"export { default }\",\n  \"\"\"\n    export {\n      default\n    };\"\"\"\n\ntest \"export an aliased member named default\", ->\n  eqJS \"export { def as default }\",\n  \"\"\"\n    export {\n      def as default\n    };\"\"\"\n\ntest \"import an imported member named default\", ->\n  eqJS \"import { default } from 'lib'\",\n  \"\"\"\n    import {\n      default\n    } from 'lib';\"\"\"\n\ntest \"import an imported aliased member named default\", ->\n  eqJS \"import { default as def } from 'lib'\",\n  \"\"\"\n    import {\n      default as def\n    } from 'lib';\"\"\"\n\ntest \"export an imported member named default\", ->\n  eqJS \"export { default } from 'lib'\",\n  \"\"\"\n    export {\n      default\n    } from 'lib';\"\"\"\n\ntest \"export an imported aliased member named default\", ->\n  eqJS \"export { default as def } from 'lib'\",\n  \"\"\"\n    export {\n      default as def\n    } from 'lib';\"\"\"\n\ntest \"#4394: export shouldn't prevent variable declarations\", ->\n  eqJS \"\"\"\n    x = 1\n    export { x }\n  \"\"\",\n  \"\"\"\n    var x;\n\n    x = 1;\n\n    export {\n      x\n    };\n  \"\"\"\n\ntest \"#4451: `default` in an export statement is only treated as a keyword when it follows `export` or `as`\", ->\n  eqJS \"export default { default: 1 }\",\n  \"\"\"\n    export default {\n      default: 1\n    };\n  \"\"\"\n\ntest \"#4491: import- and export-specific lexing should stop after import/export statement\", ->\n  eqJS \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib'\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib';\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n\n  eqJS \"\"\"\n    import { foo, bar as baz } from 'lib'\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\",\n  \"\"\"\n    import {\n      foo,\n      bar as baz\n    } from 'lib';\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n\n  eqJS \"\"\"\n    import * as lib from 'lib'\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\",\n  \"\"\"\n    import * as lib from 'lib';\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n\n  eqJS \"\"\"\n    export {\n      foo,\n      bar\n    }\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\",\n  \"\"\"\n    export {\n      foo,\n      bar\n    };\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n\n  eqJS \"\"\"\n    export * from 'lib'\n\n    foo as\n    3 * as 4\n    from 'foo'\n    \"\"\",\n  \"\"\"\n    export * from 'lib';\n\n    foo(as);\n\n    3 * as(4);\n\n    from('foo');\n    \"\"\"\n\n# Issue #4874: Backslash not supported in import or export statements\ntest \"#4874: backslash `import`\", ->\n\n  eqJS \"\"\"\n    import foo \\\n        from 'lib'\n\n    foo a\n    \"\"\",\n  \"\"\"\n    import foo from 'lib';\n\n    foo(a);\n    \"\"\"\n\n  eqJS \"\"\"\n    import \\\n                    foo \\\n        from \\\n    'lib'\n\n    foo a\n    \"\"\",\n  \"\"\"\n    import foo from 'lib';\n\n    foo(a);\n    \"\"\"\n\n  eqJS \"\"\"\n    import \\\n          utilityBelt \\\n    , {\n      each\n    } from \\\n    'underscore'\n    \"\"\",\n  \"\"\"\n    import utilityBelt, {\n      each\n    } from 'underscore';\n    \"\"\"\n\ntest \"#4874: backslash `export`\", ->\n  eqJS \"\"\"\n    export \\\n      * \\\n            from \\\n      'underscore'\n    \"\"\",\n  \"\"\"\n    export * from 'underscore';\n    \"\"\"\n\n  eqJS \"\"\"\n    export \\\n        { max, min } \\\n              from \\\n      'underscore'\n  \"\"\",\n  \"\"\"\n    export {\n      max,\n      min\n    } from 'underscore';\n    \"\"\"\n\ntest \"#4834: dynamic import\", ->\n  eqJS \"\"\"\n    import('module').then ->\n  \"\"\",\n  \"\"\"\n    import('module').then(function() {});\n  \"\"\"\n\n  eqJS \"\"\"\n    foo = ->\n      bar = await import('bar')\n  \"\"\",\n  \"\"\"\n    var foo;\n\n    foo = async function() {\n      var bar;\n      return bar = (await import('bar'));\n    };\n  \"\"\"\n\n  eqJS \"\"\"\n    console.log import('foo')\n  \"\"\",\n  \"\"\"\n    console.log(import('foo'));\n  \"\"\"\n\ntest \"#5317: Support import.meta\", ->\n  eqJS \"\"\"\n    foo = import.meta\n  \"\"\",\n  \"\"\"\n    var foo;\n\n    foo = import.meta;\n  \"\"\"\n\n  eqJS \"\"\"\n    foo = import\n        .meta\n  \"\"\",\n  \"\"\"\n    var foo;\n\n    foo = import.meta;\n  \"\"\"\n\n  eqJS \"\"\"\n    foo = import.\n        meta\n  \"\"\",\n  \"\"\"\n    var foo;\n\n    foo = import.meta;\n  \"\"\"\n\n  eqJS \"\"\"\n    foo = import.meta.bar\n  \"\"\",\n  \"\"\"\n    var foo;\n\n    foo = import.meta.bar;\n  \"\"\"\n\n  eqJS \"\"\"\n    foo = import\n        .meta\n        .bar\n  \"\"\",\n  \"\"\"\n    var foo;\n\n    foo = import.meta.bar;\n  \"\"\"\n\n  eqJS \"\"\"\n    console.log import.meta.url\n  \"\"\",\n  \"\"\"\n    console.log(import.meta.url);\n  \"\"\"\n"
  },
  {
    "path": "test/numbers.coffee",
    "content": "# Number Literals\n# ---------------\n\n# * Decimal Integer Literals\n# * Octal Integer Literals\n# * Hexadecimal Integer Literals\n# * Scientific Notation Integer Literals\n# * Scientific Notation Non-Integer Literals\n# * Non-Integer Literals\n# * Binary Integer Literals\n\n\n# Binary Integer Literals\n# Binary notation is understood as would be decimal notation.\n\ntest \"Parser recognises binary numbers\", ->\n  eq 4, 0b100\n\n# Decimal Integer Literals\n\ntest \"call methods directly on numbers\", ->\n  eq 4, 4.valueOf()\n  eq '11', 4.toString 3\n  eq '1000', 1_000.toString()\n\neq -1, 3 -4\n\n#764: Numbers should be indexable\neq Number::toString, 42['toString']\n\neq Number::toString, 42.toString\n\neq Number::toString, 2e308['toString'] # Infinity\n\n\n# Non-Integer Literals\n\n# Decimal number literals.\nvalue = .25 + .75\nok value is 1\nvalue = 0.0 + -.25 - -.75 + 0.0\nok value is 0.5\n\n#764: Numbers should be indexable\neq Number::toString,   4['toString']\neq Number::toString, 4.2['toString']\neq Number::toString, .42['toString']\neq Number::toString, (4)['toString']\n\neq Number::toString,   4.toString\neq Number::toString, 4.2.toString\neq Number::toString, .42.toString\neq Number::toString, (4).toString\n\ntest '#1168: leading floating point suppresses newline', ->\n  eq 1, do ->\n    1\n    .5 + 0.5\n\ntest \"Python-style octal literal notation '0o777'\", ->\n  eq 511, 0o777\n  eq 1, 0o1\n  eq 1, 0o00001\n  eq parseInt('0777', 8), 0o777\n  eq '777', 0o777.toString 8\n  eq 4, 0o4.valueOf()\n  eq Number::toString, 0o777['toString']\n  eq Number::toString, 0o777.toString\n\ntest \"#2060: Disallow uppercase radix prefixes\", ->\n  for char in ['b', 'o', 'x']\n    program = \"0#{char}0\"\n    doesNotThrowCompileError program, bare: yes\n    throwsCompileError program.toUpperCase(), bare: yes\n\ntest \"#5164: Allow lowercase and uppercase exponent notation\", ->\n  doesNotThrow -> CoffeeScript.compile \"0e0\", bare: yes\n  doesNotThrow -> CoffeeScript.compile \"0E0\", bare: yes\n\ntest \"#2224: hex literals with 0b or B or E\", ->\n  eq 176, 0x0b0\n  eq 177, 0x0B1\n  eq 225, 0xE1\n\ntest \"Infinity\", ->\n  eq Infinity, CoffeeScript.eval \"0b#{Array(1024 + 1).join('1')}\"\n  eq Infinity, CoffeeScript.eval \"0o#{Array(342 + 1).join('7')}\"\n  eq Infinity, CoffeeScript.eval \"0x#{Array(256 + 1).join('f')}\"\n  eq Infinity, CoffeeScript.eval Array(500 + 1).join('9')\n  eq Infinity, 2e308\n\ntest \"NaN\", ->\n  ok isNaN 1/NaN\n"
  },
  {
    "path": "test/numbers_bigint.coffee",
    "content": "# BigInt Literals\n# ---------------\n\ntest \"BigInt exists\", ->\n  'object' is typeof BigInt\n\ntest \"Parser recognizes decimal BigInt literals\", ->\n  eq 42n, BigInt 42\n\ntest \"Parser recognizes decimal BigInt literals with separator\", ->\n  eq 1_000n, BigInt 1000\n\ntest \"Parser recognizes binary BigInt literals\", ->\n  eq 42n, 0b101010n\n\ntest \"Parser recognizes octal BigInt literals\", ->\n  eq 42n, 0o52n\n\ntest \"Parser recognizes hexadecimal BigInt literals\", ->\n  eq 42n, 0x2an\n"
  },
  {
    "path": "test/numeric_literal_separators.coffee",
    "content": "# Numeric Literal Separators\n# --------------------------\n\ntest 'integer literals with separators', ->\n  eq 123_456, 123456\n  eq 12_34_56, 123456\n\ntest 'decimal literals with separators', ->\n  eq 1_2.34_5, 12.345\n  eq 1_0e1_0, 10e10\n  eq 1_2.34_5e6_7, 12.345e67\n\ntest 'hexadecimal literals with separators', ->\n  eq 0x1_2_3_4, 0x1234\n\ntest 'binary literals with separators', ->\n  eq 0b10_10, 0b1010\n\ntest 'octal literals with separators', ->\n  eq 0o7_7_7, 0o777\n\ntest 'infinity with separator', ->\n  eq 2e3_08, Infinity\n\ntest 'range with separators', ->\n  range = [10_000...10_002]\n  eq range.length, 2\n  eq range[0], 10000\n\ntest 'property access on a number', ->\n  # Somehow, `3..toFixed()` is valid JavaScript; though just `3.toFixed()`\n  # is not. CoffeeScript has long allowed code like `3.toFixed()` to compile\n  # into `3..toFixed()`.\n  eq 3.toFixed(), '3'\n  # Where this can conflict with numeric literal separators is when the\n  # property name contains an underscore.\n  Number::_23 = _23 = 'x'\n  eq 1._23, 'x'\n  ok 1._34 is undefined\n  delete Number::_23\n\ntest 'invalid decimal literal separators do not compile', ->\n  # `1._23` is a valid property access (see previous test)\n  throwsCompileError '1_.23'\n  throwsCompileError '1e_2'\n  throwsCompileError '1e2_'\n  throwsCompileError '1_'\n  throwsCompileError '1__2'\n\ntest 'invalid hexadecimal literal separators do not compile', ->\n  throwsCompileError '0x_1234'\n  throwsCompileError '0x1234_'\n  throwsCompileError '0x1__34'\n\ntest 'invalid binary literal separators do not compile', ->\n  throwsCompileError '0b_100'\n  throwsCompileError '0b100_'\n  throwsCompileError '0b1__1'\n\ntest 'invalid octal literal separators do not compile', ->\n  throwsCompileError '0o_777'\n  throwsCompileError '0o777_'\n  throwsCompileError '0o6__6'\n"
  },
  {
    "path": "test/object_rest_spread.coffee",
    "content": "test \"#4798 destructuring of objects with splat within arrays\", ->\n  arr = [1, {a:1, b:2}]\n  [...,{a, r...}] = arr\n  eq a, 1\n  deepEqual r, {b:2}\n  [b, {q...}] = arr\n  eq b, 1\n  deepEqual q, arr[1]\n  eq q.b, r.b\n  eq q.a, a\n\n  arr2 = [arr[1]]\n  [{a2...}] = arr2\n  eq a2.a, arr2[0].a\n\ntest \"destructuring assignment with objects and splats: ES2015\", ->\n  obj = {a: 1, b: 2, c: 3, d: 4, e: 5}\n  throwsCompileError \"{a, r..., s...} = x\", null, null, \"multiple rest elements are disallowed\"\n  throwsCompileError \"{a, r..., s..., b} = x\", null, null, \"multiple rest elements are disallowed\"\n  prop = \"b\"\n  {a, b, r...} = obj\n  eq a, 1\n  eq b, 2\n  eq r.e, obj.e\n  eq r.a, undefined\n  {d, c: x, r...} = obj\n  eq x, 3\n  eq d, 4\n  eq r.c, undefined\n  eq r.b, 2\n  {a, 'b': z, g = 9, r...} = obj\n  eq g, 9\n  eq z, 2\n  eq r.b, undefined\n\ntest \"destructuring assignment with splats and default values\", ->\n  obj = {}\n  c = {b: 1}\n  { a: {b} = c, d...} = obj\n\n  eq b, 1\n  deepEqual d, {}\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  {\n    a: {b} = c\n    d ...\n  } = obj\n\n  eq b, 1\n  deepEqual d, {}\n\ntest \"destructuring assignment with splat with default value\", ->\n  obj = {}\n  c = {val: 1}\n  { a: {b...} = c } = obj\n\n  deepEqual b, val: 1\n\ntest \"destructuring assignment with multiple splats in different objects\", ->\n  obj = { a: {val: 1}, b: {val: 2} }\n  { a: {a...}, b: {b...} } = obj\n  deepEqual a, val: 1\n  deepEqual b, val: 2\n\n  o = {\n    props: {\n      p: {\n        n: 1\n        m: 5\n      }\n      s: 6\n    }\n  }\n  {p: {m, q..., t = {obj...}}, r...} = o.props\n  eq m, o.props.p.m\n  deepEqual r, s: 6\n  deepEqual q, n: 1\n  deepEqual t, obj\n\n  @props = o.props\n  {p: {m}, r...} = @props\n  eq m, @props.p.m\n  deepEqual r, s: 6\n\n  {p: {m}, r...} = {o.props..., p:{m:9}}\n  eq m, 9\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  {\n    a: {\n      a ...\n    }\n    b: {\n      b ...\n    }\n  } = obj\n  deepEqual a, val: 1\n  deepEqual b, val: 2\n\ntest \"destructuring assignment with dynamic keys and splats\", ->\n  i = 0\n  foo = -> ++i\n\n  obj = {1: 'a', 2: 'b'}\n  { \"#{foo()}\": a, b... } = obj\n\n  eq a, 'a'\n  eq i, 1\n  deepEqual b, 2: 'b'\n\n# Tests from https://babeljs.io/docs/plugins/transform-object-rest-spread/.\ntest \"destructuring assignment with objects and splats: Babel tests\", ->\n  # What Babel calls “rest properties:”\n  { x, y, z... } = { x: 1, y: 2, a: 3, b: 4 }\n  eq x, 1\n  eq y, 2\n  deepEqual z, { a: 3, b: 4 }\n\n  # What Babel calls “spread properties:”\n  n = { x, y, z... }\n  deepEqual n, { x: 1, y: 2, a: 3, b: 4 }\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  { x, y, z ... } = { x: 1, y: 2, a: 3, b: 4 }\n  eq x, 1\n  eq y, 2\n  deepEqual z, { a: 3, b: 4 }\n\n  n = { x, y, z ... }\n  deepEqual n, { x: 1, y: 2, a: 3, b: 4 }\n\ntest \"deep destructuring assignment with objects: ES2015\", ->\n  a1={}; b1={}; c1={}; d1={}\n  obj = {\n    a: a1\n    b: {\n      'c': {\n        d: {\n          b1\n          e: c1\n          f: d1\n        }\n      }\n    }\n    b2: {b1, c1}\n  }\n  {a: w, b: {c: {d: {b1: bb, r1...}}}, r2...} = obj\n  eq r1.e, c1\n  eq r2.b, undefined\n  eq bb, b1\n  eq r2.b2, obj.b2\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  {a: w, b: {c: {d: {b1: bb, r1 ...}}}, r2 ...} = obj\n  eq r1.e, c1\n  eq r2.b, undefined\n  eq bb, b1\n  eq r2.b2, obj.b2\n\ntest \"deep destructuring assignment with defaults: ES2015\", ->\n  obj =\n    b: { c: 1, baz: 'qux' }\n    foo: 'bar'\n  j =\n    f: 'world'\n  i =\n    some: 'prop'\n  {\n    a...\n    b: { c, d... }\n    e: {\n      f: hello\n      g: { h... } = i\n    } = j\n  } = obj\n\n  deepEqual a, foo: 'bar'\n  eq c, 1\n  deepEqual d, baz: 'qux'\n  eq hello, 'world'\n  deepEqual h, some: 'prop'\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  {\n    a ...\n    b: {\n      c,\n      d ...\n    }\n    e: {\n      f: hello\n      g: {\n        h ...\n      } = i\n    } = j\n  } = obj\n\n  deepEqual a, foo: 'bar'\n  eq c, 1\n  deepEqual d, baz: 'qux'\n  eq hello, 'world'\n  deepEqual h, some: 'prop'\n\ntest \"object spread properties: ES2015\", ->\n  obj = {a: 1, b: 2, c: 3, d: 4, e: 5}\n  obj2 = {obj..., c:9}\n  eq obj2.c, 9\n  eq obj.a, obj2.a\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  obj2 = {\n    obj ...\n    c:9\n  }\n  eq obj2.c, 9\n  eq obj.a, obj2.a\n\n  obj2 = {obj..., a: 8, c: 9, obj...}\n  eq obj2.c, 3\n  eq obj.a, obj2.a\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  obj2 = {\n    obj ...\n    a: 8\n    c: 9\n    obj ...\n  }\n  eq obj2.c, 3\n  eq obj.a, obj2.a\n\n  obj3 = {obj..., b: 7, g: {obj2..., c: 1}}\n  eq obj3.g.c, 1\n  eq obj3.b, 7\n  deepEqual obj3.g, {obj..., c: 1}\n\n  (({a, b, r...}) ->\n    eq 1, a\n    deepEqual r, {c: 3, d: 44, e: 55}\n  ) {obj2..., d: 44, e: 55}\n\n  obj = {a: 1, b: 2, c: {d: 3, e: 4, f: {g: 5}}}\n  obj4 = {a: 10, obj.c...}\n  eq obj4.a, 10\n  eq obj4.d, 3\n  eq obj4.f.g, 5\n  deepEqual obj4.f, obj.c.f\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  (({\n    a\n    b\n    r ...\n    }) ->\n    eq 1, a\n    deepEqual r, {c: 3, d: 44, e: 55}\n  ) {\n    obj2 ...\n    d: 44\n    e: 55\n  }\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  obj4 = {\n    a: 10\n    obj.c ...\n  }\n  eq obj4.a, 10\n  eq obj4.d, 3\n  eq obj4.f.g, 5\n  deepEqual obj4.f, obj.c.f\n\n  obj5 = {obj..., ((k) -> {b: k})(99)...}\n  eq obj5.b, 99\n  deepEqual obj5.c, obj.c\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  obj5 = {\n    obj ...\n    ((k) -> {b: k})(99) ...\n  }\n  eq obj5.b, 99\n  deepEqual obj5.c, obj.c\n\n  fn = -> {c: {d: 33, e: 44, f: {g: 55}}}\n  obj6 = {obj..., fn()...}\n  eq obj6.c.d, 33\n  deepEqual obj6.c, {d: 33, e: 44, f: {g: 55}}\n\n  obj7 = {obj..., fn()..., {c: {d: 55, e: 66, f: {77}}}...}\n  eq obj7.c.d, 55\n  deepEqual obj6.c, {d: 33, e: 44, f: {g: 55}}\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  obj7 = {\n    obj ...\n    fn() ...\n    {c: {d: 55, e: 66, f: {77}}} ...\n  }\n  eq obj7.c.d, 55\n  deepEqual obj6.c, {d: 33, e: 44, f: {g: 55}}\n\n  obj =\n    a:\n      b:\n        c:\n          d:\n            e: {}\n  obj9 = {a:1, obj.a.b.c..., g:3}\n  deepEqual obj9.d, {e: {}}\n\n  a = \"a\"\n  c = \"c\"\n  obj9 = {a:1, obj[a].b[c]..., g:3}\n  deepEqual obj9.d, {e: {}}\n\n  obj9 = {a:1, obj.a[\"b\"].c[\"d\"]..., g:3}\n  deepEqual obj9[\"e\"], {}\n\ntest \"#4673: complex destructured object spread variables\", ->\n  b = c: 1\n  {{a...}...} = b\n  eq a.c, 1\n\n  d = {}\n  {d.e...} = f: 1\n  eq d.e.f, 1\n\n  {{g}...} = g: 1\n  eq g, 1\n\ntest \"rest element destructuring in function definition\", ->\n  obj = {a: 1, b: 2, c: 3, d: 4, e: 5}\n\n  (({a, b, r...}) ->\n    eq 1, a\n    eq 2, b,\n    deepEqual r, {c: 3, d: 4, e: 5}\n  ) obj\n\n  (({a: p, b, r...}, q) ->\n    eq p, 1\n    eq q, 9\n    deepEqual r, {c: 3, d: 4, e: 5}\n  ) {a:1, b:2, c:3, d:4, e:5}, 9\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  (({\n      a: p\n      b\n      r ...\n    }, q) ->\n    eq p, 1\n    eq q, 9\n    deepEqual r, {c: 3, d: 4, e: 5}\n  ) {a:1, b:2, c:3, d:4, e:5}, 9\n\n  a1={}; b1={}; c1={}; d1={}\n  obj1 = {\n    a: a1\n    b: {\n      'c': {\n        d: {\n          b1\n          e: c1\n          f: d1\n        }\n      }\n    }\n    b2: {b1, c1}\n  }\n\n  (({a: w, b: {c: {d: {b1: bb, r1...}}}, r2...}) ->\n    eq a1, w\n    eq bb, b1\n    eq r2.b, undefined\n    deepEqual r1, {e: c1, f: d1}\n    deepEqual r2.b2, {b1, c1}\n  ) obj1\n\n  b = 3\n  f = ({a, b...}) ->\n  f {}\n  eq 3, b\n\n  (({a, r...} = {}) ->\n    eq a, undefined\n    deepEqual r, {}\n  )()\n\n  (({a, r...} = {}) ->\n    eq a, 1\n    deepEqual r, {b: 2, c: 3}\n  ) {a: 1, b: 2, c: 3}\n\n  f = ({a, r...} = {}) -> [a, r]\n  deepEqual [undefined, {}], f()\n  deepEqual [1, {b: 2}], f {a: 1, b: 2}\n  deepEqual [1, {}], f {a: 1}\n\n  f = ({a, r...} = {a: 1, b: 2}) -> [a, r]\n  deepEqual [1, {b:2}], f()\n  deepEqual [2, {}], f {a:2}\n  deepEqual [3, {c:5}], f {a:3, c:5}\n\n  f = ({ a: aa = 0, b: bb = 0 }) -> [aa, bb]\n  deepEqual [0, 0], f {}\n  deepEqual [0, 42], f {b:42}\n  deepEqual [42, 0], f {a:42}\n  deepEqual [42, 43], f {a:42, b:43}\n\ntest \"#4673: complex destructured object spread variables\", ->\n  f = ({{a...}...}) ->\n    a\n  eq f(c: 1).c, 1\n\n  g = ({@y...}) ->\n    eq @y.b, 1\n  g b: 1\n\ntest \"#4834: dynamic import can technically be object spread\", ->\n  eqJS \"\"\"\n    x = {...import('module')}\n  \"\"\",\n  \"\"\"\n    var x;\n\n    x = {...import('module')};\n  \"\"\"\n\ntest \"#5168: allow indented property index\", ->\n  a = b: c: 3\n\n  eq 3, {\n    ...a[\n      if yes\n        'b'\n      else\n        'c'\n    ]\n  }.c\n\ntest \"#5291: soaks/prototype shorthands in object spread variables\", ->\n  withPrototype =\n    prototype:\n      b: {c: 1}\n  eq {withPrototype::b...}.c, 1\n  eq {...withPrototype::b}.c, 1\n\n  withSoak =\n    b:\n      c: 2\n  eq {withSoak?.b...}.c, 2\n  eq {...withSoak?.b}.c, 2\n\n  soakedCall = ->\n    b:\n      c: 3\n  eq {soakedCall?().b...}.c, 3\n  eq {...soakedCall?().b}.c, 3\n\n  assignToPrototype =\n    prototype: {}\n  {...assignToPrototype::b} = c: 4\n  eq assignToPrototype::b.c, 4\n"
  },
  {
    "path": "test/objects.coffee",
    "content": "# Object Literals\n# ---------------\n\n# TODO: refactor object literal tests\n# TODO: add indexing and method invocation tests: {a}['a'] is a, {a}.a()\n\ntrailingComma = {k1: \"v1\", k2: 4, k3: (-> true),}\nok trailingComma.k3() and (trailingComma.k2 is 4) and (trailingComma.k1 is \"v1\")\n\nok {a: (num) -> num is 10 }.a 10\n\nmoe = {\n  name:  'Moe'\n  greet: (salutation) ->\n    salutation + \" \" + @name\n  hello: ->\n    @['greet'] \"Hello\"\n  10: 'number'\n}\nok moe.hello() is \"Hello Moe\"\nok moe[10] is 'number'\nmoe.hello = ->\n  this['greet'] \"Hello\"\nok moe.hello() is 'Hello Moe'\n\nobj = {\n  is:     -> yes,\n  'not':  -> no,\n}\nok obj.is()\nok not obj.not()\n\n### Top-level object literal... ###\nobj: 1\n### ...doesn't break things. ###\n\n# Object literals should be able to include keywords.\nobj = {class: 'höt'}\nobj.function = 'dog'\nok obj.class + obj.function is 'hötdog'\n\n# Implicit objects as part of chained calls.\npluck = (x) -> x.a\neq 100, pluck pluck pluck a: a: a: 100\n\n\ntest \"YAML-style object literals\", ->\n  obj =\n    a: 1\n    b: 2\n  eq 1, obj.a\n  eq 2, obj.b\n\n  config =\n    development:\n      server: 'localhost'\n      timeout: 10\n\n    production:\n      server: 'dreamboat'\n      timeout: 1000\n\n  ok config.development.server  is 'localhost'\n  ok config.production.server   is 'dreamboat'\n  ok config.development.timeout is 10\n  ok config.production.timeout  is 1000\n\nobj =\n  a: 1,\n  b: 2,\nok obj.a is 1\nok obj.b is 2\n\n# Implicit objects nesting.\nobj =\n  options:\n    value: yes\n  fn: ->\n    {}\n    null\nok obj.options.value is yes\nok obj.fn() is null\n\n# Implicit objects with wacky indentation:\nobj =\n  'reverse': (obj) ->\n    Array.prototype.reverse.call obj\n  abc: ->\n    @reverse(\n      @reverse @reverse ['a', 'b', 'c'].reverse()\n    )\n  one: [1, 2,\n    a: 'b'\n  3, 4]\n  red:\n    orange:\n          yellow:\n                  green: 'blue'\n    indigo: 'violet'\n  misdent: [[],\n  [],\n                  [],\n      []]\nok obj.abc().join(' ') is 'a b c'\nok obj.one.length is 5\nok obj.one[4] is 4\nok obj.one[2].a is 'b'\nok (key for key of obj.red).length is 2\nok obj.red.orange.yellow.green is 'blue'\nok obj.red.indigo is 'violet'\nok obj.misdent.toString() is ',,,'\n\n#542: Objects leading expression statement should be parenthesized.\n{f: -> ok yes }.f() + 1\n\n# String-keyed objects shouldn't suppress newlines.\none =\n  '>!': 3\nsix: -> 10\nok not one.six\n\n# Shorthand objects with property references.\nobj =\n  ### comment one ###\n  ### comment two ###\n  one: 1\n  two: 2\n  object: -> {@one, @two}\n  list:   -> [@one, @two]\nresult = obj.object()\neq result.one, 1\neq result.two, 2\neq result.two, obj.list()[1]\n\nthird = (a, b, c) -> c\nobj =\n  one: 'one'\n  two: third 'one', 'two', 'three'\nok obj.one is 'one'\nok obj.two is 'three'\n\ntest \"invoking functions with implicit object literals\", ->\n  generateGetter = (prop) -> (obj) -> obj[prop]\n  getA = generateGetter 'a'\n  getArgs = -> arguments\n  a = b = 30\n\n  result = getA\n    a: 10\n  eq 10, result\n\n  result = getA\n    \"a\": 20\n  eq 20, result\n\n  result = getA a,\n    b:1\n  eq undefined, result\n\n  result = getA b:1,\n  a:43\n  eq 43, result\n\n  result = getA b:1,\n    a:62\n  eq undefined, result\n\n  result = getA\n    b:1\n    a\n  eq undefined, result\n\n  result = getA\n    a:\n      b:2\n    b:1\n  eq 2, result.b\n\n  result = getArgs\n    a:1\n    b\n    c:1\n  ok result.length is 3\n  ok result[2].c is 1\n\n  result = getA b: 13, a: 42, 2\n  eq 42, result\n\n  result = getArgs a:1, (1 + 1)\n  ok result[1] is 2\n\n  result = getArgs a:1, b\n  ok result.length is 2\n  ok result[1] is 30\n\n  result = getArgs a:1, b, b:1, a\n  ok result.length is 4\n  ok result[2].b is 1\n\n  throwsCompileError \"a = b:1, c\"\n\ntest \"some weird indentation in YAML-style object literals\", ->\n  two = (a, b) -> b\n  obj = then two 1,\n    1: 1\n    a:\n      b: ->\n        fn c,\n          d: e\n    f: 1\n  eq 1, obj[1]\n\ntest \"#1274: `{} = a()` compiles to `false` instead of `a()`\", ->\n  a = false\n  fn = -> a = true\n  {} = fn()\n  ok a\n\ntest \"#1436: `for` etc. work as normal property names\", ->\n  obj = {}\n  eq no, obj.hasOwnProperty 'for'\n  obj.for = 'foo' of obj\n  eq yes, obj.hasOwnProperty 'for'\n\ntest \"#2706, Un-bracketed object as argument causes inconsistent behavior\", ->\n  foo = (x, y) -> y\n  bar = baz: yes\n\n  eq yes, foo x: 1, bar.baz\n\ntest \"#2608, Allow inline objects in arguments to be followed by more arguments\", ->\n  foo = (x, y) -> y\n\n  eq yes, foo x: 1, y: 2, yes\n\ntest \"#2308, a: b = c:1\", ->\n  foo = a: b = c: yes\n  eq b.c, yes\n  eq foo.a.c, yes\n\ntest \"#2317, a: b c: 1\", ->\n  foo = (x) -> x\n  bar = a: foo c: yes\n  eq bar.a.c, yes\n\ntest \"#1896, a: func b, {c: d}\", ->\n  first = (x) -> x\n  second = (x, y) -> y\n  third = (x, y, z) -> z\n\n  one = 1\n  two = 2\n  three = 3\n  four = 4\n\n  foo = a: second one, {c: two}\n  eq foo.a.c, two\n\n  bar = a: second one, c: two\n  eq bar.a.c, two\n\n  baz = a: second one, {c: two}, e: first first h: three\n  eq baz.a.c, two\n\n  qux = a: third one, {c: two}, e: first first h: three\n  eq qux.a.e.h, three\n\n  quux = a: third one, {c: two}, e: first(three), h: four\n  eq quux.a.e, three\n  eq quux.a.h, four\n\n  corge = a: third one, {c: two}, e: second three, h: four\n  eq corge.a.e.h, four\n\ntest \"Implicit objects, functions and arrays\", ->\n  first  = (x) -> x\n  second = (x, y) -> y\n\n  foo = [\n    1\n    one: 1\n    two: 2\n    three: 3\n    more:\n      four: 4\n      five: 5, six: 6\n    2, 3, 4\n    5]\n  eq foo[2], 2\n  eq foo[1].more.six, 6\n\n  bar = [\n    1\n    first first first second 1,\n      one: 1, twoandthree: twoandthree: two: 2, three: 3\n      2,\n    2\n    one: 1\n    two: 2\n    three: first second ->\n      no\n    , ->\n      3\n    3\n    4]\n  eq bar[2], 2\n  eq bar[1].twoandthree.twoandthree.two, 2\n  eq bar[3].three(), 3\n  eq bar[4], 3\n\ntest \"#2549, Brace-less Object Literal as a Second Operand on a New Line\", ->\n  foo = no or\n    one: 1\n    two: 2\n    three: 3\n  eq foo.one, 1\n\n  bar = yes and one: 1\n  eq bar.one, 1\n\n  baz = null ?\n    one: 1\n    two: 2\n  eq baz.two, 2\n\ntest \"#2757, Nested\", ->\n  foo =\n    bar:\n      one: 1,\n  eq foo.bar.one, 1\n\n  baz =\n    qux:\n      one: 1,\n    corge:\n      two: 2,\n      three: three: three: 3,\n    xyzzy:\n      thud:\n        four:\n          four: 4,\n      five: 5,\n\n  eq baz.qux.one, 1\n  eq baz.corge.three.three.three, 3\n  eq baz.xyzzy.thud.four.four, 4\n  eq baz.xyzzy.five, 5\n\ntest \"#1865, syntax regression 1.1.3\", ->\n  foo = (x, y) -> y\n\n  bar = a: foo (->),\n    c: yes\n  eq bar.a.c, yes\n\n  baz = a: foo (->), c: yes\n  eq baz.a.c, yes\n\n\ntest \"#1322: implicit call against implicit object with block comments\", ->\n  ((obj, arg) ->\n    eq obj.x * obj.y, 6\n    ok not arg\n  )\n    ###\n    x\n    ###\n    x: 2\n    ### y ###\n    y: 3\n\ntest \"#1513: Top level bare objs need to be wrapped in parens for unary and existence ops\", ->\n  doesNotThrow -> CoffeeScript.run \"{}?\", bare: true\n  doesNotThrow -> CoffeeScript.run \"{}.a++\", bare: true\n\ntest \"#1871: Special case for IMPLICIT_END in the middle of an implicit object\", ->\n  result = 'result'\n  ident = (x) -> x\n\n  result = ident one: 1 if false\n\n  eq result, 'result'\n\n  result = ident\n    one: 1\n    two: 2 for i in [1..3]\n\n  eq result.two.join(' '), '2 2 2'\n\ntest \"#1871: implicit object closed by IMPLICIT_END in implicit returns\", ->\n  ob = do ->\n    a: 1 if no\n  eq ob, undefined\n\n  # instead these return an object\n  func = ->\n    key:\n      i for i in [1, 2, 3]\n\n  eq func().key.join(' '), '1 2 3'\n\n  func = ->\n    key: (i for i in [1, 2, 3])\n\n  eq func().key.join(' '), '1 2 3'\n\ntest \"#1961, #1974, regression with compound assigning to an implicit object\", ->\n\n  obj = null\n\n  obj ?=\n    one: 1\n    two: 2\n\n  eq obj.two, 2\n\n  obj = null\n\n  obj or=\n    three: 3\n    four: 4\n\n  eq obj.four, 4\n\ntest \"#2207: Immediate implicit closes don't close implicit objects\", ->\n  func = ->\n    key: for i in [1, 2, 3] then i\n\n  eq func().key.join(' '), '1 2 3'\n\ntest \"#3216: For loop declaration as a value of an implicit object\", ->\n  test = [0..2]\n  ob =\n    a: for v, i in test then i\n    b: for v, i in test then i\n    c: for v in test by 1 then v\n    d: for v in test when true then v\n  arrayEq ob.a, test\n  arrayEq ob.b, test\n  arrayEq ob.c, test\n  arrayEq ob.d, test\n  byFirstKey =\n    a: for v in test by 1 then v\n  arrayEq byFirstKey.a, test\n  whenFirstKey =\n    a: for v in test when true then v\n  arrayEq whenFirstKey.a, test\n\ntest 'inline implicit object literals within multiline implicit object literals', ->\n  x =\n    a: aa: 0\n    b: 0\n  eq 0, x.b\n  eq 0, x.a.aa\n\ntest \"object keys with interpolations: simple cases\", ->\n  a = 'a'\n  obj = \"#{a}\": yes\n  eq obj.a, yes\n  obj = {\"#{a}\": yes}\n  eq obj.a, yes\n  obj = {\"#{a}\"}\n  eq obj.a, 'a'\n  obj = {\"#{5}\"}\n  eq obj[5], '5' # Note that the value is a string, just like the key.\n\ntest \"object keys with interpolations: commas in implicit object\", ->\n  obj = \"#{'a'}\": 1, b: 2\n  deepEqual obj, {a: 1, b: 2}\n  obj = a: 1, \"#{'b'}\": 2\n  deepEqual obj, {a: 1, b: 2}\n  obj = \"#{'a'}\": 1, \"#{'b'}\": 2\n  deepEqual obj, {a: 1, b: 2}\n\ntest \"object keys with interpolations: commas in explicit object\", ->\n  obj = {\"#{'a'}\": 1, b: 2}\n  deepEqual obj, {a: 1, b: 2}\n  obj = {a: 1, \"#{'b'}\": 2}\n  deepEqual obj, {a: 1, b: 2}\n  obj = {\"#{'a'}\": 1, \"#{'b'}\": 2}\n  deepEqual obj, {a: 1, b: 2}\n\ntest \"object keys with interpolations: commas after key with interpolation\", ->\n  obj = {\"#{'a'}\": yes,}\n  eq obj.a, yes\n  obj = {\n    \"#{'a'}\": 1,\n    \"#{'b'}\": 2,\n    ### herecomment ###\n    \"#{'c'}\": 3,\n  }\n  deepEqual obj, {a: 1, b: 2, c: 3}\n  obj =\n    \"#{'a'}\": 1,\n    \"#{'b'}\": 2,\n    ### herecomment ###\n    \"#{'c'}\": 3,\n  deepEqual obj, {a: 1, b: 2, c: 3}\n  obj =\n    \"#{'a'}\": 1,\n    \"#{'b'}\": 2,\n    ### herecomment ###\n    \"#{'c'}\": 3, \"#{'d'}\": 4,\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4}\n\ntest \"object keys with interpolations: key with interpolation mixed with `@prop`\", ->\n  deepEqual (-> {@a, \"#{'b'}\": 2}).call(a: 1), {a: 1, b: 2}\n\ntest \"object keys with interpolations: evaluate only once\", ->\n  count = 0\n  a = -> count++; 'a'\n  obj = {\"#{a()}\"}\n  eq obj.a, 'a'\n  eq count, 1\n\ntest \"object keys with interpolations: evaluation order\", ->\n  arr = []\n  obj =\n    a: arr.push 1\n    b: arr.push 2\n    \"#{'c'}\": arr.push 3\n    \"#{'d'}\": arr.push 4\n    e: arr.push 5\n    \"#{'f'}\": arr.push 6\n    g: arr.push 7\n  arrayEq arr, [1..7]\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7}\n\ntest \"object keys with interpolations: object starting with dynamic key\", ->\n  obj =\n    \"#{'a'}\": 1\n    b: 2\n  deepEqual obj, {a: 1, b: 2}\n\ntest \"object keys with interpolations: comments in implicit object\", ->\n  obj =\n    ### leading comment ###\n    \"#{'a'}\": 1\n\n    ### middle ###\n\n    \"#{'b'}\": 2\n    # regular comment\n    'c': 3\n    ### foo ###\n    d: 4\n    \"#{'e'}\": 5\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5}\n\n  # Comments in explicit object.\n  obj = {\n    ### leading comment ###\n    \"#{'a'}\": 1\n\n    ### middle ###\n\n    \"#{'b'}\": 2\n    # regular comment\n    'c': 3\n    ### foo ###\n    d: 4\n    \"#{'e'}\": 5\n  }\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5}\n\ntest \"object keys with interpolations: more complicated case\", ->\n  obj = {\n    \"#{'interpolated'}\":\n      \"\"\"\n        #{ '''nested''' }\n      \"\"\": 123: 456\n  }\n  deepEqual obj,\n    interpolated:\n      nested:\n        123: 456\n\ntest \"#4324: Shorthand after interpolated key\", ->\n  a = 2\n  obj = {\"#{1}\": 1, a}\n  eq 1, obj[1]\n  eq 2, obj.a\n\ntest \"computed property keys: simple cases\", ->\n  a = 'a'\n  obj = [a]: yes\n  eq obj.a, yes\n  obj = {[a]: yes}\n  eq obj.a, yes\n  obj = {[a]}\n  eq obj.a, 'a'\n  obj = {[5]}\n  eq obj[5], 5\n  obj = {['5']}\n  eq obj['5'], '5'\n\ntest \"computed property keys: commas in implicit object\", ->\n  obj = ['a']: 1, b: 2\n  deepEqual obj, {a: 1, b: 2}\n  obj = a: 1, ['b']: 2\n  deepEqual obj, {a: 1, b: 2}\n  obj = ['a']: 1, ['b']: 2\n  deepEqual obj, {a: 1, b: 2}\n\ntest \"computed property keys: commas in explicit object\", ->\n  obj = {['a']: 1, b: 2}\n  deepEqual obj, {a: 1, b: 2}\n  obj = {a: 1, ['b']: 2}\n  deepEqual obj, {a: 1, b: 2}\n  obj = {['a']: 1, ['b']: 2}\n  deepEqual obj, {a: 1, b: 2}\n\ntest \"computed property keys: commas after key with interpolation\", ->\n  obj = {['a']: yes,}\n  eq obj.a, yes\n  obj = {\n    ['a']: 1,\n    ['b']: 2,\n    ### herecomment ###\n    ['c']: 3,\n  }\n  deepEqual obj, {a: 1, b: 2, c: 3}\n  obj =\n    ['a']: 1,\n    ['b']: 2,\n    ### herecomment ###\n    ['c']: 3,\n  deepEqual obj, {a: 1, b: 2, c: 3}\n  obj =\n    ['a']: 1,\n    ['b']: 2,\n    ### herecomment ###\n    ['c']: 3, ['d']: 4,\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4}\n\ntest \"computed property keys: key with interpolation mixed with `@prop`\", ->\n  deepEqual (-> {@a, ['b']: 2}).call(a: 1), {a: 1, b: 2}\n\ntest \"computed property keys: evaluate only once\", ->\n  count = 0\n  a = -> count++; 'a'\n  obj = {[a()]}\n  eq obj.a, 'a'\n  eq count, 1\n\ntest \"computed property keys: evaluation order\", ->\n  arr = []\n  obj =\n    a: arr.push 1\n    b: arr.push 2\n    ['c']: arr.push 3\n    ['d']: arr.push 4\n    e: arr.push 5\n    ['f']: arr.push 6\n    g: arr.push 7\n  arrayEq arr, [1..7]\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7}\n\ntest \"computed property keys: object starting with dynamic key\", ->\n  obj =\n    ['a']: 1\n    b: 2\n  deepEqual obj, {a: 1, b: 2}\n\ntest \"computed property keys: comments in implicit object\", ->\n  obj =\n    ### leading comment ###\n    ['a']: 1\n\n    ### middle ###\n\n    ['b']: 2\n    # regular comment\n    'c': 3\n    ### foo ###\n    d: 4\n    ['e']: 5\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5}\n\n  obj = {\n    ### leading comment ###\n    ['a']: 1\n\n    ### middle ###\n\n    ['b']: 2\n    # regular comment\n    'c': 3\n    ### foo ###\n    d: 4\n    ['e']: 5\n  }\n  deepEqual obj, {a: 1, b: 2, c: 3, d: 4, e: 5}\n\ntest \"computed property keys: more complicated case\", ->\n  obj = {\n    ['interpolated']:\n       ['nested']:\n         123: 456\n  }\n  deepEqual obj,\n    interpolated:\n      nested:\n        123: 456\n\ntest \"computed property keys: empty array as key\", ->\n  o1 = { [[]] }\n  deepEqual o1, { [[]]: [] }\n  arrayEq o1[[]], []\n  o2 = { [[]]: 1 }\n  deepEqual o2, { [[]]: 1 }\n  eq o2[[]], 1\n  o3 = [[]]: 1\n  deepEqual o3, { [[]]: 1 }\n  deepEqual o3, { [[]]: 1 }\n  eq o3[[]], 1\n  o4 = a: 1, [[]]: 2\n  deepEqual o4, { a: 1, [[]]: 2 }\n  eq o4.a, 1,\n  eq o4[[]], 2\n  o5 = { a: 1, [[]]: 2 }\n  deepEqual o5, { a: 1, [[]]: 2 }\n  eq o5.a, 1,\n  eq o5[[]], 2\n\ntest \"computed property keys: shorthand after computed property key\", ->\n  a = 2\n  obj = {[1]: 1, a}\n  eq 1, obj[1]\n  eq 2, obj.a\n\ntest \"computed property keys: shorthand computed property key\", ->\n  a = 'b'\n  o = {[a]}\n  p = {a}\n  r = {['a']}\n  eq o.b, 'b'\n  eq p.a, o.b\n  eq r.a, 'a'\n\n  foo = -> \"a\"\n  obj = { [foo()] }\n  eq obj.a, 'a'\n\ntest \"computed property keys: arrays\", ->\n  b = 'b'\n  f = (c) -> \"#{c}1\"\n  obj =\n    ['a']: [1, 2, 3]\n    [b]: [4, 5, 6]\n    [f(b)]: [7, 8, 9]\n  arrayEq obj.a, [1, 2, 3]\n  arrayEq obj.b, [4, 5, 6]\n  arrayEq obj.b1, [7, 8, 9]\n\ntest \"computed property keys: examples from developer.mozilla.org (Object initializer)\", ->\n  i = 0\n  obj =\n    ['foo' + ++i]: i\n    ['foo' + ++i]: i\n    ['foo' + ++i]: i\n  eq obj.foo1, 1\n  eq obj.foo2, 2\n  eq obj.foo3, 3\n\n  param = 'size'\n  config =\n    [param]: 12,\n    ['mobile' + param.charAt(0).toUpperCase() + param.slice(1)]: 4\n  deepEqual config, {size: 12,  mobileSize: 4}\n\ntest \"computed property keys: [Symbol.iterator]\", ->\n  obj =\n    [Symbol.iterator]: ->\n      yield \"hello\"\n      yield \"world\"\n  arrayEq [obj...], ['hello', 'world']\n\ntest \"computed property keys: Class property\", ->\n  increment_method = \"increment\"\n  decrement_method = \"decrement\"\n  class Obs\n    constructor: (@count) ->\n    [increment_method]: -> @count += 1\n    [decrement_method]: -> @count -= 1\n  ob = new Obs 2\n  eq ob.increment(), 3\n  eq ob.decrement(), 2\n\ntest \"#1263: Braceless object return\", ->\n  fn = ->\n    return\n      a: 1\n      b: 2\n      c: -> 3\n\n  obj = fn()\n  eq 1, obj.a\n  eq 2, obj.b\n  eq 3, obj.c()\n\ntest \"#4564: indent should close implicit object\", ->\n  f = (x) -> x\n\n  arrayEq ['a'],\n    for key of f a: 1\n      key\n\n  g = null\n  if f a: 1\n    g = 3\n  eq g, 3\n\n  h = null\n  if a: (i for i in [1, 2, 3])\n    h = 4\n  eq h, 4\n\ntest \"#4544: Postfix conditionals in first line of implicit object literals\", ->\n  two =\n    foo:\n      bar: 42 if yes\n      baz: 1337\n  eq 42, two.foo.bar\n  eq 1337, two.foo.baz\n\n  f = (x) -> x\n\n  three =\n    foo: f\n      bar: 42 if yes\n      baz: 1337\n  eq 42, three.foo.bar\n  eq 1337, three.foo.baz\n\n  four =\n    f\n      foo:\n        bar: 42 if yes\n      baz: 1337\n  eq 42, four.foo.bar\n  eq 1337, four.baz\n\n  x = bar: 42 if no\n  baz: 1337\n  ok not x?\n\n  # Example from #2051\n  a = null\n  _alert = (arg) -> a = arg\n  _alert\n    val3: \"works\" if true\n    val: \"hello\"\n    val2: \"all good\"\n  eq a.val2, \"all good\"\n\ntest \"#4579: Postfix for/while/until in first line of implicit object literals\", ->\n  two =\n    foo:\n      bar1: x for x in [1, 2, 3]\n      bar2: x + y for x, y in [1, 2, 3]\n      baz: 1337\n  arrayEq [1, 2, 3], two.foo.bar1\n  arrayEq [1, 3, 5], two.foo.bar2\n  eq 1337, two.foo.baz\n\n  f = (x) -> x\n\n  three =\n    foo: f\n      bar1: x + y for x, y of a: 'b', c: 'd'\n      bar2: x + 'c' for x of a: 1, b: 2\n      baz: 1337\n  arrayEq ['ab', 'cd'], three.foo.bar1\n  arrayEq ['ac', 'bc'], three.foo.bar2\n  eq 1337, three.foo.baz\n\n  four =\n    f\n      foo:\n        \"bar_#{x}\": x for x of a: 1, b: 2\n      baz: 1337\n  eq 'a', four.foo[0].bar_a\n  eq 'b', four.foo[1].bar_b\n  eq 1337, four.baz\n\n  x = bar: 42 for y in [1]\n  baz: 1337\n  eq x.bar, 42\n\n  i = 5\n  five =\n    foo:\n      bar: i while i-- > 0\n      baz: 1337\n  arrayEq [4, 3, 2, 1, 0], five.foo.bar\n  eq 1337, five.foo.baz\n\n  i = 5\n  six =\n    foo:\n      bar: i until i-- <= 0\n      baz: 1337\n  arrayEq [4, 3, 2, 1, 0], six.foo.bar\n  eq 1337, six.foo.baz\n\ntest \"#5204: not parsed as static property\", ->\n  doesNotThrowCompileError \"@ [b]: 2\"\n\ntest \"#5292: implicit object after line continuer in implicit object property value\", ->\n  a =\n    b: 0 or\n      c: 1\n  eq 1, a.b.c\n\n  # following object property\n  a =\n    b: null ?\n      c: 1\n    d: 2\n  eq 1, a.b.c\n  eq 2, a.d\n\n  # multiline nested object\n  a =\n    b: 0 or\n      c: 1\n      d: 2\n    e: 3\n  eq 1, a.b.c\n  eq 2, a.b.d\n  eq 3, a.e\n\ntest \"#5368: continuing object and array literals\", ->\n  { a\n    b: { c }\n  } = {a: 1, b: {c: 2}}\n  eq a, 1\n  eq c, 2\n\n  [d\n   e: f\n  ] = [3, {e: 4}]\n  eq d, 3\n  eq f, 4\n  A =\n    [d\n     e: f\n    ]\n  eq A[0], 3\n  eq A[1].e, 4\n\n  for obj in [\n    {a: a\n     c: c\n    }\n    {a: a\n     c\n    }\n    {a\n     c: c\n    }\n    {a\n     c\n    }\n  ]\n    eq obj.a, 1\n    eq obj.c, 2\n"
  },
  {
    "path": "test/operators.coffee",
    "content": "# Operators\n# ---------\n\n# * Operators\n# * Existential Operator (Binary)\n# * Existential Operator (Unary)\n# * Aliased Operators\n# * [not] in/of\n# * Chained Comparison\n\ntest \"binary (2-ary) math operators do not require spaces\", ->\n  a = 1\n  b = -1\n  eq +1, a*-b\n  eq -1, a*+b\n  eq +1, a/-b\n  eq -1, a/+b\n\ntest \"operators should respect new lines as spaced\", ->\n  a = 123 +\n  456\n  eq 579, a\n\n  b = \"1#{2}3\" +\n  \"456\"\n  eq '123456', b\n\ntest \"multiple operators should space themselves\", ->\n  eq (+ +1), (- -1)\n\ntest \"compound operators on successive lines\", ->\n  a = 1\n  a +=\n  1\n  eq a, 2\n\ntest \"bitwise operators\", ->\n  eq  2, (10 &   3)\n  eq 11, (10 |   3)\n  eq  9, (10 ^   3)\n  eq 80, (10 <<  3)\n  eq  1, (10 >>  3)\n  eq  1, (10 >>> 3)\n  num = 10; eq  2, (num &=   3)\n  num = 10; eq 11, (num |=   3)\n  num = 10; eq  9, (num ^=   3)\n  num = 10; eq 80, (num <<=  3)\n  num = 10; eq  1, (num >>=  3)\n  num = 10; eq  1, (num >>>= 3)\n\ntest \"`instanceof`\", ->\n  ok new String instanceof String\n  ok new Boolean instanceof Boolean\n  # `instanceof` supports negation by prefixing the operator with `not`\n  ok new Number not instanceof String\n  ok new Array not instanceof Boolean\n\ntest \"use `::` operator on keywords `this` and `@`\", ->\n  nonce = {}\n  obj =\n    withAt:   -> @::prop\n    withThis: -> this::prop\n  obj.prototype = prop: nonce\n  eq nonce, obj.withAt()\n  eq nonce, obj.withThis()\n\n\n# Existential Operator (Binary)\n\ntest \"binary existential operator\", ->\n  nonce = {}\n\n  b = a ? nonce\n  eq nonce, b\n\n  a = null\n  b = undefined\n  b = a ? nonce\n  eq nonce, b\n\n  a = false\n  b = a ? nonce\n  eq false, b\n\n  a = 0\n  b = a ? nonce\n  eq 0, b\n\ntest \"binary existential operator conditionally evaluates second operand\", ->\n  i = 1\n  func = -> i -= 1\n  result = func() ? func()\n  eq result, 0\n\ntest \"binary existential operator with negative number\", ->\n  a = null ? - 1\n  eq -1, a\n\n\n# Existential Operator (Unary)\n\ntest \"postfix existential operator\", ->\n  ok (if nonexistent? then false else true)\n  defined = true\n  ok defined?\n  defined = false\n  ok defined?\n\ntest \"postfix existential operator only evaluates its operand once\", ->\n  semaphore = 0\n  fn = ->\n    ok false if semaphore\n    ++semaphore\n  ok(if fn()? then true else false)\n\ntest \"negated postfix existential operator\", ->\n  ok !nothing?.value\n\ntest \"postfix existential operator on expressions\", ->\n  eq true, (1 or 0)?, true\n\n\n# `is`,`isnt`,`==`,`!=`\n\ntest \"`==` and `is` should be interchangeable\", ->\n  a = b = 1\n  ok a is 1 and b == 1\n  ok a == b\n  ok a is b\n\ntest \"`!=` and `isnt` should be interchangeable\", ->\n  a = 0\n  b = 1\n  ok a isnt 1 and b != 0\n  ok a != b\n  ok a isnt b\n\n\n# [not] in/of\n\n# - `in` should check if an array contains a value using `indexOf`\n# - `of` should check if a property is defined on an object using `in`\ntest \"in, of\", ->\n  arr = [1]\n  ok 0 of arr\n  ok 1 in arr\n  # prefixing `not` to `in and `of` should negate them\n  ok 1 not of arr\n  ok 0 not in arr\n\ntest \"`in` should be able to operate on an array literal\", ->\n  ok 2 in [0, 1, 2, 3]\n  ok 4 not in [0, 1, 2, 3]\n  arr = [0, 1, 2, 3]\n  ok 2 in arr\n  ok 4 not in arr\n  # should cache the value used to test the array\n  arr = [0]\n  val = 0\n  ok val++ in arr\n  ok val++ not in arr\n  val = 0\n  ok val++ of arr\n  ok val++ not of arr\n\ntest \"`of` and `in` should be able to operate on instance variables\", ->\n  obj = {\n    list: [2,3]\n    in_list: (value) -> value in @list\n    not_in_list: (value) -> value not in @list\n    of_list: (value) -> value of @list\n    not_of_list: (value) -> value not of @list\n  }\n  ok obj.in_list 3\n  ok obj.not_in_list 1\n  ok obj.of_list 0\n  ok obj.not_of_list 2\n\ntest \"#???: `in` with cache and `__indexOf` should work in argument lists\", ->\n  eq 1, [Object() in Array()].length\n\ntest \"#737: `in` should have higher precedence than logical operators\", ->\n  eq 1, 1 in [1] and 1\n\ntest \"#768: `in` should preserve evaluation order\", ->\n  share = 0\n  a = -> share++ if share is 0\n  b = -> share++ if share is 1\n  c = -> share++ if share is 2\n  ok a() not in [b(),c()]\n  eq 3, share\n\ntest \"#1099: empty array after `in` should compile to `false`\", ->\n  eq 1, [5 in []].length\n  eq false, do -> return 0 in []\n\ntest \"#1354: optimized `in` checks should not happen when splats are present\", ->\n  a = [6, 9]\n  eq 9 in [3, a...], true\n\ntest \"#1100: precedence in or-test compilation of `in`\", ->\n  ok 0 in [1 and 0]\n  ok 0 in [1, 1 and 0]\n  ok not (0 in [1, 0 or 1])\n\ntest \"#1630: `in` should check `hasOwnProperty`\", ->\n  ok undefined not in length: 1\n\ntest \"#1714: lexer bug with raw range `for` followed by `in`\", ->\n  0 for [1..2]\n  ok not ('a' in ['b'])\n\n  0 for [1..2]; ok not ('a' in ['b'])\n\n  0 for [1..10] # comment ending\n  ok not ('a' in ['b'])\n\n  # lexer state (specifically @seenFor) should be reset before each compilation\n  CoffeeScript.compile \"0 for [1..2]\"\n  CoffeeScript.compile \"'a' in ['b']\"\n\ntest \"#1099: statically determined `not in []` reporting incorrect result\", ->\n  ok 0 not in []\n\ntest \"#1099: make sure expression tested gets evaluted when array is empty\", ->\n  a = 0\n  (do -> a = 1) in []\n  eq a, 1\n\n# Chained Comparison\n\ntest \"chainable operators\", ->\n  ok 100 > 10 > 1 > 0 > -1\n  ok -1 < 0 < 1 < 10 < 100\n\ntest \"`is` and `isnt` may be chained\", ->\n  ok true is not false is true is not false\n  ok 0 is 0 isnt 1 is 1\n\ntest \"different comparison operators (`>`,`<`,`is`,etc.) may be combined\", ->\n  ok 1 < 2 > 1\n  ok 10 < 20 > 2+3 is 5\n\ntest \"some chainable operators can be negated by `unless`\", ->\n  ok (true unless 0==10!=100)\n\ntest \"operator precedence: `|` lower than `<`\", ->\n  eq 1, 1 | 2 < 3 < 4\n\ntest \"preserve references\", ->\n  a = b = c = 1\n  # `a == b <= c` should become `a === b && b <= c`\n  # (this test does not seem to test for this)\n  ok a == b <= c\n\ntest \"chained operations should evaluate each value only once\", ->\n  a = 0\n  ok 1 > a++ < 1\n\ntest \"#891: incorrect inversion of chained comparisons\", ->\n  ok (true unless 0 > 1 > 2)\n  ok (true unless (this.NaN = 0/0) < 0/0 < this.NaN)\n\ntest \"#1234: Applying a splat to :: applies the splat to the wrong object\", ->\n  nonce = {}\n  class C\n    method: -> @nonce\n    nonce: nonce\n\n  arr = []\n  eq nonce, C::method arr... # should be applied to `C::`\n\ntest \"#1102: String literal prevents line continuation\", ->\n  eq \"': '\", '' +\n     \"': '\"\n\ntest \"#1703, ---x is invalid JS\", ->\n  x = 2\n  eq (- --x), -1\n\ntest \"Regression with implicit calls against an indented assignment\", ->\n  eq 1, a =\n    1\n\n  eq a, 1\n\ntest \"#2155 ... conditional assignment to a closure\", ->\n  x = null\n  func = -> x ?= (-> if true then 'hi')\n  func()\n  eq x(), 'hi'\n\ntest \"#2197: Existential existential double trouble\", ->\n  counter = 0\n  func = -> counter++\n  func()? ? 100\n  eq counter, 1\n\ntest \"#2567: Optimization of negated existential produces correct result\", ->\n  a = 1\n  ok !(!a?)\n  ok !b?\n\ntest \"#2508: Existential access of the prototype\", ->\n  eq NonExistent?::nothing, undefined\n  eq(\n    NonExistent\n    ?::nothing\n    undefined\n  )\n  ok Object?::toString\n  ok(\n    Object\n    ?::toString\n  )\n\ntest \"floor division operator\", ->\n  eq 2, 7 // 3\n  eq -3, -7 // 3\n  eq NaN, 0 // 0\n\ntest \"floor division operator compound assignment\", ->\n  a = 7\n  a //= 1 + 1\n  eq 3, a\n\ntest \"modulo operator\", ->\n  check = (a, b, expected) ->\n    eq expected, a %% b, \"expected #{a} %%%% #{b} to be #{expected}\"\n  check 0, 1, 0\n  check 0, -1, -0\n  check 1, 0, NaN\n  check 1, 2, 1\n  check 1, -2, -1\n  check 1, 3, 1\n  check 2, 3, 2\n  check 3, 3, 0\n  check 4, 3, 1\n  check -1, 3, 2\n  check -2, 3, 1\n  check -3, 3, 0\n  check -4, 3, 2\n  check 5.5, 2.5, 0.5\n  check -5.5, 2.5, 2.0\n\ntest \"modulo operator compound assignment\", ->\n  a = -2\n  a %%= 5\n  eq 3, a\n\ntest \"modulo operator converts arguments to numbers\", ->\n  eq 1, 1 %% '42'\n  eq 1, '1' %% 42\n  eq 1, '1' %% '42'\n\ntest \"#3361: Modulo operator coerces right operand once\", ->\n  count = 0\n  res = 42 %% valueOf: -> count += 1\n  eq 1, count\n  eq 0, res\n\ntest \"#3363: Modulo operator coercing order\", ->\n  count = 2\n  a = valueOf: -> count *= 2\n  b = valueOf: -> count += 1\n  eq 4, a %% b\n  eq 5, count\n\ntest \"#3598: Unary + and - coerce the operand once when it is an identifier\", ->\n  # Unary + and - do not generate `_ref`s when the operand is a number, for\n  # readability. To make sure that they do when the operand is an identifier,\n  # test that they are consistent with another unary operator as well as another\n  # complex expression.\n  # Tip: Making one of the tests temporarily fail lets you easily inspect the\n  # compiled JavaScript.\n\n  assertOneCoercion = (fn) ->\n    count = 0\n    value = valueOf: -> count++; 1\n    fn value\n    eq 1, count\n\n  eq 1, 1 ? 0\n  eq 1, +1 ? 0\n  eq -1, -1 ? 0\n  assertOneCoercion (a) ->\n    eq 1, +a ? 0\n  assertOneCoercion (a) ->\n    eq -1, -a ? 0\n  assertOneCoercion (a) ->\n    eq -2, ~a ? 0\n  assertOneCoercion (a) ->\n    eq 0.5, a / 2 ? 0\n\n  ok -2 <= 1 < 2\n  ok -2 <= +1 < 2\n  ok -2 <= -1 < 2\n  assertOneCoercion (a) ->\n    ok -2 <= +a < 2\n  assertOneCoercion (a) ->\n    ok -2 <= -a < 2\n  assertOneCoercion (a) ->\n    ok -2 <= ~a < 2\n  assertOneCoercion (a) ->\n    ok -2 <= a / 2 < 2\n\n  arrayEq [0], (n for n in [0] by 1)\n  arrayEq [0], (n for n in [0] by +1)\n  arrayEq [0], (n for n in [0] by -1)\n  assertOneCoercion (a) ->\n    arrayEq [0], (n for n in [0] by +a)\n  assertOneCoercion (a) ->\n    arrayEq [0], (n for n in [0] by -a)\n  assertOneCoercion (a) ->\n    arrayEq [0], (n for n in [0] by ~a)\n  assertOneCoercion (a) ->\n    arrayEq [0], (n for n in [0] by a * 2 / 2)\n\n  ok 1 in [0, 1]\n  ok +1 in [0, 1]\n  ok -1 in [0, -1]\n  assertOneCoercion (a) ->\n    ok +a in [0, 1]\n  assertOneCoercion (a) ->\n    ok -a in [0, -1]\n  assertOneCoercion (a) ->\n    ok ~a in [0, -2]\n  assertOneCoercion (a) ->\n    ok a / 2 in [0, 0.5]\n\ntest \"'new' target\", ->\n  nonce = {}\n  ctor  = -> nonce\n\n  eq (new ctor), nonce\n  eq (new ctor()), nonce\n\n  ok new class\n\n  ctor  = class\n  ok (new ctor) instanceof ctor\n  ok (new ctor()) instanceof ctor\n\n  # Force an executable class body\n  ctor  = class then a = 1\n  ok (new ctor) instanceof ctor\n\n  get   = -> ctor\n  ok (new get()) not instanceof ctor\n  ok (new (get())()) instanceof ctor\n\n  # classes must be called with `new`. In this case `new` applies to `get` only\n  throws -> new get()()\n"
  },
  {
    "path": "test/option_parser.coffee",
    "content": "# Option Parser\n# -------------\n\n# Ensure that the OptionParser handles arguments correctly.\nreturn unless require?\n{OptionParser} = require './../lib/coffeescript/optparse'\n\nflags = [\n  ['-r', '--required [DIR]',  'desc required']\n  ['-o', '--optional',        'desc optional']\n  ['-l', '--list [FILES*]',   'desc list']\n]\n\nbanner = '''\n  banner text\n'''\n\nopt = new OptionParser flags, banner\n\ntest \"basic arguments\", ->\n  args = ['one', 'two', 'three', '-r', 'dir']\n  result = opt.parse args\n  arrayEq args, result.arguments\n  eq undefined, result.required\n\ntest \"boolean and parameterised options\", ->\n  result = opt.parse ['--optional', '-r', 'folder', 'one', 'two']\n  ok result.optional\n  eq 'folder', result.required\n  arrayEq ['one', 'two'], result.arguments\n\ntest \"list options\", ->\n  result = opt.parse ['-l', 'one.txt', '-l', 'two.txt', 'three']\n  arrayEq ['one.txt', 'two.txt'], result.list\n  arrayEq ['three'], result.arguments\n\ntest \"-- and interesting combinations\", ->\n  result = opt.parse ['-o','-r','a','-r','b','-o','--','-a','b','--c','d']\n  arrayEq ['-a', 'b', '--c', 'd'], result.arguments\n  ok result.optional\n  eq 'b', result.required\n\n  args = ['--','-o','a','-r','c','-o','--','-a','arg0','-b','arg1']\n  result = opt.parse args\n  eq undefined, result.optional\n  eq undefined, result.required\n  arrayEq args[1..], result.arguments\n\ntest \"throw if multiple flags try to use the same short or long name\", ->\n  throws -> new OptionParser [\n    ['-r', '--required [DIR]', 'required']\n    ['-r', '--long',           'switch']\n  ]\n\n  throws -> new OptionParser [\n    ['-a', '--append [STR]', 'append']\n    ['-b', '--append',       'append with -b short opt']\n  ]\n\n  throws -> new OptionParser [\n    ['--just-long', 'desc']\n    ['--just-long', 'another desc']\n  ]\n\n  throws -> new OptionParser [\n    ['-j', '--just-long', 'desc']\n    ['--just-long', 'another desc']\n  ]\n\n  throws -> new OptionParser [\n    ['--just-long',       'desc']\n    ['-j', '--just-long', 'another desc']\n  ]\n\ntest \"outputs expected help text\", ->\n  expectedBanner = '''\n\nbanner text\n\n  -r, --required     desc required\n  -o, --optional     desc optional\n  -l, --list         desc list\n\n  '''\n  ok opt.help() is expectedBanner\n\n  expected = [\n    ''\n    '  -r, --required     desc required'\n    '  -o, --optional     desc optional'\n    '  -l, --list         desc list'\n    ''\n  ].join('\\n')\n  ok new OptionParser(flags).help() is expected\n"
  },
  {
    "path": "test/package.coffee",
    "content": "return if window? or testingBrowser?\n\n{EventEmitter}  = require 'events'\n{join}          = require 'path'\n{cwd}           = require 'process'\n{pathToFileURL} = require 'url'\n\n\npackageEntryPath = join cwd(), 'lib/coffeescript/index.js'\npackageEntryUrl  = pathToFileURL packageEntryPath\n\n\ntest \"the coffeescript package exposes all members as named exports in Node\", ->\n\n  requiredPackage = require packageEntryPath\n  requiredKeys = Object.keys requiredPackage\n\n  importedPackage = await import(packageEntryUrl)\n  importedKeys = new Set Object.keys(importedPackage)\n\n  # In `command.coffee`, CoffeeScript extends a `new EventEmitter`;\n  # we want to ignore these additional added keys.\n  eventEmitterKeys = new Set Object.getOwnPropertyNames(Object.getPrototypeOf(new EventEmitter))\n\n  for key in requiredKeys when not eventEmitterKeys.has(key)\n    # Use `eq` test so that missing keys have their names printed in the error message.\n    eq (if importedKeys.has(key) then key else undefined), key\n"
  },
  {
    "path": "test/parser.coffee",
    "content": "# Parser\n# ---------\n\ntest \"operator precedence for logical operators\", ->\n  source = '''\n    a or b and c\n  '''\n  {body: block} = CoffeeScript.nodes source\n  [expression] = block.expressions\n  eq expression.first.base.value, 'a'\n  eq expression.operator, '||'\n  eq expression.second.first.base.value, 'b'\n  eq expression.second.operator, '&&'\n  eq expression.second.second.base.value, 'c'\n\ntest \"operator precedence for bitwise operators\", ->\n  source = '''\n    a | b ^ c & d\n  '''\n  {body: block} = CoffeeScript.nodes source\n  [expression] = block.expressions\n  eq expression.first.base.value, 'a'\n  eq expression.operator, '|'\n  eq expression.second.first.base.value, 'b'\n  eq expression.second.operator, '^'\n  eq expression.second.second.first.base.value, 'c'\n  eq expression.second.second.operator, '&'\n  eq expression.second.second.second.base.value, 'd'\n\ntest \"operator precedence for binary ? operator\", ->\n  source = '''\n     a ? b and c\n  '''\n  {body: block} = CoffeeScript.nodes source\n  [expression] = block.expressions\n  eq expression.first.base.value, 'a'\n  eq expression.operator, '?'\n  eq expression.second.first.base.value, 'b'\n  eq expression.second.operator, '&&'\n  eq expression.second.second.base.value, 'c'\n\ntest \"new calls have a range including the new\", ->\n  source = '''\n    a = new B().c(d)\n  '''\n  {body: block} = CoffeeScript.nodes source\n\n  assertColumnRange = (node, firstColumn, lastColumn) ->\n    eq node.locationData.first_line, 0\n    eq node.locationData.first_column, firstColumn\n    eq node.locationData.last_line, 0\n    eq node.locationData.last_column, lastColumn\n\n  [assign] = block.expressions\n  outerCall = assign.value.base\n  innerValue = outerCall.variable\n  innerCall = innerValue.base\n\n  assertColumnRange assign, 0, 15\n  assertColumnRange outerCall, 4, 15\n  assertColumnRange innerValue, 4, 12\n  assertColumnRange innerCall, 4, 10\n\ntest \"location data is properly set for nested `new`\", ->\n  source = '''\n    new new A()()\n  '''\n  {body: block} = CoffeeScript.nodes source\n\n  assertColumnRange = (node, firstColumn, lastColumn) ->\n    eq node.locationData.first_line, 0\n    eq node.locationData.first_column, firstColumn\n    eq node.locationData.last_line, 0\n    eq node.locationData.last_column, lastColumn\n\n  [{base: outerCall}] = block.expressions\n  innerCall = outerCall.variable\n\n  assertColumnRange outerCall, 0, 12\n  assertColumnRange innerCall, 4, 10\n"
  },
  {
    "path": "test/ranges.coffee",
    "content": "# Range Literals\n# --------------\n\n# TODO: add indexing and method invocation tests: [1..4][0] is 1, [0...3].toString()\n\n# shared array\nshared = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\ntest \"basic inclusive ranges\", ->\n  arrayEq [1, 2, 3] , [1..3]\n  arrayEq [0, 1, 2] , [0..2]\n  arrayEq [0, 1]    , [0..1]\n  arrayEq [0]       , [0..0]\n  arrayEq [-1]      , [-1..-1]\n  arrayEq [-1, 0]   , [-1..0]\n  arrayEq [-1, 0, 1], [-1..1]\n\ntest \"basic exclusive ranges\", ->\n  arrayEq [1, 2, 3] , [1...4]\n  arrayEq [0, 1, 2] , [0...3]\n  arrayEq [0, 1]    , [0...2]\n  arrayEq [0]       , [0...1]\n  arrayEq [-1]      , [-1...0]\n  arrayEq [-1, 0]   , [-1...1]\n  arrayEq [-1, 0, 1], [-1...2]\n\n  arrayEq [], [1...1]\n  arrayEq [], [0...0]\n  arrayEq [], [-1...-1]\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  arrayEq [1, 2, 3] , [1 ... 4]\n  arrayEq [0, 1, 2] , [0 ... 3]\n  arrayEq [0, 1]    , [0 ... 2]\n  arrayEq [0]       , [0 ... 1]\n  arrayEq [-1]      , [-1 ... 0]\n  arrayEq [-1, 0]   , [-1 ... 1]\n  arrayEq [-1, 0, 1], [-1 ... 2]\n\n  arrayEq [], [1 ... 1]\n  arrayEq [], [0 ... 0]\n  arrayEq [], [-1 ... -1]\n\ntest \"downward ranges\", ->\n  arrayEq shared, [9..0].reverse()\n  arrayEq [5, 4, 3, 2] , [5..2]\n  arrayEq [2, 1, 0, -1], [2..-1]\n\n  arrayEq [3, 2, 1]  , [3..1]\n  arrayEq [2, 1, 0]  , [2..0]\n  arrayEq [1, 0]     , [1..0]\n  arrayEq [0]        , [0..0]\n  arrayEq [-1]       , [-1..-1]\n  arrayEq [0, -1]    , [0..-1]\n  arrayEq [1, 0, -1] , [1..-1]\n  arrayEq [0, -1, -2], [0..-2]\n\n  arrayEq [4, 3, 2], [4...1]\n  arrayEq [3, 2, 1], [3...0]\n  arrayEq [2, 1]   , [2...0]\n  arrayEq [1]      , [1...0]\n  arrayEq []       , [0...0]\n  arrayEq []       , [-1...-1]\n  arrayEq [0]      , [0...-1]\n  arrayEq [0, -1]  , [0...-2]\n  arrayEq [1, 0]   , [1...-1]\n  arrayEq [2, 1, 0], [2...-1]\n\ntest \"ranges with variables as enpoints\", ->\n  [a, b] = [1, 3]\n  arrayEq [1, 2, 3], [a..b]\n  arrayEq [1, 2]   , [a...b]\n  b = -2\n  arrayEq [1, 0, -1, -2], [a..b]\n  arrayEq [1, 0, -1]    , [a...b]\n\ntest \"ranges with expressions as endpoints\", ->\n  [a, b] = [1, 3]\n  arrayEq [2, 3, 4, 5, 6], [(a+1)..2*b]\n  arrayEq [2, 3, 4, 5]   , [(a+1)...2*b]\n\n  # Should not trigger implicit call, e.g. rest ... => rest(...)\n  arrayEq [2, 3, 4, 5]   , [(a+1) ... 2*b]\n\ntest \"large ranges are generated with looping constructs\", ->\n  down = [99..0]\n  eq 100, (len = down.length)\n  eq   0, down[len - 1]\n\n  up = [0...100]\n  eq 100, (len = up.length)\n  eq  99, up[len - 1]\n\ntest \"for-from loops over ranges\", ->\n  array1 = []\n  for x from [20..30]\n    array1.push(x)\n    break if x is 25\n  arrayEq array1, [20, 21, 22, 23, 24, 25]\n\ntest \"for-from comprehensions over ranges\", ->\n  array1 = (x + 10 for x from [20..25])\n  ok array1.join(' ') is '30 31 32 33 34 35'\n\n  array2 = (x for x from [20..30] when x %% 2 == 0)\n  ok array2.join(' ') is '20 22 24 26 28 30'\n\ntest \"#1012 slices with arguments object\", ->\n  expected = [0..9]\n  argsAtStart = (-> [arguments[0]..9]) 0\n  arrayEq expected, argsAtStart\n  argsAtEnd = (-> [0..arguments[0]]) 9\n  arrayEq expected, argsAtEnd\n  argsAtBoth = (-> [arguments[0]..arguments[1]]) 0, 9\n  arrayEq expected, argsAtBoth\n\ntest \"#1409: creating large ranges outside of a function body\", ->\n  CoffeeScript.eval '[0..100]'\n\ntest \"#2047: Infinite loop possible when `for` loop with `range` uses variables\", ->\n  up = 1\n  down = -1\n  a = 1\n  b = 5\n\n  testRange = (arg) ->\n    [from, to, step, expectedResult] = arg\n    r = (x for x in [from..to] by step)\n    arrayEq r, expectedResult\n\n  testData = [\n    [1, 5, 1, [1..5]]\n    [1, 5, -1, []]\n    [1, 5, up, [1..5]]\n    [1, 5, down, []]\n\n    [a, 5, 1, [1..5]]\n    [a, 5, -1, []]\n    [a, 5, up, [1..5]]\n    [a, 5, down, []]\n\n    [1, b, 1, [1..5]]\n    [1, b, -1, []]\n    [1, b, up, [1..5]]\n    [1, b, down, []]\n\n    [a, b, 1, [1..5]]\n    [a, b, -1, []]\n    [a, b, up, [1..5]]\n    [a, b, down, []]\n\n    [5, 1, 1, []]\n    [5, 1, -1, [5..1]]\n    [5, 1, up, []]\n    [5, 1, down,  [5..1]]\n\n    [5, a, 1, []]\n    [5, a, -1, [5..1]]\n    [5, a, up, []]\n    [5, a, down, [5..1]]\n\n    [b, 1, 1, []]\n    [b, 1, -1, [5..1]]\n    [b, 1, up, []]\n    [b, 1, down, [5..1]]\n\n    [b, a, 1, []]\n    [b, a, -1, [5..1]]\n    [b, a, up, []]\n    [b, a, down, [5..1]]\n  ]\n\n  testRange d for d in testData\n\ntest \"#2047: from, to and step as variables\", ->\n  up = 1\n  down = -1\n  a = 1\n  b = 5\n\n  r = (x for x in [a..b] by up)\n  arrayEq r, [1..5]\n\n  r = (x for x in [a..b] by down)\n  arrayEq r, []\n\n  r = (x for x in [b..a] by up)\n  arrayEq r, []\n\n  r = (x for x in [b..a] by down)\n  arrayEq r, [5..1]\n\n  a = 1\n  b = -1\n  step = 0\n  r = (x for x in [b..a] by step)\n  arrayEq r, []\n\ntest \"#4884: Range not declaring var for the 'i'\", ->\n  'use strict'\n  [0..21].forEach (idx) ->\n    idx + 1\n\n  eq global.i, undefined\n\ntest \"#4889: `for` loop unexpected behavior\", ->\n  n = 1\n  result = []\n  for i in [0..n]\n    result.push i\n    for j in [(i+1)..n]\n      result.push j\n\n  arrayEq result, [0,1,1,2,1]\n\ntest \"#4889: `for` loop unexpected behavior with `by 1` on second loop\", ->\n  n = 1\n  result = []\n  for i in [0..n]\n    result.push i\n    for j in [(i+1)..n] by 1\n      result.push j\n\n  arrayEq result, [0,1,1]\n\ntest \"countdown example from docs\", ->\n  countdown = (num for num in [10..1])\n  arrayEq countdown, [10,9,8,7,6,5,4,3,2,1]\n\ntest \"counting up when the range goes down returns an empty array\", ->\n  countdown = (num for num in [10..1] by 1)\n  arrayEq countdown, []\n\ntest \"counting down when the range goes up returns an empty array\", ->\n  countup = (num for num in [1..10] by -1)\n  arrayEq countup, []\n\ntest \"counting down by too much returns just the first value\", ->\n  countdown = (num for num in [10..1] by -100)\n  arrayEq countdown, [10]\n\ntest \"counting up by too much returns just the first value\", ->\n  countup = (num for num in [1..10] by 100)\n  arrayEq countup, [1]\n"
  },
  {
    "path": "test/regex.coffee",
    "content": "# Regular Expression Literals\n# ---------------------------\n\n# TODO: add method invocation tests: /regex/.toString()\n\n# * Regexen\n# * Heregexen\n\ntest \"basic regular expression literals\", ->\n  ok 'a'.match(/a/)\n  ok 'a'.match /a/\n  ok 'a'.match(/a/g)\n  ok 'a'.match /a/g\n\ntest \"division is not confused for a regular expression\", ->\n  # Any spacing around the slash is allowed when it cannot be a regex.\n  eq 2, 4 / 2 / 1\n  eq 2, 4/2/1\n  eq 2, 4/ 2 / 1\n  eq 2, 4 /2 / 1\n  eq 2, 4 / 2/ 1\n  eq 2, 4 / 2 /1\n  eq 2, 4 /2/ 1\n\n  a = (regex) -> regex.test 'a b c'\n  a.valueOf = -> 4\n  b = 2\n  g = 1\n\n  eq 2, a / b/g\n  eq 2, a/ b/g\n  eq 2, a / b/ g\n  eq 2, a\t/\tb/g # Tabs.\n  eq 2, a / b/g # Non-breaking spaces.\n  eq true, a /b/g\n  # Use parentheses to disambiguate.\n  eq true, a(/ b/g)\n  eq true, a(/ b/)\n  eq true, a (/ b/)\n  # Escape to disambiguate.\n  eq true, a /\\ b/g\n  eq false, a\t/\\\tb/g\n  eq true, a /\\ b/\n\n  obj = method: -> 2\n  two = 2\n  eq 2, (obj.method()/two + obj.method()/two)\n\n  i = 1\n  eq 2, (4)/2/i\n  eq 1, i/i/i\n\n  a = ''\n  a += ' ' until /   /.test a\n  eq a, '   '\n\n  a = if /=/.test '=' then yes else no\n  eq a, yes\n\n  a = if !/=/.test '=' then yes else no\n  eq a, no\n\n  #3182:\n  match = 'foo=bar'.match /=/\n  eq match[0], '='\n\n  #3410:\n  ok ' '.match(/ /)[0] is ' '\n\n\ntest \"division vs regex after a callable token\", ->\n  b = 2\n  g = 1\n  r = (r) -> r.test 'b'\n\n  a = 4\n  eq 2, a / b/g\n  eq 2, a/b/g\n  eq 2, a/ b/g\n  eq true, r /b/g\n  eq 2, (1 + 3) / b/g\n  eq 2, (1 + 3)/b/g\n  eq 2, (1 + 3)/ b/g\n  eq true, (r) /b/g\n  eq 2, [4][0] / b/g\n  eq 2, [4][0]/b/g\n  eq 2, [4][0]/ b/g\n  eq true, [r][0] /b/g\n  eq 0.5, 4? / b/g\n  eq 0.5, 4?/b/g\n  eq 0.5, 4?/ b/g\n  eq true, r? /b/g\n  (->\n    eq 2, @ / b/g\n    eq 2, @/b/g\n    eq 2, @/ b/g\n  ).call 4\n  (->\n    eq true, @ /b/g\n  ).call r\n  (->\n    eq 2, this / b/g\n    eq 2, this/b/g\n    eq 2, this/ b/g\n  ).call 4\n  (->\n    eq true, this /b/g\n  ).call r\n  class A\n    p: (regex) -> if regex then r regex else 4\n  class B extends A\n    p: ->\n      eq 2, super() / b/g\n      eq 2, super()/b/g\n      eq 2, super()/ b/g\n      eq true, super /b/g\n  new B().p()\n\ntest \"always division and never regex after some tokens\", ->\n  b = 2\n  g = 1\n\n  eq 2, 4 / b/g\n  eq 2, 4/b/g\n  eq 2, 4/ b/g\n  eq 2, 4 /b/g\n  eq 2, \"4\" / b/g\n  eq 2, \"4\"/b/g\n  eq 2, \"4\"/ b/g\n  eq 2, \"4\" /b/g\n  eq 20, \"4#{0}\" / b/g\n  eq 20, \"4#{0}\"/b/g\n  eq 20, \"4#{0}\"/ b/g\n  eq 20, \"4#{0}\" /b/g\n  ok isNaN /a/ / b/g\n  ok isNaN /a/i / b/g\n  ok isNaN /a//b/g\n  ok isNaN /a/i/b/g\n  ok isNaN /a// b/g\n  ok isNaN /a/i/ b/g\n  ok isNaN /a/ /b/g\n  ok isNaN /a/i /b/g\n  eq 0.5, true / b/g\n  eq 0.5, true/b/g\n  eq 0.5, true/ b/g\n  eq 0.5, true /b/g\n  eq 0, false / b/g\n  eq 0, false/b/g\n  eq 0, false/ b/g\n  eq 0, false /b/g\n  eq 0, null / b/g\n  eq 0, null/b/g\n  eq 0, null/ b/g\n  eq 0, null /b/g\n  ok isNaN undefined / b/g\n  ok isNaN undefined/b/g\n  ok isNaN undefined/ b/g\n  ok isNaN undefined /b/g\n  ok isNaN {a: 4} / b/g\n  ok isNaN {a: 4}/b/g\n  ok isNaN {a: 4}/ b/g\n  ok isNaN {a: 4} /b/g\n  o = prototype: 4\n  eq 2, o:: / b/g\n  eq 2, o::/b/g\n  eq 2, o::/ b/g\n  eq 2, o:: /b/g\n  i = 4\n  eq 2.0, i++ / b/g\n  eq 2.5, i++/b/g\n  eq 3.0, i++/ b/g\n  eq 3.5, i++ /b/g\n  eq 4.0, i-- / b/g\n  eq 3.5, i--/b/g\n  eq 3.0, i--/ b/g\n  eq 2.5, i-- /b/g\n\ntest \"compound division vs regex\", ->\n  c = 4\n  i = 2\n\n  a = 10\n  b = a /= c / i\n  eq a, 5\n\n  a = 10\n  b = a /= c /i\n  eq a, 5\n\n  a = 10\n  b = a\t/=\tc /i # Tabs.\n  eq a, 5\n\n  a = 10\n  b = a /= c /i # Non-breaking spaces.\n  eq a, 5\n\n  a = 10\n  b = a/= c /i\n  eq a, 5\n\n  a = 10\n  b = a/=c/i\n  eq a, 5\n\n  a = (regex) -> regex.test '=C '\n  b = a /=c /i\n  eq b, true\n\n  a = (regex) -> regex.test '= C '\n  # Use parentheses to disambiguate.\n  b = a(/= c /i)\n  eq b, true\n  b = a(/= c /)\n  eq b, false\n  b = a (/= c /)\n  eq b, false\n  # Escape to disambiguate.\n  b = a /\\= c /i\n  eq b, true\n  b = a /\\= c /\n  eq b, false\n\ntest \"#764: regular expressions should be indexable\", ->\n  eq /0/['source'], ///#{0}///['source']\n\ntest \"#584: slashes are allowed unescaped in character classes\", ->\n  ok /^a\\/[/]b$/.test 'a//b'\n\ntest \"does not allow to escape newlines\", ->\n  throwsCompileError '/a\\\\\\nb/'\n\n\n# Heregexe(n|s)\n\ntest \"a heregex will ignore whitespace and comments\", ->\n  eq /^I'm\\x20+[a]\\s+Heregex?\\/\\/\\//gim + '', ///\n    ^ I'm \\x20+ [a] \\s+\n    Heregex? / // # or not\n  ///gim + ''\n\ntest \"an empty heregex will compile to an empty, non-capturing group\", ->\n  eq /(?:)/ + '', ///  /// + ''\n  eq /(?:)/ + '', ////// + ''\n\ntest \"heregex starting with slashes\", ->\n  ok /////a/\\////.test ' //a// '\n\ntest '#2388: `///` in heregex interpolations', ->\n  ok ///a#{///b///}c///.test ' /a/b/c/ '\n  ws = ' \\t'\n  scan = (regex) -> regex.exec('\\t  foo')[0]\n  eq '/\\t  /', /// #{scan /// [#{ws}]* ///} /// + ''\n\ntest \"regexes are not callable\", ->\n  throwsCompileError '/a/()'\n  throwsCompileError '///a#{b}///()'\n  throwsCompileError '/a/ 1'\n  throwsCompileError '///a#{b}/// 1'\n  throwsCompileError '''\n    /a/\n       k: v\n  '''\n  throwsCompileError '''\n    ///a#{b}///\n       k: v\n  '''\n\ntest \"backreferences\", ->\n  ok /(a)(b)\\2\\1/.test 'abba'\n\ntest \"#3795: Escape otherwise invalid characters\", ->\n  ok (/ /).test '\\u2028'\n  ok (/ /).test '\\u2029'\n  ok ///\\ ///.test '\\u2028'\n  ok ///\\ ///.test '\\u2029'\n  ok ///a b///.test 'ab' # The space is U+2028.\n  ok ///a b///.test 'ab' # The space is U+2029.\n  ok ///\\0\n      1///.test '\\x001'\n\n  a = 'a'\n  ok ///#{a} b///.test 'ab' # The space is U+2028.\n  ok ///#{a} b///.test 'ab' # The space is U+2029.\n  ok ///#{a}\\ ///.test 'a\\u2028'\n  ok ///#{a}\\ ///.test 'a\\u2029'\n  ok ///#{a}\\0\n      1///.test 'a\\x001'\n\ntest \"#4248: Unicode code point escapes\", ->\n  ok /a\\u{1ab}c/u.test 'a\\u01abc'\n  ok ///#{ 'a' }\\u{000001ab}c///u.test 'a\\u{1ab}c'\n  ok ///a\\u{000001ab}c///u.test 'a\\u{1ab}c'\n  ok /a\\u{12345}c/u.test 'a\\ud808\\udf45c'\n\n  # and now without u flag\n  ok /a\\u{1ab}c/.test 'a\\u01abc'\n  ok ///#{ 'a' }\\u{000001ab}c///.test 'a\\u{1ab}c'\n  ok ///a\\u{000001ab}c///.test 'a\\u{1ab}c'\n  ok /a\\u{12345}c/.test 'a\\ud808\\udf45c'\n\n  # rewrite code point escapes unless u flag is set\n  eqJS \"\"\"\n    /\\\\u{bcdef}\\\\u{abc}/u\n  \"\"\",\n  \"\"\"\n    /\\\\u{bcdef}\\\\u{abc}/u;\n  \"\"\"\n\n  eqJS \"\"\"\n    ///#{ 'a' }\\\\u{bcdef}///\n  \"\"\",\n  \"\"\"\n    /a\\\\udab3\\\\uddef/;\n  \"\"\"\n\ntest \"#4811, heregex comments with ///\", ->\n  eqJS \"\"\"\n    ///\n      a | # comment with ///\n      b   # /// 'heregex' in comment will be consumed\n    ///\n  \"\"\",\n  \"\"\"\n   // comment with ///\n   // /// 'heregex' in comment will be consumed\n   /a|b/;\n  \"\"\"\n"
  },
  {
    "path": "test/regex_dotall.coffee",
    "content": "# Regex “dotall” flag, or `s`, is only supported in Node 9+, so put tests for\n# the feature in their own file. The feature detection in `Cakefile` that\n# causes this test to load is adapted from\n# https://github.com/tc39/proposal-regexp-dotall-flag#proposed-solution.\n\ntest \"dotall flag\", ->\n  doesNotThrow -> /a.b/s.test 'a\\nb'\n"
  },
  {
    "path": "test/repl.coffee",
    "content": "return if global.testingBrowser\n\nos = require 'os'\nfs = require 'fs'\npath = require 'path'\n\n# REPL\n# ----\nStream = require 'stream'\n\nclass MockInputStream extends Stream\n  constructor: ->\n    super()\n    @readable = true\n\n  resume: ->\n\n  emitLine: (val) ->\n    @emit 'data', Buffer.from(\"#{val}\\n\")\n\nclass MockOutputStream extends Stream\n  constructor: ->\n    super()\n    @writable = true\n    @written = []\n\n  write: (data) ->\n    # console.log 'output write', arguments\n    @written.push data\n\n  lastWrite: (fromEnd = -1) ->\n    @written[@written.length - 1 + fromEnd].replace /\\r?\\n$/, ''\n\n# Create a dummy history file\nhistoryFile = path.join os.tmpdir(), '.coffee_history_test'\nfs.writeFileSync historyFile, '1 + 2\\n'\n\ntestRepl = (desc, fn) ->\n  input = new MockInputStream\n  output = new MockOutputStream\n  repl = Repl.start {input, output, historyFile}\n  test desc, -> fn input, output, repl\n\nctrlV = { ctrl: true, name: 'v'}\n\n\ntestRepl 'reads history file', (input, output, repl) ->\n  input.emitLine repl.history[0]\n  eq '3', output.lastWrite()\n\ntestRepl \"starts with coffee prompt\", (input, output) ->\n  eq 'coffee> ', output.lastWrite(0)\n\ntestRepl \"writes eval to output\", (input, output) ->\n  input.emitLine '1+1'\n  eq '2', output.lastWrite()\n\ntestRepl \"comments are ignored\", (input, output) ->\n  input.emitLine '1 + 1 #foo'\n  eq '2', output.lastWrite()\n\ntestRepl \"output in inspect mode\", (input, output) ->\n  input.emitLine '\"1 + 1\\\\n\"'\n  eq \"'1 + 1\\\\n'\", output.lastWrite()\n\ntestRepl \"variables are saved\", (input, output) ->\n  input.emitLine \"foo = 'foo'\"\n  input.emitLine 'foobar = \"#{foo}bar\"'\n  eq \"'foobar'\", output.lastWrite()\n\ntestRepl \"empty command evaluates to undefined\", (input, output) ->\n  # A regression fixed in Node 5.11.0 broke the handling of pressing enter in\n  # the Node REPL; see https://github.com/nodejs/node/pull/6090 and\n  # https://github.com/jashkenas/coffeescript/issues/4502.\n  # Just skip this test for versions of Node < 6.\n  return if parseInt(process.versions.node.split('.')[0], 10) < 6\n  input.emitLine ''\n  eq 'undefined', output.lastWrite()\n\ntestRepl \"#4763: comment evaluates to undefined\", (input, output) ->\n  input.emitLine '# comment'\n  eq 'undefined', output.lastWrite()\n\ntestRepl \"#4763: multiple comments evaluate to undefined\", (input, output) ->\n  input.emitLine '### a ### ### b ### # c'\n  eq 'undefined', output.lastWrite()\n\ntestRepl \"ctrl-v toggles multiline prompt\", (input, output) ->\n  input.emit 'keypress', null, ctrlV\n  eq '------> ', output.lastWrite(0)\n  input.emit 'keypress', null, ctrlV\n  eq 'coffee> ', output.lastWrite(0)\n\ntestRepl \"multiline continuation changes prompt\", (input, output) ->\n  input.emit 'keypress', null, ctrlV\n  input.emitLine ''\n  eq '....... ', output.lastWrite(0)\n\ntestRepl \"evaluates multiline\", (input, output) ->\n  # Stubs. Could assert on their use.\n  output.cursorTo = (pos) ->\n  output.clearLine = ->\n\n  input.emit 'keypress', null, ctrlV\n  input.emitLine 'do ->'\n  input.emitLine '  1 + 1'\n  input.emit 'keypress', null, ctrlV\n  eq '2', output.lastWrite()\n\ntestRepl \"variables in scope are preserved\", (input, output) ->\n  input.emitLine 'a = 1'\n  input.emitLine 'do -> a = 2'\n  input.emitLine 'a'\n  eq '2', output.lastWrite()\n\ntestRepl \"existential assignment of previously declared variable\", (input, output) ->\n  input.emitLine 'a = null'\n  input.emitLine 'a ?= 42'\n  eq '42', output.lastWrite()\n\ntestRepl \"keeps running after runtime error\", (input, output) ->\n  input.emitLine 'a = b'\n  input.emitLine 'a'\n  eq 'undefined', output.lastWrite()\n\ntestRepl \"#4604: wraps an async function\", (input, output) ->\n  return unless try new Function 'async () => {}' # Feature detect support for async functions.\n  input.emitLine 'await new Promise (resolve) -> setTimeout (-> resolve 33), 10'\n  setTimeout ->\n    eq '33', output.lastWrite()\n  , 20\n\ntestRepl \"transpile REPL\", (input, output) ->\n  input.emitLine 'require(\"./test/importing/transpile_import\").getSep()'\n  eq \"'#{path.sep.replace '\\\\', '\\\\\\\\'}'\", output.lastWrite()\n\nprocess.on 'exit', ->\n  try\n    fs.unlinkSync historyFile\n  catch exception # Already deleted, nothing else to do.\n"
  },
  {
    "path": "test/scope.coffee",
    "content": "# Scope\n# -----\n\n# * Variable Safety\n# * Variable Shadowing\n# * Auto-closure (`do`)\n# * Global Scope Leaks\n\ntest \"reference `arguments` inside of functions\", ->\n  sumOfArgs = ->\n    sum = (a,b) -> a + b\n    sum = 0\n    sum += num for num in arguments\n    sum\n  eq 10, sumOfArgs(0, 1, 2, 3, 4)\n\ntest \"assignment to an Object.prototype-named variable should not leak to outer scope\", ->\n  # FIXME: fails on IE\n  (->\n    constructor = 'word'\n  )()\n  ok constructor isnt 'word'\n\ntest \"siblings of splat parameters shouldn't leak to surrounding scope\", ->\n  x = 10\n  oops = (x, args...) ->\n  oops(20, 1, 2, 3)\n  eq x, 10\n\ntest \"catch statements should introduce their argument to scope\", ->\n  try throw ''\n  catch e\n    do -> e = 5\n    eq 5, e\n\ntest \"loop variable should be accessible after for-of loop\", ->\n  d = (x for x of {1:'a',2:'b'})\n  ok x in ['1','2']\n\ntest \"loop variable should be accessible after for-in loop\", ->\n  d = (x for x in [1,2])\n  eq x, 2\n\ntest \"loop variable should be accessible after for-from loop\", ->\n  d = (x for x from [1,2])\n  eq x, 2\n\nclass Array then slice: fail # needs to be global\nclass Object then hasOwnProperty: fail\ntest \"#1973: redefining Array/Object constructors shouldn't confuse __X helpers\", ->\n  arr = [1..4]\n  arrayEq [3, 4], arr[2..]\n  obj = {arr}\n  for own k of obj\n    eq arr, obj[k]\n\ntest \"#2255: global leak with splatted @-params\", ->\n  ok not x?\n  arrayEq [0], ((@x...) -> @x).call {}, 0\n  ok not x?\n\ntest \"#1183: super + fat arrows\", ->\n  dolater = (cb) -> cb()\n\n  class A\n    constructor: ->\n      @_i = 0\n    foo : (cb) ->\n      dolater =>\n        @_i += 1\n        cb()\n\n  class B extends A\n    constructor : ->\n      super()\n    foo : (cb) ->\n      dolater =>\n        dolater =>\n          @_i += 2\n          super cb\n\n  b = new B\n  b.foo => eq b._i, 3\n\ntest \"#1183: super + wrap\", ->\n  class A\n    m : -> 10\n\n  class B extends A\n    constructor : -> super()\n    m: -> r = try super()\n    m: -> r = super()\n\n  eq (new B).m(), 10\n\ntest \"#1183: super + closures\", ->\n  class A\n    constructor: ->\n      @i = 10\n    foo : -> @i\n\n  class B extends A\n    foo : ->\n      ret = switch 1\n        when 0 then 0\n        when 1 then super()\n      ret\n  eq (new B).foo(), 10\n\ntest \"#2331: bound super regression\", ->\n  class A\n    @value = 'A'\n    method: -> @constructor.value\n\n  class B extends A\n    method: => super()\n\n  eq (new B).method(), 'A'\n\ntest \"#3259: leak with @-params within destructured parameters\", ->\n  fn = ({@foo}, [@bar], [{@baz}]) ->\n    foo = bar = baz = false\n\n  fn.call {}, {foo: 'foo'}, ['bar'], [{baz: 'baz'}]\n\n  eq 'undefined', typeof foo\n  eq 'undefined', typeof bar\n  eq 'undefined', typeof baz\n"
  },
  {
    "path": "test/slicing_and_splicing.coffee",
    "content": "# Slicing and Splicing\n# --------------------\n\n# * Slicing\n# * Splicing\n\n# shared array\nshared = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\n# Slicing\n\ntest \"basic slicing\", ->\n  arrayEq [7, 8, 9]   , shared[7..9]\n  arrayEq [2, 3]      , shared[2...4]\n  arrayEq [2, 3, 4, 5], shared[2...6]\n\ntest \"slicing with variables as endpoints\", ->\n  [a, b] = [1, 4]\n  arrayEq [1, 2, 3, 4], shared[a..b]\n  arrayEq [1, 2, 3]   , shared[a...b]\n\ntest \"slicing with expressions as endpoints\", ->\n  [a, b] = [1, 3]\n  arrayEq [2, 3, 4, 5, 6], shared[(a+1)..2*b]\n  arrayEq [2, 3, 4, 5]   , shared[a+1...(2*b)]\n\ntest \"unbounded slicing\", ->\n  arrayEq [7, 8, 9]   , shared[7..]\n  arrayEq [8, 9]      , shared[-2..]\n  arrayEq [9]         , shared[-1...]\n  arrayEq [0, 1, 2]   , shared[...3]\n  arrayEq [0, 1, 2, 3], shared[..-7]\n\n  arrayEq shared      , shared[..-1]\n  arrayEq shared[0..8], shared[...-1]\n\n  for a in [-shared.length..shared.length]\n    arrayEq shared[a..] , shared[a...]\n  for a in [-shared.length+1...shared.length]\n    arrayEq shared[..a][...-1] , shared[...a]\n\n  arrayEq [1, 2, 3], [1, 2, 3][..]\n\ntest \"#930, #835, #831, #746 #624: inclusive slices to -1 should slice to end\", ->\n  arrayEq shared, shared[0..-1]\n  arrayEq shared, shared[..-1]\n  arrayEq shared.slice(1,shared.length), shared[1..-1]\n\ntest \"string slicing\", ->\n  str = \"abcdefghijklmnopqrstuvwxyz\"\n  ok str[1...1] is \"\"\n  ok str[1..1] is \"b\"\n  ok str[1...5] is \"bcde\"\n  ok str[0..4] is \"abcde\"\n  ok str[-5..] is \"vwxyz\"\n\ntest \"#1722: operator precedence in unbounded slice compilation\", ->\n  list = [0..9]\n  n = 2 # some truthy number in `list`\n  arrayEq [0..n], list[..n]\n  arrayEq [0..n], list[..n or 0]\n  arrayEq [0..n], list[..if n then n else 0]\n\ntest \"#2349: inclusive slicing to numeric strings\", ->\n  arrayEq [0, 1], [0..10][..\"1\"]\n\ntest \"#4631: slicing with space before and/or after the dots\", ->\n  a = (s) -> s\n  b = [4, 5, 6]\n  c = [7, 8, 9]\n  arrayEq [2, 3, 4], shared[2 ... 5]\n  arrayEq [3, 4, 5], shared[3... 6]\n  arrayEq [4, 5, 6], shared[4 ...7]\n  arrayEq shared[(a b...)...(a c...)]  , shared[(a ...b)...(a ...c)]\n  arrayEq shared[(a b...) ... (a c...)], shared[(a ...b) ... (a ...c)]\n  arrayEq shared[(a b...)... (a c...)] , shared[(a ...b)... (a ...c)]\n  arrayEq shared[(a b...) ...(a c...)] , shared[(a ...b) ...(a ...c)]\n\n\n# Splicing\n\ntest \"basic splicing\", ->\n  ary = [0..9]\n  ary[5..9] = [0, 0, 0]\n  arrayEq [0, 1, 2, 3, 4, 0, 0, 0], ary\n\n  ary = [0..9]\n  ary[2...8] = []\n  arrayEq [0, 1, 8, 9], ary\n\ntest \"unbounded splicing\", ->\n  ary = [0..9]\n  ary[3..] = [9, 8, 7]\n  arrayEq [0, 1, 2, 9, 8, 7]. ary\n\n  ary[...3] = [7, 8, 9]\n  arrayEq [7, 8, 9, 9, 8, 7], ary\n\n  ary[..] = [1, 2, 3]\n  arrayEq [1, 2, 3], ary\n\ntest \"splicing with variables as endpoints\", ->\n  [a, b] = [1, 8]\n\n  ary = [0..9]\n  ary[a..b] = [2, 3]\n  arrayEq [0, 2, 3, 9], ary\n\n  ary = [0..9]\n  ary[a...b] = [5]\n  arrayEq [0, 5, 8, 9], ary\n\ntest \"splicing with expressions as endpoints\", ->\n  [a, b] = [1, 3]\n\n  ary = [0..9]\n  ary[ a+1 .. 2*b+1 ] = [4]\n  arrayEq [0, 1, 4, 8, 9], ary\n\n  ary = [0..9]\n  ary[a+1...2*b+1] = [4]\n  arrayEq [0, 1, 4, 7, 8, 9], ary\n\ntest \"splicing to the end, against a one-time function\", ->\n  ary = null\n  fn = ->\n    if ary\n      throw 'err'\n    else\n      ary = [1, 2, 3]\n\n  fn()[0..] = 1\n\n  arrayEq ary, [1]\n\ntest \"the return value of a splice literal should be the RHS\", ->\n  ary = [0, 0, 0]\n  eq (ary[0..1] = 2), 2\n\n  ary = [0, 0, 0]\n  eq (ary[0..] = 3), 3\n\n  arrayEq [ary[0..0] = 0], [0]\n\ntest \"#1723: operator precedence in unbounded splice compilation\", ->\n  n = 4 # some truthy number in `list`\n\n  list = [0..9]\n  list[..n] = n\n  arrayEq [n..9], list\n\n  list = [0..9]\n  list[..n or 0] = n\n  arrayEq [n..9], list\n\n  list = [0..9]\n  list[..if n then n else 0] = n\n  arrayEq [n..9], list\n\ntest \"#2953: methods on endpoints in assignment from array splice literal\", ->\n  list = [0..9]\n\n  Number.prototype.same = -> this\n  list[1.same()...9.same()] = 5\n  delete Number.prototype.same\n\n  arrayEq [0, 5, 9], list\n\ntest \"#1726: `Op` expression in property access causes unexpected results\", ->\n  a = [0..2]\n  arrayEq a, a[(!1 in a)..]\n  arrayEq a, a[!1 in a..]\n  arrayEq a[(!1 in a)..], a[(!1 in a)..]\n"
  },
  {
    "path": "test/soaks.coffee",
    "content": "# Soaks\n# -----\n\n# * Soaked Property Access\n# * Soaked Method Invocation\n# * Soaked Function Invocation\n\n\n# Soaked Property Access\n\ntest \"soaked property access\", ->\n  nonce = {}\n  obj = a: b: nonce\n  eq nonce    , obj?.a.b\n  eq nonce    , obj?['a'].b\n  eq nonce    , obj.a?.b\n  eq nonce    , obj?.a?['b']\n  eq undefined, obj?.a?.non?.existent?.property\n\ntest \"soaked property access caches method calls\", ->\n  nonce ={}\n  obj = fn: -> a: nonce\n  eq nonce    , obj.fn()?.a\n  eq undefined, obj.fn()?.b\n\ntest \"soaked property access caching\", ->\n  nonce = {}\n  counter = 0\n  fn = ->\n    counter++\n    'self'\n  obj =\n    self: -> @\n    prop: nonce\n  eq nonce, obj[fn()]()[fn()]()[fn()]()?.prop\n  eq 3, counter\n\ntest \"method calls on soaked methods\", ->\n  nonce = {}\n  obj = null\n  eq undefined, obj?.a().b()\n  obj = a: -> b: -> nonce\n  eq nonce    , obj?.a().b()\n\ntest \"postfix existential operator mixes well with soaked property accesses\", ->\n  eq false, nonexistent?.property?\n\ntest \"function invocation with soaked property access\", ->\n  id = (_) -> _\n  eq undefined, id nonexistent?.method()\n\ntest \"if-to-ternary should safely parenthesize soaked property accesses\", ->\n  ok (if nonexistent?.property then false else true)\n\ntest \"#726: don't check for a property on a conditionally-referenced nonexistent thing\", ->\n  eq undefined, nonexistent?[Date()]\n\ntest \"#756: conditional assignment edge cases\", ->\n  # TODO: improve this test\n  a = null\n  ok isNaN      a?.b.c +  1\n  eq undefined, a?.b.c += 1\n  eq undefined, ++a?.b.c\n  eq undefined, delete a?.b.c\n\ntest \"operations on soaked properties\", ->\n  # TODO: improve this test\n  a = b: {c: 0}\n  eq 1,   a?.b.c +  1\n  eq 1,   a?.b.c += 1\n  eq 2,   ++a?.b.c\n  eq yes, delete a?.b.c\n\n\n# Soaked Method Invocation\n\ntest \"soaked method invocation\", ->\n  nonce = {}\n  counter = 0\n  obj =\n    self: -> @\n    increment: -> counter++; @\n  eq obj      , obj.self?()\n  eq undefined, obj.method?()\n  eq nonce    , obj.self?().property = nonce\n  eq undefined, obj.method?().property = nonce\n  eq obj      , obj.increment().increment().self?()\n  eq 2        , counter\n\ntest \"#733: conditional assignments\", ->\n  a = b: {c: null}\n  eq a.b?.c?(), undefined\n  a.b?.c or= (it) -> it\n  eq a.b?.c?(1), 1\n  eq a.b?.c?([2, 3]...), 2\n\n\n# Soaked Function Invocation\n\ntest \"soaked function invocation\", ->\n  nonce = {}\n  id = (_) -> _\n  eq nonce    , id?(nonce)\n  eq nonce    , (id? nonce)\n  eq undefined, nonexistent?(nonce)\n  eq undefined, (nonexistent? nonce)\n\ntest \"soaked function invocation with generated functions\", ->\n  nonce = {}\n  id = (_) -> _\n  maybe = (fn, arg) -> if typeof fn is 'function' then () -> fn(arg)\n  eq maybe(id, nonce)?(), nonce\n  eq (maybe id, nonce)?(), nonce\n  eq (maybe false, nonce)?(), undefined\n\ntest \"soaked constructor invocation\", ->\n  eq 42       , +new Number? 42\n  eq undefined,  new Other?  42\n\ntest \"soaked constructor invocations with caching and property access\", ->\n  semaphore = 0\n  nonce = {}\n  class C\n    constructor: ->\n      ok false if semaphore\n      semaphore++\n    prop: nonce\n  eq nonce, (new C())?.prop\n  eq 1, semaphore\n\ntest \"soaked function invocation safe on non-functions\", ->\n  eq undefined, (0)?(1)\n  eq undefined, (0)? 1, 2\n"
  },
  {
    "path": "test/sourcemap.coffee",
    "content": "return if global.testingBrowser\n\n{spawn, fork} = require('child_process')\nSourceMap = require '../src/sourcemap'\n\nvlqEncodedValues = [\n    [1, 'C'],\n    [-1, 'D'],\n    [2, 'E'],\n    [-2, 'F'],\n    [0, 'A'],\n    [16, 'gB'],\n    [948, 'o7B']\n]\n\ntest \"encodeVlq tests\", ->\n  for pair in vlqEncodedValues\n    eq ((new SourceMap).encodeVlq pair[0]), pair[1]\n\ntest \"SourceMap tests\", ->\n  map = new SourceMap\n  map.add [0, 0], [0, 0]\n  map.add [1, 5], [2, 4]\n  map.add [1, 6], [2, 7]\n  map.add [1, 9], [2, 8]\n  map.add [3, 0], [3, 4]\n\n  testWithFilenames = map.generate {\n    sourceRoot: ''\n    sourceFiles: ['source.coffee']\n    generatedFile: 'source.js'\n  }\n\n  deepEqual testWithFilenames, {\n    version: 3\n    file: 'source.js'\n    sourceRoot: ''\n    sources: ['source.coffee']\n    names: []\n    mappings: 'AAAA;;IACK,GAAC,CAAG;IAET'\n  }\n\n  deepEqual map.generate(), {\n    version: 3\n    file: ''\n    sourceRoot: ''\n    sources: ['<anonymous>']\n    names: []\n    mappings: 'AAAA;;IACK,GAAC,CAAG;IAET'\n  }\n\n  # Look up a generated column - should get back the original source position.\n  arrayEq map.sourceLocation([2,8]), [1,9]\n\n  # Look up a point further along on the same line - should get back the same source position.\n  arrayEq map.sourceLocation([2,10]), [1,9]\n\ntest \"#3075: v3 source map fields\", ->\n  { js, v3SourceMap, sourceMap } = CoffeeScript.compile 'console.log Date.now()',\n    filename: 'tempus_fugit.coffee'\n    sourceMap: yes\n    sourceRoot: './www_root/coffee/'\n\n  v3SourceMap = JSON.parse v3SourceMap\n  arrayEq v3SourceMap.sources, ['tempus_fugit.coffee']\n  eq v3SourceMap.sourceRoot, './www_root/coffee/'\n\ntest \"node --enable-source-map built in stack trace mapping\", ->\n  new Promise (resolve, reject) ->\n    proc = fork './test/importing/error.coffee', [\n      '--enable-source-maps'\n    ], stdio: 'pipe'\n\n    err = ''\n    proc.stderr.setEncoding 'utf8'\n    proc.stderr.on 'data', (str) -> err += str\n    proc.on 'close', ->\n      try\n        match = err.match /error\\.coffee:(\\d+):(\\d+)/\n        throw new Error err unless match\n\n        [_, line, column] = match\n        equal line, 3 # Mapped source line\n        equal column, 9 # Mapped source column\n\n        resolve()\n      catch exception\n        reject exception\n\nif Number(process.versions.node.split('.')[0]) >= 14\n  test \"NODE_OPTIONS=--enable-source-maps environment variable stack trace mapping\", ->\n    new Promise (resolve, reject) ->\n      proc = fork './test/importing/error.coffee', [],\n        env:\n          NODE_OPTIONS: '--enable-source-maps'\n        stdio: 'pipe'\n\n      err = ''\n      proc.stderr.setEncoding 'utf8'\n      proc.stderr.on 'data', (str) -> err += str\n      proc.on 'close', ->\n        try\n          match = err.match /error\\.coffee:(\\d+):(\\d+)/\n          throw new Error err unless match\n\n          [_, line, column] = match\n          equal line, 3 # Mapped source line\n          equal column, 9 # Mapped source column\n\n          resolve()\n        catch exception\n          reject exception\n\n  test \"generate correct stack traces with --enable-source-maps from bin/coffee\", ->\n    new Promise (resolve, reject) ->\n      proc = fork 'test/importing/error.coffee',\n        ['--enable-source-maps'],\n        stdio: 'pipe'\n\n      err = \"\"\n      proc.stderr.setEncoding 'utf8'\n      proc.stderr.on 'data', (str) -> err += str\n      proc.on 'close', ->\n        try\n          match = err.match /error\\.coffee:(\\d+):(\\d+)/\n          throw new Error err unless match\n\n          [_, line, column] = match\n          equal line, 3 # Mapped source line\n          equal column, 9 # Mapped source column\n\n          resolve()\n        catch exception\n          reject exception\n\ntest \"don't change stack traces if another library has patched `Error.prepareStackTrace`\", ->\n  new Promise (resolve, reject) ->\n    # This uses `spawn` rather than the preferred `fork` because `fork` requires\n    # loading code in a separate file. The `--eval` here shows exactly what is\n    # executing without indirection.\n    proc = spawn 'node', [\n      '--eval', \"\"\"\n        const patchedPrepareStackTrace = Error.prepareStackTrace = function() {};\n        require('./register.js');\n        process.stdout.write(Error.prepareStackTrace === patchedPrepareStackTrace ? 'preserved' : 'overwritten');\n      \"\"\"\n    ]\n\n    out = ''\n    proc.stdout.setEncoding 'utf8'\n    proc.stdout.on 'data', (str) -> out += str\n\n    proc.on 'close', (status) ->\n      try\n        equal status, 0\n        equal out, 'preserved'\n\n        resolve()\n      catch exception\n        reject exception\n\ntest \"requiring 'CoffeeScript' doesn't change `Error.prepareStackTrace`\", ->\n  new Promise (resolve, reject) ->\n    # This uses `spawn` rather than the preferred `fork` because `fork` requires\n    # loading code in a separate file. The `--eval` here shows exactly what is\n    # executing without indirection.\n    proc = spawn 'node', [\n      '--eval', \"\"\"\n        require('./lib/coffeescript/coffeescript.js');\n        process.stdout.write(Error.prepareStackTrace === undefined ? 'unused' : 'defined');\n      \"\"\"\n    ]\n\n    out = ''\n    proc.stdout.setEncoding 'utf8'\n    proc.stdout.on 'data', (str) -> out += str\n\n    proc.on 'close', (status) ->\n      try\n        equal status, 0\n        equal out, 'unused'\n\n        resolve()\n      catch exception\n        reject exception\n"
  },
  {
    "path": "test/strict.coffee",
    "content": "# Strict Early Errors\n# -------------------\n\n# The following are prohibited under ES5’s `strict` mode\n# * `Octal Integer Literals`\n# * `Octal Escape Sequences`\n# * duplicate property definitions in `Object Literal`s\n# * duplicate formal parameter\n# * `delete` operand is a variable\n# * `delete` operand is a parameter\n# * `delete` operand is `undefined`\n# * `Future Reserved Word`s as identifiers: implements, interface, let, package, private, protected, public, static, yield\n# * `eval` or `arguments` as `catch` identifier\n# * `eval` or `arguments` as formal parameter\n# * `eval` or `arguments` as function declaration identifier\n# * `eval` or `arguments` as LHS of assignment\n# * `eval` or `arguments` as the operand of a post/pre-fix inc/dec-rement expression\n\n# helper to assert that code complies with strict prohibitions\nstrict = (code, msg) ->\n  throwsCompileError code, null, null, msg ? code\nstrictOk = (code, msg) ->\n  doesNotThrowCompileError code, null, msg ? code\n\n\ntest \"octal integer literals prohibited\", ->\n  strict    '01'\n  strict    '07777'\n  # decimals with a leading '0' are also prohibited\n  strict    '09'\n  strict    '079'\n  strictOk  '`01`'\n\ntest \"octal escape sequences prohibited\", ->\n  strict    '\"\\\\1\"'\n  strict    '\"\\\\7\"'\n  strict    '\"\\\\001\"'\n  strict    '\"\\\\777\"'\n  strict    '\"_\\\\1\"'\n  strict    '\"\\\\1_\"'\n  strict    '\"_\\\\1_\"'\n  strict    '\"\\\\\\\\\\\\1\"'\n  strictOk  '\"\\\\0\"'\n  eq \"\\x00\", \"\\0\"\n  strictOk  '\"\\\\0\\\\8\"'\n  eq \"\\x008\", \"\\0\\8\"\n  strictOk  '\"\\\\8\"'\n  eq \"8\", \"\\8\"\n  strictOk  '\"\\\\\\\\1\"'\n  eq \"\\\\\" + \"1\", \"\\\\1\"\n  strictOk  '\"\\\\\\\\\\\\\\\\1\"'\n  eq \"\\\\\\\\\" + \"1\", \"\\\\\\\\1\"\n  strictOk  \"`'\\\\1'`\"\n  eq \"\\\\\" + \"1\", `\"\\\\1\"`\n\n  # Also test other string types.\n  strict           \"'\\\\\\\\\\\\1'\"\n  eq \"\\\\\\\\\" + \"1\", '\\\\\\\\1'\n  strict           \"'''\\\\\\\\\\\\1'''\"\n  eq \"\\\\\\\\\" + \"1\", '''\\\\\\\\1'''\n  strict           '\"\"\"\\\\\\\\\\\\1\"\"\"'\n  eq \"\\\\\\\\\" + \"1\", \"\"\"\\\\\\\\1\"\"\"\n\ntest \"duplicate formal parameters are prohibited\", ->\n  nonce = {}\n  # a Param can be an Identifier, ThisProperty( @-param ), Array, or Object\n  # a Param can also be a splat (...) or an assignment (param=value)\n  # the following function expressions should throw errors\n  strict '(_,_)->',          'param, param'\n  strict '(_,_...)->',       'param, param...'\n  strict '(_,_ = true)->',   'param, param='\n  strict '(@_,@_)->',        'two @params'\n  strict '(@case,@case)->',  'two @reserved'\n  strict '(_,{_})->',        'param, {param}'\n  strict '(_,{_=true})->',   'param, {param=}'\n  strict '({_,_})->',        '{param, param}'\n  strict '({_=true,_})->',   '{param=, param}'\n  strict '(_,[_])->',        'param, [param]'\n  strict '(_,[_=true])->',   'param, [param=]'\n  strict '([_,_])->',        '[param, param]'\n  strict '([_=true,_])->',   '[param=, param]'\n  strict '(_,[_]=true)->',   'param, [param]='\n  strict '(_,[_=true]=true)->', 'param, [param=]='\n  strict '(_,[@_,{_}])->',   'param, [@param, {param}]'\n  strict '(_,[_,{@_}])->',   'param, [param, {@param}]'\n  strict '(_,[_,{@_=true}])->', 'param, [param, {@param=}]'\n  strict '(_,[_,{_}])->',    'param, [param, {param}]'\n  strict '(_,[_,{__}])->',   'param, [param, {param2}]'\n  strict '(_,[__,{_}])->',   'param, [param2, {param}]'\n  strict '(__,[_,{_}])->',   'param, [param2, {param2}]'\n  strict '({0:a,1:a})->',    '{0:param,1:param}'\n  strict '(a=b=true,a)->',   'param=assignment, param'\n  strict '({a=b=true},a)->', '{param=assignment}, param'\n  # the following function expressions should **not** throw errors\n  strictOk '(_,@_)->'\n  strictOk '(@_,_...)->'\n  strictOk '(_,@_ = true)->'\n  strictOk '(@_,{_})->'\n  strictOk '({_,@_})->'\n  strictOk '({_,@_ = true})->'\n  strictOk '([_,@_])->'\n  strictOk '([_,@_ = true])->'\n  strictOk '({},_arg)->'\n  strictOk '({},{})->'\n  strictOk '([]...,_arg)->'\n  strictOk '({}...,_arg)->'\n  strictOk '({}...,[],_arg)->'\n  strictOk '([]...,{},_arg)->'\n  strictOk '(@case,_case)->'\n  strictOk '(@case,_case...)->'\n  strictOk '(@case...,_case)->'\n  strictOk '(_case,@case)->'\n  strictOk '(_case,@case...)->'\n  strictOk '({a:a})->'\n  strictOk '({a:a,a:b})->'\n\ntest \"`delete` operand restrictions\", ->\n  strict 'a = 1; delete a'\n  strictOk 'delete a' #noop\n  strict '(a) -> delete a'\n  strict '(a...) -> delete a'\n  strict '(a = 1) -> delete a'\n  strict '([a]) -> delete a'\n  strict '({a}) -> delete a'\n\ntest \"`Future Reserved Word`s, `eval` and `arguments` restrictions\", ->\n\n  access = (keyword, check = strict) ->\n    check \"#{keyword}.a = 1\"\n    check \"#{keyword}[0] = 1\"\n  assign = (keyword, check = strict) ->\n    check \"#{keyword} = 1\"\n    check \"#{keyword} += 1\"\n    check \"#{keyword} -= 1\"\n    check \"#{keyword} *= 1\"\n    check \"#{keyword} /= 1\"\n    check \"#{keyword} ?= 1\"\n  update = (keyword, check = strict) ->\n    check \"#{keyword}++\"\n    check \"++#{keyword}\"\n    check \"#{keyword}--\"\n    check \"--#{keyword}\"\n  destruct = (keyword, check = strict) ->\n    check \"{#{keyword}}\"\n    check \"o = {#{keyword}}\"\n  invoke = (keyword, check = strict) ->\n    check \"#{keyword} yes\"\n    check \"do #{keyword}\"\n  fnDecl = (keyword, check = strict) ->\n    check \"class #{keyword}\"\n  param = (keyword, check = strict) ->\n    check \"(#{keyword}) ->\"\n    check \"({#{keyword}}) ->\"\n  prop = (keyword, check = strict) ->\n    check \"a.#{keyword} = 1\"\n  tryCatch = (keyword, check = strict) ->\n    check \"try new Error catch #{keyword}\"\n\n  future = 'implements interface let package private protected public static'.split ' '\n  for keyword in future\n    access   keyword\n    assign   keyword\n    update   keyword\n    destruct keyword\n    invoke   keyword\n    fnDecl   keyword\n    param    keyword\n    prop     keyword, strictOk\n    tryCatch keyword\n\n  for keyword in ['eval', 'arguments']\n    access   keyword, strictOk\n    assign   keyword\n    update   keyword\n    destruct keyword, strictOk\n    invoke   keyword, strictOk\n    fnDecl   keyword\n    param    keyword\n    prop     keyword, strictOk\n    tryCatch keyword\n"
  },
  {
    "path": "test/strings.coffee",
    "content": "# String Literals\n# ---------------\n\n# TODO: refactor string literal tests\n# TODO: add indexing and method invocation tests: \"string\"[\"toString\"] is String::toString, \"string\".toString() is \"string\"\n\n# * Strings\n# * Heredocs\n\ntest \"backslash escapes\", ->\n  eq \"\\\\/\\\\\\\\\", /\\/\\\\/.source\n\neq '(((dollars)))', '\\(\\(\\(dollars\\)\\)\\)'\neq 'one two three', \"one\n two\n three\"\neq \"four five\", 'four\n\n five'\n\ntest \"#3229, multiline strings\", ->\n  # Separate lines by default by a single space in literal strings.\n  eq 'one\n      two', 'one two'\n  eq \"one\n      two\", 'one two'\n  eq '\n        a\n        b\n    ', 'a b'\n  eq \"\n        a\n        b\n    \", 'a b'\n  eq 'one\n\n        two', 'one two'\n  eq \"one\n\n        two\", 'one two'\n  eq '\n    indentation\n      doesn\\'t\n  matter', 'indentation doesn\\'t matter'\n  eq 'trailing ws      \n    doesn\\'t matter', 'trailing ws doesn\\'t matter'\n\n  # Use backslashes at the end of a line to specify whitespace between lines.\n  eq 'a \\\n      b\\\n      c  \\\n      d', 'a bc  d'\n  eq \"a \\\n      b\\\n      c  \\\n      d\", 'a bc  d'\n  eq 'ignore  \\  \n      trailing whitespace', 'ignore  trailing whitespace'\n\n  # Backslash at the beginning of a literal string.\n  eq '\\\n      ok', 'ok'\n  eq '  \\\n      ok', '  ok'\n\n  # #1273, empty strings.\n  eq '\\\n     ', ''\n  eq '\n     ', ''\n  eq '\n          ', ''\n  eq '   ', '   '\n\n  # Same behavior in interpolated strings.\n  eq \"interpolation #{1}\n      follows #{2}  \\\n      too #{3}\\\n      !\", 'interpolation 1 follows 2  too 3!'\n  eq \"a #{\n    'string ' + \"inside\n                 interpolation\"\n    }\", \"a string inside interpolation\"\n  eq \"\n      #{1}\n     \", '1'\n\n  # Handle escaped backslashes correctly.\n  eq '\\\\', `'\\\\'`\n  eq 'escaped backslash at EOL\\\\\n      next line', 'escaped backslash at EOL\\\\ next line'\n  eq '\\\\\n      next line', '\\\\ next line'\n  eq '\\\\\n     ', '\\\\'\n  eq '\\\\\\\\\\\\\n     ', '\\\\\\\\\\\\'\n  eq \"#{1}\\\\\n      after interpolation\", '1\\\\ after interpolation'\n  eq 'escaped backslash before slash\\\\  \\\n      next line', 'escaped backslash before slash\\\\  next line'\n  eq 'triple backslash\\\\\\\n      next line', 'triple backslash\\\\next line'\n  eq 'several escaped backslashes\\\\\\\\\\\\\n      ok', 'several escaped backslashes\\\\\\\\\\\\ ok'\n  eq 'several escaped backslashes slash\\\\\\\\\\\\\\\n      ok', 'several escaped backslashes slash\\\\\\\\\\\\ok'\n  eq 'several escaped backslashes with trailing ws \\\\\\\\\\\\   \n      ok', 'several escaped backslashes with trailing ws \\\\\\\\\\\\ ok'\n\n  # Backslashes at beginning of lines.\n  eq 'first line\n      \\   backslash at BOL', 'first line \\   backslash at BOL'\n  eq 'first line\\\n      \\   backslash at BOL', 'first line\\   backslash at BOL'\n\n  # Backslashes at end of strings.\n  eq 'first line \\ ', 'first line  '\n  eq 'first line\n      second line \\\n      ', 'first line second line '\n  eq 'first line\n      second line\n      \\\n      ', 'first line second line'\n  eq 'first line\n      second line\n\n        \\\n\n      ', 'first line second line'\n\n  # Edge case.\n  eq 'lone\n\n        \\\n\n        backslash', 'lone backslash'\n\ntest \"#3249, escape newlines in heredocs with backslashes\", ->\n  # Ignore escaped newlines\n  eq '''\n    Set whitespace      \\\n       <- this is ignored\\  \n           none\n      normal indentation\n    ''', 'Set whitespace      <- this is ignorednone\\n  normal indentation'\n  eq \"\"\"\n    Set whitespace      \\\n       <- this is ignored\\  \n           none\n      normal indentation\n    \"\"\", 'Set whitespace      <- this is ignorednone\\n  normal indentation'\n\n  # Changed from #647, trailing backslash.\n  eq '''\n  Hello, World\\\n\n  ''', 'Hello, World'\n  eq '''\n    \\\\\n  ''', '\\\\'\n\n  # Backslash at the beginning of a literal string.\n  eq '''\\\n      ok''', 'ok'\n  eq '''  \\\n      ok''', '  ok'\n\n  # Same behavior in interpolated strings.\n  eq \"\"\"\n    interpolation #{1}\n      follows #{2}  \\\n        too #{3}\\\n    !\n  \"\"\", 'interpolation 1\\n  follows 2  too 3!'\n  eq \"\"\"\n\n    #{1} #{2}\n\n    \"\"\", '\\n1 2\\n'\n\n  # Handle escaped backslashes correctly.\n  eq '''\n    escaped backslash at EOL\\\\\n      next line\n  ''', 'escaped backslash at EOL\\\\\\n  next line'\n  eq '''\\\\\n\n     ''', '\\\\\\n'\n\n  # Backslashes at beginning of lines.\n  eq '''first line\n      \\   backslash at BOL''', 'first line\\n\\   backslash at BOL'\n  eq \"\"\"first line\\\n      \\   backslash at BOL\"\"\", 'first line\\   backslash at BOL'\n\n  # Backslashes at end of strings.\n  eq '''first line \\ ''', 'first line  '\n  eq '''\n    first line\n    second line \\\n  ''', 'first line\\nsecond line '\n  eq '''\n    first line\n    second line\n    \\\n  ''', 'first line\\nsecond line'\n  eq '''\n    first line\n    second line\n\n      \\\n\n  ''', 'first line\\nsecond line\\n'\n\n  # Edge cases.\n  eq '''lone\n\n          \\\n\n\n\n        backslash''', 'lone\\n\\n  backslash'\n  eq '''\\\n     ''', ''\n\ntest '#2388: `\"\"\"` in heredoc interpolations', ->\n  eq \"\"\"a heredoc #{\n      \"inside \\\n        interpolation\"\n    }\"\"\", \"a heredoc inside interpolation\"\n  eq \"\"\"a#{\"\"\"b\"\"\"}c\"\"\", 'abc'\n  eq \"\"\"#{\"\"\"\"\"\"}\"\"\", ''\n\ntest \"trailing whitespace\", ->\n  testTrailing = (str, expected) ->\n    eq CoffeeScript.eval(str.replace /\\|$/gm, ''), expected\n  testTrailing '''\"   |\n      |\n    a   |\n           |\n  \"''', 'a'\n  testTrailing \"\"\"'''   |\n      |\n    a   |\n           |\n  '''\"\"\", '  \\na   \\n       '\n\n#647\neq \"''Hello, World\\\\''\", '''\n'\\'Hello, World\\\\\\''\n'''\neq '\"\"Hello, World\\\\\"\"', \"\"\"\n\"\\\"Hello, World\\\\\\\"\"\n\"\"\"\n\ntest \"#1273, escaping quotes at the end of heredocs.\", ->\n  # \"\"\"\\\"\"\" no longer compiles\n  eq \"\"\"\\\\\"\"\", '\\\\'\n  eq \"\"\"\\\\\\\"\"\"\", '\\\\\\\"'\n\na = \"\"\"\n    basic heredoc\n    on two lines\n    \"\"\"\nok a is \"basic heredoc\\non two lines\"\n\na = '''\n    a\n      \"b\n    c\n    '''\nok a is \"a\\n  \\\"b\\nc\"\n\na = \"\"\"\na\n b\n  c\n\"\"\"\nok a is \"a\\n b\\n  c\"\n\na = '''one-liner'''\nok a is 'one-liner'\n\na = \"\"\"\n      out\n      here\n\"\"\"\nok a is \"out\\nhere\"\n\na = '''\n       a\n     b\n   c\n    '''\nok a is \"    a\\n  b\\nc\"\n\na = '''\na\n\n\nb c\n'''\nok a is \"a\\n\\n\\nb c\"\n\na = '''more\"than\"one\"quote'''\nok a is 'more\"than\"one\"quote'\n\na = '''here's an apostrophe'''\nok a is \"here's an apostrophe\"\n\na = \"\"\"\"\"surrounded by two quotes\"\\\"\"\"\"\nok a is '\"\"surrounded by two quotes\"\"'\n\na = '''''surrounded by two apostrophes'\\''''\nok a is \"''surrounded by two apostrophes''\"\n\n# The indentation detector ignores blank lines without trailing whitespace\na = \"\"\"\n    one\n    two\n\n    \"\"\"\nok a is \"one\\ntwo\\n\"\n\neq ''' line 0\n  should not be relevant\n    to the indent level\n''', ' line 0\\nshould not be relevant\\n  to the indent level'\n\neq \"\"\"\n  interpolation #{\n \"contents\"\n }\n  should not be relevant\n    to the indent level\n\"\"\", 'interpolation contents\\nshould not be relevant\\n  to the indent level'\n\neq ''' '\\\\\\' ''', \" '\\\\' \"\neq \"\"\" \"\\\\\\\" \"\"\", ' \"\\\\\" '\n\neq '''  <- keep these spaces ->  ''', '  <- keep these spaces ->  '\n\neq '''undefined''', 'undefined'\neq \"\"\"undefined\"\"\", 'undefined'\n\n\ntest \"#1046, empty string interpolations\", ->\n  eq \"#{ }\", ''\n\ntest \"strings are not callable\", ->\n  throwsCompileError '\"a\"()'\n  throwsCompileError '\"a#{b}\"()'\n  throwsCompileError '\"a\" 1'\n  throwsCompileError '\"a#{b}\" 1'\n  throwsCompileError '''\n    \"a\"\n       k: v\n  '''\n  throwsCompileError '''\n    \"a#{b}\"\n       k: v\n  '''\n\ntest \"#3795: Escape otherwise invalid characters\", ->\n  eq ' ', '\\u2028'\n  eq ' ', '\\u2029'\n  eq '\\0\\\n      1', '\\x001'\n  eq \" \", '\\u2028'\n  eq \" \", '\\u2029'\n  eq \"\\0\\\n      1\", '\\x001'\n  eq \"\\0\\\n      9\", '\\x009'\n  eq \"\\0#{}0\", '\\x000'\n  eq ''' ''', '\\u2028'\n  eq ''' ''', '\\u2029'\n  eq '''\\0\\\n      1''', '\\x001'\n  eq '''\\0\\\n      9''', '\\x009'\n  eq \"\"\"\\0#{}1\"\"\", '\\x001'\n  eq \"\"\" \"\"\", '\\u2028'\n  eq \"\"\" \"\"\", '\\u2029'\n  eq \"\"\"\\0\\\n      1\"\"\", '\\x001'\n\n  a = 'a'\n  eq \"#{a} \", 'a\\u2028'\n  eq \"#{a} \", 'a\\u2029'\n  eq \"#{a}\\0\\\n      1\", 'a\\0' + '1'\n  eq \"\"\"#{a} \"\"\", 'a\\u2028'\n  eq \"\"\"#{a} \"\"\", 'a\\u2029'\n  eq \"\"\"#{a}\\0\\\n      1\"\"\", 'a\\0' + '1'\n\ntest \"#4314: Whitespace less than or equal to stripped indentation\", ->\n  # The odd indentation is intentional here, to test 1-space indentation.\n  eq ' ', \"\"\"\n #{} #{}\n\"\"\"\n\n  eq '1 2  3   4    5     end\\na 0     b', \"\"\"\n    #{1} #{2}  #{3}   #{4}    #{5}     end\n    a #{0}     b\"\"\"\n\ntest \"#4248: Unicode code point escapes\", ->\n  eq '\\u01ab\\u00cd', '\\u{1ab}\\u{cd}'\n  eq '\\u01ab', '\\u{000001ab}'\n  eq 'a\\u01ab', \"#{ 'a' }\\u{1ab}\"\n  eq '\\u01abc', '''\\u{01ab}c'''\n  eq '\\u01abc', \"\"\"\\u{1ab}#{ 'c' }\"\"\"\n  eq '\\udab3\\uddef', '\\u{bcdef}'\n  eq '\\udab3\\uddef', '\\u{0000bcdef}'\n  eq 'a\\udab3\\uddef', \"#{ 'a' }\\u{bcdef}\"\n  eq '\\udab3\\uddefc', '''\\u{0bcdef}c'''\n  eq '\\udab3\\uddefc', \"\"\"\\u{bcdef}#{ 'c' }\"\"\"\n  eq '\\\\u{123456}', \"#{'\\\\'}#{'u{123456}'}\"\n\n  # don't rewrite code point escapes\n  eqJS \"\"\"\n    '\\\\u{bcdef}\\\\u{abc}'\n  \"\"\",\n  \"\"\"\n    '\\\\u{bcdef}\\\\u{abc}';\n  \"\"\"\n\n  eqJS \"\"\"\n    \"#{ 'a' }\\\\u{bcdef}\"\n  \"\"\",\n  \"\"\"\n    \"a\\\\u{bcdef}\";\n  \"\"\"\n"
  },
  {
    "path": "test/support/helpers.coffee",
    "content": "# See [http://wiki.ecmascript.org/doku.php?id=harmony:egal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\negal = (a, b) ->\n  if a is b\n    a isnt 0 or 1/a is 1/b\n  else\n    a isnt a and b isnt b\n\n# A recursive functional equivalence helper; uses egal for testing equivalence.\narrayEgal = (a, b) ->\n  if egal a, b then yes\n  else if a instanceof Array and b instanceof Array\n    return no unless a.length is b.length\n    return no for el, idx in a when not arrayEgal el, b[idx]\n    yes\n\ndiffOutput = (expectedOutput, actualOutput) ->\n  expectedOutputLines = expectedOutput.split '\\n'\n  actualOutputLines = actualOutput.split '\\n'\n  for line, i in actualOutputLines\n    if line isnt expectedOutputLines[i]\n      actualOutputLines[i] = \"#{yellow}#{line}#{reset}\"\n  \"\"\"Expected generated JavaScript to be:\n  #{reset}#{expectedOutput}#{red}\n    but instead it was:\n  #{reset}#{actualOutputLines.join '\\n'}#{red}\"\"\"\n\nexports.eq = (a, b, msg) ->\n  ok egal(a, b), msg or\n  \"Expected #{reset}#{a}#{red} to equal #{reset}#{b}#{red}\"\n\nexports.arrayEq = (a, b, msg) ->\n  ok arrayEgal(a, b), msg or\n  \"Expected #{reset}#{a}#{red} to deep equal #{reset}#{b}#{red}\"\n\nexports.eqJS = (input, expectedOutput, msg) ->\n  actualOutput = CoffeeScript.compile input, bare: yes\n  .replace /^\\s+|\\s+$/g, '' # Trim leading/trailing whitespace.\n  ok egal(expectedOutput, actualOutput), msg or diffOutput expectedOutput, actualOutput\n\nexports.isWindows = -> process.platform is 'win32'\n\nexports.inspect = (obj) ->\n  if global.testingBrowser\n    JSON.stringify obj, null, 2\n  else\n    require('util').inspect obj,\n      depth: 10\n      colors: if process.env.NODE_DISABLE_COLORS then no else yes\n\n# Helpers to get AST nodes for a string of code.\nexports.getAstRoot = getAstRoot = (code) ->\n  CoffeeScript.compile code, ast: yes\n\n# The root node is always a `File` node, so for brevity in the tests return its\n# children from `program.body`.\ngetAstExpressions = (code) ->\n  ast = getAstRoot code\n  ast.program.body\n\n# Many tests want just the root node.\nexports.getAstExpression = (code) ->\n  expressionStatementAst = getAstExpressions(code)[0]\n  ok expressionStatementAst.type is 'ExpressionStatement', 'Expected ExpressionStatement AST wrapper'\n  expressionStatementAst.expression\n\nexports.getAstStatement = (code) ->\n  statement = getAstExpressions(code)[0]\n  ok statement.type isnt 'ExpressionStatement', \"Didn't expect ExpressionStatement AST wrapper\"\n  statement\n\nexports.getAstExpressionOrStatement = (code) ->\n  expressionAst = getAstExpressions(code)[0]\n  return expressionAst unless expressionAst.type is 'ExpressionStatement'\n  expressionAst.expression\n\nexports.throwsCompileError = (code, compileOpts, args...) ->\n  throws -> CoffeeScript.compile code, compileOpts, args...\n  throws -> CoffeeScript.compile code, Object.assign({}, (compileOpts ? {}), ast: yes), args...\n\nexports.doesNotThrowCompileError = (code, compileOpts, args...) ->\n  doesNotThrow -> CoffeeScript.compile code, compileOpts, args...\n  doesNotThrow -> CoffeeScript.compile code, Object.assign({}, (compileOpts ? {}), ast: yes), args...\n"
  },
  {
    "path": "test/tagged_template_literals.coffee",
    "content": "# Tagged template literals\n# ------------------------\n\n# NOTES:\n# A tagged template literal is a string that is passed to a prefixing function for\n# post-processing. There's a bunch of different angles that need testing:\n# - Prefixing function, which can be any form of function call:\n#   - function: func'Hello'\n#   - object property with dot notation: outerobj.obj.func'Hello'\n#   - object property with bracket notation: outerobj['obj']['func']'Hello'\n# - String form: single quotes, double quotes and block strings\n# - String is single-line or multi-line\n# - String is interpolated or not\n\nfunc = (text, expressions...) ->\n  \"text: [#{text.join '|'}] expressions: [#{expressions.join '|'}]\"\n\nouterobj =\n  obj:\n    func: func\n    f: -> func\n\n# Example use\ntest \"tagged template literal for html templating\", ->\n  html = (htmlFragments, expressions...) ->\n    htmlFragments.reduce (fullHtml, htmlFragment, i) ->\n      fullHtml + \"#{expressions[i - 1]}#{htmlFragment}\"\n\n  state =\n    name: 'Greg'\n    adjective: 'awesome'\n\n  eq \"\"\"\n      <p>\n        Hi Greg. You're looking awesome!\n      </p>\n    \"\"\",\n    html\"\"\"\n      <p>\n        Hi #{state.name}. You're looking #{state.adjective}!\n      </p>\n    \"\"\"\n\n# Simple, non-interpolated strings\ntest \"tagged template literal with a single-line single-quote string\", ->\n  eq 'text: [single-line single quotes] expressions: []',\n  func'single-line single quotes'\n\ntest \"tagged template literal with a single-line double-quote string\", ->\n  eq 'text: [single-line double quotes] expressions: []',\n  func\"single-line double quotes\"\n\ntest \"tagged template literal with a single-line single-quote block string\", ->\n  eq 'text: [single-line block string] expressions: []',\n  func'''single-line block string'''\n\ntest \"tagged template literal with a single-line double-quote block string\", ->\n  eq 'text: [single-line block string] expressions: []',\n  func\"\"\"single-line block string\"\"\"\n\ntest \"tagged template literal with a multi-line single-quote string\", ->\n  eq 'text: [multi-line single quotes] expressions: []',\n  func'multi-line\n                                                              single quotes'\n\ntest \"tagged template literal with a multi-line double-quote string\", ->\n  eq 'text: [multi-line double quotes] expressions: []',\n  func\"multi-line\n       double quotes\"\n\ntest \"tagged template literal with a multi-line single-quote block string\", ->\n  eq 'text: [multi-line\\nblock string] expressions: []',\n  func'''\n      multi-line\n      block string\n      '''\n\ntest \"tagged template literal with a multi-line double-quote block string\", ->\n  eq 'text: [multi-line\\nblock string] expressions: []',\n  func\"\"\"\n      multi-line\n      block string\n      \"\"\"\n\n# Interpolated strings with expressions\ntest \"tagged template literal with a single-line double-quote interpolated string\", ->\n  eq 'text: [single-line | double quotes | interpolation] expressions: [36|42]',\n  func\"single-line #{6 * 6} double quotes #{6 * 7} interpolation\"\n\ntest \"tagged template literal with a single-line double-quote block interpolated string\", ->\n  eq 'text: [single-line | block string | interpolation] expressions: [incredible|48]',\n  func\"\"\"single-line #{'incredible'} block string #{6 * 8} interpolation\"\"\"\n\ntest \"tagged template literal with a multi-line double-quote interpolated string\", ->\n  eq 'text: [multi-line | double quotes | interpolation] expressions: [2|awesome]',\n  func\"multi-line #{4/2}\n       double quotes #{'awesome'} interpolation\"\n\ntest \"tagged template literal with a multi-line double-quote block interpolated string\", ->\n  eq 'text: [multi-line |\\nblock string |] expressions: [/abc/|32]',\n  func\"\"\"\n      multi-line #{/abc/}\n      block string #{2 * 16}\n      \"\"\"\n\n\n# Tagged template literal must use a callable function\ntest \"tagged template literal dot notation recognized as a callable function\", ->\n  eq 'text: [dot notation] expressions: []',\n  outerobj.obj.func'dot notation'\n\ntest \"tagged template literal bracket notation recognized as a callable function\", ->\n  eq 'text: [bracket notation] expressions: []',\n  outerobj['obj']['func']'bracket notation'\n\ntest \"tagged template literal mixed dot and bracket notation recognized as a callable function\", ->\n  eq 'text: [mixed notation] expressions: []',\n  outerobj['obj'].func'mixed notation'\n\n\n# Edge cases\ntest \"tagged template literal with an empty string\", ->\n  eq 'text: [] expressions: []',\n  func''\n\ntest \"tagged template literal with an empty interpolated string\", ->\n  eq 'text: [] expressions: []',\n  func\"#{}\"\n\ntest \"tagged template literal as single interpolated expression\", ->\n  eq 'text: [|] expressions: [3]',\n  func\"#{3}\"\n\ntest \"tagged template literal with an interpolated string that itself contains an interpolated string\", ->\n  eq 'text: [inner | string] expressions: [interpolated]',\n  func\"inner #{\"#{'inter'}polated\"} string\"\n\ntest \"tagged template literal with an interpolated string that contains a tagged template literal\", ->\n  eq 'text: [inner tagged | literal] expressions: [text: [|] expressions: [template]]',\n  func\"inner tagged #{func\"#{'template'}\"} literal\"\n\ntest \"tagged template literal with backticks\", ->\n  eq 'text: [ES template literals look like this: `foo bar`] expressions: []',\n  func\"ES template literals look like this: `foo bar`\"\n\ntest \"tagged template literal with escaped backticks\", ->\n  eq 'text: [ES template literals look like this: \\\\`foo bar\\\\`] expressions: []',\n  func\"ES template literals look like this: \\\\`foo bar\\\\`\"\n\ntest \"tagged template literal with unnecessarily escaped backticks\", ->\n  eq 'text: [ES template literals look like this: `foo bar`] expressions: []',\n  func\"ES template literals look like this: \\`foo bar\\`\"\n\ntest \"tagged template literal with ES interpolation\", ->\n  eq 'text: [ES template literals also look like this: `3 + 5 = ${3+5}`] expressions: []',\n  func\"ES template literals also look like this: `3 + 5 = ${3+5}`\"\n\ntest \"tagged template literal with both ES and CoffeeScript interpolation\", ->\n  eq \"text: [ES template literals also look like this: `3 + 5 = ${3+5}` which equals |] expressions: [8]\",\n  func\"ES template literals also look like this: `3 + 5 = ${3+5}` which equals #{3+5}\"\n\ntest \"tagged template literal with escaped ES interpolation\", ->\n  eq 'text: [ES template literals also look like this: `3 + 5 = \\\\${3+5}`] expressions: []',\n  func\"ES template literals also look like this: `3 + 5 = \\\\${3+5}`\"\n\ntest \"tagged template literal with unnecessarily escaped ES interpolation\", ->\n  eq 'text: [ES template literals also look like this: `3 + 5 = ${3+5}`] expressions: []',\n  func\"ES template literals also look like this: `3 + 5 = \\${3+5}`\"\n\ntest \"tagged template literal special escaping\", ->\n  eq 'text: [` ` \\\\` \\\\` \\\\\\\\` $ { ${ ${ \\\\${ \\\\${ \\\\\\\\${ | ` ${] expressions: [1]',\n  func\"` \\` \\\\` \\\\\\` \\\\\\\\` $ { ${ \\${ \\\\${ \\\\\\${ \\\\\\\\${ #{1} ` ${\"\n\ntest '#4467: tagged template literal call recognized as a callable function', ->\n  eq 'text: [dot notation] expressions: []',\n  outerobj.obj.f()'dot notation'\n\n"
  }
]